单位 2 / 11

嵌入和矢量数据库逻辑

收益:

  • 了解嵌入将文本转化为语义空间中的向量,相似的含义是相近的向量
  • 解释 ANN 搜索如何使用余弦和点相似度度量
  • 根据成本、规模和元数据过滤需求选择通用向量数据库

RAG 的核心是一个问题:“哪一段文本与用户的问题最相似?”计算机处理带有数字的文本,而不是字面意思。这就是为什么我们需要首先将文本转换为具有其含义的数字。这就是嵌入:将文本转换为表示该文本含义的数字序列(向量)的过程。完成本单元后,您将了解嵌入的工作原理、如何测量相似性以及如何选择正确的向量数据库。

嵌入:将含义转化为坐标

嵌入模型(经过专门训练的人工智能)将您提供的文本转换为向量,例如 1024 个数字。将此向量视为多维空间中的坐标。神奇之处在于:意义相似的文本在这个空间中落入紧密的坐标中。

一个简单的例子:“年假”、“休假权利”和“年带薪休假”使用不同的词,但含义相同——它们的向量彼此接近。 “工资账户”是另一回事——它的向量是遥远的。于是用户问“我有多少天假期?”当你询问时,我们甚至可以找到一份不包含“假期”一词但写着“年假为14天”的文件。这是经典关键词搜索(与单词完全匹配的搜索)无法做到的。

提示:将嵌入视为“意义的指纹”。两个具有相同含义的句子的指纹看起来相似;即使用词不同。

一条重要的规则:嵌入问题时使用的模型应该与嵌入文档时使用的模型相同。不同的模型产生不同的空间;坐标变得不可比。

如何衡量相似度?

有多种方法可以测量两个向量的相似程度。最常见的是余弦相似度:它测量两个向量之间的角度。如果角度较小(向量指向同一方向),则相似度较高。值在-1到1之间;接近 1 = 非常相似。

标准

它测量什么?

什么时候首选?

余弦

向量之间的角度(方向)

最常见;文本语义相似度的默认值

点积

方向+幅度一起

如果向量被归一化,则得到与余弦相同的结果;很快

欧几里德(欧几里德距离)

坐标之间的直线距离

在一些集群场景下;文本中较少使用

在实践中,大多数嵌入模型都会生成归一化向量(大小设置为 1);在这种情况下,余弦和点积给出相同的阶数。不要陷入决策瘫痪:从余弦开始。

在数百万个向量中,一次一个地比较它们是很慢的。这就是矢量数据库使用 ANN(近似最近邻)算法的原因。 ANN 很快就能找到“几乎完全最接近”而不是“完全最接近”。例如,即使对于 1000 万个向量,名为 HNSW 的方法也可以在几毫秒内返回结果。您只需牺牲一点点准确性即可获得极大的速度。

矢量数据库有什么作用?

矢量数据库同时执行三件事:(1) 存储矢量,(2) 快速查找与查询矢量最相似的矢量,(3) 按每个矢量旁边的元数据进行过滤。元数据是您附加到该片段的标签:源文件、日期、部门、隐私级别等。元数据过滤在企业 RAG 中至关重要;因为您需要能够设置限制,例如“仅在财务部门的 2025 年文档中搜索”。

# 注册到向量数据库(概念)vektor_db.add( id="izin-politikasi-parca-3", vektor=embed("年薪休假为 14 天..."), text="年薪休假为 14 天...",metadata={"source": "ik_el_kitabi.pdf", "department": "IK", "date": "2025-06", “隐私”:“ic”})

# 元数据过滤搜索(概念)result = vektor_db.search( vektor=embed("我有多少天休假?"), top_k=4, filter={"department": "HR", "privacy": ["internal", "on"]})

选择正确的数据库

车辆

特色方面

适合情况

内置/基于文件(嵌入式库)

免安装,单机

原型,小型套件(<几十万个零件)

托管云服务

扩展和维护不是您的责任

生产、快速增长的数据、小团队

在您自己的服务器上开源

完全控制,您的数据归您所有

隐私义务、现有基础设施

添加到现有数据库

