關(guān)于Langchain/Langgraph框架的流式與非流式返回——invoke/ainvoke/stream/astream 原創(chuàng)
“ 框架是對(duì)底層能力的抽象與封裝,而并不能繞過(guò)底層能力實(shí)現(xiàn)一些不存在的功能?!?/strong>
在使用Langchain和Langgraph大模型應(yīng)用開(kāi)發(fā)框架的過(guò)程中,一直在使用invoke/ainvoke/stream/astream這四個(gè)方法;剛開(kāi)始只知道這四種方法可以實(shí)現(xiàn)流式和非流式返回,并且有同步和異步的區(qū)別,但一直沒(méi)搞明白是怎么回事;總以為是框架封裝的功能。
但直到這兩天才偶然發(fā)現(xiàn)原來(lái)其并沒(méi)有想象中的那么復(fù)雜;雖然說(shuō)這四個(gè)方法是框架封裝的方法不能說(shuō)有錯(cuò),但其實(shí)本質(zhì)上還是對(duì)大模型功能的應(yīng)用。
流式返回問(wèn)題的研究
在Langchain和Langgraph框架中實(shí)現(xiàn)同步和異步,流式與非流式的四個(gè)方法——invoke/ainvoke/stream/astream,從本質(zhì)上來(lái)說(shuō)是對(duì)大模型能力的封裝,而不是其框架能力的封裝。
首先,我們要弄明白一個(gè)問(wèn)題——那就是任何框架,哪怕功能再?gòu)?qiáng)大,其都不可能繞過(guò)底層功能的限制;以Langchain/Langgraph框架為例,其支持的流式和非流式返回的根本是因?yàn)榇竽P陀辛魇胶头橇魇絺鬏?;否則,如果大模型不支持流式輸出,即使框架支持流式輸出,也只是假流式輸出而不是真流式。
所以說(shuō)框架中非流式invoke和流式stream輸出的區(qū)別就是stream=False/True的區(qū)別。

所以在使用框架時(shí),流式輸出默認(rèn)調(diào)用模型時(shí)的stream的參數(shù)值等于True,而非流式輸出的默認(rèn)參數(shù)值stream=False。
那么,所謂的invoke/ainvoke同步和異步又有什么區(qū)別呢?
所謂的同步和異步,從本質(zhì)上來(lái)說(shuō)就是同步網(wǎng)絡(luò)框架和異步網(wǎng)絡(luò)框架的區(qū)別;在python開(kāi)發(fā)中,同步網(wǎng)絡(luò)包有requests,異步網(wǎng)絡(luò)包有aiohttp,還有同時(shí)支持同步和異步的httpx等。
所以,所謂的同步非流式就是使用同步網(wǎng)絡(luò)包+stream=False,同步流式就是同步網(wǎng)絡(luò)包+stream=True;而異步流式與非流式同理,就是異步網(wǎng)絡(luò)包aiohttp/httpx+stream=True/False的區(qū)別。
只不過(guò),Langchain/Langgraph框架并不是直接調(diào)用模型的接口,而是通過(guò)openai封裝好的工具包進(jìn)行調(diào)用;原因就在于,openai已經(jīng)成為模型應(yīng)用的一種標(biāo)準(zhǔn),現(xiàn)在市面上絕大部分模型的接口都是按照openai的標(biāo)準(zhǔn)進(jìn)行開(kāi)發(fā)的;這樣一是避免了完全從零開(kāi)始開(kāi)發(fā),二是統(tǒng)一標(biāo)準(zhǔn)之后有更好的遷移性。

關(guān)于非流式返回沒(méi)什么好說(shuō)的,就是在大模型處理完成之后一次性把所有結(jié)果進(jìn)行返回;但關(guān)于流式返回,在框架中是通過(guò)迭代器的方式進(jìn)行處理的,流式接口stream/astream返回一個(gè)迭代器對(duì)象,然后通過(guò)遍歷迭代器的方式就可以實(shí)現(xiàn)流式獲取模型的返回結(jié)果。
從框架中這四個(gè)方法的研究中悟出了一個(gè)道理,那就是我們有時(shí)候太過(guò)在意框架本身;反而忽略了最基礎(chǔ)的東西,畢竟框架是對(duì)底層功能的抽象和封裝,而并不能直接跳過(guò)底層能力,而實(shí)現(xiàn)一些不存在的功能。
所以,我們?cè)趯W(xué)習(xí)框架的同時(shí),還要多關(guān)注一下大模型基礎(chǔ)功能的發(fā)展,這樣我們才能知道大模型到底應(yīng)該怎么用。
本文轉(zhuǎn)載自????AI探索時(shí)代???? 作者:DFires

















