大模型 Agent 是不是就是各种 Prompt 的堆叠?

前言:一个前端开发者的困惑

作为一个写了 10 年前端代码的老兵,最近在学习 AI 和大模型的过程中,我遇到了一个让我困惑很久的问题:Agent 到底是什么?它跟我们熟悉的 Prompt Engineering 有什么本质区别?

刚开始接触 Agent 的时候,我看到各种框架里面满屏的系统提示词、角色设定、任务指令,心想:“这不就是把一堆 Prompt 拼起来吗?换个名字叫 Agent,是不是在玩概念?”

直到我真正动手实现了几个 Agent 项目,在英博云平台上部署了一些实际应用,踩过无数坑之后,我才发现:Agent 绝不仅仅是 Prompt 的堆叠,它是一个具有动态决策能力的复杂系统。

今天我想从一个前端开发者的视角,用我们熟悉的概念来类比,深入聊聊这个话题。

一、从前端的角度理解:静态页面 vs 单页应用

在讨论 Agent 之前,让我先用一个前端开发者非常熟悉的类比:

Prompt Engineering ≈ 静态页面

传统的 Prompt Engineering 就像我们写静态 HTML 页面:

// 这就像一个静态的 HTML 模板
const prompt = `
你是一个专业的翻译助手。
请将以下中文翻译成英文:
${userInput}
`;

const response = await callLLM(prompt);

特点:

  • 单次交互:用户输入 → 模型输出,一次完成
  • 预定义流程:所有逻辑都写死在 Prompt 里
  • 无状态:每次调用都是独立的
  • 确定性强:输入相同,流程相同

Agent ≈ 单页应用(SPA)

而 Agent 更像是 React/Vue 构建的单页应用:

// Agent 的核心循环,类似于 React 的事件循环
class SimpleAgent {
  constructor(llm, tools, memory) {
    this.llm = llm;           // 大脑(决策引擎)
    this.tools = tools;       // 可调用的工具集
    this.memory = memory;     // 状态管理
    this.maxIterations = 10;  // 防止无限循环
  }

  async run(task) {
    let iteration = 0;
    let currentState = {
      goal: task,
      history: [],
      completed: false
    };

    // 核心循环:类比 React 的渲染循环
    while (!currentState.completed && iteration < this.maxIterations) {
      // 1. THINK - 决策下一步做什么
      const decision = await this.think(currentState);

      // 2. ACT - 执行动作(可能调用工具)
      const result = await this.act(decision);

      // 3. OBSERVE - 观察结果
      currentState = await this.observe(result, currentState);

      iteration++;
    }

    return currentState.finalAnswer;
  }

  async think(state) {
    // 这里才用到 Prompt,但它只是决策的一部分
    const prompt = this.buildPrompt(state);
    const response = await this.llm.call(prompt);
    return this.parseDecision(response);
  }

  async act(decision) {
    if (decision.useTool) {
      // 调用外部工具(类似 API 调用)
      const tool = this.tools[decision.toolName];
      return await tool.execute(decision.params);
    } else {
      // 直接返回答案
      return { type: 'final_answer', content: decision.answer };
    }
  }

  async observe(result, currentState) {
    // 更新状态(类似 Redux/Vuex)
    this.memory.add({
      action: result.action,
      observation: result.content,
      timestamp: Date.now()
    });

    // 判断是否完成
    if (result.type === 'final_answer') {
      return { ...currentState, completed: true, finalAnswer: result.content };
    }

    return {
      ...currentState,
      history: [...currentState.history, result]
    };
  }

  buildPrompt(state) {
    // Prompt 只是决策的输入,不是全部
    return `
当前目标: ${state.goal}

可用工具:
${this.formatTools()}

历史记录:
${this.formatHistory(state.history)}

请决定下一步要做什么。输出格式:
{
  "thought": "你的思考过程",
  "action": "tool_name 或 final_answer",
  "action_input": "工具参数或最终答案"
}
`;
  }

  formatTools() {
    return Object.keys(this.tools).map(name => {
      const tool = this.tools[name];
      return `- ${name}: ${tool.description}`;
    }).join('\n');
  }

  formatHistory(history) {
    return history.map(h =>
      `Action: ${h.action}\nObservation: ${h.observation}`
    ).join('\n\n');
  }