您不管理单独的系统

向您已使用的数据库添加矢量支持

选择时问:有多少件?元数据过滤有多重要?数据可以传到公司外部(保密)吗?团队可以运营基础设施吗?从小规模开始并根据需要进行扩展通常是明智的做法。

弱方法/强方法

弱(存储简单嵌入,无元数据):

只需保存文本和矢量即可。搜索:返回 4 个最相似的向量。# 问题:无法像“仅当前 HR 文档”那样进行过滤;# 旧的/未经授权的部分也可能包含在响应中。

强大(丰富的元数据+过滤搜索):

为每件作品添加来源、日期、部门和隐私标签。在搜索过程中根据用户的权限和当前状态进行过滤:filter = {"privacy": user_authority, "date_date": "2024-01"}# 因此,结果既安全又最新。

三个迷你箱

案例 1 — 错误的模型组合。一个团队用模型 A 嵌入文档,用模型 B 嵌入问题。搜索结果没有任何意义,正确答案率仍保持在 31%。当我切换到单一模型(都是相同的嵌入模型)时,该比率跃升至 88%。教训:问题和文档应该在同一空间。

案例 2 — 没有元数据的隐私风险。在一家医疗保健公司中,所有部门文档都被放入一个没有元数据的池中。当销售人员提出问题时,系统会根据患者数据进行背景分析。当添加元数据+过滤器后(根据授权级别),这个风险就消除了;在取回过程中,12件未经授权的物品根本没有被带出。

案例 3 — 规模瓶颈。一家电子商务公司通过简单的“扫描全部”方法搜索了 800 万条产品描述;每个查询耗时 6 秒。当我们改用基于 HNSW 的 ANN 时,时间减少到 45 毫秒,精度仅损失 1%。教训:ANN 在大集合中是强制性的。

常见错误

  • 用不同的模型嵌入问题和文档:结果没有意义;始终是一种模型。
  • 跳过元数据:无法过滤;您失去了对隐私和最新信息的控制。
  • 将嵌入误认为加密:嵌入携带可逆信息;假设敏感数据是“隐藏的”是错误的。
  • 在小型基础设施上构建不必要的大型基础设施:管理 5,000 个部件的巨型集群带来了不必要的复杂性。
  • 不要太担心相似性标准:从文本中的余弦开始;微调稍后进行。
注意:嵌入将文本的含义嵌入到数字中,但不会“破坏”内容。如果矢量数据库泄露,原始存储的文本(在大多数安装中也存储文本)也会受到损害。保持矢量存储库与其中的文档一样保密。

综上所述

  • 嵌入将文本转换为带有其含义的数字向量;相似的含义是相近的向量。
  • 相似度通常用余弦来衡量;对于归一化向量,点积给出相同的结果。
  • 在大数据中,人工神经网络(例如 HNSW)取代了精确搜索:速度快,精度几乎没有牺牲。
  • 矢量数据库进行矢量存储+相似性搜索+元数据过滤;元数据对于企业 RAG 至关重要。
  • 问题和文档必须使用相同的嵌入模型进行翻译;否则无法比较坐标。

应用任务

从您在上一单元中选择的文档中摘录 10 篇短文(每篇 3-6 句话)。 (1) 为每件作品设计至少三个元数据标签(来源、日期,以及适合您的业务环境的第三个标签:部门、产品、隐私等)。 (2) 写出应针对 3 个不同的用户问题应用哪个元数据过滤器。 (3) 找到 3 个用不同单词表达相同含义的问题部分对(例如“假期权利”↔“年假”),并用一句话解释为什么它们不会匹配关键字搜索但会匹配嵌入。

清单

  • [ ] 我可以看出,嵌入将文本变成了语义空间中的向量,并且相似的含义很接近。
  • 我知道 [ ] 余弦相似度测量角度,并且是文本中的默认首选项。
  • [ ] 我可以解释为什么 ANN 在大数据中是必要的。
  • [ ] 我知道为什么元数据对于机密性和新鲜度控制至关重要。
  • [ ] 我遵循使用相同嵌入模型翻译问题和文档的规则。