LangChain 实战课
黄佳
新加坡科研局首席研究员
8120 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 28 讲
结束语 & 结课测试 (2讲)
LangChain 实战课
15
15
1.0x
00:00/00:00
登录|注册

17|回调函数:在AI应用中引入异步通信机制

你好,我是黄佳,欢迎来到 LangChain 实战课!
这节课我们一起来学习一下 LangChain 中的回调函数。

回调函数和异步编程

回调函数,你可能并不陌生。它是函数 A 作为参数传给另一个函数 B,然后在函数 B 内部执行函数 A。当函数 B 完成某些操作后,会调用(即“回调”)函数 A。这种编程模式常见于处理异步操作,如事件监听、定时任务或网络请求。
在编程中,异步通常是指代码不必等待某个操作完成(如 I/O 操作、网络请求、数据库查询等)就可以继续执行的能力。异步机制的实现涉及事件循环、任务队列和其他复杂的底层机制。这与同步编程形成对比,在同步编程中,操作必须按照它们出现的顺序完成。
下面是回调函数的一个简单示例。
def compute(x, y, callback):
result = x + y
callback(result)
def print_result(value):
print(f"The result is: {value}")
def square_result(value):
print(f"The squared result is: {value**2}")
# 使用print_result作为回调
compute(3, 4, print_result) # 输出: The result is: 7
# 使用square_result作为回调
compute(3, 4, square_result) # 输出: The squared result is: 49
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了回调函数在异步通信中的应用,以及LangChain中回调处理器的灵活运用。文章首先介绍了回调函数和异步编程的概念,并通过示例详细介绍了LangChain中的Callback处理器的实现和应用。作者还展示了如何在LangChain中自定义回调函数,并通过示例展示了异步操作的体现和优势。此外,文章还介绍了如何使用LangChain中的回调函数构造令牌计数器,以监控大模型的会话消耗和成本控制。通过对回调函数的灵活运用,读者可以更好地理解和应用回调函数在异步通信中的作用,以及LangChain中回调处理器的灵活性和扩展性。同时,文章还提出了思考题和延伸阅读,为读者提供了更多的学习和探索空间。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《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归属地:北京
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部