【大模型应用开发】向量数据库向量检索方法存在问题及优化

一、检索结果重复

1. 问题分析

在构建向量数据库时,对文档分割会存在重复块(chunk_overlap:指两个块之间共享的字符数量,用于保持上下文的连贯性,避免分割丢失上下文信息),如下图所示:
在这里插入图片描述
因此,在进行向量检索是容易出现检索到重复结果的情况,如下:

docs[0]
page_content='第⼀回:Matplotlib 初相识\n⼀、认识matplotlib\nMatplotlib 是⼀个 Python 2D 绘图库,能够以多种硬拷⻉格式和跨平台的交互式环境⽣成出版物质量的图形,⽤来绘制各种静态,动态,\n交互式的图表。\nMatplotlib 可⽤于 Python 脚本, Python 和 IPython Shell 、 Jupyter notebook , Web 应⽤程序服务器和各种图形⽤户界⾯⼯具包等。\nMatplotlib 是 Python 数据可视化库中的泰⽃,它已经成为 python 中公认的数据可视化⼯具,我们所熟知的 pandas 和 seaborn 的绘图接⼝\n其实也是基于 matplotlib 所作的⾼级封装。\n为了对matplotlib 有更好的理解,让我们从⼀些最基本的概念开始认识它,再逐渐过渡到⼀些⾼级技巧中。\n⼆、⼀个最简单的绘图例⼦\nMatplotlib 的图像是画在 figure (如 windows , jupyter 窗体)上的,每⼀个 figure ⼜包含了⼀个或多个 axes (⼀个可以指定坐标系的⼦区\n域)。最简单的创建 figure 以及 axes 的⽅式是通过 pyplot.subplots命令,创建 axes 以后,可以使⽤ Axes.plot绘制最简易的折线图。\nimport matplotlib.pyplot as plt\nimport matplotlib as mpl\nimport numpy as np\nfig, ax = plt.subplots()  # 创建⼀个包含⼀个 axes 的 figure\nax.plot([1, 2, 3, 4], [1, 4, 2, 3]);  # 绘制图像\nTrick: 在jupyter notebook 中使⽤ matplotlib 时会发现,代码运⾏后⾃动打印出类似 <matplotlib.lines.Line2D at 0x23155916dc0>\n这样⼀段话,这是因为 matplotlib 的绘图代码默认打印出最后⼀个对象。如果不想显示这句话,有以下三种⽅法,在本章节的代码示例\n中你能找到这三种⽅法的使⽤。\n\x00. 在代码块最后加⼀个分号 ;\n\x00. 在代码块最后加⼀句 plt.show()\n\x00. 在绘图时将绘图对象显式赋值给⼀个变量,如将 plt.plot([1, 2, 3, 4]) 改成 line =plt.plot([1, 2, 3, 4])\n和MATLAB 命令类似,你还可以通过⼀种更简单的⽅式绘制图像, matplotlib.pyplot⽅法能够直接在当前 axes 上绘制图像,如果⽤户\n未指定axes , matplotlib 会帮你⾃动创建⼀个。所以上⾯的例⼦也可以简化为以下这⼀⾏代码。\nline =plt.plot([1, 2, 3, 4], [1, 4, 2, 3]) \n三、Figure 的组成\n现在我们来深⼊看⼀下 figure 的组成。通过⼀张 figure 解剖图,我们可以看到⼀个完整的 matplotlib 图像通常会包括以下四个层级,这些\n层级也被称为容器( container ),下⼀节会详细介绍。在 matplotlib 的世界中,我们将通过各种命令⽅法来操纵图像中的每⼀个部分,\n从⽽达到数据可视化的最终效果,⼀副完整的图像实际上是各类⼦元素的集合。\nFigure:顶层级,⽤来容纳所有绘图元素' metadata={'source': 'docs/matplotlib/第一回:Matplotlib初相识.pdf', 'page': 0}
docs[1]
page_content='第⼀回:Matplotlib 初相识\n⼀、认识matplotlib\nMatplotlib 是⼀个 Python 2D 绘图库,能够以多种硬拷⻉格式和跨平台的交互式环境⽣成出版物质量的图形,⽤来绘制各种静态,动态,\n交互式的图表。\nMatplotlib 可⽤于 Python 脚本, Python 和 IPython Shell 、 Jupyter notebook , Web 应⽤程序服务器和各种图形⽤户界⾯⼯具包等。\nMatplotlib 是 Python 数据可视化库中的泰⽃,它已经成为 python 中公认的数据可视化⼯具,我们所熟知的 pandas 和 seaborn 的绘图接⼝\n其实也是基于 matplotlib 所作的⾼级封装。\n为了对matplotlib 有更好的理解,让我们从⼀些最基本的概念开始认识它,再逐渐过渡到⼀些⾼级技巧中。\n⼆、⼀个最简单的绘图例⼦\nMatplotlib 的图像是画在 figure (如 windows , jupyter 窗体)上的,每⼀个 figure ⼜包含了⼀个或多个 axes (⼀个可以指定坐标系的⼦区\n域)。最简单的创建 figure 以及 axes 的⽅式是通过 pyplot.subplots命令,创建 axes 以后,可以使⽤ Axes.plot绘制最简易的折线图。\nimport matplotlib.pyplot as plt\nimport matplotlib as mpl\nimport numpy as np\nfig, ax = plt.subplots()  # 创建⼀个包含⼀个 axes 的 figure\nax.plot([1, 2, 3, 4], [1, 4, 2, 3]);  # 绘制图像\nTrick: 在jupyter notebook 中使⽤ matplotlib 时会发现,代码运⾏后⾃动打印出类似 <matplotlib.lines.Line2D at 0x23155916dc0>\n这样⼀段话,这是因为 matplotlib 的绘图代码默认打印出最后⼀个对象。如果不想显示这句话,有以下三种⽅法,在本章节的代码示例\n中你能找到这三种⽅法的使⽤。\n\x00. 在代码块最后加⼀个分号 ;\n\x00. 在代码块最后加⼀句 plt.show()\n\x00. 在绘图时将绘图对象显式赋值给⼀个变量,如将 plt.plot([1, 2, 3, 4]) 改成 line =plt.plot([1, 2, 3, 4])\n和MATLAB 命令类似,你还可以通过⼀种更简单的⽅式绘制图像, matplotlib.pyplot⽅法能够直接在当前 axes 上绘制图像,如果⽤户\n未指定axes , matplotlib 会帮你⾃动创建⼀个。所以上⾯的例⼦也可以简化为以下这⼀⾏代码。\nline =plt.plot([1, 2, 3, 4], [1, 4, 2, 3]) \n三、Figure 的组成\n现在我们来深⼊看⼀下 figure 的组成。通过⼀张 figure 解剖图,我们可以看到⼀个完整的 matplotlib 图像通常会包括以下四个层级,这些\n层级也被称为容器( container ),下⼀节会详细介绍。在 matplotlib 的世界中,我们将通过各种命令⽅法来操纵图像中的每⼀个部分,\n从⽽达到数据可视化的最终效果,⼀副完整的图像实际上是各类⼦元素的集合。\nFigure:顶层级,⽤来容纳所有绘图元素' metadata={'source': 'docs/matplotlib/第一回:Matplotlib初相识.pdf', 'page': 0}

