检索与引用
检索是橘记的核心能力。目标不是「搜到差不多的东西」,而是定位到具体段落,并且你能核对。
标题级分块
Markdown 会按多级标题路径拆成可定位的块:
- 每个块都带着完整的标题路径,例如
项目规划 > 里程碑 > Q3。 - 超长段落会继续拆分,单块上限 1200 字符,避免长文被一个块占满上下文。
中文分词
查询和索引内容都会先经过 jieba 分词,再进入 FTS5 索引。
这让没有空格的中文句子和自然语言短语也能正常召回。
索引分四列加权:标题、路径、标题路径、正文。标题和路径命中权重更高。
引用可验证
检索结果会带定位信息:
标题路径 · L起-L止例如 架构设计 > 存储层 · L120-L168。
回答底部的引用列表和 Agent 过程面板都能看到这些定位,点回去就能核对原文。
结构化过滤
当你的约束是「某个目录 / 某个标签 / 某种文件类型 / 某段时间」,Agent 会用结构化过滤参数,而不是把约束塞进查询词:
| 参数 | 含义 |
|---|---|
pathPrefix | 限定目录前缀 |
tags | 按标签过滤 |
fileTypes | 文件类型(目前只放行 markdown) |
updatedAfter | 修改时间下界 |
updatedBefore | 修改时间上界 |
过滤在 SQL 层完成,关键词和向量两路召回复用同一套过滤条件。
空结果的处理
检索没命中时,橘记不会直接说「没有这个内容」:
- 先用全部 token 做 OR 查询。
- 失败后用 top 3 token 重试。
- 再失败走快照子串兜底。
- Agent 会被引导用更短的关键词重试、放宽过滤,或先用
list/read确认,再下结论。
排序
- 基础分是 BM25,叠加标题 / 路径 / 标题路径的列权重。
- 同一篇笔记只保留最高分的块,避免长文霸榜。
