langchain_huggingface.HuggingFaceEmbeddings
是 LangChain 提供的一个嵌入(embedding)模型类,用于将文本转换为向量表示,基于 Hugging Face 的 Transformer 模型。
本文基于 LangChain 0.3.x,详细介绍 langchain_huggingface.HuggingFaceEmbeddings
的初始化、方法、参数和典型场景,并提供一个独立示例,展示如何使用 HuggingFaceEmbeddings
结合 langchain_milvus.Milvus
分割 PDF 文档并构建文本检索系统,示例使用 Hugging Face 的 sentence-transformers/all-MiniLM-L6-v2
模型。
HuggingFaceEmbeddings
简介
langchain_huggingface.HuggingFaceEmbeddings
是 LangChain 的嵌入模型类,继承自 langchain_core.embeddings.Embeddings
,通过 Hugging Face 的 sentence-transformers
或 transformers
库加载预训练模型,生成文本的向量表示。它适合本地或云端场景,广泛用于语义搜索、RAG(Retrieval-Augmented Generation)系统和向量存储。
核心功能:
- 将文本(查询或文档)转换为固定维度的向量。
- 支持 Hugging Face 的多种预训练模型(如
sentence-transformers
)。 - 高效推理,兼容 CPU 和 GPU(通过 PyTorch 或 TensorFlow)。
- 集成 LangChain 的向量存储(如
langchain_milvus.Milvus
)。
适用场景:
- 语义搜索或文本检索。
- RAG 系统,结合向量存储和 LLM。
- 本地嵌入生成,减少对云服务的依赖。
- 多语言支持,处理非英语文本。
与 LlamaCppEmbeddings
对比:
- HuggingFaceEmbeddings:基于 Hugging Face 模型,模型选择多样,支持多语言,易于部署。
- LlamaCppEmbeddings:基于 GGUF 格式的 LLaMA 模型,适合隐私敏感场景,但模型选择较少。
初始化和配置
HuggingFaceEmbeddings
使用 Hugging Face 的预训练模型生成嵌入向量。以下是初始化和配置的关键点。
1. 安装依赖
pip install --upgrade langchain langchain-huggingface langchain-milvus pymilvus sentence-transformers
- 示例依赖(PDF 加载、分割):
pip install pypdf
- GPU 支持(可选,需 PyTorch 和 CUDA):
pip install torch --index-url https://download.pytorch.org/whl/cu121
2. 选择 Hugging Face 模型
- 推荐模型:
sentence-transformers/all-MiniLM-L6-v2
:轻量(384 维),速度快,适合英语。sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2
:多语言支持,384 维。BAAI/bge-large-en-v1.5
:高性能英语模型,1024 维。
- 模型下载:Hugging Face 模型会自动从 Hugging Face Hub 下载并缓存(
~/.cache/huggingface
)。 - 验证:确保网络连接或本地模型可用:
from huggingface_hub import snapshot_download snapshot_download(repo_id="sentence-transformers/all-MiniLM-L6-v2")
3. 初始化 HuggingFaceEmbeddings
常用初始化参数:
model_name
(str,默认sentence-transformers/all-MiniLM-L6-v2
):Hugging Face 模型名称或本地路径。model_kwargs
(dict,默认{}
):模型配置,如device
("cpu"
、"cuda"
)。encode_kwargs
(dict,默认{}
):编码参数,如normalize_embeddings
(归一化嵌入)。multi_process
(bool,默认 False):是否启用多进程推理(需更多内存)。show_progress
(bool,默认 False):是否显示推理进度条。
示例初始化(CPU):
from langchain_huggingface import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(
model_name="sentence-transformers/all-MiniLM-L6-v2",
model_kwargs={"device": "cpu"},
encode_kwargs={"normalize_embeddings": True}
)
GPU 配置(若有 GPU):
embeddings = HuggingFaceEmbeddings(
model_name="sentence-transformers/all-MiniLM-L6-v2",
model_kwargs={"device": "cuda"},
encode_kwargs={"normalize_embeddings": True}
)
多语言模型:
embeddings = HuggingFaceEmbeddings(
model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
model_kwargs={"device": "cpu"}
)
注意:
- 嵌入维度由模型决定(如
all-MiniLM-L6-v2
为 384),不可直接设置。 - GPU 推理需安装 PyTorch CUDA 版本并确保 GPU 可用:
import torch print(torch.cuda.is_available()) # 输出: True
常用方法
以下是 HuggingFaceEmbeddings
的核心方法,基于源码(langchain_huggingface/embeddings/huggingface.py
)和官方文档(HuggingFaceEmbeddings)。
embed_query(text: str) -> List[float]
- 功能:将单个查询文本转换为嵌入向量。
- 参数:
text
:输入文本字符串。
- 返回值:
List[float]
,嵌入向量(如 384 维)。 - 使用场景:
- 语义搜索,生成查询向量。
- 测试嵌入质量。
- 示例:
vector = embeddings.embed_query("什么是机器学习?") print(len(vector)) # 输出: 384
embed_documents(texts: List[str]) -> List[List[float]]
- 功能:将多个文档文本批量转换为嵌入向量。
- 参数:
texts
:文本字符串列表。
- 返回值:
List[List[float]]
,每个文本的嵌入向量列表。 - 使用场景:
- 构建向量存储,存储文档嵌入。
- 批量处理文本。
- 示例:
vectors = embeddings.embed_documents(["机器学习是...", "深度学习是..."]) print(len(vectors)) # 输出: 2 print(len(vectors[0])) # 输出: 384
方法总结
方法 | 功能 | 典型场景 |
---|---|---|
embed_query | 生成查询嵌入 | 语义搜索 |
embed_documents | 批量生成文档嵌入 | 向量存储 |
推荐方法:
embed_query
:生成查询向量,适合搜索。embed_documents
:批量生成文档向量,适合向量存储。
注意:
HuggingFaceEmbeddings
未提供异步方法(如aembed_query
),若需异步,可使用asyncio
包装:import asyncio async def async_embed(text): return embeddings.embed_query(text)
使用 HuggingFaceEmbeddings
的文本检索示例
以下是一个独立示例,展示如何使用 HuggingFaceEmbeddings
结合 langchain.text_splitter.RecursiveCharacterTextSplitter
和 langchain_milvus.Milvus
分割 PDF 文档,生成嵌入并构建文本检索系统。
准备文件:
- PDF 文件:创建 PDF 文件
machine_learning_knowledge.pdf
,内容如下(可使用 Word 保存为 PDF):机器学习是人工智能的一个分支。 它包括监督学习、无监督学习和强化学习。 机器学习的应用包括图像识别、推荐系统和自然语言处理。
代码:
from langchain_huggingface import HuggingFaceEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_milvus import Milvus
from langchain_community.document_loaders import PyPDFLoader
# 初始化 HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(
model_name="sentence-transformers/all-MiniLM-L6-v2",
model_kwargs={"device": "cpu"},
encode_kwargs={"normalize_embeddings": True}
)
# 初始化 RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=100,
chunk_overlap=20,
separators=["\n\n", "\n", " ", ""],
keep_separator=False
)
# 加载 PDF 文档
loader = PyPDFLoader(file_path="machine_learning_knowledge.pdf")
documents = loader.load()
# 分割文档
split_documents = splitter.split_documents(documents)
# 初始化 Milvus 向量存储
vectorstore = Milvus(
embedding_function=embeddings,
connection_args={"uri": "http://localhost:19530"},
collection_name="machine_learning_collection",
drop_old=True,
auto_id=True
)
# 存储文档嵌入
vectorstore.add_documents(split_documents)
# 执行检索
print("检索结果:")
query = "机器学习有哪些应用?"
results = vectorstore.similarity_search(query, k=2)
for doc in results:
print(f"- {doc.page_content} (Source: {doc.metadata['source']})")
输出示例:
检索结果:
- 机器学习的应用包括图像识别、推荐系统和自然语言处理。 (Source: machine_learning_knowledge.pdf)
- 机器学习是人工智能的一个分支。 (Source: machine_learning_knowledge.pdf)
代码说明
- 嵌入模型:
HuggingFaceEmbeddings
加载sentence-transformers/all-MiniLM-L6-v2
,生成 384 维嵌入。- 配置
device="cpu"
、normalize_embeddings=True
。
- 文本分割:
RecursiveCharacterTextSplitter
设置chunk_size=100
、chunk_overlap=20
。- 分割 PDF 文档,保留元数据。
- 文档加载:
PyPDFLoader
加载machine_learning_knowledge.pdf
。
- 向量存储:
Milvus
使用connection_args={"uri": "http://localhost:19530"}
,集合名为machine_learning_collection
。- 显式设置
dimension=384
(匹配模型嵌入维度)。
- 检索:
- 使用
similarity_search
查找与查询最相似的 2 个块。
- 使用
- 主题:
- 示例聚焦机器学习检索,简单且独立。
运行要求:
- Milvus 服务运行:
docker run -d --name milvus_standalone -p 19530:19530 -p 9091:9091 milvusdb/milvus:latest
- PDF 文件
machine_learning_knowledge.pdf
存在。 - 安装依赖:
pip install --upgrade langchain langchain-huggingface langchain-milvus pymilvus sentence-transformers pypdf
- 硬件支持:CPU 即可运行,GPU 可加速(需 PyTorch CUDA)。
注意事项
- 模型选择:
- 轻量模型:
all-MiniLM-L6-v2
(384 维,约 80MB),适合快速部署。 - 高性能模型:
BAAI/bge-large-en-v1.5
(1024 维,约 1GB),精度更高。 - 多语言:
paraphrase-multilingual-MiniLM-L12-v2
,支持中文等语言。 - 验证模型:
vector = embeddings.embed_query("测试") print(len(vector)) # 输出: 384
- 轻量模型:
- 硬件要求:
- CPU:大多数模型运行良好,4GB+ RAM。
- GPU:加速推理,需 CUDA 和 PyTorch:
nvidia-smi
- Milvus 配置:
- 验证服务:
curl http://localhost:19530
- 非本地部署:
connection_args={"uri": "http://your-milvus-host:19530"}
- 维度匹配:确保
dimension
与模型嵌入维度一致(all-MiniLM-L6-v2
为 384)。
- 验证服务:
- 性能优化:
- 推理速度:
- 启用 GPU:
model_kwargs={"device": "cuda"}
。 - 使用轻量模型(如
all-MiniLM-L6-v2
)。
- 启用 GPU:
- 批量处理:
embed_documents
支持批量生成:vectors = embeddings.embed_documents([doc.page_content for doc in split_documents])
- 归一化:
- 设置
normalize_embeddings=True
提高检索一致性。
- 设置
- 推理速度:
- 错误调试:
- 模型加载失败:
- 检查网络连接或本地模型路径:
from huggingface_hub import snapshot_download snapshot_download(repo_id="sentence-transformers/all-MiniLM-L6-v2")
- 确保内存足够。
- 检查网络连接或本地模型路径:
- 维度不匹配:
- 验证 Milvus 集合维度:
vectorstore = Milvus(..., dimension=384)
- 验证 Milvus 集合维度:
- 检索无关:
- 调整
chunk_size
和chunk_overlap
:splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=40)
- 增加
k
:results = vectorstore.similarity_search(query, k=3)
- 调整
- 模型加载失败:
常见问题
Q1:如何选择合适的 Hugging Face 模型?
A:
- 英语:
all-MiniLM-L6-v2
(轻量)、BAAI/bge-large-en-v1.5
(高性能)。 - 多语言:
paraphrase-multilingual-MiniLM-L12-v2
。 - 自定义:从 Hugging Face Hub 选择特定模型:
embeddings = HuggingFaceEmbeddings(model_name="your-model")
Q2:HuggingFaceEmbeddings
的嵌入维度如何确定?
A:由模型决定(如 all-MiniLM-L6-v2
为 384)。验证:
vector = embeddings.embed_query("测试")
print(len(vector))
Q3:可以结合 RAG 吗?
A:可以,使用 HuggingFaceEmbeddings
生成嵌入,结合 LLM:
from langchain_huggingface import HuggingFacePipeline
from langchain_core.prompts import PromptTemplate
llm = HuggingFacePipeline.from_model_id(model_id="gpt2", task="text-generation")
prompt = PromptTemplate(
template="上下文:{context}\n问题:{question}\n回答:",
input_variables=["context", "question"]
)
chain = (
{"context": vectorstore.as_retriever() | lambda docs: "\n".join(d.page_content for d in docs), "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
Q4:如何加速嵌入生成?
A:
- 启用 GPU:
model_kwargs={"device": "cuda"}
。 - 使用轻量模型(如
all-MiniLM-L6-v2
)。 - 启用多进程:
multi_process=True
(需更多内存)。
总结
langchain_huggingface.HuggingFaceEmbeddings
是一个灵活的嵌入模型,基于 Hugging Face 的预训练模型,适合本地和云端场景。核心功能包括:
- 方法:
embed_query
(查询嵌入)、embed_documents
(批量嵌入)。 - 参数:
model_name
(模型选择)、model_kwargs
(设备)、encode_kwargs
(归一化)。 - 使用方式:初始化 Hugging Face 模型,生成嵌入,结合向量存储(如 Milvus)。