LangChain + PostgreSQL 實現向量數據庫與 RAG 搜索

1. 環境準備

安裝必要的庫

pip install langchain psycopg2-binary pgvector langchain-openai

安裝并配置 PostgreSQL

  1. 安裝 PostgreSQL
    確保 PostgreSQL 已正確安裝并運行。你可以根據操作系統的不同參考官方文檔進行安裝。

  2. 創建數據庫
    創建一個新的數據庫(例如 rag_db),用于存儲向量數據:

    CREATE DATABASE rag_db;
    
  3. 啟用 pgvector 擴展
    編譯安裝擴展:

    • Linux & Mac
      cd /tmp
      git clone --branch v0.8.0 https://github.com/pgvector/pgvector.git
      cd pgvector
      make
      make install # may need sudo
      
    • Windows
      需要先安裝好 Microsoft Visual Studio 2022 以及 C++ 桌面開發的相關組件。在Visual Studio 2022的開發終端中執行以下命令:
      set "PGROOT=C:\Program Files\PostgreSQL\16"
      cd %TEMP%
      git clone --branch v0.8.0 https://github.com/pgvector/pgvector.git
      cd pgvector
      nmake /F Makefile.win
      nmake /F Makefile.win install
      

    在數據庫中啟用 pgvector 擴展,它提供了高效的向量操作功能:

    CREATE EXTENSION vector;
    
  4. 配置數據庫連接
    確保你已獲取 PostgreSQL 數據庫的連接信息,包括用戶名、密碼、主機地址和端口。

獲取 OpenAI API 密鑰

  1. 在 OpenAI 官網 注冊并獲取 API 密鑰,或者使用類似openai輸入輸出格式的第三方服務。

  2. 將密鑰設置為環境變量 OPENAI_API_KEY,例如:

    import os
    os.environ["OPENAI_API_KEY"] = 'your_api_key'
    

2. 創建向量數據庫

連接 PostgreSQL 數據庫

首先,連接到 PostgreSQL 數據庫,初始化數據庫連接:

import psycopg2
from langchain_community.vectorstores import PGVector
from langchain_openai import OpenAIEmbeddings# 數據庫連接字符串
CONNECTION_STRING = "postgresql://user:password@host:port/rag_db"# 創建數據庫連接
conn = psycopg2.connect(CONNECTION_STRING)

創建向量存儲

接下來,使用 OpenAIEmbeddings 來初始化嵌入模型,并使用 PGVector 來創建向量存儲:

# 初始化 OpenAI 嵌入模型
embeddings = OpenAIEmbeddings()# 創建 PGVector 向量存儲
vector_store = PGVector(embedding_function=embeddings,connection_string=CONNECTION_STRING,collection_name="my_documents",  # 向量存儲名稱use_jsonb=True  # 啟用 JSONB 格式來存儲向量數據
)

添加文檔到向量存儲

我們將文檔加載、分割并添加到向量存儲中:

from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter# 加載文檔
loader = TextLoader("your_document.txt")
documents = loader.load()# 文本分割
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)# 將文檔添加到向量存儲
vector_store.add_documents(texts)

注意: 替換 "your_document.txt" 為你實際的文檔路徑。


3. 實現 RAG 搜索

創建檢索器

首先,創建一個從向量存儲中檢索文檔的檢索器:

# 創建檢索器
retriever = vector_store.as_retriever()

創建 RAG 鏈

使用 ChatOpenAI 初始化 OpenAI LLM,然后創建一個 RAG 鏈來執行查詢:

from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI# 創建 OpenAI LLM
llm = ChatOpenAI()# 創建 RAG 鏈
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever)

執行搜索

執行檢索并生成答案:

# 執行搜索
query = "What is the main topic of the document?"
result = qa_chain.run(query)print(result)

4. 進一步優化

4.1 調整嵌入參數

你可以根據文檔的具體內容和查詢的復雜度,調整 chunk_sizechunk_overlap 參數。例如,如果文檔較長,可以增大 chunk_size,或者減少 chunk_overlap 以避免重復信息。

4.2 使用不同的 LLM

除了 ChatOpenAI,你還可以嘗試使用其他 LLM(如 gpt-3.5-turbogpt-4),或者選擇其他的開源模型來替代 OpenAI。

4.3 分布式處理

