17|回调函数:在AI应用中引入异步通信机制
黄佳
你好,我是黄佳,欢迎来到 LangChain 实战课!
这节课我们一起来学习一下 LangChain 中的回调函数。
回调函数和异步编程
回调函数,你可能并不陌生。它是函数 A 作为参数传给另一个函数 B,然后在函数 B 内部执行函数 A。当函数 B 完成某些操作后,会调用(即“回调”)函数 A。这种编程模式常见于处理异步操作,如事件监听、定时任务或网络请求。
在编程中,异步通常是指代码不必等待某个操作完成(如 I/O 操作、网络请求、数据库查询等)就可以继续执行的能力。异步机制的实现涉及事件循环、任务队列和其他复杂的底层机制。这与同步编程形成对比,在同步编程中,操作必须按照它们出现的顺序完成。
下面是回调函数的一个简单示例。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了回调函数在异步通信中的应用,以及LangChain中回调处理器的灵活运用。文章首先介绍了回调函数和异步编程的概念,并通过示例详细介绍了LangChain中的Callback处理器的实现和应用。作者还展示了如何在LangChain中自定义回调函数,并通过示例展示了异步操作的体现和优势。此外,文章还介绍了如何使用LangChain中的回调函数构造令牌计数器,以监控大模型的会话消耗和成本控制。通过对回调函数的灵活运用,读者可以更好地理解和应用回调函数在异步通信中的作用,以及LangChain中回调处理器的灵活性和扩展性。同时,文章还提出了思考题和延伸阅读,为读者提供了更多的学习和探索空间。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《LangChain 实战课》,新⼈⾸单¥59
《LangChain 实战课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(3)
- 最新
- 精选
- 阿斯蒂芬置顶笔记mark: 1.疑似纠错: 第二个代码示例后写道:【compute 函数开始执行。当它遇到 await asyncio.sleep(2) 时,它会暂停】 但是代码中是 await asyncio.sleep(0.5),休眠时长会影响最终程序的打印输出顺序; 后面花卉部分 【在 MyFlowerShopAsyncHandler 中,我们使用了 await asyncio.sleep(0.3) 】也与代码中的 await asyncio.sleep(0.5) 不一致; 如果属实,还是建议修改下,否则容易造成困惑 2. 自定义回调函数 代码报错问题 一开始直接使用老师的代码,未能获得流式响应的打印,出现报错: Retrying langchain.chat_models.openai.acompletion_with_retry.<locals>._completion_with_retry in 4.0 seconds as it raised APIConnectionError: Error communicating with OpenAI. 但是此时非流式的响应,是能够正常完成的; 折腾许久,定位到是openai代理的问题,但是流式响应是通过SSE协议,此时vpn似乎被绕过了,将vpn代理显示添加到 OPENAI_PROXY 环境变量后解决 3. 最后的 additional_interactions() 示例中,可以将 asynio.gather 的返回结果打印出来,能够看到每个任务使用的token数量,与最终的总数是一致的
作者回复: 嗯嗯,你是课代表啊。作业做的又细又好。好滴,第一个我们统一成0.5,第2个经验也非常宝贵,值得用代理的童鞋借鉴。值得置顶。
2023-10-20归属地:广东 - 阿斯蒂芬来交作业了: 思考题1: 在确保效果相同的三轮交互中,使用了其他记忆机制,并记录令牌使用情况(分别测试三次取范围值) ConversationBufferMemory: 1000 ~ 1500 ConversationBufferWindowMemory(k=2): 1200 ~ 1600 ConversationSummaryMemory: 2000 ~ 2500 ConversationSummaryBufferMemory(max_token_limt=300): 1000~1500 大致看也符合估算示意图第一阶段 0-5 interacitions 的走势,ConversationSummaryMemory 增长较快,其他几个增长速率较为一致 思考题2: 使用LLMChain的 run 方法也可以传递callback class MyCallBackHandler(BaseCallbackHandler): def on_llm_new_token(self, token: str, **kwargs) -> None: print(f"recv token: {token}") llm = ChatOpenAI(streaming=True) prompt = PromptTemplate.from_template("1 + {number} = ") chain = LLMChain(llm=llm, prompt=prompt) chain.run(number=2, callbacks=[MyCallBackHandler()]) 其实这个示例就是从老师的延伸阅读中“拿来”的,不知答对没
作者回复: 🤴🏻
2023-10-20归属地:广东1 - 悟尘老师,这节课少了输出结果的演示~理解起来有点费劲
作者回复: 同学,具体指的是哪一段代码的输出结果,我回头看看。。。
2023-11-12归属地:北京
收起评论