韦建生
AI 应用主线项目

合同条款助手 · 生产级 RAG 知识库问答

答案里每个事实性陈述都能点回合同原文做字符级高亮验证的 RAG 问答系统,检索全程可观测。

角色
独立设计开发
周期
2026.07 - 至今
状态
M1 可信问答闭环完成(后端 44 项测试全绿);M2 评测看板、M3 公网部署推进中
FastAPIChromaDBSQLiteNext.js 16TypeScriptTailwind CSSSSE

背景与问题

企业合同场景问 AI 最大的顾虑是「答案不可信」:模型说了一段像模像样的条款解释,但没法验证它是不是原文里真有的。这个项目把「可信」做成产品能力——回答中每个事实性陈述都带内联引用,点击即可跳回合同原文并做字符级高亮验证。

我的角色

从产品定义、检索链路设计、后端摄取管道到 Next.js 前端全部独立完成,规划文档驱动开发(doc/生产级功能规划.md 为唯一执行依据)。

架构示意

Next.js 16 三栏前端(文档管理 · 流式对话 · 引用定位预览)
SSE 流式回答(meta→delta→done)· 内联引用 [n] · 可折叠检索调试面板
混合检索:向量 + BM25 双路召回 → RRF 融合 → LLM 重排(失败自动回退)
摄取管道:解析(页码 / 标题路径 / 表格转 markdown)→ 分块(记录全文字符偏移)→ Embedding
ChromaDB 向量库 + SQLite 状态机(上传 → 解析 → 索引 → 就绪 / 失败可重试)
44 项后端测试守护解析 / 分块不变量 / 检索融合 / SSE 契约

技术方案

  • 引用定位基于分块时记录的全文字符偏移而非文本匹配,从解析、分块、向量元数据到前端高亮全链路贯穿同一偏移体系
  • 向量 + BM25(jieba 分词)双路召回、RRF 融合、LLM 重排打分,重排失败自动回退 RRF,可一键关闭
  • 每次回答附带可折叠的检索调试面板:两路排名、融合 / 重排分数、分阶段耗时,检索质量可度量、可调优
  • 文档摄取为异步状态机(上传→解析→索引→就绪/失败可重试),PDF 表格转 markdown 且与正文去重,表格原子成块不切开
  • 多轮对话追问改写:把「那乙方呢?」改写成完整查询再检索,history 为空时不额外调用 LLM

核心难点与取舍

引用高亮的正确性地基是字符偏移不变量 full_text[chunk.start:chunk.end] === chunk.text:任何一个环节(解析、表格剔除、分块、元数据存取)破坏偏移,前端高亮就会错位。取舍是不用「文本模糊匹配」这种见效快的方案,而是让全链路共享同一套规范全文偏移,用测试不变量把正确性锁死。

成果指标

44 项

后端测试全绿(解析/分块/检索/SSE)

字符级

引用跳回原文高亮定位

2 路

向量 + BM25 召回融合

成果

  • M1 可信问答闭环完成:上传合同 → 混合检索 → 流式引用回答 → 点击引用跳回原文高亮,全链路可用
  • 检索过程全程可观测,调优不靠感觉靠数据
  • M2 评测看板与 M3 开放 API / 公网部署仍在推进,未上线公网演示实例