當文檔量較大時,建議將數據庫配置為支持分布式處理,或者通過將多個小型數據庫分散處理來提升性能。


5. 常見問題及解決方法

5.1 如何優化向量檢索的速度?

  • 使用 PGVector 索引來加速向量檢索。
  • 盡量減少數據庫中的無關文檔,并定期清理舊數據。
  • 調整 chunk_sizechunk_overlap 使得每個文本塊足夠包含關鍵信息,但不要過大以避免降低檢索效率。

5.2 如何處理超出 OpenAI API 限制的情況?

如果請求的查詢超出了 OpenAI 的 API 限制,你可以嘗試將問題拆分成更小的子問題,或者將文檔分割得更細,避免一次性請求過多數據。


總結

通過本教程,你可以快速實現一個基于 LangChain 和 PostgreSQL 的 RAG 搜索系統,使用向量數據庫存儲并檢索文檔的嵌入數據。你可以根據實際需求進一步擴展和優化此系統,提升其查詢能力和處理效率。

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

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

相關文章

STM32硬件IIC與OLED使用

OLED屏幕介紹 OLED即有機發光管(Organic Light-Emitting Diode,OLED)。OLED顯示技術具有自發光、廣視角、幾乎無窮高的對比度、較低功耗、極高反應速度、可用于繞曲性面板、使用溫度范圍廣、構造及制程簡單等有點,被認為是下一代的平面顯示屏新興應用技術 OLED顯示…

idea自動生成注釋

idea 自動生成注釋 1 創建類時,自動生成注釋 模板代碼如下 /** * program: ${PROJECT_NAME} * * description: ${description} * * author: yun * * create: ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINUTE} **/ 2 在方法上使用快捷鍵生成注釋 先新建一個…

doris:恢復

前提條件? 確保您擁有管理員權限以執行恢復操作。確保您有一個有效的備份快照可供恢復,請參考備份。 1. 獲取快照的備份時間戳? 以下 SQL 語句可用于查看名為example_repo的 Repository 中的現有備份。 mysql> SHOW SNAPSHOT ON example_repo; -----------…

可視化圖解算法:刪除有序(排序)鏈表中重復的元素-II

1. 題目 描述 給出一個升序排序的鏈表,刪除鏈表中的所有重復出現的元素,只保留原鏈表中只出現一次的元素。 例如: 給出的鏈表為1→2→3→3→4→4→5, 返回1→2→5. 給出的鏈表為1→1→1→2→3 返回2→3. 數據范圍:鏈表長度 0≤…

【leetcode刷題日記】lc.53-最大子數組和