2.解决方法

最大边际相关性((MMR,Maximal Marginal Relevance):基本思想是同时考量查询与文档的相关度,以及文档之间的相似度。它把搜索结果中相似度很高的文档做了过滤,所以它保留了结果的相关性又同时兼顾了结果的多样性。

smalldb_chinese.max_marginal_relevance_search(question_chinese,k=2, fetch_k=3)
#k=3 ,获取 3 个文档,k=2 表示返回最不同的 2 个文档。

二、检索错误答案

1.问题分析

当询问关于文档中某一讲的问题,但得到的结果中也包括了来自其他讲的结果,如下所示:

# 提问:
question_chinese = "他们在第二讲中对Figure说了些什么?"
docs_chinese = vectordb_chinese.similarity_search(question_chinese,k=5)
for doc_chinese in docs_chinese:print(doc_chinese.metadata)# 检索结果:
{'source': 'docs/matplotlib/第一回:Matplotlib初相识.pdf', 'page': 0}
{'source': 'docs/matplotlib/第一回:Matplotlib初相识.pdf', 'page': 0}
{'source': 'docs/matplotlib/第二回:艺术画笔见乾坤.pdf', 'page': 9}
{'source': 'docs/matplotlib/第二回:艺术画笔见乾坤.pdf', 'page': 10}
{'source': 'docs/matplotlib/第一回:Matplotlib初相识.pdf', 'page': 1}

2.解决办法

(1)使用元数据进行过滤

#提问:
question_chinese = "他们在第二讲中对Figure说了些什么?"
docs_chinese = vectordb_chinese.similarity_search(question_chinese,k=3,filter={"source":"docs/matplotlib/第二回:艺术画笔见乾坤.pdf"}
)
for d in docs_chinese:print(d.metadata)#检索结果:
{'source': 'docs/matplotlib/第二回:艺术画笔见乾坤.pdf', 'page': 9}
{'source': 'docs/matplotlib/第二回:艺术画笔见乾坤.pdf', 'page': 10}
{'source': 'docs/matplotlib/第二回:艺术画笔见乾坤.pdf', 'page': 0}

(2)LLM辅助检索

LangChain提供了SelfQueryRetriever模块,它可以通过语言模型从问题语句中分析出:
a:向量搜索的查询字符串(search term)
b:过滤文档的元数据条件(Filter)

# 提问:
# 使用 SelfQueryRetriever 构建一个支持自然语言查询的向量检索器
retriever_chinese = SelfQueryRetriever.from_llm(llm,  # 语言模型,用于将用户的自然语言查询转换为结构化检索指令(如过滤条件、关键词等)vectordb_chinese,  # 向量数据库,用于实际的向量相似度检索(比如 Chroma、FAISS、Milvus 等)document_content_description_chinese,  # 字符串,描述文档的主要内容类型,例如“这是关于中国古代文学的文档”metadata_field_info_chinese,  # 元信息字段描述列表,定义哪些元数据字段可以被过滤,并提供字段的说明。例如: # [AttributeInfo(name="作者", description="文章的作者", type="string"), ...]verbose=True  # 是否打印详细的解释和调试信息(例如构造出的查询表达式等),便于理解 LLM 是如何生成查询的
)
question_chinese = "他们在第二讲中对Figure做了些什么?"
docs_chinese = retriever_chinese.get_relevant_documents(question_chinese)
for d in docs_chinese:print(d.metadata)#检索结果:
{'source': 'docs/matplotlib/第二回:艺术画笔见乾坤.pdf', 'page': 9}
{'source': 'docs/matplotlib/第二回:艺术画笔见乾坤.pdf', 'page': 10}
{'source': 'docs/matplotlib/第二回:艺术画笔见乾坤.pdf', 'page': 0}
{'source': 'docs/matplotlib/第二回:艺术画笔见乾坤.pdf', 'page': 6}

三、检索结果冗余

1.问题分析

在使用向量检索获取相关文档时,直接返回整个文档片段可能带来资源浪费,因为实际相关的只是文档的一小部分。为改进这一点,LangChain提供了一种“压缩”检索机制。其工作原理是,先使用标准向量检索获得候选文档,然后基于查询语句的语义,使用语言模型压缩这些文档,只保留与问题相关的部分。例如,对“蘑菇的营养价值”这个查询,检索可能返回整篇有关蘑菇的长文档。经压缩后,只提取文档中与“营养价值”相关的句子。

2.解决办法

#提问:
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractordef pretty_print_docs(docs):print(f"\n{'-' * 100}\n".join([f"Document {i+1}:\n\n" + d.page_content for i, d in enumerate(docs)]))llm = OpenAI(temperature=0)
compressor = LLMChainExtractor.from_llm(llm)  # 压缩器compression_retriever_chinese = ContextualCompressionRetriever(base_compressor=compressor,base_retriever=vectordb_chinese.as_retriever()
)
# 对源文档进行压缩question_chinese = "Matplotlib是什么?"
compressed_docs_chinese = compression_retriever_chinese.get_relevant_documents(question_chinese)
pretty_print_docs(compressed_docs_chinese)#输出结果:
Document 1:Matplotlib 是⼀个 Python 2D 绘图库,能够以多种硬拷⻉格式和跨平台的交互式环境⽣成出版物质量的图形,⽤来绘制各种静态,动态,交互式的图表。
----------------------------------------------------------------------------------------------------
Document 2:Matplotlib 是⼀个 Python 2D 绘图库,能够以多种硬拷⻉格式和跨平台的交互式环境⽣成出版物质量的图形,⽤来绘制各种静态,动态,交互式的图表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/84943.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL常用函数详解之数值函数

