掘金 人工智能 10月08日 12:49
统一CLI工具简化AI Agent设计
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文提出了一种通过引入统一的CLI工具agent-magic-tool来简化AI Agent设计的方案。该方案将多个第三方工具的调用整合到agent-magic-tool的子命令中,使LLM无需加载所有工具定义,只需知道如何通过agent-magic-tool发现和执行具体功能。工作流程分为工具发现、Agent接管与执行、任务处理与迭代触发三个步骤,通过异步占位符机制优雅处理长耗时任务和用户确认场景,显著提升可扩展性、上下文优化、灵活性和关注点分离。

💡agent-magic-tool将多个第三方工具的调用整合为子命令,使LLM只需了解如何通过agent-magic-tool发现和执行功能,无需加载所有工具定义,从而优化上下文空间。

🔄工作流程分为工具发现、Agent接管与执行、任务处理与迭代触发三个步骤。工具发现阶段通过agent-magic-tool的list tools命令动态获取可用工具及其用法,示例输出为JSON对象定义每个工具的输入参数和格式。

⏱️Agent接管与执行阶段,command_executor创建临时结果文件并返回文件路径,将核心逻辑交由Agent或sub agent处理,支持直接API调用或需要用户确认的场景,如发送邮件前需等待用户确认。

🔄任务处理与迭代触发阶段,Agent根据子命令和参数决定行动,对于直接任务直接调用第三方API并写入结果文件,对于需要确认的任务先请求用户确认再执行,Agent会主动触发新一轮迭代以向LLM返回最终结果。

🚀该方案通过统一CLI入口和执行机制,显著提升可扩展性(新工具可轻松添加为子命令)、上下文优化(减少LLM需处理的工具定义数量)、灵活性和关注点分离(工具发现与执行分离)。

🔄Agent的迭代循环不会被阻塞,可以灵活应对长耗时任务、网络延迟和需要用户介入的场景,如通过User Frontend请求用户确认后再执行需要敏感操作的API调用。

问题来源

在典型的AI Agent系统中,其工作流程是一个迭代循环(AI Agent参考):LLM根据任务需求选择并调用一个工具,观察返回结果,然后基于新信息进行下一步思考和决策。随着一个AI Agent的功能(tools)越来越多,便会出现上下文压力:每一个工具的定义(包括其名称、功能描述、参数列表和格式)都需要在输入(Prompt)中详细说明,以便LLM能够理解和使用。当集成的工具从几个增加到几十甚至上百个时,上下文长度会随着增加,新增的tool还可能会影响现有的已经调优好的tool。

思路:统一的CLI工具

设计一种基于现有command_executor(假设我们的AI Agent具有执行shell命令的工具)的扩展方案。该方案引入一个名为agent-magic-tool的"虚拟"命令行工具,将所有第三方集成功能收敛到其子命令中。

1. 概要

我们将原本需要定义为独立Tool Call的各项功能(如gmail_search_messages)全部改造为agent-magic-tool的子命令。这样,LLM的工具列表中不再包含五花八门的第三方工具,而主要是这个高度统一的cli。LLM通过执行不同的agent-magic-tool命令来完成多样化的任务。

这种设计的关键优势在于,LLM无需在上下文中加载所有工具的完整定义。它只需要知道agent-magic-tool的存在以及如何通过它来发现和执行具体的功能即可。

2. 工作流程详解

整个工作流程分为三个关键步骤:工具发现、Agent接管与执行、任务处理与迭代触发。下面我们以一个“在Gmail中搜索特定标签的邮件”的任务为例进行说明。

步骤一:工具发现

当Agent需要执行某项功能时,它首先可以调用agent-magic-tool的帮助或列表命令来动态发现可用的工具及其用法。

agent-magic-tool list tools --query="gmail"

command_executor在解析这个命令后,返回一个描述可用子工具的JSON对象。这个JSON详细定义了每个工具的输入参数和格式,为LLM提供了足够的信息来构建下一步的执行命令。

示例JSON输出:

{  "gmail_search_messages": {    "description": "Searches for messages in Gmail based on a query and labels.",    "input": {      "type": "object",      "properties": {        "search_query": {          "type": "string",          "description": "The search query string."        },        "label": {          "type": "string",          "description": "The label to filter messages by."        }      },      "required": ["search_query"]    }  }}

步骤二:Agent接管与执行

