該項目提供了一個簡單的Web應用程序,該應用程序使用戶能夠上傳PDF文檔,從其內容中生成向量嵌入,然後使用文本查詢在文檔中搜索信息。 OpenAI的嵌入和語言模型用於創建向量嵌入和信息檢索。
PDF文檔攝入:用戶可以通過Web界面上傳PDF文檔以進行信息檢索。
生成矢量嵌入:從PDF提取文本內容,並使用Langchain分為較小的塊。使用OpenAI的文本嵌入模型(例如,text-embedding-ada-002)為每個塊生成嵌入。
向量數據庫存儲:將生成的向量嵌入在諸如Pinecone之類的向量數據庫中存儲,以進行相似性搜索。
完善的用戶查詢:使用OpenAI的聊天完成API來完善用戶查詢,以提高搜索準確性。
搜索信息:用戶可以輸入文本查詢以搜索上傳文檔中的信息。該系統根據其向量相似性與查詢嵌入的相似性檢索相關的文本塊。
生成響應:基於檢索到的文本塊,上下文(以前的查詢和響應)以及用戶的查詢,使用OpenAI模型(GPT-4O,GPT-4或GPT-3.5-Turbo)生成響應。用戶可以通過Web界面選擇OpenAI模型。模型的選擇會影響響應方式,細節和準確性。
需求.txt文件列出了運行該應用程序所需的必要的Python軟件包及其版本。這是每個軟件包的分解:
燒瓶:用於構建Web應用程序的輕質Python Web框架。
Pinecone-Client :用於與Pinecone進行交互的官方Python客戶庫,Pinecone是您應用程序中使用的矢量數據庫。
OpenAI :OpenAI API的官方Python客戶庫庫,用於生成文本嵌入並與OpenAI語言模型進行交互。
PYPDF2 :一個用於從PDF文件中提取文本的純Python庫。
Langchain :用於使用大型語言模型構建應用程序的框架,用於您的應用程序進行文本分割和分解。
Numpy :用於Python中科學計算的軟件包,用於使用多維陣列和向量。
要安裝這些依賴項,您可以創建一個新的Python虛擬環境並運行以下命令:
pip install -r要求.txt
要與OpenAI和Pinecone集成,您需要為這些平台獲取並配置相應的API鍵,主機(Pinecone)信息。將您的OpenAI和Pinecone API鍵,以及Pinecone主機作為Linux中的環境變量。使用以下Linux命令導出這些變量:
導出openai_api_key ='your-openai-api-key'
導出pinecone_api_key ='your-pinecone-api-key'
導出pinecone_host ='your pinecone-host'
確保您擁有帶有有效API鍵的OpenAI帳戶。您可以從OpenAI平台(https://platform.openai.com/)創建或獲取API鍵並管理它們(https://platform.openai.com/organization/api-keys)。此外,請確保您的帳戶具有足夠的用法配額,因為本示例需要一個付費的OpenAI帳戶。
Pinecone環境(Pinecone免費帳戶使用https://www.pinecone.io/):1)使用Pinecone索引2)尺寸:1536 3)主機類型:無服務器。
CentOS Linux版本8.5.2111用作Linux OS。具有公共IP(可選)的Cloud Linux VM已針對Web界面進行了測試。也可以使用本地IP。創建一個Python虛擬環境(可選但建議)以隔離項目依賴性。
該應用程序提供了一個使用燒瓶(Python Web框架)構建的Web接口。用戶可以上傳PDF文檔,輸入查詢,選擇要使用的OpenAI語言模型(GPT-3.5-Turbo,GPT-4或GPT-4O),並根據從上傳的PDF文檔中提取的信息獲得詳細的響應。
攝入PDF文檔並創建向量嵌入
該應用程序提供了一個Web接口,用戶可以在其中上傳PDF文檔。上載PDF文件後,將從文檔中提取文本內容,並使用Langchain庫中的recursivecharactertextsplitter分為較小的塊。這種分裂過程可確保文本分為可管理的塊,同時保持上下文。
接下來,使用OpenAI的Text-Embedding-ADA-002型號為每個文本塊生成矢量嵌入。這些嵌入是高維向量,可捕獲文本的語義含義,從而實現有效的相似性搜索。
將矢量嵌入在松果中
生成的向量嵌入及其相應的文本塊和頁碼都存儲在Pinecone矢量數據庫中。 Pinecone是一個可擴展有效的矢量數據庫,旨在存儲和查詢高維矢量。
查詢處理
當用戶通過Web界面提交查詢時,應用程序將在以下步驟中對其進行處理:
查詢細化:
用戶的查詢將發送到OpenAI的語言模型(例如,GPT-3.5-Turbo,GPT-4或GPT-4O),以完善和改進查詢以提高搜索準確性。
嵌入查詢的生成
精製查詢使用OpenAI的Text-Embedding-ADA-002型號轉換為嵌入向量嵌入。
相似性搜索:
查詢嵌入用於搜索Pinecone Vector數據庫,以基於向量相似性來為最相似的文本塊。
注意:要查詢Pinecone索引並檢索頂部結果,使用以下代碼(app.py)
#ADJUST並根據您的用例實驗TOP_K值
結果= pinecone_index.query(vector = paded_query_vector.tolist(),top_k = 1,include_metadata = true)
TOP_K參數指定從查詢返回的頂部結果數。調整TOP_K值可能會影響查詢響應的質量。更高的TOP_K值可能會提供更全面的結果,但也可能引入較少的相關數據。相反,較低的TOP_K值可能會產生更精確但更少的結果。重要的是要嘗試不同的TOP_K值,以找到特定用例的最佳平衡。此外,請注意,提高TOP_K值也會影響成本,尤其是在使用付費OpenAI模型處理結果時。較高的TOP_K值會導致更多數據發送到模型並處理的數據,這可能導致使用費用增加。
注意:score_threshold參數確定要考慮結果可能影響查詢響應質量的結果所需的最小相關得分。因此,根據您的用例和實驗(app.py)調整閾值值。
#根據您的用例調整閾值
score_threshold = 0.65
響應生成:
從數據庫中檢索到的相關文本塊與先前的上下文(如果有)和原始用戶查詢結合使用。然後將此信息發送到OpenAI的語言模型(與查詢細化的相同模型),以生成全面且相關的響應。
上下文意識回應:
該應用程序維護先前查詢和響應的上下文。在響應生成步驟中,此上下文將傳遞給OpenAI的語言模型,以確保生成的響應考慮了對話歷史記錄並提供準確且上下文相關的信息。
要運行該應用程序,請按照以下步驟:
激活您的python虛擬環境(可選):( venv)[user@host project_directory]#
運行app.py腳本:python app.py
該應用程序將開始在端口5000上運行,您可能會看到類似的輸出如下:
確保應用程序正在積極收聽端口5000上的傳入連接:
Netstat -Auttpn | GREP -I 5000 TCP 0 0 0.0.0.0:5000 0.0.0.0.0 :**聽525661/python
http://127.0.0.1:5000/(用於本地訪問)
http:// vm公共IP:5000/(用於通過Internet進行遠程訪問)
注意:如果您打算通過公共IP訪問該應用程序,請確保通過VM的防火牆允許在端口5000上傳入流量。這將確保允許通過公共IP進行通信,並且您可以遠程訪問Web界面。
另外,請確保您的Linux計算機上的文件夾(其中包含上傳的PDF文件)不包含具有相同名稱的PDF文件。如果文件已經存在,將被覆蓋。
選擇PDF文件,然後使用“上傳”按鈕上傳。
單擊“進程文件”(在此階段,將創建矢量嵌入並存儲在Pinecone數據庫中)。
輸入您的搜索查詢。從下拉菜單中選擇OpenAI語言模型。
檢查查詢響應。提交後續查詢。
完成後,單擊“結束會話”(它將觸發清理 - 在數據庫中刪除上傳的文件和矢量嵌入)
在Linux Macine上,按CTRL+C關閉應用程序(app.py)。