困扰了一天的flask结合智谱ai langchain流式输出json问题终于解决了

掘金的文章也是我写的,只是复制过来,因为csdn无法上传图片。

本次对接的大模型是智谱,首先想到去智谱开放平台找找有没有和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是啥,咋实现的。

我的公众号,欢迎大家订阅,我会同步文章到公众号上:

这篇文章就到这里啦!如果你对文章内容有疑问或想要深入讨论,欢迎在评论区留言,我会尽力回答。同时,如果你觉得这篇文章对你有帮助,不妨点个赞并分享给其他同学,让更多人受益。

想要了解更多相关知识,可以查看我以往的文章,其中有许多精彩内容。记得关注我,获取及时更新,我们可以一起学习、讨论技术,共同进步。

感谢你的阅读与支持,期待在未来的文章中与你再次相遇!

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一方_self

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值