  parseDecision(response) {
    // 解析 LLM 的输出
    const parsed = JSON.parse(response);
    return {
      thought: parsed.thought,
      useTool: parsed.action !== 'final_answer',
      toolName: parsed.action,
      params: parsed.action_input,
      answer: parsed.action === 'final_answer' ? parsed.action_input : null
    };
  }
}

看到了吗?Prompt 只是 think 方法里的一部分,整个 Agent 的核心是这个 动态循环

二、Agent 的四大核心能力:超越 Prompt 的维度

如果 Agent 只是 Prompt 堆叠,那它应该无法实现以下能力。但事实上,现代 Agent 框架都具备:

2.1 记忆机制(Memory)

这是 Prompt 完全不具备的能力。类比前端的状态管理:

// 类比 Redux Store
class AgentMemory {
  constructor() {
    this.shortTerm = [];      // 短期记忆:当前会话
    this.longTerm = new Map(); // 长期记忆:跨会话持久化
    this.working = {};         // 工作记忆:当前任务的临时状态
  }

  // 短期记忆:类似 useState
  addToShortTerm(interaction) {
    this.shortTerm.push({
      timestamp: Date.now(),
      ...interaction
    });

    // 保持窗口大小(类似 LRU 缓存)
    if (this.shortTerm.length > 20) {
      this.shortTerm.shift();
    }
  }

  // 长期记忆:类似 localStorage + 向量数据库
  async addToLongTerm(key, value, embedding) {
    this.longTerm.set(key, {
      value,
      embedding,
      accessCount: 0,
      lastAccess: Date.now()
    });

    // 持久化到数据库
    await this.persistToVectorDB(key, value, embedding);
  }

  // 检索相关记忆:语义搜索
  async recall(query, topK = 5) {
    const queryEmbedding = await this.getEmbedding(query);

    // 从向量数据库中检索最相关的记忆
    const results = await this.vectorDB.search(queryEmbedding, topK);

    return results.map(r => ({
      content: r.content,
      similarity: r.score,
      timestamp: r.metadata.timestamp
    }));
  }

  // 工作记忆:当前任务的上下文
  updateWorking(key, value) {
    this.working[key] = value;
  }

  getContext() {
    return {
      recent: this.shortTerm.slice(-5),      // 最近 5 条
      relevant: this.getRelevantLongTerm(),  // 相关的长期记忆
      current: this.working                   // 当前工作状态
    };
  }
}

**Prompt 能做到这个吗?**不能。Prompt 是无状态的,每次调用都是新的。而 Agent 的记忆系统:

  • 可以跨对话记住用户偏好
  • 可以从历史错误中学习
  • 可以基于上下文做出更智能的决策

2.2 工具调用(Tool Calling)

这是区分 Agent 和 Prompt 的关键。类比前端的 API 集成:

// 定义工具(类似定义 API 接口)
class ToolRegistry {
  constructor() {
    this.tools = new Map();
  }

  register(name, config) {
    this.tools.set(name, {
      name: config.name,
      description: config.description,
      parameters: config.parameters,  // 类似 TypeScript 接口定义
      execute: config.execute
    });
  }

  get(name) {
    return this.tools.get(name);
  }

  list() {
    return Array.from(this.tools.values()).map(tool => ({
      name: tool.name,
      description: tool.description,
      parameters: tool.parameters
    }));
  }
}

// 注册一些实用工具
const toolRegistry = new ToolRegistry();

// 工具 1:网络搜索
toolRegistry.register('web_search', {
  name: 'web_search',
  description: '在网络上搜索实时信息',
  parameters: {
    query: { type: 'string', description: '搜索关键词' },
    num_results: { type: 'number', description: '返回结果数量', default: 5 }
  },
  execute: async (params) => {
    const response = await fetch(`https://api.search.com/search?q=${params.query}`);
    const data = await response.json();
    return data.results.slice(0, params.num_results);
  }
});

// 工具 2:代码执行(在沙箱中)
toolRegistry.register('execute_code', {
  name: 'execute_code',
  description: '执行 Python 代码并返回结果',
  parameters: {
    code: { type: 'string', description: 'Python 代码' },
    timeout: { type: 'number', description: '超时时间(秒)', default: 30 }
  },
  execute: async (params) => {
    // 在英博云平台的容器中执行代码
    const result = await runInSandbox(params.code, params.timeout);
    return {
      stdout: result.stdout,
      stderr: result.stderr,
      returnCode: result.code
    };
  }
});

