嵌入模型
本概念概述侧重于基于文本的嵌入模型。
嵌入模型也可以是多模态的,尽管LangChain目前不支持此类模型。
想象一下,能够将任何文本——一条推文、一份文档或一本书——的本质浓缩成单一且紧凑的表示形式。 这就是嵌入模型的力量,它们是许多检索系统的核心。 嵌入模型将人类语言转化为机器可以理解并快速准确比较的格式。 这些模型以文本作为输入,生成一个固定长度的数字数组,这是文本语义含义的数值指纹。 嵌入技术使搜索系统不仅能基于关键词匹配找到相关文档,还能基于语义理解实现精准查找。
核心概念

(1) 将文本嵌入为向量: 嵌入技术将文本转换为数值向量表示。
(2) 衡量相似性: 嵌入向量可以使用简单的数学运算进行比较。
嵌入
历史背景
嵌入模型的格局多年来发生了显著变化。 一个关键的转折点出现在2018年,谷歌推出了BERT(来自Transformer的双向编码器表示)。 BERT将Transformer模型应用于文本嵌入,将其表示为简单的向量形式,从而在各种自然语言处理任务中实现了前所未有的性能。 然而,BERT并未针对高效生成句子嵌入进行优化。 这一局限性促使了SBERT(句子BERT)的诞生,它对BERT架构进行了改进,以生成语义丰富的句子嵌入,可通过余弦相似度等相似性度量轻松比较,大幅降低了诸如查找相似句子等任务的计算开销。 如今,嵌入模型生态系统日益多样化,众多提供商提供了各自的实现方案。 为了应对这种多样性,研究人员和实践者通常会参考大规模文本嵌入基准测试(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)
- 参见 Simon Willison 的 关于嵌入和相似性度量的精彩博客文章和视频。
- 参见 此文档,了解Google关于嵌入相似性度量的说明。
- 查看 Pinecone 的 博客文章,了解相似性度量。
- 查看OpenAI的常见问题解答,了解使用OpenAI嵌入时应选择哪种相似性度量。