Raycontentech OG-RAG 系统设计文档

版本:v1.0  |  日期:2026-07-18  |  编写依据:F:iRobot\AISearch 目录实际文件清单 + 本项目历史会话中的实测验证结果

文档原则:区分"已验证"(本会话或既往会话中实际跑过、有日志/断言测试为证)与"据文件名/历史口述推测"(未在本次核实),两者不混写成同等确定性的结论。

目录

  1. 系统定位
  2. 数据与索引层
  3. AI 对话搜索设计(已验证)
  4. Oxygen AI 对接场景
  5. AI 翻译平台对接场景
  6. 整体风险与依赖清单
  7. 建议后续路线
  8. 附录:部署运维手册

0. 系统定位

OG-RAG 是 Raycontentech 自建的企业知识检索系统,服务于 F:iRobot\AISearch(11,568 篇文档,含 XDocs 5.4 专有资料、DITA 语料、MCU 翻译QA样例等),核心特征是在传统向量+关键词混合检索之外,叠加了一层超图本体(hypergraph ontology)用于捕捉文档间的关系型知识——这是"本体增强"一词的实际所指,区别于普通RAG。

系统本身与接入它的LLM代理是解耦的两层:

这个解耦是"AI对话搜索模型无关"这个说法成立的基础,也是后续Oxygen/翻译平台能各自接入的前提。


1. 数据与索引层

1.1 存储:metadata.db(SQLite)—— 已验证

以下表结构和行数来自本会话 inspect_db_schema.py 的实际探测结果,已验证:

表名行数核心字段作用
metadata 11,568 id/path/title/shortdesc/context/doc_type/keywords/categories/chunk_index等26列 文档主表,检索的主要数据源
hypernodes 46,097 node_id/attr_key/value/topic_id/key_embed/val_embed 本体节点——注意key和value都各自有独立向量(BLOB),意味着不仅"值"能语义匹配,"属性类型"本身也能语义匹配,这是比普通KV属性表更强的设计
hyperedges 49,688 edge_id/topic_id/group_name/weight 超边——按group_name分组、带权重,不是简单的二元关系
edge_node_map 243,911 edge_id/node_id 边-节点多对多映射——一条超边可以连接多个节点,这才是"超图"(hypergraph)而非普通图的原因
corrections 0(当前为空) source_text/corrected_text/source_lang/target_lang/domain/source_hash 术语修正/翻译记忆表,schema已就绪但未灌数据
miss_log 0 query/user_role/top_score/ts 检索失效反馈日志表,schema已就绪但未见写入记录
关键发现(已验证):corrections表虽然当前是空的,但目录清单里存在与之配套的独立FAISS索引(corrections_faiss.bin/corrections_ids.npy/corrections_meta.json)和专用API路由文件(corrections_routes.py),说明这张表的设计意图是语义可检索的术语库,不是只能做字面LIKE匹配的简单对照表——这个能力尚未启用,因为表本身没数据。

1.2 索引构建流水线 —— 据文件名推测,未逐行核实代码

原始文档 → handleOriginData.py / handleOriginData0409.py(摄入/预处理) → fact_extractor.py(抽取事实/三元组) → dita_ontology.py + dita_ontology.json + ontology_loader.py + auto_extract_ontology.py + apply_ontology_patch.py(DITA专用本体schema定义与抽取) → hypergraph_builder.py / build_hypergraph.py / hypergraph_builder_patch.py → og_hypergraph.pkl(超图序列化缓存) → model_distiluse/distiluse-base-multilingual-cased-v2(多语言embedding模型, 驱动正文向量检索与hypernodes的key_embed/val_embed) → 产出:faiss_index.bin(向量索引)+ bm25_cache.pkl(词频索引) + df_meta.pkl(文档频率)+ doc_ids.npy/doc_texts.npy(ID-文本映射)

注:model_distiluse确认是多语言embedding模型(distiluse-base-multilingual-cased-v2是sentence-transformers系列的标准多语言模型),这一点对第4节"翻译平台对接"很重要——理论上向量检索本身具备跨语言语义匹配能力,但这个能力在当前OG-RAG的/search端点里是否被用于跨语言检索,未经本会话验证。