// 工具 3:数据库查询
toolRegistry.register('query_database', {
  name: 'query_database',
  description: '查询数据库获取结构化数据',
  parameters: {
    sql: { type: 'string', description: 'SQL 查询语句' }
  },
  execute: async (params) => {
    const db = await connectDatabase();
    const results = await db.query(params.sql);
    return results;
  }
});

关键点:LLM 通过 Prompt 决定是否使用工具、使用哪个工具、传入什么参数,但真正的执行是在外部完成的。

这就像前端的声明式编程:

// Prompt 生成的决策(类比 JSX)
const decision = {
  action: 'web_search',
  params: { query: '2026年 AI Agent 最新进展', num_results: 3 }
};

// Agent 框架执行(类比 React 的 reconciliation)
const tool = toolRegistry.get(decision.action);
const result = await tool.execute(decision.params);

2.3 规划能力(Planning)

优秀的 Agent 能够分解复杂任务,这需要元认知能力。看一个实际例子:

class PlanningAgent extends SimpleAgent {
  async plan(task) {
    // 使用 Chain-of-Thought 生成执行计划
    const planningPrompt = `
任务: ${task}

请分解这个任务为具体的步骤。对于每个步骤:
1. 描述要做什么
2. 需要哪些输入
3. 预期的输出
4. 可能的风险

以 JSON 格式输出:
{
  "steps": [
    {
      "id": 1,
      "description": "...",
      "dependencies": [],
      "tool": "...",
      "inputs": {},
      "expected_output": "...",
      "risks": []
    }
  ]
}
`;

    const response = await this.llm.call(planningPrompt);
    const plan = JSON.parse(response);

    return plan;
  }

  async executeWithPlan(task) {
    // 1. 生成计划
    const plan = await this.plan(task);
    console.log('执行计划:', plan);

    // 2. 按步骤执行
    const results = [];
    for (const step of plan.steps) {
      try {
        console.log(`执行步骤 ${step.id}: ${step.description}`);

        // 检查依赖
        const inputs = this.resolveDependencies(step.dependencies, results);

        // 执行步骤
        const result = await this.executeStep(step, inputs);
        results.push({ stepId: step.id, result });

        // 验证输出
        if (!this.validateOutput(result, step.expected_output)) {
          throw new Error(`步骤 ${step.id} 输出不符合预期`);
        }
      } catch (error) {
        // 错误处理:重新规划
        console.error(`步骤 ${step.id} 失败:`, error);
        const newPlan = await this.replan(plan, step.id, error);
        plan.steps = newPlan.steps;
      }
    }

    return this.synthesizeResults(results);
  }

  async replan(originalPlan, failedStepId, error) {
    // 根据失败重新规划(类似前端的错误边界)
    const replanPrompt = `
原始计划: ${JSON.stringify(originalPlan)}
失败的步骤: ${failedStepId}
错误信息: ${error.message}

请调整计划以绕过这个错误。
`;

    const response = await this.llm.call(replanPrompt);
    return JSON.parse(response);
  }
}

这是纯 Prompt 无法做到的。Planning Agent 的核心是:

  1. 动态生成执行计划
  2. 实时调整计划(基于执行结果)
  3. 依赖管理(类似前端的依赖注入)
  4. 错误恢复(类似 React Error Boundary)

2.4 反思能力(Reflection)

最高级的 Agent 具备自我评估和改进的能力:

class ReflectiveAgent extends PlanningAgent {
  constructor(llm, tools, memory) {
    super(llm, tools, memory);
    this.criticalThinkingEnabled = true;
  }

