小白学Agent技术[3](Agent工具使用与函数调用)

发布于:2025-03-10 ⋅ 阅读:(155) ⋅ 点赞:(0)

工具使用与函数调用

MRKL

  • MRKL(Modular Reasoning, Knowledge and Language)模块化推理、知识和语言。MRKL系统被提议包含一组“专家”模块,通用LLM充当路由器,将查询路由到最合适的专家模块。这些模块可以使其他模型,例如深度学习模型或外部工具,例如数学计算器、天气API。
  • MRKL(Modular Reasoning, Knowledge and Language)的核心思想是通过模块化架构整合不同技术组件,弥补大语言模型(LLM)的固有缺陷,实现更高效、灵活且可扩展的自然语言处理系统。

MRKL代理的核心组成

  1. 工具模块(Tools):定义代理可调用的外部功能(如搜索引擎、API接口)

    • 示例工具:Google搜索(通过SerpAPIWrapper调用),需明确工具名称、功能函数及描述
    tools = [Tool(name="Search", func=search.run, 
                description="用于回答实时事件相关问题")]
    
  2. LLMChain模块

    • 生成结构化文本决策,决定代理下一步动作
    • 需设计符合MRKL格式的提示模板,包含Action:ActionInput:标记
  3. 代理类(Agent Class)

    • 解析LLMChain输出,执行具体工具调用
    • LangChain推荐使用ZeroShotAgent作为基础代理类

自定义MRKL代理的步骤

  1. 设计提示模板

    • 通过ZeroShotAgent.create_prompt()方法生成模板,需指定:
      • prefix:工具列表前的指令(如设定代理回答风格)
      • suffix:工具列表后的补充说明(如输出格式要求)
      • 示例:让代理用海盗语气回答问题
      prefix = "尽可能回答问题,但要用海盗的语气。可用工具:"
      suffix = "开始!回答时请保持海盗口吻。参数:{input} {agent_scratchpad}"
      
  2. 配置LLMChain与代理执行器

    • 将提示模板与LLM(如OpenAI模型)结合生成链式结构
    • 通过AgentExecutor封装代理,处理工具调用循环
  3. 执行流程

    • 输入问题 → LLM生成动作指令 → 调用工具 → 记录结果 → 循环直至完成

MRKL代理的关键能力扩展

  1. 规划与任务分解

    • 采用CoT(链式思考)或ToT(树状思考)拆分复杂任务
    • 结合外部规划器(如PDDL)处理长期规划问题
  2. 记忆管理

    • 短期记忆:记录当前任务上下文
    • 长期记忆:通过向量数据库存储历史交互数据
  3. 工具动态调用

    • 根据任务需求自动选择工具(如科学计算工具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为例)

  1. 定义函数:使用JSON Schema描述函数名称、参数格式及用途。

    • 示例:定义查询天气的函数,需包含locationdate参数。
  2. 模型决策 :用户输入传递至API后,模型分析内容并判断是否需要调用函数。 若需要,模型返回function_call字段,包含函数名及参数值(结构化JSON)。

  3. 执行函数:开发者根据参数执行本地或远程函数,获取结果(如调用天气API)。

  4. 结果反馈:将函数执行结果(文本或数据)通过API二次请求传递给模型。

  5. 生成最终回复:模型整合函数结果与对话上下文,输出自然语言回答。

代码示例(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

关键解读

  1. 能力递进性:

    • Level 1 关注单一API的精准调用,侧重技术实现;
    • Level 2 强调需求与API的动态匹配,考验语义理解与检索能力;
    • Level 3 要求复杂逻辑的拆解与执行,体现任务规划与系统协作能力。
  2. 技术难点对比:

    层级 技术重心 典型失败原因
    Level 1 结构化参数生成与结果解析 参数格式错误、API响应超时
    Level 2 意图识别与API元数据理解 检索关键词偏差、API文档学习不足
    Level 3 多步骤规划与跨API数据流管理 任务分解遗漏、API调用顺序冲突
  3. 应用价值:

    • Level 1-2 适用于垂直场景工具助手(如客服、数据查询);
    • Level 3 可驱动自动化流程引擎(如智能旅行规划、供应链管理)。

网站公告

今日签到

点亮在社区的每一天
去签到