← 返回
IT技术

余弦相似度失效原因:实测大模型提示与专用验证器

✍️ zhirenhun 📅 2026/10/8 👁 249 阅读 ⏱ 50 分钟
余弦相似度失效原因:实测大模型提示与专用验证器

实验进行于 2026 年 9 月 30 日 – 10 月 6 日。最后更新: 2026 年 10 月 7 日。披露: DigitalOcean 通过 Serverless Inference 在其 Model Catalog 中提供 Jev,并撰写了此分析。对第三方公司的引用仅供参考,不表示与任何第三方有任何关联、赞助或背书。

TL;DR

我们在 500 组带标签的查询对上测试了语义缓存是否能区分“听起来相似”和“回答相同问题”。

What is semantic caching, and how is it different from prefix caching?

语义缓存会在新查询与存储的查询“足够相似”时重用存储的模型响应。与前缀或精确匹配缓存不同,它可能会返回错误答案。

它存储过去的 (query, response) 对。当新查询到达时,它会找到最接近的存储查询,如果相似度得分超过阈值,则返回存储的响应,而不是调用模型。

这与 前缀 或 KV 缓存 不同,前者复用相同提示词前缀的计算,后者需要完全相同的字符串。它们不会返回错误答案。关于前缀缓存的使用,可参考 DigitalOcean 的 使用提示词缓存 文档以及博客文章 DigitalOcean 推理路由器,现在具备缓存感知:为何最便宜的模型并不总是最佳选择。

余弦相似度为何失效?

余弦相似度衡量两段文本在主题上的接近程度,而不判断存储的回答是否能解答新问题。

“肯尼亚的首都是什么?”(存储答案:内罗毕)和“牙买加的首都是什么?”共享模板,但答案不同。GTE-Large 给这对评分 0.75,高于其最佳 F1 阈值 0.65,因此一个专门用于返回释义的缓存会返回 “内罗毕”。Jev 给出 0.01,而我们测试的每个大模型得分都是 0.00。

Jev 是什么,以及如何计费?

Jev 是 TypeSafe AI 的首个模型,一种“一号系统”模型,它不生成文本,而是返回带置信度的类型化决策。您将状态块和一组类型化的问题发送给它,它会一次性返回结构化答案。TypeSafe 和 DigitalOcean 的文档将输出描述为校准后的概率,TypeSafe 报告响应时间为 70–500 毫秒;我们在下文中会验证这两点。如需背景信息,请参阅 DigitalOcean 的解释文章 什么是 Jev? 以及 System One API 使用指南。

Jev 可通过 DigitalOcean 的 模型目录 在 Serverless 推理中使用,端点为 /v1/systemone。按 token 计费:每百万输入 token 0.042 美元,输出免费,具体见 定价页面。在我们的测试中,每个问题都是一个返回概率的 yes/no(“Noul”)调用。

测试的模型和版本

所有模型 ID 已于 2026 年 10 月 6 日确认。所有测试在 2026 年 9 月 30 日至 10 月 6 日之间进行。

角色 模型 ID 备注
验证者 typesafe-jev-1.13.0 在 /v1/systemone 处调用
提示词大模型 glm-5.3 推理始终开启;在简洁提示词运行中我们未设置推理力度,因此 API 使用默认值(最大)
提示词大模型 openai-gpt-4o-mini 同样使用对数概率评分
提示词大模型 anthropic-claude-haiku-4.5 DigitalOcean 列出的暂定支持结束时间最早也不早于 2026 年 10 月
嵌入(余弦) gte-large-en-v1.5 GTE-Large v1.5
标签评判者 deepseek-v4-pro-0813 第二标注者
第一标注者 deepseek-v4.1-flash DeepSeek V4.1 Flash
第三标注者 kimi-k3 标注了 500 对中的 457 对

读取数字

我们的测试方法

我们在三种标注策略以及一个人工校正集合下,用七个系统对 500 对带标签的查询进行评分。

数据。 我们从 Bitext 客户支持和 TriviaQA 构建的 2,368 对样本池中抽取了 500 对:其中包括 253 对支持 paraphrase 类别、105 对实体替换、63 无关、40 处数字变更、31 相同答案以及 8 接近失败的意图。在我们的最终标签下,171 对(34%)为真命中。这一比例是样本的特性,而非生产流量。