1.3 检索服务:handleData_v4.py(:5200,waitress部署)

1.4 运维层

admin_routes.py + AdminPanel.html/AdminPanel.jsx(管理控制台)、migrate_db.py/update_index.py/output_index.py(索引维护工具)、win_utf8.py(Windows编码兼容)、wsgi.py(生产部署入口)。_archive/目录里有大量带日期的历史版本(03/12~04/16一路到当前),说明这套系统持续迭代了至少数月。

1.5 诚实列出的空白/待验证项


2. AI对话搜索设计(本会话实际实现并验证过的部分)

这是唯一一层全程有实测验证、有日志/断言测试为证的部分,其余各层多少都有推测成分。

2.1 架构

Oxygen AI Positron | (OpenAI兼容协议) v Kimi代理服务 kimi3proxy.py (:5001) | | | 检索类工具调用拦截 | 每轮请求级注入 | (Route A) | (Route B) v v OG-RAG merged ograg_search() | | DB直查 HTTP /search (SQLite, (hybrid: FAISS+ 确定性) BM25+hypergraph) | | +------+-------+ v Kimi K3 (api.moonshot.cn)

两条通道互补,不是二选一:

2.2 版本演进(v1.1→v1.7,每版解决的问题)

版本问题修复验证方式
v1.2 Oxygen残留gpt-5.5占位符导致上游404 模型白名单+自动回退 复现404日志后确认根因
v1.3 Oxygen发developer角色被误降级;流式请求下检索工具被透传回Oxygen内置RAG,自有OG-RAG被绕过 developer→system映射;流式请求含工具时切换缓冲模式再转SSE 代码审查
v1.4 OG-RAG的/search打分体系有偏置,已知关键词命中文档排不进前列 新增SQLite直查通道,与HTTP结果合并,DB直查优先 test_acceptance.py断言测试,首次运行失败(详见2.3)
v1.5 v1.4的DB直查打分是naive词频求和,无停用词/IDF/大小写归一化,被通用词淹没 加停用词表+IDF加权+大小写归一化 test_acceptance.py重跑通过
v1.6 检索到了对的文档,但预览窗口600字符+5篇均分预算,大文档答案细节被截掉 预览窗口扩到2500字符,注入预算改为按排名非线性分配(第一名55%) dump_injected_context.py溯源比对(详见2.3)
v1.7 find_similar_reusable_content工具是硬编码假数据桩,从未真正接入OG-RAG 接入真实检索,且改用HTTP hybrid优先(语义检索)而非DB直查(字面匹配),因为"新建文档"场景用词与既有文档字面不重合 代码修复,尚未实测验证(本次仅完成修复,验证方法已给出但未执行)

2.3 关键教训:DB直查修复的完整试错过程

这个过程本身是本文档最有实证价值的部分,值得写进设计文档作为"如何验证RAG真正生效"的方法论参考:

  1. 第一次假设:认为OG-RAG的hybrid打分体系有偏置,加SQLite确定性直查能绕开——test_acceptance.py第一次运行失败,验收目标文档using_a_catalog.dita未进入DB直查返回的前10
  2. 诊断:发现naive词频求和被"how/do/make/of/the/my/new/document/type"这类通用词主导,真正有区分度的"XDocs"等词权重被稀释;还发现大小写不一致bug(SQL LIKE不敏感但Python count()敏感)
  3. 修复后重测:加停用词过滤+IDF加权后,test_acceptance.py通过
  4. 进一步验证:用dump_injected_context.py把实际注入模型的system消息全文打印出来,逐token比对Oxygen真实答案里的10个特征细节,发现7个不在注入文本里——证明"检索到了正确文档"不等于"注入内容完整覆盖了答案",此前一轮判定为"PASS"是过早的结论,本文档予以修正
  5. 溯源排查:通过日志关键词排查Kimi是否调用过本地文件读取工具,结果显示日志里唯一一条相关记录(get_document_content)本身处于权限被拒绝状态,无法确认是否是文件读取工具补上了缺失细节——最终建议的对照实验(OGRAG_ENABLED=false重新提问)尚未执行,结论待补
  6. 根因修复:确认是预览窗口600字符对大文档不够用,且5篇文档均分预算进一步压缩——改为2500字符窗口+按排名非线性分配预算
方法论总结:"文档被检索到"、"内容被完整注入"、"答案确实基于注入内容生成"是三件需要分别验证的事,任何一环跳过验证都可能得出"RAG生效了"的假阳性结论。

3. Oxygen AI 对接场景说明

3.1 已验证生效的场景:知识问答

用户在AI Positron对话里提问,Route B强制注入,Route A按需拦截工具调用。已用真实验收案例验证(XDocs catalog配置问题,见2.3),当前已知限制是大文档的注入完整性依赖v1.6的预算分配策略,未对所有文档规模做穷尽测试。

依赖条件:

3.2 部分可用/需先修复的场景:新建文档时的内容复用

结论(本次评估的核心发现):理论上,本体增强(hypergraph)能在字面用词不重合的情况下发现概念相关的既有内容,这是"新建文档找可复用素材"场景最需要的能力(新草稿的措辞不可能和既有文档字面重合)。但截至v1.6,专门服务这个场景的工具find_similar_reusable_content是硬编码假数据桩,从未真正接入OG-RAG——v1.7已修复代码,但尚未实测验证。

另需注意:Route B注入只在用户通过对话触发AI(如"帮我写一篇关于XX的topic")时生效,Oxygen纯UI"新建空白文档"动作不经过AI对话,不会触发任何RAG检索——这是"新建文档获益"必须加的限定条件,不能笼统宣称。

依赖条件(新增):

3.3 未涉及场景

Schema组件解析(get_sch_component_details/get_xsd_component_details)、AI动作管理、文档保存/校验等工具目前是mock实现或纯本地逻辑,与OG-RAG无关,不在本文档讨论范围。


4. AI翻译平台对接场景说明

4.1 设计方案:讯谷代理 v6.1(两级检索)

代码已交付(ograg_translate_bridge.py),设计上模型无关,理论上任何走该代理的翻译请求都能获益。

4.2 可行性的真实前提——当前不满足,需先完成

corrections表当前0行。这意味着"术语一致性"这个最有价值的收益点,在种子数据灌入之前是0,不是"部分可用",是完全不可用。已交付配套方案:

4.3 一个此次文件清单核实后发现的新信息

corrections表配套的独立FAISS索引(corrections_faiss.bin等)说明系统设计时就打算让这张表支持语义检索,不只是字面匹配。这意味着4.1节设计的"第一级:确定性LIKE匹配"只是当前ograg_translate_bridge.py用的临时策略,未来如果corrections_routes.py里的语义检索端点跑起来了,术语匹配的召回能力会比现在的字面LIKE匹配更强(能处理"源文措辞和术语库里存的版本不完全一致"的情况)——但这是尚未验证的潜力,不是当前已实现能力。

4.4 依赖条件汇总


5. 整体风险与依赖清单

项状态风险
Kimi代理层(Route A/B/DB直查/IDF打分/预算分配) 已验证生效 低——已有真实验收案例+断言测试
Oxygen新建文档复用(find_similar_reusable_content) 代码已修复,未验证 中——需要实测才能确认hypergraph语义检索真的比字面匹配强
翻译平台对接 设计+代码已交付,corrections表为空 高——价值为0直到种子数据灌入且验证通过
OG-RAG服务本身(/search打分体系、PATCH3、hypergraph具体实现) 部分修复,部分未验证 中——本文档大部分该层描述基于既往口述而非本次代码核查
miss_log反馈闭环 未使用 低优先级,但长期看是系统自我改进的关键缺失环节

6. 建议后续路线(按价值/成本排序)

  1. 执行OGRAG_ENABLED=false对照实验,补上2.3节遗留的未完成验证
  2. 实测v1.7的find_similar_reusable_content修复(Oxygen新建文档场景)
  3. 灌corrections表种子数据并跑validate_translation_rag.py(翻译平台场景,当前价值瓶颈)
  4. 核实og_retriever.py混合检索的实际打分逻辑与corrections_routes.py的语义检索端点(消除本文档里标注"未验证"的部分)
  5. 启用miss_log记录机制,为后续检索质量优化提供真实数据而非推测

7. 附录:部署运维手册

