VectorStore 組件深入學習與檢索方法

考慮到目前市面上的向量數據庫眾多,每個數據庫的操作方式也無統一標準,但是仍然存在著一些公共特征,LangChain 基于這些通用的特征封裝了 VectorStore 基類,在這個基類下,可以將方法劃分成 6 種:

  • 相似性搜索
  • 最大邊際相關性搜索
  • 通用搜索
  • 添加刪除精確查找數據
  • 檢索器
  • 創建數據庫

類圖如下:在這里插入圖片描述

1. 帶得分閾值的相似性搜索

LangChain 的相似性搜索中,無論結果多不匹配,只要向量數據庫中存在數據,一定會查找出相應的結果,在 RAG 應用開發中,一般是將高相似文檔插入到 Prompt 中,所以可以考慮添加一個 相似性得分閾值,超過該數值的部分才等同于有相似性。

資料推薦

  • 💡大模型中轉API推薦
  • ?中轉使用教程
  • ?模型優惠查詢

similarity_search_with_relevance_scores() 函數中,可以傳遞 score_threshold 閾值參數,過濾低于該得分的文檔。

例如沒有添加閾值檢索 我養了一只貓,叫笨笨,示例與輸出如下:

import dotenv
from langchain_community.vectorstores import FAISS
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddingsdotenv.load_dotenv()embedding = OpenAIEmbeddings(model="text-embedding-3-small")documents = [Document(page_content="笨笨是一只很喜歡睡覺的貓咪", metadata={"page": 1}),Document(page_content="我喜歡在夜晚聽音樂,這讓我感到放松。", metadata={"page": 2}),Document(page_content="貓咪在窗臺上打盹,看起來非常可愛。", metadata={"page": 3}),Document(page_content="學習新技能是每個人都應該追求的目標。", metadata={"page": 4}),Document(page_content="我最喜歡的食物是意大利面,尤其是番茄醬的那種。", metadata={"page": 5}),Document(page_content="昨晚我做了一個奇怪的夢,夢見自己在太空飛行。", metadata={"page": 6}),Document(page_content="我的手機突然關機了,讓我有些焦慮。", metadata={"page": 7}),Document(page_content="閱讀是我每天都會做的事情,我覺得很充實。", metadata={"page": 8}),Document(page_content="他們一起計劃了一次周末的野餐,希望天氣能好。", metadata={"page": 9}),Document(page_content="我的狗喜歡追逐球,看起來非常開心。", metadata={"page": 10}),
]
db = FAISS.from_documents(documents, embedding)print(db.similarity_search_with_relevance_scores("我養了一只貓,叫笨笨"))# 輸出內容
[(Document(metadata={'page': 1}, page_content='笨笨是一只很喜歡睡覺的貓咪'), 0.4592331743070337), (Document(metadata={'page': 3}, page_content='貓咪在窗臺上打盹,看起來非常可愛。'), 0.22960424668403867), (Document(metadata={'page': 10}, page_content='我的狗喜歡追逐球,看起來非常開心。'), 0.02157827632118159), (Document(metadata={'page': 7}, page_content='我的手機突然關機了,讓我有些焦慮。'), -0.09838758604956)]

添加閾值 0.4,搜索輸出示例如下:

print(db.similarity_search_with_relevance_scores("我養了一只貓,叫笨笨", score_threshold=0.4))# 輸出[(Document(metadata={'page': 1}, page_content='笨笨是一只很喜歡睡覺的貓咪'), 0.45919389344422157)]

對于 score_threshold 的具體數值,要看相似性搜索方法使用的邏輯、計算相似性得分的邏輯進行設置,并沒有統一的標準,并且與向量數據庫的數據大小也存在間接關系,數據集越大,檢索出來的準確度相比少量數據會更準確。

2. as_retriever() 檢索器

LangChain 中,VectorStore 可以通過 as_retriever() 方法轉換成檢索器,在 as_retriever() 中可以傳遞一下參數:

search_type:搜索類型,支持 similarity(基礎相似性搜索)、similarity_score_threshold(攜帶相似性得分+閾值判斷的相似性搜索)、mmr(最大邊際相關性搜索)。
search_kwargs:其他鍵值對搜索參數,類型為字典,例如:k、filter、score_thresholdfetch_k、lambda_mult 等,當搜索類型配置為 similarity_score_threshold 后,必須添加 score_threshold 配置選項,否則會報錯,參數的具體信息要看 search_type 類型對應的函數配合使用。
并且由于檢索器是 Runnable 可運行組件,所以可以使用 Runnable 組件的所有功能(組件替換、參數配置、重試、回退、并行等)。

例如將向量數據庫轉換成 攜帶得分+閾值判斷的相似性搜索,并設置得分閾值為0.5,數據條數為10條,代碼示例如下:

