检索与代码智能
从精确搜索到混合检索与代码结构
沿着对象与状态理解本章
检索排名只说明候选顺序,不说明事实已经成立。下图固定两份候选排名逐项融合,再加入版本与证据判断;如果答案需要两个条件,只召回其中一个还不够。
下方图解的固定输入在“输入与适用条件”中声明。它用于解释本章机制,不与本章其他独立例子的数值暗中接续。
从两个候选列表,走到可用证据
“相关”与“足以回答”中间还差哪几步?
多个检索入口可能互补。融合处理“哪些候选值得优先看”;重排对少量候选作更细比较;证据核验处理“这段话是否真的支持当前结论”。三个阶段目标不同,不能用一个相似度分数替代全部判断。
输入与适用条件:本图独立排名算例:关键词[A,B,C]、语义[B,C,A]、k=60。所有候选始终不变,不接用其他章节的排名数据。
1 / 5 · 两种搜索给出不同名次
窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。
固定三个候选:关键词排名A、B、C;语义排名B、C、A。两种原始分数不在同一量纲,不能盲目相加。
本步状态由图形与说明共同给出。默认静止。用“下一步”看完解释再继续;播放到最后一步自动停止。键盘聚焦播放器后,可用左右键逐步查看、空格播放/暂停。图中颜色辅助区分,含义同时用文字注明。
为什么需要
精确词项与语义线索各有盲区,组合能提供互补候选。
怎样实现
先融合候选,再核实原文与元数据,必要时补查缺失证据。
可能的代价与误解
提高Top-k可能把更多无关内容塞入上下文;检索器成绩提升不一定带来任务成功率提升。
如何判断是否做对
分别测召回、排名和最终回答支持度;不要只测最终一项或只测搜索分数。
检索从证据需求开始
RAG连接外部检索与生成。原论文中的训练与推理设计,不等于今天所有“搜索后放入Prompt”的广义实践。工程系统还包含入库、切分、索引、查询、召回、重排和拼装。任何一层错误都可能使答案失真。[S095]
先区分任务要找精确符号、语义资料、历史变更还是运行结果。源文档过期,检索只能更快找到过期事实;切分丢掉条件,语义相似也不足以支持结论。
词项、稠密与晚交互
BM25等词项方法利用词出现与统计重要性;稠密检索把查询和文档编码为向量;DPR展示双编码器问答检索;ColBERT使用更细粒度Token表示与晚交互。向量距离不是事实正确率,include和exclude可能很近却含义相反。[S096][S098][S099]
切分应围绕可理解单位,代码可按函数/类并保留路径和签名。太小丢条件,太大增干扰;重叠帮助边界但产生重复,拼装时仍要去重。
Contextual Retrieval
Anthropic方案给片段补充基于原文的简短背景,再结合词项、向量与重排。孤立的“默认值由false改为true”需要知道字段、项目和版本;补充上下文可以帮助召回,但错误补充也会污染索引。原文与来源必须保留。[S096]
这不是给每个片段编造合理背景。对完整符号和路径已经明确的代码,额外长描述未必有收益,应先测精确检索基线。文章的实验结果只适用于其测试条件,不应直接当任意仓库的提效保证。
融合、重排与查询改写
RRF对不同排序按1/(k+r)累加,避免直接相加量纲不同的BM25和余弦分数。排名融合不能补回所有召回器都遗漏的文档。Reranker对候选作更精细判断,成本较高,通常用于较小集合。[S097]
HyDE生成假设文档帮助检索,但假设不是证据。RAPTOR建立层次摘要索引,GraphRAG组织关系与全局信息,两者适合不同需求,也会增加抽取误差与维护成本。[S100][S101][S120]
代码检索应利用结构
路径、正则、GitHub Code Search和ripgrep适合精确定位。Tree-sitter提供语法树与增量解析;LSP提供定义、引用、符号与诊断等语言服务。AST不自动拥有全部类型和运行时语义,LSP也依赖语言服务器与项目配置。[S102][S103][S104][S105]
原创调查顺序:配置字段→解析点→过滤函数→调用者传参→测试→变更历史→最小复现。同名符号不一定在真实执行路径。Git说明能解释历史原因,但当前行为仍由当前源码与运行证据判断。
RepoCoder研究迭代检索与生成,RepoBench和CodeSearchNet评价不同仓库上下文任务。补全、搜索与Issue修复不是同一种能力,指标不能直接换算。[S106][S107][S108]
检索指标与下游成功
Precision@k = 前k条相关数 / k
Recall@k = 前k条相关数 / 全部相关数
MRR = 各查询首条相关结果排名倒数的平均
MAP综合相关结果出现位置;nDCG支持分级相关性并按位置折损后归一化。若相关集未知,召回率本身也难精确测量。[S110]
原创例子:必须A、B两处证据,结果A、X、Y,Recall@3为1/2,Precision@3为1/3。若缺B无法判断兼容性,找到A不是任务成功。召回后被截断或误解释,仍会失败。BEIR提醒不同领域泛化需要独立评价。[S109]
失败排查顺序
检查源是否正确和新鲜→索引是否包含→查询是否准确→候选是否召回→重排是否误删→拼装是否截断→模型是否正确解释。权限过滤应在返回证据前执行,而非让模型看完再自觉保密。
自检:相似度最高是否最可信?不是。检索好是否可以省测试?不能,检索供证,测试验行为。
逐项中文讲义
保留拓展阅读目录编号与A/B/C优先级;每项包括机制解释、边界与原创练习。
A8.1 · 检索增强生成的基础
对应资料:Retrieval-Augmented Generation
原始RAG研究把参数化生成模型与非参数化文档记忆结合,利用检索证据辅助知识密集任务。今天工程中的RAG用法更广,不能把所有“搜索后回答”都当成原论文的完整实现。
检索负责提供候选证据,生成负责利用证据形成输出;两者都可能出错。文档过期、片段缺条件或模型误读都会导致错误答案。
检索不是把答案从模型里“挖出来”
输入与条件。用户问当前配置,参数记忆里可能只有旧值3,文件已为5。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1检索 | 读取当前文件 | 取得5及版本。 |
| 2增强 | 把证据放入当前请求 | 模型有了参数之外的信息。 |
| 3生成 | 答案受证据约束 | 仍需防止它混入旧值。 |
把过程连起来。RAG连接外部知识与生成,不改变模型参数本身。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:用一份带版本的配置说明回答问题,分别提供完整条件、截断条件和错误版本,观察应该如何改变结论。
完成标准是能定位失败发生在来源、检索、拼装还是生成,而不是把所有问题归为“RAG不够好”。
拓展阅读目录事实依据 [S095] · 练习与工程推导为本书独立编写。
A8.2 · 上下文增强的混合检索
对应资料:Introducing Contextual Retrieval
Contextual Retrieval给待索引片段补充来自原文的简短上下文,再结合词项、向量和重排。它帮助孤立片段保留指代与背景,不是允许模型为文档编造情境。
例如“该字段默认关闭”需要知道字段、版本和文档位置。补充这些信息有助于召回,也可能因摘要错误污染索引,所以必须保留原始内容与出处。
给片段补上下文,避免“它”失去指代
输入与条件。片段只有“它默认关闭”,父段说明“调试缓存”。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1缺背景 | 查询调试缓存时难匹配 | “它”没有具体对象。 |
| 2补上下文 | 标注“调试缓存:默认关闭”及来源 | 让片段可解释。 |
| 3核查 | 补充句不能写成“生产缓存关闭” | 生成的上下文也会引入错误。 |
把过程连起来。上下文增强应保来源和正确指代,不凭空扩写事实。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:为一个缺少主语的片段写两种补充,逐项检查是否都能从原文推出;无法推出的内容删除或标为未知。
论文或工程文章报告的收益只适用于其测试条件。代码精确符号检索本来很强时,额外上下文不一定值得。
拓展阅读目录事实依据 [S096] · 练习与工程推导为本书独立编写。
A8.3 · 倒数排名融合RRF
对应资料:Reciprocal Rank Fusion
RRF按不同检索结果中的名次融合,常见形式为对各列表累加1/(k+rank)。它避免直接相加不同量纲的原始分数,但不能恢复所有检索器都遗漏的文档。
平滑常数影响名次差异的权重;重复结果需要按真实文档身份合并,而不是只比较标题。融合之前还应完成权限过滤。
排名融合按名次而非分数量纲
输入与条件。排名1=[A,B],排名2=[B,A],c=60。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1A | 1/61+1/62 | 约0.032522。 |
| 2B | 1/62+1/61 | 相同得分。 |
| 3平局 | 按稳定次序或额外信息处理 | 不能捏造A明显更优。 |
把过程连起来。RRF不是万能判优器,对称输入理应相同。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:对两份包含相同与不同文档的排名手算RRF,观察一个在两边中等靠前的结果如何与单边第一竞争。
完成标准是理解融合依据与局限。RRF排名不是文档事实正确率,也不是最终回答的置信度。
拓展阅读目录事实依据 [S097] · 练习与工程推导为本书独立编写。
B8.4 · 稠密段落检索DPR
对应资料:Dense Passage Retrieval
DPR使用稠密表示进行段落检索,查询与文档可以分别编码。预先计算文档向量有利于检索效率,但质量依赖训练数据、编码器与任务分布。
语义相近可以匹配不同表述,也可能混淆否定、版本或同名实体。精确词项与元数据过滤仍有价值。
双塔检索把查询和文档分别编码
输入与条件。q=[1,0],dA=[0.8,0.6],dB=[0,1]。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1离线 | 先计算存储文档向量 | 不必每次与查询联合编码。 |
| 2在线 | 只编码q并计算点积 | A0.8,B0。 |
| 3训练 | 相关对比样本塑造距离 | 向量接近不自动证明版本和事实一致。 |
把过程连起来。双塔方便预索引,细粒度条件仍需后续证据判断。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:比较“启用缓存”和“禁用缓存”两个片段,说明为何整体语义相近却不能互换。再设计版本字段以避免旧说明被优先返回。
不要把向量相似度解释成答案正确概率。检索结果必须经过上下文与来源核查。
拓展阅读目录事实依据 [S098] · 练习与工程推导为本书独立编写。
B8.5 · 晚交互与多向量检索
对应资料:ColBERT
ColBERT采用细粒度Token表示与后期交互,在查询与文档的多个局部匹配之间形成评分。它不同于把整篇文档压成一个单向量后只做一次相似度比较。
多向量可以保留更多匹配细节,也带来存储、索引和计算权衡。并非所有规模与延迟要求都适合相同设计。
查询的每个Token各找最佳文档位置
输入与条件。查询两向量[1,0]、[0,1],文档位置[0.8,0.6]、[0,1]。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1第1查询 | 最大相似度0.8 | 匹配文档第1位置。 |
| 2第2查询 | 最大相似度1 | 匹配文档第2位置。 |
| 3求和 | 1.8 | 不是把所有四个相似度直接相加。 |
把过程连起来。晚交互保留多位置细节;此为MaxSim核心而非完整ColBERT实现。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:对同时包含“路径”“排除”“嵌套”三个条件的查询,比较单个整体向量与多个局部匹配可能遗漏什么。
完成标准是解释精细匹配带来的信息收益与工程成本,不把某个基准优势推广到所有代码库。
拓展阅读目录事实依据 [S099] · 练习与工程推导为本书独立编写。
B8.6 · 假设文档辅助检索
对应资料:HyDE
HyDE先生成一个假设性答案文档,再用其表示引导稠密检索。假设文本用于构造查询方向,不是已经确认的事实,更不能直接当引用来源。
它可能帮助短查询表达隐含需求,也可能把错误假设带入检索。真正结论仍需来自实际检索证据。
HyDE假设文档不是来源证据
输入与条件。问题“为何构建被排除”,模型猜“可能路径前缀误匹配”。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1假设 | 生成候选解释文本 | 还没有事实地位。 |
| 2检索 | 用它找相关源码和Issue | 发现startswith实现。 |
| 3验证 | 运行ab反例后才能确认 | 假设即使很像也不能直接引用为根因。 |
把过程连起来。生成内容可用于搜索线索,不可冒充真实资料。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:对“为什么构建漏掉文件”生成两个不同假设,再检查真实文档分别支持哪些。不得把先生成的假设当成根因。
完成标准是能够在取得证据后推翻假设,而不是让检索只寻找支持模型最初猜测的材料。
拓展阅读目录事实依据 [S100] · 练习与工程推导为本书独立编写。
C8.7 · 树状摘要索引
对应资料:RAPTOR
RAPTOR通过递归摘要组织层级结构,帮助检索跨片段和较全局的信息。叶节点与高层摘要承担不同粒度的证据作用。
层级摘要可能降低长文档导航成本,也可能逐层丢失条件或传播错误。需要能够回到原始片段,而不是只保存摘要树。
RAPTOR的上层摘要帮助定位,下层保留细节
输入与条件。四份文档分两组,各有摘要S1/S2,再有总摘要S0。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1宽问题 | 先查S0/S1/S2 | 找到相关文档组。 |
| 2细节问题 | “具体超时值是多少” | 回到对应原文叶子。 |
| 3版本 | 原文改变后摘要未更新 | 必须失效或重建派生节点。 |
把过程连起来。层级摘要利于跨文档概览,但精确事实仍依赖可追溯叶子。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:将三个模块说明合成一个系统摘要,标出哪些细节被丢弃,再设计需要回读叶节点的问题。
简单精确查找未必需要这种结构。是否采用应取决于全局问题比例、更新成本和实际任务收益。
拓展阅读目录事实依据 [S101] · 练习与工程推导为本书独立编写。
A8.8 · 代码搜索语法
对应资料:GitHub Code Search Syntax
GitHub代码搜索支持按路径、语言、符号和正则等约束查询。它适合减少候选范围,但搜索语法与普通自然语言搜索不同,使用时需要正确组合条件。
同名符号可能出现在测试、示例、旧目录或不同模块中。命中并不证明它位于实际执行路径,仍要读取调用关系与配置。
限制路径让同名符号搜索更精确
输入与条件。仓库src与vendor都包含parse。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1全库搜索 | 命中两处及示例文档 | 候选杂。 |
| 2范围限制 | 只查目标语言和src路径 | 先去掉无关依赖副本。 |
| 3扩大条件 | 若调用来自vendor | 再有理由扩大,而不是永远禁止读依赖。 |
把过程连起来。范围控制是渐进策略,不是一次锁死所有证据。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:为exclude设计从宽到窄的查询:先定位字段,再限制构建目录与语言,最后查调用者。记录每次缩小范围的依据。
不要把首次命中当唯一实现,也不要因为结果太多就无条件读取全部文件。
拓展阅读目录事实依据 [S102] · 练习与工程推导为本书独立编写。
A8.9 · 精确搜索与范围控制
对应资料:ripgrep User Guide
ripgrep提供高效的文本和正则搜索,文件过滤与范围控制对代码调查尤其重要。精确搜索通常成本低,适合已知错误码、字段或函数名。
搜索默认忽略规则、隐藏文件和大小写等行为会影响结果。找不到时应检查搜索范围与配置,而非立刻断言代码不存在。
grep不到时不要立刻断定不存在
输入与条件。默认搜索忽略生成目录,目标字符串只在generated/中。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1负结果 | 当前搜索范围无命中 | 不等于整个文件系统无内容。 |
| 2查配置 | 确认忽略规则、大小写和二进制处理 | 发现generated被排除。 |
| 3补搜 | 在授权范围内显式包含目录 | 取得实际结果。 |
把过程连起来。搜索工具的范围是结论的一部分。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:在小目录中放入普通文件、忽略文件和同名测试,分别搜索并解释结果差异。只使用无害的本地教学数据。
完成标准是能明确“在哪里搜了什么”,并把搜索结果作为候选证据,而不是把工具速度当作语义理解能力。
拓展阅读目录事实依据 [S103] · 练习与工程推导为本书独立编写。
A8.10 · 语法树与增量解析
对应资料:Tree-sitter
Tree-sitter提供增量解析与语法树能力,使工具可以按代码结构而非纯文本处理内容。AST描述语法,不自动包含全部类型、依赖与运行时行为。
结构化切分可以按函数或类保留边界,减少随意截断;但仍可能需要文件级导入、注释或调用上下文。
改一行后增量语法树更新什么
输入与条件。函数体一行从x+1改成x+2。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1解析范围 | 受影响表达式与相关父节点重建 | 无需总从零解析整个文件。 |
| 2树节点 | 运算符仍+,常量从1变2 | 语法结构变化很局部。 |
| 3语义 | 测试预期是否应变 | 语法有效不代表功能正确。 |
把过程连起来。增量解析提高结构更新效率,不替代业务验证。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:把一个含嵌套函数和同名变量的示例分别按固定字符数与语法节点切分,比较每段是否能独立理解。
不要把成功解析等同于代码正确。语义检查、编译与测试仍有独立作用。
拓展阅读目录事实依据 [S104] · 练习与工程推导为本书独立编写。
A8.11 · 定义、引用与语言服务
对应资料:Language Server Protocol
LSP定义编辑器与语言服务之间的交互,包括定义、引用、符号和诊断等能力。结果取决于具体语言服务器、项目配置与索引状态。
它可以帮助Agent找到真实符号关系,但动态语言、生成代码或不完整项目可能限制分析。没有返回引用不必然等于不存在调用。
同名变量有不同绑定
输入与条件。外层x=1,函数参数也名为x。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1文本 | 两处都叫x | grep不能区分绑定。 |
| 2作用域 | 函数内x引用参数 | 不引用外层值。 |
| 3重命名 | 仅重命名参数相关引用 | 不应机械改所有x。 |
把过程连起来。符号服务把名称与作用域/类型关联,而非只搜字符串。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:对一个跨文件函数追踪定义和调用,再比较文本同名搜索。说明哪些候选是同名但不同绑定。
完成标准是把语言服务作为结构证据与文本、运行结果结合,而不是把协议名称当成全语言完美理解保证。
拓展阅读目录事实依据 [S105] · 练习与工程推导为本书独立编写。
B8.12 · 仓库级迭代检索与生成
对应资料:RepoCoder
RepoCoder研究仓库级代码补全中的迭代检索与生成。生成的中间结果可以帮助下一轮检索,但也可能引入错误方向,需要真实上下文修正。
仓库级补全与完整Issue修复不同。前者的评价不能直接说明Agent能处理部署、测试环境或长期状态。
第一次生成失败反过来改进检索
输入与条件。模型猜函数parse(text),测试报缺少参数mode。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1反馈 | 错误暴露签名缺口 | 不是继续猜mode含义。 |
| 2新检索 | 读取parse真实定义和调用样例 | 获得参数契约。 |
| 3再生成 | 按签名修改并验证 | 迭代的价值来自新证据。 |
把过程连起来。检索—生成迭代必须吸收失败反馈,不只是重复同样提示。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:先用函数注释检索相关API,再用候选实现中的符号缩小搜索,检查每轮是否获得新的必要证据。
若第二轮只是重复返回同样片段,增加循环未必有价值。迭代应有信息增益与停止条件。
拓展阅读目录事实依据 [S106] · 练习与工程推导为本书独立编写。
B8.13 · 仓库级补全评测
对应资料:RepoBench
RepoBench关注仓库级代码补全与上下文使用的评价,帮助区分检索能力和生成能力。数据设置、可见文件与任务定义会影响结果解释。
一个系统可能检索正确但补全错误,也可能通过局部模式猜对而没有利用仓库证据。仅看最终分数难以解释机制。
仓库补全评测要隔离邻近答案泄漏
输入与条件。测试文件缺一段代码,训练集中却有相同仓库的完整旧副本。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1泄漏 | 模型可能记住几乎一样的答案 | 分数高不代表跨仓库理解。 |
| 2切分 | 按仓库或时间与近重复关系分组 | 控制重叠。 |
| 3评测 | 看编译/测试与语义,而不只字符串一致 | 等价实现可能不同文本。 |
把过程连起来。代码评测既要防泄漏,也要允许行为等价。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:固定生成器,改变检索上下文;再固定上下文,比较生成方式。记录哪一环造成差异。
不要把补全基准表现直接等同于代码审查、跨模块修改或用户需求理解能力。
拓展阅读目录事实依据 [S107] · 练习与工程推导为本书独立编写。
C8.14 · 代码语义搜索数据集
对应资料:CodeSearchNet Challenge
CodeSearchNet为代码语义搜索提供数据与评价场景,重点是自然语言查询与代码之间的匹配。代码的命名、注释和语言分布会影响任务难度。
实际仓库可能缺少良好注释,也可能包含重复模板、生成文件和私有术语。公开数据集表现不自动迁移到这些条件。
自然语言搜代码不总能靠同词命中
输入与条件。问题“忽略某目录”,函数名为should_skip。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1词面 | 问题没有skip | 精确匹配可能漏。 |
| 2语义 | 向量或训练检索可召回should_skip | 提供候选。 |
| 3确认 | 读取函数体、调用和测试 | 相似候选不等于正确目标。 |
把过程连起来。语义搜索弥补措辞差异,最后仍需结构和行为证据。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:给同一函数分别提供清楚注释、模糊注释和无注释,比较查询应该依赖哪些信息。
完成标准是理解数据分布与任务边界,而不是把语义搜索当成取代所有符号工具的唯一入口。
拓展阅读目录事实依据 [S108] · 练习与工程推导为本书独立编写。
B8.15 · 异构检索评测
对应资料:BEIR
BEIR通过异构检索任务评价泛化,提醒系统在某一数据集上的优势不一定在另一个领域成立。任务、文档长度、查询风格和相关性定义都会改变结果。
代码检索、问答段落检索与全局文档总结的需求不同。评价应包含自己的真实任务,而不只选择最有利的公开榜单。
在一种文档上调好,不代表另一种也好
输入与条件。检索器A擅长技术文档,B擅长短问答。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1单数据集 | A在技术库领先 | 只支持该场景。 |
| 2异构评测 | 加入新闻、论坛、论证与事实查询 | 观察跨域变化。 |
| 3选择 | 按实际业务分布或分层结果 | 不只取总体排行榜名次。 |
把过程连起来。检索泛化需要多类型问题,不能把单场景收益外推所有仓库。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:设计精确错误码、自然语言意图和跨文档问题三类查询,分别比较词项与向量方法。
完成标准是能说明方法在哪类任务有效、在哪类失效,并把成本与更新难度一起纳入选型。
拓展阅读目录事实依据 [S109] · 练习与工程推导为本书独立编写。
B8.16 · 排序检索指标
对应资料:Evaluation of Ranked Retrieval Results
Precision关注返回结果中有多少相关,Recall关注必要证据找到多少;MRR、MAP和nDCG进一步考虑排序与相关程度。它们衡量不同目标,不能互相替代。
相关性标签本身可能不完整,尤其是代码任务需要多份证据共同支持结论时。一个相关片段不足以完成全部推理。
同样召回两条,排序质量可以不同
输入与条件。相关集合={A,B},列表X=[A,B,C],Y=[C,A,B]。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1Recall@3 | 两者都2/2=1 | 覆盖相同。 |
| 2首相关倒数排名 | X=1,Y=1/2 | MRR贡献不同。 |
| 3用途 | 用户只看首项时X更好 | 指标应贴合下游行为。 |
把过程连起来。排序指标衡量“多早看到”,召回衡量“是否看到”。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:设需要A、B两个文件,结果只返回A和两个噪声文件,计算Precision与Recall,再解释任务为什么仍可能失败。
指标应延伸到上下文拼装与最终任务结果。候选里有证据但被截断,不能算Agent真正获得了它。
拓展阅读目录事实依据 [S110] · 练习与工程推导为本书独立编写。