想象你走进一家占地三个足球场的超级工具城——锤子、电钻、螺丝刀、液压机……五万种工具密密麻麻排满货架。如果你的目的只是“把一张全家福挂上墙”,你希望店员把五万种工具全推到你面前,还是希望有位金牌导购,听你说完需求后,径直带你走到“免打孔无痕钉”那一排? 大模型 Agent 正面临同样的处境。当 Agent 接入了上千个 API 和插件——查天气的、算账的、发邮件的、订机票的——它不可能把每个工具的说明书都读一遍再决定用哪个。且不说上下文窗口装不下,就算硬塞进去,几千份说明书混在一起,反而让模型眼花缭乱、选错工具。 Tool Retrieval(工具检索)就是那位金牌导购。它先听懂你的真实意图,在数千份“工具说明书”中快速筛出最相关的几个候选,再从中挑出最合适的那一件交给大模型。整个过程就像导购在工具城里扫货架:搜意图、看标签、挑候选、比细节、记笔记。本文就用“工具城”的故事,带你一步步看懂 Agent 是如何从千万工具里精准捞出那一把对的工具的。

岗位关联

学会工具检索,你就能让 Agent 从“什么都能调”进化到“精准调用”,这是构建企业级多 API/多插件 Agent 系统的核心能力,也是 AI 应用从 Demo 走向生产的关键一环。

目录
  1. 可视化演示
  2. 检索必要性
  3. 意图解析
  4. 工具向量化
  5. 语义检索
  6. 候选重排序
  7. 反馈迭代
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

动态演示Agent中的Tool Re的核心机制,通过全局/局部/动态/静态四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Agent中的Tool Re:工具检索 工具检索的问题背景与核心挑战 工具向量化与嵌入表示方法 核心机制可视化 Agent中的Tool Re整体架构与关键组件

检索必要性

小林推门走进“万物工具城”,向导购老周求助:“我想把全家福挂上墙,但我租的房子不能打孔。”老周没有喊人把五万种工具全搬来,而是问了两句就带着小林走向“墙面固定”区。为什么导购绝不把整座城搬来?因为顾客要的不是“拥有所有工具”,而是“快速选对工具”。搬来全城,既费脚力,又让顾客在五千种锤子和三百种钉子里彻底看花眼。

Agent 也一样。一个真正落地的 Agent 系统往往注册了数百上千个 API:查天气、订酒店、算汇率、发邮件、查数据库……大模型的上下文窗口再大也是有限的,假设每个工具说明折算 50 个 token,一千个工具就是五万 token,窗口先被吃掉一大半,费用也直线上升。

更麻烦的是注意力稀释:无关工具的说明挤占大量位置,模型对真正相关工具的注意力权重被摊薄,选错率反而上升。所以“先检索、后决策”成了标配——先用轻量手段把战场缩小,再让大模型在少数候选里做精细抉择。

老周深谙此道:他带着小林直奔“墙面固定”区,而不是让小林在五万种工具里迷路。检索,就是 Agent 的“直奔主题”——用最小的成本,把模型的注意力聚焦在最该看的地方。

Cfull=∑i=1NLi≫Cretrieved=∑i=1KLi\displaystyle C_{\text{full}} = \sum_{i=1}^{N} L_i \quad \gg \quad C_{\text{retrieved}} = \sum_{i=1}^{K} L_i
全量注入 N 个工具的上下文成本,远大于只注入检索出的 K 个候选,K 通常只有 3~5,这就是检索的价值。
  1. 工具总数 NAgent 注册的全部工具数量,实战中可以从几十到数千。
    N=1000N = 1000
  2. 单个描述长度 L_i第 i 个工具的功能说明折算成的 token 数,写得越详细占用越多。
    Li=50 tokensL_i = 50 \, \text{tokens}
  3. 全量注入成本把 N 个工具说明全部拼进上下文的总长度,随 N 线性膨胀。
    Cfull=50×1000=50000C_{\text{full}} = 50 \times 1000 = 50000
  4. 检索后成本只把 Top-K(如 3~5 个)候选注入,成本骤降一个数量级。
    Cretrieved=50×5=250C_{\text{retrieved}} = 50 \times 5 = 250
  5. 远大于符号 ≫两者差距可以到几十上百倍,这正是“先检索”存在的理由。

