尧图精选

ReadAny RAG实现原理:向量检索+BM25混合搜索+本地向量库源码级拆解

🕒 发布时间:2026/10/2 12:57:58 📁 来源:尧图网络
ReadAny RAG实现原理向量检索BM25混合搜索本地向量库源码级拆解【免费下载链接】ReadAnyAI-powered cross-platform e-book reader with semantic search, RAG chat, local vector store, notes, TTS, and WebDAV sync.项目地址: https://gitcode.com/gh_mirrors/re/ReadAnyReadAny 是一款 AI 驱动的跨平台电子书阅读器其 RAG检索增强生成系统让 AI 能真正读懂你正在读的书。本文从源码级别拆解 ReadAny 的 RAG 实现原理向量检索、BM25 关键词搜索、RRF 混合搜索融合以及基于 sqlite-vec 的本地向量库带你完整看懂一条检索 → 增强 → 生成的完整链路。整体架构一条三阶段的 RAG 流水线ReadAny 的 RAG 模块集中在 packages/core/src/rag/ 目录下核心流程分两大阶段1️⃣ 索引阶段向量化流水线vectorize.ts 中的vectorizeBook编排了整个流水线分为三个阶段阶段做什么源码位置chunking章节切分为带 CFI 定位的文本块chunker.tsembedding批量每批 20 条调用嵌入模型vectorize.tsindexing删除旧分块后写入数据库vectorize.ts2️⃣ 检索阶段混合搜索用户提问时search.ts 根据模式分发到向量检索、BM25 检索或混合检索三条路径。第一步分块Chunking——段落级精准切分大多数 RAG 直接按字数硬切文本ReadAny 更精细它利用 EPUB 天然的段落结构TextSegment把连续段落按 token 数聚合成块。chunker.ts 的默认配置targetTokens: 300—— 每个块约 300 tokenminTokens: 50—— 过滤过小的碎片块overlapRatio: 0.2—— 相邻块之间保留 20% 重叠防止语义被切断在边界上更关键的一点每个块都保存了startCfi/endCfiEPUB 的 CFI 定位符这意味着 AI 引用书中内容时能精确定位到段落点击即可跳转到原文位置。第二步嵌入Embedding——本地模型 远程 API 双通道嵌入模型决定了语义理解的质量。ReadAny 在 embedding.ts 中内置了两个 OpenAI 模型text-embedding-3-small1536 维text-embedding-3-large3072 维同时支持任意 OpenAI 兼容的远程 API如 Ollama 本地部署。embedding-service.ts 封装了 API 调用带 3 次重试和递增延迟的网络容错。⚠️ 一个容易忽略的细节search.ts 中的assertCompatibleIndex会在每次检索前校验查询模型与索引模型是否一致模型 ID、维度、端点。如果你换了一个嵌入模型系统会明确提示请用当前模型重新向量化这本书而不是返回一堆错误结果——这是很多 RAG 项目翻车的地方。第三步本地向量库——sqlite-vec 实现桌面端Tauri的向量库实现在 src-tauri/src/vector/mod.rs基于 SQLite 扩展sqlite-vec零外部依赖地把向量数据库跑在本地文件vectors.db里vec0 虚拟表mod.rs 中创建的vec_embeddings表维度在创建时固定float[N]开启 WAL 模式提升并发读写性能id_mapping 映射表把 SQLite 的 rowid 映射回业务层的 chunk_id 和 book_id支持按书隔离检索KNN 检索mod.rs 中通过embedding MATCH ? ORDER BY distance一条 SQL 完成最近邻搜索前端通过 vector-db.ts 定义的IVectorDB接口与它交互插入、删除、检索、重建vector_rebuild等操作全部以 Tauri Command 暴露给渲染进程。降级设计如果向量库不可用vectorSearch 会自动退化为内存中的余弦相似度计算cosineSimilarity实现在 embedding.ts保证移动端等无本地向量库的平台也能用。BM25 关键词搜索倒排索引 中日韩分词向量检索擅长语义模糊匹配但查专有名词、代码、缩写时关键词搜索BM25更靠谱。 多语言分词器tokenizer.ts 专门为中日韩文本做了优化中文除了单字切分还会生成二元组人工智能 → 人工 智能配合中英文停用词表过滤让向量检索这类查询能精确命中原文中的向量检索四个字而不只是单字级别的噪声匹配。 倒排索引inverted-index.ts 在构建索引时就预计算好了每个词的IDF 分数查询复杂度从朴素的 O(k·n·m) 降到 O(k·d)。BM25 打分在 inverted-index.ts 中使用经典参数k11.5、b0.75词频饱和 文档长度归一化。混合搜索双路并行 RRF 融合这是整个 RAG 系统的精华。hybridSearch 的策略向量检索和 BM25并行执行且各自取topK × 2的候选集用RRFReciprocal Rank Fusion倒数排名融合合并两路结果rrfFusion 对每个候选块的得分累加1/(k rank 1)k60。妙处在于RRF 只看排名不看分数天然规避了余弦相似度 0~1 和 BM25 分数无上界 的量纲不一致问题——完全不用调权重。向量检索失败时优雅降级为纯 BM25并在结果里标记vectorStatus: unavailableUI 层可以据此提示用户性能优化细节一览 5 分钟内存缓存分块数据和倒排索引都带 TTL 缓存search.ts同一本书连续提问时不重复读库、不重建索引向量化后主动失效invalidateChunkCache保证新书索引立刻生效批量嵌入每批 20 条调用 API大幅减少请求次数模型溯源Provenance每本书的向量索引都记录创建它的模型指纹防止跨模型混查总结ReadAny 的 RAG 实现给出了一个很值得参考的小而全范本环节方案亮点分块段落感知 CFI 定位结果可回溯到原文段落嵌入本地/远程双通道断网也能用模型切换有防错校验向量库sqlite-vec本地文件零部署WAL 并发优化关键词倒排索引 BM25CJK 二元组分词预计算 IDF融合RRF免调权重的分数归一容错多级降级向量库挂了退内存内存挂了退 BM25对于想在自研阅读器、知识库或笔记产品中加入AI 问书能力的开发者这套 packages/core/src/rag/ 的源码是难得的、可完整跑通的开源参考实现。【免费下载链接】ReadAnyAI-powered cross-platform e-book reader with semantic search, RAG chat, local vector store, notes, TTS, and WebDAV sync.项目地址: https://gitcode.com/gh_mirrors/re/ReadAny创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →