tnblog
首页
视频
资源
登录

LangChain 回调 (Callback)

6835人阅读 2023/10/5 16:08 总访问:3455733 评论:0 收藏:0 手机
分类: 云产品

LangChain 回调 (Callback)

简介


CallbackLangChain 提供的回调机制,允许我们在 LLM 应用程序的各个阶段使用 Hook(钩子)。这对于记录日志、监控、流式传输等任务非常有用。这些任务的执行逻辑由回调处理器(CallbackHandler)定义。

回调处理器


Python 程序中, 回调处理器通过继承 BaseCallbackHandler 来实现。BaseCallbackHandler 接口对每一个可订阅的事件定义了一个回调函数。BaseCallbackHandler 的子类可以实现这些回调函数来处理事件。当事件触发时,LangChain 的回调管理器 CallbackManager 会调用相应的回调函数。

以下是 BaseCallbackHandler 的定义。请参考源代码

  1. class BaseCallbackHandler:
  2. """Base callback handler that can be used to handle callbacks from langchain."""
  3. def on_llm_start(
  4. self, serialized: Dict[str, Any], prompts: List[str], **kwargs: Any
  5. ) -> Any:
  6. """Run when LLM starts running."""
  7. def on_chat_model_start(
  8. self, serialized: Dict[str, Any], messages: List[List[BaseMessage]], **kwargs: Any
  9. ) -> Any:
  10. """Run when Chat Model starts running."""
  11. def on_llm_new_token(self, token: str, **kwargs: Any) -> Any:
  12. """Run on new LLM token. Only available when streaming is enabled."""
  13. def on_llm_end(self, response: LLMResult, **kwargs: Any) -> Any:
  14. """Run when LLM ends running."""
  15. def on_llm_error(
  16. self, error: Union[Exception, KeyboardInterrupt], **kwargs: Any
  17. ) -> Any:
  18. """Run when LLM errors."""
  19. def on_chain_start(
  20. self, serialized: Dict[str, Any], inputs: Dict[str, Any], **kwargs: Any
  21. ) -> Any:
  22. """Run when chain starts running."""
  23. def on_chain_end(self, outputs: Dict[str, Any], **kwargs: Any) -> Any:
  24. """Run when chain ends running."""
  25. def on_chain_error(
  26. self, error: Union[Exception, KeyboardInterrupt], **kwargs: Any
  27. ) -> Any:
  28. """Run when chain errors."""
  29. def on_tool_start(
  30. self, serialized: Dict[str, Any], input_str: str, **kwargs: Any
  31. ) -> Any:
  32. """Run when tool starts running."""
  33. def on_tool_end(self, output: str, **kwargs: Any) -> Any:
  34. """Run when tool ends running."""
  35. def on_tool_error(
  36. self, error: Union[Exception, KeyboardInterrupt], **kwargs: Any
  37. ) -> Any:
  38. """Run when tool errors."""
  39. def on_text(self, text: str, **kwargs: Any) -> Any:
  40. """Run on arbitrary text."""
  41. def on_agent_action(self, action: AgentAction, **kwargs: Any) -> Any:
  42. """Run on agent action."""
  43. def on_agent_finish(self, finish: AgentFinish, **kwargs: Any) -> Any:
  44. """Run on agent end."""


LangChain 内置支持了一系列回调处理器,我们也可以按需求自定义处理器,以实现特定的业务。

内置处理器


StdOutCallbackHandlerLangChain 所支持的最基本的处理器。它将所有的回调信息打印到标准输出。这对于调试非常有用。

