【LangChain】LangChain 中支持的嵌入(embedding)模型

LangChain 中支持的嵌入(embedding)模型,这些模型用于将文本转换为向量表示,以便在向量存储(如 langchain_milvus.Milvuslangchain_chroma.Chroma)中进行存储和检索。

本文基于 LangChain 0.3.x,详细介绍 LangChain 支持的嵌入模型(包括内置和第三方集成),并提供一个独立示例,展示如何使用其中一种嵌入模型(OpenAIEmbeddings)结合 langchain_milvus.Milvus 构建 RAG 系统。示例包含 PDF 加载(langchain_community.document_loaders.PyPDFLoader)、分割、嵌入生成和查询。


LangChain 支持的嵌入模型

LangChain 支持多种嵌入模型,通过 langchain.embeddings 模块及其子模块(如 langchain_openai, langchain_huggingface)提供。这些模型包括商业 API(如 OpenAI)、开源模型(如 HuggingFace)以及本地或专用模型。以下是 LangChain 支持的主要嵌入模型类别和具体实现,基于官方文档(Embeddings) 和源码分析。

1. 商业 API 嵌入模型

这些模型通过云服务提供高质量嵌入,适合快速开发,但需 API 密钥和网络连接。

  • OpenAIEmbeddings (langchain_openai)

    • 描述:OpenAI 提供的嵌入模型,如 text-embedding-3-smalltext-embedding-3-large
    • 特点
      • 高质量嵌入,广泛用于 RAG。
      • 支持批量嵌入,性能优化。
      • 需要 OpenAI API 密钥。
    • 安装
      pip install langchain-openai
      
    • 示例
      from langchain_openai import OpenAIEmbeddings
      embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
      
  • AzureOpenAIEmbeddings (langchain_openai)

    • 描述:Azure 托管的 OpenAI 嵌入模型。
    • 特点
      • OpenAIEmbeddings 类似,但部署在 Azure 平台。
      • 支持企业级安全和合规性。
    • 安装
      pip install langchain-openai
      
    • 示例
      from langchain_openai import AzureOpenAIEmbeddings
      embeddings = AzureOpenAIEmbeddings(azure_deployment="your-embedding-deployment")
      
  • GoogleGenerativeAIEmbeddings (langchain_google_genai)

    • 描述:Google 提供的嵌入模型,如 text-embedding-004
    • 特点
      • 适合多语言任务。
      • 需要 Google Cloud API 密钥。
    • 安装
      pip install langchain-google-genai
      
    • 示例
      from langchain_google_genai import GoogleGenerativeAIEmbeddings
      embeddings = GoogleGenerativeAIEmbeddings(model="text-embedding-004")
      
  • BedrockEmbeddings (langchain_aws)

    • 描述:AWS Bedrock 提供的嵌入模型,如 Amazon Titan Embeddings。
    • 特点
      • 集成 AWS 生态,适合云原生应用。
      • 支持多种嵌入模型。
    • 安装
      pip install langchain-aws
      
    • 示例
      from langchain_aws import BedrockEmbeddings
      embeddings = BedrockEmbeddings(model_id="amazon.titan-embed-text-v1")
      
  • CohereEmbeddings (langchain_cohere)

    • 描述:Cohere 提供的嵌入模型,如 embed-english-v3.0
    • 特点
      • 高效,支持多语言。
      • 需要 Cohere API 密钥。
    • 安装
      pip install langchain-cohere
      
    • 示例
      from langchain_cohere import CohereEmbeddings
      embeddings = CohereEmbeddings(model="embed-english-v3.0")
      
2. 开源嵌入模型