import dotenv
import weaviate
from langchain_community.document_loaders import UnstructuredMarkdownLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_weaviate import WeaviateVectorStore
from weaviate.auth import AuthApiKeydotenv.load_dotenv()# 1.構建加載器與分割器
loader = UnstructuredMarkdownLoader("./項目API文檔.md")
text_splitter = RecursiveCharacterTextSplitter(separators=["\n\n", "\n", "。|!|?", "\.\s|\!\s|\?\s", ";|;\s", ",|,\s", " ", "", ],is_separator_regex=True,chunk_size=500,chunk_overlap=50,add_start_index=True,
)# 2.加載文檔并分割
documents = loader.load()
chunks = text_splitter.split_documents(documents)# 3.將數據存儲到向量數據庫
db = WeaviateVectorStore(client=weaviate.connect_to_wcs(cluster_url="https://eftofnujtxqcsa0sn272jw.c0.us-west3.gcp.weaviate.cloud",auth_credentials=AuthApiKey("21pzYy0orl2dxH9xCoZG1O2b0euDeKJNEbB0"),),index_name="DatasetDemo",text_key="text",embedding=OpenAIEmbeddings(model="text-embedding-3-small"),
)# 4.轉換檢索器
retriever = db.as_retriever(search_type="similarity_score_threshold",search_kwargs={"k": 10, "score_threshold": 0.5},
)# 5.檢索結果
documents = retriever.invoke("關于配置接口的信息有哪些")print(list(document.page_content[:50] for document in documents))
print(len(documents))

輸出內容:

['接口說明:用于更新對應應用的調試長記憶內容,如果應用沒有開啟長記憶功能,則調用接口會發生報錯。\n\n接', '如果接口需要授權,需要在 headers 中添加 Authorization ,并附加 access', '接口示例:\n\njson\n{\n    "code": "success",\n    "data": {', '接口信息:授權+POST:/apps/:app_id/debug\n\n接口參數:\n\n請求參數:\n\nap', '1.2 [todo]更新應用草稿配置信息\n\n接口說明:更新應用的草稿配置信息,涵蓋:模型配置、長記憶', '請求參數:\n\napp_id -> uuid:路由參數,必填,需要獲取的應用 id。\n\n響應參數:\n\n', 'memory_mode -> string:記憶類型,涵蓋長記憶 long_term_memory ', '1.6 [todo]獲取應用調試歷史對話列表\n\n接口說明:用于獲取應用調試歷史對話列表信息,該接口支', 'LLMOps 項目 API 文檔\n\n應用 API 接口統一以 JSON 格式返回,并且包含 3 個字', '響應參數:\n\nsummary -> str:該應用最新調試會話的長記憶內容。\n\n響應示例:\n\njso']
10

資料推薦

  • 💡大模型中轉API推薦
  • ?中轉使用教程
  • ?模型優惠查詢

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83164.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83164.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83164.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【PyQt5】從零開始的PyQt5 - QLabel篇

從零開始的PyQt5 - QLabel篇 引言一、簡述二、例程2.1 顯示到QWidget窗口上2.2 重新設置Label大小和對齊方式2.3 添加內容,設置邊框2.4 顯示富文本 三、參考 引言 QLabel主要用于顯示文本或圖像,不提供用戶交互功能。本文主要簡述PyQt5中的QLabel以及展…

論文略讀:Uncertainty-Aware Graph Structure Learning

WWW 2025 1 intro 傳統GNN忽視了圖結構自身存在的缺陷: 圖結構常常會出現錯誤邊和缺失邊等數據問題,從而限制模型的效果 —>為了解決上述問題,產生了圖結構學習算法(GSL) 目的在于優化結點連接和邊權重來生成新的鄰接矩陣主流…

HCIE-STP復習

