了解(“placeholder“, “{agent_scratchpad}“)

发布时间:2026/9/12 18:07:55

了解(“placeholder“, “{agent_scratchpad}“) 目前演示的是langchainV0.3版本智能体调用import json import os import httpx from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain_classic.agents import create_tool_calling_agent from langchain_classic.agents import AgentExecutor from langchain_core.prompts import ChatPromptTemplate from langchain_core.tools import tool 多工具并行调用,一次性发起了同一个外部函数的两次调用请求并将最后结果聚合 一次问题 → 多工具调用 → 聚合回答 load_dotenv() tool def get_weather(loc): 查询即时天气函数 :param loc: 必要参数字符串类型用于表示查询天气的具体城市名称。 注意中国的城市需要用对应城市的英文名称代替例如如果需要查询北京市天气 则 loc 参数需要输入 Beijing/shanghai。 :return: OpenWeather API 查询即时天气的结果。具体 URL 请求地址为 https://api.openweathermap.org/data/2.5/weather。 返回结果对象类型为解析之后的 JSON 格式对象并用字符串形式进行表示 其中包含了全部重要的天气信息。 # Step 1. 构建请求 URL url https://api.openweathermap.org/data/2.5/weather # Step 2. 设置查询参数包括城市名、API Key、单位和语言 params { q: loc, #appid: os.getenv(OPENWEATHER_API_KEY), # 从环境变量中读取 API Key appid: fc19f7b552b4c1ae467e36fe69556668, # 从环境变量中读取 API Key units: metric, # 使用摄氏度 lang: zh_cn # 输出语言为简体中文 } # Step 3. 发送 GET 请求获取天气数据 response httpx.get(url, paramsparams,timeout30) # Step 4. 解析响应内容为 JSON 并序列化为字符串返回 data response.json() print(json.dumps(data)) return json.dumps(data) # 初始化模型实例用于处理自然语言任务 llm ChatOpenAI( modeldeepseek-v4-pro, api_keyos.getenv(DEEPSEEK_API_KEY), base_urlhttps://api.deepseek.com ) # 创建聊天提示模板定义agent的对话结构和角色 prompt ChatPromptTemplate.from_messages( [ (system, 你是天气助手请根据用户的问题给出相应的天气信息), (human, {input}), (placeholder, {agent_scratchpad}), ] ) # 定义可用工具列表包含获取天气信息的工具函数 tools [get_weather] # 创建工具调用agent整合语言模型、工具和提示模板。该agent能够根据用户问题调用相应工具获取天气信息 agent create_tool_calling_agent(llm, tools, prompt) # 创建agent执行器负责协调agent和工具的执行流程 # agent参数指定要执行的agent实例 # tools参数提供agent可调用的工具列表 # verbose参数设置为True启用详细输出模式便于调试 agent_executor AgentExecutor(agentagent, toolstools, verboseTrue) # 执行agent处理用户关于北京和上海天气的查询请求 result agent_executor.invoke({input: 请问今天北京和上海的天气怎么样哪个城市更热}) # 输出执行结果 print(result)返回的结果是D:\python310\python.exe D:\PycharmProjects\PythonProject\12_agent\AgentSmartSelectV0.3.py Entering new AgentExecutor chain... Invoking: get_weather with {loc: Beijing} responded: 好的我来同时查询北京和上海的天气马上为您比较。 {coord: {lon: 116.3972, lat: 39.9075}, weather: [{id: 804, main: Clouds, description: \u9634\uff0c\u591a\u4e91, icon: 04d}], base: stations, main: {temp: 28.24, feels_like: 34.14, temp_min: 28.24, temp_max: 28.24, pressure: 1000, humidity: 88, sea_level: 1000, grnd_level: 995}, visibility: 10000, wind: {speed: 2.93, deg: 350, gust: 3.69}, clouds: {all: 96}, dt: 1783757479, sys: {country: CN, sunrise: 1783716899, sunset: 1783770257}, timezone: 28800, id: 1816670, name: Beijing, cod: 200} {coord: {lon: 116.3972, lat: 39.9075}, weather: [{id: 804, main: Clouds, description: \u9634\uff0c\u591a\u4e91, icon: 04d}], base: stations, main: {temp: 28.24, feels_like: 34.14, temp_min: 28.24, temp_max: 28.24, pressure: 1000, humidity: 88, sea_level: 1000, grnd_level: 995}, visibility: 10000, wind: {speed: 2.93, deg: 350, gust: 3.69}, clouds: {all: 96}, dt: 1783757479, sys: {country: CN, sunrise: 1783716899, sunset: 1783770257}, timezone: 28800, id: 1816670, name: Beijing, cod: 200} Invoking: get_weather with {loc: shanghai} responded: 好的我来同时查询北京和上海的天气马上为您比较。 {coord: {lon: 121.4581, lat: 31.2222}, weather: [{id: 804, main: Clouds, description: \u9634\uff0c\u591a\u4e91, icon: 04d}], base: stations, main: {temp: 30.02, feels_like: 35.58, temp_min: 30.02, temp_max: 30.02, pressure: 1000, humidity: 72, sea_level: 1000, grnd_level: 999}, visibility: 10000, wind: {speed: 7.56, deg: 72, gust: 16.19}, clouds: {all: 100}, dt: 1783757402, sys: {country: CN, sunrise: 1783717073, sunset: 1783767654}, timezone: 28800, id: 1796236, name: Shanghai, cod: 200} {coord: {lon: 121.4581, lat: 31.2222}, weather: [{id: 804, main: Clouds, description: \u9634\uff0c\u591a\u4e91, icon: 04d}], base: stations, main: {temp: 30.02, feels_like: 35.58, temp_min: 30.02, temp_max: 30.02, pressure: 1000, humidity: 72, sea_level: 1000, grnd_level: 999}, visibility: 10000, wind: {speed: 7.56, deg: 72, gust: 16.19}, clouds: {all: 100}, dt: 1783757402, sys: {country: CN, sunrise: 1783717073, sunset: 1783767654}, timezone: 28800, id: 1796236, name: Shanghai, cod: 200}以下是今天北京和上海的天气对比 --- ### ️ **北京天气** | 项目 | 详情 | |------|------| | ☁️ 天气 | 阴多云 | | ️ 温度 | **28.24°C** | | 体感温度 | 34.14°C | | 湿度 | **88%** | | ️ 风速 | 2.93 m/s北风 | ### ️ **上海天气** | 项目 | 详情 | |------|------| | ☁️ 天气 | 阴多云 | | ️ 温度 | **30.02°C** | | 体感温度 | 35.58°C | | 湿度 | 72% | | ️ 风速 | 7.56 m/s东北风 | --- ### 对比结论**上海更热** - 上海的实际气温 **30.02°C**比北京高出约 **1.8°C** - 体感温度方面上海35.58°C也比北京34.14°C高出约 **1.4°C** - 不过北京的湿度高达 **88%**比上海更潮湿闷热所以虽然温度略低但闷热感并不逊色。 总体来说今天两个城市都是阴天多云气温都偏高建议出门注意防暑降温哦 Finished chain. {input: 请问今天北京和上海的天气怎么样哪个城市更热, output: 以下是今天北京和上海的天气对比\n\n---\n\n### ️ **北京天气**\n| 项目 | 详情 |\n|------|------|\n| ☁️ 天气 | 阴多云 |\n| ️ 温度 | **28.24°C** |\n| 体感温度 | 34.14°C |\n| 湿度 | **88%** |\n| ️ 风速 | 2.93 m/s北风 |\n\n### ️ **上海天气**\n| 项目 | 详情 |\n|------|------|\n| ☁️ 天气 | 阴多云 |\n| ️ 温度 | **30.02°C** |\n| 体感温度 | 35.58°C |\n| 湿度 | 72% |\n| ️ 风速 | 7.56 m/s东北风 |\n\n---\n\n### 对比结论**上海更热**\n\n- 上海的实际气温 **30.02°C**比北京高出约 **1.8°C**\n- 体感温度方面上海35.58°C也比北京34.14°C高出约 **1.4°C**\n- 不过北京的湿度高达 **88%**比上海更潮湿闷热所以虽然温度略低但闷热感并不逊色。\n\n总体来说今天两个城市都是阴天多云气温都偏高建议出门注意防暑降温哦} Process finished with exit code 0这里的(placeholder, {agent_scratchpad})可以理解为在提示词中预留一个位置用来放 Agent 调用工具的过程记录。1.placeholder是什么placeholder表示“消息占位符”。普通消息是固定角色的一条消息(system, 你是天气助手) (human, {input})而(placeholder, {agent_scratchpad})不是一条固定消息。运行时LangChain 会把agent_scratchpad中的一组消息插入到这里。它大致等价于MessagesPlaceholder(variable_nameagent_scratchpad)2.agent_scratchpad是什么它是 Agent 的“临时工作记录区”主要保存模型决定调用哪个工具调用工具时传入的参数工具返回的结果Agent 根据结果继续进行的下一步操作这里的“scratchpad”可以直译为“草稿纸”。但它不是模型真正的隐藏思维过程而是Agent 执行工具所必需的结构化消息记录。3. 在这段代码中的执行过程用户输入请问今天北京和上海的天气怎么样哪个城市更热第一次发送给模型的内容大致是System: 你是天气助手请根据用户的问题给出相应的天气信息 Human: 请问今天北京和上海的天气怎么样哪个城市更热此时agent_scratchpad []因为还没有调用工具所以占位符中暂时没有内容。模型判断需要查询两个城市生成工具调用例如调用 get_weather(locBeijing) 调用 get_weather(locShanghai)AgentExecutor执行工具后会得到天气查询结果。接着这些工具调用和工具返回值会被放进agent_scratchpadAssistant: 调用 get_weather(locBeijing) Tool: 北京天气查询结果 Assistant: 调用 get_weather(locShanghai) Tool: 上海天气查询结果然后再次把完整提示发送给模型System: 你是天气助手…… Human: 请问今天北京和上海的天气怎么样哪个城市更热 Assistant: 调用 get_weather(locBeijing) Tool: 北京天气查询结果 Assistant: 调用 get_weather(locShanghai) Tool: 上海天气查询结果模型看到查询结果后才能生成最终回答北京今天 30℃上海今天 34℃因此上海更热。整体循环可以概括为用户问题 ↓ LLM 判断是否需要工具 ↓ 调用 get_weather ↓ 工具结果写入 agent_scratchpad ↓ 重新调用 LLM ↓ 生成最终答案4. 为什么不能删除create_tool_calling_agent()要求提示模板中包含agent_scratchpad如果删除通常会报类似错误Prompt missing required variables: {agent_scratchpad}即便某些实现没有立即报错模型也看不到之前的工具调用结果无法根据天气 API 的返回值完成最终回答。一句话总结placeholder决定“在提示词的什么位置插入消息”agent_scratchpad保存“Agent 调用了什么工具以及工具返回了什么”。
延伸阅读

