AI 问答
基于本地 RAG(检索增强生成),让 AI 用你自己积累的知识库回答你的问题。
特点
- 隐私优先:笔记内容只发给你配置的 API,不经过任何第三方中转
- API 兼容:支持所有 OpenAI 格式的服务(DeepSeek、Moonshot、Ollama、Groq、Azure、OpenRouter…)
- 引用来源:每段回答都附带引用的笔记来源,可点击跳转验证
- 上下文对话:多轮对话,AI 记得聊到哪里
- 流式输出:像 ChatGPT 一样边生成边显示
快速开始
1. 配置 API
设置 → AI 模型 → 填入:
| 字段 | 值示例 | 说明 |
|---|---|---|
| API Base URL | https://api.openai.com/v1 | OpenAI 官方 |
https://api.deepseek.com/v1 | DeepSeek | |
https://api.moonshot.cn/v1 | Moonshot | |
http://localhost:11434/v1 | 本地 Ollama | |
| API Key | sk-... | 你的密钥 |
| Model | gpt-4o-mini / deepseek-chat / ... | 模型名 |
保存后 → 点击"测试连接"→ 成功即可用。
2. 开始问答
- 侧边栏 → AI 问答 图标
- 或快捷键
Ctrl+J/Cmd+J
输入问题,AI 会:
- 从问题中提取关键词(中文按 bigram 切分,英文按整词)
- 在你的笔记库中检索 Top 5 条最相关笔记(FTS5 + LIKE 混合)
- 从每条命中笔记里围绕关键词截取上下文片段
- 把问题 + 片段一起发给 LLM
- 返回带引用的回答
示例
你问:
我之前学 Rust 的时候记过什么关于生命周期的笔记?AI 答(带引用):
根据你的笔记,Rust 生命周期有以下要点:
1. 生命周期用来标注引用的有效期 [1]
2. 常见的 'a、'static 是生命周期参数 [2]
3. 你在 2026-03-15 发现一个细节:编译器的生命周期省略规则
只适用于 3 种常见情况 [3]
📚 引用来源:
[1] Rust 所有权 · 2026-02-20
[2] Rust 生命周期 · 2026-03-10
[3] 每日笔记 2026-03-15 · 2026-03-15点击引用链接跳转对应笔记。
检索方式:关键词 RAG(非向量)
Knowledge Base 的 RAG 用关键词检索而非向量嵌入。理由很实际:
- 零额外成本:不需要调用 embedding API,不产生嵌入费用
- 零额外延迟:不需要"首次启用"的索引阶段,安装即用
- 本地全开:SQLite 内置 FTS5 全文索引 + LIKE,不依赖外部向量库
分词与召回
| 输入类型 | 切分方式 | 为什么 |
|---|---|---|
| 中文连续段(如"合同内容") | bigram 切分 → 合同、同内、内容 | SQLite FTS5 默认 unicode61 tokenizer 把 CJK 当一整段,bigram 才能用 LIKE 精确匹配 |
ASCII 词(如 Claude API) | 按空格/标点切分为整词 | 英文用 FTS5 直接走倒排索引 |
| 停用词 | 过滤(的、了、在、什么、怎么、帮我、一下…) | 避免噪声关键词误召 |
排序策略
LIKE 主通道按命中不同关键词的数量降序:一条同时含有"合同"+"内容"的笔记排在只含"合同"的笔记前。若问题含 ASCII 词,FTS5 作为补充通道填补召回漏项。
与向量检索的差异
| 维度 | 关键词 RAG(本应用) | 向量 RAG |
|---|---|---|
| 成本 | 零 | embedding API + 向量存储 |
| 首次索引耗时 | 零 | 1 万笔记约 2–5 分钟 |
| 精确词匹配 | 强("RAII" 能精确找到) | 弱(同近义词会被拉近) |
| 同义词/语义泛化 | 弱("代码" 找不到"程序") | 强 |
| 长文命中位置 | 用"命中居中窗口"保证相关段进入上下文 | 靠 chunk 切分 |
何时可能不够用
关键词 RAG 擅长"你记过 XX 吗"、"关于 XX 的笔记"这类有明确术语的问题。 对高度语义化的提问(如"我之前有没有纠结过选型问题"),可能召回不准——这时可手工给问题多加几个可能出现的关键词。
聊天模式
除了基于 RAG 的问答,还支持纯聊天模式(不检索笔记):
- 在输入框前加
@general - 或切换到 "通用聊天" 标签
工具调用(规划中)
未来版本将支持:
- AI 直接新建 / 修改笔记
- AI 帮你整理标签
- AI 提供"相似笔记"推荐
- 自动摘要长笔记
隐私说明
- 所有笔记内容只发给你配置的 API 服务
- 如使用本地模型(Ollama 等),完全离线
- Knowledge Base 本身不记录任何聊天历史到服务端(只存本地 SQLite)
- 可以随时在 设置 → AI 模型 → 清空聊天历史 删除所有记录
推荐配置
| 需求 | 推荐服务 | 成本 |
|---|---|---|
| 最便宜 | DeepSeek deepseek-chat | ~$0.27/百万 token |
| 最快 | Groq llama-3.1-70b-versatile | 免费额度可用 |
| 最聪明 | OpenAI gpt-4o / Claude claude-3-5-sonnet | ~$3/百万 token |
| 完全本地 | Ollama + qwen2.5:14b | 免费(需要本地 GPU) |
检索上下文窗口
对每条命中的笔记,发给 AI 的上下文不是整篇,也不是机械地从开头截一段,而是按照问题关键词最早出现位置居中取一个窗口。
| 特性 | 行为 |
|---|---|
| 窗口大小 | 每条命中笔记最多 4000 个字符 |
| 命中定位 | 以问题关键词在笔记中最早出现的位置为中心取窗口 |
| 贴底处理 | 命中点靠近文末时自动把窗口前移,保持窗口长度恒定 |
| 片段标记 | 窗口首/尾若有裁剪,用 … 标记,提示 AI 这是片段 |
| 未命中降级 | 关键词完全未匹配上时,回退为从笔记开头截取 4000 字符 |
为什么要这样做
问一个"关于 Rust 生命周期省略规则"的问题时:
- 命中的笔记可能是一篇几万字的 Rust 学习合集
- 相关段落可能出现在笔记后半部
- 机械地"取前 500 字"会让 AI 完全看不到目标段落,回答变成"没找到相关内容"
改为"命中位置居中窗口"后,长笔记中的目标段落也能被 AI 读到;每问答合计约 5 × 4000 = 20000 字符上下文,对主流 AI 模型的上下文窗口压力可控。
首/尾省略号示意
…前一段(约 2000 字)… ← 命中关键词"生命周期省略"在此 ← …后一段(约 2000 字)…AI 看到开头和结尾的 … 会知道这不是整篇,不会把窗口外不存在的内容当事实。