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
值影响搜索精度与性能的权衡
相关文章:
LangChain实战:MMR和相似性搜索技术应用
导读:在当今大数据和人工智能快速发展的背景下,向量数据库的搜索技术正成为技术人员必须掌握的核心技能。本文将深入探讨LangChain框架与Milvus向量数据库的整合实践,重点对比分析相似度搜索与最大边际相关性(MMR)搜索…...

第 1 章:学习起步
1. React Native前置知识要求 在开始学习React Native之前,有一些前置知识你需要了解。不过别担心,我会带你逐步掌握这些内容,让你顺利入门。 1.1. JavaScript是必须掌握的 学习React Native,JavaScript是基础。你需要了解Java…...

SQL查询——大厂面试真题
前言 本文总结了SQLite数据库的核心操作要点:1. 基础语法:SQL语句不区分大小写,多语句需用分号分隔,支持多种注释方式2. 表操作:包括创建表(定义主键、非空约束等)、插入/更新/删除数据、添加/…...

Linux-pcie ranges介绍
参考链接:https://elinux.org/Device_Tree_Usage#PCI_Host_Bridge pcie bar高低端BAR起始地址介绍 pcie设备树节点 / {compatible "rockchip,rk3588";interrupt-parent <&gic>;#address-cells <2>;#size-cells <2>;pcie3x4: p…...

⭐ Unity AVProVideo插件自带播放器 脚本重构 实现视频激活重置功能
一、功能概述 本笔记记录直接修改插件自带的场景播放其中 原始的 MediaPlayerUI 脚本,实现激活时自动重置播放器的功能。 我用的插件版本是 AVPro Video - Ultra Edition 2.7.3 修改后的脚本将具备以下特性: 激活 GameObject 时自动重置播放位置到开头 可配置是否在重置后自…...
互联网大厂Java求职面试:云原生微服务架构设计与AI大模型集成实战
互联网大厂Java求职面试:云原生微服务架构设计与AI大模型集成实战 面试场景设定 人物设定: 李明(技术总监):拥有15年分布式系统架构经验,主导过多个亿级用户系统的重构,对云原生和AI融合有深…...

详解K8s API Server 如何处理请求的?
详解K8s API Server 如何处理请求的? Kubernetes(K8s)是一个强大的容器编排系统,而API Server(kube-apiserver) 是它的核心组件之一。 如果把 K8s 比作一个国家,API Server 就是政府机构,所有资源的创建、修改、删除都要经过它审批! 🎯 API Server 的作用 📌 A…...

