Skip to main content

回调函数

LangChain

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() 方法。