AI Agent 架构设计:从单轮问答到自主任务执行

1 阅读4分钟

AI Agent 架构设计:从单轮问答到自主任务执行

前言

2024-2025 年,AI 应用正从"对话式 AI"向"Agent 式 AI"演进。用户不再满足于问一句答一句,而是期望 AI 能自主规划、调用工具、完成复杂任务

本文将系统梳理 AI Agent 的架构设计,涵盖核心组件、工具调用、记忆机制和多 Agent 协作,结合 MAX AI 在企业场景中的实际落地经验。


1. Agent vs Chatbot:本质区别

维度ChatbotAI Agent
交互模式用户主导,一问一答Agent 主导,自主规划
能力边界只能生成文本可调用工具、访问系统
任务复杂度单步任务多步骤、有依赖的复杂任务
记忆会话级(上下文窗口)长期记忆 + 工作记忆
错误处理用户重新提问自动重试、路径调整

2. 核心架构:ReAct Loop

目前最成熟的 Agent 架构是 ReAct(Reasoning + Acting)循环:

               ┌─────────────────────────────┐
               │                             │
用户指令 → [推理 Reason][行动 Act][观察 Observe] ─┘
               │
               └→ 任务完成 → 返回结果

2.1 TypeScript 实现

interface AgentState {
  goal: string
  history: { thought: string; action: string; observation: string }[]
  tools: Tool[]
  maxSteps: number
}

async function runAgent(state: AgentState): Promise<string> {
  for (let step = 0; step < state.maxSteps; step++) {
    // Step 1: 推理 — LLM 决定下一步做什么
    const decision = await reason(state)

    if (decision.type === 'final_answer') {
      return decision.answer
    }

    // Step 2: 行动 — 调用工具
    const tool = state.tools.find(t => t.name === decision.toolName)
    if (!tool) throw new Error(`Tool not found: ${decision.toolName}`)

    const observation = await tool.execute(decision.toolArgs)

    // Step 3: 记录观察结果
    state.history.push({
      thought: decision.thought,
      action: `${decision.toolName}(${JSON.stringify(decision.toolArgs)})`,
      observation: observation.slice(0, 2000),  // 截断避免上下文爆炸
    })
  }

  return '达到最大步数限制,任务未完成'
}

2.2 推理层:结构化输出

让 LLM 输出结构化的决策,而不是自由文本:

const reasonPrompt = `你是一个任务执行 Agent。根据当前状态,决定下一步行动。

可用工具:
${tools.map(t => `- ${t.name}: ${t.description}`).join('\n')}

请以 JSON 格式输出你的决策:
{
  "thought": "你的思考过程",
  "type": "tool_call" | "final_answer",
  "toolName": "工具名称(type=tool_call时)",
  "toolArgs": { ... },
  "answer": "最终答案(type=final_answer时)"
}`

3. 工具系统设计

3.1 工具定义规范

interface Tool {
  name: string
  description: string        // 给 LLM 看的,要写清楚
  parameters: JSONSchema      // 参数 schema
  execute: (args: any) => Promise<string>
}

// 示例:数据库查询工具
const sqlQueryTool: Tool = {
  name: 'query_database',
  description: '查询企业数据库。可以获取客户信息、订单数据、库存状态等。输入 SQL 查询语句。',
  parameters: {
    type: 'object',
    properties: {
      sql: { type: 'string', description: 'SELECT 查询语句(只读,不允许 INSERT/UPDATE/DELETE)' }
    },
    required: ['sql']
  },
  execute: async (args) => {
    // 安全检查:只允许 SELECT
    if (!/^SELECT/i.test(args.sql.trim())) {
      return 'Error: 只允许 SELECT 查询'
    }
    const result = await db.query(args.sql)
    return JSON.stringify(result.rows.slice(0, 20))
  }
}

3.2 常见企业工具集

工具用途安全等级
query_database查询业务数据中(只读)
search_knowledge搜索知识库
send_email发送邮件高(需审批)
create_ticket创建工单
call_api调用外部 API高(需白名单)
generate_report生成报表

3.3 工具安全:权限分级

enum ToolPermission {
  AUTO = 'auto',           // 直接执行
  CONFIRM = 'confirm',     // 需要用户确认
  ADMIN = 'admin',         // 需要管理员授权
}

async function executeWithPermission(
  tool: Tool & { permission: ToolPermission },
  args: any,
  userId: string
): Promise<string> {
  switch (tool.permission) {
    case ToolPermission.AUTO:
      return tool.execute(args)

    case ToolPermission.CONFIRM:
      const approved = await requestUserConfirmation(userId, tool.name, args)
      if (!approved) return '用户拒绝了此操作'
      return tool.execute(args)

    case ToolPermission.ADMIN:
      throw new Error('需要管理员授权')
  }
}

4. 记忆机制

4.1 三层记忆架构

短期记忆(Working Memory)  ← 当前任务的上下文
   ↕
中期记忆(Session Memory)  ← 本次会话的摘要
   ↕
长期记忆(Long-term Memory) ← 用户偏好、历史决策

4.2 长期记忆实现

interface Memory {
  id: string
  content: string
  type: 'fact' | 'preference' | 'procedure'
  importance: number      // 0-1
  lastAccessed: Date
  accessCount: number
}

// 基于重要性和时间衰减的检索
async function recallMemories(query: string, limit: number = 5): Promise<Memory[]> {
  const candidates = await vectorSearch(query, limit * 3)

  // 综合评分:相关性 × 重要性 × 时间衰减
  return candidates
    .map(m => ({
      ...m,
      finalScore: m.similarity * m.importance * timeDecay(m.lastAccessed)
    }))
    .sort((a, b) => b.finalScore - a.finalScore)
    .slice(0, limit)
}

5. 多 Agent 协作

复杂企业任务往往需要多个专业 Agent 协作:

用户需求 → [路由 Agent][客服 Agent]     → 处理客户问题
                       → [数据 Agent]     → 查询分析数据
                       → [审批 Agent]     → 处理审批流程
                       → [知识库 Agent]   → 检索企业知识

5.1 路由策略

async function routeToAgent(query: string): Promise<string> {
  const classification = await llm.classify(query, [
    { label: 'customer_service', description: '客户咨询、投诉、订单查询' },
    { label: 'data_analysis', description: '数据查询、报表、统计分析' },
    { label: 'knowledge_qa', description: '公司制度、产品知识、技术文档' },
    { label: 'workflow', description: '请假、报销、审批等流程' },
  ])

  return classification.label
}

6. 生产环境注意事项

6.1 成本控制

  • 用便宜模型做路由和简单任务(如 DeepSeek V4)
  • 只有复杂推理才用高端模型
  • 设置 maxSteps 防止无限循环
  • 缓存常见查询的结果

6.2 可观测性

每一步推理和行动都要记录:

interface AgentTrace {
  traceId: string
  steps: {
    timestamp: Date
    thought: string
    action: string
    observation: string
    latencyMs: number
    tokensUsed: number
  }[]
  totalCost: number
  success: boolean
}

6.3 失败处理

  • 工具调用失败 → 重试 1 次,失败则换备选方案
  • LLM 输出格式错误 → 重新 prompt,明确格式要求
  • 超时 → 返回部分结果 + 告知用户

总结

AI Agent 的核心不是某个模型有多强,而是架构设计是否合理:工具系统够不够安全、记忆机制够不够持久、多 Agent 协作够不够流畅。


作者:MAX AI 技术团队 官网: 专注:企业 AI 解决方案 | AI Agent | RAG 知识库 | 业务自动化