回调函数
info
请访问Integrations以获取内置回调函数与第三方工具集成的文档。
LangChain提供了一个回调函数系统,允许您在LLM应用程序的各个阶段进行钩子操作。这对于日志记录、监控、流式传输和其他任务非常有用。
您可以使用 API 中的 callbacks
参数订阅这些事件。该参数是一个处理程序对象列表,这些对象应该详细实现下面描述的一个或多个方法。
回调处理程序
CallbackHandlers
是实现 CallbackHandler
接口的对象,每个事件都可以订阅一个方法。当触发事件时,CallbackManager
会调用每个处理程序上的适当方法。
---python class BaseCallbackHandler: """Base callback handler that can be used to handle callbacks from langchain."""
def on_llm_start(
self, serialized: Dict[str, Any], prompts: List[str], **kwargs: Any
) -> Any:
"""Run when LLM starts running."""
def on_chat_model_start(
self, serialized: Dict[str, Any], messages: List[List[BaseMessage]], **kwargs: Any
) -> Any:
"""Run when Chat Model starts running."""
def on_llm_new_token(self, token: str, **kwargs: Any) -> Any:
"""Run on new LLM token. Only available when streaming is enabled."""
def on_llm_end(self, response: LLMResult, **kwargs: Any) -> Any:
"""Run when LLM ends running."""
def on_llm_error(
self, error: Union[Exception, KeyboardInterrupt], **kwargs: Any
) -> Any:
"""Run when LLM errors."""
def on_chain_start(
self, serialized: Dict[str, Any], inputs: Dict[str, Any], **kwargs: Any
) -> Any:
"""Run when chain starts running."""
def on_chain_end(self, outputs: Dict[str, Any], **kwargs: Any) -> Any:
"""Run when chain ends running."""
def on_chain_error(
self, error: Union[Exception, KeyboardInterrupt], **kwargs: Any
) -> Any:
"""Run when chain errors."""
def on_tool_start(
self, serialized: Dict[str, Any], input_str: str, **kwargs: Any
) -> Any:
"""Run when tool starts running."""
def on_tool_end(self, output: str, **kwargs: Any) -> Any:
"""Run when tool ends running."""
def on_tool_error(
self, error: Union[Exception, KeyboardInterrupt], **kwargs: Any
) -> Any:
"""Run when tool errors."""
def on_text(self, text: str, **kwargs: Any) -> Any:
"""Run on arbitrary text."""
def on_agent_action(self, action: AgentAction, **kwargs: Any) -> Any:
"""Run on agent action."""
def on_agent_finish(self, finish: AgentFinish, **kwargs: Any) -> Any:
"""Run on agent end."""
## 入门
LangChain 提供了一些内置的处理程序,您可以使用它们进行入门。这些处理程序在 `langchain/callbacks` 模块中可用。最基本的处理程序是 `StdOutCallbackHandler`,它只是将所有事件记录到 `stdout`。
**注意** 当对象上的 `verbose` 标志设置为 true 时,即使没有显式传递,`StdOutCallbackHandler` 也会被调用。
```python
from langchain.callbacks import StdOutCallbackHandler
from langchain.chains import LLMChain
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
handler = StdOutCallbackHandler()
llm = OpenAI()
prompt = PromptTemplate.from_template("1 + {number} = ")
# Constructor callback: First, let's explicitly set the StdOutCallbackHandler when initializing our chain
chain = LLMChain(llm=llm, prompt=prompt, callbacks=[handler])
chain.run(number=2)
# Use verbose flag: Then, let's use the `verbose` flag to achieve the same result
chain = LLMChain(llm=llm, prompt=prompt, verbose=True)
chain.run(number=2)
# Request callbacks: Finally, let's use the request `callbacks` to achieve the same result
chain = LLMChain(llm=llm, prompt=prompt)
chain.run(number=2, callbacks=[handler])
> Entering new LLMChain chain...
Prompt after formatting:
1 + 2 =
> Finished chain.
> Entering new LLMChain chain...
Prompt after formatting:
1 + 2 =
> Finished chain.
> Entering new LLMChain chain...
Prompt after formatting:
1 + 2 =
> Finished chain.
'\n\n3'
在哪里传递回调
callbacks
参数在 API 的大多数对象(Chains、Models、Tools、Agents 等)中都可用,有两个不同的位置:
- 构造函数回调:在构造函数中定义,例如
LLMChain(callbacks=[handler], tags=['a-tag'])
,它将用于该对象上的所有调用,并仅限于该对象的范围,例如,如果您将处理程序传递给LLMChain
构造函数,它将不会被附加到该链上的模型使用。 - 请求回调:在发出请求的
call()
/run()
/apply()
方法中定义,例如chain.call(inputs, callbacks=[handler])
,它仅用于该特定请求以及它包含的所有子请求(例如,对 LLMChain 的调用触发对模型的调用,模型使用在call()
方法中传递的相同处理程序)。
verbose
参数在 API 的大多数对象(Chains、Models、Tools、Agents 等)中都可用作构造函数参数,例如 LLMChain(verbose=True)
,它等效于将 ConsoleCallbackHandler
传递给该对象及其所有子对象的 callbacks
参数。这对于调试非常有用,因为它会将所有事件记录到控制台。
在什么情况下使用这些选项?
- 构造函数回调最适用于记录、监视等与单个请求无关的用例。例如,如果您想记录对 LLMChain 的所有请求,您可以将处理程序传递给构造函数。
- 请求回调最适用于流式传输等用例,其中您希望将单个请求的输出流式传输到特定的 WebSocket 连接或其他类似用例。例如,如果您想将单个请求的输出流式传输到 WebSocket,您可以将处理程序传递给
call()
方法。