多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Agent 开发入门:Function Call 实战

Agent 开发入门:Function Call 实战 接上篇《RAG 优化实战》。RAG 让模型有资料可答Function Call 让模型能动手干活——这是 Agent 的地基。今天讲透两种实现原生 API 手动 Prompt。目录一、Function Call 是什么二、两种实现方式方式A原生API自动调用框架帮你编排方式B手动Prompt拼JSON理解原理三、完整可运行代码四、工具设计原则五、过关清单六、常见坑七、下一步从Function Call到Agent一、Function Call 是什么模型不会真的去查天气它只会说我想调天气工具参数是北京。真正执行的是你的代码执行完把结果塞回对话模型再总结成自然语言。用户提问 → 模型选工具填参数 → 你的代码执行 → 结果塞回对话 → 模型总结回答后端类比模型会自己选路由的Controller执行权在你手里你是Service层二、两种实现方式方式A原生API自动调用框架帮你编排工具描述成JSON Schema随消息发给模型模型选工具你执行。类比Spring Autowired方式B手动Prompt拼JSON理解原理提示词里写可输出{action:..,params:{..}}自己json.loadsswitch分发。价值手动写一遍才真懂底层原理面试讲原理不心虚还能跑在不支持function call的模型上三、完整可运行代码def native_fc(question: str) - str: 方式 A原生 Function Call框架帮你编排。 msgs [{role: user, content: question}] resp client.chat.completions.create( modelFC_MODEL, messagesmsgs, toolsTOOL_SCHEMAS ) msg resp.choices[0].message if msg.tool_calls: # 把模型的我想调工具这条消息原样塞回去 msgs.append(msg.model_dump()) for call in msg.tool_calls: name call.function.name args json.loads(call.function.arguments) result TOOLS_IMPL[name](**args) # 执行权在你你跑模型不跑 msgs.append({ role: tool, tool_call_id: call.id, name: name, content: str(result) # 强制转字符串防止JSON类型错误 }) # 结果塞回对话后再让模型总结成自然语言 final client.chat.completions.create(modelFC_MODEL, messagesmsgs) return final.choices[0].message.content return msg.contentdef manual_fc(question: str) - str: 方式 B手动 Prompt自己拼 JSON 分发执行。 msgs [ {role: system, content: MANUAL_SYS}, {role: user, content: question}, ] resp client.chat.completions.create( modelFC_MODEL, messagesmsgs, response_format{type: json_object} ) out resp.choices[0].message.content try: decision json.loads(out) # 自己解析模型吐出的 JSON name decision.get(action) if name in TOOLS_IMPL: # switch 分发按 action 找到对应函数执行 result TOOLS_IMPL[name](**decision.get(params, {})) msgs [ {role: assistant, content: out}, {role: user, content: f工具返回{result}请据此回答。}, ] final client.chat.completions.create(modelFC_MODEL, messagesmsgs) return final.choices[0].message.content except Exception as e: return f解析失败{e} return out效果问北京今天多少度加3等于几→模型自动调天气(25度)计算(25328)→输出北京25度加3等于28四、工具设计原则单一职责一工具一事参数清晰类型/说明/范围结构化返回执行权在你五、过关清单☐ 系统提示词让模型稳定按指定格式回答☐ 原生FC复合问题选≥2工具并按序调用☐ 手动版能解析JSON并正确执行工具☐ 能讲清原生vs手动区别和适用场景☐ 工具出错时模型能换工具或告知用户六、常见坑1. description写含糊→选错工具写清含义/举例2. 工具返回一坨原始数据→裁剪成精简摘要3. 模型输出不合法JSON→正则抽取或response_format强约束4. 执行结果直接当答案→让模型再总结一轮5. 写操作没确认→危险操作加白名单/人工确认七、下一步从Function Call到AgentFunction Call是单次调用工具。升级成循环思考→行动→观察→再思考就是AgentReAct循环。下一篇预告《Agent开发ReAct循环与工具调用实战——从单次调用到自主Agent》。欢迎关注专栏持续更新。 关注公众号「程序员AI工坊」回复「避坑」免费领《后端转AI落地避坑清单》8 个核心坑全文。 配套代码Star支持https://github.com/cxy-ai-gongfang/backend-to-ai-guide/blob/main/function-call-demo/README.md
返回列表