前言
原文分享了一个基于Node.js的AI Agent全流程开发实践,作者从零构建了一个支持多AI协同的智能助手。文章涵盖了技术栈选择(Node.js + LangChain)、提示词工程优化(角色设定、XML结构、Few Shot)、内部工具RAG文档化、上下文管理与压缩等核心技术点。作者通过实际开发经验,详细讲解了如何解决长对话中的上下文窗口问题,最终实现了上下文压缩至1/10的效果,为个人AI Agent开发提供了完整的参考方案。
一、技术栈选择:Node.js + LangChain
1.1 为什么选择Node.js?
在个人开发中,选择Node.js作为前后端统一语言具有明显优势:
- 技术栈统一:一个人可以独立完成前后端开发,降低学习成本
- 生态丰富:npm生态中有大量AI相关库和工具
- 异步处理能力强:AI调用天然适合异步场景,Node.js的Event Loop模型优势明显
- 部署灵活:可部署在Serverless平台(如阿里云函数计算),降低运维成本
1.2 LangChain简介与对比
LangChain是什么?
LangChain是一个开源的LLM应用开发框架,提供了构建AI应用的标准化组件和抽象。它通过链式调用的方式,将多个LLM调用组合成复杂的AI应用。
核心概念:
- Chains(链):将多个LLM调用或工具调用串联起来
- Agents(代理):让LLM决定使用哪些工具来完成任务
- Memory(记忆):管理对话历史和上下文
- Tools(工具):为LLM提供外部能力(如搜索、计算、API调用)
LangChain vs Dify平台:
| 维度 | LangChain | Dify |
|---|---|---|
| 定位 | 代码级开发框架 | 低代码AI应用平台 |
| 使用方式 | 编写代码 | 可视化拖拽 |
| 灵活性 | 极高,可深度定制 | 中等,受限于平台功能 |
| 学习成本 | 需要编程能力 | 低,零基础可用 |
| 部署方式 | 自托管或云部署 | 平台托管 |
| 适用场景 | 复杂定制化应用 | 快速原型、通用场景 |
选择建议:
- 如果需要深度定制 、复杂逻辑,选择LangChain
- 如果需要快速上线 、可视化调试,选择Dify
二、系统提示词优化:提升Agent理解能力
2.1 角色设定
角色设定是提示词优化的基础,通过明确定义Agent的身份、职责和限制,让模型更好地理解任务。
示例:
你是一个专业的技术文档助手,负责帮助用户查询和理解技术文档。
你的职责:
1. 理解用户的技术问题
2. 检索相关文档
3. 提供准确、简洁的解答
限制:
- 只回答技术相关问题
- 不提供任何有害或不道德的建议
2.2 使用XML结构化提示词
XML标签可以帮助模型更好地理解提示词的结构和重点,提升响应质量。
示例:
xml
<instruction>
请根据以下任务要求执行操作:
</instruction>
<task>
用户需要查询关于Docker容器化的最佳实践。
</task>
<context>
用户是后端开发工程师,熟悉Linux基础操作。
</context>
<output_format>
- 使用Markdown格式
- 提供代码示例
- 列出关键注意事项
</output_format>
优势:
- 结构清晰,便于模型解析
- 可以强调不同部分的重要性
- 便于后续维护和修改
2.3 Few Shot:通过正面举例控制注意力
Few Shot 是提升模型理解能力的关键技术。通过提供正面示例,引导模型的注意力聚焦在期望的行为上。
核心原理 :
根据心理学中的"白熊效应",如果告诉一个人"不要想白熊",他反而会一直想白熊。同理,在提示词中强调"不要做什么"会让模型注意到这些负面行为。相反,通过展示"应该做什么"的正面示例,可以更有效地引导模型。
示例:
以下是如何回答技术问题的示例:
<example>
用户:如何启动一个Docker容器?
回答:使用`docker run`命令启动容器。示例:
docker run -d -p 80:80 --name my-nginx nginx
关键参数说明:
- `-d`: 后台运行
- `-p 80:80`: 端口映射
- `--name`: 容器名称
</example>
现在回答用户的问题:{{user_question}}
注意事项:
- 提供的示例必须是正面案例
- 示例数量适中(3-5个),避免过度消耗token
- 示例要与实际任务高度相关
三、RAG实现:内部工具文档化
对于集团内部的工具,需要额外解释才能使用。作者通过RAG(检索增强生成)将工具文档化,降低使用门槛。
3.1 文档采集与生成
流程:
- 采集常用脚本:从内部仓库采集最常用的脚本和工具
- LLM初步理解:使用大语言模型分析脚本功能,生成结构化文档
- 高频词统计:统计脚本中的高频词汇,识别核心功能
- 剔除废弃内容:通过分析使用频率和最后更新时间,剔除废弃的脚本
- 文档拆分合并:将长文档拆分为小块,相关文档进行合并,便于检索
3.2 RAG查询实现
两种方式纳入RAG:
- 系统内置字段:将常用命令直接内置到系统提示词中
- 文档管理:将完整文档导入向量数据库,通过相似度检索
查询流程:
用户提问 → 向量化查询 → 检索相关文档 → 组装上下文 → LLM生成回答
四、上下文管理:贯穿始终的关键
上下文管理是Agent开发中最重要的部分之一。作者发现,简单对话就会消耗1/4的token,必须进行有效管理。
4.1 连续对话实现
核心思路 :通过sessionId存储对话历史,每次请求时重新拼装历史消息。
实现流程:
- 用户发起请求,生成唯一sessionId
- 每次对话将消息持久化存储
- 下次请求时通过sessionId查询历史消息
- 将历史消息与新消息拼装后发送给LLM
4.2 HIFL长连接问题
问题 :
由于存在HIFL(Human-in-the-Loop)交互,需要维持长连接,但FaaS平台(如阿里云函数计算)不支持长时间保持连接。
解决方案:隐藏消息机制
核心思路:
- Agent调用工具链完成后,不是返回结果,而是返回一条隐藏消息
- 这条隐藏消息由用户(实际上是系统)发送,携带上下文信息
- 服务端收到隐藏消息后,重新加载历史上下文,继续执行下一个工具链
流程示例:
用户请求: "部署应用到生产环境"
↓
Agent思考: 需要调用部署工具
↓
工具1: 构建镜像 → 返回结果
↓
工具2: 推送镜像 → 返回结果
↓
触发隐藏消息: {
type: "hidden",
sessionId: "xxx",
toolChain: "deployment",
step: 2,
nextAction: "deploy_service"
}
↓
服务端接收隐藏消息,加载历史上下文
↓
Agent继续执行下一步: 部署服务
优势:
- 避免了FaaS的长连接限制
- 每次工具链调用都是独立的请求
- 历史上下文已持久化,可以无缝衔接
五、上下文压缩:解决Token消耗
长时间的对话和多轮工具调用会导致上下文窗口过长,必须进行压缩。
5.1 工具调用结果缓存
思路:
- 对工具调用的结果进行缓存
- 后续需要时,通过检索工具查询缓存结果
- 避免重复发送大量工具输出
5.2 压缩效果
通过缓存和检索,作者成功将上下文压缩到了1/10,大幅降低了token消耗。
六、自动上下文压缩
作者参考GitHub上的Claude Code逆向工程,实现了自动上下文压缩机制。
6.1 两个压缩时机
时机1:上下文窗口即将超过限制
- 阈值:80%(例如,上下文窗口128k,达到100k时触发压缩)
时机2:新对话与历史对话无关联
- 判定:新问题与历史问题的相似度低于阈值
6.2 压缩提示词
压缩过程是有损的,必须通过提示词限制,避免压缩后忘记原始目的。
关键限制:
- 保留重要的决策和结论
- 省略重复和无关的对话
- 使用简洁的格式
- 不要丢失任务目标和进度
示例提示词:
请压缩以下对话历史,要求:
1. 保留所有重要的决策点
2. 保留工具调用的关键结果
3. 去除冗余的问候和重复对话
4. 总结当前任务的进度
5. 不要改变原始意图
对话历史:
{{context}}
压缩后的摘要:
七、总结与思考
7.1 核心技术亮点
- Node.js全栈开发:一个人独立完成前后端,降低开发成本
- LangChain灵活应用:通过链式调用实现复杂AI应用
- 提示词工程:角色设定、XML结构、Few Shot三管齐下
- RAG文档化:将内部工具文档化,降低使用门槛
- 上下文管理:sessionId持久化+隐藏消息机制解决长连接问题
- 自动压缩:基于Claude Code逆向工程的智能压缩,降低token消耗
7.2 核心启示
-
提示词优化是关键
Few Shot的核心是"正面举例"而非"负面禁止",引导模型注意力在期望的行为上。
-
RAG降低AI门槛
通过将内部工具文档化并纳入RAG,可以让AI理解和使用复杂工具,无需硬编码。
-
上下文管理贯穿始终
简单对话就会消耗大量token,必须通过缓存、检索、压缩等手段管理上下文。
-
借鉴逆向工程
通过研究Claude Code等成熟产品的实现,可以快速了解最佳实践,避免重复造轮子。
-
长连接问题的创新解决
隐藏消息机制巧妙地解决了FaaS平台的长连接限制,值得借鉴。
7.3 未来展望
- 多AI协同:不同AI专注不同任务,通过LangChain编排协同工作
- 自动提示词生成:根据任务自动生成和优化提示词
- 更智能的压缩:基于语义理解的压缩,而非简单的token统计
- 跨平台部署:支持云函数、容器、本地部署等多种方式
八、参考资料
原文来源 :阿里云开发者公众号
原文链接:https://mp.weixin.qq.com/s/BwSxQX8XWyTKRe_y7OSd6w