


制作按关键词和含义搜索本地文档的CLI
在开发或维护搜索本机文档的命令行工具时使用。规定如何管理集合与上下文说明、组合关键词搜索和向量搜索、限制返回的内容量、以服务方式运行工具,以及如何测试和发布,并把会改变索引的命令留给用户执行。
要使用这个AI规则
## 只用一种运行时,并为每类命令分清职责
选择一套受支持的运行时和包管理器,作为规范的开发路径。不要仅因替代运行时或安装命令看似兼容,就将其混用。
明确区分各类命令的职责:
- 集合命令管理已建立索引的根目录及其配置;
- 上下文命令将搜索指导附加到路径;
- 获取命令返回已知文档;
- 搜索命令对候选文档进行排名;
- 维护命令检查或刷新索引;
- 服务命令向其他进程提供相同能力。
当已安装的命令包装器负责调用编译后的应用程序代码时,应保留该包装器。使用已记录的编译器工作流构建源代码;如果原生扩展依赖现有布局,不要用单个编译后的可执行文件替换包装器。
## 记录每个集合的设置,并区分排除与移除
用唯一名称、源根目录、文件掩码、纳入状态和可选的更新前钩子表示每个集合。
支持添加、列出、检查、重命名、纳入、排除和移除集合。区分移除与排除:移除会取消集合注册,而排除只会在未限定范围的查询中略过该集合。
允许列出整个集合或某个路径前缀下的文件。接口支持时,同时接受普通集合路径和工具的虚拟集合URI。
将添加、移除、重命名、钩子变更、纳入状态变更和索引刷新视为状态变更。需要用户批准时,在执行前给出准确的命令及预期影响。
## 按路径附加搜索说明(上下文),与文档内容分开
将人工编写的上下文与文档内容分开存储,使排名指导可以在不重写源文件的情况下演进。
允许在以下位置设置上下文:
- 集合内检测到的当前目录;
- 指定的子路径;
- 虚拟集合路径;
- 为所有集合提供通用指导的全局根目录。
提供用于列出上下文、检测缺少上下文的路径以及移除过时上下文的命令。在保留全局指导的同时,应用相关且范围最具体的上下文。
不要混淆上下文元数据与已建立索引的文档文本。使作用范围可见,避免局部注释在无提示的情况下影响无关集合。
## 为每个文档分配短ID,并限制返回的内容量
为每个文档分配一个由其内容哈希前6个字符派生的短标识。在搜索结果中显示该标识,并接受带或不带前导标记的形式。
支持按路径或标识获取文档、可选的起始行和行数,以及通过glob或逗号分隔列表进行批量获取。
明确限制获取范围:
- 设置每个文件的最大行数;
- 设置最大字节数,并记录10 KB等默认值;
- 对过大的文件予以跳过,不在未告知的情况下返回部分内容;
- 默认包含行号,同时允许调用方将其关闭;
- 仅在明确请求时返回磁盘上的完整路径。
## 按查询选择搜索方式,默认使用混合搜索
提供三条不同的搜索路径:
- 使用BM25等全文排名且不使用语言模型的关键词搜索;
- 使用本地嵌入且不进行重排名的向量相似度搜索;
- 使用查询扩展和重排名的扩展混合查询搜索,作为质量最高的默认路径。
使用倒数排名融合(Reciprocal Rank Fusion)合并各自独立排名的结果集。充分展示原始分数和搜索模式,以便诊断异常排序。
一般用途优先选择混合查询路径。需要精确术语时选择关键词搜索,目标是语义相似度时选择向量搜索,更看重速度而非最终排序质量时选择不重排名的选项。
## 允许选择要搜索的集合和输出格式,且不因显示方式改变结果
允许调用方重复指定集合筛选器,只搜索多个具名集合并排除其他所有集合。支持结果数量、全部结果模式、最低分数、完整内容模式,以及用于提高排名针对性的意图说明。
将显示方式与数据传输分开。除了易读的命令行格式,还应提供结构化的JSON、CSV、Markdown、XML和文件列表输出。旧版格式标志只作为一个规范格式选项的别名保留。
进行批量获取时,将行数限制、字节限制和行号控制与搜索排名分别提供。不要让呈现选项改变被选中的文档。
## 构建搜索索引,并把文档切成大小可预期的分块
全文索引使用持久的本地数据库,语义相似度搜索使用兼容的向量扩展。通过已配置的本地模型运行嵌入、重排名和查询扩展。
采用智能文档分块,以每个分块900个token、15%的重叠为目标。可行时优先以Markdown标题作为边界。
为受支持的代码文件提供感知抽象语法树的策略,使分块与函数、类和导入的边界对齐。通过明确的自动策略选择该方式。将正则表达式分块保留为默认方式,并始终将其用于Markdown和未知文件类型。
将索引构建、嵌入生成和查询时排名保持为不同阶段,以便无需重建全部内容即可诊断故障。
## 调整排名前,先检查索引和模型的状态
提供状态输出,在不改变状态的情况下展示集合与索引的健康状况。添加诊断命令,用于检查配置、索引、模型和设备问题。
使用带版本的测试夹具文件评测搜索质量。记录查询、预期相关文档、搜索模式、排名指标、模型配置和索引版本,以确保比较可复现。
在更改排名权重、模型或设备设置前先进行诊断。模型缺失、索引陈旧、向量扩展不兼容或设备不可用,本身并不能证明排名算法有误。
## 只在被要求时,把工具作为本地或HTTP服务运行
为本地进程集成提供标准输入/输出服务,并为远程客户端提供可选的HTTP服务。使用8181等已记录的默认端口,同时允许明确覆盖。
支持用于调试的前台运行方式和适合长期运行的后台守护进程模式。提供与之对应的停止命令,并且该命令只针对受管理的守护进程。
将服务传输方式与搜索语义分开。命令行接口与服务接口应共享集合、上下文、获取、排名和输出规则。
不要隐式启动后台服务。服务启动后,应报告端点、进程模式、配置来源和关闭方式。
## 把修改索引的命令交给用户执行,不破坏已安装的包装器
绝不自动添加集合、生成嵌入或刷新索引。绝不直接修改底层搜索数据库。
请求的工作流需要上述变更时,给出由用户执行的准确命令,并说明预期文件、耗时和资源使用情况。在不扩大权限的前提下,继续提供只读搜索和获取功能。
不要运行会覆盖已安装的shell包装器或破坏原生向量扩展的编译模式。不要替换有意从分发目录启动编译后JavaScript的包装器。
将更新前钩子视为可执行配置。在检查时显示这些钩子,并且只在明确请求的索引更新过程中运行。
## 补充回归测试,并附上变更日志进行发布
将自动化测试放在指定的测试树中,并通过受支持的运行时执行已记录的完整测试套件。为集合状态、获取限制、排名模式、分块边界和服务生命周期添加范围明确的回归测试。
使用规范的发布工作流,而不是手动拼装发布:
1. 每次进行变更时,在未发布部分添加变更日志条目;
2. 发布时,将该部分转换为带日期的版本;
3. 使用项目要求的引用格式注明外部贡献者;
4. 汇总目标版本系列中的发布说明;
5. 发布前运行发布钩子并完成验证。
报告已变更的行为、索引或模式兼容性、已运行的测试、对基准结果的影响、迁移需求,以及留给用户执行的任何状态变更命令。
