Skip to main content
Open on GitHub

嵌入模型

Prerequisites
Note

本概念概述主要关注基于文本的嵌入模型。

嵌入模型也可以是多模态的,尽管LangChain目前不支持此类模型。

想象一下,能够捕捉任何文本的精髓——一条推文、一份文档或一本书——在一个单一的、紧凑的表示中。 这就是嵌入模型的力量,它位于许多检索系统的核心。 嵌入模型将人类语言转换为机器能够理解和快速准确比较的格式。 这些模型将文本作为输入,并生成一个固定长度的数字数组,这是文本语义意义的数字指纹。 嵌入允许搜索系统不仅基于关键词匹配,还基于语义理解来找到相关文档。

关键概念

概念概述

(1) 将文本嵌入为向量: 嵌入将文本转换为数值向量表示。

(2) 测量相似度: 嵌入向量可以使用简单的数学运算进行比较。

嵌入

历史背景

嵌入模型的景观在过去几年中发生了显著变化。2018年是一个关键时刻,当时谷歌推出了BERT(双向编码器表示来自变换器)。BERT应用变换器模型将文本嵌入为简单的向量表示,这在各种自然语言处理任务中带来了前所未有的性能。然而,BERT并未优化以高效生成句子嵌入。这一限制促使了SBERT(句子-BERT)的创建,它调整了BERT架构以生成语义丰富的句子嵌入,通过余弦相似度等相似性度量轻松比较,显著减少了查找相似句子等任务的计算开销。如今,嵌入模型生态系统多样化,众多提供商提供自己的实现。为了应对这种多样性,研究人员和实践者通常转向基准测试,如大规模文本嵌入基准(MTEB)这里,以进行客观比较。

Further reading

接口

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)
API Reference:OpenAIEmbeddings

为了方便,你也可以使用embed_query方法来嵌入单个文本:

query_embedding = embeddings_model.embed_query("What is the meaning of life?")
Further reading

集成

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)
Further reading
  • 参见Simon Willison关于嵌入和相似度度量的精彩博客文章和视频
  • 参见此文档,了解Google关于嵌入相似度度量的建议。
  • 查看Pinecone关于相似度度量的博客文章
  • 查看OpenAI的FAQ,了解与OpenAI嵌入一起使用的相似性度量。

这个页面有帮助吗?