12

工具使用与智能体

Function Calling与Agent:让LLM连接真实世界

⏱️ 120分钟📊 难度:进阶🎯 模块:工程实践

📖课程概述

大语言模型本身只能生成文本,但通过工具使用(Function Calling)技术, 我们可以让模型调用外部API、查询数据库、执行计算等,大大扩展其能力边界。 而智能体(Agent)则是在此基础上,赋予模型自主规划、决策和执行复杂任务的能力。 本讲将介绍Function Calling的原理和实现,探讨Agent的架构设计和经典框架(如ReAct), 帮助你构建能够自主解决问题的智能系统。

🎯学习目标

1.理解Function Calling的工作原理和实现方法
2.掌握Agent的核心架构和ReAct框架
3.了解工具定义、选择和错误处理的最佳实践
4.能够设计和实现基础的Agent应用

🔑核心知识点

Function CallingReAct框架Agent架构工具集成

🔧核心技术一:Function Calling

📞

什么是Function Calling

Function Calling(函数调用)是指大语言模型能够识别用户意图, 并生成结构化的函数调用请求,由外部系统执行具体操作。 这让模型可以查询数据库、调用API、执行计算等,突破纯文本生成的限制。

工作流程

1

定义函数

向模型提供可用函数的描述(名称、参数、功能说明)

2

模型判断

模型根据用户输入判断是否需要调用函数

3

生成调用

模型生成函数名和参数(JSON格式)

4

执行函数

外部系统执行函数,返回结果

5

生成回复

模型基于函数结果生成自然语言回复

示例:天气查询

用户输入:

"北京明天天气怎么样?"

函数定义:

