为了让LLM智能体有效使用其可用的工具,它首先需要一种机制来判断哪个工具适合当前任务或源自用户查询或更大目标的子任务。这个选择过程并非简单查找,它涉及LLM的推理能力,并由提供的每个工具的信息引导。使LLM智能体做出这些重要决定的常见机制有所呈现。工具选择的核心是LLM理解用户输入意图并将其与可用工具的功能描述进行匹配的能力。正如第一章(“LLM智能体工具的根本”)中所述,您的工具描述的清晰度和准确性在此非常关键。LLM分析查询,并将其理解与工具描述进行比较,以找到最匹配的。上下文提示中的工具信息一种直接的工具选择方法是,在提示词中,将可用工具的信息直接提供给LLM,作为其上下文窗口的一部分。提示词通常包含用户查询以及工具列表,每个工具都包含名称、功能描述和接受的参数。考虑一个可使用天气工具和计算器的智能体。提示词的结构可能如下:You are a helpful assistant. You have access to the following tools: [ { "name": "get_current_weather", "description": "获取给定城市的当前天气。", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称,例如:伦敦" } }, "required": ["location"] } }, { "name": "evaluate_expression", "description": "计算数学表达式的结果。", "parameters": { "type": "object", "properties": { "expression": { "type": "string", "description": "数学表达式,例如:“10 * 4 / 2”" } }, "required": ["expression"] } } ] User query: What is 5 plus 12? Assistant's tool choice:LLM需要分析“User query”并填写“Assistant's tool choice”部分,理想情况下,输出应是结构化的,明确指定所选工具及其参数:{ "tool_name": "evaluate_expression", "arguments": { "expression": "5 + 12" } }为了提高LLM在此选择过程中的准确性,特别是在工具集或查询更复杂的情况下,可以采用少量示例提示。这需要将一些查询及其正确工具选择的示例直接添加到当前查询之前的提示词中。这些示例作为示范,指导LLM的推理。函数调用与结构化输出模式许多现代LLM提供专门模式,通常称为“函数调用”或“工具调用”。这些模式旨在使工具集成更可靠、更明确。LLM不再生成需要您的应用代码解析的文本来识别工具调用,而是直接输出一个结构化对象(通常是JSON),明确表明其使用特定工具的意图,并提供所需参数。使用此功能时,您的应用通常会:按照LLM提供商API规定的格式,定义可用工具,包括它们的名称、描述和参数Schema。将用户查询和这些工具定义发送给LLM。如果LLM判定某个工具适合,它将返回一个响应,指明要调用的工具以及使用的参数,并按预定义Schema格式化。您的应用代码随后使用提供的参数执行识别出的工具。工具执行的结果随后通过后续调用发送回LLM,使其能够继续对话或任务,此时LLM已了解工具的输出。这种方法减少了模糊性,并降低了从自然语言响应中解析工具调用的脆弱性。ReAct模式:推理与行动ReAct(推理与行动)模式为智能体迭代地选择和使用工具来完成目标提供了一个强大的框架。与其说是一种单一的选择机制,不如说是一个操作循环,指导智能体的行为,包括工具选择。该循环通常包括:思考: LLM分析当前目标、已收集的信息以及可用工具。它制定计划或下一步行动,通常会将其内部推理过程表述出来。例如:“用户想知道法国的首都在哪里以及那里的当前天气。我应该先找到首都,然后获取那个城市的天气。”行动: 根据其思考过程,LLM决定采取行动。此行动通常是对其可用工具之一的调用,并指定工具名称和所需参数。例如:use_tool(search_web, query="法国首都")。观察: 选定的工具由智能体的环境(您的代码)执行,并返回结果(例如:“巴黎”)或任何错误消息。此输出成为观察结果。重复: LLM接收此观察结果。它然后重新进入“思考”阶段,结合新信息来决定下一步行动。它可能会选择另一个工具,使用相同工具但参数不同,或者得出结论认为已获得足够信息来回答用户查询。下图说明了此迭代循环。digraph ReAct_Cycle { rankdir=TB; node [shape=box, style="rounded,filled", fillcolor="#e9ecef", fontname="Arial"]; edge [fontname="Arial"]; Start [label="用户查询 / 目标", shape=ellipse, fillcolor="#a5d8ff"]; Thought [label="LLM: 思考\n(分析查询、工具、状态;\n选择行动)", fillcolor="#ffec99"]; Action [label="LLM: 行动\n(选择工具并指定输入)", fillcolor="#b2f2bb"]; ToolExecution [label="执行工具\n(外部系统)", fillcolor="#ffd8a8"]; Observation [label="LLM: 观察\n(接收工具输出或错误)", fillcolor="#ffc9c9"]; FinalAnswer [label="最终答案 / 目标达成", shape=ellipse, fillcolor="#96f2d7"]; Start -> Thought; Thought -> Action [label=" 决定行动"]; Action -> ToolExecution [label=" 触发"]; ToolExecution -> Observation [label=" 返回结果"]; Observation -> Thought [label=" 告知下一次\n 思考/行动"]; Thought -> FinalAnswer [label=" 若目标达成"]; }ReAct循环:LLM迭代地思考、行动(通常通过选择和使用工具)、观察结果,然后再次思考,直至达成目标。在ReAct框架中,工具选择是一个动态过程。LLM不断评估哪个工具(如果有的话)最适合推进其当前子目标,基于其不断演进的推理状态和先前行动的观察结果。用于工具选择的路由器架构当智能体可用工具数量众多,或者某些“工具”本身就是复杂的子智能体或链时,路由器架构会很有用。在这种设置中,最初的LLM调用充当“路由器”。其主要职责并非直接执行任务,而是确定哪个专业工具、子智能体或处理链最适合处理用户查询或当前子任务。路由器LLM通常会获得下游工具或链的高级描述。根据输入查询,它会选择最合适的路径。例如,像“巴黎天气如何?”这样的查询可能会被路由到天气工具,而“计算180的25%”则会路由到计算器工具或数学处理链。digraph ToolRouter { rankdir=TB; node [shape=box, style="rounded,filled", fontname="Arial"]; edge [fontname="Arial"]; UserInput [label="用户查询", shape=ellipse, fillcolor="#a5d8ff"]; RouterLLM [label="路由器LLM\n(选择合适的工具/链)", fillcolor="#ffec99", width=3]; ToolA [label="天气工具", fillcolor="#b2f2bb"]; ToolB [label="计算链", fillcolor="#c0eb75"]; ToolC [label="数据库访问工具", fillcolor="#96f2d7"]; Processing [label="选定工具/链处理查询", fillcolor="#e9ecef", width=3]; UserInput -> RouterLLM; RouterLLM -> ToolA [label=" 例如:天气查询"]; RouterLLM -> ToolB [label=" 例如:数学查询"]; RouterLLM -> ToolC [label=" 例如:数据查询"]; ToolA -> Processing; ToolB -> Processing; ToolC -> Processing; }路由器LLM分析传入查询,并将其定向到一组选项中最适合的专业工具或处理链。这种方法通过分解决策过程来帮助管理复杂性,并且通过不要求单个LLM实例了解每个可能工具的微小细节(如果某些工具高度专业化),从而提高效率。影响选择准确性的因素任何智能体驱动的工具选择机制的有效性取决于几个因素:工具描述的质量和清晰度: 如反复强调,LLM高度依赖工具的描述方式。模糊、模棱两可或不准确的描述会导致错误的工具选择。描述应清楚说明工具的功能、预期输入和产生输出。工具的独特性: 如果多个工具的描述非常相似或功能重叠,LLM可能难以区分它们,或可能选择一个次优工具。确保每个工具都有明确定义的独特用途,或者在故意重叠时提供何时优先选择一个而非另一个的指导。LLM能力: 不同的LLM拥有不同程度的推理能力和指令遵循精度。更高级的模型在理解查询和做出适当工具选择方面通常表现出更好的性能。提示工程: 提供给LLM的整体指令,包括任何系统消息或少量示例,显著影响其行为和正确使用工具的倾向。处理无需工具的场景: 同样重要的是,智能体能够识别何时不需要工具,并能利用自身知识库回答查询。选择机制应允许这种可能性。通过理解这些机制和考量,您可以为您的LLM智能体设计更有效的策略来选择正确的工具,这是协调它们完成复杂任务的第一步。接下来的章节将在此根本上继续讨论如何管理工具调用序列。