嵌入模型
本概念性概述重点介绍基于文本的嵌入模型。
嵌入模型也可以是多模态的,尽管 LangChain 目前不支持此类模型。
想象一下,能够以单一、紧凑的表示形式捕捉任何文本(推文、文档或书籍)的精髓。 这就是嵌入模型的强大之处,它是许多检索系统的核心。 嵌入模型将人类语言转换为机器可以理解的格式,并可以快速准确地进行比较。 这些模型将文本作为输入,并生成一个固定长度的数字数组,即文本语义的数字指纹。 嵌入允许搜索系统不仅根据关键字匹配,而且根据语义理解来查找相关文档。
关键概念

(1) 将文本嵌入为向量:嵌入将文本转换为数字向量表示。
(2) 测量相似性:可以使用简单的数学运算来比较嵌入向量。
嵌入
历史背景
多年来,嵌入模型的前景发生了重大变化。 2018 年,当 Google 推出 BERT(来自 Transformers 的双向编码器表示)时,出现了一个关键时刻。 BERT 应用 transformer 模型将文本嵌入为简单的向量表示,从而在各种 NLP 任务中实现前所未有的性能。 但是,BERT 并未针对有效生成句子嵌入进行优化。 这一限制刺激了 SBERT (Sentence-BERT) 的创建,它调整了 BERT 架构以生成语义丰富的句子嵌入,很容易通过余弦相似度等相似性指标进行比较,大大减少了查找相似句子等任务的计算开销。 如今,嵌入模型生态系统是多样化的,许多提供商都提供了自己的实施。 为了驾驭这种多样性,研究人员和从业者通常会求助于像 Massive Text Embedding Benchmark (MTEB) 这样的基准进行客观比较。
- 请参阅开创性的 BERT 论文。
- 请参阅 Cameron Wolfe 对嵌入模型的精彩评论。
- 有关嵌入模型的全面概述,请参阅海量文本嵌入基准 (MTEB) 排行榜。
接口
LangChain 提供了一个通用的接口来使用它们,为常见作提供了标准方法。 此通用接口通过两种中心方法简化了与各种嵌入提供程序的交互:
embed_documents:用于嵌入多个文本(文档)embed_query:用于嵌入单个文本(查询)
这种区别很重要,因为某些提供商对文档(要搜索)和查询(搜索输入本身)采用不同的嵌入策略。
为了说明这一点,这里有一个使用 LangChain 的.embed_documents嵌入字符串列表的方法:
from langchain_openai import OpenAIEmbeddings
embeddings_model = OpenAIEmbeddings()
embeddings = embeddings_model.embed_documents(
[
"Hi there!",
"Oh, hello!",
"What's your name?",
"My friends call me World",
"Hello World!"
]
)
len(embeddings), len(embeddings[0])
(5, 1536)
为方便起见,您还可以使用embed_query嵌入单个文本的方法:
query_embedding = embeddings_model.embed_query("What is the meaning of life?")
- 请参阅 LangChain 嵌入模型集成的完整列表。
- 请参阅这些操作指南,了解如何使用嵌入模型。
集成
LangChain 提供了许多嵌入模型集成,您可以在嵌入模型集成页面上找到这些集成。
衡量相似度
每个嵌入本质上都是一组坐标,通常在高维空间中。 在此空间中,每个点的位置 (嵌入) 反映了其相应文本的含义。 就像相似的单词在同义词库中可能彼此靠近一样,相似的概念在此嵌入空间中最终也会彼此靠近。 这允许在不同的文本片段之间进行直观的比较。 通过将文本简化为这些数字表示形式,我们可以使用简单的数学运算来快速测量两段文本的相似程度,而不管它们的原始长度或结构如何。 一些常见的相似性指标包括:
- 余弦相似度:测量两个向量之间角度的余弦值。
- 欧几里得距离:测量两点之间的直线距离。
- 点积:测量一个向量到另一个向量的投影。
应根据模型选择相似性指标。 例如,OpenAI 为他们的嵌入建议了余弦相似性,这很容易实现:
import numpy as np
def cosine_similarity(vec1, vec2):
dot_product = np.dot(vec1, vec2)
norm_vec1 = np.linalg.norm(vec1)
norm_vec2 = np.linalg.norm(vec2)
return dot_product / (norm_vec1 * norm_vec2)
similarity = cosine_similarity(query_result, document_result)
print("Cosine Similarity:", similarity)