07_day2-实验-agent分析选择工具-程序阐述
程序解析
day2_qwen_tool_calling.py流程图
🎯 1. 「问题」——为什么需要工具?
❓ “AI 能回答‘现在几点?’吗?”
- 演示:直接问普通 AI → 它会说“我无法获取实时时间”或胡编。
- 💡 核心痛点:大模型是“静态知识库”,不知道此刻的真实世界状态(时间、天气、股价、文件内容等)。
✅ 解决方案:给 AI 配“工具”(就像给人配手机查天气)!
👉 类比:
- AI = 聪明但闭眼的人
- 工具 = 它的眼睛和手
- 我们教它:“当你需要看时间,就调用
get_current_time()”
🔧 2. 「整体流程」——两步策略
AI 工具调用 = 两轮对话
第一轮:用户提问 → AI 思考 → 决定是否调工具 + 传什么参数
第二轮:把工具返回的真实数据喂给 AI → AI组织语句 → 生成最终自然语言回答
用户: "现在几点?成都天气?"
↓
AI: (思考) → 需要调两个工具!
↓
调用 get_current_time() → 返回 "2026-01-24 12:00:00"
调用 get_weather("成都") → 返回 "小雨,18°C"
↓
AI: (结合真实数据) → "当前时间是...,成都今天小雨..."
✅ 强调:这不是“AI 直接执行代码”,而是调用函数,调用安全的、受控的函数。
🧩 3. 代码三要素(核心)
整个程序只需关注 3 个部分:
✅ (1) 工具函数(Tools) —— 你写的“能力”
def get_current_time(): ...
def get_weather(city): ...
👉 这是你赋予 AI 的“超能力”,可以任意扩展(查汇率、读文件等)
✅ (2) 工具描述(Tool Schema) —— 告诉 AI “怎么用”
{
"name": "get_weather",
"description": "查询天气",
"parameters": { "city": {"type": "string"} }
}
👉 这是给 AI 看的说明书,必须结构化(JSON Schema),AI 才知道要传什么参数
✅ (3) 两轮调用逻辑 —— 协调者
- 第一次:
Generation.call(..., tools=tools)→ 获取tool_calls - 执行本地函数 → 收集结果
- 第二次:把结果作为
role="tool"消息传回 → 得到最终回答
💡 关键点:AI 不直接运行你的函数!它只返回“我想调 get_weather,参数是成都”,由你的程序决定是否真的调用(安全可控!)
⚠️ 4. 强调一个易错点(防坑指南)
❗
arguments是字符串,不是字典!# 错误 ❌ args = tool_call["function"]["arguments"] # 这是 '{"city": "成都"}' 字符串! city = args.get("city") # 报错!str 没有 .get() # 正确 ✅ args = json.loads(tool_call["function"]["arguments"]) # 先转成 dict👉 原因:API 传输的是 JSON 文本,必须解析!
🌟 5. 升华:这是 Agent 的基石(展望未来)
- 你现在实现的,就是 AI Agent(智能体)的核心机制!
- 真实应用中:
- 工具可以是:数据库查询、API 调用、代码解释器、文件系统...
- 多个工具可组合(先查天气,再推荐穿衣)
- LangChain / LlamaIndex 等框架,底层也是这个原理!
💬 金句总结:
“大模型 + 工具 = 从‘知道’到‘做到’”
📚 教学建议
| 学生水平 | 讲解重点 |
|---|---|
| 初学者 | 聚焦第 1、2、5 点,用类比理解“为什么需要工具” |
| 有 Python 基础 | 加入第 3 点,让学生自己添加一个新工具(如 get_date()) |
| 进阶学习者 | 对比 LangChain Agent vs 原生 DashScope,讨论封装与灵活性 |
这样讲解,学生不仅能跑通代码,更能理解背后的设计思想,为后续学习 Agent 开发打下坚实基础!🎉
浙公网安备 33010602011771号