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")
- 描述:OpenAI 提供的嵌入模型,如
-
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")
- 描述:Google 提供的嵌入模型,如
-
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")
- 描述:Cohere 提供的嵌入模型,如
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")
- 描述:基于 HuggingFace 模型的嵌入,如
-
HuggingFaceInstructEmbeddings
(langchain_huggingface):- 描述:基于指令优化的 HuggingFace 嵌入模型,如
hkunlp/instructor-large
。 - 特点:
- 支持任务特定指令,增强嵌入质量。
- 计算需求较高。
- 安装:
pip install langchain-huggingface InstructorEmbedding
- 示例:
from langchain_huggingface import HuggingFaceInstructEmbeddings embeddings = HuggingFaceInstructEmbeddings(model_name="hkunlp/instructor-large")
- 描述:基于指令优化的 HuggingFace 嵌入模型,如
-
OllamaEmbeddings
(langchain_community):- 描述:Ollama 提供的本地嵌入模型,如
nomic-embed-text
。 - 特点:
- 完全本地运行,适合隐私敏感场景。
- 需要运行 Ollama 服务。
- 安装:
pip install langchain-community
- 示例:
from langchain_community.embeddings import OllamaEmbeddings embeddings = OllamaEmbeddings(model="nomic-embed-text")
- 描述:Ollama 提供的本地嵌入模型,如
-
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")
- 描述:Jina AI 提供的嵌入模型,如
-
VoyageEmbeddings
(langchain_community):- 描述:Voyage AI 提供的嵌入模型,如
voyage-2
。 - 特点:
- 优化语义搜索和分类任务。
- 需要 Voyage API 密钥。
- 安装:
pip install langchain-community
- 示例:
from langchain_community.embeddings import VoyageEmbeddings embeddings = VoyageEmbeddings(model="voyage-2")
- 描述:Voyage AI 提供的嵌入模型,如
4. 自定义嵌入模型
- 自定义实现:通过继承
langchain_core.embeddings.Embeddings
基类,实现embed_query
和embed_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()
嵌入模型总结
类别 | 模型 | 包 | 特点 | 使用场景 |
---|---|---|---|---|
商业 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}
回答:"""
)
# 格式化文档函数
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(软件即服务)。
代码说明
- 嵌入模型:
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
基类。