大模型Agent是不是就是各种Prompt的堆叠
大模型 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 的核心是:
- 动态生成执行计划
- 实时调整计划(基于执行结果)
- 依赖管理(类似前端的依赖注入)
- 错误恢复(类似 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,它要能:
- 读取代码变更
- 检查代码风格、潜在 bug、性能问题
- 运行静态分析工具
- 生成详细的审查报告
- 提出改进建议
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 关键收获
通过这个项目,我深刻体会到:
- Prompt 只是接口:就像前端的 props,它只是输入的方式
- 架构才是核心:Agent 的价值在于整体设计,而不是单个 Prompt
- 工具集成是关键:Agent 的能力边界由工具决定
- 记忆让 Agent 进化:没有记忆的 Agent 永远不会变聪明
- 反馈循环很重要:就像前端的 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);
}
}
最佳实践总结
- 分层设计:Prompt、组件、能力层次分明
- 职责单一:每个工具/组件只做一件事
- 错误优雅:永远有 Plan B
- 可观测性:记录关键决策和中间结果
- 成本控制:监控 Token 使用,避免无限循环
- 迭代优化:从简单开始,逐步增加复杂度
七、未来展望: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 的本质是:
- 动态决策系统:能根据情况调整策略
- 工具集成平台:连接各种外部能力
- 状态管理机器:维护上下文和记忆
- 自我进化实体:从经验中学习
Prompt 只是其中的交互接口,是让 LLM 理解我们意图的方式,但绝不是全部。
给前端开发者的建议
如果你也在学习 AI/大模型,我的建议是:
- 不要被概念吓到:Agent 的很多思想,前端早就在用(状态管理、组件化、事件循环)
- 从简单开始:先写好 Prompt,再加工具,最后才考虑复杂的规划和反思
- 重视工程化:错误处理、日志、监控、测试,一个都不能少
- 实践出真知:理论再多,不如动手写一个跑起来
- 拥抱变化:这个领域进展飞快,保持学习
我的实践经验
在英博云平台上部署和运行 Agent 的这段时间,我学到了很多:
- 成本可控:合理设计的 Agent 成本不高(我的代码审查 Agent 每月不到 50 元)
- 价值明显:自动化了大量重复工作,团队效率提升 30%+
- 持续优化:每周都能发现可以改进的地方
- 技术融合:前端技能(异步、状态管理、错误处理)在 Agent 开发中非常有用
如果你对 Agent 开发感兴趣,强烈建议找个云平台(比如英博云)实际动手试试,纸上得来终觉浅。
参考资源
论文和文章
- ReAct: Synergizing Reasoning and Acting in Language Models
- LLM Agents - Prompt Engineering Guide
- AI Agents in 2026: Practical Architecture
- Tool Calling Explained: The Core of AI Agents
开源框架
- LangChain - 全功能 Agent 框架
- LangGraph - 图状态机 Agent
- AutoGPT - 自主 Agent
- ReAct Agent Template
实用工具
- 英博云平台 - AI 模型部署和运行
- Composio - Agent 工具集成
- Prompt Hub - Prompt 管理
关于作者:10 年前端开发经验,目前在探索 AI + 前端的创新应用,所有模型和 Agent 都部署在英博云平台。如果你也在学习 AI,欢迎交流!
声明:本文基于个人学习和实践经验,如有不准确之处,欢迎指正。
Sources:
- LLM Agents | Prompt Engineering Guide
- AI Agents in 2026: Practical Architecture for Tools, Memory, Evals, and Guardrails
- Prompts vs. Workflows vs. Agents: Key Differences
- Tool Calling Explained: The Core of AI Agents (2026 Guide)
- Contrasting Agent Prompts with Standard Prompts
- ReAct agent from scratch with Gemini and LangGraph
- LangChain Agents Documentation
更多推荐
所有评论(0)