意图解析

老周没有急着拿货,而是先竖起耳朵听完:“租的房子不敢打孔”“照片挺重的”“不想用胶带留痕迹”。他在心里把这一堆口语总结成三个词:免打孔、轻量、可移除。这个“听诉求、抓重点”的过程,就是 Agent 工具检索的第一步——意图解析。

用户的原话往往口语化、带省略:“照片挂不上墙怎么办?”如果直接拿这句话去匹配“无痕钉挂钩”的工具描述,很可能因为措辞完全不同而匹配失败。于是有了查询改写:让大模型把口语展开成多个检索友好的表达,比如把“照片挂不上墙”改写成“免打孔挂画 轻量墙面固定 可移除挂钩”。

改写之后还要做意图分类和关键词抽取:判断这是“固定/安装”类需求,提炼出“挂墙、免打孔、轻量”等关键词。最后,把整理好的文本送给同一个编码器,变成查询向量 q,供后续检索使用。一句话总结:查询向量质量,决定了检索的天花板。

老周掏出小本子写下的三行要点,就是 Agent 里的“改写后查询”。别小看这一步——导购听得懂潜台词,才能在货架之间找得准;Agent 的检索也是如此。

q=Encoder(Rewrite(query))\displaystyle \mathbf{q} = \text{Encoder}\big(\text{Rewrite}(\text{query})\big)
原始用户问法先被改写,再被编码成向量 q。同样是“挂照片”,改写后的文本让检索系统更容易对上工具描述的措辞。
  1. 原始输入用户的自然语言,往往口语化、省略多。
    query="照片挂不上墙怎么办"\text{query} = \text{"照片挂不上墙怎么办"}
  2. 查询改写大模型补全同义词、去口语、加场景,得到检索友好文本。
    Rewrite(query)="免打孔 挂墙 轻量 可移除 挂钩"\text{Rewrite}(\text{query}) = \text{"免打孔 挂墙 轻量 可移除 挂钩"}
  3. 编码器把文本映射为稠密向量的模型,查询和工具共用同一套。
    Encoder(⋅):文本→Rd\text{Encoder}(\cdot) : \text{文本} \to \mathbb{R}^d
  4. 查询向量 q一个 d 维数值数组,代表“这段文字在语义空间里的坐标”。
    q∈Rd\mathbf{q} \in \mathbb{R}^d

工具向量化

老周为什么能秒懂“免打孔挂墙”对应无痕钉?因为他脑子里有一张货架地图,每件工具旁边都贴着“用途标签”:冲击钻→打孔、无痕钉→免打孔挂墙、重物挂钩→承重安装。Agent 的“脑内地图”就是工具向量化。

做法分三步:首先为每个工具写一段富描述,不能只写名字,要覆盖功能、参数、典型使用场景,比如“无痕钉:免打孔安装,适配 5kg 以内挂画,适合租房墙面”;然后让同一个编码器把这段描述变成 d 维向量 t_i;最后把所有向量建成索引(如 FAISS、HNSW),供检索时快速查找。

向量化的精妙之处在于:语义接近的文本会落在向量空间相近的位置。“免打孔挂钩”和“无痕钉”的向量会很近,而“扳手”的向量离得很远。这样即使查询和描述措辞完全不同,也能靠语义位置匹配上。

标签贴得好,导购才能扫货架;描述写得好,检索才能找得准。这也是为什么资深团队会花大力气做“描述工程”——工具向量化的质量,几乎决定了整个检索系统的上限。

ti=Encoder(desci)∈Rd\displaystyle \mathbf{t}_i = \text{Encoder}(\text{desc}_i) \in \mathbb{R}^{d}
每个工具的描述文本 desc_i 被编码成 d 维向量 t_i。描述写得越贴近用户语言,向量越容易和查询“撞个满怀”。
  1. 工具描述人工(或借助大模型)生成的富文本,包含功能、参数、场景。
    desci="免打孔挂墙,适配5kg以内挂画"\text{desc}_i = \text{"免打孔挂墙,适配5kg以内挂画"}
  2. 编码器与查询侧完全相同的模型,保证两边向量在同一个语义空间可比。
    Encoder(⋅)\text{Encoder}(\cdot)
  3. 工具向量描述文本对应的空间坐标,语义相近则坐标相近。
    ti\mathbf{t}_i
  4. 维度 d 与实数域每个向量是 d 维实数数组,可直接存入向量数据库。
    ti∈Rd\mathbf{t}_i \in \mathbb{R}^d