更多相关文章

2026/9/12 13:15:03

3分钟快速获取A股数据:Python通达信接口终极指南

3分钟快速获取A股数据:Python通达信接口终极指南 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 在金融数据分析和量化交易领域,获取稳定可靠的A股行情数据一直是开发者面临…

2026/9/10 16:22:44

Anthropic移除编排代理层:直连架构如何重构AI服务性能与可靠性

1. 项目概述:这不是一次普通更新,而是一次架构级“静默坍缩” “Anthropic Just Shipped the Layer That’s Already Going to Zero”——这个标题乍看像科技媒体的夸张头条,但作为连续三年深度跟踪Claude系列模型演进、亲手部署过从Claude …

2026/9/12 22:26:09

Pygame 2048完整工程:含BDF字体、虚拟环境脚本与状态机实现

简介:本资源是一套基于Python与Pygame实现的2048小游戏完整可运行项目,面向Python初学者及游戏开发入门者,旨在通过经典数字拼图游戏实践掌握图形界面编程、事件驱动逻辑与二维数组算法设计。压缩包共865个文件,含466个核心.py源码…

2026/9/12 22:26:09

YOLOv9 PCB缺陷检测实战:1297张图数据集训练与优化全解析

简介:该数据集面向PCB电路板质检与计算机视觉缺陷检测场景,采用YOLOv9格式标注,包含1297张真实PCB板图片,整体识别准确率可达99.8%。压缩包内共2000个文件,其中702张JPG原图、1297个TXT标注文件以及1个YAML配置文件&am…

2026/9/12 22:26:09

2722张图像训练YOLO杂草检测模型全流程

简介:这份杂草与作物目标检测数据集专门面向yolo系列算法开发者与农业智能化研究人员,包含2722张已标注图像,覆盖杂草和作物两类目标,可直接用于模型训练、验证与测试。数据集已预先划分好训练集、验证集,并附带data.y…

2026/9/12 22:26:09

YOLO训练从数据开始:杂草与作物数据集的全流程实操

简介:面向yolo系列算法目标检测任务的杂草与作物数据集,涵盖杂草和作物两大类目标,适用于农业场景下的模型训练、算法验证与精准作业,可配合yolov5、yolov7、yolov8、yolov9、yolov10、yolo11等主流框架使用,为精确除草…

2026/9/12 22:26:09

Python实战:从零搭建人脸识别门禁系统

简介:以人脸识别为核心的门禁管理系统,整合了宿舍管理、水电费充值、报修、系统日志等模块,面向高校宿舍场景,适合毕业设计或学习Django与Dlib人脸识别的开发者。压缩包共2001个文件,以1668个Python源码文件为主&#…

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/12 3:55:12

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/12 10:09:03

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/12 14:32:17

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/12 6:37:43

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码