  async runWithReflection(task, maxRetries = 3) {
    let attempt = 0;
    let bestResult = null;
    let bestScore = 0;

    while (attempt < maxRetries) {
      // 1. 执行任务
      const result = await this.executeWithPlan(task);

      // 2. 自我评估
      const evaluation = await this.evaluate(task, result);

      console.log(`尝试 ${attempt + 1} - 得分: ${evaluation.score}`);
      console.log('评估:', evaluation.feedback);

      // 3. 判断是否足够好
      if (evaluation.score > bestScore) {
        bestScore = evaluation.score;
        bestResult = result;
      }

      if (evaluation.score >= 0.9) {
        console.log('结果满意,停止优化');
        break;
      }

      // 4. 反思并改进
      const improvements = await this.reflect(task, result, evaluation);

      // 5. 将反思结果存入记忆
      this.memory.addToLongTerm('reflection', {
        task,
        attempt,
        result,
        evaluation,
        improvements
      });

      attempt++;
    }

    return bestResult;
  }

  async evaluate(task, result) {
    // 自我评估(类似单元测试)
    const evalPrompt = `
任务: ${task}
执行结果: ${JSON.stringify(result)}

请从以下维度评估结果:
1. 完整性 (0-1):是否完全解决了任务
2. 准确性 (0-1):结果是否准确
3. 效率 (0-1):执行过程是否高效
4. 创新性 (0-1):解决方案是否有创意

输出 JSON:
{
  "completeness": 0.0-1.0,
  "accuracy": 0.0-1.0,
  "efficiency": 0.0-1.0,
  "creativity": 0.0-1.0,
  "score": 0.0-1.0,
  "feedback": "详细反馈"
}
`;

    const response = await this.llm.call(evalPrompt);
    return JSON.parse(response);
  }

  async reflect(task, result, evaluation) {
    // 反思如何改进(元认知)
    const reflectPrompt = `
任务: ${task}
当前结果: ${JSON.stringify(result)}
评估反馈: ${evaluation.feedback}

请分析:
1. 哪些地方做得好?
2. 哪些地方可以改进?
3. 具体的改进建议是什么?
4. 下次遇到类似任务应该注意什么?

输出 JSON:
{
  "strengths": [],
  "weaknesses": [],
  "improvements": [],
  "lessons_learned": []
}
`;

    const response = await this.llm.call(reflectPrompt);
    const reflection = JSON.parse(response);

    // 将经验教训存储到长期记忆
    for (const lesson of reflection.lessons_learned) {
      await this.memory.addToLongTerm(`lesson_${Date.now()}`, lesson);
    }

    return reflection;
  }
}

这个机制类似前端的:

  • A/B 测试:尝试多种方案,选择最优
  • 性能监控:评估执行效果
  • 持续优化:基于反馈改进

**纯 Prompt 能做到吗?**不能。这需要:

  • 多轮迭代
  • 状态保持
  • 历史对比
  • 元认知评估

三、实战案例:构建一个真实的 Agent

让我分享一个我在英博云平台上部署的实际案例:代码审查 Agent

3.1 需求分析

作为前端团队 Leader,我需要一个能自动审查 Pull Request 的 Agent,它要能:

  1. 读取代码变更
  2. 检查代码风格、潜在 bug、性能问题
  3. 运行静态分析工具
  4. 生成详细的审查报告
  5. 提出改进建议

3.2 核心实现

class CodeReviewAgent {
  constructor() {
    this.llm = new LLMClient({
      model: 'claude-3-5-sonnet',
      endpoint: 'https://api.ebcloud.com/v1/chat'  // 英博云平台
    });

    this.tools = this.initializeTools();
    this.memory = new AgentMemory();
    this.knowledgeBase = this.loadCodingStandards();
  }

  initializeTools() {
    return {
      // 工具 1:获取 Git Diff
      git_diff: {
        description: '获取 PR 的代码变更',
        execute: async (prUrl) => {
          const diff = await fetchGitDiff(prUrl);
          return diff;
        }
      },

      // 工具 2:运行 ESLint
      run_eslint: {
        description: '运行 ESLint 检查代码风格',
        execute: async (files) => {
          const results = await runESLint(files);
          return results;
        }
      },

      // 工具 3:运行类型检查
      run_typescript_check: {
        description: '运行 TypeScript 类型检查',
        execute: async (files) => {
          const results = await runTSC(files);
          return results;
        }
      },

      // 工具 4:分析复杂度
      analyze_complexity: {
        description: '分析代码复杂度',
        execute: async (code) => {
          const complexity = await analyzeComplexity(code);
          return complexity;
        }
      },

      // 工具 5:查询历史问题
      query_past_issues: {
        description: '查询过去类似代码的问题',
        execute: async (codePattern) => {
          const similar = await this.memory.recall(codePattern);
          return similar;
        }
      }
    };
  }