LangChain 链的基类 Chain 提供了一个 callbacks 参数来指定要使用的回调处理器。请参考Chain源码,其中代码片段为:

  1. class Chain(Serializable, ABC):
  2. """Abstract base class for creating structured sequences of calls to components.
  3. ...
  4. callbacks: Callbacks = Field(default=None, exclude=True)
  5. """Optional list of callback handlers (or callback manager). Defaults to None.
  6. Callback handlers are called throughout the lifecycle of a call to a chain,
  7. starting with on_chain_start, ending with on_chain_end or on_chain_error.
  8. Each custom chain can optionally call additional callback methods, see Callback docs
  9. for full details."""


用法如下:

  1. from langchain.callbacks import StdOutCallbackHandler
  2. from langchain.chains import LLMChain
  3. from langchain.llms import OpenAI
  4. from langchain.prompts import PromptTemplate
  5. handler = StdOutCallbackHandler()
  6. llm = OpenAI()
  7. prompt = PromptTemplate.from_template("Who is {name}?")
  8. chain = LLMChain(llm=llm, prompt=prompt, callbacks=[handler])
  9. chain.run(name="Super Mario")


你应该期望如下输出:

自定义处理器


我们可以通过继承 BaseCallbackHandler 来实现自定义的回调处理器。下面是一个简单的例子,TimerHandler 将跟踪 ChainLLM 交互的起止时间,并统计每次交互的处理耗时。

  1. from langchain.callbacks.base import BaseCallbackHandler
  2. import time
  3. class TimerHandler(BaseCallbackHandler):
  4. def __init__(self) -> None:
  5. super().__init__()
  6. self.previous_ms = None
  7. self.durations = []
  8. def current_ms(self):
  9. return int(time.time() * 1000 + time.perf_counter() % 1 * 1000)
  10. def on_chain_start(self, serialized, inputs, **kwargs) -> None:
  11. self.previous_ms = self.current_ms()
  12. def on_chain_end(self, outputs, **kwargs) -> None:
  13. if self.previous_ms:
  14. duration = self.current_ms() - self.previous_ms
  15. self.durations.append(duration)
  16. def on_llm_start(self, serialized, prompts, **kwargs) -> None:
  17. self.previous_ms = self.current_ms()
  18. def on_llm_end(self, response, **kwargs) -> None:
  19. if self.previous_ms:
  20. duration = self.current_ms() - self.previous_ms
  21. self.durations.append(duration)
  22. llm = OpenAI()
  23. timerHandler = TimerHandler()
  24. prompt = PromptTemplate.from_template("What is the HEX code of color {color_name}?")
  25. chain = LLMChain(llm=llm, prompt=prompt, callbacks=[timerHandler])
  26. response = chain.run(color_name="blue")
  27. print(response)
  28. response = chain.run(color_name="purple")
  29. print(response)
  30. timerHandler.durations


你应该期望如下输出:

回调处理器的适用场景


通过 LLMChain 的构造函数参数设置 callbacks 仅仅是众多适用场景之一。接下来我们简明地列出其他使用场景和示例代码。

对于 ModelAgentTool,以及 Chain 都可以通过以下方式设置回调处理器:

1. 构造函数参数 callbacks 设置


关于 Chain,以 LLMChain 为例,请参考本讲上一部分内容。注意在 Chain 上的回调器监听的是 chain 相关的事件,因此回调器的如下函数会被调用:

  1. timerHandler = TimerHandler()
  2. llm = OpenAI(callbacks=[timerHandler])
  3. response = llm.predict("What is the HEX code of color BLACK?")
  4. print(response)
  5. timerHandler.durations


你应该期望看到类似如下的输出:

2. 通过运行时的函数调用


ModelAgentTool,以及 Chain 的请求执行函数都接受 callbacks 参数,比如 LLMChainrun 函数,OpenAIpredict 函数,等都能接受 callbacks 参数,在运行时指定回调处理器。
OpenAI 模型类为例:

  1. timerHandler = TimerHandler()
  2. llm = OpenAI()
  3. response = llm.predict("What is the HEX code of color BLACK?", callbacks=[timerHandler])
  4. print(response)
  5. timerHandler.durations


你应该同样期望如下输出:


关于 AgentTool 等的使用,请参考官方文档API。


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

LangChain 简单应用(学习笔记)

LangChain 简单应用(学习笔记)[TOC] Langchain 简介大型语言模型(LLM)正在成为一种具有变革性的技术,使开发人员能够构...

LangChain 模型(学习笔记)

LangChain 模型(学习笔记)[TOC] Langchain 模型简介Langchain所封装的模型分为两类:——大语言模型 (LLM)——聊天模型 (C...

LangChain 数据连接(学习笔记)

LangChain 数据连接(学习笔记)[TOC] 什么是数据连接?LLM应用往往需要用户特定的数据,而这些数据并不属于模型的训练集。L...

LangChain 提示词(学习笔记)

LangChain 提示词(学习笔记)[TOC] 什么是提示词?提示词(Prompt)是指向模型提供的输入。这个输入通常由多个元素构成。La...

LangChain 输出解析器(学习笔记)

LangChain 输出解析器(学习笔记)[TOC] 简介LLM的输出为文本,但在程序中除了显示文本,可能希望获得更结构化的数据。这就...

LangChain 链(学习笔记)

LangChain 链(学习笔记)[TOC] 单一的LLM对于简单的应用场景已经足够,但是更复杂的应用程序需要将LLM串联在一起,需要多LL...

LangChain 记忆组件(学习笔记)

LangChain 记忆组件(学习笔记)[TOC] 单一的LLM对于简单的应用场景已经足够,但是更复杂的应用程序需要将LLM串联在一起,需...

LangChain 代理 Agent(学习笔记)

LangChain 代理 Agent(学习笔记)[TOC] 简介Agent 也就是代理,它的核心思想是利用一个语言模型来选择一系列要执行的动作。...

LangChain 一个完整的例子

LangChain 一个完整的例子[TOC] 简介这是该 LangChain 极简入门系列的最后一讲。我们将利用过去9讲学习的知识,来完成一个...

页面传值 和回调函数

varjos=window.frames["需要使用页面的名字可以检查找到属性"].函数名;frame里面的属性名每次点击都不一样可以找...
这一世以无限游戏为使命!
排名
2
文章
633
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术