详见独立文档 AI 搜索部署手册 V3.1(已作为附件提供),包含:

跨租户同步原则:代码文件共享同一套,仅 .env 不同。运行时生成文件(metadata.db、*.pkl、*.bin、*.npy)不需要跨租户同步,各租户独立重建。

第二部分:业务版架构图

面向文档工程师、技术主管、研发经理、项目经理 — 遮蔽技术底座,强调业务价值

📋 遮蔽原则

本部分所有技术实现细节(模型名称、框架版本、端口号、文件路径、API密钥等)均已遮蔽或泛化,确保竞争对手无法通过此文档反推技术底座。业务决策者只需理解"能力"和"价值",无需关心"怎么实现"。

第二部分:业务版架构图

面向文档工程师、技术主管、研发经理、项目经理 — 遮蔽技术底座,强调业务价值

📋 遮蔽原则

本部分所有技术实现细节(模型名称、框架版本、端口号、文件路径、API密钥等)均已遮蔽或泛化,确保竞争对手无法通过此文档反推技术底座。业务决策者只需理解"能力"和"价值",无需关心"怎么实现"。

回答编造事实
AI 凭空捏造产品参数、规格或政策
回答泛泛而谈
脱离企业实际,给出通用互联网答案
答案前后矛盾
同一问题多次输出结果不同
应用产品层
🌐
智能翻译平台
企业术语自动统一,翻译风格跨项目保持一致,历史译文自动沉淀复用
术语统一 风格一致 知识沉淀 译文复用
💬
网站 AI 助手
访客提问精准回答,每条回复标注来源出处,陌生问题自动记录而非编造
精准问答 来源可溯 联网兜底 缺口追踪
✍️
智能写作助手
投标书、技术文档自动生成,品牌规范自动校验,结构化内容智能重组
文档生成 模板引导 品牌合规 结构校验
公共核心模块 · 统一服务三大产品
企业级 AI 知识中枢引擎
私有化部署 · 数据不出域 · 一套底座支撑全业务线
企业知识图谱
将分散的文档、规范、产品信息连成一张关系网络,回答必须基于这张网络中的已知事实
→ 防编造:用已知事实约束回答
智能检索引擎
语义理解 + 精确匹配双重保障,从企业知识库中找到最相关的内部资料作为回答依据
→ 防泛化:强制返回库内知识
领域边界锁定
自动识别问题是否在企业业务范围内,超出边界的问题诚实告知,不硬答、不瞎编
→ 保一致:确定性概念路径
数据权限管控
多部门/多项目数据隔离管理,不同团队只能访问授权范围内的知识,管理后台一键配置
→ 企业级:安全合规隔离
回答流程
用户提问
→
意图理解
→
知识检索
+
语义匹配
→
关联扩展
→
质量排序
→
答案组装
→
智能生成
→
质量兜底
知识基础层
📄 企业结构化知识库
Word、PDF、网页、手册等多格式统一摄入,自动解析为标准知识单元,支持一键重建索引
多语言语义向量化存储
元数据与向量索引持久化
管理后台一键维护更新
🕸️ 业务概念图谱
产品体系、专业术语、业务规则的关系网络,锚定每个概念的精确边界与关联路径
产品 — 概念 — 属性三层结构
概念节点 → 关系边 → 文档锚点
支持热更新,无需停机重建
⚡ 智能生成引擎
完全私有化部署的大语言模型推理服务,企业敏感数据不出域,低随机高确定性输出
低温度设定 — 高稳定性输出
回答含知识来源引用与证据链
格式自动清洗与重复内容截断
解法 1
知识边界锁定 · 防编造
所有回答必须命中企业知识图谱
陌生问题触发记录而非编造答案
解法 2
库内检索优先 · 防泛化
回答仅注入内部召回的知识片段
无文档支撑则诚实告知"暂无信息"
解法 3
确定性路径 · 保一致
低随机推理 + 固定知识路径
同一问题结果稳定可复现
解法 4
共享知识底座 · 降成本
翻译 / 助手 / 写作共用一套内核
避免三套系统重复建设知识孤岛
应用产品层
公共核心模块
知识基础层
解法输出

设计思想:为什么这个架构能解决企业级 AI 的三大顽疾?