LangChain 中支持的嵌入(embedding)模型,这些模型用于将文本转换为向量表示,以便在向量存储(如 langchain_milvus.Milvus 或 langchain_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-small 和 text-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_query 和 embed_documents 方法。场景:使用私有模型或特定领域的嵌入。
- 示例:
- from langchain_core.embeddings import Embeddings
- classCustomEmbeddings(Embeddings):defembed_query(self, text:str)-> List[float]:return[0.1]*384# 模拟嵌入defembed_documents(self, texts: List[str])-> List[List[float]]:return[[0.1]*384for _ in texts]
- embeddings = CustomEmbeddings()
复制代码 嵌入模型总结
类别 | 模型 | 包 | 特点 | 使用场景 | 商业 API | OpenAIEmbeddings | langchain-openai | 高质量,易用 | RAG、语义搜索 | 商业 API | AzureOpenAIEmbeddings | langchain-openai | 企业级,Azure 集成 | 企业应用 | 商业 API | GoogleGenerativeAIEmbeddings | langchain-google-genai | 多语言支持 | 跨语言任务 | 商业 API | BedrockEmbeddings | langchain-aws | AWS 生态 | 云原生应用 | 商业 API | CohereEmbeddings | langchain-cohere | 高效,多语言 | 快速原型 | 开源 | HuggingFaceEmbeddings | langchain-huggingface | 开源,本地运行 | 隐私敏感场景 | 开源 | OllamaEmbeddings | langchain-community | 完全本地 | 离线环境 | 开源 | LlamaCppEmbeddings | langchain-community | 高效量化 | 本地高性能 | 其他 | FastEmbedEmbeddings | langchain-community | 轻量快速 | 资源受限环境 | 其他 | JinaEmbeddings | langchain-community | 多模态支持 | 复杂任务 | 推荐模型:
开发/测试:OpenAIEmbeddings(简单、高质量)、HuggingFaceEmbeddings(开源、免费)。生产环境:AzureOpenAIEmbeddings(企业级)、BedrockEmbeddings(AWS 集成)。本地部署:OllamaEmbeddings、LlamaCppEmbeddings。
使用嵌入模型的 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}
- 回答:""")# 格式化文档函数defformat_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(软件即服务)。
复制代码 代码说明
- 嵌入模型:
OpenAIEmbeddings(text-embedding-3-small)生成文档和查询的嵌入向量。
- 文档加载与分割:
PyPDFLoader 加载 cloud_computing_knowledge.pdf。RecursiveCharacterTextSplitter 分割为 100 字符块,chunk_overlap=20。
- 向量存储:
Milvus 使用 connection_args={"uri": "http://localhost:19530"} 存储嵌入,集合名为 cloud_computing_collection。
- RAG 链:
retriever 检索 2 个相关文档。prompt 结合上下文和问题,llm(gpt-4)生成答案。
运行要求:
Milvus 服务运行(http://localhost:19530)。cloud_computing_knowledge.pdf 存在且可读。OpenAI API 密钥有效。
注意事项
- API 密钥:
- 对于商业嵌入模型(如 OpenAIEmbeddings),使用 .env:
- from dotenv import load_dotenv
- load_dotenv()
复制代码 确保密钥支持指定模型。
- 依赖:
安装示例所需:- pip install --upgrade langchain langchain-openai langchain-milvus pymilvus langchain-community pypdf
复制代码 其他嵌入模型可能需要额外包(如 langchain-huggingface)。
- 嵌入模型选择:
维度兼容性:确保嵌入模型的输出维度与向量存储兼容(如 Milvus 默认支持任意维度)。性能:商业模型(如 OpenAI)速度快但需网络;开源模型(如 HuggingFace)可本地运行但计算密集。成本:开源模型免费,商业模型按 API 调用计费。
- 本地部署:
对于 HuggingFaceEmbeddings 或 OllamaEmbeddings,确保 GPU(若可用)加速:- embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2", model_kwargs={"device":"cuda"})
复制代码
- 调试:
验证嵌入维度:- vector = embeddings.embed_query("测试")print(len(vector))# 输出维度,如 1536
复制代码- 检查 Milvus 连接:
- from pymilvus import connections
- connections.connect(uri="http://localhost:19530")
复制代码
常见问题
Q1:如何选择合适的嵌入模型?
A:根据需求:
快速开发:OpenAIEmbeddings(高性能、简单)。隐私敏感:HuggingFaceEmbeddings 或 OllamaEmbeddings(本地运行)。多语言:GoogleGenerativeAIEmbeddings 或 CohereEmbeddings。资源受限:FastEmbedEmbeddings(轻量)。
Q2:可以混合使用嵌入模型吗?
A:不推荐,同一向量存储应使用相同的嵌入模型,确保向量维度和语义一致。若需切换,重建集合:- vectorstore.drop_old =True
- vectorstore.add_documents(documents)
复制代码 Q3:如何处理嵌入模型的维度不匹配?
A:检查模型输出维度,调整向量存储配置:- vectorstore = Milvus(..., dimension=1536)# 匹配 OpenAI 维度
复制代码 Q4:支持多模态嵌入吗?
A:部分模型(如 JinaEmbeddings)支持多模态,但 LangChain 主要聚焦文本嵌入。多模态需自定义实现。
总结
LangChain 支持多种嵌入模型,包括:
商业 API:OpenAIEmbeddings, AzureOpenAIEmbeddings, GoogleGenerativeAIEmbeddings, BedrockEmbeddings, CohereEmbeddings。开源模型:HuggingFaceEmbeddings, OllamaEmbeddings, LlamaCppEmbeddings。其他:FastEmbedEmbeddings, JinaEmbeddings, VoyageEmbeddings。自定义:继承 Embeddings 基类。
|