THINGJS RAG知识库(2025.07 – 2025.10)
项目简介
面向 ThingJS API 文档的检索与问答知识库,为编辑器 MCP 和网页提供共用的检索能力。文档更新后可通过重建索引同步知识,无需重新训练模型。
技术栈
TypeScript / LangChain / LanceDB / MCP / BM25 / RRF / Qwen3-Embedding-4B / 阿里云 Chat
个人职责
- 切片与发布:独立完成文档切片与索引发布。
- 问句规划:意图分流与问句规划(别名扩写、近邻类名纠错,不用 LLM 改写问句)。
- 双路检索:LanceDB 向量检索与 BM25 双路融合、按类采用。
- 检索与生成接口:
/search返片段、/ask生成。 - 门禁:检索 / 生成门禁与版本回滚。
- 鉴权与额度:MCP 入口 LDAP 鉴权与部门额度,网页独立日池。
技术亮点
- 模型分工:离线使用本地 Qwen3-Embedding-4B 构建索引;在线只嵌入查询,生成走阿里云 Chat。
- 意图分流:纯规则。有类名、别名、
THING.、领域词才当文档题;你好 / 闲聊 / 天气直接固定话术,0 次 embed、0 次 chat。 - 问句规划:别名扩写(摄像机 → Camera / lookAt),近邻类名按编辑距离替换进问句。不用 LLM 改写,避免改出文档里没有的类。
- 双路检索:向量整句 embed 一次,LanceDB Top28;BM25 最多 6 路各 Top28,按 chunk_id 去重。
- RRF:只按名次加分,
1 / (60 + 名次 + 1)。同一 chunk 两路分相加。 - 按类采用:单类仍 5 条;问句里 2 个及以上类,每类最多 3 条、按类轮流发,避免先到的类占满格子。
- 结构切片:先按
###切到成员级;同一成员超过 800 字再分段,相邻段重叠 200;代码块整块留下;图片挂在对应切片末尾。800 和 200 写进切块指纹,改了要全量重嵌。 - 版本发布:按 embedding 模型分版本,不是原地改库。建新版本 → 校验 → 切 active 指针;默认留最近 5 版回滚。
- 门禁:检索看 Class Hit@5、Member Hit@3、MRR、误空率;生成看引用必须落在本次检索、幻觉为 0。过不了回滚上一版。
- 鉴权与额度:MCP 用公司 Token 换 LDAP 身份和部门额度;网页独立日池。LDAP 管谁能调,不管谁能看哪份文档;现在是一套索引、语料打标,不是按租户拆库。
项目成果
- 多入口复用:编辑器 MCP 与网页共用一套检索,文档更新后重建索引即可用。
- 非文档分流:非文档话术规则拦下,不占检索和模型。
- 口语问句定位:口语「摄像机看向某点」能落到 Camera / lookAt,没有用大模型改写问句。
- 多类结果覆盖:多类「Box、Sphere、Cylinder 怎么 new」按类留席,后到的类也能进采用列表。
- 门禁发布:检索差和生成差两段日志分开看,发版靠门禁而不是手感。