这些模型通常基于 HuggingFace 或其他开源框架,可本地部署,适合隐私敏感或离线场景。

  • HuggingFaceEmbeddings (langchain_huggingface)

    • 描述:基于 HuggingFace 模型的嵌入,如 sentence-transformers/all-MiniLM-L6-v2
    • 特点
      • 开源,可本地运行。
      • 支持多种预训练模型,适合多语言任务。
      • 需要 sentence-transformers 库。
    • 安装
      pip install langchain-huggingface sentence-transformers
      
    • 示例
      from langchain_huggingface import HuggingFaceEmbeddings
      embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
      
  • HuggingFaceInstructEmbeddings (langchain_huggingface)

    • 描述:基于指令优化的 HuggingFace 嵌入模型,如 hkunlp/instructor-large
    • 特点
      • 支持任务特定指令,增强嵌入质量。
      • 计算需求较高。
    • 安装
      pip install langchain-huggingface InstructorEmbedding
      
    • 示例
      from langchain_huggingface import HuggingFaceInstructEmbeddings
      embeddings = HuggingFaceInstructEmbeddings(model_name="hkunlp/instructor-large")
      
  • OllamaEmbeddings (langchain_community)

    • 描述:Ollama 提供的本地嵌入模型,如 nomic-embed-text
    • 特点
      • 完全本地运行,适合隐私敏感场景。
      • 需要运行 Ollama 服务。
    • 安装
      pip install langchain-community
      
    • 示例
      from langchain_community.embeddings import OllamaEmbeddings
      embeddings = OllamaEmbeddings(model="nomic-embed-text")
      
  • LlamaCppEmbeddings (langchain_community)

    • 描述:基于 LLaMA.cpp 的嵌入模型。
    • 特点
      • 高效本地运行,支持量化模型。
      • 需要编译 LLaMA.cpp。
    • 安装
      pip install langchain-community llama-cpp-python
      
    • 示例
      from langchain_community.embeddings import LlamaCppEmbeddings
      embeddings = LlamaCppEmbeddings(model_path="path/to/llama-model.gguf")
      
3. 其他嵌入模型

LangChain 还支持一些专用或实验性嵌入模型,适用于特定场景。

  • SentenceTransformerEmbeddings (langchain_community)

    • 描述:直接使用 sentence-transformers 库的嵌入模型。
    • 特点
      • HuggingFaceEmbeddings 类似,但更直接调用 sentence-transformers
      • 开源,易于定制。
    • 安装
      pip install langchain-community sentence-transformers
      
    • 示例
      from langchain_community.embeddings import SentenceTransformerEmbeddings
      embeddings = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")
      
  • FastEmbedEmbeddings (langchain_community)

    • 描述:基于 Qdrant FastEmbed 的轻量级嵌入模型。
    • 特点
      • 优化速度和内存,适合资源受限环境。
      • 支持多种开源模型。
    • 安装
      pip install langchain-community fastembed
      
    • 示例
      from langchain_community.embeddings import FastEmbedEmbeddings
      embeddings = FastEmbedEmbeddings(model_name="BAAI/bge-small-en-v1.5")
      
  • JinaEmbeddings (langchain_community)

    • 描述:Jina AI 提供的嵌入模型,如 jina-embeddings-v2-base-en
    • 特点
      • 高性能,适合多模态任务。
      • 需要 Jina API 密钥或本地部署。
    • 安装
      pip install langchain-community
      
    • 示例
      from langchain_community.embeddings import JinaEmbeddings
      embeddings = JinaEmbeddings(model_name="jina-embeddings-v2-base-en")
      
  • VoyageEmbeddings (langchain_community)

    • 描述:Voyage AI 提供的嵌入模型,如 voyage-2
    • 特点
      • 优化语义搜索和分类任务。
      • 需要 Voyage API 密钥。
    • 安装
      pip install langchain-community
      
    • 示例
      from langchain_community.embeddings import VoyageEmbeddings
      embeddings = VoyageEmbeddings(model="voyage-2")
      
4. 自定义嵌入模型
  • 自定义实现:通过继承 langchain_core.embeddings.Embeddings 基类,实现 embed_queryembed_documents 方法。
  • 场景:使用私有模型或特定领域的嵌入。
  • 示例
    from langchain_core.embeddings import Embeddings
    class CustomEmbeddings(Embeddings):
        def embed_query(self, text: str) -> List[float]:
            return [0.1] * 384  # 模拟嵌入
        def embed_documents(self, texts: List[str]) -> List[List[float]]:
            return [[0.1] * 384 for _ in texts]
    embeddings = CustomEmbeddings()
    
嵌入模型总结
类别模型特点使用场景
商业 APIOpenAIEmbeddingslangchain-openai高质量,易用RAG、语义搜索
商业 APIAzureOpenAIEmbeddingslangchain-openai企业级,Azure 集成企业应用
商业 APIGoogleGenerativeAIEmbeddingslangchain-google-genai多语言支持跨语言任务
商业 APIBedrockEmbeddingslangchain-awsAWS 生态云原生应用
商业 APICohereEmbeddingslangchain-cohere高效,多语言快速原型
开源HuggingFaceEmbeddingslangchain-huggingface开源,本地运行隐私敏感场景
开源OllamaEmbeddingslangchain-community完全本地离线环境
开源LlamaCppEmbeddingslangchain-community高效量化本地高性能
其他FastEmbedEmbeddingslangchain-community轻量快速资源受限环境
其他JinaEmbeddingslangchain-community多模态支持复杂任务

