【大模型應用開發】向量數據庫向量檢索方法存在問題及優化

一、檢索結果重復

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
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84943.shtml
英文地址,請注明出處:http://en.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…