要让LLM智能体有效使用工具,它需要一份清晰明确的“使用手册”。这正是工具规范和描述所提供的。可以把LLM想象成一个能力很强但非常“死板”的助手。它不会推断你的意图,也不会猜测工具如何运作。相反,它完全依赖你提供的关于每个工具的信息。精心制作的规范对构建可靠且高效的智能体系统非常重要。工具规范的构成工具规范是对工具功能以及如何与其交互的结构化表示。它通常包含LLM用来决定何时以及如何使用该工具的几项重要信息。digraph ToolSpecificationComponents { rankdir=LR; graph [fontname="Arial", fontsize=10, bgcolor="transparent"]; node [shape=Mrecord, style="filled", fillcolor="#e9ecef", fontname="Arial", fontsize=10, color="#495057"]; edge [fontname="Arial", fontsize=9, color="#495057"]; spec [label="{工具规范 | <name> 名称(唯一标识符) | <desc> 描述(目的与功能) | <inputs> 输入参数(实参) | <outputs> 输出结构(返回结构)}", fillcolor="#74c0fc", color="#1c7ed6"]; inputs_detail [label="{输入参数 | {<p1_name> 名称: 字符串 | <p1_type> 类型: 字符串, 数字, 布尔值 | <p1_desc> 描述: 参数的用途 | <p1_req> 必需: 真/假 | ...(更多参数)}}", fillcolor="#a5d8ff", color="#1c7ed6"]; outputs_detail [label="{输出结构 | {<o1_name> 字段名称: 字符串 | <o1_type> 类型: 字符串, 对象, 数组 | <o1_desc> 描述: 输出字段的含义 | ...(更多字段)}}", fillcolor="#b2f2bb", color="#37b24d"]; spec:inputs -> inputs_detail [label="详细信息"]; spec:outputs -> outputs_detail [label="详细信息"]; } 工具规范的核心组成部分,详细说明了LLM有效使用工具所需的信息。我们来逐一解析这些组成部分:工具名称:这是工具的唯一标识符,通常是字符串(例如,get_stock_price,send_email)。它应该简洁且机器可读。当LLM决定调用工具时,会使用此名称。描述:这可以说是LLM理解工具的最重要的部分。描述是对工具作用、主要目的、任何重要功能以及可能存在的局限性的自然语言说明。LLM使用此描述来决定工具是否与当前任务或用户查询相关。例如,一个好的天气工具描述可能是:“获取指定城市的当前天气状况,包含温度、湿度和风速。”输入参数(实参):工具通常需要输入才能执行其功能。规范的这一部分详细说明了工具接受的每个参数。对于每个参数,应定义:名称:参数的名称(例如,location,user_id)。类型:参数的数据类型(例如,string,integer,boolean,array,object)。这有助于LLM正确格式化数据。描述:清楚说明此参数代表什么以及预期何种值。例如,对于 location 参数:“要获取天气信息的城市和州(例如,‘旧金山,加利福尼亚州’)或邮政编码。”必需:一个布尔值,表明此参数是强制的还是可选的。如果可选,指定默认值可能会有帮助。输出结构(返回值):定义输入固然重要,描述工具成功执行后返回什么也同样重要。输出结构告知LLM将从工具接收到的信息的结构和数据类型。这可能包括:类型:整体输出的数据类型(例如,string,object,array)。属性(如果输出是对象):返回对象中每个字段的描述,包括其名称和数据类型。例如,一个天气工具可能返回一个包含 temperature(数字)、condition(字符串)和 humidity(百分比,字符串)等属性的对象。现代LLM框架通常期望这些规范采用结构化格式,例如JSON Schema,它提供了一种定义数据形态和约束的标准化方法。编写LLM能理解的描述工具描述的质量直接影响LLM智能体正确选择和使用工具的能力。LLM不会读心;它们会字面解释文本。模糊或误导性的描述将导致错误的工具使用或未能使用有用的工具。以下是撰写实用工具描述的一些指导方针:保持清晰和具体:避免歧义。清楚说明工具的作用和用途。与其说“管理用户数据”,不如说“根据用户ID获取用户资料信息(姓名、电子邮件、注册日期)。”使用面向行动的语言:描述应以表达工具主要动作的动词开头,例如“获取……”、“计算……”、“发送……”、“创建……”、“翻译……”等。突出功能和实体:提及工具操作的主要对象或实体(例如,“电子邮件”、“日历事件”、“数据库记录”、“图像文件”)。简要说明输入期望:虽然详细的输入参数是单独定义的,但描述中的提示会有用处。例如,“将文本从源语言翻译成目标语言。需要文本、源语言代码和目标语言代码。”提及输出性质:简要说明预期会得到何种输出。例如,“……返回产品名称和价格列表”,或者“……成功后返回确认ID。”说明限制或范围(如果适用):如果工具仅在某些条件下工作(例如,“搜索2010年后发表的学术论文”或“仅处理最大5MB的文本文件”),请提及这一点。考虑关键词:考虑LLM在需要特定功能时可能生成的短语类型。包含相关关键词可以帮助LLM将任务与你的工具匹配。我们来比较一下文件读取工具的弱描述和强描述:弱描述:“用于文件的工具。”问题:这太模糊了。它对文件做什么?读取、写入、列出、删除?什么类型的文件?强描述:“读取指定UTF-8编码文本文件的全部内容,并将内容作为单个字符串返回。需要完整的文件路径作为输入。”改进:这清楚地说明了动作(读取)、输入(文件路径)、输入限制(UTF-8文本文件)和输出(作为单个字符串的内容)。LLM如何理解规范当LLM智能体面对任务时,它会分析用户的请求及其自身的目标。如果它判定它需要外部功能,它会查阅可用的工具规范列表。智能体的决策过程通常包括:工具选择:LLM会将任务要求与每个可用工具的描述进行比较。它会查找功能最符合当前需求的工具。参数生成:工具选定后,LLM会使用规范的输入参数部分来弄明白它需要提供什么数据。它会尝试从用户查询或当前对话上下文中提取或推断这些参数值。每个参数的类型和描述会引导LLM正确格式化这些参数。输出理解:工具执行并返回结果后,LLM(或智能体框架)使用输出结构来理解返回数据的结构和含义,使其可以在后续步骤中使用或呈现给用户。如果规范不完整或不清楚,LLM可能会选择错误的工具、提供不正确的参数,或误解工具的输出,导致错误或次优表现。以机器可读格式(如JSON)提供这些规范是标准做法。许多LLM框架和API,例如OpenAI的函数调用功能,都内置了机制,要求工具规范以特定的结构化方式呈现。这使得LLM能够以编程方式访问并处理其可用的工具。通过花时间创建精确且全面的工具规范和描述,你为LLM智能体提供了所需的明确性,使其能够有效且可靠地扩展其功能。这项准备工作对构建更复杂可靠的LLM驱动应用不可或缺。