ReadAny语义搜索深度教程:向量检索+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/ReadAny
ReadAny 是一款 AI 电子书阅读器,内置语义搜索能力:把整本书切成小块做向量化,再结合 BM25 关键词索引,用"混合检索"帮你找到只记得大意、不记得原话的内容。读完这篇教程,你会明白它为什么比传统"Ctrl+F"聪明,以及如何三步开启。
一、为什么你需要语义搜索?
读技术书时常见场景:你记得"作者说过缓存命中率有个平方根之类的规律",但完全不记得那句话的关键词。传统关键词搜索会一无所获。
语义搜索的思路是:把"意思"变成"向量"。
- 你的问题被转换成一组数字(embedding)
- 书中每个段落也预先转成了向量
- 意思越接近,向量夹角越小(余弦相似度越高)
在 ReadAny 中,这部分逻辑集中在 search.ts,它同时实现了vector、bm25、hybrid三种搜索模式。
二、两个检索引擎:向量检索与 BM25
1️⃣ 向量检索:懂"意思"
- 每本书先被 chunker.ts 切分成小块,再逐块生成向量
- 查询时计算向量与所有块的余弦相似度,取 Top K(阈值默认 0.3,见 search.ts)
- 适合"换个说法找观点",但对精确专有名词(人名、API 名)有时不如关键词匹配
2️⃣ BM25 关键词检索:懂"字面"
BM25 是经典的信息检索算法,ReadAny 用倒排索引加速它:
- inverted-index.ts 预先建好"词 → 文档"映射,并算好 IDF 权重,把检索复杂度从 O(k·n·m) 降到 O(k·d)
- tokenizer.ts 是亮点:支持中英文日韩混排,中文采用单字 + 二元组切分(如"人工智能" → "人工"、"智能"),还内置了中英文停用词表
所以哪怕你只输入"智能"两个字,也能命中标题为"人工智能"的段落。
三、混合检索(Hybrid):为什么 1+1>2
单独用任何一种检索都有盲区。ReadAny 的混合模式做了两件事:
- 并行召回:向量检索和 BM25 各自取 2×TopK 候选
- RRF 融合排序:用"倒数排名融合"(Reciprocal Rank Fusion,k=60)给每条结果打分——一个段落只要在两路榜单中靠前,总分就高(见 rrfFusion 实现)
还有两层"保底"设计:
- 向量服务不可用时(如模型没下载好),自动降级为纯 BM25,搜索不会直接失败
- 如果换过 embedding 模型,系统会检测到"索引与查询模型不匹配"并提示你重新向量化这本书,避免拿旧向量硬算出错结果
四、三步开启:从向量化到搜索
第 1 步:为书建立向量索引
在图书上点击"向量化",会弹出进度对话框(VectorizeDialog.tsx),实时显示"已处理 N / 共 M 个文本块"。
💡 建议用内置本地模型(builtin 模式,基于 Transformers.js,状态管理见 vector-model-store.ts),无需 API Key、数据不出本地;也可以切到远程 API 模型。
第 2 步:直接用自然语言问
打开 AI 对话页提问即可。AI 背后会调用 RAG 检索工具(rag-tools.ts),从书中捞出最相关的段落作为上下文,回答并附带出处。
第 3 步:连笔记和高亮一起搜
不只是正文:knowledge/search.ts 提供知识库搜索,把book、note、highlight三类来源一起检索。你在书上划的高亮、随手记的笔记,都能被"意思搜索"找回来。
五、常见问题(FAQ)
Q1:换 embedding 模型后搜索报错?这是防错机制:旧索引的维度/模型与新模型不一致。重新对这本书做一次向量化即可。
Q2:只有关键词能搜到、语义搜不到?说明该段落的 embedding 相似度低于 0.3 阈值;可换个更贴近原意的问法,或直接用 BM25 模式精确匹配。
Q3:中文分词会不会漏词?不会漏得太厉害——单字 + 二元组双重切分让"只命中一个字"也有机会召回,这是为 CJK 语言专门设计的。
六、总结
| 能力 | 传统关键词搜索 | ReadAny 混合语义搜索 |
|---|---|---|
| 必须记住原词 | ✅ 必须 | ❌ 说大意就行 |
| 精确专有名词 | 强 | 有 BM25 兜底 |
| 中文短句召回 | 一般 | 二元组分词优化 |
| 笔记/高亮同库搜索 | 通常不支持 | 支持 |
核心要点一句话:向量化一次,之后用"意思"搜书;向量 + BM25 双路召回 + RRF 融合,让"记不住关键词"不再是障碍。
延伸阅读:混合检索的完整实现见 packages/core/src/rag/,知识库搜索见 packages/core/src/knowledge/。
【免费下载链接】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),仅供参考