作为一名长期奋战在前端开发一线的工程师,当我第一次接触Agent开发时,完全被各种新概念和术语淹没了。和大多数前端开发者一样,我最初的认知也停留在"Agent=大模型API+Prompt优化"的层面。直到真正参与企业级Agent项目后,才发现工程化的Agent开发完全是另一回事。
工程化的Agent开发远不止调用API那么简单。一个完整的Agent系统需要考虑:
以医疗场景为例,一个完整的Agent系统通常包含以下分层架构:
code复制应用层 - 前端界面
↑↓
AI服务层 - Python/RAG
↑↓
业务服务层 - Java微服务
作为前端开发者,我们在Agent项目中可以发挥以下优势:
根据对不同规模企业的调研,Agent开发的技术栈分布如下:
| 公司类型 | 主要技术栈 | 前端开发者切入点 |
|---|---|---|
| 大型企业 | Java+Python+Node.js | Node.js作为BFF层 |
| 中小公司 | Python+Node.js | 全栈Node.js开发 |
| AI创业公司 | Python为主 | AI集成与界面开发 |
前端开发者完全可以在不转Python的情况下,使用Node.js构建Agent系统的关键部分。下面是典型的BFF层实现:
javascript复制const express = require('express');
const { createAgent } = require('@langchain/core');
const app = express();
// Agent编排中心
app.post('/api/agent/medical-triage', async (req, res) => {
const agent = await createMedicalAgent();
const stream = await agent.stream(req.body);
// 流式响应 - 前端友好
res.setHeader('Content-Type', 'text/event-stream');
for await (const chunk of stream) {
res.write(`data: ${JSON.stringify(chunk)}\n\n`);
}
});
// 工具调用代理
app.post('/api/agent/tools', async (req, res) => {
const { toolName, params } = req.body;
if (isFrontendTool(toolName)) {
return res.json({ action: 'frontend', tool: toolName });
} else {
const result = await callBackendService(toolName, params);
return res.json(result);
}
});
对于前端开发者来说,可以这样规划技术栈:
markdown复制# 前端层(舒适区)
- 框架: React/Vue/Next.js/Nuxt.js
- AI集成: Vercel AI SDK/VueUse AI
- 可视化: D3.js/ECharts/React Flow
# BFF层(成长区)
- 运行时: Node.js
- 框架: Express/Fastify/NestJS
- AI框架: LangChain.js/OpenAI SDK
- 数据库: PostgreSQL+Redis+向量数据库
# AI服务层(了解区)
- 语言: Python
- 框架: LangChain/LlamaIndex
- 模型: OpenAI/Claude/国内大模型
任务分解是Agent的核心能力之一。我们可以借鉴前端组件化思维来实现:
javascript复制class TaskPlanner {
async decompose(goal) {
const steps = await llm.analyzeTask(goal);
return this.createWorkflow(steps);
}
createWorkflow(steps) {
return {
id: generateId(),
steps,
currentStep: 0,
status: 'pending',
getNextStep: function() {
return this.steps[this.currentStep++];
}
};
}
}
实现要点:
工具调用是Agent与外界交互的关键。我们可以将现有API包装为Agent工具:
javascript复制class APIToToolAdapter {
constructor(apiConfig) {
this.tools = this.createTools(apiConfig);
}
createTools(apiConfig) {
return apiConfig.endpoints.map(endpoint => ({
name: endpoint.name,
description: endpoint.description,
parameters: endpoint.parameters,
execute: async (args) => {
return await fetch(endpoint.url, {
method: endpoint.method,
body: JSON.stringify(args)
});
}
}));
}
}
注意事项:
Agent需要短期记忆和长期记忆的结合:
typescript复制interface MemorySystem {
shortTerm: ConversationMemory; // 对话上下文
longTerm: VectorMemory; // 向量数据库
cache: RedisCache; // 缓存层
}
class MedicalAgentMemory implements MemorySystem {
private maxContext = 10;
async remember(conversationId: string, query: string) {
const cached = await this.cache.get(conversationId);
if (cached) return cached;
const similarCases = await this.longTerm.search(query);
await this.shortTerm.add(conversationId, query);
return { similarCases, context: this.shortTerm.get(conversationId) };
}
}
优化技巧:
使用有限状态机实现Agent流程控制:
javascript复制class AgentStateMachine {
constructor() {
this.states = {
'idle': this.handleIdle.bind(this),
'processing': this.handleProcessing.bind(this),
'awaiting_input': this.handleAwaitingInput.bind(this),
'executing_tool': this.handleExecutingTool.bind(this),
'completed': this.handleCompleted.bind(this)
};
this.currentState = 'idle';
}
transition(newState, data) {
console.log(`State: ${this.currentState} -> ${newState}`);
this.currentState = newState;
return this.states[newState](data);
}
}
设计考量:
安全是Agent系统不可忽视的部分:
typescript复制class SafetyGuard {
private sensitivePatterns = [/* 敏感词正则 */];
private allowedActions = [/* 许可的操作 */];
async checkInput(input: string): Promise<SafetyResult> {
if (this.containsSensitive(input)) {
return { safe: false, reason: 'sensitive_content' };
}
const intent = await this.analyzeIntent(input);
if (!this.isAllowedIntent(intent)) {
return { safe: false, reason: 'disallowed_intent' };
}
const contextSafe = await this.checkContext(input);
return { safe: contextSafe, reason: contextSafe ? 'passed' : 'context_violation' };
}
}
安全策略:
监控是保障Agent稳定运行的关键:
javascript复制class AgentMonitor {
metrics = {
latency: [],
accuracy: [],
cost: [],
userSatisfaction: []
};
async trackInvocation(agentName, input, output, metadata) {
const record = {
timestamp: Date.now(),
agent: agentName,
inputLength: input.length,
outputLength: output.length,
latency: metadata.latency,
tokenUsage: metadata.tokenUsage
};
await this.storeMetric(record);
if (metadata.latency > 5000) {
this.triggerAlert('high_latency', record);
}
}
}
监控指标:
使用Docker实现Agent系统的容器化部署:
yaml复制version: '3.8'
services:
agent-bff:
build: ./bff
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- OPENAI_API_KEY=${OPENAI_API_KEY}
depends_on:
- redis
- postgres
ai-service:
build: ./ai-service
ports:
- "8000:8000"
vectordb:
image: chromadb/chroma
ports:
- "8001:8000"
redis:
image: redis:alpine
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
部署要点:
第1-2周:建立认知基础
第3-4周:第一个Agent项目
bash复制mkdir my-first-agent && cd my-first-agent
npm init -y
npm install @langchain/core @langchain/openai openai
touch basic-agent.js
实现天气查询Agent:
javascript复制import { ChatOpenAI } from "@langchain/openai";
import { createReactAgent } from "@langchain/langgraph";
const weatherTool = {
name: "get_weather",
description: "获取城市天气",
execute: async ({ city }) => {
return `${city}今天晴天,25°C`;
}
};
const agent = await createReactAgent({
llm: new ChatOpenAI({ model: "gpt-3.5-turbo" }),
tools: [weatherTool]
});
const result = await agent.invoke("北京天气怎么样?");
console.log(result);
第5-8周:完整项目实践
第9-12周:工作流编排
javascript复制import { StateGraph, END } from "@langchain/langgraph";
const workflow = new StateGraph(/*...*/)
.addNode("draft", createDraft)
.addNode("review", reviewDraft)
.addNode("approve", approveDraft)
.addEdge("draft", "review")
.addConditionalEdges(
"review",
(state) => state.needsRevision ? "draft" : "approve"
)
.addEdge("approve", END);
第13-16周:生产级特性
第17-20周:垂直领域实践
第21-24周:毕业项目
前端开发者的现有技能可以这样应用到Agent开发中:
| 前端技能 | Agent开发应用场景 |
|---|---|
| 状态管理 | Agent工作流状态机 |
| 组件化思维 | 可复用Agent模块设计 |
| 用户体验设计 | 多轮对话流程编排 |
| 异步数据处理 | 流式响应处理 |
| 可视化能力 | Agent决策过程展示 |
医疗分诊Agent编排示例:
typescript复制import { StateGraph, END } from "@langchain/langgraph";
interface MedicalState {
symptoms: string[];
severity: "low" | "medium" | "high";
suggestedDepartment?: string;
needsEmergency?: boolean;
}
const workflow = new StateGraph(MedicalState)
.addNode("symptom_collector", collectSymptoms)
.addNode("severity_assessor", assessSeverity)
.addConditionalEdges(
"severity_assessor",
(state) => state.severity === "high" ? "emergency_checker" : "department_recommender"
)
.addEdge("department_recommender", END);
构建前端Agent SDK:
typescript复制class FrontendAgentSDK {
private agent: any;
constructor(options: AgentOptions) {
this.agent = createAgent({
model: options.model,
tools: options.tools
});
}
async* chatStream(message: string) {
const { textStream } = await streamText({
model: this.agent.model,
prompt: message,
onToolCall: (toolCall) => {
this.visualizeToolCall(toolCall);
}
});
for await (const chunk of textStream) {
yield chunk;
}
}
}
桥接前后端工具调用:
typescript复制class ToolCallMiddleware {
constructor(frontendTools, backendTools) {
this.toolRegistry = new Map();
this.registerFrontendTools(frontendTools);
this.registerBackendTools(backendTools);
}
async handleToolCall(toolCall) {
const tool = this.toolRegistry.get(toolCall.name);
if (!tool) throw new Error(`Tool ${toolCall.name} not found`);
const result = await tool.execute(toolCall.arguments);
await this.logToolCall(toolCall, result);
return result;
}
}
医疗多Agent协作实现:
typescript复制class MedicalMultiAgentSystem {
private agents = {
triage: new TriageAgent(),
diagnosis: new DiagnosisAgent(),
referral: new ReferralAgent()
};
async handlePatientCase(patientQuery: string) {
const [triageResult, symptoms] = await Promise.all([
this.agents.triage.assess(patientQuery),
this.extractSymptoms(patientQuery)
]);
if (triageResult.needsEmergency) {
return await this.handleEmergency(symptoms);
}
const diagnosis = await this.agents.diagnosis.analyze(symptoms);
const referral = await this.agents.referral.recommend(diagnosis);
return {
triage: triageResult,
diagnosis,
referral
};
}
}
解决方案:
代码示例:
javascript复制app.post('/chat', async (req, res) => {
res.setHeader('Content-Type', 'text/event-stream');
const stream = await agent.stream(req.body);
for await (const chunk of stream) {
res.write(`data: ${JSON.stringify(chunk)}\n\n`);
}
});
解决方案:
示例配置:
javascript复制const agent = createAgent({
systemPrompt: `你是一个专业的医疗助手,只能回答医疗相关问题...`,
safetyFilters: [
contentFilter,
intentFilter
],
fallbackResponse: "我无法回答这个问题,请咨询专业医生"
});
解决方案:
实现代码:
typescript复制class ContextManager {
private maxTokens = 4000;
async manage(conversationId: string, newMessage: string) {
const history = await this.getHistory(conversationId);
const tokens = countTokens(history + newMessage);
if (tokens > this.maxTokens) {
const summary = await this.summarize(history);
await this.saveSummary(conversationId, summary);
return [summary, newMessage];
}
return [...history, newMessage];
}
}
模型选择策略:
提示词优化:
缓存策略:
并行处理:
javascript复制async function processInParallel(tasks) {
const batches = chunk(tasks, 5); // 分批处理
const results = [];
for (const batch of batches) {
const batchResults = await Promise.all(
batch.map(task => agent.process(task))
);
results.push(...batchResults);
}
return results;
}
数据安全:
权限控制:
内容安全:
系统安全:
bash复制npx create-langchain-app@latest
npx create-next-app --example ai-chatbot
开发环境:
测试工具:
监控方案:
部署平台:
第1周:基础搭建
bash复制npm create vite@latest agent-playground -- --template react-ts
cd agent-playground
npm install ai @ai-sdk/openai
第2周:核心功能
javascript复制// 工具调用实现
class WeatherTool {
execute = async ({ city }) => {
const apiKey = process.env.WEATHER_API_KEY;
const response = await fetch(
`https://api.weatherapi.com/v1/current.json?key=${apiKey}&q=${city}`
);
return response.json();
};
}
第3周:前端集成
javascript复制// 将Agent状态接入Zustand
const useAgentStore = create((set) => ({
state: 'idle',
messages: [],
setState: (state) => set({ state }),
addMessage: (message) => set((prev) => ({
messages: [...prev.messages, message]
}))
}));
第4周:项目交付
bash复制# 部署到Vercel
vercel --prod
# 配置监控
npm install -D @vercel/analytics
短期(3-6个月):
中期(6-12个月):
长期(1-2年):
在Agent开发的道路上,前端开发者完全不必妄自菲薄。我们的技能组合在这个新领域中有着独特的用武之地。从今天开始,选择一个具体的业务问题,用Agent的思路去解决它,每一步实践都会成为你未来的竞争优势。