知识处理与检索引擎
知识处理链路
知识问答依次经过资料读取、文本解析、分段、向量化(embedding)、向量检索、重排和回答生成。文件上传、分段保存与向量化是独立步骤,片段完成向量化后才能被检索。
一、数据关系
ai_knowledge 保存模型、向量库和问答配置;ai_knowledge_document 组织资料;ai_knowledge_segment 保存可编辑片段。摄取与向量化分别由独立任务表记录。
| 知识库字段 | 作用 |
|---|---|
embedding_model_id、vector_store_id | 向量模型与向量库,二者维度一致 |
chat_model_id | 公开页与知识问答使用的对话模型 |
rerank_model_id | 重排模型,为空时检索不重排 |
ocr_model_id | 视觉识别模型,为空时取租户默认的视觉识别模型 |
二、解析与分段
文件处理由 rag 引擎中的 FileHandlerFactory 分发;分段由 FileSegmentFactory 选择策略。当前文本策略包括语义、段落、固定长度、符号与大模型语义分段;表格和 JSON 按结构处理。
前端设置位于 src/const/knowledge.ts。普通文本默认分段长度为 800;大模型语义分段会调用文本模型。预览用于检查片段质量,完整摄取负责保存资料处理结果。
分段设计
让一个片段尽量包含完整的业务事实和适量上下文。先检查标题、表格和段落边界,再决定是否调整长度或分隔符。
三、视觉识别
扫描版 PDF 与图片经视觉识别转写为 Markdown 后再分段。识别服务 OcrService 位于 core 引擎的 inference/ocr,由 PDF 与图片的文件处理器调用。
| 资料 | 处理方式 |
|---|---|
| 逐页读取文字层。需要识别的页按 150 DPI 渲染为页图后识别,以识别结果作为该页正文;其余页沿用文字、表格与插图处理,各页按原页序合并 | |
| 图片 | 支持 png、jpg、jpeg、webp、bmp、tif、tiff,格式按文件头判定。整图识别后在正文末尾附原图链接,命中时可回看原件;图中没有可识别的文字时处理失败 |
需要识别的页由解析方式 ocr 决定:
| 取值 | 含义 |
|---|---|
auto | 缺省值。PDF 只识别没有文字层而含图像的页,只剩空白或页码的文字层按没有文字处理;图片直接识别 |
force | PDF 全部页交视觉识别,适用于扫描件、文字层异常或水印干扰的资料 |
以下管理端接口接收 ocr 参数,参数为空时取 auto,其他取值返回「不支持的解析方式」:
| 接口 | 用途 | 其他参数 |
|---|---|---|
GET /knowledge/document/preview | 读取文件开头并分段,PDF 预览前 10 页 | id、segment、segmentLength、segmentSymbol |
GET /knowledge/document/content | 读取全文并分段 | 同上 |
POST /knowledge/ingest-task/start | 发起摄取:重建分段并自动向量化 | documentId、segment、segmentLength、segmentSymbol |
识别模型取知识库的 ocr_model_id;未配置或该模型已删除时,取租户默认的视觉识别模型(用途 vision)。资料中有需要识别的页而租户没有视觉识别模型时,处理失败并提示「未配置视觉识别模型」。
视觉识别模型按对话协议调用:每页一次请求,指令与页图放在同一条用户消息中,温度为 0,单页输出上限 4096 tokens,各页按顺序识别。用途为 vision 的模型始终按接收图片处理,不依赖模型目录中的视觉识别开关;识别用量按 vision 用途入账。
预览与全文读取同样执行识别。读取结果按解析方式与识别模型缓存半小时,只调整分段参数时不重复识别。
四、摄取与向量化
业务服务 AiKnowledgeIngestServiceImpl 组织资料处理,AiKnowledgeVectorizationServiceImpl 组织向量写入。任务状态供工作区轮询展示,处理失败时从该资料最近一次任务定位阶段与原因。
| 摄取阶段 | 含义 |
|---|---|
pending | 任务已创建,等待执行 |
reading | 读取并解析文件 |
recognizing | 有页需要视觉识别时进入,进度为已识别页数的占比 |
segmenting | 分段并保存,进度为已保存分段的占比 |
done | 分段完成,随后执行向量化 |
error | 处理失败,任务记录保存失败原因 |
向量化任务经历 pending → running → done,失败为 error。一次摄取对应一条知识库运行记录,读取、视觉识别与向量化的用量都归入这条运行。
保存修改后的分段时,服务端按索引内容异步更新该片段的向量,使检索内容与编辑后的片段一致。向量模型的输出维度必须与向量库集合的维度一致;知识库已有分段后,向量模型与向量库不能修改。
五、检索与重排
业务服务 RagSearchServiceImpl 将一次检索分为三步:
- 向量召回:限定知识资源范围,各知识库并行检索,低于
minSimilarity的片段不返回。请求未指定或取值不大于 0 时,返回条数取 5,相似度阈值取 0.7。 - 跨库合并:多个知识库的结果合并后按向量相似度全局排序。
- 重排:确定重排模型时,向量召回的候选数放大为返回条数的 4 倍,并限定在 20–100 之间;重排模型按与问题的相关性给每条候选打分,按分数重新排序后取前
maxResults条。送入重排的单条文本截取前 2000 字符。
重排只调整顺序,不按重排分过滤。重排调用失败时,结果按向量相似度排序返回,服务端记录告警日志,检索不中断。
| 重排模型的确定 | 结果 |
|---|---|
请求的 rerank 为 false | 不重排 |
请求指定 rerankModel | 使用该重排模型 |
| 未指定重排模型 | 按 knowledgeIds 顺序,取第一个配置了 rerank_model_id 的知识库的重排模型;均未配置时不重排 |
重排后,score 为重排相关性,vectorScore 保留向量相似度,recallRank 记录该条在候选池中的向量名次。字段说明见 知识检索与问答;流程编排与对话编排中的重排开关见 应用定义与执行引擎。
重排用途支持以下供应商,模板位于 rag 引擎的 provider/rerank。候选数超过单次请求上限时,客户端分批请求后合并分数。
| 供应商 | 调用协议 | 缺省接口根地址 | 单次请求条数上限 |
|---|---|---|---|
| 通义千问 | 文本排序接口,根地址由模型的接口地址推导 | https://maas.qianwenaiapi.com | 500 |
| 硅基流动 | Jina 兼容协议 /rerank | https://api.siliconflow.cn/v1 | 100 |
| 百度千帆 | Jina 兼容协议 /rerank | https://qianfan.baidubce.com/v2 | 64 |
| 自定义 | Jina 兼容协议 /rerank,适用于 Jina、Xinference、vLLM 等服务 | 无,模型须填写接口地址 | 100 |
六、问答与调优
命中片段提供文档、分段和评分信息;问答在这些上下文上组织回答与引用。
先用命中测试确认资料能被召回,再核对回答是否引用命中片段。资料未被召回时,从分段内容、相似度阈值和返回数量入手调整;开启重排时,对照 recallRank 与最终名次判断重排对结果顺序的影响。
| 验证层次 | 关注内容 |
|---|---|
| 资料完整性 | 原文、表格、标题及关键条款是否正确读取 |
| 片段质量 | 一项规则是否完整,条件与结论是否处于合适的上下文 |
| 检索效果 | 典型问题能否命中对应资料,数量与阈值是否合适 |
| 回答质量 | 是否使用命中事实,引用是否对应,连续提问是否保持语境 |
七、扩展位置
增加文件格式时扩展文件解析;增加分段策略时扩展分段工厂;增加向量库适配时扩展 rag 的存储模板;增加重排供应商时在 RagFactory.createRerankModelTemplate 中登记,并在 provider/rerank 实现模板;更换识别引擎时实现 core 的 OcrProvider,由 OcrProviderFactory 创建。业务层继续承担任务、资源授权和记录,不将权限规则散落到解析器。
