【LangChain】langchain_milvus.Milvus 中常用的方法 列举 和 解释说明

在 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 生成)。
  • 支持快速相似性搜索,返回与查询最相关的文档。
  • 集成 LangChain 检索器接口,适合 RAG 管道。
  • 支持元数据过滤和集合管理。

初始化参数

  • 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)。列出方法签名、参数、返回值、功能描述及使用场景。

1. add_documents(documents: List[Document], **kwargs) -> List[str]
  • 功能:将文档列表添加到 Milvus 集合,生成嵌入向量并存储。
  • 参数
    • documentsList[Document],包含 page_contentmetadata 的文档列表。
    • **kwargs:附加参数,如 batch_size(批量插入大小)。
  • 返回值List[str],插入文档的 ID 列表。
  • 使用场景
    • 初始化向量存储,批量导入文档。
    • 更新集合,添加新文档。
  • 示例
    from langchain_core.documents import Document
    documents = [Document(page_content="示例文本", metadata={"source": "test"})]
    vectorstore.add_documents(documents)
    
2. add_texts(texts: Iterable[str], metadatas: Optional[List[dict]] = None, **kwargs) -> List[str]
  • 功能:将文本列表添加到 Milvus 集合,生成嵌入并存储。
  • 参数
    • texts:文本字符串迭代器。
    • metadatas:可选的元数据列表,与文本对应。
    • **kwargs:附加参数,如 batch_size
  • 返回值List[str],插入文本的 ID 列表。
  • 使用场景
    • 直接添加原始文本(无 Document 对象)。
    • 适合轻量级数据导入。
  • 示例
    texts = ["自然语言处理是 AI 的分支"]
    metadatas = [{"source": "nlp"}]
    vectorstore.add_texts(texts, metadatas)
    
3. as_retriever(**kwargs) -> VectorStoreRetriever
  • 功能:将 Milvus 向量存储转换为 LangChain 检索器,用于 RAG 管道。
  • 参数
    • search_type(默认 "similarity"):搜索类型("similarity", "mmr")。
    • search_kwargs:搜索参数,如 k(返回文档数)、expr(元数据过滤表达式)。
  • 返回值VectorStoreRetriever,可用于检索相关文档。
  • 使用场景
    • 在 RAG 系统中检索与查询最相关的文档。
    • 支持元数据过滤(如 expr="source == 'nlp'")。
  • 示例
    retriever = vectorstore.as_retriever(search_kwargs={"k": 2, "expr": "source == 'nlp'"})
    docs = retriever.invoke("什么是 NLP?")
    
4. 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)
    
5. similarity_search_with_score(query: str, k: int = 4, **kwargs) -> List[Tuple[Document, float]]
  • 功能:执行相似性搜索,返回文档及其相似度得分。
  • 参数
    • query:查询字符串。
    • k:返回文档数量。
    • **kwargs:如 exprparam
  • 返回值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}")
    
6. delete(ids: Optional[List[str]] = None, **kwargs) -> None
  • 功能:从 Milvus 集合中删除指定 ID 的文档。
  • 参数
    • ids:要删除的文档 ID 列表。
    • **kwargs:附加参数,如 expr(删除条件)。
  • 返回值:无。
  • 使用场景
    • 清理过时或错误的文档。
    • 动态更新集合。
  • 示例
    vectorstore.delete(ids=["doc_id_1", "doc_id_2"])
    
7. from_documents(cls, documents: List[Document], embedding: Embeddings, **kwargs) -> Milvus
  • 功能:类方法,从文档列表创建 Milvus 向量存储实例并添加文档。
  • 参数
    • documentsList[Document],文档列表。
    • embedding:嵌入模型。
    • **kwargs:如 connection_argscollection_name
  • 返回值Milvus 实例。
  • 使用场景
    • 一次性创建并填充向量存储。
    • 简化初始化流程。
  • 示例
    from langchain_openai import OpenAIEmbeddings
    vectorstore = Milvus.from_documents(documents, OpenAIEmbeddings(), collection_name="test")
    
8. from_texts(cls, texts: List[str], embedding: Embeddings, metadatas: Optional[List[dict]] = None, **kwargs) -> Milvus
  • 功能:类方法,从文本列表创建 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]
    • 使用最大边际相关性(MMR)搜索,优化结果多样性。
    • 场景:避免检索过于相似的文档。
  • 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:调试和验证。

RAG 示例:使用 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。
代码说明
  1. 文档加载与分割
    • TextLoader 加载 nlp_knowledge.txt
    • RecursiveCharacterTextSplitter 分割为 100 字符块,chunk_overlap=20
  2. 向量存储
    • Milvus.from_documents 创建并填充 nlp_knowledge 集合。
    • 使用 OpenAIEmbeddings 生成嵌入。
  3. 方法使用
    • similarity_search:手动测试检索效果。
    • as_retriever:集成到 RAG 链,检索相关文档。
  4. RAG 链
    • retriever 返回 2 个最相关文档。
    • promptllmgpt-4)生成答案。
  5. 独立性
    • 示例聚焦 NLP 主题,独立于之前上下文。

运行要求

  • Milvus 服务运行(localhost:19530)。
  • nlp_knowledge.txt 存在,编码为 utf-8
  • OpenAI API 密钥有效。

注意事项

  1. API 密钥
    • 使用 .env 文件:
      from dotenv import load_dotenv
      load_dotenv()
      
    • 确保密钥支持 text-embedding-3-smallgpt-4
  2. 依赖
    • 安装:
      pip install --upgrade langchain langchain-milvus langchain-openai pymilvus
      
  3. Milvus 配置
    • 验证服务:
      docker ps  # 检查 Milvus 容器
      
    • 非本地部署:
      connection_args={"uri": "http://your-milvus-host:your-port"}
      
  4. 性能优化
    • 调整 chunk_size(500-1000)、search_kwargs={"k": 3}
    • 添加索引:
      vectorstore = Milvus(..., index_params={"metric_type": "L2", "index_type": "IVF_FLAT"})
      
  5. 错误调试
    • 检查 Milvus 连接:from pymilvus import connections; connections.connect(uri = "http://localhost:19530")
    • 打印 vectorstore._client 验证集合。

常见问题

Q1:as_retrieversimilarity_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 主题查询。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

彬彬侠

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

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

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

打赏作者

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

抵扣说明:

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

余额充值