文章目錄 STP STP 🏡作者主頁:點擊! 🤖Datacom專欄:點擊! ??創作時間:2025年05月31日13點17STP通過三要素選舉消除環路: 根橋(BID最小,建議設優先級為0&…

leetcode17.電話號碼的字母組合:字符串映射與回溯的巧妙聯動

一、題目深度解析與字符映射邏輯 題目描述 給定一個僅包含數字 2-9 的字符串 digits,返回所有它能表示的字母組合。數字與字母的映射關系如下(與電話按鍵相同): 2: "abc", 3: "def", 4: "ghi", …

【Unity】模型漸變技術 BlendShapes變形

模型fbx拖拽到場景并賦予腳本上SkinnedMeshRenderer參數 按下空格即可演示漸變 可去到3DsMax 或 Blender等軟件制作 這種帶有BlendShapes的模型 (Sphere002)是另一個模型,3DsMax叫變形器。 可參考:【技術美術百人計劃】美術 3.5 BlendShape基礎_嗶哩嗶哩…

CTFHub-RCE 命令注入-無過濾

觀察源代碼 判斷是Windows還是Linux 源代碼中有 ping -c 4 說明是Linux 查看有哪些文件 127.0.0.1|ls 發現除了index.php文件外,還存在一個可疑的文件 打開flag文件 我們嘗試打開這個文件 127.0.0.1|cat 19492844826916.php 可是發現 文本內容顯示不出來&…

DrissionPage ChromiumPage模式:瀏覽器自動化的高效利器

引言 在Python自動化領域,Selenium與Requests是開發者耳熟能詳的工具,但二者在功能側重上存在明顯割裂。DrissionPage的出現打破了這一局面,其創新的ChromiumPage模式通過整合瀏覽器自動化與HTTP請求能力,為網頁操作提供了全新解…

uniapp分包配置,uniapp設置subPackages

在使用uniapp開發過程中,由于項目比較大,無法直接上傳,需要分包后才可以上傳。 步驟: 1、在pages同級目錄下創建分包的目錄(pages_second),把要分包的文件放到該目錄下; 2、在pag…

零基礎一站式端游內存輔助編寫教程(無密)

目錄如下: 基礎理論篇 內存基礎概念(如內存地址、數據類型、讀寫原理)端游內存機制簡介(游戲進程與內存分配) 工具與環境搭建 常用內存分析工具介紹(如 Cheat Engine、x64dbg 等)開發環境配…

汽車售后診斷數據流詳細分析

一、引言 隨著汽車電子化程度的不斷提升,電控系統已成為車輛運行的核心支撐。據羅蘭貝格 2025 年智能汽車白皮書數據顯示,中央計算 區域控制架構(Zonal EEA)的普及率已突破 58%,推動整車線束成本下降 41%12。與此同時…

智能守護電網安全:探秘輸電線路測溫裝置的科技力量

在現代電力網絡的龐大版圖中,輸電線路如同一條條 “電力血管”,日夜不息地輸送著能量。然而,隨著電網負荷不斷增加,長期暴露在戶外的線路,其線夾與導線在電流熱效應影響下,極易出現溫度異常。每年因線路過熱…

設計模式——單例設計模式(創建型)

摘要 本文詳細介紹了單例設計模式,包括其定義、結構、實現方法及適用場景。單例模式是一種創建型設計模式,確保一個類只有一個實例并提供全局訪問點。其要點包括唯一性、私有構造函數、全局訪問點和線程安全。文章還展示了單例設計模式的類圖和時序圖&a…

Lyra學習筆記 Experience流程梳理

目錄 前言1 創建2 加載3 Deactivate4 總結與圖示 前言 這篇主要將視角放在Experience的流程,所以不會涉及一些更深的東西 之后ULyraExperienceManagerComponent簡稱為EMC 1 創建 完事開頭難,首先找到了管理Experience的組件,那么它的初始化…

Ubuntu下編譯mininim游戲全攻略

目錄 一、安裝mininim 軟件所依賴的庫(重點是allegro游戲引擎庫)二、編譯mininim 軟件三、將mininim打包給另一個Ubuntu系統使用四、安卓手機運行mininim 一、安裝mininim 軟件所依賴的庫(重點是allegro游戲引擎庫) 1. 用apt-get…

SMT貼片制造流程關鍵環節解析

內容概要 現代電子制造領域中,SMT(表面貼裝技術)作為核心工藝,其流程的精密性與穩定性直接決定產品性能與生產良率。本文以SMT貼片制造流程為主線,系統解析焊膏印刷、元器件貼裝、回流焊接三大核心工藝的技術要點。其…

HTTP/2與HTTP/3特性詳解:為你的Nginx/Apache服務器開啟下一代Web協議

更多服務器知識,盡在hostol.com 嘿,各位站長和服務器管理員朋友們!咱們天天跟網站打交道,都希望自己的網站能像火箭一樣快,用戶體驗“嗖嗖”的。但你知道嗎?除了服務器硬件配置、代碼優化、CDN加速這些“常…

pytest 常見問題解答 (FAQ)

pytest 常見問題解答 (FAQ) 1. 基礎問題 Q1: 如何讓 pytest 發現我的測試文件? 測試文件命名需符合 test_*.py 或 *_test.py 模式測試函數/方法需以 test_ 開頭測試類需以 Test 開頭(且不能有__init__方法) Q2: 如何運行特定測試? pytest path/to/t…

【前端】SPA v.s. MPA

鏈接:頁面結構 誤區 頁面結構管理有兩種常見方式:路由形式 和 組件形式。路由形式 對應MPA ,組件形式對應SPA ? 誤區 1:路由形式 MPA? 路由是 SPA 和 MPA 共有的概念,區別在于路由映射的對象: MPA 的…

Matlab數據類型

本篇介紹我在南農matlab課程上的所學,我對老師ppt上的內容重新進行了整理并且給出代碼案例。主要內容在矩陣。如果真的想學matlab,我不認為有任何文檔能夠超過官方文檔,請移步至官網,本篇說實話只是寫出來給自己和學弟學妹作期末復…

代碼隨想錄算法訓練營 Day58 圖論Ⅷ 拓撲排序 Dijkstra

圖論 題目 117. 軟件構建 拓撲排序:給出一個有向圖,把這個有向圖轉成線性的排序就叫拓撲排序。 當然拓撲排序也要檢測這個有向圖是否有環,即存在循環依賴的情況,因為這種情況是不能做線性排序的。所以拓撲排序也是圖論中判斷有向…