语义检索

老周拿着整理好的需求小纸条,在货架间快速走动:看到“免打孔”就停下来多看一眼,看到“扳手”“电锯”就掠过去。这个“按语义扫货架”的动作,就是 Agent 工具栏里的语义检索。

技术实现上,检索系统计算查询向量 q 与每个工具向量 t_i 的余弦相似度,取值越接近 1 说明方向越一致、语义越接近。计算完所有工具后,按相似度从高到低排序,取前 K 个作为候选。为了防召回不全,工程上还常用混合检索:让关键词检索(如 BM25,负责字面匹配)与向量检索(负责语义匹配)并行跑,把两路结果合并去重,互相补漏。

别忽略阈值控制:相似度太低的候选不要硬凑,比如 0.1 分的“扳手”明显和“挂画”无关,直接丢弃,避免噪声工具混进候选集污染后续决策。

老周回来时只带了 5 件工具而不是 30 件,因为扫货原则是“宁缺毋滥”。检索召回同样讲究质量与数量的平衡:召回太少怕漏,召回太多怕噪声,Top-K 与阈值就是这两个方向的调节旋钮。

sim(q,ti)=q⋅ti∥q∥ ∥ti∥=cos⁡θ\displaystyle \text{sim}(\mathbf{q}, \mathbf{t}_i) = \frac{\mathbf{q} \cdot \mathbf{t}_i}{\|\mathbf{q}\| \, \|\mathbf{t}_i\|} = \cos\theta
余弦相似度衡量两个向量的方向一致性。1 表示几乎同向(语义极近),0 表示垂直(无关),-1 表示相反。
  1. 点积分子两向量对应位相乘再求和,越大说明方向越一致。
    q⋅ti=∑j=1dqj⋅ti,j\mathbf{q} \cdot \mathbf{t}_i = \sum_{j=1}^{d} q_j \cdot t_{i,j}
  2. 模长分母两个向量各自长度,用于抵消文本长短带来的偏差。
    ∥q∥=∑j=1dqj2\|\mathbf{q}\| = \sqrt{\sum_{j=1}^{d} q_j^2}
  3. 归一化相似度结果落在 [-1,1],只看方向不看长度。
    cos⁡θ∈[−1,1]\cos\theta \in [-1, 1]
  4. 阈值控制实践中常设 0.2~0.4 的阈值,低于阈值直接丢弃。
    sim≥threshold⇒保留\text{sim} \ge \text{threshold} \Rightarrow \text{保留}

候选重排序

回到柜台,老周把 5 件候选一字排开,逐一细看:冲击钻?要打孔,排除。超重挂钩?承重够了但会留大痕迹,排除。最后锁定“无痕钉 + 小锤子”的组合。这个“再细细比对”的动作,在 Agent 里叫重排序。

为什么要重排?因为向量检索(业内称双塔编码器)为了快,查询和工具是分开各自编码的,彼此看不到对方的具体细节,难免粗放。重排序阶段改用交叉编码器,把查询文本和工具描述拼接在一起,投入同一个模型“仔细看一遍”,判断两者是否真正匹配——看得细,判得准,但速度慢,所以只对已经筛出来的 Top-K 小集合做。

实战中还常做多信号融合:把向量相似度、关键词命中数、工具历史调用成功率等打分加权求和,得到最终排序分,再截断到更小的 K'(通常 2~3 个),只把最有把握的候选交给大模型做最后决策。粗筛求快,精排求准,两者缺一不可。

导购的“再想想”就是 Agent 的“精排”——第一轮靠跑得快圈定候选人,第二轮靠看得细挑出最优解。这两轮配合,才是工具检索准确率的关键保障。

