从零构建个人AI Agent:Node.js + LangChain + 上下文压缩全流程

前言

原文分享了一个基于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 文档采集与生成

流程

  1. 采集常用脚本:从内部仓库采集最常用的脚本和工具
  2. LLM初步理解:使用大语言模型分析脚本功能,生成结构化文档
  3. 高频词统计:统计脚本中的高频词汇,识别核心功能
  4. 剔除废弃内容:通过分析使用频率和最后更新时间,剔除废弃的脚本
  5. 文档拆分合并:将长文档拆分为小块,相关文档进行合并,便于检索

3.2 RAG查询实现

两种方式纳入RAG

  1. 系统内置字段:将常用命令直接内置到系统提示词中
  2. 文档管理:将完整文档导入向量数据库,通过相似度检索

查询流程

复制代码
用户提问 → 向量化查询 → 检索相关文档 → 组装上下文 → LLM生成回答

四、上下文管理:贯穿始终的关键

上下文管理是Agent开发中最重要的部分之一。作者发现,简单对话就会消耗1/4的token,必须进行有效管理。

4.1 连续对话实现

核心思路 :通过sessionId存储对话历史,每次请求时重新拼装历史消息。

实现流程

  1. 用户发起请求,生成唯一sessionId
  2. 每次对话将消息持久化存储
  3. 下次请求时通过sessionId查询历史消息
  4. 将历史消息与新消息拼装后发送给LLM

4.2 HIFL长连接问题

问题

由于存在HIFL(Human-in-the-Loop)交互,需要维持长连接,但FaaS平台(如阿里云函数计算)不支持长时间保持连接

解决方案:隐藏消息机制

核心思路

  1. Agent调用工具链完成后,不是返回结果,而是返回一条隐藏消息
  2. 这条隐藏消息由用户(实际上是系统)发送,携带上下文信息
  3. 服务端收到隐藏消息后,重新加载历史上下文,继续执行下一个工具链

流程示例

复制代码
用户请求: "部署应用到生产环境"
  ↓
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 核心技术亮点

  1. Node.js全栈开发:一个人独立完成前后端,降低开发成本
  2. LangChain灵活应用:通过链式调用实现复杂AI应用
  3. 提示词工程:角色设定、XML结构、Few Shot三管齐下
  4. RAG文档化:将内部工具文档化,降低使用门槛
  5. 上下文管理:sessionId持久化+隐藏消息机制解决长连接问题
  6. 自动压缩:基于Claude Code逆向工程的智能压缩,降低token消耗

7.2 核心启示

  1. 提示词优化是关键

    Few Shot的核心是"正面举例"而非"负面禁止",引导模型注意力在期望的行为上。

  2. RAG降低AI门槛

    通过将内部工具文档化并纳入RAG,可以让AI理解和使用复杂工具,无需硬编码。

  3. 上下文管理贯穿始终

    简单对话就会消耗大量token,必须通过缓存、检索、压缩等手段管理上下文。

  4. 借鉴逆向工程

    通过研究Claude Code等成熟产品的实现,可以快速了解最佳实践,避免重复造轮子。

  5. 长连接问题的创新解决

    隐藏消息机制巧妙地解决了FaaS平台的长连接限制,值得借鉴。

7.3 未来展望

  1. 多AI协同:不同AI专注不同任务,通过LangChain编排协同工作
  2. 自动提示词生成:根据任务自动生成和优化提示词
  3. 更智能的压缩:基于语义理解的压缩,而非简单的token统计
  4. 跨平台部署:支持云函数、容器、本地部署等多种方式

八、参考资料

原文来源 :阿里云开发者公众号
原文链接https://mp.weixin.qq.com/s/BwSxQX8XWyTKRe_y7OSd6w

相关推荐
安科士andxe2 小时前
深入解析|安科士1.25G CWDM SFP光模块核心技术,破解中长距离传输痛点
服务器·网络·5g
九.九5 小时前
ops-transformer:AI 处理器上的高性能 Transformer 算子库
人工智能·深度学习·transformer
春日见5 小时前
拉取与合并:如何让个人分支既包含你昨天的修改,也包含 develop 最新更新
大数据·人工智能·深度学习·elasticsearch·搜索引擎
恋猫de小郭5 小时前
AI 在提高你工作效率的同时,也一直在增加你的疲惫和焦虑
前端·人工智能·ai编程
YJlio5 小时前
1.7 通过 Sysinternals Live 在线运行工具:不下载也能用的“云端工具箱”
c语言·网络·python·数码相机·ios·django·iphone
deephub5 小时前
Agent Lightning:微软开源的框架无关 Agent 训练方案,LangChain/AutoGen 都能用
人工智能·microsoft·langchain·大语言模型·agent·强化学习
CTRA王大大5 小时前
【网络】FRP实战之frpc全套配置 - fnos飞牛os内网穿透(全网最通俗易懂)
网络
大模型RAG和Agent技术实践5 小时前
从零构建本地AI合同审查系统:架构设计与流式交互实战(完整源代码)
人工智能·交互·智能合同审核
老邋遢5 小时前
第三章-AI知识扫盲看这一篇就够了
人工智能
互联网江湖6 小时前
Seedance2.0炸场:长短视频们“修坝”十年,不如AI放水一天?
人工智能