概述
本概述涵盖 基于文本的嵌入模型。LangChain 目前不支持多模态嵌入。参见 顶级嵌入模型。
工作原理
- 向量化:模型将每个输入字符串编码为高维向量。
- 相似度评分:使用数学指标比较向量,以衡量底层文本的关联程度。
相似度指标
通常使用以下指标来比较嵌入:- 余弦相似度:测量两个向量之间的夹角。
- 欧几里得距离:测量两点之间的直线距离。
- 点积:测量一个向量在另一个向量上的投影程度。
接口
LangChain 通过 @[Embeddings] 接口为文本嵌入模型(如 OpenAI、Cohere、Hugging Face)提供标准接口。 提供两种主要方法:embed_documents(texts: List[str]) → List[List[float]]:嵌入文档列表。embed_query(text: str) → List[float]:嵌入单个查询。
该接口允许使用不同的策略嵌入查询和文档,尽管在实践中大多数提供商会以相同的方式处理它们。
顶级集成
常见的部署模式
在实践中,大多数团队会采用以下四种模式之一:- 托管旗舰:OpenAI
text-embedding-3-large、Cohereembed-english-v3、Googlegemini-embedding-001、Voyagevoyage-3。一个 API 调用,开箱即用的最佳质量,无需本地基础设施。按调用付费,存在数据外传依赖。 - 本地开源:
BAAI/bge-*、mixedbread-ai/mxbai-embed-*、Qwen/Qwen3-Embedding-*、nomic-ai/modernbert-embed-*、sentence-transformers/all-*。下载一次,随处运行。无按调用付费,数据不会离开您的环境。在 CPU 上规模较小的情况下可能比托管 API 慢;使用 GPU 时具有竞争力或更快。 - 本地开源,专业型:针对您的特定领域、语言或任务进行微调的模型。从强大的开源基础(例如
BAAI/bge-m3)开始,并在数千个领域内查询/文档对上进行微调,通常在检索准确性方面优于该领域的托管旗舰。 - 生产规模自托管:通过 文本嵌入推理 (TEI) 或 Ollama 服务的相同开源模型(基础或微调)。您获得本地推理的经济效益,以及托管提供者的水平扩展和 API 便利性。
Embeddings 子类,并将其交给您的向量存储或检索器。模式 (2) 和 (3) 使用 HuggingFaceEmbeddings;模式 (4) 使用 OpenAIEmbeddings 对 TEI 的 OpenAI 兼容端点,或 OllamaEmbeddings。
需要权衡的因素
质量
从 MTEB 排行榜 开始。MTEB 跨检索、聚类、分类和重新排序任务对嵌入模型进行基准测试,是事实上的行业参考。按您的语言和任务(检索是最常见的 RAG 任务)进行筛选。 排行榜数字并不总是能直接转换,因此在承诺之前,请在自己的数据上运行小型评估。LangSmith 提供了用于此目的的工具;参见 评估指南。成本
托管嵌入通常按百万 Token 几分钱到 ~$0.15 的价格定价。对于一次嵌入并每天查询数千次的语料库,成本通常由查询端主导。 本地推理没有按调用成本,但需要 CPU(慢)或 GPU(资本或云成本)。交叉点取决于工作负载:低容量的个人项目在 CPU 上几乎免费;对于中等容量的生产环境,通过 TEI 服务的单个 GPU 本地模型通常在单位经济性上优于托管服务。延迟
托管嵌入 API 每个请求大约增加 50-200ms 的网络延迟。CPU 上的本地模型对于包含小模型的短查询(all-MiniLM-L6-v2-类)需要 10-100ms,而对于较大的模型需要 50-500ms。在 GPU 上,本地推理通常比往返托管 API 更快。
对于批量索引,每个请求的延迟不如吞吐量重要。TEI 和多进程本地推理会激进地批量处理。在 GPU 上运行时,考虑 encode_kwargs={"batch_size": 64} 或更高的 HuggingFaceEmbeddings。
维度
嵌入维度影响向量存储存储和查询计算。典型大小:- 384(小 Sentence Transformers 模型,
all-MiniLM-L6-v2) - 768(中等 Sentence Transformers 模型,
all-mpnet-base-v2、bge-base) - 1024(
bge-large、Cohere v3、Voyage) - 1536(OpenAI
text-embedding-3-small、Qwen3-Embedding-0.6B) - 3072+(OpenAI
text-embedding-3-large、Qwen3-Embedding-4B/8B)
text-embedding-3-*、mixedbread-ai/mxbai-embed-large-v1、Matryoshka 训练的 Sentence Transformers 模型、Qwen3-Embedding)支持 截断:将向量切片到更小的维度,同时优雅地降低质量。这对于将更多向量拟合到更小的索引中很有用。
上下文长度
大多数经典嵌入模型在 512 个 Token(all-mpnet-base-v2、经典 BGE)上达到上限。更新的模型支持更长的上下文:
nomic-ai/modernbert-embed-base:8192 个 TokenAlibaba-NLP/gte-multilingual-base:8192 个 TokenBAAI/bge-m3:8192 个 Token- OpenAI
text-embedding-3-*:8191 个 Token
多语言支持
对于多语言检索,请选择在您的语言上训练的模型。强大的默认选项:- 开源:
BAAI/bge-m3、intfloat/multilingual-e5-*、Alibaba-NLP/gte-multilingual-*、Qwen/Qwen3-Embedding-*(通过HuggingFaceEmbeddings) - 托管:Cohere
embed-multilingual-v3、OpenAItext-embedding-3-*
查询和文档提示
几个现代开源模型(E5、BGE、Qwen3-嵌入、GTE)在查询和文档上使用不同的文本前缀进行训练。在查询时使用错误的前缀是一个常见的质量退化问题。当使用HuggingFaceEmbeddings 时,请显式传递提示词:
许可证
大多数流行的开源嵌入模型采用宽松的许可证(Apache 2.0、MIT)。一些最近的专用模型在生产使用时需要商业许可证。在发布前请检查每个模型的许可证。超越单个向量密集嵌入
每个片段一个密集向量是默认选项,但不是唯一选项。稀疏和混合检索
密集嵌入不如基于关键词的索引处理精确匹配查询(产品代码、命名实体、代码标识符)那么好。混合检索结合了密集索引与 BM25 或稀疏神经索引(SPLADE、BAAI/bge-m3 的稀疏输出)来覆盖这两种情况。
晚交互和多向量
ColBERT 风格的模型为每个标记而不是每个片段生成一个向量,然后通过晚交互对查询进行评分。这在处理复杂查询时通常比单个向量密集检索更准确,但代价是更高的存储需求和更复杂的索引。这个领域的当前开源模型包括jinaai/jina-colbert-v2、answerdotai/answerai-colbert-small-v1 以及新的晚交互变体如 lightonai/LateOn。LangChain 的内置检索器针对单个向量嵌入;晚交互通常需要一个专用索引(Vespa、Qdrant 的多向量支持或 PyLate)。
启动点
如果你只需要一个工作的起点:- 快速原型,托管:
OpenAIEmbeddings(model="text-embedding-3-small") - 快速原型,本地,无 API 密钥:
HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2", encode_kwargs={"normalize_embeddings": True}) - 生产,托管,质量优先:
VoyageAIEmbeddings(model="voyage-3")或OpenAIEmbeddings(model="text-embedding-3-large") - 生产,开源,质量优先:
HuggingFaceEmbeddings(model_name="BAAI/bge-m3", encode_kwargs={"normalize_embeddings": True})通过 TEI 提供 - 多语言,开源:
HuggingFaceEmbeddings(model_name="intfloat/multilingual-e5-large"),配置查询和文档提示词
缓存
嵌入可以存储或临时缓存以避免需要重新计算它们。 使用CacheBackedEmbeddings 可以进行嵌入缓存。这个包装器将嵌入存储在键值存储中,其中文本被哈希,哈希值用作缓存中的键。
初始化 CacheBackedEmbeddings 的主要支持方式是 from_bytes_store。它接受以下参数:
underlying_embedder:用于嵌入的嵌入器。document_embedding_cache:任何ByteStore用于缓存文档嵌入。batch_size:(可选,默认为None)在存储更新之间嵌入的文档数量。namespace:(可选,默认为"")用于文档缓存的命名空间。有助于避免冲突(例如,将其设置为嵌入模型名称)。query_embedding_cache:(可选,默认为None)用于缓存查询嵌入的ByteStore,或True以重用与document_embedding_cache相同的存储。
所有嵌入模型
官方原文:src/oss/python/integrations/embeddings/index.mdx · 非官方翻译,译文由 AI 生成,以英文原文为准。