  async review(prUrl) {
    console.log(`开始审查 PR: ${prUrl}`);

    // 阶段 1:收集信息
    const context = await this.gatherContext(prUrl);

    // 阶段 2:制定审查计划
    const plan = await this.createReviewPlan(context);

    // 阶段 3:执行审查
    const findings = await this.executeReview(plan, context);

    // 阶段 4:生成报告
    const report = await this.generateReport(findings);

    // 阶段 5:学习本次审查
    await this.learnFromReview(context, findings);

    return report;
  }

  async gatherContext(prUrl) {
    // 使用工具收集上下文
    const diff = await this.tools.git_diff.execute(prUrl);

    // 解析变更
    const changes = this.parseDiff(diff);

    // 查询相关历史
    const history = await this.tools.query_past_issues.execute(
      changes.map(c => c.pattern).join(' ')
    );

    return {
      prUrl,
      changes,
      history,
      teamStandards: this.knowledgeBase
    };
  }

  async createReviewPlan(context) {
    // 让 LLM 生成审查计划
    const prompt = `
你是一个资深的前端代码审查专家。

代码变更信息:
${JSON.stringify(context.changes, null, 2)}

团队编码规范:
${context.teamStandards}

历史类似问题:
${JSON.stringify(context.history, null, 2)}

请制定详细的审查计划,包括:
1. 要检查的关键点
2. 需要使用的工具
3. 审查的优先级
4. 潜在风险点

输出 JSON 格式的计划。
`;

    const response = await this.llm.call(prompt);
    return JSON.parse(response);
  }

  async executeReview(plan, context) {
    const findings = {
      style_issues: [],
      potential_bugs: [],
      performance_issues: [],
      security_concerns: [],
      suggestions: []
    };

    // 按计划执行各项检查
    for (const check of plan.checks) {
      console.log(`执行检查: ${check.name}`);

      if (check.tool) {
        // 使用工具
        const result = await this.tools[check.tool].execute(check.params);
        findings[check.category].push({
          source: 'tool',
          tool: check.tool,
          result
        });
      } else {
        // 使用 LLM 分析
        const analysis = await this.analyzeWithLLM(check, context);
        findings[check.category].push({
          source: 'llm',
          analysis
        });
      }
    }

    return findings;
  }

  async analyzeWithLLM(check, context) {
    const prompt = `
审查要点: ${check.description}

代码:
${context.changes.map(c => c.code).join('\n\n')}

请分析是否存在问题,并给出建议。输出 JSON:
{
  "has_issue": true/false,
  "severity": "low/medium/high/critical",
  "description": "问题描述",
  "location": "文件:行号",
  "suggestion": "改进建议",
  "example": "示例代码(如果适用)"
}
`;

    const response = await this.llm.call(prompt);
    return JSON.parse(response);
  }

  async generateReport(findings) {
    // 聚合所有发现
    const allIssues = [
      ...findings.style_issues,
      ...findings.potential_bugs,
      ...findings.performance_issues,
      ...findings.security_concerns
    ];

    // 按严重程度排序
    allIssues.sort((a, b) => {
      const severity = { critical: 4, high: 3, medium: 2, low: 1 };
      return severity[b.severity] - severity[a.severity];
    });

    // 让 LLM 生成友好的报告
    const prompt = `
请基于以下审查发现,生成一份专业、友好的代码审查报告:

发现的问题:
${JSON.stringify(allIssues, null, 2)}

改进建议:
${JSON.stringify(findings.suggestions, null, 2)}

报告应包括:
1. 总体评价
2. 关键问题列表(按优先级)
3. 详细分析
4. 改进建议
5. 正面反馈(做得好的地方)

用 Markdown 格式输出。
`;

    const report = await this.llm.call(prompt);
    return report;
  }

  async learnFromReview(context, findings) {
    // 将本次审查的经验存入长期记忆
    const patterns = this.extractPatterns(context, findings);

    for (const pattern of patterns) {
      await this.memory.addToLongTerm(
        `pattern_${pattern.type}_${Date.now()}`,
        pattern
      );
    }

    console.log('本次审查的经验已保存到知识库');
  }

