LangChain 0.2 - 矢量存儲和檢索器

本文翻譯整理自:Vector stores and retrievers
https://python.langchain.com/v0.2/docs/tutorials/retrievers/

文章目錄

    • 一、說明
      • 概念
    • 二、文件
    • 三、Vector stores
      • 示例
    • 四、Retrievers
    • 五、了解更多


一、說明

本教程將讓您熟悉 LangChain 的向量存儲和檢索器抽象。
這些抽象旨在支持從(向量)數據庫和其他來源檢索數據,以便與法學碩士工作流程集成。
它們對于獲取要作為模型推理的一部分進行推理的數據的應用程序非常重要,例如檢索增強生成或 RAG(請參閱此處的RAG 教程)。


概念

本指南重點介紹文本數據的檢索。我們將涵蓋以下概念:

  • Documents;
  • Vector stores;
  • Retrievers.

項目設置可參考 之前文章第二部分


二、文件

LangChain 實現了文檔抽象,旨在表示文本單元和相關元數據。它有兩個屬性:

  • page_content:代表內容的字符串;
  • metadata:包含任意元數據的字典。

metadata屬性可以捕獲有關文檔來源、其與其他文檔的關系以及其他信息的信息。
請注意,單個Document對象通常代表較大文檔的一部分。


讓我們生成一些示例文檔:

from langchain_core.documents import Documentdocuments = [Document(page_content="Dogs are great companions, known for their loyalty and friendliness.",metadata={"source": "mammal-pets-doc"},),Document(page_content="Cats are independent pets that often enjoy their own space.",metadata={"source": "mammal-pets-doc"},),Document(page_content="Goldfish are popular pets for beginners, requiring relatively simple care.",metadata={"source": "fish-pets-doc"},),Document(page_content="Parrots are intelligent birds capable of mimicking human speech.",metadata={"source": "bird-pets-doc"},),Document(page_content="Rabbits are social animals that need plenty of space to hop around.",metadata={"source": "mammal-pets-doc"},),
]


API參考:

  • Document

在這里,我們生成了五個文檔,其中包含指示三個不同“來源”的元數據。


三、Vector stores

矢量搜索是存儲和搜索非結構化數據(例如非結構化文本)的常用方法。
這個想法是存儲與文本關聯的數字向量。
給定一個查詢,我們可以將其嵌入為相同維度的向量,并使用向量相似性度量來識別存儲中的相關數據。

LangChain VectorStore對象包含向Document存儲添加文本和對象以及使用各種相似性度量查詢它們的方法。
它們通常使用嵌入模型進行初始化,該模型決定如何將文本數據轉換為數字向量。

LangChain 包含一套與不同矢量存儲技術的集成。
一些矢量存儲由提供商(例如,各種云提供商)托管,并且需要特定的憑據才能使用;有些(例如Postgres)在單獨的基礎設施中運行,可以在本地或通過第三方運行;其他可以在內存中運行以處理輕量級工作負載。
在這里,我們將使用Chroma演示 LangChain VectorStores 的用法,其中包括內存中實現。

為了實例化向量存儲,我們通常需要提供嵌入模型來指定如何將文本轉換為數字向量。

這里我們將使用OpenAI 嵌入。

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddingsvectorstore = Chroma.from_documents(documents,embedding=OpenAIEmbeddings(),
)


API參考:

  • OpenAIEmbeddings

調用 .from_documents 此處會將文檔添加到矢量存儲中。
VectorStore實現了添加文檔的方法,這些方法也可以在實例化對象后調用。
大多數實現將允許您連接到現有的向量存儲——例如,通過提供客戶端、索引名稱或其他信息。
有關更多詳細信息,請參閱特定集成的文檔。

一旦我們實例化了VectorStore包含文檔的,我們就可以查詢它。 VectorStore包含查詢方法:

  • 同步和異步;
  • 按字符串查詢和按向量查詢;
  • 有或沒有返回相似度分數;
  • 通過相似性和最大邊際相關性(以平衡查詢的相似性和檢索結果的多樣性)。

這些方法通常會在其輸出中包含Document對象的列表。


示例

根據與字符串查詢的相似性返回文檔:

vectorstore.similarity_search("cat")

[Document(page_content='Cats are independent pets that often enjoy their own space.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Dogs are great companions, known for their loyalty and friendliness.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Rabbits are social animals that need plenty of space to hop around.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Parrots are intelligent birds capable of mimicking human speech.', metadata={'source': 'bird-pets-doc'})]