目錄 1.題目 2.代碼 1.題目 給你一個整數數組 nums ,請你找出一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。 子數組是數組中的一個連續部分。 示例 1: 輸入:nums [-2,1,-3,4,-…

樹莓派超全系列文檔--(7)RaspberryOS播放音頻和視頻

播放音頻和視頻 播放音頻和視頻VLC 媒體播放器vlc GUIvlc CLI使用 cvlc 在沒有圖形用戶界面的情況下播放媒體 在 Raspberry Pi OS Lite 上播放音頻和視頻指定音頻輸出設備指定視頻輸出設備同時指定音頻和視頻輸出設備提高數據流播放性能 文章來源: http://raspberr…

算法250327題目

1114: 4006 AB問題 題目描述 給定兩個整數A和B,其表示形式是:從個位開始,每三位數用逗號,隔開。 現在請計算AB的結果,并以正常形式輸出。 輸入 輸入包含多組數據,每組數據占一行,由兩個整數A和B組成&am…

Wireshark學習

Wireshark簡介 抓包前 1.打開wireshark得到下面的界面 2.選擇菜單欄上捕獲-> 選項,勾選WLAN網卡(這里需要根據各自電腦網卡使用情況選擇,簡單的辦法可以看使用的IP對應的網卡)。點擊開始。啟動抓包。 3.wireshark啟動后&am…

[OS_4] 數學視角 | 多狀態 | 模型檢查器 | 程序驗證(math)

程序 狀態機 gdb 單步執行 狀態遷移 狀態里有什么?gdb 可以打印有一些特殊的狀態遷移 硬件 狀態機 指令執行 狀態遷移 從 CPU Reset 開始執行 FirmwareFirmware 加載操作系統 (程序) 操作系統 狀態機 (毫無疑問) 程序是一種真正意義上的 “數學嚴格” 的…

互聯網的“神經中樞”域名根服務器是如何演變的?

互聯網如同一條隱形的紐帶,將全球數十億人的生活和工作緊密相連。而在這龐大的網絡體系中,域名根服務器則是支撐其平穩運行的“神經中樞”。那么域名根服務器是如何演變的呢? 一、域名根服務器互聯網的“地址簿” 想象一下,當你…

【sylar-webserver】6 IO協程調度模塊

文章目錄 設計知識點 設計 IO協程調度模塊,整個項目里最重要的模塊~ 和 協程調度模塊 相比,增加了 IO 事件的 觸發條件。 所以需要重新封裝 Event 事件, 通過 epoll_wait 監測觸發事件(重新實現了idle),…

6.2、認證主要產品與應用

目錄 認證主要產品認證產品主要技術指標認證技術應用認證技術應用 - 校園網應用認證技術應用 - 網絡路由認證認證技術應用 - 用戶登錄設備認證技術應用 - 人臉識別門禁與eID 認證主要產品 應用認證產品主要形態有三種,硬件模式、軟件模式和軟硬相結合。硬件比如說認…

一套SaaS多租戶醫療云his源碼,基于云計算的醫院信息管理系統(云HIS)

基于云計算的醫院信息管理系統(云HIS),通過SaaS服務模式提供。這種云HIS系統設計考慮了模板化、配置化、智能化和可擴展性,覆蓋了基層醫療機構的核心工作流程,并且能夠與監管系統無縫對接,滿足未來的擴展需…

人工智能技術全景圖譜:從基礎理論到前沿應用

人工智能技術全景圖譜:從基礎理論到前沿應用 一、AI發展歷程與學科體系 1.1 人工智能三大學派 符號主義(Symbolicism) 邏輯推理:一階謂詞邏輯知識表示:語義網絡、框架系統 連接主義(Connectionism&#…

基于杜鵑鳥鯰魚優化(Cuckoo Catfish Optimizer,CCO)算法的多個無人機協同路徑規劃(可以自定義無人機數量及起始點),MATLAB代碼

一、杜鵑鳥鯰魚優化算法 杜鵑鳥鯰魚優化(Cuckoo Catfish Optimizer,CCO)算法模擬了杜鵑鳥鯰魚的搜索、捕食和寄生慈鯛行為。該算法的早期迭代側重于執行多維包絡搜索策略和壓縮空間策略,并結合輔助搜索策略來有效限制慈鰾的逃逸空…

FPGA_DDS_IP核

接下來對FPGA的DDS的ip核進行學習。 首先對DDS需要有些了解 DDS信號發生器采用直接數字頻率合成(Direct Digital Synthesis,簡稱DDS)技術,簡單來說就是 需要一個系統頻率和一個輸入的數字數據 ,用這個系統頻率計算出…

dbeaver連接mongodb 插入日期變成了字符串

dbeaver插入mongodb數據 日期默認使用ISODate處理,但是插入數據以后實際上是ISODate(2025-03-03T03:25:19.640Z)字符串 INSERT INTO xxx.aaa (_id, chatId, buddyId, pId, lastChatId, inspiration, createTime, modelType, version, selectedInspiration, _class)…

微服務管理 - NACOS學習

為什么了解,工作中會使用這個工具進行微服務管理。 入門介紹: Nacos 是阿里巴巴開源的一款專注于動態服務發現、配置管理和服務管理的平臺,主要用于簡化云原生應用架構中的微服務開發與運維。它幫助開發者實現服務的自動注冊與發現、實時配置…

外貿獨立站相關知識掃盲

常見的外貿獨立站類型 B2B外貿獨立站:主要面向企業客戶,展示公司產品、服務和解決方案,促進企業間貿易。例如,使用WordPress搭建的B2B外貿獨立站,可以靈活展示產品信息、發布行業資訊、提供在線詢盤功能等。 B2C外貿…

libpng-1.6.47-windows編譯

本文操作按照《c&c開源庫編譯指南》中內容規范編寫,編譯環境配置、工具下載、目錄規劃,及更多其他開源庫編譯方法請參考該文章。 c&c開源庫編譯指南:https://blog.csdn.net/binary0006/article/details/144086155 本文章中的源代碼已…