使用 Go Micro 构建 AI Agent CLI

通过专注于四个核心组件:工具发现、模型集成、对话记忆和执行循环,一个 AI agent CLI 大约可以用 150 行代码实现。这种方法消除了手动编写 "if-then" 逻辑来将用户请求路由到特定服务的需求,而是依靠大语言模型 (LLM) 根据提供的描述来推理调用哪个工具。

工具调用 Agent 的四个组件

构建一个功能完备的 AI agent 需要解决三个主要问题:为 LLM 提供可用工具列表、在请求时执行这些工具,以及通过对话记忆维持上下文。

1. 工具发现

LLM 必须知道哪些函数可以被调用。在 Go Micro 框架中,服务通过注册表注册其端点,包括请求类型和字段元数据。这使得 agent 可以自动生成工具列表,其中每个工具包含一个名称、描述(源自处理程序的 doc comments)和参数 schema(源自请求 struct 的字段)。

对于不使用 Go Micro 的用户,这一步涉及手动枚举端点并为 LLM 构建一个 {name, description, parameters} 列表。

2. 模型集成与执行

集成 LLM 需要一个与提供商无关的接口。通过使用统一的 ai.Model 接口,开发者可以通过更改单个字符串在 Anthropic、OpenAI、Gemini、Groq、Mistral、Together 或 Atlas Cloud 等提供商之间进行切换。

执行由将工具列表连接到模型来处理。当模型决定调用特定工具(例如 users_Users_Create)时,处理程序会将请求路由到相应的 RPC 并将结果返回给模型。

3. 对话记忆

为了支持后续问题,agent 需要一个消息累加器。一个简单的 History 对象——一个带有 AddMessagesReset 方法的消息切片——可以跟踪用户的提示词 (prompt) 和助手的回复。这些累积的历史记录会在每次后续调用中传回给 LLM,以维持上下文。

4. 执行循环

Agent 的核心逻辑是一个执行以下序列的循环:

  1. 记录提示词:将用户的输入添加到历史记录中。
  2. 调用模型:将提示词、系统指令、工具列表和对话历史发送给 LLM。
  3. 处理回复:打印并记录在历史记录中的助手的初始回复。
  4. 执行工具:模型确定调用哪些工具;处理程序执行它们,并报告结果。
  5. 最终答案:模型根据工具输出生成最终答案,然后将其打印并记录。

为什么实现如此简洁

实现的简洁性是通过三个架构选择实现的:

  • 自描述服务:在代码中使用 doc comments 和 @example 标签允许 LLM 接收使用提示,而无需开发者编写单独的工具 schema。
  • 统一的提供商接口:为多个 LLM 提供商提供单一接口,消除了对特定提供商的粘合代码的需求。
  • 自动执行连接:工具调用与 RPC 分发的连接通过 ai.WithTools(tools) 自动处理,从而消除了手动路由逻辑的需求。

扩展 AI Agent

一旦建立了基础循环,可以通过以下几种增强方式来扩展 agent:

  • 安全性:在执行破坏性工具调用之前添加确认步骤。
  • 可观测性:将每次工具调用记录到审计日志中。
  • 可观测性:过滤工具列表以限制 agent 对特定服务的访问权限。
  • 接口:将 REPL (Read-Eval-Print Loop) 替换为 Slack bot 或通过 micro flow 实现的事件驱动触发器。

Sources