在工具已定义并技术上可供Agent使用的情况下,让Agent的大语言模型(LLM)核心明白何时以及如何使用这些工具,是需要考虑的。LLM本身是语言大师,但它们天生并不了解已连接的计算器或网页搜索API等外部功能。因此,细致的提示词工程变得必要。提示词是提供给LLM的主要操作指南,它引导LLM的思考以及与这些新功能的协作。让LLM理解工具把LLM想象成一个能精确遵循指示的非常聪明的助手。如果您想让这个助手使用一个新工具,您首先需要告诉它这个工具存在,它有什么用,以及如何请求使用它。这些信息通常嵌入在您发送给LLM的主要提示词中。列出可用工具指导您的Agent使用工具的第一步是简单地在提示词中列出它们。这个列表就像一个可用动作的菜单。对于每个工具,您需要提供足够的信息,以便LLM能够做出明智的使用决定。一种常见做法是在提示词中包含一个专门的部分,概述这些工具。例如:您可以使用以下工具: 1. **计算器**: 用于执行数学计算。 2. **搜索引擎**: 用于查找您的知识库中没有的实时信息或事实。编写清晰的工具描述仅仅一个名字是不够的。LLM需要一个清晰简洁的描述,说明每个工具的作用,它期望什么样的输入,有时还需要说明它会产生什么样的输出。描述越好,LLM选择和使用工具就会越准确。以我们的“计算器”工具为例。一个好的描述可能是:工具名称: Calculator描述: “当您需要执行数学计算时使用此工具,例如加法、减法、乘法、除法或更复杂的算术。输入应为标准数学表达式(例如,'2 + 2','15 * (9/3)','sqrt(16)')。”对于“搜索引擎”工具:工具名称: SearchEngine描述: “使用此工具查找训练数据中没有的当前信息、事实或细节。输入应为简洁的搜索查询(例如,'伦敦当前天气','AI最新进展')。”要点在于要足够具体,让LLM明白工具的用途,而不会用过多细节使其感到负担。您正在尝试给LLM足够的背景信息,以便它能将用户的请求(或其识别出的子任务)与合适的工具匹配起来。指定Agent应如何请求使用工具一旦LLM决定需要一个工具,它就需要一种方式将这个决定传达回Agent的底层代码,然后底层代码将执行该工具。这需要一个预定义的格式来表示工具调用。如果LLM只是说“我想我需要计算器”,您的程序将不知道接下来做什么或执行什么计算。一种广泛使用的方法是指导LLM以结构化格式(最常见的是JSON)输出其使用工具的意图。这是因为JSON易于程序解析和理解。您可以这样在提示词中添加指令:当您决定使用工具时,您必须*只*以以下JSON对象格式响应: { "tool_name": "要使用的工具名称", "tool_input": "工具的输入字符串" } 如果您无需使用工具即可直接回答,请以纯文本形式提供您的答案。 如果您正在调用工具,请不要在JSON对象之前或之后包含任何其他文本或解释。这条指令非常重要。它告诉LLM:使用什么格式: 一个JSON对象。要包含哪些字段: tool_name(指定哪个工具)和tool_input(为该工具提供必要的输入)。何时使用这种格式: 只有当它打算调用工具时。唯一性: 如果调用工具,JSON应该是它在该回合中输出的唯一内容。这可以避免歧义。如果没有这种结构化格式,您将不得不尝试从LLM的自然语言响应中猜测其意图,这对于自动化系统来说可靠性要低得多。工具使用的一个实际提示词示例让我们将这些元素组合成一个更完整的提示词,用于具有简单计算器工具的Agent。想象一下,这个Agent的总体目标是成为一个有用的助手。您是一个乐于助人的AI助手。您可以回答问题并执行任务。 如果您能直接回答,请直接回答。 You可以使用以下工具: - **工具名称**: 计算器 - **描述**: 用于执行数学计算。输入应为数学表达式(例如,'2+2','10*5')。 如果您需要使用计算器工具,您必须*只*以以下JSON对象格式响应: { "tool_name": "Calculator", "tool_input": "数学表达式" } 如果您正在使用工具,请不要添加任何额外的评论或文本。 如果您没有使用工具,请直接以文本形式提供您的答案。 用户的请求将紧随其后。现在,如果用户问“125乘以34是多少?”,LLM在受此提示词引导下,理想情况下应回应:{ "tool_name": "Calculator", "tool_input": "125 * 34" }您的Agent代码随后将解析此JSON,使用输入"125 * 34"执行Calculator工具,获得结果(例如4250),然后将此结果在后续步骤中反馈给LLM,以形成给用户的最终答案(例如,“125乘以34是4250。”)。LLM如何处理与工具相关的提示词当LLM收到用户的查询,以及您精心编写的包含工具信息的提示词时,它会经历一个思考过程。尽管确切的内部工作机制很复杂,但您可以将其视为如下过程:理解目标: LLM首先分析用户的请求或当前任务。检查内部知识: 它判断是否可以使用自己训练过的知识来满足请求。查阅工具列表: 如果它不能直接回答,或者请求暗示了它无法执行的操作(例如计算或查找实时数据),它会查看您在提示词中提供的工具列表。将工具与任务匹配: 它会阅读可用工具的描述,看看是否有任何工具可以帮助实现目标或其某个子部分。决定并格式化:如果找到了合适的工具,LLM将尝试根据您指定的工具调用指令(例如JSON格式)来格式化其响应。如果没有合适的工具,或者它可以直接回答,它将生成一个标准文本响应。以下图表说明了受您的提示词影响的决策流程:digraph G { rankdir=TB; node [shape=box, style="rounded,filled", fontname="Helvetica", fontsize=10]; edge [fontname="Helvetica", fontsize=9]; subgraph cluster_prompt_info { label = "来自您的提示词信息"; labeljust = "l"; bgcolor = "#e9ecef"; rank = same; ToolDesc [label="工具描述\n(名称、用途、输入/输出格式)", shape=note, fillcolor="#ffec99"]; UsageInstruction [label="如何\n表示工具使用的指令(例如JSON)", shape=note, fillcolor="#ffec99"]; } UserQuery [label="用户查询/任务", fillcolor="#a5d8ff", width=2]; LLM [label="LLM\n(Agent的思考核心)", fillcolor="#ffd8a8", width=2.2, height=1]; Decision [label="LLM决定:\n1. 直接回答?\n2. 使用可用工具?", shape=diamond, fillcolor="#ffe066", width=2.7, height=1.5]; AnswerDirectly [label="LLM直接生成\n文本响应", fillcolor="#b2f2bb"]; FormattedToolCall [label="LLM生成格式化的\n工具调用(例如JSON)", fillcolor="#fcc2d7"]; UserQuery -> LLM; ToolDesc -> LLM [style=dashed, arrowhead=open, label=" 提供信息", fontcolor="#495057", headport="w", tailport="e"]; UsageInstruction -> LLM [style=dashed, arrowhead=open, label=" 引导", fontcolor="#495057", headport="w", tailport="e"]; LLM -> Decision; Decision -> AnswerDirectly [label=" 如果不需要工具\n 或最佳匹配"]; Decision -> FormattedToolCall [label=" 如果一个工具\n 被认为有用 "]; AgentSystem [label="Agent系统\n(解析LLM输出,调用实际工具,\n并获取结果)", fillcolor="#bac8ff", width=2.5]; Observation [label="工具结果/反馈", fillcolor="#d0bfff", width=2.5]; FormattedToolCall -> AgentSystem [label=" 输出发送到"]; AgentSystem -> Observation; Observation -> LLM [label=" 结果反馈给LLM\n 以进行下一步思考或给出最终答案"]; }该图显示了用户的查询,结合您在提示词中提供的工具描述和使用说明,如何让LLM决定是直接回答,还是格式化请求以让Agent系统使用工具。工具的结果通常随后会反馈给LLM。编写有效工具使用提示词的建议编写能够可靠引导LLM有效使用工具的提示词,通常需要一些迭代:清晰明确: 您的工具描述和调用指令应尽可能清晰。避免LLM可能误解的行话或模糊措辞。明确说明工具输入要求: 如果工具期望特定格式的输入(例如,网页抓取器的URL,天气工具的城市名称),请在工具描述中提及这一点。提供示例(如有必要): 有时,在工具描述中包含一个简单的tool_input格式示例对LLM非常有帮助。例如,对于日期格式化工具:“输入应为日期字符串,如‘明天’或‘下周五’。”指导何时不使用工具: 有时,LLM可能过于急切地使用工具。您可能需要添加诸如“仅在严格必要且您无法用自身知识回答问题时才使用工具”的短语。迭代和测试: 您的第一个提示词版本可能无法完美运行。使用各种输入进行测试。如果LLM在应该使用工具时未能使用,或者使用不正确,请优化您的工具描述或调用指令。提示词工程通常是一个实验性过程。保持简洁: 尽管您需要清晰,但过长的提示词有时会混淆LLM或超出其上下文窗口限制。在工具定义中,努力在完整性和简洁性之间取得平衡。通过深思熟虑地设计您的提示词,您为LLM提供了运用外部工具所需的知识和结构化通信路径。这显著增加了您的Agent能完成的事情,使其从一个纯文本生成器转变为一个能与环境互动并采取行动,或者至少与您连接的数字系统互动的更强大的系统。下一步是理解Agent如何使用逻辑来更可靠地进行这些工具选择。