langchain的工具调用

Tools 就是给大模型安装的"手和脚",让大模型能够调用外部函数/API来获取实时信息或执行具体操作。

Tools 的工作流程

完整流程

用户问题 → 大模型思考 → 调用Tool → 执行Tool → 结果返回 → 大模型重新组织 → 最终回答

# 1. 用户提问user_question="北京今天多少度?顺便计算一下(25+18)/2等于多少?"# 2. 第一次思考:大模型分析需要调用什么工具""" 大模型思考: - 需要天气信息 → 调用 weather_tool - 需要数学计算 → 调用 calculator_tool"""# 3. 大模型返回调用指令(不是最终回答!)model_response_1={"actions":[{"tool":"weather_tool","input":{"city":"北京"}},{"tool":"calculator_tool","input":{"expression":"(25+18)/2"}}]}# 4. 你的代码执行这些Toolsweather_result="北京今天晴,气温25°C"# 真实API调用结果calc_result="21.5"# 真实计算结果# 5. 关键步骤:把结果喂回给大模型,让它重新组织final_prompt=f""" 用户问题:{user_question}你已经获取了以下信息:1. 天气查询结果:{weather_result}2. 计算结果:{calc_result}请根据以上信息,组织一个完整的回答给用户。"""# 6. 大模型生成最终回答final_answer="根据查询,北京今天天气晴朗,温度25°C。另外,(25+18)/2的计算结果是21.5。"

使用 langchain 的 agent 可以自动实现第五步

初期不使用 agent 直接使用大模型调用,只会在响应中返回要调用的大模型

如果使用 agent 则会直接返回调用结果给 agent,让 agent 重新组织回答

用户:"北京天气?计算(25+18)/2"↓ Agent思考:"需要weather_tool和calculator_tool"↓ 执行: weather_tool("北京")"25°C"执行: calculator_tool("(25+18)/2")"21.5"↓ Agent自动重新思考:"我有结果了,组织回答"↓ 最终回答:"北京25°C,(25+18)/2=21.5"

创建 tools 的三种方式

方式 1: 不使用注解,纯手动创建

# 第一种类型:手动定义tools# 定义工具函数defcalculate_expression(expression:str)->str:"""计算数学表达式"""try:result=eval(expression)# 注意:实际生产环境要用更安全的方法returnf"结果:{result}"exceptExceptionase:returnf"计算错误:{e}"# 包装成Toolcalculator_tool=Tool(name="calculator",# 工具名称func=calculate_expression,# 工具函数description="用于计算数学表达式,例如: '2+3*4' 或 '(5+3)/2'"# 工具描述)

方式 2:使用装饰器的注解@tools方式

# 第二种类型:使用装饰器注解(方法的注释就是工具描述)@tooldefweather_check(city:str)->str:"""查询城市天气"""weather_data={"北京":"晴,18°C","上海":"多云,22°C","广州":"小雨,25°C","深圳":"阴,26°C"}ifcityinweather_data:returnf"{city}天气:{weather_data[city]}"else:returnf"未找到{city}的天气信息"

方式 3:使用StructuredTool

classTranslationInput(BaseModel):text:str=Field(description="要翻译的文本")target_language:str=Field(description="目标语言")deftranslate_text(text:str,target_language:str)->str:"""翻译文本到目标语言"""translations={"英语":{"你好":"Hello","谢谢":"Thank you"},"日语":{"你好":"こんにちは","谢谢":"ありがとう"}}iftarget_languageintranslations:iftextintranslations[target_language]:returnf"翻译结果:{translations[target_language][text]}"else:returnf"未找到'{text}'的翻译"returnf"不支持{target_language}翻译"translate_tool=StructuredTool.from_function(func=translate_text,name="translate_text",description="翻译文本到目标语言",args_schema=TranslationInput,)

示例代码

注意,直接使用大模型不使用 agent 调用,大模型只返回要调用的方法,不会获取结果后重新返回