異步查詢:

await vectorstore.asimilarity_search("cat")

[Document(page_content='Cats are independent pets that often enjoy their own space.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Dogs are great companions, known for their loyalty and friendliness.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Rabbits are social animals that need plenty of space to hop around.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Parrots are intelligent birds capable of mimicking human speech.', metadata={'source': 'bird-pets-doc'})]

返回分數:

# Note that providers implement different scores; Chroma here
# returns a distance metric that should vary inversely with
# similarity.vectorstore.similarity_search_with_score("cat")

[(Document(page_content='Cats are independent pets that often enjoy their own space.', metadata={'source': 'mammal-pets-doc'}),0.3751849830150604),(Document(page_content='Dogs are great companions, known for their loyalty and friendliness.', metadata={'source': 'mammal-pets-doc'}),0.48316916823387146),(Document(page_content='Rabbits are social animals that need plenty of space to hop around.', metadata={'source': 'mammal-pets-doc'}),0.49601367115974426),(Document(page_content='Parrots are intelligent birds capable of mimicking human speech.', metadata={'source': 'bird-pets-doc'}),0.4972994923591614)]

根據與嵌入查詢的相似性返回文檔:

embedding = OpenAIEmbeddings().embed_query("cat")vectorstore.similarity_search_by_vector(embedding)

[Document(page_content='Cats are independent pets that often enjoy their own space.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Dogs are great companions, known for their loyalty and friendliness.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Rabbits are social animals that need plenty of space to hop around.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Parrots are intelligent birds capable of mimicking human speech.', metadata={'source': 'bird-pets-doc'})]

了解更多:

  • API reference
  • How-to guide
  • Integration-specific docs

四、Retrievers

LangChain VectorStore對象沒有 Runnable 子類,因此不能立即集成到 LangChain 表達語言鏈 中。

LangChain Retrievers 是 Runnables,因此它們實現了一組標準方法(例如,同步和異步invoke以及batch操作),并被設計為合并到 LCEL 鏈中。

我們可以自己創建一個簡單的版本,無需子類化Retriever
如果我們選擇希望使用什么方法來檢索文檔,我們可以輕松創建一個可運行程序。
下面我們將圍繞該similarity_search方法構建一個:

from typing import Listfrom langchain_core.documents import Document
from langchain_core.runnables import RunnableLambdaretriever = RunnableLambda(vectorstore.similarity_search).bind(k=1)  # select top resultretriever.batch(["cat", "shark"])

API參考

  • Document
  • RunnableLambda
[[Document(page_content='Cats are independent pets that often enjoy their own space.', metadata={'source': 'mammal-pets-doc'})],[Document(page_content='Goldfish are popular pets for beginners, requiring relatively simple care.', metadata={'source': 'fish-pets-doc'})]]

Vectorstore 實現了as_retriever一個生成 Retriever 的方法,特別是 VectorStoreRetriever。
這些檢索器包括特定的search_typesearch_kwargs 屬性,用于標識要調用的底層向量存儲的哪些方法以及如何參數化它們。
例如,我們可以用以下內容復制上面的內容:

retriever = vectorstore.as_retriever(search_type="similarity",search_kwargs={"k": 1},
)retriever.batch(["cat", "shark"])

[[Document(page_content='Cats are independent pets that often enjoy their own space.', metadata={'source': 'mammal-pets-doc'})],[Document(page_content='Goldfish are popular pets for beginners, requiring relatively simple care.', metadata={'source': 'fish-pets-doc'})]]

VectorStoreRetriever 支持搜索類型 "similarity"(默認)、"mmr"(最大邊際相關性,如上所述)和"similarity_score_threshold"
我們可以使用后者根據相似度得分對檢索器輸出的文檔進行閾值化。

檢索器可以輕松融入更復雜的應用程序,例如檢索增強生成 (RAG) 應用程序,該應用程序將給定的問題與檢索到的上下文結合到 LLM 提示中。
下面我們展示了一個最小示例。

pip install -qU langchain-openai

import getpass
import osos.environ["OPENAI_API_KEY"] = getpass.getpass()from langchain_openai import ChatOpenAIllm = ChatOpenAI(model="gpt-3.5-turbo-0125")

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthroughmessage = """
Answer this question using the provided context only.{question}Context:
{context}
"""prompt = ChatPromptTemplate.from_messages([("human", message)])rag_chain = {"context": retriever, "question": RunnablePassthrough()} | prompt | llm

