Skip to main content

概述

本概述涵盖基于文本的嵌入模型。LangChain 目前不支持多模态嵌入。参见顶级集成
嵌入模型将原始文本(例如句子、段落或推文)转换为固定长度的数字向量,以捕捉其语义含义。这些向量使机器能够基于含义而非精确字词来比较和搜索文本。 在实际应用中,这意味着具有相似思想的文本在向量空间中会被放置在一起。例如,除了匹配短语*“机器学习”*之外,嵌入模型还能检索到讨论相关概念的文档,即使使用了不同的措辞。

工作原理

  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 通过 Embeddings 接口为文本嵌入模型(例如 OpenAI、Cohere、Hugging Face)提供了标准接口。 提供两种主要方法:
  • embed_documents(texts: List[str]) → List[List[float]]: 嵌入文档列表。
  • embed_query(text: str) → List[float]: 嵌入单个查询。
该接口允许使用不同策略对查询和文档进行嵌入,尽管在实际操作中大多数提供商的处理方式相同。

顶级集成

缓存

可以存储或临时缓存嵌入结果,以避免重复计算。 可以使用 CacheBackedEmbeddings 来缓存嵌入结果。该包装器将嵌入结果存储在键值存储中,其中文本会被哈希处理,且哈希值将用作缓存中的键。 初始化 CacheBackedEmbeddings 的主要支持方式是 from_bytes_store。它接受以下参数:
  • underlying_embedder: 用于嵌入的基础嵌入器。
  • document_embedding_cache: 用于缓存文档嵌入的任何 ByteStore
  • batch_size:(可选,默认为 None)在两次存储更新之间要嵌入的文档数量。
  • namespace:(可选,默认为 "")用于文档缓存的命名空间。有助于避免冲突(例如,可设置为嵌入模型的名称)。
  • query_embedding_cache:(可选,默认为 None)用于缓存查询嵌入的 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 = LocalFileStore("./cache/")

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

# 示例:缓存查询嵌入
tic = time.time()
print(cached_embedder.embed_query("Hello, world!"))
print(f"First call took: {time.time() - tic:.2f} seconds")

# 后续调用会使用缓存
tic = time.time()
print(cached_embedder.embed_query("Hello, world!"))
print(f"Second call took: {time.time() - tic:.2f} seconds")
在生产环境中,您通常会使用更健壮的持久化存储,例如数据库或云存储。请参阅存储集成获取选项。

所有嵌入模型

Aleph Alpha

Anyscale

Ascend

AI/ML API

AwaDB

AzureOpenAI

Baichuan 文本嵌入

百度千帆

Baseten

Bedrock

Hugging Face 上的 BGE

Bookend AI

Clarifai

Cloudflare Workers AI

Clova 嵌入

Cohere

DashScope

Databricks

DeepInfra

EDEN AI

Elasticsearch

Embaas

模拟嵌入

Qdrant 的 FastEmbed

Fireworks

Google Gemini

Google Vertex AI

GPT4All

Gradient

GreenNode

Hugging Face

IBM watsonx.ai

Infinity

指令嵌入

IPEX-LLM CPU

IPEX-LLM GPU

Isaacus

Intel Transformer 扩展

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 数据库

OVHcloud

Pinecone 嵌入

PredictionGuard

PremAI

SageMaker

SambaNova

自托管

Sentence Transformers

Solar

SpaCy

SparkLLM

TensorFlow Hub

文本嵌入推理

TextEmbed

Titan Takeoff

Together AI

Upstage

火山引擎

Voyage AI

Xinference

YandexGPT

ZhipuAI