MySQL常用函数详解之数值函数 一、数值函数概述1.1 数值函数的作用1.2 数值函数分类 二、算术运算函数2.1 加法运算&#xff08;&#xff09;2.2 减法运算&#xff08;-&#xff09;2.3 乘法运算&#xff08;*&#xff09;2.4 除法运算&#xff08;/ 或 DIV&#xff09;2.5 取模…

13、Redis进阶二之Redis数据安全性分析

⼀ 、Redis性能压测脚本介绍 Redis的所有数据是保存在内存当中的&#xff0c; 得益于内存⾼效的读写性能&#xff0c; Redis的性能是⾮常强悍的 。但 是&#xff0c;内存的缺点是断电即丢失&#xff0c;所以 &#xff0c;在实际项⽬中&#xff0c; Redis—旦需要保存—些重要的…

【系统分析师】2011年真题:综合知识-答案及详解

文章目录 【第1题】【第2~3题】【第4~5题】【第6题】【第7~8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19~20题】【第21题】【第22题】【第23题】【第24~25题】【第26题】【第27题】【第28题】【第29题】【…

FastAPI-MCP构建自定义MCP工具实操指南

一、简介 • FastAPI-MCP是一个基于python FastAPI框架开发的开源项目&#xff0c;可以自动识别并暴露FastAPI接口为MCP工具 • 拥有FastAPI框架的所有优点&#xff0c;如异步高并发、独立远程部署、OpenAPI文档 • 提供SSE、mcp-remote接入方式&#xff0c;支持设置授权访问…

