Skip to main content

Documentation Index

Fetch the complete documentation index at: https://nvd-54.mintlify.app/llms.txt

Use this file to discover all available pages before exploring further.

概述

This overview covers text-based 向量嵌入模型. LangChain 目前不支持多模态向量嵌入。See top 向量嵌入模型.
向量嵌入模型将原始文本—如句子、段落或推文—转换为捕获其语义含义的固定长度数字向量。 这些向量允许机器基于含义而非精确词汇来比较和搜索文本。 在实践中,这意味着具有相似想法的文本在向量空间中被放置得很近。 例如,向量嵌入不仅能匹配短语 “machine learning”, 还能在使用不同措辞时找到讨论相关概念的文档。

工作原理

  1. 向量化 — 模型将每个输入字符串编码为高维向量。
  2. 相似度评分 — 使用数学指标比较向量,衡量底层文本之间的关联程度。

相似度指标

常用的向量嵌入比较指标包括:
  • 余弦相似度 — 测量两个向量之间的角度。
  • 欧几里得距离 — 测量点之间的直线距离。
  • 点积 — 测量一个向量在另一个向量上的投影。
以下是计算两个向量余弦相似度的示例:
import numpy as np

def cosine_similarity(vec1, vec2):
    dot = np.dot(vec1, vec2)
    return dot / (np.linalg.norm(vec1) * np.linalg.norm(vec2))

similarity = cosine_similarity(query_embedding, document_embedding)
print("Cosine Similarity:", similarity)

接口

LangChain provides a standard interface for text 向量嵌入模型 (e.g., OpenAI, Cohere, Hugging Face) 通过 Embeddings 接口。 提供两个主要方法:
  • embed_documents(texts: List[str]) → List[List[float]]: 嵌入文档列表。
  • embed_query(text: str) → List[float]: 嵌入单个查询。
该接口允许使用不同的策略对查询和文档进行向量嵌入, 尽管大多数提供商在实践中以相同方式处理它们。

热门集成

常见部署模式

在实践中,大多数团队会采用以下四种模式之一:
  1. 托管旗舰版: OpenAI text-embedding-3-large, Cohere embed-english-v3, Google gemini-embedding-001, Voyage voyage-3. 一次 API 调用,开箱即用的一流质量,无需本地基础设施。 按调用计费且依赖数据传出。
  2. 本地开源版: BAAI/bge-*, mixedbread-ai/mxbai-embed-*, Qwen/Qwen3-Embedding-*, nomic-ai/modernbert-embed-*, sentence-transformers/all-*. 下载一次,随处运行。 无按调用成本,数据永远不会离开您的环境。 在小规模下 CPU 上可能比托管 API 慢;使用 GPU 时具有竞争力或更快。
  3. 本地开源专业版: 针对您特定领域、语言或任务的微调模型。 从强大的开源基础模型开始 (e.g. BAAI/bge-m3) 即使只用几千对领域内的查询/文档对进行微调,在该领域的检索准确性上往往能超过托管旗舰模型。
  4. 生产规模自托管版: 相同的开源模型(基础或微调版)通过 Text Embeddings Inference (TEI) or Ollama. 为您提供本地推理的经济性,同时具备托管提供商的水平扩展和 API 便利性。
LangChain 对这四种模式一视同仁: 您实例化一个 Embeddings 子类并将其传递给向量存储或检索器。 模式 (2) 和 (3) 使用 HuggingFaceEmbeddings; 模式 (4) 使用 HuggingFaceEndpointEmbeddings or OllamaEmbeddings.

需要考虑的因素

质量

MTEB 排行榜. MTEB 对 向量嵌入模型 在检索、聚类、分类和重排序任务上进行基准测试,是事实上的行业参考标准。 按您的语言和任务进行筛选(检索是 RAG 最常见的任务)。 排行榜数据并不总是可迁移的,因此在决定之前请在您自己的数据上进行小规模评估。 LangSmith 提供了相关工具; 请参阅 evaluation guides.

成本