推荐模型

  • 开发/测试OpenAIEmbeddings(简单、高质量)、HuggingFaceEmbeddings(开源、免费)。
  • 生产环境AzureOpenAIEmbeddings(企业级)、BedrockEmbeddings(AWS 集成)。
  • 本地部署OllamaEmbeddingsLlamaCppEmbeddings

使用嵌入模型的 RAG 示例

以下是一个独立示例,展示如何使用 OpenAIEmbeddings(LangChain 中最常用的嵌入模型之一)结合 langchain_milvus.Milvus 构建 RAG 系统,加载 PDF 文档(关于云计算主题),回答查询。

准备文件
创建一个 PDF 文件 cloud_computing_knowledge.pdf,内容如下(可使用 Word 保存为 PDF):

云计算通过互联网提供按需计算资源,如服务器和存储。
IaaS(基础设施即服务)提供虚拟机和存储,如 AWS EC2。
SaaS(软件即服务)提供在线应用,如 Google Workspace。

代码

import os
os.environ["OPENAI_API_KEY"] = "Your OpenAI API Key"

from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_milvus import Milvus
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyPDFLoader

# 加载 PDF 文档
loader = PyPDFLoader(file_path="cloud_computing_knowledge.pdf")
documents = loader.load()

# 分割文档
splitter = RecursiveCharacterTextSplitter(
    chunk_size=100,
    chunk_overlap=20,
    separators=["\n\n", "\n", " ", ""]
)
split_documents = splitter.split_documents(documents)

# 初始化嵌入模型和 Milvus 向量存储
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Milvus(
    embedding_function=embeddings,
    connection_args={"uri": "http://localhost:19530"},
    collection_name="cloud_computing_collection",
    drop_old=True,
    auto_id=True
)
vectorstore.add_documents(split_documents)

# 初始化 LLM
llm = ChatOpenAI(temperature=0, model="gpt-4")

# 提示模板
prompt = ChatPromptTemplate.from_template(
    """根据以下上下文回答问题:
上下文:{context}
问题:{question}
回答:"""
)

# 格式化文档函数
def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)

# 创建 RAG 链
rag_chain = (
    {
        "context": vectorstore.as_retriever(search_kwargs={"k": 2}) | format_docs,
        "question": RunnablePassthrough()
    }
    | prompt
    | llm
    | StrOutputParser()
)

# 调用链
print("RAG 链输出:")
response = rag_chain.invoke("什么是云计算?")
print(response)
response = rag_chain.invoke("它有哪些服务模型?")
print(response)

输出示例

RAG 链输出:
云计算通过互联网提供按需计算资源,如服务器和存储。
云计算的服务模型包括 IaaS(基础设施即服务)和 SaaS(软件即服务)。
代码说明
  1. 嵌入模型
    • OpenAIEmbeddingstext-embedding-3-small)生成文档和查询的嵌入向量。
  2. 文档加载与分割
    • PyPDFLoader 加载 cloud_computing_knowledge.pdf
    • RecursiveCharacterTextSplitter 分割为 100 字符块,chunk_overlap=20
  3. 向量存储
    • Milvus 使用 connection_args={"uri": "http://localhost:19530"} 存储嵌入,集合名为 cloud_computing_collection
  4. RAG 链
    • retriever 检索 2 个相关文档。
    • prompt 结合上下文和问题,llmgpt-4)生成答案。

