LangChain系列文章
LangChain提供了一个回调系统,允许您钩入LLM应用程序的各个阶段。这对于记录、监控、流式传输和其他任务非常有用。
您可以通过使用API中的callbacks参数订阅这些事件。这个参数是处理程序对象的列表,这些对象预期实现下面更详细描述的一个或多个方法。
CallbackHandlers
是实现CallbackHandler
接口的对象,该接口针对可以订阅的每个事件都有一个方法。当事件触发时,CallbackManager
将在每个处理程序上调用适当的方法。
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."""
回调函数参数可用于 API 中的大多数对象(链、模型、工具、代理等),分别有两个不同的使用场景:
构造函数回调函数:在构造函数中定义,例如 LLMChain(callbacks=[handler], tags=['a-tag'])
,将用于该对象上的所有调用,并且仅限于该对象,例如如果您将处理程序传递给 LLMChain 构造函数,则不会被附加到该链上的模型使用。
请求回调函数:在 run()
/apply()
方法中定义,用于发出请求,例如 chain.run(input, callbacks=[handler])
,将仅用于该特定请求以及其中包含的所有子请求(例如对LLMChain的调用触发对模型的调用,该模型使用在 call()
方法中传递的相同处理程序)。
verbose
参数可用于 API 中的大多数对象(链、模型、工具、代理等)作为构造函数参数,例如 LLMChain(verbose=True)
,相当于将 ConsoleCallbackHandler
传递给该对象和所有子对象的回调参数。这对于调试非常有用,因为它将所有事件记录到控制台。
构造函数回调最适用于诸如日志记录、监控等用例,这些用例并不特定于单个请求,而是整个链条。例如,如果你想要记录发送到LLMChain的所有请求,你可以将一个处理程序传递给构造函数。
请求回调最适用于诸如流式传输等用例,其中你想要将单个请求的输出流传输到特定的websocket
连接,或者其他类似的用例。例如,如果你想要将单个请求的输出流传输到websocket
,你可以将一个处理程序传递给call()
方法。
LangChain提供了一些内置处理程序,您可以使用它们来开始。这些都可以在langchain/callbacks
模块中找到。最基本的处理程序是StdOutCallbackHandler
,它只是将所有事件记录到标准输出。
注意:当对象上的verbose
标志设置为true时,即使没有显式传递,StdOutCallbackHandler
也会被调用。
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])
运行结果
langchain-llm-app (develop*) » python Callbacks/llm_callbacks.py ~/Workspace/LLM/langchain-llm-app 1 ↵
> 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.
https://github.com/zgpeace/pets-name-langchain/tree/develop
https://python.langchain.com/docs/modules/callbacks/