  extractPatterns(context, findings) {
    // 提取可复用的模式
    const patterns = [];

    for (const issue of findings.potential_bugs) {
      if (issue.analysis && issue.analysis.has_issue) {
        patterns.push({
          type: 'bug_pattern',
          code_pattern: this.getCodePattern(issue),
          issue_description: issue.analysis.description,
          fix_suggestion: issue.analysis.suggestion
        });
      }
    }

    return patterns;
  }
}

3.3 部署到英博云平台

我把这个 Agent 部署在了英博云平台上,配置如下:

# agent-config.yaml
name: code-review-agent
runtime: nodejs-18
resources:
  cpu: 2
  memory: 4Gi
  gpu: false  # 不需要 GPU

environment:
  NODE_ENV: production
  LLM_ENDPOINT: https://api.ebcloud.com/v1/chat
  VECTOR_DB: redis://redis:6379

triggers:
  - type: webhook
    path: /review
    method: POST
  - type: github
    events:
      - pull_request.opened
      - pull_request.synchronize

scaling:
  min_instances: 1
  max_instances: 5
  target_cpu: 70%

实际效果非常好:

  • 响应时间:平均 30 秒完成一个 PR 的审查
  • 准确率:能发现 85% 以上的实际问题
  • 学习能力:随着审查次数增加,准确率持续提升
  • 成本:每月处理 200+ PR,费用不到 50 元

3.4 关键收获

通过这个项目,我深刻体会到:

  1. Prompt 只是接口:就像前端的 props,它只是输入的方式
  2. 架构才是核心:Agent 的价值在于整体设计,而不是单个 Prompt
  3. 工具集成是关键:Agent 的能力边界由工具决定
  4. 记忆让 Agent 进化:没有记忆的 Agent 永远不会变聪明
  5. 反馈循环很重要:就像前端的 CI/CD,持续改进才能产出价值

四、Agent 的架构分层:一个系统化视角

基于我的学习和实践,我把 Agent 架构总结为五层:

┌─────────────────────────────────────────────┐
│         5. 应用层 (Application)              │
│    具体的业务逻辑、任务执行、用户交互         │
└─────────────────────────────────────────────┘
                     ↓
┌─────────────────────────────────────────────┐
│       4. 能力层 (Capabilities)               │
│  规划 | 反思 | 学习 | 协作 | 创造            │
└─────────────────────────────────────────────┘
                     ↓
┌─────────────────────────────────────────────┐
│       3. 组件层 (Components)                 │
│  记忆 | 工具 | 推理引擎 | 知识库             │
└─────────────────────────────────────────────┘
                     ↓
┌─────────────────────────────────────────────┐
│       2. 交互层 (Interaction)                │
│  Prompt 工程 | 输出解析 | 上下文管理          │
└─────────────────────────────────────────────┘
                     ↓
┌─────────────────────────────────────────────┐
│       1. 基础层 (Foundation)                 │
│        LLM | 向量数据库 | 计算资源            │
└─────────────────────────────────────────────┘

Prompt 只存在于第 2 层,而真正的 Agent 能力在第 3-5 层。

类比前端开发:

Agent 层级 前端类比 说明
应用层 业务组件 具体功能实现
能力层 Hooks/Composables 可复用的逻辑
组件层 UI 组件库 基础组件
交互层 Props/Events 组件通信
基础层 Runtime (浏览器/Node) 底层能力

五、什么时候用 Prompt,什么时候用 Agent?

经过实践,我总结了一个决策树:

function shouldUseAgent(task) {
  // 1. 是否需要多步骤推理?
  if (task.requiresMultipleSteps === false) {
    return { use: 'Prompt', reason: '单次调用即可完成' };
  }

  // 2. 是否需要调用外部工具?
  if (task.requiresTools === false) {
    return { use: 'Prompt', reason: '纯文本处理,无需工具' };
  }

  // 3. 是否需要动态决策?
  if (task.isPredetermined === true) {
    return { use: 'Workflow', reason: '流程固定,用工作流更合适' };
  }

  // 4. 是否需要记忆?
  if (task.requiresMemory === false && task.isOneTime === true) {
    return { use: 'Prompt', reason: '一次性任务,不需要历史' };
  }

  // 5. 是否需要自我改进?
  if (task.requiresLearning === true || task.isRecurring === true) {
    return { use: 'Agent', reason: '需要持续优化的任务' };
  }

  // 默认
  return { use: 'Agent', reason: '复杂任务,建议用 Agent' };
}