微调数据处理
1. 数据爬取 我们将爬取的1G文件都保存到all_m_files目录下 查看原始数据文件数量: find /root/all_m_files -type f | wc -l 2. 数据预处理 仅保留UTF-8 格式文件,且所有保留的代码文件长度必须大于20行 import os import pandas as pddef try_read…...
✨1.1.1 按位与运算替代求余运算优化场景
在计算机编程中,使用按位与运算(&)替代求余运算(%)可以提高效率的特殊场景是:当除数是 2 的整数次幂(即 ( b 2^n ),其中 ( n ) 为自然数)时。例如,( b …...

解决开发者技能差距:AI 在提升效率与技能培养中的作用
企业在开发者人才方面正面临双重挑战。一方面,IDC 预测,到2025年,全球全职开发者将短缺400万人;另一方面,一些行业巨头已暂停开发者招聘,转而倚重人工智能(AI)来满足开发需求。这不禁…...

XCTF-web-easyphp
解析 第一个条件( k e y 1 ): i s s e t ( key1):isset( key1):isset(a) && intval(KaTeX parse error: Expected EOF, got & at position 14: a) > 6000000 &̲& strl…...

Transformer 通关秘籍11:Word2Vec 及工具的使用
将文字文本转换为词向量(word embedding)的过程中,一个非常著名的算法模型应该就是 Word2Vec 了。 相信大家或多或少都听说过,本节就来简单介绍一下 Word2Vec 。 什么是 Word2Vec ? Word2Vec 可以非常有效的创建词嵌入向量&…...

【DAY34】GPU训练及类的call方法
内容来自浙大疏锦行python打卡训练营 浙大疏锦行 知识点: CPU性能的查看:看架构代际、核心数、线程数GPU性能的查看:看显存、看级别、看架构代际GPU训练的方法:数据和模型移动到GPU device上类的call方法:为什么定义前…...

Flutte ListView 列表组件
目录 1、垂直列表 1.1 实现用户中心的垂直列表 2、垂直图文列表 2.1 动态配置列表 2.2 for循环生成一个动态列表 2.3 ListView.builder配置列表 列表布局是我们项目开发中最常用的一种布局方式。Flutter中我们可以通过ListView来定义列表项,支持垂直和水平方向展示…...

muduo库的初步认识和基本使用,创建一个简单查询单词服务系统
小编在学习完muduo库之后,觉得对于初学者,muduo库还是有点不好理解,所以在此,小编来告诉大家muduo库的初步认识和基本使用,让初学者也可以更快的上手和使用muduo库。 Muduo由陈硕大佬开发,是⼀个基于 非阻塞…...
电脑如何保养才能用得更久
在这个数字化的时代,电脑已经成为了我们生活和工作中不可或缺的伙伴。无论是处理工作文档、追剧娱乐,还是进行创意设计,电脑都发挥着至关重要的作用。那么,如何让我们的电脑“健康长寿”,陪伴我们更久呢?今…...
Oracle的NVL函数
Oracle的NVL函数是一个常用的空值处理函数,主要用于在查询结果中将NULL值替换为指定的默认值。以下是关于NVL函数的详细说明: 基本语法 NVL(expr1, expr2) 如果expr1为NULL,则返回expr2如果expr1不为NULL,则返回expr1本身 …...

【HTML/CSS面经】
HTML/CSS面经 HTML1. script标签中的async和defer的区别2. H5新特性(1 标签语义化(2 表单功能增强(3 音频和视频标签(4 canvas和svg绘画(5 地理位置获取(6 元素拖动API(7 Web Worker(…...

git查看commit属于那个tag
1. 快速确认commit原始分支及合入tag # git describe 213b4b3bbef2771f7a1b8166f6e6989442ca67c8 查看commit合入tag # git describe 213b4b3bbef2771f7a1b8166f6e6989442ca67c8 --all 查看commit原始分支 2.查看分支与master关系 # git show --all 0.5.67_0006 --stat 以缩…...
如何从ISO镜像直接制作Docker容器基础镜像
引言 这段最值得总结的经验知识,就是如何在ISO镜像的基础上,直接做出docker base image,无需联网! 特别地,对于一些老旧OS系统,都能依此做出docker base image! 例如,某些老旧系统,CentOS 6,…...
网站缓存入门与实战:浏览器与Nginx/Apache服务器端缓存,让网站速度起飞!(2025)
更多服务器知识,尽在hostol.com 嘿,各位站长和网站管理员朋友们!咱们精心打造的网站,内容再好,设计再炫,如果用户打开它的时候,加载速度慢得像“老牛拉破车”,那体验可就大打折扣了…...

mysql-mysql源码本地调试
前言 先进行mysql源码本地编译:mysql源码本地编译 1.本地调试 这里以macbook为例 1.使用vscode打开mysql源码 2.创建basedir目录、数据目录、配置文件目录、配置文件 cd /Users/test/ mkdir mysqldir //创建数据目录和配置目录 cd mysqldir mkdir conf data …...

PCIe— Legacy PCI
Legacy Model 该器件通过将其引脚置位到控制器来生成中断。 在较旧的系统中,这个控制 器通常是Intel 8259 PIC,有15个IRQ输入和一个INTR输出。 然后,PIC将断 言INTR以通知CPU一个或多个中断正在挂起。 一旦CPU检测到INTR的断言…...

PostgreSQL数据库配置SSL操作说明书
背景: 因为postgresql或者mysql目前通过docker安装,只需要输入主机IP、用户名、密码即可访问成功,这样其实是不安全的,可能会通过一些手段获取到用户名密码导致数据被窃取。而ES、kafka等也是通过用户名/密码方式连接,…...
MySQL 的 super_read_only 和 read_only 参数
MySQL 的 super_read_only 和 read_only 参数 一、参数基本概念 1. read_only 参数 作用:控制普通用户是否只能读取数据影响范围:所有非SUPER权限的用户默认值:OFF(可读写) 2. super_read_only 参数 作用…...

低碳理念在道路工程中的应用-预制路面
一、引子 在上一篇文章里,给大家介绍了预制基层的应用,有人提出,既然基层能够预制,那么,道路面层能不能预制呢,有没有相关的研究成果和应用实例呢?答案是肯定的,在本篇文章中&#x…...

12-后端Web实战(登录认证)
在前面的课程中,我们已经实现了部门管理、员工管理的基本功能,但是大家会发现,我们并没有登录,就直接访问到了Tlias智能学习辅助系统的后台。 这是不安全的,所以我们今天的主题就是登录认证。最终要实现的效果是&#…...
TIDB创建索引失败 mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directory.
TIDB创建索引失败:解决“mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directory”问题 在使用 TIDB 数据库时,我们有时会遇到创建索引失败的问题。常见的错误信息为: mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directo…...
Redis 插入中文乱码键
Java 代码: Bean// 静态代理模式: Redis 客户端代理类增强public StringRedisTemplateProxy stringRedisTemplateProxy(RedisKeySerializer redisKeySerializer,StringRedisTemplate stringRedisTemplate,RedissonClient redissonClient) {stringRedisTemplate.setK…...
Mac OS 使用说明
Mac 的启动组合键 了解可通过在启动时按住一个或多个按键来访问的 Mac 功能和工具。 若要使用这些组合键中的任何一个,请在按下电源按钮以开启 Mac 后或在 Mac 开始重新启动后,立即按住相应按键。请一直按住,直至电脑出现对应的行为。 !!!上…...