|
import gradio as gr |
|
import os |
|
from langchain_google_genai import ChatGoogleGenerativeAI |
|
from langchain_google_genai import GoogleGenerativeAIEmbeddings |
|
from langchain.prompts import PromptTemplate |
|
from langchain_community.vectorstores import Chroma |
|
from langchain.text_splitter import CharacterTextSplitter |
|
from langchain.chains.combine_documents import create_stuff_documents_chain |
|
from langchain.chains import create_retrieval_chain |
|
from langchain_community.document_loaders import PyPDFLoader |
|
|
|
|
|
GOOGLE_API_KEY = "YOUR_GOOGLE_API_KEY" |
|
|
|
|
|
def process_pdf_and_question(pdf_file, question): |
|
|
|
llm = ChatGoogleGenerativeAI(model="gemini-pro", google_api_key=GOOGLE_API_KEY) |
|
embeddings = GoogleGenerativeAIEmbeddings(model="models/embedding-001", google_api_key=GOOGLE_API_KEY) |
|
|
|
|
|
temp_pdf_path = "temp_handbook.pdf" |
|
with open(temp_pdf_path, "wb") as f: |
|
f.write(pdf_file) |
|
|
|
|
|
loader = PyPDFLoader(temp_pdf_path) |
|
text_splitter = CharacterTextSplitter( |
|
separator=".", |
|
chunk_size=500, |
|
chunk_overlap=50, |
|
length_function=len, |
|
is_separator_regex=False, |
|
) |
|
pages = loader.load_and_split(text_splitter) |
|
|
|
|
|
vectordb = Chroma.from_documents(pages, embeddings) |
|
|
|
|
|
retriever = vectordb.as_retriever(search_kwargs={"k": 10}) |
|
|
|
|
|
template = """You are a helpful AI assistant. Answer based on the context provided. |
|
context: {context} |
|
input: {input} |
|
answer:""" |
|
prompt = PromptTemplate.from_template(template) |
|
combine_docs_chain = create_stuff_documents_chain(llm, prompt) |
|
retrieval_chain = create_retrieval_chain(retriever, combine_docs_chain) |
|
|
|
|
|
response = retrieval_chain.invoke({"input": question}) |
|
|
|
|
|
os.remove(temp_pdf_path) |
|
|
|
return response["answer"] |
|
|
|
|
|
iface = gr.Interface( |
|
fn=process_pdf_and_question, |
|
inputs=[ |
|
gr.File(label="上傳PDF手冊"), |
|
gr.Textbox(label="輸入您的問題") |
|
], |
|
outputs=gr.Textbox(label="回答"), |
|
title="PDF問答系統", |
|
description="上傳PDF手冊並提出問題,AI將根據手冊內容回答您的問題。" |
|
) |
|
|
|
|
|
iface.launch() |