LLMs之Memory:《LLMs Do Not Have Human-Like Working Memory》翻译与解读

LLMs之Memory&#xff1a;《LLMs Do Not Have Human-Like Working Memory》翻译与解读 导读&#xff1a;该论文通过三个精心设计的实验&#xff0c;证明了当前的大型语言模型&#xff08;LLMs&#xff09;缺乏类似人类的工作记忆。实验结果表明&#xff0c;LLMs无法在没有明确外…

Node.js验证码:从生成到验证的趣味之旅

文章目录 Node.js验证码&#xff1a;从生成到验证的趣味之旅&#x1f4dc; 引言&#xff1a;为什么需要验证码&#xff1f;1. 验证码的基本原理 &#x1f9e0;验证码工作流程示意图 2. 技术栈准备 &#x1f6e0;️3. 验证码生成详解 &#x1f3a8;3.1 生成SVG验证码3.2 转换为P…

芯科科技携最新Matter演示和参考应用精彩亮相Matter开放日和开发者大会

全面展示赋能Matter设备实现跨协议和跨海内外生态的技术能力 作为Matter标准创始厂商之一和其解决方案的领先供应商&#xff0c;Silicon Labs&#xff08;亦称“芯科科技”&#xff09;于6月12至13日参加由连接标准联盟中国成员组&#xff08;CMGC&#xff09;主办的Matter年度…

AndroidStudio下载的SDK没有tool目录,或者想要使用uiautomatorviewer工具

1.如果没有tool目录可以使用下面的地址进行下载 https://dl.google.com/android/repository/tools_r25.2.5-windows.zip 2.并且把下载的文件解压到放在AndroidStudio的目录中 3.如果使用uiautomatorviewer.bat出现下面的错误 Unable to connect to adb.Check if adb is instal…

FastJSON等工具序列化特殊字符时会加转义字符\

