1. 環境準備
安裝必要的庫
pip install langchain psycopg2-binary pgvector langchain-openai
安裝并配置 PostgreSQL
-
安裝 PostgreSQL
確保 PostgreSQL 已正確安裝并運行。你可以根據操作系統的不同參考官方文檔進行安裝。 -
創建數據庫
創建一個新的數據庫(例如rag_db),用于存儲向量數據:CREATE DATABASE rag_db; -
啟用 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; - Linux & Mac
-
配置數據庫連接
確保你已獲取 PostgreSQL 數據庫的連接信息,包括用戶名、密碼、主機地址和端口。
獲取 OpenAI API 密鑰
-
在 OpenAI 官網 注冊并獲取 API 密鑰,或者使用類似openai輸入輸出格式的第三方服務。
-
將密鑰設置為環境變量
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_size 和 chunk_overlap 參數。例如,如果文檔較長,可以增大 chunk_size,或者減少 chunk_overlap 以避免重復信息。
4.2 使用不同的 LLM
除了 ChatOpenAI,你還可以嘗試使用其他 LLM(如 gpt-3.5-turbo 或 gpt-4),或者選擇其他的開源模型來替代 OpenAI。
4.3 分布式處理
當文檔量較大時,建議將數據庫配置為支持分布式處理,或者通過將多個小型數據庫分散處理來提升性能。
5. 常見問題及解決方法
5.1 如何優化向量檢索的速度?
- 使用
PGVector索引來加速向量檢索。 - 盡量減少數據庫中的無關文檔,并定期清理舊數據。
- 調整
chunk_size和chunk_overlap使得每個文本塊足夠包含關鍵信息,但不要過大以避免降低檢索效率。
5.2 如何處理超出 OpenAI API 限制的情況?
如果請求的查詢超出了 OpenAI 的 API 限制,你可以嘗試將問題拆分成更小的子問題,或者將文檔分割得更細,避免一次性請求過多數據。
總結
通過本教程,你可以快速實現一個基于 LangChain 和 PostgreSQL 的 RAG 搜索系統,使用向量數據庫存儲并檢索文檔的嵌入數據。你可以根據實際需求進一步擴展和優化此系統,提升其查詢能力和處理效率。