從文檔和數據中提取見解對於做出明智的決策至關重要。 然而,在處理敏感信息時會出現隱私問題。 LangChain,結合 OpenAI API,允許您分析本地文檔,而無需在線上傳。
他們通過將數據保存在本地、使用嵌入和矢量化進行分析以及在您的環境中執行流程來實現這一目標。 OpenAI 不使用客戶通過 API 提交的數據來訓練模型或改進服務。
設置您的環境
創建一個新的Python虛擬環境。 這將確保不存在庫版本衝突。 然後運行以下終端命令來安裝所需的庫。
pip install langchain openai tiktoken faiss-cpu pypdf
以下是如何使用每個庫的詳細信息:
- 浪鏈:您將使用它來創建和管理用於文本處理和分析的語言鏈。 它將提供文檔加載、文本分割、嵌入和矢量存儲模塊。
- OpenAI:您將使用它來運行查詢並從語言模型獲取結果。
- 抖音:您將使用它來計算給定文本中的標記(文本單位)數量。 這是為了在與交互時跟踪令牌計數 OpenAI API根據您使用的令牌數量收費。
- FAISS:您將使用它來創建和管理矢量存儲,從而可以根據嵌入快速檢索相似的矢量。
- pyPDF:該庫從 PDF 中提取文本。 它有助於加載 PDF 文件並提取其文本以進行進一步處理。
安裝所有庫後,您的環境現已準備就緒。
得到一個 OpenAI API密鑰
當您向 OpenAI API,您需要在請求中包含 API 密鑰。 此密鑰允許 API 提供商驗證請求是否來自合法來源,以及您是否擁有訪問其功能所需的權限。
為了獲得 OpenAI API 密鑰,繼續 OpenAI 平台。
然後,在右上角您帳戶的個人資料下,單擊 查看 API 密鑰。 這 API 密鑰 將出現頁面。
點擊 這 創建新的秘密 鑰匙 按鈕。 命名您的密鑰並單擊 創建新密鑰。 OpenAI 將生成您的 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 導入依賴庫。 這允許您使用 LangChain 框架的特定功能。
加載文檔進行分析
首先創建一個保存 API 密鑰的變量。 您稍後將在代碼中使用此變量進行身份驗證。
# Hardcoded API key
openai_api_key = "Your API key"
如果您打算與第三方共享代碼,則不建議對您的 API 密鑰進行硬編碼。 對於您打算分發的生產代碼,請改用環境變量。
接下來,創建一個加載文檔的函數。 該函數應加載 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")
加載文檔後,創建一個 字符文本分割器。 該分割器將根據字符將加載的文檔分割成更小的塊。
text_splitter = CharacterTextSplitter(chunk_size=1000,
chunk_overlap=30, separator="n")
return text_splitter.split_documents(documents=documents)
拆分文檔可確保塊的大小易於管理,並且仍然與某些重疊的上下文相關。 這對於文本分析和信息檢索等任務很有用。
查詢文檔
您需要一種方法來查詢上傳的文檔以從中獲取見解。 為此,創建一個函數,該函數接受 詢問 字符串和一個 獵犬 作為輸入。 然後它創建一個 檢索QA 實例使用 獵犬 和一個實例 OpenAI 語言模型。
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)
此函數使用創建的 QA 實例來運行查詢並打印結果。
創建主函數
主函數將控制整個程序流程。 它將接受用戶輸入的文檔文件名並加載該文檔。 然後創建一個 OpenAI 嵌入 嵌入實例並構造一個 矢量商店 基於加載的文檔和 嵌入。 將此矢量存儲保存到本地文件。
接下來,從本地文件加載持久向量存儲。 然後進入一個循環,用戶可以在其中輸入查詢。 這 主要的 函數將這些查詢傳遞給 查詢_pdf 與持久向量存儲的檢索器一起運行。 循環將繼續,直到用戶輸入“退出”。
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")
嵌入捕獲單詞之間的語義關係。 向量是一種可以表示文本片段的形式。
此代碼使用生成的嵌入將文檔中的文本數據轉換為向量 OpenAI 嵌入。 然後它使用索引這些向量 FAISS,用於有效檢索和比較相似向量。 這就是允許分析上傳的文檔的原因。
最後,如果用戶獨立運行程序,請使用 __name__ == “__main__” 構造來調用 main 函數:
if __name__ == "__main__":
main()
這個應用程序是一個命令行應用程序。 作為擴展,您可以使用 Streamlit 向應用程序添加 Web 界面。
執行文檔分析
要執行文檔分析,請將要分析的文檔存儲在與項目相同的文件夾中,然後運行程序。 它將詢問您要分析的文檔的名稱。 Enter 其全名,然後輸入程序的查詢進行分析。
下面的屏幕截圖顯示了分析 PDF 的結果。
以下輸出顯示了分析包含源代碼的文本文件的結果。
確保您要分析的文件是 PDF 或文本格式。 如果您的文檔是其他格式,您可以使用在線工具將其轉換為 PDF 格式。
了解大型語言模型背後的技術
LangChain 使用大型語言模型簡化了應用程序的創建。 這也意味著它抽象了幕後發生的事情。 要準確了解您正在創建的應用程序的工作原理,您應該熟悉大型語言模型背後的技術。