API參考:

  • ChatPromptTemplate
  • RunnablePassthrough
response = rag_chain.invoke("tell me about cats")print(response.content)

Cats are independent pets that often enjoy their own space.

五、了解更多

檢索策略可能豐富且復雜。例如:

  • 我們可以從查詢中推斷出硬規則和過濾器 (例如,“使用 2020 年之后發布的文檔”);
  • 我們可以以某種方式返回鏈接到檢索到的上下文的文檔 (例如,通過某些文檔分類法);
  • 我們可以為每個上下文單元生成多個嵌入;
  • 我們可以整合 來自多個檢索器的結果;
  • 我們可以為文檔分配權重,例如,對最近的文檔賦予更高的權重。

操作指南的 檢索器 部分涵蓋了這些和其他內置檢索策略。
擴展 BaseRetriever類以實現自定義檢索器也很簡單。
請參閱操作指南 : https://python.langchain.com/v0.2/docs/how_to/custom_retriever/。


2024-05-22(三)

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

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

相關文章

大語言模型LLM 相關知識匯總

大型語言模型(LLM)在設計和應用時需要遵守一系列的道德和法律標準,以確保不會輸出不當內容。以下是一些LLM通常不應該對外輸出的內容類型: 個人隱私信息:包括但不限于個人身份信息(PII)&#x…

Echarts 實現將X軸放在圖表頂部并且自動播放展示提示信息內容

文章目錄 需求分析效果預覽需求 如下圖所示,實現柱狀圖中反轉倒著繪制 分析 使用 ECharts 來實現對 Y 軸的倒序排序時,可以通過設置 yAxis 的 inverse 屬性為 true 來實現。以下是一個簡單的示例,演示了如何使用 ECharts 來創建一個柱狀圖,并將 Y 軸進行倒序排序:并且…

前綴和算法:提升編程效率的秘密武器(Java版)

本篇會加入個人的所謂魚式瘋言 ??????魚式瘋言:??????此瘋言非彼瘋言 而是理解過并總結出來通俗易懂的大白話, 小編會盡可能的在每個概念后插入魚式瘋言,幫助大家理解的. 🤭🤭🤭可能說的不是那么嚴謹.但小編初心是能讓更多人能接…

代碼審計--一道簡單的文件包含題目的多種利用方式

NO.1 傳統方法 首先來看下代碼 <?php error_reporting(0); if(isset($_GET["file"])){include($_GET["file"]); }else{highlight_file(__FILE__);phpinfo(); } ?>看完代碼后再來學習學習函數吧&#xff0c;畢竟菜啊&#xff01;&#xff01;&…

IronPython和C#交互

在C#環境中動態調用IronPython腳本&#xff0c;可以通過以下步驟實現&#xff1a; 安裝IronPython: 首先&#xff0c;確保你的項目中已經安裝了IronPython。可以通過NuGet包管理器來安裝IronPython。 創建IronPython運行環境: 在C#代碼中&#xff0c;你需要創建一個ScriptEngi…

NASA數據集——阿爾法噴氣式大氣實驗甲醛(HCHO)數據

Alpha Jet Atmospheric eXperiment Formaldehyde Data 簡介 阿爾法噴氣式大氣實驗甲醛數據 阿爾法噴氣式大氣實驗&#xff08;AJAX&#xff09;是美國國家航空航天局艾姆斯研究中心與 H211, L.L.C. 公司的合作項目&#xff0c;旨在促進對加利福尼亞、內華達和太平洋沿岸地區的…

【NOIP2014普及組復賽】題4:子矩陣

題3&#xff1a;子矩陣 【題目描述】 給出如下定義&#xff1a; 1.子矩陣&#xff1a;從一個矩陣當中選取某些行和某些列交叉位置所組成的新矩陣&#xff08;保持行與列的相對順序&#xff09;被稱為原矩陣的一個子矩陣。 例如&#xff0c;下面左圖中選取第 2 、 4 2、4 2、…

vue項目中使用json編輯器

實現效果&#xff1a; 借助插件json-editor-vue3實現效果如圖一&#xff0c;如果嫌丑可以通過類名改一下樣式如圖二。 實現過程&#xff1a; 安裝插件&#xff1a;npm install json-editor-vue3 文檔鏈接&#xff1a;GitCode - 開發者的代碼家園 <script setup name&quo…

Golang發送POST請求并傳遞JSON數據

