本次对接的大模型是智谱,首先想到去智谱开放平台找找有没有和langchain结合的文档:
结果还真有,就省去了谷歌的时间,但是智谱的文档只提供了非流式的示例代码,想着先拷过来跑一下再说,结果就是非流式是正常输出的,流式就遇到问题了,不管我咋配置,好像只能在控制台输出流失内容,遂去谷歌“langchain 流式输出”:
前面三篇文章都看了,第一篇内容:
好像和智谱官方的文档写法不一样,遂放弃使用该方式,接着又看了第二篇文章:
他这里说是要在初始化llm的时候加一个callbacks参数,并且自定义callbacks,最终的代码大致如下:
但他这里没有写全,起初我也没看懂为啥这么写,遂看了下其他人的写法:
原来在初始化llm的时候就需要注入自己的callbacks,然后我也试了这样写,确实能在on_llm_new_token中拿到每次流式的内容,但是不能yield出来,我就有点搞不明白,然后又看了一些更复杂的代码,我发现我看不懂:
还有走异步机制的:
我都有点迷惑了,到底啥代码才适合我呢?然后我就一直在尝试callbacks,搞到晚上11点,此时我心态有点崩了,遂盖上笔记本,不搞了先,然后我就和项目负责人说了langchain的流式搞不定,还是用原生的写法了,不用langchain。
然后第二天我还是打算再会一会这个langchain的流式输出,我就不信了。
先在群里请教了一下,然后给我发了一段很长的代码,额,这啥。
遂想到昨天谷歌搜索时的第二个网站的内容,抱着试试的心态,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", "你是一个专业的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 _token in 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 yield json.dumps(reply.to_dict(), ensure_ascii=False) + '\n'
总算舒了一口气,流式响应需求算是完成了,接下来是rag的,到目前位置我还不知道rag是啥,咋实现的。
我的公众号,欢迎大家订阅,我会同步文章到公众号上:
这篇文章就到这里啦!如果你对文章内容有疑问或想要深入讨论,欢迎在评论区留言,我会尽力回答。同时,如果你觉得这篇文章对你有帮助,不妨点个赞并分享给其他同学,让更多人受益。
想要了解更多相关知识,可以查看我以往的文章,其中有许多精彩内容。记得关注我,获取及时更新,我们可以一起学习、讨论技术,共同进步。
感谢你的阅读与支持,期待在未来的文章中与你再次相遇!
标签:flask,reason,流式,ai,token,langchain,llm,智谱 From: https://www.cnblogs.com/shuinanxun/p/18186838