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

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值影响搜索精度与性能的权衡

相关文章:

  • 01 redis 的环境搭建
  • 第六章 进阶14 项目周报的妙用
  • 湖北理元理律师事务所:债务优化服务的流程透明度建设
  • 基于Matlab实现卫星轨道模拟仿真
  • 抗辐照加固CANFD芯片:以车规级设计提升商业航天系统可靠性
  • MySQL高可用集群
  • 小黑大语言模型应用探索:langchain智能体构造源码demo搭建1(初步流程)
  • QEMU/KVM课程大纲暨学习路线(1)
  • 通义灵码2.5——基于编程智能体开发Wiki多功能搜索引擎
  • 多卡训练核心技术详解
  • 【Go语言】Fyne GUI 库使用指南 (面向有经验开发者)
  • 1,QT的编译教程
  • Go语言结构体:数据组织的艺术
  • STL_stack和queue(deque priority_queue)
  • HTML网页-练习float
  • Java 注解式限流教程(使用 Redis + AOP)
  • 【C++】C++面向对象设计的核心思想之一: 接口抽象、解耦和可扩展性
  • 【仿生机器人软件架构】通过整合认知系统实现自主精神性——认知系统非常具有可执行性
  • 深入解析 Redis Cluster 架构与实现(二)
  • python打卡day40@浙大疏锦行
  • 化妆品网站建设预算/百度问一问客服人工在线咨询
  • 网站建设网络推广首选公司/深圳做网站的公司
  • 织梦网站地图调用全站文章/经典seo伪原创
  • js网站统计/免费的网站推广软件
  • 网站开发建设类合同/恢复原来的百度
  • 网站 建设标准/今日军事新闻最新消息