{
  "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是指能够使用工具、规划步骤、迭代执行任务的自主智能系统。 与简单的问答不同,Agent可以分解复杂任务、制定计划、调用多个工具,直到完成目标。

Agent的核心组件

1. 规划(Planning)

将复杂任务分解为子任务,制定执行计划

2. 记忆(Memory)

存储和检索历史信息,保持上下文连贯性

3. 工具使用(Tool Use)

调用外部工具和API完成具体操作

4. 反思(Reflection)

评估执行结果,调整后续策略

🔄经典框架:ReAct

♻️

ReAct = Reasoning + Acting

ReAct(Reasoning and Acting)是一个经典的Agent框架, 将推理(Reasoning)和行动(Acting)交替进行。 Agent先思考(Thought),再行动(Action),然后观察结果(Observation), 循环往复直到完成任务。这种交替模式让Agent能够动态调整策略。

ReAct循环

Thought
Action
Observation
→ ↺

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的优势

  • 可解释性强:每步思考都是透明的,便于调试和理解
  • 动态适应:根据观察结果调整策略,不是死板执行计划
  • 错误恢复:发现问题后可以重新思考和尝试
  • 实现简单:框架清晰,易于实现和扩展

📝工具定义最佳实践

工具定义的质量直接影响模型能否正确调用函数。 一个好的工具定义应该清晰、完整、准确。

📋

1. 清晰的函数名

使用动词+名词的命名方式,功能一目了然。

get_weather, send_email, calculate_price

func1, do_something, handler

💬

2. 详细的描述

明确说明函数的功能、适用场景和注意事项。

示例:"获取指定城市的实时天气信息,包括温度、天气状况、风力等。 支持的城市包括全国主要城市。返回未来24小时的天气预报。"

🔢

3. 明确的参数

每个参数都要说明类型、是否必需、取值范围。

"parameters": {
  "city": {
    "type": "string",
    "required": true,
    "description": "城市名称(如北京、上海)"
  },
  "days": {
    "type": "integer",
    "required": false,
    "default": 1,
    "description": "预报天数,1-7之间"
  }
}
✏️

4. 示例展示

在描述中提供调用示例,帮助模型理解用法。

"示例调用:get_weather(city='北京', days=3)
示例返回:{"temp": 25, "condition": "晴"}"

🎯Agent的应用场景

💼

个人助理

管理日程、发送邮件、预订服务等日常任务

工具:日历API、邮件API、预订平台API

📊

数据分析助手

查询数据库、生成报表、可视化分析

工具:SQL查询、Python执行、图表生成

🛒

智能客服

查询订单、处理退换货、解答问题

工具:订单系统、库存查询、物流追踪

🔬

研究助手

文献检索、数据收集、实验分析

工具:论文数据库、Web搜索、数据处理

🏗️

DevOps助手

监控系统、部署应用、故障排查

工具:监控API、部署脚本、日志查询

🎮

游戏NPC

智能对话、任务引导、动态剧情

工具:游戏状态查询、物品系统、任务系统

⚠️常见挑战与解决方案

挑战1:工具选择错误

模型选择了不恰当的工具,或参数提取不准确。

解决方案:

  • • 提供清晰、详细的工具描述
  • • 使用Few-shot示例展示正确用法
  • • 限制同时提供的工具数量(<10个)
  • • 添加工具选择的约束条件

挑战2:循环停不下来

Agent陷入无限循环,重复调用相同的工具。

解决方案:

  • • 设置最大循环次数限制(如10次)
  • • 检测重复的思考和行动模式
  • • 在提示词中强调"完成任务后要停止"
  • • 提供明确的任务完成标准

挑战3:工具调用失败

API超时、参数错误、权限不足等导致工具执行失败。

解决方案:

  • • 实现完善的错误处理和重试机制
  • • 将错误信息反馈给Agent,让其调整策略
  • • 提供降级方案(如备用工具)
  • • 设置合理的超时时间

挑战4:成本过高

Agent多次调用模型,token消耗巨大。

解决方案:

  • • 限制最大迭代次数
  • • 缓存常见问题的执行路径
  • • 使用更小、更便宜的模型
  • • 优化提示词减少token使用
  • • 考虑流式输出减少重复生成

挑战5:安全性风险

Agent可能被诱导执行危险操作或泄露敏感信息。

解决方案:

  • • 实施严格的权限控制和审批流程
  • • 高风险操作需要人工确认
  • • 输入验证和输出过滤
  • • 记录所有操作日志便于审计
  • • 设置操作白名单和黑名单

🤝高级主题:多Agent协作

对于复杂任务,可以使用多个专门化的Agent协同工作, 每个Agent负责特定的子任务,通过协作完成整体目标。

协作模式

1. 顺序协作

Agent按固定顺序依次处理任务,如:研究员Agent → 作家Agent → 编辑Agent

适用于:报告生成、内容创作等有明确流程的任务

2. 并行协作

多个Agent同时处理不同方面,最后汇总结果

适用于:多维度分析、并行数据收集

3. 层次协作

管理Agent分配任务给执行Agent,监控进度

适用于:复杂项目管理、多步骤工作流

4. 辩论协作

多个Agent从不同角度分析问题,通过辩论达成共识

适用于:决策支持、方案评估

📋多Agent系统设计要点

  • 明确分工:每个Agent有清晰的职责和专长
  • 通信协议:定义Agent之间的消息传递格式
  • 状态管理:维护共享状态和各Agent的工作进度
  • 冲突解决:处理Agent之间的意见不一致
  • 性能平衡:避免过度复杂化,控制成本

🎯 核心要点总结

Function Calling

让LLM能够调用外部工具,从纯文本生成扩展到实际操作

  • • 函数定义规范
  • • 参数提取机制
  • • 结果融合生成
  • • 错误处理策略

Agent架构

具备规划、记忆、工具使用、反思能力的自主智能系统

  • • ReAct循环框架
  • • Thought-Action-Observation
  • • 动态策略调整
  • • 多Agent协作

实践要点

从简单场景开始,逐步增加复杂度,注重安全和成本控制

  • • 6大应用场景
  • • 5个常见挑战
  • • 安全性保障
  • • 成本优化策略

📚学习资源

📄

课程Slides

完整的讲义PDF,包含所有图表和详细内容

本讲测评

检验你对本讲知识点的掌握程度

开始测评 →