在理解了gmail_search_messages工具的用法后,LLM可以生成并执行具体的调用命令。例如LLM在某一次调用command_executor,并且给出如下输入:

agent-magic-tool run gmail_search_messages --input='{"search_query": "年度报告", "label": "work"}'

我们在这里的处理流程是整个设计的核心:

    创建结果占位符command_executor识别出agent-magic-tool调用后,并不会直接执行任何脚本或者命令。它的首要职责是立即在文件系统中创建一个临时的结果文件(例如 /tmp/result-12345.json),并写入一个初始状态,如 {"status": "pending", "message": "The tool execution has been delegated to the agent."}返回文件路径command_executor的本次执行结果会立即返回给Agent,内容就是这个临时文件的路径以及实际的输入,如{"tool": "gmail_search_messages", "input": {"search_query": "年度报告", "label": "work"}}Agent逻辑接管:核心的处理逻辑交由Agent来做(或者对应的sub agent)。

步骤三:任务处理与迭代触发

<<>>Agent在接收到任务后,会根据子命令和参数决定下一步的行动。这种决策是上下文感知的,极具灵活性。

<<>>最后,Agent会主动触发新一轮的迭代。整个流程对于LLM来说,只是执行一个shell脚本 -> 脚本返回了一个result-12345.json,它自然会选择使用文件读取工具来查看该文件的内容,从而获得任务的最终执行结果,实是妙哉。

3. 流程图

以下Mermaid流程图直观地展示了上述调用过程:

sequenceDiagram    participant LLM    participant AgentLoop as "Agent Loop"    participant CommandExecutor as "command_executor"    participant AgentLogic as "Agent Logic (Async)"    participant ResultFile as "/tmp/result-<id>.json"    participant UserFrontend as "User Frontend"    participant ThirdPartyAPI as "Third-Party API"    LLM->>AgentLoop: shell(command="agent-magic-tool run ...")    AgentLoop->>CommandExecutor: Execute command    CommandExecutor->>ResultFile: Create with "pending" status    CommandExecutor-->>AgentLoop: toolResult: "Result is in /tmp/result-<id>.json"    CommandExecutor->>AgentLogic: Delegate task (command, input, file_path)    AgentLoop->>LLM: Observation: "Result is in /tmp/result-<id>.json"    alt Direct API Call (e.g., search)        AgentLogic->>ThirdPartyAPI: Call search API        ThirdPartyAPI-->>AgentLogic: Return search results        AgentLogic->>ResultFile: Write final result        AgentLogic->>AgentLoop: Trigger next iteration    else User Confirmation (e.g., send)        AgentLogic->>UserFrontend: Request confirmation        UserFrontend-->>AgentLogic: User confirms        AgentLogic->>ThirdPartyAPI: Call send API        ThirdPartyAPI-->>AgentLogic: Return success status        AgentLogic->>ResultFile: Write final result        AgentLogic->>AgentLoop: Trigger next iteration    end    Note over LLM, AgentLoop: New iteration starts    LLM->>AgentLoop: file(read="/tmp/result-<id>.json")    AgentLoop->>ResultFile: Read content    ResultFile-->>AgentLoop: fileContent: "{...final result...}"    AgentLoop->>LLM: Observation: "{...final result...}"    LLM->>AgentLoop: Continue task with the result...

方案优势总结

该方案通过一个统一的CLI入口和执行机制,带来了多方面的显著优势:

优势描述
可扩展性新的第三方集成可以作为agent-magic-tool的子命令被轻松添加,无需修改LLM的核心工具定义。这使得Agent的能力可以无限扩展。
上下文优化将数百个潜在的工具定义缩减为一个command_executor的定义,极大地节省了LLM的上下文空间,使其能更专注于任务逻辑本身。
灵活性异步占位符机制优雅地处理了长耗时任务、网络延迟甚至需要用户介入的场景。Agent的迭代循环不会被阻塞,可以灵活应对各种异常情况。
关注点分离该设计将“工具的发现和选择”(由LLM负责)与“工具的具体执行”(由后端Agent逻辑负责)清晰地分离开来,使得系统架构更清晰,更易于维护。

这篇文档是AI基于我的简要说明写出来的,还不错哦![sticker转存失败,建议直接上传图片文件]

原文地址

blog.yunyuyuan.net/articles/ai…

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

AI Agent CLI Tool agent-magic-tool 上下文优化 可扩展性 异步处理 工具发现 Agent设计
相关文章