Function Calling与Agent:让LLM连接真实世界
大语言模型本身只能生成文本,但通过工具使用(Function Calling)技术, 我们可以让模型调用外部API、查询数据库、执行计算等,大大扩展其能力边界。 而智能体(Agent)则是在此基础上,赋予模型自主规划、决策和执行复杂任务的能力。 本讲将介绍Function Calling的原理和实现,探讨Agent的架构设计和经典框架(如ReAct), 帮助你构建能够自主解决问题的智能系统。
Function Calling(函数调用)是指大语言模型能够识别用户意图, 并生成结构化的函数调用请求,由外部系统执行具体操作。 这让模型可以查询数据库、调用API、执行计算等,突破纯文本生成的限制。
工作流程
定义函数
向模型提供可用函数的描述(名称、参数、功能说明)
模型判断
模型根据用户输入判断是否需要调用函数
生成调用
模型生成函数名和参数(JSON格式)
执行函数
外部系统执行函数,返回结果
生成回复
模型基于函数结果生成自然语言回复
示例:天气查询
用户输入:
"北京明天天气怎么样?"
函数定义:
{
"name": "get_weather",
"description": "获取指定城市的天气信息",
"parameters": {
"city": "城市名称",
"date": "日期(今天/明天/后天)"
}
}模型生成的函数调用:
{
"function": "get_weather",
"arguments": {
"city": "北京",
"date": "明天"
}
}函数执行结果:
{
"city": "北京",
"date": "2024-03-16",
"weather": "晴转多云",
"temperature": "15-25°C",
"wind": "北风3级"
}模型最终回复:
"根据天气预报,北京明天(3月16日)是晴转多云的天气,气温15-25°C,北风3级。 建议您穿着舒适的春季服装,可以准备一件薄外套。"
✅优势
⚠️挑战
Agent(智能体)是一个能够感知环境、自主决策并采取行动以实现目标的系统。 在大语言模型的背景下,Agent是指能够使用工具、规划步骤、迭代执行任务的自主智能系统。 与简单的问答不同,Agent可以分解复杂任务、制定计划、调用多个工具,直到完成目标。
Agent的核心组件
将复杂任务分解为子任务,制定执行计划
存储和检索历史信息,保持上下文连贯性
调用外部工具和API完成具体操作
评估执行结果,调整后续策略
ReAct(Reasoning and Acting)是一个经典的Agent框架, 将推理(Reasoning)和行动(Acting)交替进行。 Agent先思考(Thought),再行动(Action),然后观察结果(Observation), 循环往复直到完成任务。这种交替模式让Agent能够动态调整策略。
ReAct循环
Thought:分析当前情况,决定下一步做什么
Action:调用工具或执行操作
Observation:获取行动结果,作为下一轮输入
示例:预订餐厅
用户请求:
"帮我预订明天晚上7点的川菜餐厅,4个人"
循环1
Thought:需要先搜索符合条件的川菜餐厅
Action:search_restaurants(cuisine="川菜", capacity=4)
Observation:找到3家餐厅:蜀香园、辣妹子、川味源
循环2
Thought:需要检查明天晚上7点的可用性
Action:check_availability(restaurant="蜀香园", date="明天", time="19:00", people=4)
Observation:蜀香园有空位
循环3
Thought:可以预订了
Action:make_reservation(restaurant="蜀香园", date="明天", time="19:00", people=4)
Observation:预订成功,确认号:R20240316001
最终回复:
"已成功为您预订蜀香园餐厅,明天(3月16日)晚上7点,4位。预订确认号是R20240316001。 请准时到达,如需取消请提前2小时联系餐厅。"
💡ReAct的优势
工具定义的质量直接影响模型能否正确调用函数。 一个好的工具定义应该清晰、完整、准确。
使用动词+名词的命名方式,功能一目了然。
get_weather, send_email, calculate_price
func1, do_something, handler
明确说明函数的功能、适用场景和注意事项。
示例:"获取指定城市的实时天气信息,包括温度、天气状况、风力等。 支持的城市包括全国主要城市。返回未来24小时的天气预报。"
每个参数都要说明类型、是否必需、取值范围。
"parameters": {
"city": {
"type": "string",
"required": true,
"description": "城市名称(如北京、上海)"
},
"days": {
"type": "integer",
"required": false,
"default": 1,
"description": "预报天数,1-7之间"
}
}在描述中提供调用示例,帮助模型理解用法。
"示例调用:get_weather(city='北京', days=3)
示例返回:{"temp": 25, "condition": "晴"}"
管理日程、发送邮件、预订服务等日常任务
工具:日历API、邮件API、预订平台API
查询数据库、生成报表、可视化分析
工具:SQL查询、Python执行、图表生成
查询订单、处理退换货、解答问题
工具:订单系统、库存查询、物流追踪
文献检索、数据收集、实验分析
工具:论文数据库、Web搜索、数据处理
监控系统、部署应用、故障排查
工具:监控API、部署脚本、日志查询
智能对话、任务引导、动态剧情
工具:游戏状态查询、物品系统、任务系统
挑战1:工具选择错误
模型选择了不恰当的工具,或参数提取不准确。
解决方案:
挑战2:循环停不下来
Agent陷入无限循环,重复调用相同的工具。
解决方案:
挑战3:工具调用失败
API超时、参数错误、权限不足等导致工具执行失败。
解决方案:
挑战4:成本过高
Agent多次调用模型,token消耗巨大。
解决方案:
挑战5:安全性风险
Agent可能被诱导执行危险操作或泄露敏感信息。
解决方案:
对于复杂任务,可以使用多个专门化的Agent协同工作, 每个Agent负责特定的子任务,通过协作完成整体目标。
协作模式
Agent按固定顺序依次处理任务,如:研究员Agent → 作家Agent → 编辑Agent
适用于:报告生成、内容创作等有明确流程的任务
多个Agent同时处理不同方面,最后汇总结果
适用于:多维度分析、并行数据收集
管理Agent分配任务给执行Agent,监控进度
适用于:复杂项目管理、多步骤工作流
多个Agent从不同角度分析问题,通过辩论达成共识
适用于:决策支持、方案评估
📋多Agent系统设计要点
让LLM能够调用外部工具,从纯文本生成扩展到实际操作
具备规划、记忆、工具使用、反思能力的自主智能系统
从简单场景开始,逐步增加复杂度,注重安全和成本控制
完整的讲义PDF,包含所有图表和详细内容