客戶端 package mainimport ("c02_get_param/common""fmt""zdpgo_resty" )func main() {// Create a Resty Clientclient : zdpgo_resty.New()// 設置字符串resp, err : client.R().SetHeader("Content-Type", "application/jso…

AcWing 3466. 清點代碼庫(STL:map,vector)

3466. 清點代碼庫 需要求有幾種不同數列&#xff0c;每種有多少個&#xff0c;可以想到用map。它的鍵是一個數列&#xff0c;可以把它放在vector里。也就是map<vector<int>,int> 要滿足要求的輸出序列&#xff0c;就要想把它放在其他容器&#xff0c;或數組里&…

mac清理緩存的命令

mac清理緩存的命令 在macOS中&#xff0c;你可以使用以下命令來清理緩存&#xff1a; 清理DNS緩存&#xff1a; sudo killall -HUP mDNSResponder 清理Metal緩存&#xff1a; mkdir ~/Library/Caches/com.apple.Metal 清理文件系統元數據緩存&#xff1a; sudo find /private/…

Vite + Vue3 部署 GitHub

因為靜態資源是可以部署到 GitHub 上&#xff0c;自己順便學習部署網站 因為我使用的是 Vite 工具&#xff0c;官方有提供相應 Demo 部署靜態站點 | Vite 官方中文文檔 新建文件夾 .github 然后再建一個文件夾 workflows 新建文件 main.yml 文件 直接使用官方文檔 demo #…

什么是spring 的組件掃描?

Spring的組件掃描&#xff08;Component Scanning&#xff09;是Spring框架提供的一種機制&#xff0c;用于自動尋找和注冊應用程序中的組件&#xff0c;進而減少顯式的配置。這些組件通常是標有特定注解&#xff08;如Component, Service, Repository, Controller等&#xff0…

如何處理時間序列的缺失數據

您是否應該刪除、插入或估算&#xff1f; 世界上沒有完美的數據集。每個數據科學家在數據探索過程中都會有這樣的感覺&#xff1a; df.info()看到類似這樣的內容&#xff1a; 大多數 ML 模型無法處理 NaN 或空值&#xff0c;因此如果您的特征或目標包含這些值&#xff0c;則在…

Java-MySql:JDBC

目錄 JDBC概述 JDBC搭建 1、導入mysql開發商提供的jar包 2、注冊驅動 3、與數據庫連接 注解&#xff1a; Statement&#xff1a; 代碼 運行 PreparedStatement&#xff1a; 代碼 運行 PreparedStatement和Statement Statement 增 代碼 運行 刪 代碼 運…

九、圖形化腳本

多年來&#xff0c; shell腳本一直都被認為是枯燥乏味的。但如果你準備在圖形化環境中運行腳本時&#xff0c;就未必如此了。有很多與腳本用戶交互的方式并不依賴read和echo語句。 9.1 創建文本菜單 創建交互式shell腳本最常用的方法是使用菜單。提供各種選項可以幫助腳本用戶…

AI遇上遙感,未來會怎樣?

隨著航空、航天、近地空間等多個遙感平臺的不斷發展&#xff0c;近年來遙感技術突飛猛進。由此&#xff0c;遙感數據的空間、時間、光譜分辨率不斷提高&#xff0c;數據量也大幅增長&#xff0c;使其越來越具有大數據特征。對于相關研究而言&#xff0c;遙感大數據的出現為其提…

初識GPT

初識GPT GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一種基于Transformer架構的預訓練語言模型&#xff0c;由人工智能研究公司OpenAI開發。GPT模型使用了一種稱為“自回歸”&#xff08;autoregressive&#xff09;的方法來生成文本&#xff0c;這意味…

Oracle執行DELETE語句后,回滾(還原)數據

--第一步&#xff1a;刪除數據 DELETE FROM "EMPLOYEER" WHERE id 123 --第二步&#xff1a;查看數據列表(判斷第一步中數據是否被刪除) SELECT * FROM "EMPLOYEER" AS OF timestamp to_timestamp( 2024-05-22 11:51:00, yyyy-mm-dd hh24:mi:ss ) --第…

基于MetaGPT構建LLM多智能體

前言 你好&#xff0c;我是GISer Liu&#xff0c;在上一篇文章中&#xff0c;我們用了兩萬多字詳細拆解了單個Agent的組成&#xff0c;并通過Github Trending訂閱智能體理解MetaGPT框架的訂閱模塊如何解決應用問題&#xff0c;但是對于復雜&#xff0c;并行的任務&#xff0c;單…