LangChain实战:MMR和相似性搜索技术应用
导读:在当今大数据和人工智能快速发展的背景下,向量数据库的搜索技术正成为技术人员必须掌握的核心技能。本文将深入探讨LangChain框架与Milvus向量数据库的整合实践,重点对比分析相似度搜索与最大边际相关性(MMR)搜索两种核心技术的实际应用效果。
文章通过构建包含重复记录的真实测试环境,系统验证了MMR算法在处理数据冗余时的独特优势。您将了解到为什么传统相似度搜索在面对重复数据时会产生结果集中化问题,以及MMR搜索如何通过平衡相关性与多样性来解决这一痛点。特别值得关注的是,文章详细解析了lambda_mult参数对搜索结果多样性的影响机制,这一技术细节往往决定了实际项目中搜索系统的用户体验质量。
概述
本文将详细介绍如何使用LangChain框架整合向量数据库Milvus,并实现两种核心搜索技术的对比实战:相似度搜索与最大边际相关性(MMR)搜索。
本文继上一篇文章进一步讲述:LangChain整合Milvus向量数据库实战:数据新增与删除操作-CSDN博客
项目需求分析
核心目标
- 实现LangChain与向量数据库Milvus的深度整合
- 对比测试相似度搜索与MMR搜索的实际效果
- 验证不同搜索算法在处理重复数据时的表现差异
技术要点
通过构建包含重复记录的测试数据集,我们将重点观察向量数据库在不同搜索策略下的去重处理能力,为MMR算法的多样性优势提供实证验证。
环境配置与依赖导入
首先完成必要的依赖库导入和开发环境配置:
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_milvus import Milvus
from langchain_core.documents import Document
嵌入模型初始化
配置文本嵌入模型,选用DashScope提供的第二代通用嵌入模型:
embeddings = DashScopeEmbeddings(model="text-embedding-v2", # 第二代通用文本嵌入模型max_retries=3,dashscope_api_key="sk-xxxxxxxxxxxxxxxxxxxxxxxx"
)
测试数据集构建
为了有效测试MMR算法的多样性搜索能力,我们构建一个包含技术博客文章信息的文档集合。特别注意,通过多次执行数据插入操作,我们将在向量数据库中创建重复记录,以验证不同搜索算法的去重表现:
# 构建测试文档集合
document_1 = Document(page_content="MMR搜索和LangChain整合Milvus实战",metadata={"source": "humaonan.blog.csdn.net/article/details/148318637"},
)document_2 = Document(page_content="Milvus向量Search查询综合案例实战(下)",metadata={"source": "humaonan.blog.csdn.net/article/details/148292710"},
)document_3 = Document(page_content="Milvus向量Search查询综合案例实战(上)",metadata={"source": "humaonan.blog.csdn.net/article/details/148267037"},
)document_4 = Document(page_content="嵌入大模型与LLM技术全面解析与实战指南",metadata={"source": "humaonan.blog.csdn.net/article/details/148198246"},
)documents = [document_1, document_2, document_3, document_4]
向量存储初始化
建立Milvus向量数据库连接并完成文档集合的向量化存储:
vector_store = Milvus.from_documents(documents=documents,embedding=embeddings,collection_name="mmr_test",connection_args={"uri": "http://192.168.19.152:19530"}
)
相似性搜索实现
基础相似性搜索
执行标准的向量相似性搜索,观察当数据库包含重复记录时的返回结果:
# 执行相似性搜索
query = "Milvus如何进行向量Search查询?"
results = vector_store.similarity_search(query, k=2)for doc in results:print(f"内容: {doc.page_content}\n元数据: {doc.metadata}\n")
元数据过滤搜索
结合元数据条件进行混合搜索,实现更精确的检索控制:
# 混合搜索:结合元数据过滤条件
results = vector_store.similarity_search(query,k=2,expr='source == "xdclass.net/doc1"'
)
print(results)
MMR搜索实现
最大边际相关性搜索通过平衡相关性与多样性,能够在包含重复数据的环境中提供更加多元化的搜索结果:
# MMR搜索:优化结果多样性
diverse_results = vector_store.max_marginal_relevance_search(query="如何进行数据集成",k=2, # 返回结果数量fetch_k=10, # 初始候选集大小lambda_mult=0.4, # 多样性权重参数search_params={"metric_type": "IP", # 内积相似度度量"params": {"nprobe": 32} # 搜索精度参数}
)
print(diverse_results)
技术要点说明
MMR算法优势
MMR搜索算法通过引入多样性约束,能够在保证搜索相关性的同时避免结果过度集中,特别适用于处理包含重复或高度相似内容的数据集。
参数调优指导
lambda_mult
参数控制相关性与多样性的平衡,取值范围为0到1fetch_k
参数决定初始候选集的规模,影响最终结果的多样性潜力- 搜索参数中的
nprobe
值影响搜索精度与性能的权衡