设计上的注意点。各类别测试的内容不同。实体替换和数字变化(145 对)均为负样本。问答正样本几乎全部是相同答案的配对(31 对中的 29 对),即两个问题共享同一答案。其中有些是改写,还有些是恰好共享一个答案的不同问题,例如 “people in a tug-of-war team” 和 “bits in a byte”,答案均为 “eight”。真正的改写仅来自支持数据。我们按类别报告,而不是将它们混合在一起。

标签。每对的问题是:提供缓存的响应能否作为新查询的正确答案?

  1. 两个 DeepSeek 模型对这些配对进行了标注。它们在 500 对中的 125 对上出现了分歧(κ = 0.475)。
  2. 我们评估了三种策略:严格策略、宽松策略以及一个经裁决的中间策略(定义见附录 A)。在看到其他两种策略的结果后,我们选择了经裁决的策略。
  3. 第三个模型族 Kimi K3 对 500 对中的 457 对进行了标注(有 43 次调用失败)。它与经裁决的金标准的一致性为 κ = 0.63(严格策略下为 0.56,宽松策略下为 0.64)。
  4. 一位审查员解决了 Kimi 与经裁决金标准不一致的全部 65 对,并随机抽查了他们一致的 24 对。标准:仅当存储的响应原样提供时,能够给出新查询的正确完整答案时才算命中(HIT)。模板化的确认、错误或过时的答案,以及针对不同实体、时期或账户的答案均视为未命中(MISS)。审查员在 65 次分歧中有 43 次支持 Kimi(占 66%),在 24 对一致的配对中有 5 次与模型意见不一致(21%,95% 置信区间 9–40%)。他们的标签在全部 8 次盲测重复中完全一致。审查导致 48 个标签被修改,使得命中数从 125 上升至 171。该审查员也是本分析的作者;在审查过程中他们对模型标签保持盲测,但知道哪些系统正在接受测试。

我们将结果称为 校正后的 标签,并将早期的策略作为敏感性检查报告(附录 A)。

系统。全部通过 DigitalOcean Serverless Inference 运行。

指标。区间是按配对的 95% 自助法置信区间,按缓存的查询聚类(354 个簇)。

系统之间有什么差异?

Cosine 准确率最低;Jev、GPT-4o mini 和 Haiku 的区间重叠;GLM-5.3 准确率最高。已校正标签,除非另有说明,否则全部为 500 对。

系统 AUC 最佳 F1 在 1% 假阳性时的命中率 在 5% 假阳性时的命中率
GLM-5.3, 简洁提示词 0.97 [0.95, 0.98] 0.88 [0.84, 0.91] 0.47 [0.21, 0.75] 0.84 [0.73, 0.91]
Jev 0.93 [0.91, 0.95] 0.82 [0.78, 0.87] 0.36 [0.25, 0.53] 0.59 [0.49, 0.74]
GPT-4o mini, log-probabilities 0.92 [0.89, 0.95] 0.81 [0.77, 0.86] 0.28 [0.13, 0.59] 0.68 [0.56, 0.77]
Claude Haiku 4.5, 简洁提示词 0.91 [0.88, 0.94] 0.83 [0.78, 0.87] 0.11 [0.06, 0.52] 0.50 [0.42, 0.79]
GPT-4o mini, 简洁提示词 (497 pairs) 0.89 [0.86, 0.92] 0.79 [0.74, 0.84] 0.32 [0.02, 0.52] 0.47 [0.40, 0.76]
Cosine, GTE-Large, query→response 0.85 [0.81, 0.88] 0.71 [0.66, 0.77] 0.13 [0.07, 0.29] 0.36 [0.24, 0.51]
Cosine, GTE-Large, query→query 0.82 [0.77, 0.86] 0.69 [0.64, 0.75] 0.15 [0.02, 0.26] 0.32 [0.22, 0.42]

以下结论成立:

排名是否取决于标注方式?

