在 LangChain 中,langchain_milvus.Milvus
是用于与 Milvus 向量数据库交互的向量存储类,适用于存储高维嵌入向量并进行高效相似性搜索,广泛用于检索增强生成(RAG)系统、文档检索等场景。本文将详细介绍 langchain_milvus.Milvus
类的核心方法、功能及其在 RAG 系统中的典型应用。
本回答基于 LangChain 0.3.x,重点说明 Milvus
的常用方法,包括方法签名、参数、返回值及使用场景,并提供一个独立示例,展示如何使用这些方法构建 RAG 系统。示例将包含文本加载、分割、嵌入生成和查询。
langchain_milvus.Milvus
简介langchain_milvus.Milvus
是 LangChain 提供的 Milvus 向量存储包装器,连接 Milvus 数据库(一个开源向量数据库),支持存储嵌入向量和元数据,执行高效的向量搜索(如 ANN)。它继承自 LangChain 的 VectorStore
基类,提供了标准化的向量存储接口。
核心功能:
OpenAIEmbeddings
生成)。初始化参数:
embedding_function
(必填):嵌入模型(如 OpenAIEmbeddings
)。connection_args
(默认 {"uri": "http://localhost:19530"}
):Milvus 连接参数。collection_name
(默认 "LangChainCollection"
):集合名称。vector_field
(默认 "vector"
):存储向量的字段。text_field
(默认 "text"
):存储文本的字段。drop_old
(默认 False
):是否删除旧集合。Milvus
常用方法以下是 langchain_milvus.Milvus
类的常用方法,基于源码(langchain_milvus/vectorstores/milvus.py
)和官方文档(Milvus Vector Store)。列出方法签名、参数、返回值、功能描述及使用场景。
add_documents(documents: List[Document], **kwargs) -> List[str]
documents
:List[Document]
,包含 page_content
和 metadata
的文档列表。**kwargs
:附加参数,如 batch_size
(批量插入大小)。List[str]
,插入文档的 ID 列表。from langchain_core.documents import Document
documents = [Document(page_content="示例文本", metadata={"source": "test"})]
vectorstore.add_documents(documents)
add_texts(texts: Iterable[str], metadatas: Optional[List[dict]] = None, **kwargs) -> List[str]
texts
:文本字符串迭代器。metadatas
:可选的元数据列表,与文本对应。**kwargs
:附加参数,如 batch_size
。List[str]
,插入文本的 ID 列表。Document
对象)。texts = ["自然语言处理是 AI 的分支"]
metadatas = [{"source": "nlp"}]
vectorstore.add_texts(texts, metadatas)
as_retriever(**kwargs) -> VectorStoreRetriever
search_type
(默认 "similarity"
):搜索类型("similarity"
, "mmr"
)。search_kwargs
:搜索参数,如 k
(返回文档数)、expr
(元数据过滤表达式)。VectorStoreRetriever
,可用于检索相关文档。expr="source == 'nlp'"
)。retriever = vectorstore.as_retriever(search_kwargs={"k": 2, "expr": "source == 'nlp'"})
docs = retriever.invoke("什么是 NLP?")
similarity_search(query: str, k: int = 4, **kwargs) -> List[Document]
query
:查询字符串。k
:返回文档数量。**kwargs
:附加参数,如 expr
(元数据过滤)、param
(搜索参数,如 metric_type
)。List[Document]
,包含匹配的文档。docs = vectorstore.similarity_search("什么是 NLP?", k=2, expr="source == 'nlp'")
for doc in docs:
print(doc.page_content)
similarity_search_with_score(query: str, k: int = 4, **kwargs) -> List[Tuple[Document, float]]
query
:查询字符串。k
:返回文档数量。**kwargs
:如 expr
、param
。List[Tuple[Document, float]]
,文档和得分(0-1,1 表示最相似)。results = vectorstore.similarity_search_with_score("什么是 NLP?", k=2)
for doc, score in results:
print(f"Content: {doc.page_content}, Score: {score}")
delete(ids: Optional[List[str]] = None, **kwargs) -> None
ids
:要删除的文档 ID 列表。**kwargs
:附加参数,如 expr
(删除条件)。vectorstore.delete(ids=["doc_id_1", "doc_id_2"])
from_documents(cls, documents: List[Document], embedding: Embeddings, **kwargs) -> Milvus
documents
:List[Document]
,文档列表。embedding
:嵌入模型。**kwargs
:如 connection_args
、collection_name
。Milvus
实例。from langchain_openai import OpenAIEmbeddings
vectorstore = Milvus.from_documents(documents, OpenAIEmbeddings(), collection_name="test")
from_texts(cls, texts: List[str], embedding: Embeddings, metadatas: Optional[List[dict]] = None, **kwargs) -> Milvus
texts
:文本列表。embedding
:嵌入模型。metadatas
:可选的元数据列表。**kwargs
:如 connection_args
。Milvus
实例。vectorstore = Milvus.from_texts(["测试文本"], OpenAIEmbeddings(), collection_name="test")
max_marginal_relevance_search(query: str, k: int = 4, fetch_k: int = 20, **kwargs) -> List[Document]
:
similarity_search_by_vector(embedding: List[float], k: int = 4, **kwargs) -> List[Document]
:
方法 | 主要用途 | 典型场景 |
---|---|---|
add_documents |
批量添加文档 | 初始化 RAG 知识库 |
add_texts |
添加原始文本 | 轻量级数据导入 |
as_retriever |
转换为 RAG 检索器 | 构建 RAG 管道 |
similarity_search |
手动相似性搜索 | 测试检索效果 |
similarity_search_with_score |
带得分搜索 | 评估检索质量 |
delete |
删除文档 | 清理或更新集合 |
from_documents |
创建并填充存储 | 快速初始化 |
from_texts |
从文本创建存储 | 小规模测试 |
推荐方法:
as_retriever
:RAG 系统中用于检索。add_documents
/ from_documents
:初始化或更新知识库。similarity_search
:调试和验证。Milvus
常用方法以下示例展示如何使用 langchain_milvus.Milvus
的常用方法(from_documents
, as_retriever
, similarity_search
),构建一个 RAG 系统,加载 NLP 相关文档,回答查询。
准备文件:
创建 nlp_knowledge.txt
:
自然语言处理(NLP)是人工智能的一个分支,专注于计算机与人类语言的交互。
词嵌入是 NLP 的技术,将单词映射到高维向量空间。
Transformers 是 NLP 的先进模型,基于注意力机制。
代码:
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 TextLoader
# 加载文档
loader = TextLoader(file_path="nlp_knowledge.txt", encoding="utf-8")
documents = loader.load()
# 分割文档
splitter = RecursiveCharacterTextSplitter(
chunk_size=100,
chunk_overlap=20,
separators=["\n\n", "\n", " ", ""]
)
split_documents = splitter.split_documents(documents)
# 使用 from_documents 创建 Milvus 向量存储
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Milvus.from_documents(
documents=split_documents,
embedding=embeddings,
connection_args={"uri": "http://localhost:19530"},
collection_name="nlp_knowledge",
drop_old=True,
auto_id = True
)
# 测试 similarity_search
print("测试 similarity_search:")
results = vectorstore.similarity_search("什么是 NLP?", k=2)
for doc in results:
print(f"Content: {doc.page_content}")
# 初始化 LLM
llm = ChatOpenAI(temperature=0, model="gpt-4")
# 提示模板
prompt = ChatPromptTemplate.from_template(
"""根据以下上下文回答问题:
上下文:{context}
问题:{question}
回答:"""
)
# 使用 as_retriever 创建 RAG 链
retriever = vectorstore.as_retriever(search_kwargs={"k": 2})
rag_chain = (
{
"context": retriever,
"question": RunnablePassthrough()
}
| prompt
| llm
| StrOutputParser()
)
# 调用链
print("\nRAG 链输出:")
response = rag_chain.invoke("什么是自然语言处理?")
print(response)
response = rag_chain.invoke("它包含哪些技术?")
print(response)
输出示例:
测试 similarity_search:
Content: 自然语言处理(NLP)是人工智能的一个分支,专注于计算机与人类语言的交互。
Content: 词嵌入是 NLP 的技术,将单词映射到高维向量空间。
RAG 链输出:
自然语言处理(NLP)是人工智能的一个分支,专注于计算机与人类语言的交互。
自然语言处理包含技术,如词嵌入和 Transformers。
TextLoader
加载 nlp_knowledge.txt
。RecursiveCharacterTextSplitter
分割为 100 字符块,chunk_overlap=20
。Milvus.from_documents
创建并填充 nlp_knowledge
集合。OpenAIEmbeddings
生成嵌入。similarity_search
:手动测试检索效果。as_retriever
:集成到 RAG 链,检索相关文档。retriever
返回 2 个最相关文档。prompt
和 llm
(gpt-4
)生成答案。运行要求:
localhost:19530
)。nlp_knowledge.txt
存在,编码为 utf-8
。.env
文件:from dotenv import load_dotenv
load_dotenv()
text-embedding-3-small
和 gpt-4
。pip install --upgrade langchain langchain-milvus langchain-openai pymilvus
docker ps # 检查 Milvus 容器
connection_args={"uri": "http://your-milvus-host:your-port"}
chunk_size
(500-1000)、search_kwargs={"k": 3}
。vectorstore = Milvus(..., index_params={"metric_type": "L2", "index_type": "IVF_FLAT"})
from pymilvus import connections; connections.connect(uri = "http://localhost:19530")
。vectorstore._client
验证集合。Q1:as_retriever
和 similarity_search
的区别?
A:as_retriever
返回可集成到 RAG 链的检索器,适合管道;similarity_search
是手动查询方法,适合调试。
Q2:如何过滤元数据?
A:使用 expr
参数,如 vectorstore.as_retriever(search_kwargs={"expr": "source == 'nlp'"})
。
Q3:如何批量删除文档?
A:使用 delete
方法,提供 ID 列表或 expr
条件,如 vectorstore.delete(expr="source == 'old'")
。
Q4:支持哪些索引类型?
A:支持 Milvus 的索引(如 IVF_FLAT
, HNSW
),通过 index_params
设置。
langchain_milvus.Milvus
的常用方法包括:
add_documents
, add_texts
, from_documents
, from_texts
。as_retriever
, similarity_search
, similarity_search_with_score
。delete
。这些方法支持构建高效的 RAG 系统。示例代码展示了 from_documents
创建存储、similarity_search
测试检索、as_retriever
集成 RAG 链,处理 NLP 主题查询。