ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

从文档分块到查询改写:interview-guide基于pgvector的RAG检索增强实现原理深度剖析

从文档分块到查询改写:interview-guide基于pgvector的RAG检索增强实现原理深度剖析 从文档分块到查询改写interview-guide基于pgvector的RAG检索增强实现原理深度剖析【免费下载链接】interview-guide基于 Spring Boot 4.1、Java 25、Spring AI 2.0、React、PostgreSQL/pgvector、Redis 和 RustFS 构建的开源 AI 面试平台支持简历智能分析、模拟面试、语音面试和知识库 RAG。项目地址: https://gitcode.com/gh_mirrors/inter/interview-guideinterview-guide 是一个开源 AI 面试平台其知识库模块基于pgvector实现了完整的RAG 检索增强生成管线文档分块、向量化入库、查询改写、分档检索与双路召回融合。本文带你从零拆解这套检索增强实现的核心原理即使你是新手也能看懂每一步为什么这么做。一、什么是 RAG为什么面试知识库需要它RAGRetrieval-Augmented Generation检索增强生成的思路非常直观入库阶段把文档切成小块Chunk逐块转成向量Embedding存入向量数据库提问阶段把用户问题也转成向量去库里找最相似的几块内容生成阶段把找到的内容连同问题一起交给大模型让它只依据这些材料作答从源头减少幻觉。interview-guide 的选择是把向量库直接放进PostgreSQL/pgvector——不用额外引入一个独立向量数据库一张vector_store表就同时存了向量、文本和元数据VectorRepository.java。二、文档分块TokenTextSplitter 的四道关卡 分块质量直接决定检索上限。interview-guide 使用 Spring AI 的TokenTextSplitter配置集中在 KnowledgeBaseVectorProperties.java参数默认值作用chunkSize800 tokens每块目标长度minChunkSizeChars350 字符过短的片段并入相邻块避免碎块minChunkLengthToEmbed5 字符比这更短的块直接丢弃不值得向量化maxNumChunks10000单文档分块上限防止超大文件拖垮管线两个细节值得学习保留分隔符keepSeparatortrue并在句末标点。;\n 等处断句让每一块尽量落在完整语义边界上策略版本标识strategyVersiontoken-v1会写入每条向量的 metadata——以后一旦更换分块策略可以按版本排查新旧数据混用问题。三、向量化入库为什么先写临时向量再提升这是整套实现里最工程化的部分KnowledgeBaseVectorService.java分批调用 Embedding API受阿里云 DashScope 批量上限约束每 10 个 Chunk 调一次接口逐批写入vector_store先写临时身份每块数据的kb_id先标记为pending:{kbId}:{jobId}而不是正式 ID全部成功后才转正通过promoteVectorJob用一条 SQL 把pending前缀统一替换为正式kb_id失败则整批清理按jobId删除临时数据不会出现半个知识库可被检索到的脏状态。这套临时写入 原子提升的设计让向量化具备了近似事务语义——要么全部生效要么全部回滚对知识库更新场景非常关键。四、查询改写让它是什么变成可检索的句子多轮对话里用户经常抛出指代模糊的追问。interview-guide 在检索前会先用 LLM 做一次Query Rewrite提示词见 knowledgebase-query-rewrite.st保留核心意图不引入原问题没有的事实对过短、过泛的问题补充必要语义使其更可检索结合对话历史理解追问意图历史消息会被截断到 200 字符避免改写提示词过长改写失败或返回空时自动降级用原问题继续检索管线永不中断。⚡ 注意改写是尽力而为如果模型判断原问题已经足够具体就原样输出不为改写而改写。五、分档检索参数短问题宽网撒长问题精确定改写完成后KnowledgeBaseQueryService.java 会根据问题长度动态调整检索参数配置见 KnowledgeBaseQueryProperties.java问题长度topK相似度阈值 minScore设计意图≤ 4 字符超短200.25信息量太少放宽网多捞≤ 12 字符中等120.28常规检索 12 字符长句80.28意图明确收紧结果保精度随后通过kb_id in [...]的元数据前置过滤让 pgvector 在数据库层只检索指定知识库跨库互不干扰。若前置过滤执行失败还有一条回退路径先取 3 倍 topK 的原始结果再在应用层按kb_id本地过滤——保证可用性优先。六、双路召回融合改写 Query 与原 Query 各检索一次系统还支持可选的双路召回默认关闭等测评验证收益后开启改写后的 Query 与原始 Query各自独立检索一次按文档 ID 去重同一文档保留较高相似度分数按分数降序取最终 TopK分数相同的保持改写路优先的稳定顺序。这相当于给检索上了双保险改写成功时改写路命中更准改写跑偏时原始 Query 兜底。七、生成阶段只基于材料作答 流式探测窗口检索到的 Chunk 用---分隔拼成上下文注入提示词模板knowledgebase-query-system.st明确要求只用检索内容回答、没有就明说、严禁编造。流式输出还有一个精巧的探测窗口先缓冲前 120 个字符快速识别模型是否在输未检索到相关信息之类的拒答模板——命中则立即替换为统一文案并结束避免用户读到长篇拒答。八、总结一条完整的 RAG 数据流文档 → 分块(TokenTextSplitter) → 分批Embedding → 临时向量 → 原子提升入库 问题 → 归一化 → LLM查询改写 → 分档参数(topK/minScore) → pgvector检索(前置过滤回退) → (可选)双路召回融合 → 上下文注入 → 流式生成 无结果探测interview-guide 的这套实现给新手最大的启发是RAG 的核心竞争力不在调通一次而在分块策略可追溯、入库具备事务语义、改写失败有降级、检索参数随问题长度自适应——这些细节才是生产级检索增强的分水岭。想深入源码可以从以下文件入手分块配置KnowledgeBaseVectorProperties.java向量化管线KnowledgeBaseVectorService.java检索与改写KnowledgeBaseQueryService.javapgvector 数据操作VectorRepository.java改写提示词knowledgebase-query-rewrite.st【免费下载链接】interview-guide基于 Spring Boot 4.1、Java 25、Spring AI 2.0、React、PostgreSQL/pgvector、Redis 和 RustFS 构建的开源 AI 面试平台支持简历智能分析、模拟面试、语音面试和知识库 RAG。项目地址: https://gitcode.com/gh_mirrors/inter/interview-guide创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表