si=λ⋅simbi(q,ti)+(1−λ)⋅sicross\displaystyle s_i = \lambda \cdot \text{sim}_{\text{bi}}(\mathbf{q}, \mathbf{t}_i) + (1-\lambda) \cdot s_i^{\text{cross}}
最终得分 = 双塔快速分 × 权重 λ + 交叉精排分 × 权重 (1−λ)。λ 通常取 0.3~0.5,通过验证集调参。
  1. 双塔粗筛分向量检索阶段算出的余弦相似度,快但只看了“大致方向”。
    simbi(q,ti)\text{sim}_{\text{bi}}(\mathbf{q}, \mathbf{t}_i)
  2. 交叉精排分把查询和工具说明拼起来过模型,细看措辞与逻辑关系,准但慢。
    sicross=CrossEncoder(query,[SEP],desci)s_i^{\text{cross}} = \text{CrossEncoder}(\text{query}, [\text{SEP}], \text{desc}_i)
  3. 融合权重 λ控制两条信号的信任比例,λ 大偏向量,λ 小偏交叉。
    λ∈[0,1]\lambda \in [0, 1]
  4. 最终得分与截断按 s_i 排序,只保留前 K' 个交给大模型。
    K′<K(通常 K′=2∼3)K' < K \quad (\text{通常 } K' = 2 \sim 3)

反馈迭代

小林满意地带着无痕钉走了。老周却默默在柜台的小本子上记了一笔:“租客挂照片 → 无痕钉 + 小锤子,命中。”他决定下次遇到类似需求,直接优先推荐。这个“记笔记”的习惯,就是工具检索系统的反馈迭代。

离线侧,团队会构建一个标注评测集:收集一批真实用户请求,标注“这条请求到底该用哪些工具”。然后用 Recall@K 这样的指标度量检索质量,每次改动描述或排序逻辑都要回归测试,防止“改好了 A 类请求、砸了 B 类请求”。

在线侧,系统记录每次检索的命中与失败日志。检索失败时执行回退策略:改写查询再试一次、放宽相似度阈值、或直接回退到通用兜底工具;同时把失败案例定期回流,用来修正工具描述、调优排序权重。日子久了,导购越来越懂顾客,检索系统也越来越懂用户。

导购的“小本子”越记越厚,服务就越老练;Agent 的检索系统也一样——数据喂得越多、回退练得越勤,它就越懂得在关键时刻递出那把最趁手的工具。

Recall@K=∣ 相关工具∩前K个召回 ∣∣ 相关工具 ∣\displaystyle \text{Recall@K} = \frac{\big|\, \text{相关工具} \cap \text{前K个召回} \,\big|}{\big|\, \text{相关工具} \,\big|}
Recall@K 衡量“该捞的相关工具有没有被捞上来”。1 表示相关工具全部进了前 K,0 表示一个都没捞到。
  1. 相关工具集合评测集里人工标注的正确答案,即这条请求该用哪些工具。
    相关工具={无痕钉,小锤子}\text{相关工具} = \{\text{无痕钉}, \text{小锤子}\}
  2. 前 K 个召回系统实际返回的候选集合。
    前K个召回={无痕钉,冲击钻,扳手}\text{前K个召回} = \{\text{无痕钉}, \text{冲击钻}, \text{扳手}\}
  3. 交集大小两者重合的数量,分子越大说明捞得越全。
    ∣相关工具∩前K个召回∣=1| \text{相关工具} \cap \text{前K个召回} | = 1
  4. 归一化除以相关工具总数,结果落在 [0,1],1 表示零遗漏。
    Recall@K=12=0.5\text{Recall@K} = \frac{1}{2} = 0.5

AI 应用场景

企业智能客服的服务路由

阶段:工具检索与编排

解决的问题:传统客服机器人靠人工编写“意图→接口”规则表,几百个意图、上千个接口导致规则爆炸、维护困难,口语问法还常常匹配不上。引入工具检索后,客服 Agent 先把用户问题改写成查询向量,从上千个内部 API 中召回最相关的 3~5 个,再交给大模型决策调用;新接口只需写描述注册,无需改规则。

