langchain從入門到精通(三十二)——RAG優化策略(八)自查詢檢索器實現動態數據過濾

1. 查詢構建與自查詢檢索器

在 RAG 應用開發中,檢索外部數據時,前面的優化案例中,無論是生成的 子查詢、問題分解、生成假設性文檔,最后在執行檢索的時候使用的都是固定的篩選條件(沒有附加過濾的相似性搜索)
但是在某些情況下,用戶發起的原始提問其實隱式攜帶了 篩選條件,例如提問:
請幫我整理下關于2023年全年關于AI的新聞匯總。
在這段 原始提問 中,如果執行相應的向量數據庫相似性搜索,其實是附加了 篩選條件 的,即 year=2023,但是在普通的相似性搜索中,是不會考慮 2023 年這個條件的(因為沒有添加元數據過濾器,2022年和2023年數據在高維空間其實很接近),存在很大概率會將其他年份的數據也檢索出來。
那么有沒有一種策略,能根據用戶傳遞的 原始問題 構建相應的 元數據過濾器 呢?這樣在搜索的時候帶上對應的元數據過濾器,不僅可以壓縮檢索范圍,還能提升搜索的準確性。這個思想其實就是 查詢構建 或者稱為 自查詢。
并且除了 向量數據庫,類比映射到 關系型數據庫、圖數據庫 也是同樣的操作技巧,即:

  1. 關系型數據庫自查詢:使用 LLM 將自然語言轉換成 SQL 過濾語句。
  2. 圖數據庫自查詢:使用 LLM 將自然語言轉換成圖查詢語句。
  3. 向量數據庫:使用 LLM 將自然語言轉換成元數據過濾器/向量檢索器。
    這就是 查詢構建 概念的由來,但是并不是所有的數據都支持 查詢構建 的,需要看存儲的 Document 是否存在元數據,對應的數據庫類型是否支持篩選,在 LangChain 中是否針對性做了封裝(如果沒封裝,自行實現難度比較大)。
    在這里插入圖片描述
    將 查詢構建 這個步驟單獨拎出來,它的運行流程其實很簡單,但是底層的操作非常麻煩,如下:
    在這里插入圖片描述

在 LangChain 中,針對一些高頻使用的向量數據庫封裝了 自查詢檢索器 的相關支持——SelfQueryRetriever,無需自行構建轉換語句與解析,使用該類進行二次包裝即可。
所有支持 自查詢檢索器 的向量數據庫都在這個鏈接內部可以看到使用示例:https://imooc-langchain.shortvar.com/docs/integrations/retrievers/self_query/(但是因為向量數據庫的更新頻率過快,LangChain 封裝的部分向量數據庫已經更新,但是 SelfQueryRetriever 內部的邏輯還未更新)。

SelfQueryRetriever 使用起來也非常簡單,以 Pinecone 向量數據庫為例,首先安裝對應的依賴:

pip install --upgrade --quiet lark

定義好 帶元數據的文檔、支持過濾的元數據、包裝的向量數據庫、文檔內容的描述 等信息,即可進行快速包裝,示例代碼如下:

import dotenv
from langchain.chains.query_constructor.base import AttributeInfo
from langchain.retrievers import SelfQueryRetriever
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_pinecone import PineconeVectorStoredotenv.load_dotenv()# 1.構建文檔列表并上傳到數據庫
documents = [Document(page_content="肖申克的救贖",metadata={"year": 1994, "rating": 9.7, "director": "弗蘭克·德拉邦特"},),Document(page_content="霸王別姬",metadata={"year": 1993, "rating": 9.6, "director": "陳凱歌"},),Document(page_content="阿甘正傳",metadata={"year": 1994, "rating": 9.5, "director": "羅伯特·澤米吉斯"},),Document(page_content="泰坦尼克號",metadat={"year": 1997, "rating": 9.5, "director": "詹姆斯·卡梅隆"},),Document(page_content="千與千尋",metadat={"year": 2001, "rating": 9.4, "director": "宮崎駿"},),Document(page_content="星際穿越",metadat={"year": 2014, "rating": 9.4, "director": "克里斯托弗·諾蘭"},),Document(page_content="忠犬八公的故事",metadat={"year": 2009, "rating": 9.4, "director": "萊塞·霍爾斯道姆"},),Document(page_content="三傻大鬧寶萊塢",metadat={"year": 2009, "rating": 9.2, "director": "拉庫馬·希拉尼"},),Document(page_content="瘋狂動物城",metadat={"year": 2016, "rating": 9.2, "director": "拜倫·霍華德"},),Document(page_content="無間道",metadat={"year": 2002, "rating": 9.3, "director": "劉偉強"},),
]
db = PineconeVectorStore(index_name="llmops",embedding=OpenAIEmbeddings(model="text-embedding-3-small"),namespace="dataset",text_key="text"
)
db.add_documents(documents)# 2.創建自查詢元數據
metadata_field_info = [AttributeInfo(name="year",description="電影的發布年份",type="integer",),AttributeInfo(name="rating",description="電影的評分",type="float",),AttributeInfo(name="director",description="電影的導演",type="string",),
]# 3.創建子查詢檢索
self_query_retriever = SelfQueryRetriever.from_llm(llm=ChatOpenAI(model="gpt-3.5-turbo-16k", temperature=0),vectorstore=db,document_contents="電影的名字",metadata_field_info=metadata_field_info,enable_limit=True,
)# 4.檢索示例
search_docs = self_query_retriever.invoke("查找下評分高于9.5分的電影")print(search_docs)
print(len(search_docs))
輸出內容:
[Document(metadata={'director': '陳凱歌', 'rating': 9.6, 'year': 1993.0}, page_content='霸王別姬'), Document(metadata={'director': '弗蘭克·德拉邦特', 'rating': 9.7, 'year': 1994.0}, page_content='肖申克的救贖')]

