LangChain Agent 流式输出:stream_mode=“values“ 数据结构解析
通过create_agent()可以创建 Agent 对象。创建后的 Agent 支持两种常见执行方式invoke()等待 Agent 执行完成一次性获得最终结果。stream()在 Agent 执行过程中逐步获得运行状态。本文主要介绍 Agent 的流式输出以及下面这行代码的作用一、完整代码下面创建两个股票查询工具然后让 Agent 查询“传智教育”的股价和公司信息。fromlangchain.agentsimportcreate_agentfromlangchain_community.chat_models.tongyiimportChatTongyifromlangchain_core.toolsimporttooltool(description获取股价传入股票名称返回字符串信息)defget_price(name:str)-str:returnf股票{name}的价格是20元tool(description获取股票信息传入股票名称返回字符串信息)defget_info(name:str)-str:returnf股票{name}是一家A股上市公司专注于IT职业教育。agentcreate_agent(modelChatTongyi(modelqwen3-max),tools[get_price,get_info],system_prompt你是一个智能助手可以回答股票相关问题)forchunkinagent.stream({messages:[{role:user,content:传智教育股价多少并介绍一下}]},stream_modevalues):latest_messagechunk[messages][-1]iflatest_message.content:print(type(latest_message).__name__,latest_message.content)try:iflatest_message.tool_calls:print(工具调用,[tc[name]fortcinlatest_message.tool_calls])exceptAttributeError:pass运行结果如下二、stream_modevalues返回什么stream_modevalues之后Agent 每完成一个执行步骤都会返回当前时刻的完整状态。每个chunk都是一个字典核心结构如下{messages:[HumanMessage(...),AIMessage(...),ToolMessage(...),AIMessage(...)]}ToolMessage工具执行后返回的结果。Agent 执行过程中messages列表会不断变长。例如第一次可能只有用户消息[HumanMessage(...)]模型决定调用工具后[HumanMessage(...),AIMessage(tool_calls[...])]工具执行完成后[HumanMessage(...),AIMessage(tool_calls[...]),ToolMessage(...),ToolMessage(...)]三、为什么使用chunk[messages][-1]latest_messagechunk[messages][-1]表示获取 Agent 当前状态中的最后一条消息也就是最近产生的消息。如果直接遍历整个列表formessageinchunk[messages]:print(message)由于每个chunk都包含完整消息历史之前的消息会被重复打印。使用[-1]则每次只查看最后一条消息输出会更加清晰。四、content和tool_calls分别是什么这两个都是 Message对象的属性提取最新消息后主要读取两个属性latest_message.content latest_message.tool_calls1.contentcontent保存消息中的文字内容。比如模型最终回答AIMessage(content传智教育当前股价为20元……)iflatest_message.content:print(latest_message.content)#输出消息中的文本。2.tool_callstool_calls保存模型产生的工具调用请求。例如AIMessage(content,tool_calls[{name:get_price,args:{name:传智教育},id:call_xxx,type:tool_call}])其中name调用的工具名称。args传递给工具的参数。id本次工具调用的唯一标识。[tc[name]fortcinlatest_message.tool_calls]#会提取所有准备调用的工具名称。五、为什么tool_calls会出现两次打印完整的AIMessage时会看到AIMessage(content,additional_kwargs{tool_calls:[{function:{arguments:{name: 传智教育},name:get_price}}]},tool_calls[{name:get_price,args:{name:传智教育}}])工具调用同时出现在additional_kwargs[tool_calls]message.tool_calls这两个位置的作用不同。additional_kwargs这里通常保存模型接口返回的附加数据其结构更接近模型原始返回结果。additional_kwargs本身是一个 Python 字典用于保存模型返回的附加数据。其中工具参数function.arguments可能仍然是 JSON 格式的字符串arguments:{name: 传智教育}tool_callsLangChain 会对工具调用数据进行解析和统一封装tool_calls[#如果调用多个工具 就会有多个字典{name:get_price,args:{name:传智教育}}]这样不管底层使用哪个模型都可以通过统一方式读取工具调用。六、总结stream_modevalues返回的是 Agent 每一步执行后的完整状态其中最重要的数据是chunk[messages]#它保存了 Agent 当前积累的全部消息。latest_messagechunk[messages][-1]#表示从完整消息列表中取出最后一条消息避免重复处理以前已经出现过的内容。消息中的两个常用属性分别是message.content#用于获取文字内容message.tool_calls#用于获取模型准备调用的工具及其参数。整个执行过程可以简单概括为用户问题 ↓ 模型决定调用工具 ↓ 工具返回查询结果 ↓ 模型整合结果 ↓ 生成最终回答

相关新闻

教育局统考高性价比阅卷软件服务商

教育局统考高性价比阅卷软件服务商

在教育数字化的浪潮下,教育局组织的统考工作面临着前所未有的挑战。传统的统考阅卷方式不仅效率低下,还容易出现人为误差,难以满足如今高效化、精准化、数字化的教育需求。因此,选择一款高性价比的阅卷软件服务商至关重要。今天就…

2026/9/15 18:23:55 阅读更多 →
电源EMI传导测试:从噪声根源到滤波器设计的实战指南

