文章目录
工具使用与函数调用
MRKL
- MRKL(Modular Reasoning, Knowledge and Language)模块化推理、知识和语言。MRKL系统被提议包含一组“专家”模块,通用LLM充当路由器,将查询路由到最合适的专家模块。这些模块可以使其他模型,例如深度学习模型或外部工具,例如数学计算器、天气API。
- MRKL(Modular Reasoning, Knowledge and Language)的核心思想是通过模块化架构整合不同技术组件,弥补大语言模型(LLM)的固有缺陷,实现更高效、灵活且可扩展的自然语言处理系统。
MRKL代理的核心组成
工具模块(Tools):定义代理可调用的外部功能(如搜索引擎、API接口)
- 示例工具:Google搜索(通过SerpAPIWrapper调用),需明确工具名称、功能函数及描述
tools = [Tool(name="Search", func=search.run, description="用于回答实时事件相关问题")]
LLMChain模块
- 生成结构化文本决策,决定代理下一步动作
- 需设计符合MRKL格式的提示模板,包含
Action:
和ActionInput:
标记
代理类(Agent Class)
- 解析LLMChain输出,执行具体工具调用
- LangChain推荐使用
ZeroShotAgent
作为基础代理类
自定义MRKL代理的步骤
设计提示模板
- 通过
ZeroShotAgent.create_prompt()
方法生成模板,需指定:prefix
:工具列表前的指令(如设定代理回答风格)suffix
:工具列表后的补充说明(如输出格式要求)- 示例:让代理用海盗语气回答问题
prefix = "尽可能回答问题,但要用海盗的语气。可用工具:" suffix = "开始!回答时请保持海盗口吻。参数:{input} {agent_scratchpad}"
- 通过
配置LLMChain与代理执行器
- 将提示模板与LLM(如OpenAI模型)结合生成链式结构
- 通过
AgentExecutor
封装代理,处理工具调用循环
执行流程
- 输入问题 → LLM生成动作指令 → 调用工具 → 记录结果 → 循环直至完成
MRKL代理的关键能力扩展
规划与任务分解
- 采用CoT(链式思考)或ToT(树状思考)拆分复杂任务
- 结合外部规划器(如PDDL)处理长期规划问题
记忆管理
- 短期记忆:记录当前任务上下文
- 长期记忆:通过向量数据库存储历史交互数据
工具动态调用
- 根据任务需求自动选择工具(如科学计算工具ChemCrow)
- 支持API调用、代码执行等多模态工具集成
TALM
- 工具增强语言模型(Tool Augmented LanguageModels)是一种通过整合外部工具来增强大型语言模型(LLMs)能力的方法。
- 大型语言模型(LLM)在zero-shot和few-shot任务上表现出印象深刻的结果,展示了涌现能力。
- 这些模型存在固有限制,包括无法获取最新信息、幻觉事实倾向、低资源语言理解困难、缺乏精确计算数学技能和对时间进程的不了解。
Toolformer
- Toolformer是由MetaAI提出的一项创新研究,旨在赋予语言模型使用外部工具的能力。通过Toolformer,语言模型可以在生成文本时自动调用APl,从而获取并整合外部信息,提升文本生成的准确性和实用性。
- 它能够通过自监督学习的方式教会自己使用各种工具,如计算器、问答系统、搜索引擎、翻译系统和日历等。这种方法允许模型在处理任务时,通过调用相应的工具来获取所需的信息或执行特定的功能,从而提高模型的性能和适用性。
- Toolformer的核心思想是让语言模型学会在适当的时机调用适当的工具,而这一过程不需要大量的人工注释,而是通过模型自身的上下文学习能力来实现。
function call
- 函数调用是指可靠地连接LLM与外部工具的能力,让用户使用高效的外部工具,与外部API进行交互。
- GPT-4和GPT-3.5是经过微调的LLM,能够检测函数是否被调用,随后输出包含调用函数参数的JSON。
- 函数调用功能可以增强模型推理效果或进行其他外部操作,包括信息检索、数据库操作、知识图谱搜索与推理、操作系统、触发外部操作等工具调用场景。
注意:大模型的Functioncall不会执行任何函数调用,仅返回调用函数所需要的参数。开发者可以利用模型输出的参数在应用中执行函数调用。
openai
Function Calling
- OpenAI的函数调用是一种动态接口扩展技术,允许开发者预定义函数(如查询数据库、调用API、执行计算等),模型根据用户输入内容自动判断是否需要调用特定函数,并生成结构化参数。开发者执行函数后,可将结果返回模型,由模型生成最终自然语言回复。
典型场景:
- 实时数据获取(天气、股票、航班信息)
- 自动化操作(发送邮件、预订服务)
- 复杂逻辑分解(多步骤任务链)
技术实现流程(以Chat Completions API为例)
定义函数:使用JSON Schema描述函数名称、参数格式及用途。
- 示例:定义查询天气的函数,需包含
location
和date
参数。
- 示例:定义查询天气的函数,需包含
模型决策 :用户输入传递至API后,模型分析内容并判断是否需要调用函数。 若需要,模型返回
function_call
字段,包含函数名及参数值(结构化JSON)。执行函数:开发者根据参数执行本地或远程函数,获取结果(如调用天气API)。
结果反馈:将函数执行结果(文本或数据)通过API二次请求传递给模型。
生成最终回复:模型整合函数结果与对话上下文,输出自然语言回答。
代码示例(Python伪代码)
定义函数
functions = [
{
"name": "get_weather",
"description": "查询指定地点和日期的天气",
"parameters": {
"location": {"type": "string", "description": "城市名称"},
"date": {"type": "string", "format": "YYYY-MM-DD"}
}
}
]
API初次调用
response = openai.ChatCompletion.create(
messages=[{"role": "user", "content": "北京明天会下雨吗?"}],
functions=functions
)
解析函数调用
if response.choices[0].message.get("function_call"):
function_name = response.choices[0].message.function_call.name
args = json.loads(response.choices[0].message.function_call.arguments)
# 执行函数(例如调用天气API)
result = get_weather(args["location"], args["date"])
# 传递结果给模型生成回答
second_response = openai.ChatCompletion.create(
messages=[
{"role": "user", "content": "北京明天会下雨吗?"},
{"role": "function", "name": function_name, "content": result}
]
)
print(second_response.choices[0].message.content)
扩展思考:Function Calling vs. 传统意图识别
相较于传统NLP意图分类+槽填充技术,OpenAI函数调用的优势在于:
- 动态适应性:无需预训练意图分类模型,函数可随时增删。
- 上下文感知:模型基于对话历史动态调整函数调用策略。
- 容错性提升:参数缺失时,模型可引导用户补充信息(如追问“您需要查询哪个城市?”)。
函数调用能力评估
评估层级 | 测试场景 | 核心挑战 | 示例场景 | 对应图表 |
---|---|---|---|---|
Level 1 | 给定API用法描述与对话历史,模型需判断是否调用API、正确调用并生成回复。 | - 参数匹配与类型校验 - API结果解析与自然语言转换 - 错误处理(如API超时) |
用户问“北京明天的温度”,调用天气API并返回“北京明日气温20°C,晴”。 | apipool |
Level 2 | 仅告知API检索系统用法,模型需根据需求搜索并学习调用未知API。 | - 用户意图模糊性处理 - 关键词提取与API匹配 - 快速学习新API接口文档 |
用户问“最新新能源汽车补贴政策”,需检索“政策查询API”并调用。 | api search |
Level 3 | 用户需求隐含多步骤逻辑(如旅行规划),模型需分解任务并协调调用多个API。 | - 需求分解与优先级排序 - API执行顺序规划 - 跨API数据依赖与冲突解决 |
用户问“上海到北京一周旅行规划”,需调用航班、酒店、景点API生成完整行程方案。 | plan |
关键解读
能力递进性:
- Level 1 关注单一API的精准调用,侧重技术实现;
- Level 2 强调需求与API的动态匹配,考验语义理解与检索能力;
- Level 3 要求复杂逻辑的拆解与执行,体现任务规划与系统协作能力。
技术难点对比:
层级 技术重心 典型失败原因 Level 1 结构化参数生成与结果解析 参数格式错误、API响应超时 Level 2 意图识别与API元数据理解 检索关键词偏差、API文档学习不足 Level 3 多步骤规划与跨API数据流管理 任务分解遗漏、API调用顺序冲突 应用价值:
- Level 1-2 适用于垂直场景工具助手(如客服、数据查询);
- Level 3 可驱动自动化流程引擎(如智能旅行规划、供应链管理)。