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.embeddings
模块及其子模块(如 langchain_openai
, langchain_huggingface
)提供。这些模型包括商业 API(如 OpenAI)、开源模型(如 HuggingFace)以及本地或专用模型。以下是 LangChain 支持的主要嵌入模型类别和具体实现,基于官方文档(Embeddings) 和源码分析。
这些模型通过云服务提供高质量嵌入,适合快速开发,但需 API 密钥和网络连接。
OpenAIEmbeddings
(langchain_openai):
text-embedding-3-small
和 text-embedding-3-large
。pip install langchain-openai
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
AzureOpenAIEmbeddings
(langchain_openai):
OpenAIEmbeddings
类似,但部署在 Azure 平台。pip install langchain-openai
from langchain_openai import AzureOpenAIEmbeddings
embeddings = AzureOpenAIEmbeddings(azure_deployment="your-embedding-deployment")
GoogleGenerativeAIEmbeddings
(langchain_google_genai):
text-embedding-004
。pip install langchain-google-genai
from langchain_google_genai import GoogleGenerativeAIEmbeddings
embeddings = GoogleGenerativeAIEmbeddings(model="text-embedding-004")
BedrockEmbeddings
(langchain_aws):
pip install langchain-aws
from langchain_aws import BedrockEmbeddings
embeddings = BedrockEmbeddings(model_id="amazon.titan-embed-text-v1")
CohereEmbeddings
(langchain_cohere):
embed-english-v3.0
。pip install langchain-cohere
from langchain_cohere import CohereEmbeddings
embeddings = CohereEmbeddings(model="embed-english-v3.0")
这些模型通常基于 HuggingFace 或其他开源框架,可本地部署,适合隐私敏感或离线场景。
HuggingFaceEmbeddings
(langchain_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):
hkunlp/instructor-large
。pip install langchain-huggingface InstructorEmbedding
from langchain_huggingface import HuggingFaceInstructEmbeddings
embeddings = HuggingFaceInstructEmbeddings(model_name="hkunlp/instructor-large")
OllamaEmbeddings
(langchain_community):
nomic-embed-text
。pip install langchain-community
from langchain_community.embeddings import OllamaEmbeddings
embeddings = OllamaEmbeddings(model="nomic-embed-text")
LlamaCppEmbeddings
(langchain_community):
pip install langchain-community llama-cpp-python
from langchain_community.embeddings import LlamaCppEmbeddings
embeddings = LlamaCppEmbeddings(model_path="path/to/llama-model.gguf")
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):
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-embeddings-v2-base-en
。pip install langchain-community
from langchain_community.embeddings import JinaEmbeddings
embeddings = JinaEmbeddings(model_name="jina-embeddings-v2-base-en")
VoyageEmbeddings
(langchain_community):
voyage-2
。pip install langchain-community
from langchain_community.embeddings import VoyageEmbeddings
embeddings = VoyageEmbeddings(model="voyage-2")
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
。以下是一个独立示例,展示如何使用 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
。retriever
检索 2 个相关文档。prompt
结合上下文和问题,llm
(gpt-4
)生成答案。运行要求:
http://localhost:19530
)。cloud_computing_knowledge.pdf
存在且可读。OpenAIEmbeddings
),使用 .env
:from dotenv import load_dotenv
load_dotenv()
pip install --upgrade langchain langchain-openai langchain-milvus pymilvus langchain-community pypdf
langchain-huggingface
)。HuggingFaceEmbeddings
或 OllamaEmbeddings
,确保 GPU(若可用)加速:embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2", model_kwargs={"device": "cuda"})
vector = embeddings.embed_query("测试")
print(len(vector)) # 输出维度,如 1536
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 支持多种嵌入模型,包括:
OpenAIEmbeddings
, AzureOpenAIEmbeddings
, GoogleGenerativeAIEmbeddings
, BedrockEmbeddings
, CohereEmbeddings
。HuggingFaceEmbeddings
, OllamaEmbeddings
, LlamaCppEmbeddings
。FastEmbedEmbeddings
, JinaEmbeddings
, VoyageEmbeddings
。Embeddings
基类。