具体案例:某电商平台的售后 Agent 接入 800 多个内部 API。用户说“我上次买的鞋码不对”,检索系统召回“订单查询”“退换货申请”“物流追踪”三个工具,大模型先查订单、再引导退换货,整个链路 2 秒内完成;上线后意图路由准确率从 82% 提升到 95%。

插件市场与 MCP 的动态加载

阶段:插件选择与上下文管理

解决的问题:像 MCP 协议、插件生态里动辄成千上万个第三方工具,全量加载会把上下文挤爆,也带来安全和成本风险。工具检索负责根据用户请求只加载少数几个相关插件,其余保持“未激活”状态。

具体案例:一个集成了 200 个 MCP Server 的 Agent 平台,用户说“帮我把这段视频转成文字稿并总结要点”,检索系统只召回“视频转写”“文本摘要”两个 MCP 工具,跳过了其余 198 个;既省 token,又大幅降低误调用概率。

金融投研 Agent 的多源数据选择

阶段:数据源检索与调度

解决的问题:投研场景有行情、财报、新闻、另类数据等上百个数据 API,每个都贵且慢;如果每次全部调用,费用失控、响应迟缓。工具检索先根据提问筛出最相关的几个数据源再调用。

具体案例:用户提问“分析新能源板块最近的估值水平”,检索系统召回“板块行情”“估值因子库”“行业研报”三个数据 API,Agent 按序调用并合成回答,数据成本下降约 70%,同时返回速度提升了一倍。

Python 演示

python72 行
"""极简 Tool Retrieval 演示:词袋向量 + 余弦相似度,实现工具语义召回与粗排"""import mathfrom collections import Counter  def tokenize(text):    tokens = []    for word in text.strip().lower().split():        if any('\u4e00' <= ch <= '\u9fff' for ch in word):            if len(word) == 1:                continue            tokens.extend(word[i:i + 2] for i in range(len(word) - 1))        elif len(word) >= 2:            tokens.append(word)    return tokens  def build_vocab(docs):    vocab = []    for doc in docs:        for w in tokenize(doc):            if w not in vocab:                vocab.append(w)    return vocab  def to_vector(text, vocab):    counts = Counter(tokenize(text))    v = [counts.get(w, 0) for w in vocab]    norm = math.sqrt(sum(x * x for x in v))    return [x / norm for x in v] if norm else v  def cosine(a, b):    return sum(x * y for x, y in zip(a, b))  class ToolRetriever:    def __init__(self, tools):        self.tools = tools        self.vocab = build_vocab([t["desc"] for t in tools])        self.tool_vecs = [to_vector(t["desc"], self.vocab) for t in tools]     def retrieve(self, query, top_k=3, threshold=0.05):        qv = to_vector(query, self.vocab)        scored = []        for i, tv in enumerate(self.tool_vecs):            s = cosine(qv, tv)            if s >= threshold:                scored.append((s, i))        scored.sort(reverse=True)        return [(self.tools[i]["name"], round(s, 3)) for s, i in scored[:top_k]]  def main():    tools = [        {"name": "calculator",  "desc": "数学 计算 表达式 加减乘除 calculate math"},        {"name": "weather",     "desc": "查询 天气 预报 城市 weather forecast"},        {"name": "search_wiki", "desc": "搜索 百科 知识 文章 wiki search"},        {"name": "send_email",  "desc": "发送 邮件 给 收件人 email send"},        {"name": "translate",   "desc": "翻译 文本 语言 互译 translate text"},        {"name": "currency",    "desc": "货币 汇率 兑换 转换 currency exchange"},    ]    retriever = ToolRetriever(tools)    queries = ["帮我算一下这个数学表达式", "今天天气怎么样", "把这段话翻译成英文"]    for q in queries:        print("Query:", q)        print(" ->", retriever.retrieve(q))  if __name__ == "__main__":    main()
目的:用纯标准库实现一个微型工具检索器,演示“工具描述向量化 → 余弦相似度召回 → Top-K 输出”的完整链路。真实系统会把这里的词袋向量换成神经网络编码器,但流程完全一致。
  1. tokens.extend(word[i:i + 2] for i in range(len(word) - 1))中文没有空格分词,按“相邻双字”切出语义单位,模拟 token 化的效果。
  2. norm = math.sqrt(sum(x * x for x in v))计算向量模长并归一化,让余弦相似度只关心语义方向,而非词频高低。
  3. self.tool_vecs = [to_vector(t["desc"], self.vocab) for t in tools]预先把所有工具描述编码成向量并缓存,相当于“向量索引”,检索时不再重算。
  4. for i, tv in enumerate(self.tool_vecs):逐个工具与查询向量比对,等价于导购沿货架一张张看标签。
  5. scored.sort(reverse=True)按相似度从高到低排序,等价于“货架扫描后按匹配度排队”。
  6. if __name__ == "__main__":程序入口,保证被 import 时不会自动执行演示逻辑。