托管向量嵌入的价格通常在每百万 Token 几美分到约 0.15 美元之间。 对于一次嵌入并每天查询数千次的语料库,成本通常由查询端主导。 本地推理没有按调用成本,但需要 CPU(较慢)或 GPU(资本或云成本)。 交叉点取决于工作负载: 低流量个人项目在 CPU 上基本免费; 对于中等流量的生产环境,单个 GPU 通过 TEI 提供本地模型在单位经济性上往往优于托管服务。

延迟

托管向量嵌入 API 每次请求大约增加 50-200ms 的网络延迟。 CPU 上的本地模型对于小模型的短查询需要 10-100ms (all-MiniLM-L6-v2-class), 大型模型需要 50-500ms。 在 GPU 上,本地推理通常比托管 API 的往返更快。 对于批量索引,每次请求的延迟不如吞吐量重要。 TEI 和多进程本地推理会积极批处理。 例如考虑 encode_kwargs={"batch_size": 64} 或更高的值在 HuggingFaceEmbeddings GPU 上运行时。

维度

向量嵌入维度影响向量存储的存储空间和查询计算量。典型大小:
  • 384 (small Sentence Transformers models, all-MiniLM-L6-v2)
  • 768 (mid-size ST models, 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)
较大的向量通常更准确,但消耗更多的存储空间和查询计算量。 一些现代模型 (OpenAI text-embedding-3-*, mixedbread-ai/mxbai-embed-large-v1, Matryoshka-trained ST models, Qwen3-Embedding) 支持截断:将向量裁剪到较小的维度,同时优雅地降低质量。 适用于将更多向量放入较小的索引中。

上下文长度

Most classic 向量嵌入模型 cap out at 512 tokens (all-mpnet-base-v2, classic BGE). 较新的模型支持更长的上下文:
  • nomic-ai/modernbert-embed-base: 8192 tokens
  • Alibaba-NLP/gte-multilingual-base: 8192 tokens
  • BAAI/bge-m3: 8192 tokens
  • OpenAI text-embedding-3-*: 8191 tokens
如果您的文本块较长(整页技术文档、法律段落),请优先使用长上下文模型。 对于短文本块,512 Token 的限制很少成为约束。

多语言支持

对于多语言检索,请选择在您的语言上训练的模型。推荐默认值:
  • Open: BAAI/bge-m3, intfloat/multilingual-e5-*, Alibaba-NLP/gte-multilingual-*, Qwen/Qwen3-Embedding-* (via HuggingFaceEmbeddings)
  • Hosted: Cohere embed-multilingual-v3, OpenAI text-embedding-3-*

查询和文档提示词

一些现代开源模型 (E5, BGE, Qwen3-Embedding, GTE) 使用不同的文本前缀对查询和文档进行训练。 在查询时使用错误的前缀是常见的质量回退问题。 当使用 HuggingFaceEmbeddings, 时,请显式传递提示词:
from langchain_huggingface import HuggingFaceEmbeddings

embeddings = HuggingFaceEmbeddings(
    model_name="intfloat/e5-large-v2",
    encode_kwargs={"prompt": "passage: "},
    query_encode_kwargs={"prompt": "query: "},
)
请在 Hugging Face 上查看每个模型的卡片以获取推荐的提示词字符串。

许可证

Most popular open 向量嵌入模型 are permissively licensed (Apache 2.0, MIT). 少数最近的专业模型需要商业许可证才能用于生产。 在发布前请检查每个模型的许可证。

超越单向量密集向量嵌入

每个文本块一个密集向量是默认方式,但不是唯一选择。

稀疏和混合检索

密集向量嵌入不太擅长处理精确匹配查询 (产品代码、命名实体、代码标识符),不如基于关键词的索引。 混合检索将密集索引与 BM25 或稀疏神经索引结合 (SPLADE, BAAI/bge-m3’s sparse output) 以覆盖两种情况。

延迟交互和多向量

ColBERT 风格的模型为每个 Token 生成一个向量,而非每个文本块, 然后通过延迟交互对查询与文档进行评分。 对于复杂查询,这通常比单向量密集检索更准确, at the cost of higher storage and more complex indexing. 该领域当前的开源模型包括 jinaai/jina-colbert-v2, answerdotai/answerai-colbert-small-v1, 以及较新的延迟交互变体,如 lightonai/LateOn. LangChain 的内置检索器针对单向量向量嵌入; 延迟交互通常需要专门的索引 (Vespa, Qdrant’s multi-vector support, or PyLate).