defdemo_agent_usage():"""演示如何将工具集成到Agent中"""print("="*60)print("工具调用演示")print("="*60)# 创建工具列表tools=[calculator_tool,weather_check,translate_tool]# 绑定工具列表llm_with_tools=llm.bind_tools(tools)# 测试问题(可以修改这里测试不同场景)test_questions=["这个表达式的结果是多少? 2+3*4=","北京天气怎么样?","把'你好'翻译成日语","先计算(10+5)/3,然后告诉我上海天气"]forquestionintest_questions:print(f"\n📝 用户问题:{question}")print("-"*40)# 调用大模型response=llm_with_tools.invoke([HumanMessage(content=question)])# 1. 先打印模型返回的原始消息print(f"💬 模型回答:{response.content}")# 2. 检查是否有工具调用ifhasattr(response,'tool_calls')andresponse.tool_calls:print(f"\n🔧 检测到工具调用 ({len(response.tool_calls)}个):")fori,tool_callinenumerate(response.tool_calls,1):# 打印工具调用信息print(f"\n [{i}] 工具调用详情:")print(f" 工具名称:{tool_call['name']}")print(f" 工具参数:{json.dumps(tool_call['args'],ensure_ascii=False,indent=8)}")# 找到对应的工具对象tool_obj=Nonefortoolintools:iftool.name==tool_call['name']:tool_obj=toolbreakiftool_obj:try:# 执行工具print(f" 🚀 执行工具 '{tool_call['name']}'...")tool_response=tool_obj.invoke(tool_call['args'])print(f" ✅ 执行结果:{tool_response}")exceptExceptionase:print(f" ❌ 执行失败:{e}")else:print(f" ⚠️ 未找到工具:{tool_call['name']}")else:print("\n📭 没有工具调用")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1159398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

告别熬夜做 PPT!虎贲等考 AI PPT:学术汇报的 “一键焕新” 神器

学术汇报的终极痛点是什么?不是论文写得不够好,而是熬了三个通宵做的 PPT,被导师批 “逻辑混乱、排版杂乱、重点不明”。从开题汇报、中期答辩到最终答辩,每一次 PPT 制作都像一场耗时耗力的 “硬仗”—— 既要提炼论文核心观点&a…

销售要少夸赞自己实力强,多问问客户害怕什么

制造业的销售常常会犯一个致命的错误:一和客户见面就急着向对方证明“我们技术领先同行”“设备精度非常高”“服务响应速度快”……但客户内心里想的却是:“你说得再好,万一出现问题,这个责任还是得我来承担,”在责任…

GetX 从 0 开始:理解 Flutter 的“对象级响应式系统”

很多人听说 GetX,是因为它“什么都能干”:状态管理、路由、依赖注入。 但如果一上来就学 API,很容易学成“工具集合”。 这篇文章只做一件事: 👉 从 0 建立对 GetX 的正确认知:它到底解决什么问题&#xff…

极致感知与定位:基于电鱼智能 RK3588 的 AMR 机器人高精度 vSLAM 导航方案

为什么 AMR 机器人首选 RK3588 进行 vSLAM?1. 多核异构算力匹配 vSLAM 任务链vSLAM 算法包含高度复杂的流水线,RK3588 的异构架构可以实现完美的分工:Cortex-A76 高大核:负责前端视觉里程计(VO)的特征点提取…

Java酒店管理系统(简易版)_java简易酒店管理系统

1.需求: 实现一个简单的酒店客房管理系统,它具备5个功能,分别为【1:查看所有房间功能;2:订房功能;3:退房功能;4:修改价格功能;5:退出本系统功能】…

电鱼智能 RK3576 实现商用清洁机器人的视觉避障与路径规划

什么是 电鱼智能 RK3576?电鱼智能 RK3576 是一款专为 AIoT 场景设计的中高端 SoC。它搭载 4 核 Cortex-A72 4 核 Cortex-A53 处理器,最大的亮点在于集成了 6TOPS 的独立 NPU(算力甚至接近旗舰级 RK3588 的单核 NPU 性能)。配合支…

揭秘!这位吴忠羽球教练凭什么带出锦标赛亚军?答案藏在3大教学绝招里

吴忠羽球教练韩宁波能带出锦标赛亚军,主要得益于以下三大教学绝招:科技赋能,精准训练肌电传感器揭秘力量传导链:韩宁波引入医疗级肌电传感器,开发出“肌肉激活顺序训练法”。学员佩戴8通道传感器进行专项训练&#xff…

基于DCT变换图像去噪算法的终极优化(1920*1080灰度图单核约22ms)

相关文章: 优化IPOL网站中基于DCT(离散余弦变换)的图像去噪算法(附源代码)。 SSE图像算法优化系列二十一:基于DCT变换图像去噪算法的进一步优化(100W像素30ms)。 这个算法2015年优化过一版,2018年又优化过一版,2016年初又来回访一…

韩宁波的羽球哲学:用竞技场的热血浇灌,让每个学员都成为自己的冠军