部分情况下:在所有策略下,Cosine 在 AUC 上垫底;但在 1% 预算下的领先者会随标注标准而变化。在全部四套标签下,GLM-5.3 的 AUC 不低于 Jev。在严格标签下,GPT-4o mini 和 Haiku 的点估计也高于 Jev。我们不声称在 Jev 和表现良好的 LLMs 之间存在稳健的排序。完整比较见附录 A。

LLM 的命中率为何看起来如此不稳定?

因为口头概率很粗糙,尽管我们的数据无法将其与抽样噪声区分开来。Haiku 和 GPT-4o mini 使用简洁提示词,各自产生 11 个不同得分值;其中 41%–53% 的配对在同一得分上出现平局。GLM-5.3 产生 28 个,Jev 产生 71 个,而 GPT-4o mini 的对数概率产生 497 个。粗糙的得分限制了阈值可以调节的精细程度。但在 1% 预算下,GPT-4o mini 在三种评分方法(原因字段提示词、简洁提示词、对数概率)下的命中率分别为 0.05、0.32 和 0.28,其区间高度重叠(最高可达 [0.02, 0.53] 和 [0.13, 0.59])。我们未发现任何系统在阈值设定上具有显著优势。

余弦有哪些失效模式?

只有余弦在实体交换和数字变化方面占有显著比例。各系统在最佳 F1 阈值(内样本)下服务的配对比例:

类别(配对,真命中) 余弦 q→q 余弦 q→r Jev GLM-5.3 简洁 GPT-4o mini 对数概率 Haiku 简洁
实体交换 (105, 0) 17% 8% 2% 0% 0% 0%
数字变化 (40, 0) 25% 15% 0% 0% 0% 0%
无关 (63, 1) 0% 10% 2% 0% 2% 0%
支持释义 (253, 140) 77% 79% 70% 58% 71% 66%
相同答案 (31, 29) 52% 68% 68% 87% 52% 52%

对于全负行,这是假命中率。对于最后两行,这是命中率。相反意图的配对仅有 8 对,样本太少无法报告。

在生产环境中,“1% 假命中”是什么意思?

在实际 prevalence 下,1% 假命中预算仍可能意味着服务的答案中有三分之一是错误的。实际缓存看到的真实匹配远少于我们的 34%。在 5% prevalence 下,Jev 在 1% 预算下的服务精度为 0.67, GLM-5.3 为 0.80, GPT-4o mini(对数概率)为 0.62, 余弦为 0.47–0.54。请根据 您的 prevalence 设定预算。完整表格见附录 B。

验证器的校准是否更好?

编号 TypeSafe 和 DigitalOcean 文档将 Jev 输出描述为校准后概率,但在我们的数据中,原始得分的校准程度不如大模型(期望校准误差 0.22 对比 0.03–0.16),这是因为它们偏低(最佳 F1 阈值 0.05)。经过简单的 Platt 拟合后,其 Brier 得分为 0.10,与 Haiku(0.11)和 GPT-4o mini(0.12)相当,但落后于 GLM-5.3(0.06)。校准取决于问题和标注标准,因此在将其输出视为概率之前,请先在自己的数据上重新校准。完整表格见附录 C。

验证器是否需要缓存的查询?

是的。去掉它会使 AUC 下降 0.16。带有缓存查询和响应时,Jev 的 AUC 为 0.93;纯字符串版本的 AUC 为 0.92。仅使用响应时,AUC 下降至 0.77(区间 0.72–0.82);在其最佳阈值下,它能处理 47% 的实体替换和 92% 的数字变化。

成本和延迟如何比较?

Jev 的速度大约是 GPT-4o mini 和 Haiku 的 2.2 倍,价格相当或更低;嵌入一个查询所需的时间大约等于一次验证。

延迟是在 2026 年 10 月 6 日,在美国的一台客户端上,通过持久连接逐请求测量前 100 对数据得到的。成本来源于完整的 500 对运行,并基于 token 计费(Jev:每百万输入 token 0.042 美元,输出免费)。

