1. 项目概述:LangChain Agent流式输出实战
在构建大语言模型应用时,Agent智能体的流式输出能力是提升用户体验的关键技术。传统的一次性返回(invoke)模式会让用户长时间等待,而流式输出(stream)则能实现"边生成边展示"的效果,特别适合需要调用多个工具或生成较长内容的场景。
本次实战将基于LangChain框架,开发一个股票查询Agent,重点演示以下核心技术点:
- 使用
agent.stream()方法实现增量式输出 - 解析结果块(chunk)中的消息类型
- 处理工具调用(tool calls)的多种数据结构
- 理解stream_mode="values"的工作原理
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心概念解析与技术选型
2.1 流式输出 vs 批量输出
在LangChain中,Agent有两种主要的输出方式:
- invoke(调用):一次性获取完整结果,适用于简单查询
- stream(流式):持续接收多个结果块(chunk),适合复杂任务
流式输出的优势在于:
- 降低用户等待焦虑
- 展示Agent的思考过程
- 提前呈现部分可用结果
2.2 工具调用(Tool Calls)的数据结构
当Agent决定调用工具时,消息中会包含tool_calls字段。需要注意这个字段可能有多种表现形式:
python复制# 可能形式1:字典列表
tool_calls = [{"name": "get_price", "args": {"name": "AAPL"}}]
# 可能形式2:包含name属性的对象列表
class ToolCall:
name: str
args: dict
tool_calls = [ToolCall(name="get_info", args={"name": "AAPL"})]
2.3 stream_mode参数详解
stream_mode="values"是本次实战的关键参数,它决定了chunk的生成方式:
- values模式:每个chunk都是完整状态快照,包含当前所有消息
- 其他模式:可能只包含增量变化
values模式的优势是保证数据完整性,适合需要精确控制显示逻辑的场景。
3. 完整实现步骤
3.1 环境准备与模型初始化
首先设置开发环境并初始化聊天模型:
python复制import os
from dotenv import load_dotenv
from langchain_community.chat_models.tongyi import ChatTongyi
def init_chat_model() -> ChatTongyi:
load_dotenv()
api_key = os.getenv("DASHSCOPE_API_KEY") or os.getenv("API_KEY")
os.environ["DASHSCOPE_API_KEY"] = api_key # 确保兼容性
return ChatTongyi(model="qwen3-max")
关键点说明:
- 使用
dotenv管理敏感信息 - 支持多种API_KEY环境变量名称
- 选择qwen3-max模型,适合工具调用场景
3.2 定义股票查询工具
创建两个示例工具用于演示:
python复制from langchain_core.tools import tool
@tool(description="获取股票价格,传入股票名称,返回字符串信息")
def get_price(name: str) -> str:
"""模拟股票价格查询"""
return f"股票{name}的价格是20元"
@tool(desc