电源EMI传导测试:从噪声根源到滤波器设计的实战指南

1. 项目概述:从“玄学”到“科学”的电源EMI传导测试 搞电源设计的朋友,估计没几个不怕EMI的。尤其是传导测试,它不像辐射那样看不见摸不着,传导超标是板上钉钉的硬伤,整改起来往往更棘手。我见过太多工程师&#xff0…

2026/9/7 6:09:14 阅读更多 →
Sysmon部署与配置实战:从日志黑洞到精细化Windows系统监控

Sysmon部署与配置实战:从日志黑洞到精细化Windows系统监控

1. 项目概述:从“日志黑洞”到“上帝之眼”在安全运维和事件响应的世界里,我们常常面临一个尴尬的局面:系统自带的日志,比如Windows事件查看器里的那些条目,信息粒度太粗了。一个进程启动了,谁启动的&#…

2026/9/11 15:55:19 阅读更多 →

最新新闻

鸿蒙ArkTS三大原生组件:校验、动态表单与WebSocket直连实践

鸿蒙ArkTS三大原生组件:校验、动态表单与WebSocket直连实践

1. 项目概述:为什么这三个组件在纯血鸿蒙生态里真正“解渴”我最近三个月没碰Android Studio,也没开过Xcode,全身心扎进DevEco Studio里,做了三件看起来不大、但上线后被二十多个团队主动私信要源码的事:一个数据校验工…

2026/9/15 20:52:07 阅读更多 →
Quickwit Kafka 数据接入完整指南:从 Topic 创建到索引搜索

Quickwit Kafka 数据接入完整指南:从 Topic 创建到索引搜索

Quickwit Kafka 数据接入完整指南:从 Topic 创建到索引搜索 【免费下载链接】quickwit Cloud-native OSS search engine for observability 项目地址: https://gitcode.com/GitHub_Trending/qu/quickwit 本指南基于 Quickwit 开源仓库的官方教程文档&#xf…

2026/9/15 20:52:07 阅读更多 →
上海服务设计供应商选择指南:从需求梳理到合作落地

上海服务设计供应商选择指南:从需求梳理到合作落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/15 20:52:07 阅读更多 →
douyin-downloader:命令行批量保存抖音无水印视频与创作者全部作品,自动归档

douyin-downloader:命令行批量保存抖音无水印视频与创作者全部作品,自动归档

douyin-downloader:命令行批量保存抖音无水印视频与创作者全部作品,自动归档 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplica…

2026/9/15 20:52:07 阅读更多 →
MPTCP协议详解:多路径传输的原理与实践

MPTCP协议详解:多路径传输的原理与实践

1. MPTCP协议的前世今生:为什么我们需要多路径传输2009年,当苹果工程师在测试iPhone 3GS的Wi-Fi和蜂窝网络切换时,发现了一个令人头疼的问题:当用户从办公室Wi-Fi走向室外,网络连接会经历长达数秒的中断。这个看似简单…

2026/9/15 20:52:07 阅读更多 →
PostHog Endpoint 物化(Materialisation)完全指南:从预计算决策到 Bucket Overrides 与刷新调度

PostHog Endpoint 物化(Materialisation)完全指南:从预计算决策到 Bucket Overrides 与刷新调度

PostHog Endpoint 物化(Materialisation)完全指南:从预计算决策到 Bucket Overrides 与刷新调度 【免费下载链接】posthog :hedgehog: PostHog is the leading platform for building self-driving products. Our developer tools – AI obse…

2026/9/15 20:51:06 阅读更多 →

日新闻

Java高级技术:从语言特性到性能优化全解析

Java高级技术:从语言特性到性能优化全解析

1. Java高级技术概述Java作为一门成熟的编程语言,经过二十多年的发展已经形成了完整的生态系统。在企业级应用开发、大数据处理、移动开发等领域,Java都占据着重要地位。掌握Java高级技术不仅意味着能够编写更高效的代码,更代表着开发者能够解…

2026/9/15 0:00:23 阅读更多 →
C#与Halcon结合的工业视觉处理实战指南

C#与Halcon结合的工业视觉处理实战指南

1. 项目概述:C#与Halcon强强联合的视觉处理利器这个基于C#和Halcon的视觉处理Demo项目,是我在工业质检领域摸爬滚打多年后提炼出的实战精华。它完美融合了C#的界面开发优势与Halcon强大的图像处理能力,就像给视觉工程师配上了一把瑞士军刀。项…

2026/9/15 0:00:23 阅读更多 →
32路工业串口服务器的硬核选型指南:确定性、鲁棒性与协议下沉

32路工业串口服务器的硬核选型指南:确定性、鲁棒性与协议下沉

1. 为什么“32路复合型”不是营销话术,而是工业现场真实痛点的硬解你有没有遇到过这样的场景:在某大型能源站的PLC机柜里,十几台不同年代、不同品牌的温控仪、电表、气体分析仪、阀门控制器,全靠RS-485总线挂在一根线上&#xff0…

2026/9/15 0:00:23 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/15 12:27:42 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/15 1:32:25 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/15 1:32:21 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/14 17:35:10 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/14 16:59:29 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/14 5:45:14 阅读更多 →