常见误区

误区“我的上下文窗口足够大,把一千个工具的说明全部塞进去,让模型自己挑,不是比检索更保险吗?反正它什么都能看到。”

正解就像导购把五万种工具全堆在顾客面前,顾客只会更晕。大模型的注意力是稀缺资源,大量无关说明会稀释相关工具的权重,导致“看是看到了、选却选不准”。而且每个 token 都要付计算成本,延迟和费用齐涨。检索的本质是“先缩小战场,再精确制导”。

为何常见:因为上下文窗口的数值看起来很大(几十万 token),容易让人误以为“塞得下就等于效果好”,忽略了注意力分配的瓶颈。

误区“做工具向量化时,直接把工具名字(比如 calculator、get_weather)丢给编码器就行,名字短还省 token,何必写那么多描述?”

正解工具名往往只有一两个词,信息量太少,语义空间里名字接近的工具不见得功能相近,容易召不准。正确做法是把名字、功能说明、参数规则、典型使用场景拼成一段“富描述”再编码,就像货架上除了名字还要贴“用途标签”,导购才能对号入座。

为何常见:因为“向量化”听起来就是把文本变成数字,人很容易顺手拿最近的文本(工具名)交差,低估了描述工程的重要性。

误区“双塔向量检索一次排序就搞定了,重排序是多余步骤,只会拖慢速度、增加成本。”

正解双塔检索为了速度,把查询和工具分开编码,彼此看不到对方的细节,歧义词和复杂逻辑都处理不好。交叉编码器把两者拼起来“仔细看”,精度高但慢。工程上标配是“双塔粗筛 + 交叉精排”,用一点点延迟换准确率的大幅提升,物超所值。

为何常见:因为小 Demo 里工具只有几十个,双塔的误差不明显;一旦工具上千、描述变长,粗筛结果会肉眼可见地变糙。

误区“检索结果为空,说明用户乱说话或工具没注册,直接回复'暂时无法处理'就行了。”

正解金牌导购不会因为没听懂就赶客,他会礼貌地再问一句、换个说法继续服务。工程上对应的是失败回退策略:改写查询重试、放宽相似度阈值、回退到通用兜底工具。实践数据表明,一套好的回退策略往往能把任务成功率提升好几个百分点。

为何常见:因为开发时只设计了“检索命中”这条快乐路径,忽略了“检索失败”同样高发,而它恰恰是用户最需要被服务、体验最容易崩坏的场景。

面试题

Q1. Tool Retrieval 在 Agent 中的核心作用是?

单选题 · easy

  • A.提升工具本身的执行速度
  • B.从海量工具里筛出最相关的工具← 正确答案
  • C.替代大模型做最终决策
  • D.负责训练工具的模型参数

答案:B。Tool Retrieval 解决的是“工具太多选哪个”的问题,就像导购从五万件工具里筛出几件给顾客。A 是工具执行引擎的职责,C 是 LLM 的职责,D 与检索无关。

Q2. 为什么不能把所有工具说明全塞进提示词?

单选题 · easy

  • A.模型会自动忽略全部说明
  • B.上下文有限且无关信息干扰选择← 正确答案
  • C.工具说明往往包含商业机密
  • D.工具说明之间会互相覆盖

答案:B。上下文窗口有限,且大量无关描述会稀释注意力、抬高成本。A 错在模型不会自动忽略;C、D 属于臆测。类比:把整座工具城推到顾客面前,只会让人更晕。

