Skip to content

feat: RAG experience library — retrieve successful flows as few-shot#5

Merged
ckenkuo merged 2 commits into
mainfrom
feature/rag-experience
Jun 30, 2026
Merged

feat: RAG experience library — retrieve successful flows as few-shot#5
ckenkuo merged 2 commits into
mainfrom
feature/rag-experience

Conversation

@ckenkuo

@ckenkuo ckenkuo commented Jun 30, 2026

Copy link
Copy Markdown
Owner

概述

为 manus-gui 新增 RAG 经验库:把跑通的任务流程沉淀为高层经验,新任务用「用户提示词」检索最相似的成功经验,作为 few-shot 注入 prompt,让 agent 少绕圈、用更少步数完成。整套特性是可配置、可干净下线的旁路增益,关掉开关后对主流程零侵入。

本 PR 含两个提交:

  • feat: RAG 经验库实现(app/experience/ 五件套 + 集成点 + 单测)
  • docs: 验证指南 docs/rag-experience-verification.md

架构

模块 职责
app/experience/embedding.py DashScope text-embedding-v4 向量化,L2 归一化
app/experience/store.py Recipe + RecipeStore:内存权威列表 + jsonl 原子重写 + 重建 Faiss/BM25,asyncio 锁串行化写
app/experience/retriever.py dense(Faiss/numpy)+ sparse(BM25/jieba)→ RRF 融合 → 相关性闸门
app/experience/recorder.py 把成功轨迹压缩转录,LLM 提炼成高层步骤(去噪、抹掉易过期的 DOM index/坐标)
app/experience/__init__.py is_enabled / retrieve_recipes / distill_recipe / format_injection / store 单例

集成接缝:注入在 Manus.run()(agent 层,非交互,跑完恢复 system_prompt 防累积);确认 + 落库在 main.py(CLI 层,交互 [y/N])—— agent 保持纯净不耦合 console。

降级:faiss / rank-bm25 / jieba 任一缺失都不中断,对应通路 best-effort 降级(缺 faiss → numpy 点积;缺 jieba/bm25 → 仅 dense)。

关键设计决策

  • 经验存高层步骤而非原始动作(DOM index/坐标易过期,照搬反误导)。
  • 向量检索 Faiss IndexFlatIP(归一化=余弦);关键词 BM25 + jieba 中文分词;融合 RRF(rrf_k=60,无需归一化/调参)。
  • 相关性下限闸 min_score=0.35,防止给无关任务硬塞经验。
  • 去重:同任务(余弦 > 0.95)留 step_count 更少的那条。
  • 删除难题绕法:IndexFlatIP 不支持 remove_ids,故 C/U/D 全走「整文件重写 + 重建索引」,从不原地删。
  • 写入入口仅「跑完交互确认」;非交互(stdin 非 TTY)跳过保存;日常增删=手编 jsonl(人类可读、可 git diff)。

测试

单元测试(16 例,离线,monkeypatch embed/LLM)

pytest tests/test_experience_store.py tests/test_experience_retriever.py tests/test_experience_recorder.py -v

覆盖 CRUD / 去重 / RRF 融合 / 相关性闸门 / 降级 / 提炼 JSON 解析。

真实端到端验证(2026-06-30 已实跑印证,详见 docs/rag-experience-verification.md

  • 跑「打开 baidu.com 读标题」→ success → [y/N] 确认 → ✅ 经验已保存
  • 落库 recipe 带 1024 维真实向量(证明 dense 通路通,非 BM25 兜底)
  • 重启再跑相似任务「打开 1688.com」→ 经验库已加载:1 条 + 🧠 已注入 1 条历史成功经验
  • 关闭开关(enabled=false)后既不注入也不弹保存询问、无报错 —— 可干净下线

关闭方式

[experience]
enabled = false

运行时数据 experience/recipes.jsonl 已被 .gitignore 忽略,不入库。

ckenkuo added 2 commits June 29, 2026 18:17
把跑通的任务流程沉淀成经验库;新任务用「用户提示词」做混合检索
(dense 向量 + BM25 关键词 → RRF 融合 → 相关性闸门),把最相似的成功
经验作为 few-shot 注入 system_prompt,让 agent 少绕圈、用更少步数完成。

新增 app/experience/ 五件套:
- embedding.py: DashScope text-embedding-v4 + L2 归一化
- store.py: Recipe + RecipeStore(jsonl 唯一真相源 + os.replace 原子重写 +
  重建 Faiss IndexFlatIP/BM25 + asyncio 锁 + numpy 余弦去重,同任务留步数少的)
- retriever.py: dense+BM25 → RRF → 相关性闸门 + 降级(dense 失败仅 BM25)
- recorder.py: 轨迹压缩转录 + distill prompt(步骤泛化+本例括注、踩坑对策走
  独立 tips)+ 程序化补全 tools_used/step_count
- __init__.py: is_enabled/retrieve_recipes/distill_recipe/format_injection/store

接线:
- app/agent/manus.py: 覆写 run() 注入经验(跑完恢复 system_prompt 防累积);
  覆写 _handle_special_tool 捕获 terminate 状态
- main.py: 跑完交互确认入口(success 才弹 [y/N],非 TTY 跳过保存)
- app/config.py: ExperienceSettings;config.example.toml: [experience] 段
- requirements.txt: faiss-cpu / rank-bm25 / jieba
- .gitignore: 锚定 /experience/ 仅忽略根级运行时数据,不波及 app/experience/

测试:tests/test_experience_{store,retriever,recorder}.py(16 例,离线可跑)
四层验证:环境自检 / 离线冒烟 / 真实端到端(注入+落库)/ 关闭开关回归。
含可直接运行的离线冒烟脚本与七条判定速查表。
2026-06-30 真实运行已印证:1024 维向量落库、相似任务命中注入、闸门拦截无关任务。
@ckenkuo
ckenkuo merged commit c163355 into main Jun 30, 2026
2 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant