当前位置: 首页 > ds >正文

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到1
  • fetch_k参数决定初始候选集的规模,影响最终结果的多样性潜力
  • 搜索参数中的nprobe值影响搜索精度与性能的权衡
http://www.xdnf.cn/news/10140.html

相关文章:

  • 【python深度学习】Day 40 训练和测试的规范写法
  • 【C++】C++面向对象设计的核心思想之一: 接口抽象、解耦和可扩展性
  • Python打卡训练营Day40
  • 半导体晶圆制造洁净厂房的微振控制方案-江苏泊苏系统集成有限公司
  • 如何迁移SOS数据库和修改sos服务的端口号
  • php:5.6-apache Docker镜像中安装 gd mysqli 库 【亲测可用】
  • Asp.Net Core FluentValidation校验框架
  • 3. JavaScript基础:自增自减、运算符优先级、条件语句、循环与错误处理
  • 跟我学c++中级篇——动态库的资源处理
  • 2025年渗透测试面试题总结-匿名[校招]红队攻防工程师(题目+回答)
  • 机器人变量类型与配置
  • 引领机器人交互未来!MANUS数据手套解锁精准手部追踪
  • 大数据量下的数据修复与回写Spark on Hive 的大数据量主键冲突排查:COUNT(DISTINCT) 的陷阱
  • Linux入门——入门常用基础指令(3)
  • 课程介绍:《ReactNative基础与实战指南2025》
  • 【前端优化】使用speed-measure-webpack-plugin分析前端运行、打包耗时,优化项目
  • 20250530-C#知识:万物之父Object
  • 云原生应用架构设计原则与落地实践:从理念到方法论
  • 通信算法之280:无人机侦测模块知识框架思维导图
  • JS 事件循环详解
  • 告别重复 - Ansible 配置管理入门与核心价值
  • 在 Linux 上安装 Minikube:轻松搭建本地 Kubernetes 单节点集群
  • 项目管理工具Maven
  • java/mysql/ES下的日期类型分析
  • 【FlashRAG】本地部署与demo运行(二)
  • PHP7内核剖析 学习笔记 第九章 PHP基础语法的实现
  • [特殊字符] xbatis 一款好用 ORM 框架 1.8.8-M2 发布,节省 1/3 代码和时间的框架!!!
  • Drawio编辑器二次开发
  • 【pytorch学习】土堆pytorch学习笔记2
  • 【Linux】权限相关指令