自查詢檢索器 對于面向特定領域的專用 Agent 效果相對較好(對通用 Agent 來說效果較差),因為這些領域的文檔一般相對來說比較規范,例如:財報、新聞、自媒體文章、教培等行業,這些行業的數據都能剝離出通用支持過濾與篩選的 元數據/字段,使用自查詢檢索器能抽象出對應的檢索字段信息。

2 . 自查詢檢索器的運行邏輯與衍生

在 LangChain 中,涉及調用第三方服務或者調用本地自定義工具的,例如 自查詢檢索器、檢索器邏輯路由 等,在底層都是通過一個預設好的 Prompt 生成符合相應規則的內容(字符串、JSON),然后通過 解析器 解析生成的內容,并將解析出來的結構化內容調用特定的接口、服務亦或者本地函數實現。
例如在 自查詢檢索器 底層,首先使用 FewShotPromptTemplate+函數回調/結構化輸出 生成特定規則的 查詢語句,這段提示代碼如下:

DEFAULT_SCHEMA = """\
<< Structured Request Schema >>
When responding use a markdown code snippet with a JSON object formatted in the following schema:\```json
{{{{"query": string \\ text string to compare to document contents"filter": string \\ logical condition statement for filtering documents
}}}}
\```The query string should contain only text that is expected to match the contents of documents. Any conditions in the filter should not be mentioned in the query as well.A logical condition statement is composed of one or more comparison and logical operation statements.A comparison statement takes the form: `comp(attr, val)`:
- `comp` ({allowed_comparators}): comparator
- `attr` (string):  name of attribute to apply the comparison to
- `val` (string): is the comparison valueA logical operation statement takes the form `op(statement1, statement2, ...)`:
- `op` ({allowed_operators}): logical operator
- `statement1`, `statement2`, ... (comparison statements or logical operation statements): one or more statements to apply the operation toMake sure that you only use the comparators and logical operators listed above and no others.
Make sure that filters only refer to attributes that exist in the data source.
Make sure that filters only use the attributed names with its function names if there are functions applied on them.
Make sure that filters only use format `YYYY-MM-DD` when handling date data typed values.
Make sure that filters take into account the descriptions of attributes and only make comparisons that are feasible given the type of data being stored.
Make sure that filters are only used as needed. If there are no filters that should be applied return "NO_FILTER" for the filter value.\
"""

原始問題如下:

查找下評分高于9.5分的電影

生成的查詢語句原文如下:

{"query": "","filter": "gt(\"rating\", 9.5)"
}

接下來使用特定的轉換器,將生成的查詢語句轉換成適配向量數據庫的 過濾器,并在檢索時傳遞該參數,從而完成自查詢構建的全過程,不同的向量數據庫對應的轉換器差異也非常大。
這個思想其實已經涉及到將 LLM 與企業自有應用/API進行快速對接智能化,即如何將 LLM 生成的 文字信息 對接到當前業務系統中。
例如企業自有一套 PPT 生成 API 接口,通過傳遞設定的參數即可生成對應的 PPT,假設有這樣一段參數規則:

