本次對接的大模型是智譜,首先想到去智譜開放平臺找找有沒有和langchain結(jié)合的文檔:

結(jié)果還真有,就省去了谷歌的時間,但是智譜的文檔只提供了非流式的示例代碼,想著先拷過來跑一下再說,結(jié)果就是非流式是正常輸出的,流式就遇到問題了,不管我咋配置,好像只能在控制臺輸出流失內(nèi)容,遂去谷歌“l(fā)angchain 流式輸出”:

前面三篇文章都看了,第一篇內(nèi)容:

好像和智譜官方的文檔寫法不一樣,遂放棄使用該方式,接著又看了第二篇文章:

他這里說是要在初始化llm的時候加一個callbacks參數(shù),并且自定義callbacks,最終的代碼大致如下:

但他這里沒有寫全,起初我也沒看懂為啥這么寫,遂看了下其他人的寫法:

原來在初始化llm的時候就需要注入自己的callbacks,然后我也試了這樣寫,確實能在on_llm_new_token中拿到每次流式的內(nèi)容,但是不能yield出來,我就有點搞不明白,然后又看了一些更復雜的代碼,我發(fā)現(xiàn)我看不懂:

還有走異步機制的:

我都有點迷惑了,到底啥代碼才適合我呢?然后我就一直在嘗試callbacks,搞到晚上11點,此時我心態(tài)有點崩了,遂蓋上筆記本,不搞了先,然后我就和項目負責人說了langchain的流式搞不定,還是用原生的寫法了,不用langchain。
然后第二天我還是打算再會一會這個langchain的流式輸出,我就不信了。
先在群里請教了一下,然后給我發(fā)了一段很長的代碼,額,這啥。
遂想到昨天谷歌搜索時的第二個網(wǎng)站的內(nèi)容,抱著試試的心態(tài),ctrl c、ctrl v,它就流起來了,它真的流起來:
def get_llm_lc(self, app, r: ChatCompletionRequestStruct):
? """? 獲取ai響應langchain版
? """return ChatOpenAI(
? ? temperature=0.5,
? ? openai_api_key=Config.ZHIPUAI_API_KEY,
? ? openai_api_base=Config.ZHIPUAI_OPENAI_API_URL,
? ? model=Config.ZHIPUAI_MODEL,
? ? streaming=r.streaming,
? ? callbacks=[StreamingStdOutCallbackHandler()],
? )
def get_prompt_lc(self):
? return ChatPromptTemplate.from_messages(
? ? [
? ? # ("system", "你是一個專業(yè)的AI助手。"),? ? ("human","{question}")
? ? ]
? )
llm = self.get_llm_lc(app, r)
prompt = self.get_prompt_lc()
llm_chain = prompt | llm
ret = llm_chain.stream({"question": r.question})for_tokenin ret:
? token = _token.content
? finish_reason =''if'finish_reason'in _token.response_metadata:
? finish_reason = _token.response_metadata['finish_reason']
? reply = ChatCompletionResponseStruct()
? reply.text = token
? reply.finish_reason = finish_reason
? yieldjson.dumps(reply.to_dict(), ensure_ascii=False) +'\n'
總算舒了一口氣,流式響應需求算是完成了,接下來是rag的,到目前位置我還不知道rag是啥,咋實現(xiàn)的。
這篇文章就到這里啦!如果你對文章內(nèi)容有疑問或想要深入討論,歡迎在評論區(qū)留言,我會盡力回答。同時,如果你覺得這篇文章對你有幫助,不妨點個贊并分享給其他同學,讓更多人受益。
想要了解更多相關(guān)知識,可以查看我以往的文章,其中有許多精彩內(nèi)容。記得關(guān)注我,獲取及時更新,我們可以一起學習、討論技術(shù),共同進步。
感謝你的閱讀與支持,期待在未來的文章中與你再次相遇!