【LangChain】langchain_huggingface.HuggingFaceEmbeddings:基于Hugging Face的 Transformer 的嵌入(embedding)模型类

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-transformerstransformers 库加载预训练模型,生成文本的向量表示。它适合本地或云端场景,广泛用于语义搜索、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.RecursiveCharacterTextSplitterlangchain_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)
代码说明
  1. 嵌入模型
    • HuggingFaceEmbeddings 加载 sentence-transformers/all-MiniLM-L6-v2,生成 384 维嵌入。
    • 配置 device="cpu"normalize_embeddings=True
  2. 文本分割
    • RecursiveCharacterTextSplitter 设置 chunk_size=100chunk_overlap=20
    • 分割 PDF 文档,保留元数据。
  3. 文档加载
    • PyPDFLoader 加载 machine_learning_knowledge.pdf
  4. 向量存储
    • Milvus 使用 connection_args={"uri": "http://localhost:19530"},集合名为 machine_learning_collection
    • 显式设置 dimension=384(匹配模型嵌入维度)。
  5. 检索
    • 使用 similarity_search 查找与查询最相似的 2 个块。
  6. 主题
    • 示例聚焦机器学习检索,简单且独立。

运行要求

  • 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)。

注意事项

  1. 模型选择
    • 轻量模型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
      
  2. 硬件要求
    • CPU:大多数模型运行良好,4GB+ RAM。
    • GPU:加速推理,需 CUDA 和 PyTorch:
      nvidia-smi
      
  3. Milvus 配置
    • 验证服务:
      curl http://localhost:19530
      
    • 非本地部署:
      connection_args={"uri": "http://your-milvus-host:19530"}
      
    • 维度匹配:确保 dimension 与模型嵌入维度一致(all-MiniLM-L6-v2 为 384)。
  4. 性能优化
    • 推理速度
      • 启用 GPU:model_kwargs={"device": "cuda"}
      • 使用轻量模型(如 all-MiniLM-L6-v2)。
    • 批量处理
      • embed_documents 支持批量生成:
        vectors = embeddings.embed_documents([doc.page_content for doc in split_documents])
        
    • 归一化
      • 设置 normalize_embeddings=True 提高检索一致性。
  5. 错误调试
    • 模型加载失败
      • 检查网络连接或本地模型路径:
        from huggingface_hub import snapshot_download
        snapshot_download(repo_id="sentence-transformers/all-MiniLM-L6-v2")
        
      • 确保内存足够。
    • 维度不匹配
      • 验证 Milvus 集合维度:
        vectorstore = Milvus(..., dimension=384)
        
    • 检索无关
      • 调整 chunk_sizechunk_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)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值