流式输出与事件处理#
在实际应用中,智能体可能需要较长时间运行。向用户提供关于智能体进度的反馈至关重要,而流式传输机制正能实现这一需求。
AgentWorkflow
提供了一组预构建事件,可用于向用户流式传输输出内容。下面我们来看看具体实现方式。
首先,我们将引入一个需要较长时间执行的工具。这里我们使用 LlamaHub 提供的网络搜索工具 Tavily。
pip install llama-index-tools-tavily-research
该工具需要 API 密钥,我们将在 .env
文件中设置为 TAVILY_API_KEY
并通过 os.getenv
方法获取。导入相关模块:
from llama_index.tools.tavily_research import TavilyToolSpec
import os
然后初始化工具:
tavily_tool = TavilyToolSpec(api_key=os.getenv("TAVILY_API_KEY"))
现在我们将使用该工具和之前初始化的 LLM 创建一个智能体:
workflow = FunctionAgent(
tools=tavily_tool.to_tool_list(),
llm=llm,
system_prompt="You're a helpful assistant that can search the web for information.",
)
在之前的示例中,我们使用 await
等待 workflow.run
方法获取智能体的最终响应。但如果不等待响应,我们将获得一个异步迭代器,可以遍历该迭代器实时获取事件。这个迭代器会返回各种类型的事件。我们从 AgentStream
事件开始,该事件包含输出内容的"增量"(最新变化)。需要先导入该事件类型:
from llama_index.core.agent.workflow import AgentStream
现在可以运行工作流并筛选该类型事件进行输出:
handler = workflow.run(user_msg="What's the weather like in San Francisco?")
async for event in handler.stream_events():
if isinstance(event, AgentStream):
print(event.delta, end="", flush=True)
如果自行运行这段代码,您将看到随着智能体运行,输出内容会分块显示,类似以下结果:
旧金山当前天气情况如下:
- **温度**: 17.2°C (63°F)
- **天气状况**: 晴朗
- **风速**: 6.3 英里/小时 (10.1 公里/小时),风向西北偏北
- **湿度**: 54%
- **气压**: 1021 毫巴 (30.16 英寸汞柱)
- **能见度**: 16 公里 (9 英里)
更多详情可查看完整报告[此处](https://www.weatherapi.com/)。
AgentStream
只是 AgentWorkflow
运行时发出的众多事件之一。其他事件包括:
AgentInput
: 触发智能体执行的完整消息对象AgentOutput
: 智能体的响应内容ToolCall
: 被调用的工具及其参数ToolCallResult
: 工具调用的返回结果
您可以在本示例的完整代码中查看我们如何筛选更多这类事件。
接下来您将学习如何让人类参与循环为智能体提供反馈。