韩宁波的羽球哲学以“突破极限、科技赋能、跨界融合”为核心,通过竞技场的热血实践,让每个学员在技术、体能与心理层面实现自我超越,成为自己人生的冠军。以下从三大维度解析其哲学内涵与实践路径:一、突破极限:从“经…

python基于vue的流浪动物救助志愿者管理系统django flask pycharm

目录基于Python与Vue的流浪动物救助志愿者管理系统开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!基于Python与Vue的流浪动物救助志愿者管理系统 该系统采用前后端分离架构,后端…

2026 毕业季硬核攻略:8 款 AI 毕业论文工具实测,paperzz 领衔解锁学术创作新姿势

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿 paperzz - 毕业论文-AIGC论文检测-AI智能降重-ai智能写作https://www.paperzz.cc/dissertation 毕业季的论文攻坚战,早已不是单打独斗的苦役。当 AI 技术深度融入学术场景,一批高效…

基于 电鱼智能 RK3568 打造工业协作机械臂的一体化关节控制器

什么是 电鱼智能 RK3568?电鱼智能 RK3568 是一款高性能、低功耗的国产化工业核心平台。它搭载四核 64 位 Cortex-A55 处理器,主频 2.0GHz,内置 1TOPS NPU。对于机器人应用,其杀手锏在于支持 ECC 内存(数据安全&#xf…

python基于vue的咖啡点单程序设计django flask pycharm

目录基于Vue与Python的咖啡点单系统设计开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!基于Vue与Python的咖啡点单系统设计 技术栈选择 采用Vue.js作为前端框架,搭配Django或Fl…

吴忠羽球新势力!国家二级运动员韩宁波:用竞技基因解码进阶训练密码

吴忠羽球新势力!国家二级运动员韩宁波:用竞技基因解码进阶训练密码在宁夏吴忠的羽毛球版图上,国家二级运动员韩宁波正以"竞技基因科技赋能"的双核模式,重塑青少年羽毛球训练体系。从肌肉激活的毫米级调整到沙漠抗干扰训…

全网最全9个AI论文软件,专科生搞定毕业论文必备!

全网最全9个AI论文软件,专科生搞定毕业论文必备! AI 工具让论文写作不再难 对于专科生来说,毕业论文是大学生活中一个令人头疼的挑战。面对繁重的写作任务、严格的格式要求以及不断攀升的查重率,很多同学感到无从下手。而如今&…

电鱼智能 RK3399 赋能配送机器人的多屏交互与人脸识别支付

什么是 电鱼智能 RK3399?电鱼智能 RK3399 是一款高性能、高扩展性的六核(2A72 4A53)嵌入式核心板。虽然发布已有几年,但它在多媒体处理方面依然表现强劲。它支持 双路 MIPI/LVDS/HDMI/eDP 显示接口,且内置了双路 ISP&…

冠军教练的「双面人生」:韩宁波以赛场荣誉为基石,筑就吴忠羽毛球学习新范式

冠军教练的「双面人生」:韩宁波以赛场荣誉为基石,筑就吴忠羽毛球学习新范式在吴忠羽毛球运动的版图上,韩宁波的名字始终与突破、创新和普惠紧密相连。从国家二级运动员到冠军教练,从竞技赛场的技术革新到全民健身的生态构建&#…

[特殊字符]收藏!留学生大模型薪资曝光:55k起、140w总包,2026归国潮AI岗位全攻略

文章讲述了留学生回国就业热潮,特别是AI、大模型领域的高薪现象。字节跳动、美团、腾讯等大厂推出专项招聘计划,薪资远超往年,博士总包可达140w。同时分析了留学生回国求职面临的挑战,如信息不对称、竞争激烈等,并介绍…

宁夏羽球教育新标杆:韩宁波的「三维教学法」如何让学员技术体能双飞跃

韩宁波的「三维教学法」通过技术解构、体能强化、实战应用三个维度的有机联动,结合数字化工具与个性化训练方案,实现了学员技术与体能的双重突破,成为宁夏羽毛球教育的新标杆。以下从三个维度解析其创新路径与成效:一、技术解构&a…

从青训到成人班:韩宁波的12年羽球人生,如何让吴忠爱上「空中芭蕾」

韩宁波通过科技赋能训练体系、跨界融合教学创新、构建全民赛事生态三大核心策略,让吴忠市从羽毛球荒漠蜕变为“空中芭蕾”之城,其12年实践实现了竞技突破与城市文化塑造的双重价值。以下为具体分析:一、科技赋能:从经验主义到数据…