Skip to content

AI 问答

基于本地 RAG(检索增强生成),让 AI 用你自己积累的知识库回答你的问题。

特点

  • 隐私优先:笔记内容只发给你配置的 API,不经过任何第三方中转
  • API 兼容:支持所有 OpenAI 格式的服务(DeepSeek、Moonshot、Ollama、Groq、Azure、OpenRouter…)
  • 引用来源:每段回答都附带引用的笔记来源,可点击跳转验证
  • 上下文对话:多轮对话,AI 记得聊到哪里
  • 流式输出:像 ChatGPT 一样边生成边显示

快速开始

1. 配置 API

设置 → AI 模型 → 填入:

字段值示例说明
API Base URLhttps://api.openai.com/v1OpenAI 官方
https://api.deepseek.com/v1DeepSeek
https://api.moonshot.cn/v1Moonshot
http://localhost:11434/v1本地 Ollama
API Keysk-...你的密钥
Modelgpt-4o-mini / deepseek-chat / ...模型名

保存后 → 点击"测试连接"→ 成功即可用。

2. 开始问答

  • 侧边栏 → AI 问答 图标
  • 或快捷键 Ctrl+J / Cmd+J

输入问题,AI 会:

  1. 从问题中提取关键词(中文按 bigram 切分,英文按整词)
  2. 在你的笔记库中检索 Top 5 条最相关笔记(FTS5 + LIKE 混合)
  3. 从每条命中笔记里围绕关键词截取上下文片段
  4. 把问题 + 片段一起发给 LLM
  5. 返回带引用的回答

示例

你问

我之前学 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 看到开头和结尾的 会知道这不是整篇,不会把窗口外不存在的内容当事实。

你的知识,你的电脑,你说了算