關于Langchain/Langgraph框架的流式與非流式返回——invoke/ainvoke/stream/astream 原創
“ 框架是對底層能力的抽象與封裝,而并不能繞過底層能力實現一些不存在的功能。”
在使用Langchain和Langgraph大模型應用開發框架的過程中,一直在使用invoke/ainvoke/stream/astream這四個方法;剛開始只知道這四種方法可以實現流式和非流式返回,并且有同步和異步的區別,但一直沒搞明白是怎么回事;總以為是框架封裝的功能。
但直到這兩天才偶然發現原來其并沒有想象中的那么復雜;雖然說這四個方法是框架封裝的方法不能說有錯,但其實本質上還是對大模型功能的應用。
流式返回問題的研究
在Langchain和Langgraph框架中實現同步和異步,流式與非流式的四個方法——invoke/ainvoke/stream/astream,從本質上來說是對大模型能力的封裝,而不是其框架能力的封裝。
首先,我們要弄明白一個問題——那就是任何框架,哪怕功能再強大,其都不可能繞過底層功能的限制;以Langchain/Langgraph框架為例,其支持的流式和非流式返回的根本是因為大模型有流式和非流式傳輸;否則,如果大模型不支持流式輸出,即使框架支持流式輸出,也只是假流式輸出而不是真流式。
所以說框架中非流式invoke和流式stream輸出的區別就是stream=False/True的區別。

所以在使用框架時,流式輸出默認調用模型時的stream的參數值等于True,而非流式輸出的默認參數值stream=False。
那么,所謂的invoke/ainvoke同步和異步又有什么區別呢?
所謂的同步和異步,從本質上來說就是同步網絡框架和異步網絡框架的區別;在python開發中,同步網絡包有requests,異步網絡包有aiohttp,還有同時支持同步和異步的httpx等。
所以,所謂的同步非流式就是使用同步網絡包+stream=False,同步流式就是同步網絡包+stream=True;而異步流式與非流式同理,就是異步網絡包aiohttp/httpx+stream=True/False的區別。
只不過,Langchain/Langgraph框架并不是直接調用模型的接口,而是通過openai封裝好的工具包進行調用;原因就在于,openai已經成為模型應用的一種標準,現在市面上絕大部分模型的接口都是按照openai的標準進行開發的;這樣一是避免了完全從零開始開發,二是統一標準之后有更好的遷移性。

關于非流式返回沒什么好說的,就是在大模型處理完成之后一次性把所有結果進行返回;但關于流式返回,在框架中是通過迭代器的方式進行處理的,流式接口stream/astream返回一個迭代器對象,然后通過遍歷迭代器的方式就可以實現流式獲取模型的返回結果。
從框架中這四個方法的研究中悟出了一個道理,那就是我們有時候太過在意框架本身;反而忽略了最基礎的東西,畢竟框架是對底層功能的抽象和封裝,而并不能直接跳過底層能力,而實現一些不存在的功能。
所以,我們在學習框架的同時,還要多關注一下大模型基礎功能的發展,這樣我們才能知道大模型到底應該怎么用。
本文轉載自????AI探索時代???? 作者:DFires

















