如何使用 LangChain 和 OpenAI API 分析文檔
從文檔和數據中提取見解對於做出明智的決策至關重要。然而,在處理敏感信息時會出現隱私問題。 LangChain結合OpenAI API,可以讓您分析本地文檔,而無需在線上傳。
通過數據的本地存儲、利用嵌入和向量化進行檢查以及在自己的系統內進行操作,OpenAI有效地維護了隱私。重要的是,客戶通過 API 提交的信息不會用於模型訓練或服務增強。
設置您的環境
要創建新的 Python 虛擬環境並安裝必要的庫,請按照以下步驟操作:首先,利用 Python 3.x 附帶的 venv 模塊建立新的 Python 環境。這將防止不同版本的已安裝軟件包之間出現任何兼容性問題。為此,請打開終端或命令提示符並導航到要在其中創建虛擬環境的所需目錄。到達那里後,輸入以下命令:bashpython-m venv myenv 將“myenv”替換為您喜歡的虛擬環境名稱。接下來,使用“./bin/activate”(在 Windows 上)或“source bin/activate”(在 macOS 或 Linux 上)命令激活新創建的環境。激活後,通過運行以下命令繼續安裝所需的庫
pip install langchain openai tiktoken faiss-cpu pypdf
各庫的利用率可總結如下:
LangChain 是一款多功能工具,旨在促進各種文本處理和分析任務的語言鏈的創建和管理。該平台提供了一系列功能,例如文檔加載、文本分段、嵌入生成和矢量存儲,所有這些功能都旨在輕鬆高效地簡化與語言相關的操作。
OpenAI 備受推崇的平台為用戶提供了執行查詢並從高級語言模型檢索響應的機會,為那些尋求深刻分析或幫助的人提供了寶貴的資源。
TikTokoken 作為一種實用程序,用於量化指定文本體內的字符數,從而可以在與 Open AI API 交互期間準確計算代幣使用情況,其中費用由使用的文本量決定。
FAISS 是一款高效的工具,使您能夠建立和維護向量表示存儲庫,從而通過嵌入來促進快速訪問類似編碼的向量。
PyPDF2 是一個 Python 包,有助於從可移植文檔格式 (PDF) 文件中提取文本。該軟件簡化了加載 PDF 文檔的過程,並能夠檢索其內容以進行後續操作或分析。
所有庫的安裝完成後,您的工作區現已準備就緒,並配備了開始操作所需的工具。
獲取 OpenAI API 密鑰
為了使用 OpenAI API 提供的服務,必須在您的查詢中包含 API 密鑰。這種包含使 API 提供商能夠確認請求方的真實性,同時還驗證發送者是否擁有訪問可用功能所需的授權。
要獲取 OpenAI API 密鑰,請訪問 OpenAI 平台 。
事實上,要訪問 API 密鑰,請導航至您帳戶儀表板右上角的“個人資料”部分,然後選擇“查看 API 密鑰”。此操作將立即顯示 API 密鑰頁面以進行進一步管理。
請單擊“創建新密鑰”按鈕以啟動生成供 OpenAI 使用的 API 密鑰的過程。生成後,請為您的密鑰提供一個名稱,然後單擊“創建新密鑰”選項以完成密鑰的創建。請務必安全地保留生成的 API 密鑰,因為出於安全考慮,可能無法通過您的 OpenAI 帳戶訪問它。如果您放錯地方或丟失密鑰,則必須創建另一個密鑰來代替它。
完整的源代碼可以通過 GitHub 存儲庫訪問,這為用戶提供了探索和利用項目內容的機會。
導入所需的庫
為了使用戶能夠利用已安裝在其虛擬環境中的軟件包,有必要通過導入操作來合併它們。
from langchain.document_loaders import PyPDFLoader, TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
通過檢查代碼,可以明顯看出該過程涉及在 LangChain 框架內導入必要的依賴項,從而授予對所述框架提供的全面功能的訪問權限。
加載文檔進行分析
首先,建立一個變量作為 API 密鑰的存儲庫。隨後應在腳本中使用該實體以進行驗證。
# Hardcoded API key
openai_api_key = "Your API key"
當分發可能與外部實體共享的生產級代碼時,建議避免將 API 密鑰等敏感信息直接合併到源代碼中。利用環境變量可以提供一種更安全、更實用的解決方案來管理共享上下文中的此類憑據,而不是實施此方法。
當然!以下是如何在 Python 中使用 PyPDF2 庫處理 PDF 文件和內置 open()
函數來讀取純文本文件來實現此功能的示例:pythonimport PyPDF2from io import BytesIOdef load_document(file_path):“”“從指定的文件路徑加載文檔。”””# 在嘗試打開之前檢查文件是否存在try:if not file_path.endswith(’.pdf’):# 文檔不是PDF 文件,因此嘗試以文本形式打開file 而不是open(file_path,‘r’) as f:return f.read()elif file_path.endswith(’.pdf’):
def load_document(filename):
if filename.endswith(".pdf"):
loader = PyPDFLoader(filename)
documents = loader.load()
elif filename.endswith(".txt"):
loader = TextLoader(filename)
documents = loader.load()
else:
raise ValueError("Invalid file type")
加載文檔後,該過程涉及創建“CharacterTextSplitter”的實例。所述拆分器負責將加載的文檔劃分為更易於管理的部分,每個部分由單獨的字符確定。
text_splitter = CharacterTextSplitter(chunk_size=1000,
chunk_overlap=30, separator="\n")
return text_splitter.split_documents(documents=documents)
將內容處理成更小的、有凝聚力的片段有助於有效處理並保持一定程度的相關上下文重疊,這在文本分析和數據檢索操作等工作中被證明是有益的。
查詢文檔
為了從提交的文檔中提取信息,請開發一個函數,該函數接受搜索詞以及數據檢索組件作為輸入。該函數將利用提供的檢索器與 Open AI 自然語言模型的實例相結合來建立 RetrievalQA 對象。
def query_pdf(query, retriever):
qa = RetrievalQA.from_chain_type(llm=OpenAI(openai_api_key=openai_api_key),
chain_type="stuff", retriever=retriever)
result = qa.run(query)
print(result)
本函數採用實例化問答模型來執行查詢並顯示結果。
創建主函數
主要功能通過接受用戶提供的文檔文件名輸入來控製程序的總體進程,然後加載指定的文檔。隨後,它建立了一個專為詞嵌入設計的OpenAIEmbeddings實例,並根據之前處理的文檔及其相應的詞嵌入構建了一個向量存儲庫。最終將構建的矢量數據庫以文件的形式保存到本地存儲介質中。
一旦持久層初始化並加載任何必要的數據,系統就會轉換到迭代階段,提示用戶通過文本界面提交查詢。在此過程中,主要功能被委託給“query_pdf”方法,該方法與初始化期間獲得的負責向量存儲庫檢索器一起被調用。此循環無限期地繼續,直到用戶決定通過輸入單詞“exit”來終止會話。
def main():
filename = input("Enter the name of the document (.pdf or .txt):\n")
docs = load_document(filename)
embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)
vectorstore = FAISS.from_documents(docs, embeddings)
vectorstore.save_local("faiss_index_constitution")
persisted_vectorstore = FAISS.load_local("faiss_index_constitution", embeddings)
query = input("Type in your query (type 'exit' to quit):\n")
while query != "exit":
query_pdf(query, persisted_vectorstore.as_retriever())
query = input("Type in your query (type 'exit' to quit):\n")
嵌入封裝了詞彙項之間存在的複雜互連,作為數字格式的書面或口頭語言的抽象表示。換句話說,向量提供了一種通過一系列數值來描繪文本段落的方法,從而能夠對語言數據進行計算處理和分析。
本代碼利用 OpenAIEmbeddings 生成的嵌入將文檔中的文本內容轉換為向量表示,隨後使用 FAISS(Facebook AI 相似性搜索)對這些向量表示進行索引,以方便快速檢索和比較相似的向量模式。這使得能夠對提交的文件進行審查。
當腳本作為獨立程序運行時,將 \_\_name\_\_
屬性與其相應的值 "\_\_main\_\_"
結合起來是執行 main 函數的重要步驟。通過採用這種構造,它允許在用戶交互時無縫執行主要功能,而不需要任何外部提示或乾預。
if __name__ == "__main__":
main()
該軟件程序作為基於終端的工具運行。作為一種增強,人們可以使用 Streamlit 通過互聯網為應用程序合併圖形用戶界面。
執行文檔分析
要執行文檔分析,請將要檢查的文檔放置在項目目錄中,然後啟動軟件應用程序。系統將通過提示您輸入完整的名稱來請求識別要分析的特定文檔。隨後,提供一系列查詢術語,該工具預計在審查過程中處理這些查詢術語。
本文提供的圖形表示描述了通過處理可移植文檔格式 (PDF) 文件獲得的結果,如本聲明下方的屏幕截圖所示。
隨後的顯示舉例說明了對包含編程代碼的文檔的檢查結果。
為了確保准確分析所需文件,它們必須採用 PDF 或文本格式。如果文檔採用其他文件類型,則可以使用各種在線資源將這些文件轉換為合適的 PDF 格式,以便進行徹底檢查和解釋。
了解大型語言模型背後的技術
LangChain 通過抽象複雜的技術細節,簡化了利用先進自然語言功能的應用程序的開發流程,使用戶能夠專注於其預期功能,而無需深入研究人工智能驅動的語言建模的複雜性。全面了解支持這些模型的底層技術非常重要,以便充分掌握正在開發的特定應用程序的操作。