// 示例
console.log(shouldUseAgent({
  requiresMultipleSteps: false,
  requiresTools: false,
  isPredetermined: true,
  requiresMemory: false,
  isOneTime: true
}));
// => { use: 'Prompt', reason: '单次调用即可完成' }

console.log(shouldUseAgent({
  requiresMultipleSteps: true,
  requiresTools: true,
  isPredetermined: false,
  requiresMemory: true,
  isOneTime: false,
  requiresLearning: true
}));
// => { use: 'Agent', reason: '需要持续优化的任务' }

实际案例对照

任务 方案 原因
翻译一段文字 Prompt 单次调用,无状态
总结一篇文章 Prompt 纯文本处理
定时发送周报 Workflow 流程固定,可预测
客服机器人 Agent 需要记忆对话历史
代码审查 Agent 需要多工具协作
数据分析报告 Agent 需要多步骤推理
个人助理 Agent 需要学习用户偏好

六、常见误区与最佳实践

误区 1:以为写好 Prompt 就能解决所有问题

错误示例

// ❌ 试图用一个超长 Prompt 做所有事
const superPrompt = `
你是一个全能助手,需要:
1. 理解用户意图
2. 搜索相关信息
3. 分析数据
4. 生成报告
5. 发送邮件
6. 记住用户偏好
7. 学习优化
...(省略 1000 字)
`;

正确做法

// ✅ 用 Agent 架构,每个能力独立
class MultiCapabilityAgent {
  async handleTask(userInput) {
    // 1. 理解意图(Prompt)
    const intent = await this.understandIntent(userInput);

    // 2. 选择合适的能力模块
    const capability = this.selectCapability(intent);

    // 3. 执行(可能涉及多个工具)
    const result = await capability.execute(intent);

    // 4. 学习(更新记忆)
    await this.learn(userInput, result);

    return result;
  }
}

误区 2:过度依赖 LLM 做决策

错误示例

// ❌ 让 LLM 处理所有逻辑,包括简单的条件判断
const prompt = `
如果用户年龄 > 18,返回 "成年人",否则返回 "未成年人"
用户年龄:${age}
`;

正确做法

// ✅ 简单逻辑用代码,复杂推理用 LLM
function categorizeUser(age) {
  // 确定性逻辑:代码处理
  if (age > 18) {
    return 'adult';
  } else {
    return 'minor';
  }
}

async function personalizeContent(user) {
  // 复杂推理:LLM 处理
  const prompt = `
用户画像: ${JSON.stringify(user)}
请推荐 3 个最适合的内容,并说明理由。
`;
  return await llm.call(prompt);
}

误区 3:忽视错误处理和超时控制

错误示例

// ❌ 没有任何保护机制
async function runAgent(task) {
  while (true) {
    const decision = await llm.decide();
    await execute(decision);
  }
}

正确做法

// ✅ 完善的错误处理和退出机制
async function runAgent(task) {
  const maxIterations = 10;
  const timeout = 60000; // 60 秒
  const startTime = Date.now();
  let iteration = 0;

  try {
    while (iteration < maxIterations) {
      // 检查超时
      if (Date.now() - startTime > timeout) {
        throw new Error('Agent execution timeout');
      }

      // 执行步骤
      const decision = await llm.decide();

      // 检查是否完成
      if (decision.type === 'final_answer') {
        return decision.content;
      }

      // 执行动作(带重试)
      const result = await this.executeWithRetry(decision);

      iteration++;
    }

    throw new Error('Max iterations reached');
  } catch (error) {
    // 优雅降级
    console.error('Agent error:', error);
    return this.getFallbackResponse(task, error);
  }
}

最佳实践总结

  1. 分层设计:Prompt、组件、能力层次分明
  2. 职责单一:每个工具/组件只做一件事
  3. 错误优雅:永远有 Plan B
  4. 可观测性:记录关键决策和中间结果
  5. 成本控制:监控 Token 使用,避免无限循环
  6. 迭代优化:从简单开始,逐步增加复杂度

