LangChain系列文章
- LangChain 实现给动物取名字,
- LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字
- LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄
- LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索Indexes for information retrieve
- LangChain 5易速鲜花内部问答系统
- LangChain 6根据图片生成推广文案HuggingFace中的image-caption模型
- LangChain 7 文本模型TextLangChain和聊天模型ChatLangChain
- LangChain 8 模型Model I/O:输入提示、调用模型、解析输出
- LangChain 9 模型Model I/O 聊天提示词ChatPromptTemplate, 少量样本提示词FewShotPrompt
- LangChain 10思维链Chain of Thought一步一步的思考 think step by step
- LangChain 11实现思维树Implementing the Tree of Thoughts in LangChain's Chain
- LangChain 12调用模型HuggingFace中的Llama2和Google Flan t5
- LangChain 13输出解析Output Parsers 自动修复解析器
- LangChain 14 SequencialChain链接不同的组件
- LangChain 15根据问题自动路由Router Chain确定用户的意图
- LangChain 16 通过Memory记住历史对话的内容
- LangChain 17 LangSmith调试、测试、评估和监视基于任何LLM框架构建的链和智能代理
- LangChain 18 LangSmith监控评估Agent并创建对应的数据库
- LangChain 19 Agents Reason+Action自定义agent处理OpenAI的计算缺陷
- LangChain 20 Agents调用google搜索API搜索市场价格 Reason Action:在语言模型中协同推理和行动
- LangChain 21 Agents自问自答与搜索 Self-ask with search
- LangChain 22 LangServe用于一键部署LangChain应用程序
- LangChain 23 Agents中的Tools用于增强和扩展智能代理agent的功能
- LangChain 24 对本地文档的搜索RAG检索增强生成Retrieval-augmented generation
- LangChain 25: SQL Agent通过自然语言查询数据库sqlite
1. 回调Callbacks
LangChain提供了一个回调系统,允许您钩入LLM应用程序的各个阶段。这对于记录、监控、流式传输和其他任务非常有用。
您可以通过使用API中的callbacks参数订阅这些事件。这个参数是处理程序对象的列表,这些对象预期实现下面更详细描述的一个或多个方法。
2. Callback handlers 回调处理程序
CallbackHandlers
是实现CallbackHandler
接口的对象,该接口针对可以订阅的每个事件都有一个方法。当事件触发时,CallbackManager
将在每个处理程序上调用适当的方法。
py
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."""
3. 回调函数的使用场景
回调函数参数可用于 API 中的大多数对象(链、模型、工具、代理等),分别有两个不同的使用场景:
-
构造函数回调函数:在构造函数中定义,例如
LLMChain(callbacks=[handler], tags=['a-tag'])
,将用于该对象上的所有调用,并且仅限于该对象,例如如果您将处理程序传递给 LLMChain 构造函数,则不会被附加到该链上的模型使用。 -
请求回调函数:在
run()
/apply()
方法中定义,用于发出请求,例如chain.run(input, callbacks=[handler])
,将仅用于该特定请求以及其中包含的所有子请求(例如对LLMChain的调用触发对模型的调用,该模型使用在call()
方法中传递的相同处理程序)。
verbose
参数可用于 API 中的大多数对象(链、模型、工具、代理等)作为构造函数参数,例如 LLMChain(verbose=True)
,相当于将 ConsoleCallbackHandler
传递给该对象和所有子对象的回调参数。这对于调试非常有用,因为它将所有事件记录到控制台。
4. 你想要在什么时候使用这些回调函数呢?
-
构造函数回调最适用于诸如日志记录、监控等用例,这些用例并不特定于单个请求,而是整个链条。例如,如果你想要记录发送到LLMChain的所有请求,你可以将一个处理程序传递给构造函数。
-
请求回调最适用于诸如流式传输等用例,其中你想要将单个请求的输出流传输到特定的
websocket
连接,或者其他类似的用例。例如,如果你想要将单个请求的输出流传输到websocket
,你可以将一个处理程序传递给call()
方法。
5. 代码实现
LangChain提供了一些内置处理程序,您可以使用它们来开始。这些都可以在langchain/callbacks
模块中找到。最基本的处理程序是StdOutCallbackHandler
,它只是将所有事件记录到标准输出。
注意:当对象上的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])
运行结果
shell
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