app.py import streamlit as st from PyPDF2 import PdfReader from langchain.text_splitter import Recur...
app.py import streamlit as st from PyPDF2 import PdfReader from langchain.text_splitter import RecursiveCharacterTextSplitter import os from langchain_google_genai import GoogleGenerativeAIEmbeddings import google.generativeai as genai from langchain.vectorstores import FAISS from langchain_google_genai import ChatGoogleGenerativeAI from langchain.chains.question_answering import load_qa_chain from langchain.prompts import PromptTemplate from dotenv import load_dotenv load_dotenv() os.getenv("GOOGLE_API_KEY") genai.configure(api_key=os.getenv("GOOGLE_API_KEY")) def get_pdf_text(pdf_docs): text="" for pdf in pdf_docs: pdf_reader= PdfReader(pdf) for page in pdf_reader.pages: text+= page.extract_text() return text def get_text_chunks(text): text_splitter = RecursiveCharacterTextSplitter(chunk_size=10000, chunk_overlap=1000) chunks = text_splitter.split_text(text) return chunks def get_vector_store(text_chunks): embeddings = GoogleGenerativeAIEmbeddings(model = "models/embedding-001") vector_store = FAISS.from_texts(text_chunks, embedding=embeddings) vector_store.save_local("faiss_index") def get_conversational_chain(): prompt_template = """ Answer the question as detailed as possible from the provided context, make sure to provide all the details, if the answer is not in provided context just say, "answer is not available in the context", don't provide the wrong answer\n\n Context:\n {context}?\n Question: \n{question}\n Answer: """ model = ChatGoogleGenerativeAI(model="gemini-pro", temperature=0.3) prompt = PromptTemplate(template = prompt_template, input_variables = ["context", "question"]) chain = load_qa_chain(model, chain_type="stuff", prompt=prompt) return chain def user_input(user_question): embeddings = GoogleGenerativeAIEmbeddings(model = "models/embedding-001") new_db = FAISS.load_local("faiss_index", embeddings) docs = new_db.similarity_search(user_question) chain = get_conversational_chain() response = chain( {"input_documents":docs, "question": user_question} , return_only_outputs=True) print(response) st.write("Reply: ", response["output_text"]) def main(): st.set_page_config("Chat PDF") st.header("Chat with PDF using Gemini💁") user_question = st.text_input("Ask a Question from the PDF Files") if user_question: user_input(user_question) with st.sidebar: st.title("Menu:") pdf_docs = st.file_uploader("Upload your PDF Files and Click on the Submit & Process Button", accept_multiple_files=True) if st.button("Submit & Process"): with st.spinner("Processing..."): raw_text = get_pdf_text(pdf_docs) text_chunks = get_text_chunks(raw_text) get_vector_store(text_chunks) st.success("Done") if __name__ == "__main__": main() requirement.txt streamlit google-generativeai python-dotenv langchain PyPDF2 chromadb faiss-cpu langchain_google_genai google Gemini API Key Get API key | Google AI Studio 要獲得 Google API 金鑰,您需要完成以下步驟: 訪問 Google Cloud Platform 控制台:首先,您需要訪問 Google Cloud Platform 控制台。 創建或選擇一個項目:在控制台中,點擊項目下拉選單,然後選擇一個現有項目或創建一個新項目。 創建 API 金鑰: 在控制台中,點擊左側菜單並選擇「API和服務 > 憑證」。 在「憑證」頁面上,點擊「創建憑證」然後選擇「API 金鑰」。 配置 API 金鑰: 創建 API 金鑰後,系統會顯示一個對話框,其中包含您的新 API 金鑰。 在將其用於生產環境之前,您應該點擊「限制金鑰」進行相應的配置。 啟用 API 和服務: 回到控制台主頁面,點擊「儀表板」然後選擇「啟用 API 和服務」。 在跳轉的頁面上,搜索並選擇您想要啟用的服務,如「Maps JavaScript API」,然後點擊「啟用」。 完成以上步驟後,您就可以在應用程序中使用 Google API 金鑰了。請記住,為了保障安全,合理地管理和使用您的 API 金鑰。 有關詳細的步驟和圖像指南,您可以參考 Webkul 的blog:如何獲得 Google API 金鑰。此外,Google AI 的官方開發者文檔也提供了相關資訊和指南:獲取 API 金鑰 | Google AI。 https://deepmind.google/technologies/gemini/#introduction: google Gemini介紹 https://ai.google.dev :google gemini API Key reference https://makersuite.google.com/app/apikey 以下為這個app部署的詳細筆記: 這個 Python 檔案 (app.py) 描述了一個利用 Streamlit 和 LangChain 搭建的、以 PDF 文件為數據源的聊天式問答應用程序。以下是對代碼的逐步解釋和分析: 代碼解釋與分析 1. 導入必要模塊和配置環境 import streamlit as st from PyPDF2 import PdfReader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_google_genai import GoogleGenerativeAIEmbeddings import google.generativeai as genai from langchain.vectorstores import FAISS from langchain_google_genai import ChatGoogleGenerativeAI from langchain.chains.question_answering import load_qa_chain from langchain.prompts import PromptTemplate from dotenv import load_dotenv load_dotenv() os.getenv("GOOGLE_API_KEY") genai.configure(api_key=os.getenv("GOOGLE_API_KEY")) 含義:這部分代碼導入了用於構建應用的多個 Python 庫,包括用於讀取 PDF 文件的 PyPDF2,以及用於處理文本和建立問答鏈的 LangChain 相關模組。同時,從 .env 文件加載環境變量並配置 Google API 金鑰。 2. 定義處理 PDF 文本的函數 def get_pdf_text(pdf_docs): text="" for pdf in pdf_docs: pdf_reader= PdfReader(pdf) for page in pdf_reader.pages: text+= page.extract_text() return text def get_text_chunks(text): text_splitter = RecursiveCharacterTextSplitter(chunk_size=10000, chunk_overlap=1000) chunks = text_splitter.split_text(text) return chunks def get_vector_store(text_chunks): embeddings = GoogleGenerativeAIEmbeddings(model = "models/embedding-001") vector_store = FAISS.from_texts(text_chunks, embedding=embeddings) vector_store.save_local("faiss_index") def get_conversational_chain(): prompt_template = """ Answer the question as detailed as possible from the provided context, make sure to provide all the details, if the answer is not in provided context just say, "answer is not available in the context", don't provide the wrong answer\n\n Context:\n {context}?\n Question: \n{question}\n Answer: """ model = ChatGoogleGenerativeAI(model="gemini-pro", temperature=0.3) prompt = PromptTemplate(template = prompt_template, input_variables = ["context", "question"]) chain = load_qa_chain(model, chain_type="stuff", prompt=prompt) return chain 3. 用戶交互和應用邏輯 def user_input(user_question): embeddings = GoogleGenerativeAIEmbeddings(model = "models/embedding-001") new_db = FAISS.load_local("faiss_index", embeddings) docs = new_db.similarity_search(user_question) chain = get_conversational_chain() response = chain( {"input_documents":docs, "question": user_question} , return_only_outputs=True) print(response) st.write("Reply: ", response["output_text"]) def main(): st.set_page_config("Chat PDF") st.header("Chat with PDF using Gemini💁") user_question = st.text_input("Ask a Question from the PDF Files") if user_question: user_input(user_question) with st.sidebar: st.title("Menu:") pdf_docs = st.file_uploader("Upload your PDF Files and Click on the Submit & Process Button", accept_multiple_files=True) if st.button("Submit & Process"): with st.spinner("Processing..."): raw_text = get_pdf_text(pdf_docs) text_chunks = get_text_chunks(raw_text) get_vector_store(text_chunks) st.success("Done") if __name__ == "__main__": main() 含義:user_input 函數處理用戶提出的問題,並從之前建立的向量存儲中檢索相關文本。main 函數是整個 Streamlit 應用的入口,設置頁面配置、處理文件上傳、以及用戶問答。 學習知識點與總結 Streamlit 應用部署:這個代碼示例展示了如何使用 Streamlit 建立一個互動式網頁應用。Streamlit 非常適合快速開發並部署數據科學和 AI 應用。 LangChain 與 Google Generative AI 的整合:代碼通過 LangChain 與 Google Generative AI 的整合,將 PDF 文本轉換為可供搜索的向量數據。 PDF 處理與文本分割:使用 PyPDF2 處理 PDF 文件並提取文本是常見的數據預處理步驟。文本分割則對應於處理大型文檔的需要。 向量存儲與相似度搜索:使用 FAISS 建立高效的向量存儲,進行快速的相似度搜索,是構建高效問答系統的關鍵。 構建問答鏈:通過設計合適的提示模板,並利用 LangChain 提供的功能,可以創建靈活且高效的問答系統。 總體來說,這個代碼提供了一個實用的框架,用於從 PDF 文件中提取信息,並建立一個基於這些信息的問答系統。它集成了文本處理、向量搜索和自然語言處理的多個方面,展示了現代 AI 應用開發的多方面技能。 衍生知識: 以下為使用 Google Gemini API 可以完成的衍生案例,這些案例能夠與 LangChain API 連結。以下是其中一些應用的概念: 圖像分析和文本生成:使用 Google Gemini API 的一個案例是對圖像進行分析並生成相關的文本。例如,您可以將食物相關的圖像提供給 Gemini Pro 模型,並詢問有關該圖像的問題,比如該食物的總熱量。這種案例可以通過 Python 腳本實現,並在終端機運行該腳本以獲取回應。 How to Access and Use Google Gemini API Key (with Examples) | Beebom 聊天格式的交互:另一個案例是在終端機窗口中使用 Gemini Pro 模型進行聊天。這種方式允許您在不必在代碼中更改問題並重新運行 Python 文件的情況下,直接在終端機窗口中繼續對話。Google 已經在模型中實現了聊天歷史的功能,因此您不需要手動在數組或列表中附加回應和管理聊天歷史。 多模態能力的探索:Gemini LLM 作為一個多模態模型,能夠處理和分析不同類型的輸入數據。例如,您可以利用 Gemini Pro Vision 模型處理圖像輸入並根據圖像生成文本。這包括加載圖像、創建新的視覺模型,並使用 GenerativeModel.generative_content() 函數輸入圖像和必要的文本提示https://addepto.com/blog/building-an-llm-model-using-google-gemini-api/。 建立 PPT 摘要器:另一個案例涉及使用 Streamlit 和 Gemini Vision API 建立 PowerPoint 摘要器。這個應用程序將 PPT 轉換為圖像,然後生成每個幻燈片的摘要。用戶可以上傳 PPT 文件,然後應用程序會顯示每個幻燈片的摘要Building PPT Summarizer Using Streamlit and Gemini Vision API (analyticsvidhya.com)。 這些案例展示了 Gemini API 在文本生成、圖像分析和多模態應用中的多樣性。此外,將這些功能與 LangChain API 結合,可以創建更複雜的應用,比如結合文本和視覺數據的問答系統,或是利用這些技術來增強用戶體驗的互動式聊天機器人。這些案例不僅展示了 AI 技術的能力,也為開發者提供了豐富的創新可能性。