语义搜索 (RAG)
概述
Open Note 使用 RAG(Retrieval-Augmented Generation)技术实现智能语义搜索。
技术架构
组件
- ChromaDB:本地向量数据库
- ONNX Runtime:本地 Embedding 推理
- embeddinggemma-300m:Embedding 模型
- RRF 算法:结果融合排序
工作流程
笔记保存 → 文本分块 → 向量化 → 存储到 ChromaDB
↓
搜索请求 → 查询向量化 → 相似度匹配 → RRF 融合 → 返回结果混合搜索
关键词搜索
传统的全文搜索,精确匹配关键词。
优点:
- 精确匹配专有名词
- 速度快
- 结果可解释
缺点:
- 不理解语义
- 同义词无法匹配
语义搜索
基于向量相似度的搜索,理解搜索意图。
优点:
- 理解语义
- 支持同义词
- 模糊匹配
缺点:
- 计算量大
- 专有名词可能不精确
RRF 融合
使用 Reciprocal Rank Fusion 算法融合两种搜索结果:
RRF(score) = Σ 1 / (k + rank)其中 k = 60(默认值)
使用方式
基本搜索
在搜索框输入关键词即可。
语义搜索
使用 Cici Agent
索引管理
自动索引
笔记保存时自动:
- 提取纯文本(从 Quill Delta JSON)
- 分块(每块 500 token)
- 向量化
- 存储到 ChromaDB
手动重建索引
设置 → 搜索 → 重建索引
适用于:
- 更换 Embedding 模型
- 索引损坏
- 大量导入后
索引状态
查看索引统计:
- 已索引笔记数
- 向量总数
- 索引大小
Embedding 配置
本地模型(默认)
模型: embeddinggemma-300m
位置: embedding_service/models/
内存占用: ~600MB分块策略
默认策略
- 块大小:500 tokens
- 重叠:50 tokens
调整策略
高级用户可在配置文件中调整。
性能优化
缓存
- 查询结果缓存
- Embedding 缓存
准确度提升
技巧
- 使用自然语言:语义搜索理解自然语言
- 描述意图:不要只用关键词
- 组合使用:关键词 + 语义描述
示例
好的查询:
- "关于 React 组件优化的笔记"
- "我写过的关于产品设计的想法"
差的查询:
- "React"
- "产品"
故障排查
Q: 搜索无结果
- 检查索引是否完整
- 尝试关键词搜索
- 重建索引
Q: 搜索结果不相关
- 调整查询描述
- 检查 Embedding 模型
- 查看笔记索引状态
Q: 搜索速度慢
- 减少搜索范围(添加分类/标签过滤)
- 检查硬件资源
高级用法
相似度阈值
调整最小相似度(0-1):
- 高阈值(0.8+):精确匹配
- 低阈值(0.5-):更多结果
自定义 Embedding
使用自定义 Embedding 模型(高级)。
数据隐私
- 所有向量数据存储在本地
- 不会上传到云端(使用本地模型时)
- 可随时清除向量数据