入门起点

如果您只需要一个可用的起点:
  • 快速原型,托管: OpenAIEmbeddings(model="text-embedding-3-small")
  • Quick prototype, local, no API 密钥: HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2", encode_kwargs={"normalize_embeddings": True})
  • 生产环境,托管,质量优先: VoyageAIEmbeddings(model="voyage-3") or 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") 配置查询和文档提示词
在您自己的数据上衡量检索质量,然后迭代改进。

缓存

向量嵌入可以被存储或临时缓存,以避免重新计算。 可以使用 a CacheBackedEmbeddings. 此封装将向量嵌入存储在键值存储中, 其中文本被哈希化,哈希值用作缓存中的键。 初始化 a CacheBackedEmbeddings is from_bytes_store. 它接受以下参数:
  • underlying_embedder: 用于向量嵌入的嵌入器。
  • document_embedding_cache: 任何 ByteStore 用于缓存文档向量嵌入。
  • batch_size: (可选,默认为 None)在存储更新之间嵌入的文档数量。
  • namespace: (可选,默认为 "")文档缓存使用的命名空间。有助于避免冲突(例如,将其设置为向量嵌入模型名称)。
  • query_embedding_cache: (可选,默认为 None) A ByteStore 用于缓存查询向量嵌入,或设为 True 以重用与 document_embedding_cache 相同的存储。
import time
from langchain_classic.embeddings import CacheBackedEmbeddings  
from langchain_classic.storage import LocalFileStore 
from langchain_core.vectorstores import InMemoryVectorStore

# 创建底层向量嵌入模型
underlying_embeddings = ... # e.g., OpenAIEmbeddings(), HuggingFaceEmbeddings(), etc.

# Store persists embeddings to the local filesystem
# This isn't for production use, but is useful for local
store = LocalFileStore("./cache/")

cached_embedder = CacheBackedEmbeddings.from_bytes_store(
    underlying_embeddings,
    store,
    namespace=underlying_embeddings.model
)

# Example: caching a query embedding
tic = time.time()
print(cached_embedder.embed_query("Hello, world!"))
print(f"First call took: {time.time() - tic:.2f} seconds")

# Subsequent calls use the cache
tic = time.time()
print(cached_embedder.embed_query("Hello, world!"))
print(f"Second call took: {time.time() - tic:.2f} seconds")
在生产环境中,您通常会使用更强大的持久化存储, 例如数据库或云存储。 请参阅 stores integrations 了解可选方案。

所有向量嵌入模型

Aleph Alpha

Anyscale

Ascend

AI/ML API

AwaDB

AzureOpenAI

Baichuan Text Embeddings

Baidu Qianfan

Baseten

Bedrock

BGE on Hugging Face

Bookend AI

Clarifai

Cloudflare Workers AI

Clova Embeddings

Cohere

DashScope

Databricks

DeepInfra

EDEN AI

Elasticsearch

Embaas

Fake Embeddings

FastEmbed by Qdrant

Fireworks

Google Gemini

Google Vertex AI

GPT4All

Gradient

GreenNode

Hugging Face

IBM watsonx.ai

Infinity

Instruct Embeddings

IPEX-LLM CPU

IPEX-LLM GPU

Isaacus

Intel Extension for Transformers

Jina

John Snow Labs

LASER

Lindorm

Llama.cpp

LLMRails

LocalAI

MiniMax

MistralAI

Model2Vec

ModelScope

MosaicML

Naver

Nebius

Netmind

NLP Cloud

Nomic

NVIDIA NIMs

Oracle Cloud Infrastructure

Ollama

OpenClip

OpenAI

OpenVINO

Optimum Intel

Oracle AI Database

OVHcloud

Pinecone Embeddings

PredictionGuard

Perplexity

PremAI

SageMaker

SambaNova

Self Hosted

Sentence Transformers

Solar

SpaCy

SparkLLM

TensorFlow Hub

Text Embeddings Inference

TextEmbed

Titan Takeoff

Together AI

Upstage

Volc Engine

Voyage AI

Xinference

YandexGPT

ZhipuAI