在Java中JSON数据格式用String接收时&#xff0c;此时在FastJSON层面看来该JSON只是普通字符串&#xff0c;所以对原字符串序列化会得到转义字符\ 得到转义后字符串&#xff0c;再反序列化转义后字符串会得到原字符串 String json"{\"name\": \"张三\&quo…

数据结构 学习 队列 2025年6月14日 11点22分

循环队列 循环队列是一种线性数据结构&#xff0c;它遵循FIFO&#xff08;先进先出&#xff09;原则&#xff0c;但与普通队列不同的是&#xff0c;循环队列的最后一个元素连接回第一个元素&#xff0c;形成一个环形结构。这种设计有效解决了普通队列的"假溢出"问题&…

打造丝滑滚动体验:Scroll-driven Animations 正式上线!

&#x1f300; 打造丝滑滚动体验&#xff1a;Scroll-driven Animations 正式上线&#xff01; &#x1f6a8; 告别 JS 手动监听滚动条&#xff0c;CSS 新能力让你用两行代码实现高级滚动动效。 &#x1f50d; 什么是 Scroll-driven Animations&#xff1f; Scroll-driven anim…

知识体系_研究模型_价格敏感度测试模型(PSM)

1 概述 价格敏感度测试模型(Price Sensitivity Measurement,PSM) ,通过调研潜在用户对于不同价格的满意或接受程度,从而制定出合适的产品价格。 价格敏感度PSM模型的分析一般分为以下几个步骤: (1)确定多个价格 (2)通过一定的方式(通常是问卷)收集目标客户对不同价…

C++11函数封装器 std::function

✅ 1. 什么是 std::function std::function 是 C11 引入的标准库工具&#xff0c;是一个通用的函数封装器&#xff0c;可以包装以下任意可调用对象&#xff1a; 普通函数Lambda 表达式函数指针成员函数指针函数对象&#xff08;也叫仿函数&#xff0c;定义了 operator() 的类…

centos系统docker配置`milvus-standalone`教程

本人使用的是京东云服务器docker配置milvus 参考教程&#xff1a;https://blog.csdn.net/withme977/article/details/137270087 需要注意&#xff1a;虚拟机安装pymilvus和docker安装milvus版本需要对应&#xff0c;否则会出现connection失败问题 查看虚拟机pymilvus版本&…

AI for 数据分析:技术演进与应用实践

一、AI 数据分析的核心定义与技术演进 概念延伸&#xff1a;从传统分析到智能分析 传统数据分析工作&#xff0c;主要依赖人工使用 Excel、SPSS 等统计工具进行建模与分析。这种方式不仅效率较低&#xff0c;而且对专业人员的依赖度极高。而 AI 驱动的数据分析则借助机器学习…

stm32 f103c8t6仿真 串口收发测试

C8T6串口概述 STM32F103C8T6微控制器包含3个串口模块&#xff1a; USART1 (高级串口) USART2 USART3 (部分型号可能标记为UART3) 引脚分布图 USART1 (串口1) 基本特性 类型&#xff1a;全功能USART(通用同步异步收发器) 通信模式&#xff1a; 全双工异步通信 单线半…

语言特性适用的场景:卫星、火箭控制系统用什么开发语言?

核心飞行控制系统开发语言 卫星、火箭及相关航天系统的软件开发对可靠性、实时性、安全性有极高要求&#xff0c;因此语言选择需严格匹配这些需求。以下是航天领域常用的编程语言及其应用场景分析&#xff1a; 一、核心飞行控制与嵌入式系统&#xff1a;C、C、Ada 航天器的核…

AI for Science:智能科技如何重塑科学研究

AI与科学研究的邂逅 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;作为一门致力于模拟人类智能的交叉学科&#xff0c;近年来已经从实验室走向现实世界的各个角落&#xff0c;而科学研究领域正是其最具变革潜力的舞台之一。AI的核心在于通过算法…

项目三 - 任务7:开发名片管理系统

在本次项目三的任务7中&#xff0c;我们成功开发了一个功能全面的名片管理系统。该系统采用Java语言&#xff0c;基于MVC&#xff08;模型-视图-控制器&#xff09;架构模式&#xff0c;实现了用户登录、名片的增删改查等核心功能。通过设计Card类来封装名片信息&#xff0c;Ca…