Q3. 工具向量化阶段,真正被编码成向量的对象是?

单选题 · mid

  • A.工具的调用频次统计表
  • B.工具编译后的运行文件
  • C.工具的功能描述文本← 正确答案
  • D.工具的作者与出处信息

答案:C。编码的是“功能描述文本”,因为检索要匹配的是语义。调用频次、二进制文件不含语义,作者信息与检索无关。好比货架上贴的是“用途标签”,而不是工具出厂编号。

Q4. 双塔检索与交叉编码器的典型配合方式是?

单选题 · mid

  • A.双塔负责精排,交叉负责粗筛
  • B.双塔粗筛候选,交叉精排候选← 正确答案
  • C.两者功能完全相同可互相替换
  • D.交叉编码器负责建向量索引

答案:B。双塔把查询和工具分开编码,快但粗,适合第一轮召回;交叉编码器把两者拼起来细看,准但慢,适合对少量候选精排。C、D 均错,这正对应导购“先扫货架、再仔细比对”的两步。

Q5. 查询改写带来的主要收益是什么?

单选题 · mid

  • A.缩短用户的原始输入长度
  • B.拉近查询与工具描述的措辞← 正确答案
  • C.自动隐藏用户的隐私信息
  • D.让检索结果变得更随机

答案:B。用户口语与工具描述经常措辞不同,改写后补全同义词和场景,让两边在语义空间更接近,从而提升召回准确率。A、C 不是目的,D 说反了。

Q6. 检索策略中的“混合检索”通常指什么?

单选题 · hard

  • A.关键词召回与向量召回并行融合← 正确答案
  • B.多个大模型生成结果再投票
  • C.多个用户意图同时并行检索
  • D.工具调用次数和用户评分融合

答案:A。混合检索特指字面匹配(如 BM25)与语义匹配(向量检索)并行召回、合并去重,兼顾“字面对得上”和“意思对得上”。B、C、D 是其他环节的设计,不是混合检索的定义。

Q7. 关于 Recall@K 的描述,正确的有哪些?

多选题 · mid

  • A.表示前 K 个结果中相关工具的占比
  • B.表示相关工具被前 K 个召回的覆盖度← 正确答案
  • C.数值越低说明漏掉的相关工具越多← 正确答案
  • D.数值越低说明排序精度越差

答案:BC。B 是 Recall@K 的定义;C 是其直接含义。A 描述的是 Precision@K;D 描述的是 NDCG/MRR 这类排序指标。类比:召回率考的是“该捞的鱼有没有捞上来”,顺序好不好是另一回事。

Q8. 关于工具描述质量对检索的影响,哪些做法得当?

多选题 · mid

  • A.描述覆盖功能、参数和典型场景← 正确答案
  • B.描述使用贴近用户问法的语言← 正确答案
  • C.描述过短会导致语义区分不足← 正确答案
  • D.描述越长越好,上限设得越高越好

答案:ABC。富描述让工具在语义空间里“标签清晰”,贴近用户的措辞让向量更易与查询靠近,过短则区分度差。D 错在无限加长会稀释关键词、引入噪声,好比标签写满三页纸反而让人找不到重点。

Q9. 检索失败且无候选时的合理兜底策略有哪些?

多选题 · hard

  • A.改写用户查询后再检索一次← 正确答案
  • B.适当放宽相似度阈值重试← 正确答案
  • C.直接报错并终止整个任务
  • D.回退到通用工具或请求用户澄清← 正确答案

答案:ABD。改写重试、放宽阈值、通用兜底都是标准回退手段。C 直接终止是最差体验——金牌导购不会因为没听懂就赶客,而是换个说法继续服务。

Q10. 全量注入大量工具描述为何反而降低选择准确率?

单选题 · hard

  • A.无关工具干扰了注意力分配← 正确答案
  • B.上下文过长导致模型直接崩溃
  • C.工具描述会覆盖系统提示词
  • D.描述过多触发模型的随机选择

答案:A。大量无关描述占据注意力资源,稀释了相关工具的权重,导致“看到了但没重视”。B 的“崩溃”过于绝对,一般只是降质;C、D 缺乏依据。这正是“先检索后决策”的核心理由。