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-small | 1536 | 多语言 | OpenAI 性价比高 |
| text-embedding-3-large | 3072 | 多语言 | OpenAI 精度最高 |
| text-embedding-ada-002 | 1536 | 多语言 | 兼容性好 |
| BGE-small-zh | 512 | 中文 | 轻量中文优化 |
| BGE-large-zh | 1024 | 中文 | 高精度中文 |
| models/embedding-001 | 768 | 多语言 | Google 免费额度 |
| nomic-embed-text | 768 | 多语言 | 本地运行 |
最佳实践
- 选择适合语言的模型:中文场景优先选择 bge 系列等中文优化模型
- 控制批量大小:
embed_documents时注意 API 限制,建议每批 10-100 个文本 - 归一化向量:归一化后的向量便于计算余弦相似度
- 缓存嵌入:重复使用相同的文本时缓存嵌入结果
- 异步调用:大规模场景使用异步方法提高吞吐量
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())