七、未来展望:Agent 的进化方向

基于我的观察和学习,我认为 Agent 会朝这几个方向发展:

7.1 多模态 Agent

不仅处理文本,还能处理图像、音频、视频:

class MultimodalAgent {
  async processInput(input) {
    if (input.type === 'image') {
      const vision = await this.visionModel.analyze(input.data);
      return await this.reasonAbout(vision);
    } else if (input.type === 'audio') {
      const transcript = await this.speechToText(input.data);
      return await this.processText(transcript);
    }
    // ...
  }
}

7.2 多 Agent 协作

就像微服务架构,多个专业 Agent 协同工作:

class AgentOrchestrator {
  constructor() {
    this.agents = {
      researcher: new ResearchAgent(),
      coder: new CodingAgent(),
      reviewer: new ReviewAgent(),
      writer: new WritingAgent()
    };
  }

  async handleComplexTask(task) {
    // 1. 研究 Agent 收集信息
    const research = await this.agents.researcher.run(task);

    // 2. 编码 Agent 实现功能
    const code = await this.agents.coder.run(research);

    // 3. 审查 Agent 检查代码
    const review = await this.agents.reviewer.run(code);

    // 4. 写作 Agent 生成文档
    const docs = await this.agents.writer.run({ code, review });

    return { code, review, docs };
  }
}

7.3 持续学习的 Agent

从用户反馈中学习,不断优化:

class LearningAgent {
  async learnFromFeedback(task, result, userFeedback) {
    if (userFeedback.rating < 3) {
      // 分析失败原因
      const analysis = await this.analyzeFailure(task, result, userFeedback);

      // 更新策略
      await this.updateStrategy(analysis);

      // 重新训练(如果需要)
      await this.finetune(task, userFeedback.expected);
    }

    // 存储为案例
    await this.memory.addCase({
      task,
      result,
      feedback: userFeedback,
      timestamp: Date.now()
    });
  }
}

八、总结:重新理解 Agent

回到最初的问题:Agent 是不是就是 Prompt 的堆叠?

答案很明确:不是。

用一个前端开发者熟悉的类比:

Prompt 之于 Agent,就像 HTML 之于 Web 应用。

  • HTML 是基础,但光有 HTML 做不出复杂应用
  • 你还需要 JavaScript(逻辑)、CSS(表现)、数据库(状态)、API(工具)
  • 最重要的是架构设计和工程化思维

Agent 的本质是:

  1. 动态决策系统:能根据情况调整策略
  2. 工具集成平台:连接各种外部能力
  3. 状态管理机器:维护上下文和记忆
  4. 自我进化实体:从经验中学习

Prompt 只是其中的交互接口,是让 LLM 理解我们意图的方式,但绝不是全部。

给前端开发者的建议

如果你也在学习 AI/大模型,我的建议是:

  1. 不要被概念吓到:Agent 的很多思想,前端早就在用(状态管理、组件化、事件循环)
  2. 从简单开始:先写好 Prompt,再加工具,最后才考虑复杂的规划和反思
  3. 重视工程化:错误处理、日志、监控、测试,一个都不能少
  4. 实践出真知:理论再多,不如动手写一个跑起来
  5. 拥抱变化:这个领域进展飞快,保持学习

我的实践经验

英博云平台上部署和运行 Agent 的这段时间,我学到了很多:

  • 成本可控:合理设计的 Agent 成本不高(我的代码审查 Agent 每月不到 50 元)
  • 价值明显:自动化了大量重复工作,团队效率提升 30%+
  • 持续优化:每周都能发现可以改进的地方
  • 技术融合:前端技能(异步、状态管理、错误处理)在 Agent 开发中非常有用

如果你对 Agent 开发感兴趣,强烈建议找个云平台(比如英博云)实际动手试试,纸上得来终觉浅。

参考资源

论文和文章

开源框架

实用工具


关于作者:10 年前端开发经验,目前在探索 AI + 前端的创新应用,所有模型和 Agent 都部署在英博云平台。如果你也在学习 AI,欢迎交流!

声明:本文基于个人学习和实践经验,如有不准确之处,欢迎指正。

Sources:

更多推荐