[{"page": 1, # PPT的頁數"background": {"size": [400, 600],  # 背景圖片大小"position": [0, 0],  # 背景圖片位置"image_url": "xxx",  # 圖片URL...},"objects": [{"type": "title",  # 對象類型"attribute": {"content": "求知若渴,虛心若愚",  # 標題內容"size": 20,  # 標題字體大小"color": "#000000",  # 標題顏色"position": [240, 128],  # 標題位置"font": "微軟雅黑",  # 標題字體...}},...],...}
]

如果想通過 LLM 構建一個 PPT 自動生成工具,只需要設定好 prompt,讓 LLM 按照特定的規則生成一段用于描述 PPT信息的參數,接下來解析這段參數,并將相應的參數傳遞給現成沒有智能的 PPT 生成工具,即可快速實現 自然語言->PPT 的過程。
當然在這類應用的開發過程中,需要考慮的其他因素其實還非常多,例如:

  1. 大語言模型上下文長度:涉及到的生成內容過多,沒法一次性生成,需要確保多次生成參數之間的連貫性。
  2. prompt描述:對于一些復雜的應用,原有參數可能非常復雜,需要通過合適的方式將參數描述添加到 prompt 中。
  3. 生成內容To調用參數:對于生成的內容,有些是字符串的形式(函數回調生成的參數數量是有限制的),如何通過合適方式將字符串無損轉換成調用參數。
  4. 參數校驗:因為大語言模型輸出的隨機性,需要對生成的參數進行校驗,校驗的復雜性。

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

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

相關文章

面向安全產品測試的靜態混淆型 Shellcode Loader 設計與對抗分析

github 地址&#xff1a;https://github.com/LilDean17/ShellcodeLoader2025 一、項目背景 近年來&#xff0c;隨著 C2 框架廣泛應用于安全對抗模擬&#xff0c;各大安全廠商也不斷提升其檢測能力&#xff0c;那么安全廠商自研的安全軟件&#xff0c;是否能有效防御此類威脅&…

深度強化學習DRL——策略學習

一、策略網絡 策略函數 π \pi π的輸入是狀態 s s s和動作 a a a&#xff0c;輸出是一個介于0和1之間的概率值&#xff0c;用神經網絡 π ( a ∣ s ; θ ) \pi(a \mid s; \boldsymbol{\theta}) π(a∣s;θ)近似策略函數 π ( a ∣ s ) \pi(a\mid s) π(a∣s)&#xff0c; θ …

ISP Pipeline(5): Auto White Balance Gain Control (AWB) 自動白平衡

G_gain 1.0 # 常作為參考通道 R_gain G_avg / R_avg B_gain G_avg / B_avgAuto White Balance Gain Control&#xff08;AWB&#xff09;自動調整圖像中紅色、綠色、藍色通道的增益&#xff0c;使圖像中灰白區域的顏色看起來為“中性白”或“灰白”&#xff0c;從而矯正因光…

Python中鉤子函數的實現方式

在Python中&#xff0c;鉤子函數(Hook)是一種允許你在程序執行的特定點插入自定義代碼的技術。它本質上是一種回調機制&#xff0c;當特定事件發生時自動調用預先注冊的函數。 Python中鉤子函數的實現方式 Python中實現鉤子主要有以下幾種方式&#xff1a; ?回調函數?&…

【RTSP從零實踐】3、實現最簡單的傳輸H264的RTSP服務器

&#x1f601;博客主頁&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客內容&#x1f911;&#xff1a;&#x1f36d;嵌入式開發、Linux、C語言、C、數據結構、音視頻&#x1f36d; &#x1f923;本文內容&#x1f923;&a…

零開始git使用教程-傳html文件

1. 準備工作 (1) 確保你已經安裝&#xff1a; Visual Studio (VS)&#xff08;任何版本&#xff0c;社區版也行&#xff09; Git&#xff08;去官網 git-scm.com 下載安裝&#xff09; (2) 注冊 Gitee/GitHub 賬號 國內推薦 Gitee&#xff08;碼云&#xff09;&#xff1a;…

CPT204-Advanced OO Programming: Lists, Stacks, Queues, and Priority Queues

目錄 1.Java 集合框架層次結構Java Collection Framework hierarchy 1.1Java 集合框架描述&#xff1a; 1.2數據結構Data structures 1.3 Java 集合框架支持兩種類型的容器&#xff08;數據結構&#xff09;&#xff1a; 1.4 Java 集合框架的設計 2.Collection 2.1 Coll…

【網絡安全】Mysql注入中鎖機制

前言 在sql注入的延時注入中&#xff0c;常見的函數有sleep()直接延時、BENCHMARK()通過讓數據庫進行大量的計算而達到延時的效果、笛卡爾積、正則匹配等&#xff0c;但還有一個常常被忽略的函數&#xff0c;也就是Mysql中的鎖機制。雖然早些年就已經出現過相關的技術文章&…

博途多重背景、參數實例

1&#xff1a;我們在博途中先新建一個工程&#xff0c;并且建立一個FB塊名字為motor_fb&#xff0c;同樣建立一個FC塊名字為MOTOR_FC&#xff0c;里面寫上我們電機程序里常用的邏輯控制。二者程序內容相同。下面是motor_fb塊的程序截圖: 2:我們再新建一個FB塊&#xff0c;名字為…

運維的利器–監控–zabbix–第三步:配置zabbix–中間件–Tomcat–步驟+驗證

&#x1f3e0;個人主頁&#xff1a;fo安方的博客? &#x1f482;個人簡歷&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;目前中南大學MBA在讀&#xff0c;也考取過HCIE Cloud Computing、CCIE Security、PMP、CISP、RHCE、CCNP RS、PEST 3等證書。&#x1f433; &…

大模型在重癥哮喘手術全流程風險預測與治療方案制定中的應用研究

目錄 一、引言 1.1 研究背景與意義 1.2 研究目標與方法 1.3 研究創新點 二、重癥哮喘概述 2.1 定義與發病機制 2.2 分類與臨床表現 2.3 診斷標準與方法 三、大模型技術原理與應用現狀 3.1 大模型的基本原理 3.2 在醫療領域的應用案例分析 3.3 適用于重癥哮喘預測的…

Webpack的插件機制Tapable

Tapable 是一個輕量級的庫&#xff0c;用于創建和管理插件鉤子&#xff08;hooks&#xff09;&#xff0c;它在 Webpack 中廣泛應用&#xff0c;用于實現插件系統。Tapable 提供了一種機制&#xff0c;允許插件在特定的生命周期階段插入自定義邏輯&#xff0c;從而擴展應用程序…

FRONT歸因-兩階段訓練流程

FRONT, Fine-Grained Grounded Citations歸因 FRONT歸因&#xff0c;首先從檢索到的源文檔中選擇支持性引用&#xff0c;然后基于這些引用指導生成過程&#xff0c;確保生成回答有據可依&#xff0c;引用準確無誤。 FRONT的特色在于兩階段歸因訓練&#xff0c;要點如下: 階…

單端轉差分放大器AD8138

根據 AD8138 的數據手冊特性及參數&#xff0c;可以實現單端 5Vpp&#xff08;偏置 0V&#xff09;正弦波轉差分 5Vpp&#xff08;共模 2.5V&#xff09;的功能&#xff0c;但需注意以下細節&#xff1a; 1. 信號幅度匹配性 輸入信號&#xff1a;單端 5Vpp&#xff08;峰峰值…

用R包mice進行多重插補

利用R包mice實現的鏈式方程多重插補方法來插補缺失的數據。 所有多重插補方法都遵循三個步驟 插補——與單次插補類似&#xff0c;對缺失值進行插補。但是&#xff0c;插補值會從分布中提取m次&#xff0c;而不是僅提取一次。此步驟結束時&#xff0c;應該有m 個完整的數據集…

【專題】網絡攻防技術期末復習資料

網絡攻防技術期末復習資料 鏈接&#xff1a;https://blog.csdn.net/Pqf18064375973/article/details/148996272?sharetypeblogdetail&sharerId148996272&sharereferPC&sharesourcePqf18064375973&sharefrommp_from_link 網絡安全威脅的成因。 分類&#xff1a…

地震災害的模擬

為確保地震災害模擬的準確性和高效性&#xff0c;涉及的系統需要處理復雜的物理模型、數據輸入和多層次的模擬過程。在技術設計方案中&#xff0c;我們將涵蓋以下幾個方面&#xff1a; 背景&#xff1a;描述該模擬系統的目的與應用場景。需求&#xff1a;列出系統的功能需求&a…

9.9 《1/10成本實現GPT-3.5級表現!ChatGLM3-6B QLoRA微調實戰:4bit量化+低秩適配全解析》

1/10成本實現GPT-3.5級表現!ChatGLM3-6B QLoRA微調實戰:4bit量化+低秩適配全解析 ChatGLM3-6B 微調入門實戰:QLoRA 量化低秩適配技術 ▲ ChatGLM3-6B采用GLM架構改進版,支持32K上下文長度和代碼生成能力 一、QLoRA 技術原理精要 QLoRA(Quantized Low-Rank Adaptation)…

【Python基礎】11 Python深度學習生態系統全景解析:從基礎框架到專業應用的技術深度剖析(超長版,附多個代碼及結果)

引言:Python在深度學習領域的統治地位 在人工智能浪潮席卷全球的今天,Python已經成為深度學習領域當之無愧的王者語言。這不僅僅是因為Python語法簡潔易學,更重要的是圍繞Python構建的深度學習生態系統的完整性和強大性。從Google的TensorFlow到Facebook的PyTorch,從科學計…

RESTful API 設計原則深度解析

在 Web 服務架構中&#xff0c;RESTful API作為一種輕量級、可擴展的接口設計風格&#xff0c;通過 HTTP 協議實現資源的標準化訪問。本文從核心原則、URL 設計、HTTP 方法應用、狀態管理及面試高頻問題五個維度&#xff0c;結合工程實踐與反例分析&#xff0c;系統解析 RESTfu…