系统 / 评分 AUC p50 延迟 p95 $ / 1k 查询
Cosine (GTE-Large):嵌入一个查询 0.82 / 0.85 501 ms 590 ms $0.0009
Jev 0.93 409–438 ms (两次运行) 539–672 ms $0.017
GPT-4o mini,对数概率 0.92 917 ms 1,612 ms $0.018
Claude Haiku 4.5,简洁 0.91 937 ms 1,258 ms $0.22
GLM-5.3,简洁 0.97 9,506 ms 21,372 ms $1.93 (97 次成功的 100 次计时调用)
  • Cosine 的成本仅覆盖新查询。 存储的条目会提前嵌入,这是一次性成本。
  • 提示词设计会影响成本。 我们最初使用的 reason‑field 提示词每 1,000 次查询的费用为 0.049 美元(GPT-4o mini)和 0.59 美元(Haiku),大约是 GPT-4o mini 简洁提示词(0.025 美元)的两倍,也是 Haiku 简洁提示词的 2.7 倍。GLM-5.3 是个例外:其成本在不同提示词之间会上升,我们未深入探究原因。
  • 相较于 Jev,GPT-4o mini 和 Haiku 大约慢 2.2 倍,GLM-5.3 大约慢 22 倍。GLM-5.3 的成本大约高 110 倍。
  • GLM-5.3 的数据反映了默认设置。 DigitalOcean 的文档说明,GLM-5.3 的推理始终开启,且 API 默认工作量为最大。我们未调低工作量,因此其延迟和成本对应的是最大工作量的推理;降低工作量可能会同时改变这两项。
  • Jev 的中位延迟落在 TypeSafe 给出的范围内。 TypeSafe 报告的端到端延迟为 70–500 毫秒。我们的中位数(409–438 毫秒)在此范围之内,尽管我们的 p95(539–672 毫秒)超过了上限。
  • 成本是估算值:每个响应的 token 数乘以我们测试框架中 costs.py 里的输入和输出单价,并参照 2026 年 9 月 28 日的 定价页面(Jev 的费率在 10 月 6 日再次确认)。未应用缓存输入折扣。每 1M token 的费用(输入 / 输出):Jev 0.042 美元 / 免费;GTE-Large 0.09 美元;GPT-4o mini 0.15 美元 / 0.60 美元;Claude Haiku 4.5 1.00 美元 / 5.00 美元;GLM-5.3 1.40 美元 / 4.40 美元。
  • 缓存是否值得?一个盈亏平衡估计

    当验证语义缓存所服务的查询份额超过验证流水线的成本或延迟除以模型调用的成本或延迟时,该缓存才会带来收益。

    嵌入加上 Jev 每次查询的成本约为 0.000018 美元(0.017 美元 + 每 1,000 次 0.0009 美元)。如果您的模型调用成本为 0.002 美元(仅作示例;请自行替换),则在 0.9% 的命中率下缓存即可在成本上盈亏平衡。延迟是更紧的限制。嵌入加验证每次查询增加约 0.92 秒(501 毫秒 + 大约 420 毫秒),无论命中还是未命中,每次查询都需承担这一开销。因此,盈亏平衡的命中率约为 0.92 秒除以模型调用的延迟。以示例的 5 秒模型调用为基准,盈亏平衡约为 18%;10 秒调用约为 9%;2 秒调用约为 46%。若以 GPT-4o mini 作为验证器(总时长约 1.4 秒),则 5 秒基准的盈亏平衡提升至约 28%。

    这些估算使用中位延迟,不考虑向量搜索时间,将嵌入和验证视为顺序执行,并忽略缓存错误回答所带来的质量成本。我们未对完整流水线进行基准测试。

    你应该使用什么?

    当延迟重要时,使用 Jev 或按 log‑probabilities 评分的小型 LLM;当你能够承受几秒延迟时,使用推理模型。不要在默认阈值下仅使用 cosine。

    基于此测试:

    你应该如何设置阈值,以及它的稳定性如何?

    在你自己的标记流量上进行调校,并预计在对托管模型的调用之间,约有 1% 的边缘决策会发生变化。

    你何时不应使用语义缓存?

    当答案是个性化的、时敏的,或取决于对话之前的轮次时,应跳过它。

    具体来说:当答案取决于提问者是谁时(比如个性化、权限),答案随时间变化时(比如价格、状态,“最新”信息),或者在多轮对话中,正确答案依赖于之前的轮次。我们自己数据中的一些 TriviaQA 标准答案已经过时,例如“非洲最大的国家”。在可能的情况下使用精确匹配或前缀缓存,并在提供任何相似匹配之前进行验证。

    这在 DigitalOcean 上如何运行?

    此次测试的所有内容均在 DigitalOcean Serverless Inference 上使用单个访问密钥运行,因此两级缓存的两个阶段可以在同一产品上运行。

    这是我们的测试 harness 生成的 Jev 调用:

    import os, requests
    
    HEADERS = {"Authorization": f"Bearer {os.environ['MODEL_ACCESS_KEY']}", "Content-Type": "application/json"}
    
    def verify(cached_query, cached_response, new_query):
        body = {
            "model": "typesafe-jev-1.13.0",
            "state": {"cached_query": cached_query, "cached_response": cached_response, "new_query": new_query},
            "questions": {"contains_answer": {
                "type": "noul",   # a yes/no ("Noul") question; Jev returns a probability
                "instructions": "Does `cached_response` contain a complete and correct answer to `new_query`?",
                "criteria": {
                    "true": "The cached response fully and correctly answers the new query",
                    "false": "The cached response does not answer the new query, answers a different question, or only partially answers it"}}},
        }
        r = requests.post("https://inference.do-ai.run/v1/systemone", headers=HEADERS, json=body, timeout=60)
        r.raise_for_status()
        return r.json()["answers"]["contains_answer"]["noul"]   # higher = serve the cached response
    

    请求格式遵循 DigitalOcean 的 System One API 使用指南;criteria 对 noul 问题为可选,我们的测试套件包含了它。

    我们接下来要尝试的设计:嵌入检索最近存储的查询,verify() 决定是否提供它,使用您在自行标记的流量上调节的阈值(我们使用了 0.05)。

    限制

    主要限制是模型生成的标签、小样本以及人造的普遍性。

    要点

  • 小型验证器在准确率上与小型LLM选项相当(AUC 0.91–0.93,区间重叠),延迟大约只有其一半,价格相同或更低。推理模型准确率更高,但速度慢约22倍,成本高约110倍。
  • 嵌入也不是免费的:一次嵌入调用所需时间大约相当于一次验证。
  • 在严格的假阳性预算下,没有系统显示出可靠的优势。
  • 在您自己的数据上进行校准,并根据自身的阳性率选择阈值和假阳性预算,留有一定余量。
  • FAQ

    余弦相似度为何在语义缓存中失效?

    余弦相似度衡量两段文本在主题上的接近程度,而不衡量存储的回答是否能回答新问题,因此像“肯尼亚的首都”与“牙买加的首都”这样的近似会得到高分。在我们的 500 对测试中,余弦相似度的 AUC 为 0.82–0.85,最佳 F1 为 0.69–0.71,而验证器和大模型提示词的 AUC 为 0.79–0.88。在 0.5 阈值下,其精确率为 0.41,而基准率为 34%。

    我应该使用大模型提示词还是专用验证器来验证缓存命中?

    在我们的测试中,它们在准确率上相当。Jev 的 AUC 为 0.93,GPT-4o mini 带对数概率为 0.92,Haiku 4.5 采用简洁提示词为 0.91。推理模型 GLM-5.3 达到 0.97,但在默认最大推理力度下,每次调用约需 9.5 秒,成本约为每 1,000 次查询 1.93 美元。Jev 的速度比小型 LLMs 快约 2.2 倍(约 0.4 秒对比 0.9 秒),价格相近或更低(每 1,000 次查询 0.017 美元对比 0.018–0.22 美元)。

    我应该为语义缓存选择什么相似度阈值?

    不同系统或标注标准之间没有默认的可迁移值。Jev 的最佳 F1 阈值随标注标准不同在 0.03–0.13 之间变化,余弦相似度的阈值在 0.58–0.72 之间,语言化的大模型得分阈值在 0.10–0.80 之间。请在您自己领域的带标签流量上,根据自身的命中率进行调校,并预计约有 1% 的边缘决策在对托管模型的连续调用之间会发生翻转。

    验证缓存命中会增加多少延迟和成本?

    在我们的测量中,嵌入一个查询大约需要 500 毫秒,一次验证使用 Jev 大约需要 410–440 毫秒,使用 GPT-4o mini 大约需要 920 毫秒。嵌入加上 Jev 每 1,000 次查询的费用约为 0.018 美元。以一个示例性的 5 秒模型调用为例,当命中率达到约 18% 时,缓存在延迟方面开始有所回报。这些是来自美国的一位客户端到端点的时间,不包括向量搜索时间。

    试用: 想在自己的缓存流量上试用 Jev,请在 模型目录 中找到它,并通过上面的代码片段使用 Serverless Inference 调用。Jev 是第三方模型,因此您的账户需要符合条件的套餐;请参阅 推理限制。

    复现: 相关的测试 harness 和分析脚本位于 github.com/Jameshskelton/Jev_analyses。

    附录 A:标注策略的敏感性

    前面提到的三种策略对 hit 的定义不同:strict 仅在存储的响应实际包含所请求答案时才计为 hit;lenient 将任何同意图配对视为 hit;adjudicated 将模板化的非答案视为 miss,但将对新问题正确的存储答案计为 hit。校正 是在人工复核后得到的 adjudicated 集合。

    单元格列出了 Jev / GLM-5.3 简洁版 / GPT-4o mini 对数概率 / Haiku 简洁版 / 余弦查询→查询。

    标签 基础命中率 AUC 1% 下的命中率
    严格 21% .90 / .91 / .94 / .92 / .86 .09 / .08 / .35 / .00 / .19
    宽松 46% .95 / .98 / .96 / .95 / .85 .42 / .52 / .62 / .40 / .15
    adjudicated (原始) 25% .89 / .94 / .89 / .87 / .81 .30 / .30 / .30 / .14 / .21
    校正 34% .93 / .97 / .92 / .91 / .82 .36 / .47 / .28 / .11 / .15

    在所有策略下,余弦在 AUC 上排名最后;GLM-5.3 的 AUC 在所有四种策略中均不低于 Jev。在 1% 预算下,领先者会随标注标准而变化。在严格标签下,余弦的 1% 命中率(0.19)超过 Jev(0.09)、Haiku(0.00)和 GLM-5.3(0.08),但未超过 GPT-4o mini 的对数概率版本(0.35)。余弦的劣势在 AUC 和 F1 上最为明显,而在每种预算下并非如此。

    附录 B:在真实流行率下的服务精度

    在 1% 误击操作点下的精度,针对流量中不同比例的真实匹配:

    系统 命中率 25% 流行率下的精度 5% 1%
    GLM-5.3, 简洁 0.47 0.96 0.80 0.44
    Jev 0.36 0.93 0.67 0.28
    GPT-4o mini, 对数概率 0.28 0.91 0.62 0.24
    余弦 q→响应 0.13 0.88 0.54 0.18
    余弦 q→查询 0.15 0.85 0.47 0.14

    这些来自区间较宽的点估计。操作点是在样本内选择的,而在 1% 流行率下,这些数字仅基于一到三个假阳性。在 5% 预算下,Jev 在 5% 流行率下的服务精度为 0.44。

    附录 C:校准

    系统 Brier(原始) ECE(原始) Platt 校准后的 Brier Platt 校准后的 ECE
    GLM-5.3, 简洁 0.07 0.03 0.06 0.01
    Claude Haiku 4.5, 简洁 0.10 0.05 0.11 0.11
    GPT-4o mini, 对数概率 0.16 0.16 0.12 0.04
    Jev 0.19 0.22 0.10 0.04

    始终预测基准率可得到 Brier 为 0.225。Platt 校准采用交叉拟合,按缓存查询分组。Jev 的得分偏低(最佳 F1 阈值 0.05),因此其原始概率偏保守,这与 TypeSafe 和 DigitalOcean 文档所述的输出(校准后概率)不一致。

    ——

    广告 广告
    🧑‍💻

    zhirenhun

    一个热爱技术的程序员,喜欢分享前沿AI知识和开发经验。