运行要求

  • Milvus 服务运行(http://localhost:19530)。
  • cloud_computing_knowledge.pdf 存在且可读。
  • OpenAI API 密钥有效。

注意事项

  1. API 密钥
    • 对于商业嵌入模型(如 OpenAIEmbeddings),使用 .env
      from dotenv import load_dotenv
      load_dotenv()
      
    • 确保密钥支持指定模型。
  2. 依赖
    • 安装示例所需:
      pip install --upgrade langchain langchain-openai langchain-milvus pymilvus langchain-community pypdf
      
    • 其他嵌入模型可能需要额外包(如 langchain-huggingface)。
  3. 嵌入模型选择
    • 维度兼容性:确保嵌入模型的输出维度与向量存储兼容(如 Milvus 默认支持任意维度)。
    • 性能:商业模型(如 OpenAI)速度快但需网络;开源模型(如 HuggingFace)可本地运行但计算密集。
    • 成本:开源模型免费,商业模型按 API 调用计费。
  4. 本地部署
    • 对于 HuggingFaceEmbeddingsOllamaEmbeddings,确保 GPU(若可用)加速:
      embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2", model_kwargs={"device": "cuda"})
      
  5. 调试
    • 验证嵌入维度:
      vector = embeddings.embed_query("测试")
      print(len(vector))  # 输出维度,如 1536
      
    • 检查 Milvus 连接:
      from pymilvus import connections
      connections.connect(uri="http://localhost:19530")
      

常见问题

Q1:如何选择合适的嵌入模型?
A:根据需求:

  • 快速开发OpenAIEmbeddings(高性能、简单)。
  • 隐私敏感HuggingFaceEmbeddingsOllamaEmbeddings(本地运行)。
  • 多语言GoogleGenerativeAIEmbeddingsCohereEmbeddings
  • 资源受限FastEmbedEmbeddings(轻量)。

Q2:可以混合使用嵌入模型吗?
A:不推荐,同一向量存储应使用相同的嵌入模型,确保向量维度和语义一致。若需切换,重建集合:

vectorstore.drop_old = True
vectorstore.add_documents(documents)

Q3:如何处理嵌入模型的维度不匹配?
A:检查模型输出维度,调整向量存储配置:

vectorstore = Milvus(..., dimension=1536)  # 匹配 OpenAI 维度

Q4:支持多模态嵌入吗?
A:部分模型(如 JinaEmbeddings)支持多模态,但 LangChain 主要聚焦文本嵌入。多模态需自定义实现。


总结

LangChain 支持多种嵌入模型,包括:

  • 商业 APIOpenAIEmbeddings, AzureOpenAIEmbeddings, GoogleGenerativeAIEmbeddings, BedrockEmbeddings, CohereEmbeddings
  • 开源模型HuggingFaceEmbeddings, OllamaEmbeddings, LlamaCppEmbeddings
  • 其他FastEmbedEmbeddings, JinaEmbeddings, VoyageEmbeddings
  • 自定义:继承 Embeddings 基类。
### LangChainEmbedding 的功能与实现 LangChain 是一种用于构建复杂 AI 应用程序的强大框架,其核心之一便是支持多种类型的嵌入Embedding)。通过这些嵌入技术,可以将文本转换为高维向量表示形式,从而便于后续处理和分析。 #### 什么是 EmbeddingEmbedding 技术是一种将离散数据(如单词、短语或文档)映射到连续向量空间的技术。这种技术能够捕捉词语之间的语义关系并将其转化为数值型特征以便于机器学习算法使用[^2]。 #### LangChain 支持Embedding 类型 LangChain 提供了灵活的支持来集成不同的嵌入模型,无论是预训练模型还是自定义模型都可以轻松接入。以下是几种常见的嵌入方法及其应用场景: 1. **Hugging Face Transformers 嵌入** Hugging Face 提供了大量的预训练语言模型,可以直接作为嵌入工具应用于 LangChain 流程之中。例如可以通过加载 `sentence-transformers` 模型来进行高质量的句子级嵌入操作[^1]。 2. **OpenAI API 驱动的嵌入** 如果项目允许调用外部服务,则 OpenAI 所提供的 GPT 系列模型也是一个不错的选择。它们具备强大的泛化能力,在许多自然语言理解任务上表现优异。不过需要注意的是这通常伴随着一定的成本开销以及网络延迟等问题。 3. **本地部署的 FAISS 或 ChromaDB 向量存储方案** 对于希望完全掌控整个系统的开发者来说,还可以考虑利用像 FAISS 这样的库或者更高级别的解决方案比如 Chroma 来管理自己的向量数据库。这样不仅可以减少对外部依赖程度还能提高查询效率。 #### 实现代码示例 下面给出一段简单的 Python 脚本展示如何基于 SentenceTransformer 创建一个基本的嵌入函数并与 LangChain 结合起来工作: ```python from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS # 初始化 huggingface embeddings 使用 sentence-transformer model 'all-MiniLM-L6-v2' embedder = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2") texts = ["hello world", "this is a test"] # 将 texts 列表中的每一项都转成对应的 embedding vector 并存放到 faiss index 当中去. docsearch = FAISS.from_texts(texts, embedder) query = "what does the fox say?" docs = docsearch.similarity_search(query) print(docs) ``` 上述脚本展示了怎样借助 HuggingFaceEmbeddings 和 FAISS 构建起一套完整的检索机制。其中我们选择了性能良好且体积较小的 all-Minilm-l6-V2 模型来做示范用途。 ### 总结 综上所述,LangChain 不仅提供了丰富的接口使得我们可以方便快捷地引入各种先进的嵌入技术;同时也给予了足够的自由度让用户可以根据实际需求定制专属的工作流。无论你是初学者还是资深工程师都能从中受益匪浅[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

彬彬侠

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

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

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

打赏作者

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

抵扣说明:

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

余额充值