---
title: Embedding 横评方法：固定笔记与查询，比较实际命中
description: 用人工标注的查询和独立索引比较本地与云端 Embedding，核对重建状态、命中质量和资源成本。
image: "https://zengliangyi.com/og/blog/embedding-retrieval-evaluation.png"
---

比较 nomic-embed-text 和 text-embedding-3-small，不能只看维度或某次搜索分数。本文没有实际横评数据；方法的目标是评估同一批笔记在相同查询下能否找回有证据支持的结果。

## 冻结笔记，不让摘要模型成为变量

为每个模型使用同一份经过核验的笔记快照，包括标题、摘要、结论、标签、来源类型和 memory 字段。记录固定提交、模型完整标识、输入文本 hash、笔记数和实际 chunk 数。不要分别重新摘要同一批对话后再比较向量，否则输入已经变了。

[向量文本实现](https://github.com/ZengLiangYi/ChatCrystal/blob/764276814e5c5a33ecbfeae63754f74b9261a3a8/server/src/services/embedding.ts) 拼接笔记字段；memory 笔记额外包含根因、方案、错误与文件，以及最多 1000 字符的单段代码证据。分块按段落聚合，500 字符是目标，不会把超长单段硬切为 500。相同笔记来源和内容才能得到可比较输入。

模型规格、支持的输入与费用应在运行时查询服务方并记录日期；维度多不保证这批查询更准。配置边界见 [Embedding 配置](/blog/embedding-model-configuration)。

## 在看到结果之前标注查询

准备精确术语、自然语言描述、中英混合、相近但不同的问题，以及库中没有答案的查询。逐条标出可接受的笔记 ID 和原文依据；记录标注版本。下面只是构造的查询类别，不是实测命中：

| 查询类别 | 构造查询 | 标注任务 |

| --- | --- | --- |

| 具体机制 | SQLite 事务回滚边界 | 区分事务失败与普通保存 |

| 同义描述 | 请求失败后连接一直被占用 | 找出连接生命周期证据 |

| 无答案 | 库中未讨论的部署方案 | 标为无答案并检查误命中 |

对有答案查询，Precision@5 为前五位正确结果数除以 5；不足五条的空位不算正确。Recall@5 为命中的已标注笔记数除以该查询全部可接受笔记数。无答案查询不计算这个 recall，单独记录误报和是否错误建议了行动。先定指标再看结果。

## 分开索引并确认重建结束

各配置用独立测试副本与索引。通过设置修改 embedding provider 或 model 且确认时，当前 [配置路由](https://github.com/ZengLiangYi/ChatCrystal/blob/764276814e5c5a33ecbfeae63754f74b9261a3a8/server/src/routes/config.ts) 清空旧向量，并把笔记设为 pending；它不会自动完成新索引。以下请求仅提交待处理任务：



```bash
curl   --fail   --request   POST   'http://localhost:3721/api/embeddings/batch'
```



`queued` 是排队数，不是成功数。逐篇检查笔记状态、任务错误和已知查询，不能只看队列空了。重启后数据库会按 embedding 行调整状态，缺失索引时也可能显示 done；恢复边界见 [Vectra 索引恢复](/blog/vectra-index-recovery)。

用同一 k 值先关闭关系扩展，保存原始响应：



```bash
curl   --fail   --get   'http://localhost:3721/api/search'   \  
    --data-urlencode   'q=SQLite 事务回滚边界'   \  
    --data-urlencode   'limit=5'   \  
    --data-urlencode   'expand=false'   >   result.json
```



固定 [搜索路由](https://github.com/ZengLiangYi/ChatCrystal/blob/764276814e5c5a33ecbfeae63754f74b9261a3a8/server/src/routes/notes.ts) 返回 snake_case ID 和应用加工后的 score。分数包含词项提升、阈值与去重，不是跨模型可直接比较的准确率。比较笔记 ID 和人工标注，另开一轮评估关系扩展，不把两种检索混在一起。

## 报告可复查的结果

保留每条查询的结果顺序、人工判定、无答案误报、错误、延迟与资源记录。分别报告索引生成、查询调用和全流程耗时，记录实际 token 用量或账单；本地硬件、电力和维护也进入成本记录。没有这些材料时只给方法，不给冠军或“多少条以内必然够用”的阈值。

摘要模型可以独立选择，见 [摘要模型评测](/blog/llm-summary-evaluation)；但不要同时更换摘要、分块和向量模型再把全部变化归因于 Embedding。

分享：

##  相关文章

[##  摘要模型怎么比较：固定输入、核对证据，再算成本

用相同转录、字段评分和失败记录比较本地与云端摘要模型，区分质量评测和 ChatCrystal 的实际处理链路。          曾亮懿       2026年10月4日      阅读约 4 分钟

#ChatCrystal

#LLM

#评测](/blog/llm-summary-evaluation)    [##  配置 Embedding：按检索样本选模型并验证重建

检查向量模型的任务支持、实际输入和索引兼容性，用已知笔记与无答案查询验收配置及模型切换。          曾亮懿       2026年10月3日      阅读约 3 分钟

#ChatCrystal

#Embedding

#向量检索](/blog/embedding-model-configuration)    [##  AI 对话格式差异：事件、快照与跨库消息定位

对照五个固定适配器，区分 JSONL 容器、事件语义与 SQLite 键布局，用两个内存数据库观察消息索引、孤立数据和未知版本。          曾亮懿       2026年10月7日      阅读约 4 分钟

#ChatCrystal

#Node.js

#SQLite](/blog/ai-conversation-format-divergence)

##  从文章到代码

到我的 GitHub 看看 ChatCrystal、开发者工具和日常学习记录，欢迎交流实现细节。

[访问我的 GitHub](https://github.com/ZengLiangYi)

```json
{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "name": "ZengLiangYi Blog",
  "alternateName": [
    "Zeng Liangyi",
    "ZengLiangYi",
    "zengliangyi.com"
  ],
  "url": "https://zengliangyi.com",
  "description": "曾亮懿的个人网站。记录 AI Native 探索、开发者工具与全栈产品实践。"
}
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "headline": "Embedding 横评方法：固定笔记与查询，比较实际命中",
  "description": "用人工标注的查询和独立索引比较本地与云端 Embedding，核对重建状态、命中质量和资源成本。",
  "url": "https://zengliangyi.com/blog/embedding-retrieval-evaluation/",
  "image": "https://zengliangyi.com/images/blog/embedding-retrieval-evaluation.svg",
  "datePublished": "2026-10-04T00:00:00.000Z",
  "dateModified": "2026-10-04T00:00:00.000Z",
  "author": {
    "@type": "Person",
    "name": "曾亮懿",
    "url": "https://zengliangyi.com/about"
  },
  "publisher": {
    "@type": "Organization",
    "name": "ZengLiangYi Blog",
    "logo": {
      "@type": "ImageObject",
      "url": "https://zengliangyi.com/favicon-96x96.png"
    }
  },
  "mainEntityOfPage": {
    "@type": "WebPage",
    "@id": "https://zengliangyi.com/blog/embedding-retrieval-evaluation/"
  }
}
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "首页",
      "item": "https://zengliangyi.com/"
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "文章",
      "item": "https://zengliangyi.com/blog"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "Embedding 横评方法：固定笔记与查询，比较实际命中",
      "item": "https://zengliangyi.com/blog/embedding-retrieval-evaluation/"
    }
  ]
}
```
