在实际技术转型和职业发展中,前端开发者向 AI Agent 开发领域拓展已成为一个明确的趋势。这并非因为追逐热点,而是因为前端工程师在构建交互界面、处理异步逻辑和理解用户意图方面的经验,与构建具备感知、决策和行动能力的智能体(Agent)存在天然的契合点。一个典型的 AI Agent 需要理解自然语言指令、调用工具、管理状态并与环境交互,这些环节的实现离不开扎实的工程能力。本文将带你从零开始,构建一个由前端技术栈驱动的 AI Agent 原型,你将使用 TypeScript 确保类型安全,利用 Node.js 作为运行时环境,并通过 LangChain 框架来集成大语言模型(LLM)和工具调用能力。我们不会空谈概念,而是通过一个可运行的“天气查询助手”Agent 项目,串联起环境搭建、核心概念理解、代码实现、运行调试到生产部署的完整链路。完成本文的实践后,你将能清晰地回答:一个 AI Agent 由哪些核心组件构成?如何用 TypeScript 和 Node.js 搭建其骨架?LangChain 如何简化 Agent 的开发流程?以及,在将此类应用部署到服务器时,前端出身的开发者需要特别注意哪些坑?
1. 理解 AI Agent 的核心架构与前端技术的结合点
在开始写代码之前,必须厘清几个核心概念。AI Agent 不是一个单一的函数或模型,而是一个具备自主性的系统。它通常包含感知(Perception)、规划(Planning)、行动(Action)和记忆(Memory)等模块。对于前端开发者而言,可以将其类比为一个复杂的、状态驱动的 UI 组件:它接收用户输入(感知),根据内部状态和规则决定下一步做什么(规划),执行具体的操作如调用 API 或更新数据库(行动),并记住之前的交互历史(记忆)。
1.1 为什么 TypeScript 和 Node.js 是理想的技术栈?
TypeScript 的静态类型系统对于构建复杂的 Agent 逻辑至关重要。Agent 内部的数据流(如 LLM 的输入输出、工具调用的参数、记忆存储的结构)如果缺乏类型约束,调试将异常困难。TypeScript 能在编码阶段就捕获大量的潜在错误,例如工具函数返回了不符合预期的数据类型。Node.js 则提供了非阻塞 I/O 和强大的包生态系统(npm),非常适合处理 Agent 所需的各种异步操作,如并发调用多个外部 API、读写文件或数据库。此外,你熟悉的 Express、Fastify 等 Web 框架,可以轻松地将你的 Agent 封装成 HTTP 服务,供前端界面调用。
1.2 LangChain 扮演了什么角色?
LangChain 是一个用于开发由语言模型驱动的应用程序的框架。它抽象了与不同 LLM(如 OpenAI GPT、Anthropic Claude)交互的复杂性,提供了构建链(Chains)和智能体(Agents)的高层接口。对于初学者,LangChain 最大的价值在于它预置了多种 Agent 类型(如 ReAct、Conversational),并标准化了“工具(Tool)”的定义和调用方式。你可以将其视为一套提供了常用“轮子”的 SDK,让你能更专注于 Agent 的业务逻辑,而不是从头实现与 LLM 的通信协议和结果解析。
1.3 一个最小 Agent 的工作流程
为了建立直观认识,我们描绘一个查询天气的 Agent 的工作流程:
- 输入:用户提问:“北京今天天气怎么样?”
- 感知与理解:Agent 通过 LangChain 将问题格式化后发送给 LLM。
- 规划:LLM 分析问题,判断需要调用“获取天气”这个工具。
- 行动:Agent 执行“获取天气”工具函数,传入解析出的参数(城市:“北京”)。
- 观察与再规划:工具返回真实的天气数据。Agent 将工具执行结果再次提交给 LLM。
- 输出:LLM 根据天气数据生成一段人性化的回复,如“北京今天晴,气温 15-25°C。”
- 记忆:此次对话的上下文(可能包含城市、日期)被存入记忆系统,供后续对话参考。
我们的项目就将实现这个流程。
2. 环境准备与项目初始化
我们将创建一个名为weather-agent的 Node.js 项目。请确保你的开发环境满足以下要求。
2.1 环境与工具清单
| 项目 | 要求 | 检查命令 | 说明 |
|---|---|---|---|
| Node.js | LTS 版本 (如 18.x, 20.x) | node --version | 避免使用奇数版本或过新的预览版,以确保依赖兼容性。 |
| npm | 通常随 Node.js 安装 | npm --version | 用于管理项目依赖。 |
| 代码编辑器 | VS Code (推荐) | - | 确保安装 TypeScript 和 ESLint 插件以获得最佳体验。 |
| API 密钥 | OpenAI 或兼容 LLM 服务的密钥 | - | 本文以 OpenAI GPT-3.5/4 为例,你需要准备一个有效的OPENAI_API_KEY。 |
注意:如果你在安装 Node.js 时遇到类似
error installing 24.19.0: node.js v24.19.0 is not yet released的错误,说明你尝试安装了一个尚未发布或不可用的版本。请访问 Node.js 官网下载稳定的 LTS 版本。
2.2 初始化项目并安装核心依赖
打开终端,执行以下命令创建项目并安装必要的包。
# 创建项目目录并进入 mkdir weather-agent cd weather-agent # 初始化 npm 项目,生成 package.json npm init -y # 安装 TypeScript 及相关开发依赖 npm install -D typescript ts-node @types/node # 安装 LangChain 核心库及 OpenAI 集成 npm install langchain @langchain/openai # 安装用于发送 HTTP 请求的库(用于实现天气工具) npm install axios接下来,初始化 TypeScript 配置。这会在项目根目录生成tsconfig.json文件。
npx tsc --init我们需要修改这个配置文件,以适配现代 Node.js 和我们的开发习惯。打开tsconfig.json,确保或修改以下关键配置:
{ "compilerOptions": { "target": "ES2022", "module": "commonjs", "lib": ["ES2022"], "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true }, "include": ["src/**/*"], "exclude": ["node_modules", "dist"] }关键配置解释:
"target": "ES2022":编译输出的 JavaScript 语法版本。ES2022 在 Node.js 18+ 上得到良好支持。"module": "commonjs":Node.js 环境的标准模块系统。"outDir": "./dist"和"rootDir": "./src":源代码放在src目录,编译后的 JS 文件输出到dist目录,保持项目结构清晰。"strict": true:启用所有严格的类型检查选项,这是 TypeScript 的核心价值所在。"skipLibCheck": true:跳过对第三方库类型定义的检查,可以加快编译速度。
2.3 项目结构规划
在项目根目录创建src文件夹,并在其中创建以下文件。这是典型的分层结构,便于维护。
weather-agent/ ├── node_modules/ ├── src/ │ ├── tools/ # 工具函数目录 │ │ └── weather.ts │ ├── agents/ # Agent 定义目录 │ │ └── weatherAgent.ts │ ├── index.ts # 应用主入口 │ └── types.ts # 全局类型定义(可选) ├── .env # 环境变量文件(需自行创建,不要提交到git) ├── package.json ├── tsconfig.json └── README.md3. 构建核心组件:工具、Agent 与记忆
我们将自底向上地构建 Agent。首先实现它所能使用的“工具”,然后定义 Agent 本身,最后为其添加记忆能力。
3.1 实现天气查询工具
在src/tools/weather.ts中,我们创建一个工具函数。这个函数将被 Agent 调用,用于获取真实天气数据。这里我们使用一个免费的天气 API 作为示例。
// src/tools/weather.ts import axios from 'axios'; import { Tool } from '@langchain/core/tools'; import { z } from 'zod'; // LangChain 推荐使用 zod 进行参数验证 // 定义工具输入参数的 schema const weatherInputSchema = z.object({ city: z.string().describe('The name of the city to get the weather for, e.g. "Beijing"'), }); // 定义工具类,继承自 LangChain 的 StructuredTool export class WeatherTool extends Tool { name = 'get_current_weather'; description = 'Get the current weather in a given city. Input should be a city name.'; schema = weatherInputSchema; // 这是工具的核心执行逻辑 protected async _call(arg: z.infer<typeof weatherInputSchema>): Promise<string> { const { city } = arg; // 在实际项目中,你应该使用更稳定、有权限的天气 API,并妥善处理 API Key。 const apiUrl = `https://wttr.in/${encodeURIComponent(city)}?format=j1`; try { const response = await axios.get(apiUrl); const data = response.data; // 简化处理,从 API 响应中提取关键信息 const currentCondition = data.current_condition[0]; const weatherDesc = currentCondition.weatherDesc[0].value; const tempC = currentCondition.temp_C; const humidity = currentCondition.humidity; return `The current weather in ${city} is ${weatherDesc}, with a temperature of ${tempC}°C and humidity of ${humidity}%.`; } catch (error) { // 良好的错误处理对于 Agent 的稳定性至关重要 console.error(`Failed to fetch weather for ${city}:`, error); return `Sorry, I couldn't retrieve the weather for ${city} at the moment. Please check the city name or try again later.`; } } }代码详解:
- 继承
Tool类:LangChain 的工具需要继承其Tool基类,并实现_call方法。 - 定义
name和description:这两个属性至关重要。LLM 会根据description来判断在什么情况下调用此工具。name是工具的唯一标识。 - 使用
zod定义参数模式:schema属性使用zod对象精确描述了工具需要的参数(这里是一个city字符串)。LLM 会尝试从用户问题中提取符合此模式的信息。 - 实现
_call方法:这是工具的执行体。我们使用axios调用一个公共天气 API,解析响应,并返回一个格式化的字符串结果。这个结果将被反馈给 LLM,用于生成最终回答。 - 错误处理:在
catch块中返回友好的错误信息,而不是抛出异常,可以防止整个 Agent 因单个工具调用失败而崩溃。
3.2 创建天气查询 Agent
接下来,在src/agents/weatherAgent.ts中,我们将工具和 LLM 组装成一个可运行的 Agent。
// src/agents/weatherAgent.ts import { ChatOpenAI } from '@langchain/openai'; import { AgentExecutor, createReactAgent } from 'langchain/agents'; import { WeatherTool } from '../tools/weather.js'; import { ChatPromptTemplate } from '@langchain/core/prompts'; // 从环境变量读取 API 密钥 import * as dotenv from 'dotenv'; dotenv.config(); export async function createWeatherAgent() { // 1. 初始化 LLM // 确保你的 .env 文件中有 OPENAI_API_KEY const llm = new ChatOpenAI({ modelName: 'gpt-3.5-turbo', // 或 'gpt-4' temperature: 0, // 降低随机性,使 Agent 行为更确定 openAIApiKey: process.env.OPENAI_API_KEY, }); // 2. 初始化工具列表 const tools = [new WeatherTool()]; // 3. 定义系统提示词,指导 Agent 的行为 const prompt = ChatPromptTemplate.fromMessages([ ['system', `You are a helpful weather assistant. Your goal is to provide accurate and concise weather information. You have access to a tool to get real-time weather data. If the user asks about the weather in a city, use the tool. If the user asks about anything else, politely decline and state that you can only help with weather queries. Always respond in the language the user used.`], ['placeholder', '{chat_history}'], // 为对话历史占位 ['human', '{input}'], ['placeholder', '{agent_scratchpad}'], // 为 Agent 的思考过程占位 ]); // 4. 使用 ReAct 框架创建 Agent const agent = await createReactAgent({ llm, tools, prompt, }); // 5. 创建 Agent 执行器,它封装了运行循环 const agentExecutor = new AgentExecutor({ agent, tools, // 设置为 true 可以在控制台看到详细的思考步骤,便于调试 verbose: process.env.NODE_ENV !== 'production', // 限制最大执行步骤,防止死循环 maxIterations: 5, }); return agentExecutor; }关键点解析:
- LLM 初始化:我们使用
ChatOpenAI类。temperature设置为 0 可以减少回答的随机性,对于执行确定任务的 Agent 更合适。 - 工具集成:将之前定义的
WeatherTool实例放入一个数组。一个 Agent 可以拥有多个工具。 - 提示词工程:系统提示词(System Prompt)是 Agent 的“人格”和“行为准则”设定。这里明确规定了它的角色、能力边界和响应语言。
{chat_history}和{agent_scratchpad}是 LangChain 提供的占位符,用于注入记忆和中间步骤。 - Agent 类型:
createReactAgent创建了一个基于 ReAct(Reasoning + Acting)框架的 Agent。这是最经典、最通用的 Agent 类型之一,它鼓励 LLM 以“思考 -> 行动 -> 观察”的循环来解决问题。 - AgentExecutor:这是实际运行 Agent 的引擎。它负责管理 LLM 与工具的交互循环,直到满足停止条件(如达到最大迭代次数
maxIterations或 LLM 输出最终答案)。verbose模式在开发时非常有用。
3.3 添加简单的对话记忆
没有记忆的 Agent 每次对话都是独立的,这不符合助手类应用的预期。我们来添加一个简单的内存机制。LangChain 提供了多种记忆后端,这里使用最简单的BufferMemory,它在内存中保存最近的对话。
修改src/agents/weatherAgent.ts,引入记忆:
// 在文件顶部添加导入 import { BufferMemory } from 'langchain/memory'; // 修改 createWeatherAgent 函数 export async function createWeatherAgent() { const llm = new ChatOpenAI({...}); // 同上 const tools = [new WeatherTool()]; // 创建记忆实例,保存最近的 5 轮对话 const memory = new BufferMemory({ memoryKey: 'chat_history', returnMessages: true, // 返回消息对象而非字符串 k: 5, // 保留最近 K 轮对话 }); const prompt = ChatPromptTemplate.fromMessages([ ['system', `...`], // 同上 // 提示词模板会自动从 memory 中获取 'chat_history' 键的值并填充 ['human', '{input}'], ['placeholder', '{agent_scratchpad}'], ]); const agent = await createReactAgent({ llm, tools, prompt, }); const agentExecutor = new AgentExecutor({ agent, tools, memory, // 将 memory 注入执行器 verbose: process.env.NODE_ENV !== 'production', maxIterations: 5, }); return agentExecutor; }现在,你的 Agent 已经具备了短期对话记忆。例如,如果你先问“北京天气如何?”,再问“那上海呢?”,Agent 能理解“那”指的是上一轮对话的上下文,并正确调用上海天气的工具。
4. 编写主程序并运行测试
4.1 创建环境变量文件与主入口
在项目根目录创建.env文件,并填入你的 OpenAI API Key。务必确保此文件被添加到.gitignore中,不要提交到版本库。
# .env OPENAI_API_KEY=sk-your-actual-openai-api-key-here NODE_ENV=development接下来,创建应用的主入口文件src/index.ts:
// src/index.ts import { createWeatherAgent } from './agents/weatherAgent.js'; import * as readline from 'node:readline/promises'; import { stdin as input, stdout as output } from 'node:process'; async function main() { console.log('Initializing Weather Agent...'); const agent = await createWeatherAgent(); console.log('Weather Agent is ready! Type your question (or type "exit" to quit).\n'); // 创建命令行交互界面 const rl = readline.createInterface({ input, output }); while (true) { const userInput = await rl.question('You: '); if (userInput.toLowerCase() === 'exit') { console.log('Goodbye!'); break; } if (!userInput.trim()) { continue; } try { // 调用 Agent 执行器 const result = await agent.invoke({ input: userInput, }); console.log(`\nAgent: ${result.output}\n`); } catch (error) { console.error('\nAn error occurred during agent execution:', error); console.log('Please try again.\n'); } } rl.close(); } // 启动程序,并处理未捕获的异常 main().catch((error) => { console.error('Fatal error during application startup:', error); process.exit(1); });4.2 运行与测试
首先,确保你的.env文件已正确配置。然后,在package.json的scripts部分添加启动命令:
// package.json { "scripts": { "dev": "NODE_ENV=development ts-node src/index.ts", "build": "tsc", "start": "node dist/index.js" } }现在,在终端运行以下命令启动你的 AI Agent:
npm run dev如果一切顺利,你将看到提示符You:。尝试进行以下对话来测试 Agent 的完整能力:
You: What's the weather like in London? Agent: (调用天气工具,并返回伦敦的天气信息) You: 那巴黎呢? Agent: (应能理解中文,并调用巴黎的天气工具) You: Can you tell me a joke? Agent: (根据系统提示词,应礼貌拒绝,并说明自己只处理天气查询)运行成功的关键检查点:
- 程序正常启动,无报错。
- 输入英文城市名,能返回结构化的天气信息。
- 在英文对话后输入中文“那巴黎呢?”,Agent 能正确识别意图并查询巴黎天气(这依赖于 LLM 的多语言能力和记忆功能)。
- 询问非天气问题,Agent 能根据系统提示进行拒绝。
5. 部署到服务器:前端开发者需要关注的要点
将 Node.js 应用部署到服务器,与部署静态前端资源有显著不同。以下是需要特别注意的环节。
5.1 生产环境配置与安全
- 环境变量管理:绝不能在代码中硬编码 API Key。使用
.env文件(开发环境)和服务器环境变量(生产环境)来管理。可以考虑使用dotenv在生产环境也加载特定文件,但更推荐使用 Docker 的--env-file或云平台提供的密钥管理服务。 - 依赖安装:在服务器上运行
npm ci而不是npm install。npm ci会严格根据package-lock.json安装依赖,确保环境一致性。 - TypeScript 编译:生产环境应运行编译后的 JavaScript。在服务器构建步骤中执行
npm run build,然后使用npm start来启动dist/index.js。 - 进程管理:使用
pm2、systemd或 Docker 来管理 Node.js 进程,实现崩溃自动重启、日志轮转和负载均衡。
一个简单的pm2启动配置ecosystem.config.js:
module.exports = { apps: [{ name: 'weather-agent', script: 'dist/index.js', instances: 1, // 根据 CPU 核心数调整 exec_mode: 'fork', env: { NODE_ENV: 'production', OPENAI_API_KEY: process.env.OPENAI_API_KEY, // 从系统环境变量读取 }, log_date_format: 'YYYY-MM-DD HH:mm:ss', error_file: 'logs/err.log', out_file: 'logs/out.log', }] };5.2 日志与监控
Agent 应用的日志至关重要,尤其是verbose模式下的思考链(Chain-of-Thought)日志,它们是排查 Agent 决策错误的核心依据。
- 结构化日志:使用
winston或pino库替代console.log,将日志输出为 JSON 格式,便于后续接入 ELK(Elasticsearch, Logstash, Kibana)等日志系统。 - 关键信息记录:务必记录每次调用的用户输入、Agent 的最终输出、调用了哪些工具及其参数、工具执行结果、消耗的 Token 数量以及总耗时。
- 监控:监控服务器的 CPU、内存使用率,以及应用层面的指标,如每秒请求数、平均响应时间、工具调用失败率。
5.3 性能与成本优化
- LLM 调用延迟:这是主要的性能瓶颈。考虑以下策略:
- 缓存:对相同或相似的查询结果进行缓存(例如,天气数据可以缓存 10 分钟)。
- 流式响应:如果前端支持,使用 LangChain 的流式输出接口,让用户能更快地看到部分结果。
- 模型选型:在精度允许的情况下,使用更小、更快的模型(如
gpt-3.5-turbo而非gpt-4)。
- Token 成本:Agent 的 ReAct 过程会产生多次 LLM 调用,消耗大量 Token。
- 精简提示词:优化系统提示词,去除冗余描述。
- 限制对话轮数:通过记忆的
k参数限制上下文长度,避免历史对话无限增长。 - 设置预算告警:在 OpenAI 后台设置使用量预算和告警。
5.4 构建 HTTP API 服务
为了让前端或其他服务调用,你需要将命令行应用改造为 HTTP 服务。使用 Express 框架可以快速实现。
安装 Express 和类型定义:
npm install express npm install -D @types/express创建src/server.ts:
import express from 'express'; import { createWeatherAgent } from './agents/weatherAgent.js'; import * as dotenv from 'dotenv'; dotenv.config(); const app = express(); const port = process.env.PORT || 3000; // 中间件:解析 JSON 请求体 app.use(express.json()); // 全局缓存一个 Agent 实例(注意:这会导致所有用户共享记忆) // 对于多用户场景,需要为每个会话创建独立的 Agent 和 Memory 实例。 let agentExecutor: Awaited<ReturnType<typeof createWeatherAgent>>; (async () => { agentExecutor = await createWeatherAgent(); console.log('Agent initialized and ready.'); })(); app.post('/api/chat', async (req, res) => { const { message, sessionId } = req.body; // 可以通过 sessionId 来区分用户会话 if (!message || typeof message !== 'string') { return res.status(400).json({ error: 'Invalid request: message is required and must be a string.' }); } if (!agentExecutor) { return res.status(503).json({ error: 'Agent is not ready yet.' }); } try { // 注意:此处的 agentExecutor 是全局的,记忆也是全局的。 // 生产环境需要根据 sessionId 来获取或创建独立的 Agent 实例。 const result = await agentExecutor.invoke({ input: message, // 可以在这里传递 sessionId 以关联独立的记忆存储 }); res.json({ response: result.output, // 可以返回更多信息,如工具调用历史 sessionId: sessionId, }); } catch (error) { console.error('API Error:', error); res.status(500).json({ error: 'An internal error occurred while processing your request.' }); } }); app.listen(port, () => { console.log(`Weather Agent API server listening on port ${port}`); });更新package.json的脚本,并运行npm run dev:server启动 API 服务。
6. 常见问题排查与进阶优化
在开发和运行过程中,你可能会遇到以下典型问题。
6.1 问题排查清单
| 问题现象 | 可能原因 | 检查步骤 | 解决方案 |
|---|---|---|---|
启动时报Cannot find module | 1. 依赖未安装。 2. TypeScript 路径配置错误。 3. 运行了 src下的.ts文件而非编译后的.js文件。 | 1. 运行npm list检查依赖。2. 检查 tsconfig.json中的rootDir和outDir。3. 确认启动命令是 ts-node src/index.ts或node dist/index.js。 | 1. 重新安装依赖 (npm ci)。2. 修正 tsconfig.json。3. 使用正确的启动命令和文件路径。 |
| Agent 不调用工具,直接回答 | 1. 工具description描述不清,LLM 无法理解其用途。2. 系统提示词未明确要求使用工具。 3. LLM 的 temperature过高,行为过于随机。 | 1. 检查工具的描述是否清晰、具体。 2. 在 verbose模式下观察 LLM 的思考链,看它是否考虑了工具。3. 将 temperature设为 0 再测试。 | 1. 重写工具描述,使用“Useful for...”、“Call this when...”等句式。 2. 强化系统提示词,如“你必须使用工具来获取真实数据”。 3. 降低 temperature。 |
| 工具调用失败(如 404) | 1. 工具函数内部 API 调用错误。 2. 网络问题或 API 服务不可用。 3. 参数格式错误。 | 1. 在工具函数内部添加详细的try-catch和日志。2. 使用 curl或 Postman 手动测试工具调用的 API。3. 检查 LLM 传递给工具的参数字符串是否符合 schema。 | 1. 修复工具函数内的错误逻辑或 URL。 2. 实现重试机制和更优雅的降级处理。 3. 调整 schema或提示词,引导 LLM 输出更规范的参数。 |
| 记忆功能失效 | 1.memoryKey与提示词中的占位符名称不匹配。2. BufferMemory的returnMessages设置与提示词期望不匹配。3. Agent 实例被重复创建,记忆未保存。 | 1. 检查memoryKey和提示词中的{chat_history}是否一致。2. 尝试将 returnMessages设为false。3. 确保在对话循环中复用的是同一个 agentExecutor实例。 | 1. 统一memoryKey和提示词占位符的名称。2. 根据提示词模板的要求调整 returnMessages。3. 在应用生命周期内保持 Agent 实例的单例性(HTTP 服务中需按会话区分)。 |
| 部署后 API 无响应 | 1. 服务器防火墙端口未开放。 2. 进程崩溃未重启。 3. 环境变量未正确注入。 | 1. 使用netstat -tlnp检查进程是否在监听端口。2. 检查 pm2或systemd的进程状态和日志。3. 在启动脚本中打印关键环境变量(注意安全)或通过管理平台检查。 | 1. 配置服务器安全组/防火墙规则。 2. 配置进程管理工具自动重启。 3. 确保生产环境变量通过正确方式设置。 |
6.2 进阶优化方向
当你的基础 Agent 跑通后,可以考虑以下方向进行深化:
- 复杂工具与编排:实现更多工具,如查询股票、发送邮件、操作数据库。学习使用
LangGraph来编排具有复杂循环、分支和状态管理的 Agent 工作流。这与前端的状态管理(如 Redux)有异曲同工之妙。 - 向量化记忆与检索:当对话历史很长时,
BufferMemory会消耗大量 Token 且可能丢失关键信息。可以集成向量数据库(如Chroma、Pinecone),将历史对话向量化存储,并在需要时进行语义检索,只召回最相关的片段注入上下文。 - 前端集成:构建一个 React/Vue 前端界面,通过我们创建的 HTTP API 与 Agent 交互。实现流式响应(Server-Sent Events 或 WebSocket)以获得更流畅的聊天体验。处理大文件上传时,前端可以使用
Worker进行分片上传,后端提供相应的上传接口,Agent 可以调用工具来分析上传的文件内容。 - 评估与测试:建立 Agent 的评估体系。如何判断它的回答是准确的?可以编写自动化测试,给定一系列标准问题,验证其回答是否包含关键信息、是否正确调用了工具。
从前端转型 AI Agent 开发,核心优势在于你对交互逻辑、异步处理和工程化的深刻理解。这个“天气查询助手”项目是一个完整的起点,它涵盖了从本地开发到服务部署的核心流程。真正的挑战在于,如何将 Agent 无缝集成到更复杂的业务系统中,并确保其行为可靠、可控、可解释。下一步,尝试为你熟悉的业务场景(如客服问答、内容审核、数据查询)设计工具和 Agent,这才是价值所在。