Skip to content

Embeddings 嵌入模型

嵌入(Embeddings)是将文本转换为向量表示的技术。在 LangChain 中,嵌入模型是连接文本与向量存储、检索系统的桥梁。高质量的嵌入向量能捕捉文本的语义信息,使语义相似的文本在向量空间中位置接近。

概述

嵌入模型的工作流程:

文本 → 嵌入模型 → 向量(float 数组)
"今天天气真好" → [0.012, -0.045, 0.078, ..., 0.003]  # 768 维向量

LangChain 的嵌入接口提供了统一的方法来使用不同的嵌入模型:

python
from langchain_openai import OpenAIEmbeddings

# 初始化嵌入模型
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

# 嵌入单个文本
vector = embeddings.embed_query("今天天气真好")
print(f"向量维度: {len(vector)}")
print(f"部分向量: {vector[:5]}")

# 批量嵌入文档
texts = ["文档一的内容", "文档二的内容", "文档三的内容"]
vectors = embeddings.embed_documents(texts)
print(f"生成了 {len(vectors)} 个向量")

初始化嵌入模型

LangChain 提供 init_embeddings() 函数方便快速初始化嵌入模型:

python
from langchain.chains import init_embeddings

# 通过配置字符串初始化
embeddings = init_embeddings("openai:text-embedding-3-small")

# 或直接传入实例
from langchain_openai import OpenAIEmbeddings
embeddings = init_embeddings(OpenAIEmbeddings(model="text-embedding-3-small"))

支持的嵌入模型

OpenAI Embeddings

python
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(
    model="text-embedding-3-small",     # 经济高效
    # model="text-embedding-3-large",   # 更高精度
    # model="text-embedding-ada-002",   # 兼容版本
    dimensions=1536,                    # 输出维度
)

vector = embeddings.embed_query("嵌入文本示例")

Google Generative AI Embeddings

python
from langchain_google_genai import GoogleGenerativeAIEmbeddings

embeddings = GoogleGenerativeAIEmbeddings(
    model="models/embedding-001",
    google_api_key="YOUR_API_KEY"
)

vector = embeddings.embed_query("你的文本")

HuggingFace Embeddings

python
from langchain_huggingface import HuggingFaceEmbeddings

embeddings = HuggingFaceEmbeddings(
    model_name="BAAI/bge-small-zh-v1.5",  # 中文优化
    model_kwargs={"device": "cpu"},
    encode_kwargs={"normalize_embeddings": True}
)

vector = embeddings.embed_query("中文嵌入测试")

Cohere Embeddings

python
from langchain_cohere import CohereEmbeddings

embeddings = CohereEmbeddings(
    model="embed-english-v3.0",
    cohere_api_key="YOUR_API_KEY"
)

Ollama Embeddings(本地模型)

python
from langchain_ollama import OllamaEmbeddings

embeddings = OllamaEmbeddings(
    model="nomic-embed-text",  # 本地运行
)

vector = embeddings.embed_query("本地嵌入测试")

关键方法

embed_query

嵌入单个查询文本(通常用于搜索查询):

python
query_vector = embeddings.embed_query("用户搜索的问题")

embed_documents

批量嵌入文档(通常用于索引):

python
doc_vectors = embeddings.embed_documents([
    "第一份文档",
    "第二份文档",
    "第三份文档"
])

完整示例:从文档到向量

python
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings

# 1. 加载文档
loader = TextLoader("knowledge.txt")
documents = loader.load()

# 2. 分割文档
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50
)
chunks = text_splitter.split_documents(documents)

# 3. 初始化嵌入模型
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

# 4. 嵌入所有文档块
texts = [chunk.page_content for chunk in chunks]
vectors = embeddings.embed_documents(texts)

print(f"文档块数: {len(chunks)}")
print(f"向量维度: {len(vectors[0])}")
print(f"向量形状: ({len(vectors)}, {len(vectors[0])})")

嵌入模型选择指南

模型维度适合语言特点
text-embedding-3-small1536多语言OpenAI 性价比高
text-embedding-3-large3072多语言OpenAI 精度最高
text-embedding-ada-0021536多语言兼容性好
BGE-small-zh512中文轻量中文优化
BGE-large-zh1024中文高精度中文
models/embedding-001768多语言Google 免费额度
nomic-embed-text768多语言本地运行

最佳实践

  1. 选择适合语言的模型:中文场景优先选择 bge 系列等中文优化模型
  2. 控制批量大小embed_documents 时注意 API 限制,建议每批 10-100 个文本
  3. 归一化向量:归一化后的向量便于计算余弦相似度
  4. 缓存嵌入:重复使用相同的文本时缓存嵌入结果
  5. 异步调用:大规模场景使用异步方法提高吞吐量
python
# 异步嵌入
import asyncio
from langchain_openai import OpenAIEmbeddings

async def embed_async():
    embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
    # 异步嵌入查询
    vector = await embeddings.aembed_query("异步查询")
    # 异步批量嵌入
    vectors = await embeddings.aembed_documents(["文档一", "文档二"])
    return vectors

vectors = asyncio.run(embed_async())

下一步

本站为非官方中文学习站点,不代表 LangChain 官方。部分内容参考官方文档并重新整理为中文学习笔记。