Чат з PDF за допомогою Flash Gemini 2.0: Створення додатку на Streamlit для запитів до PDF у формі діалогу

У цій статті ми розглянемо, як побудувати додаток для розмовного асистента, який дозволяє користувачам взаємодіяти з PDF-документами за допомогою потужності моделі Flash Gemini 2.0. Цей додаток на базі Streamlit обробляє PDF-документи, індексує їхній вміст і дозволяє користувачам ставити детальні питання про документ, використовуючи інтерфейс природної мови.

Вступ

Однією з поширених проблем, з якою стикаються користувачі, є швидке отримання інформації з великих PDF-документів. Чи то наукова стаття, інструкція користувача чи офіційний звіт, вручну переглядати сторінки може бути дуже часозатратним. Щоб вирішити цю проблему, ми можемо створити інтерактивного чат-бота для PDF, який використовує сучасні моделі штучного інтелекту, такі як Flash Gemini 2.0, для реального часу відповіді на питання з завантажених PDF-документів.

Цей додаток поєднує кілька передових технологій:

  • Streamlit: Для створення інтерактивного веб-інтерфейсу.
  • LangChain: Для інтеграції потужної моделі Flash Gemini 2.0, щоб обробляти запити природною мовою.
  • FAISS: Бібліотека для ефективного пошуку схожості серед великих колекцій тексту.
  • Google Generative AI: Для використання вбудованих векторів і моделей для ведення діалогів.

Давайте заглибимося в код, щоб зрозуміти, як це працює.

Огляд коду

1. Налаштування середовища

Ми починаємо з підключення необхідних бібліотек і налаштування API-ключа Google для доступу до сервісів Google Generative AI. Це включає конфігурацію змінних середовища за допомогою файлів .env.

from dotenv import load_dotenv  
import os  
from langchain_google_genai import GoogleGenerativeAIEmbeddings  
import google.generativeai as genai  

# Завантажуємо змінні середовища  
load_dotenv()  
os.getenv("GOOGLE_API_KEY")  
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))

2. Витягування тексту з PDF

Щоб додаток міг обробляти завантажені PDF, нам потрібна функція, яка витягує текст з файлів. Ми використовуємо бібліотеку PyPDF2, щоб прочитати та витягнути текст з кожної сторінки завантажених PDF-документів.

from PyPDF2 import PdfReader  

def get_pdf_text(pdf_docs):  
 """Витягує текст із завантажених PDF файлів."""  
 text = ""  
 for pdf in pdf_docs:  
 pdf_reader = PdfReader(pdf)  
 for page in pdf_reader.pages:  
 text += page.extract_text()  
 return text

3. Розбиття тексту на частини

Обробка великих блоків тексту за один раз може бути неефективною. Щоб це подолати, ми розбиваємо витягнутий текст на менші частини за допомогою RecursiveCharacterTextSplitter з LangChain. Це забезпечує можливість індексації тексту для ефективного пошуку.

from langchain.text_splitter import RecursiveCharacterTextSplitter  

def get_text_chunks(text):  
 """Розбиває витягнутий текст на керовані частини."""  
 text_splitter = RecursiveCharacterTextSplitter(chunk_size=10000, chunk_overlap=1000)  
 chunks = text_splitter.split_text(text)  
 return chunks

4. Створення векторного сховища з FAISS

Тепер ми створюємо індекс FAISS, який зберігає векторизовані представлення (вбудовані вектори) текстових частин. Ці вектори генеруються за допомогою генеруючої моделі Google, що дозволяє здійснювати семантичний пошук для отримання релевантних частин на основі запитів користувача.

from langchain.vectorstores import FAISS  
from langchain_google_genai import GoogleGenerativeAIEmbeddings  

def get_vector_store(text_chunks):  
 """Створює і зберігає векторне сховище FAISS з текстових частин."""  
 embeddings = GoogleGenerativeAIEmbeddings(model="models/embedding-001")  
 vector_store = FAISS.from_texts(text_chunks, embedding=embeddings)  
 vector_store.save_local("faiss_index")

5. Налаштування розмовного ланцюга

Для взаємодії з користувачем і відповіді на питання на основі контексту (вмісту PDF) ми налаштовуємо розмовний ланцюг за допомогою моделі ChatGoogleGenerativeAI з LangChain.
Ланцюг використовуватиме шаблон запиту, який визначає, як відповідати на питання на основі наданого контексту.

from langchain.prompts import PromptTemplate  
from langchain.chains.question_answering import load_qa_chain  
from langchain_google_genai import ChatGoogleGenerativeAI  

def get_conversational_chain():  
 """Налаштовує розмовний ланцюг за допомогою моделі Flash Gemini 2.0."""  
 prompt_template = """  
 Відповідайте на питання настільки детально, наскільки це можливо, на основі наданого контексту. Якщо відповідь не міститься в  
 наданому контексті, просто скажіть: "відповідь відсутня в контексті". Не надавайте некоректних відповідей.  

 Контекст:  
 {context}?  

 Питання:  
 {question}  

 Відповідь:  
 """  

 model = ChatGoogleGenerativeAI(model="gemini-2.0-flash-exp", temperature=0.3)  
 prompt = PromptTemplate(template=prompt_template, input_variables=["context", "question"])  
 chain = load_qa_chain(model, chain_type="stuff", prompt=prompt)  
 return chain

6. Обробка запитів користувачів

Після того як вміст PDF-документів буде індексований, ми можемо обробляти запити користувачів. Коли користувач подає питання, додаток виконує пошук схожості по індексі FAISS, щоб знайти найбільш релевантні частини документа, а потім використовує розмовний ланцюг для генерації відповіді.

def user_input(user_question):  
 """Обробляє запити користувачів, отримуючи відповіді з векторного сховища."""  
 embeddings = GoogleGenerativeAIEmbeddings(model="models/embedding-001")  

 new_db = FAISS.load_local("faiss_index", embeddings, allow_dangerous_deserialization=True)  
 docs = new_db.similarity_search(user_question)  

 chain = get_conversational_chain()  

 response = chain(  
 {"input_documents": docs, "question": user_question},  
 return_only_outputs=True  
 )  

 st.markdown(f"### Відповідь:\n{response['output_text']}")

7. Інтерфейс Streamlit

Основна частина додатку — це інтерфейс Streamlit, який дозволяє користувачам завантажувати PDF-документи, обробляти їх і взаємодіяти з чат-ботом. Інтерфейс також відображає відповіді на запити користувачів.

import streamlit as st  

def main():  
 """Основна функція для запуску додатку Streamlit."""  
 st.set_page_config(page_title="Chat PDF", page_icon=":books:", layout="wide")  
 st.title("Чат з PDF за допомогою Flash Gemini 2.0 :smile:")  

 st.sidebar.header("Завантажте та обробіть PDF-файли")  
 st.sidebar.markdown("Використовуйте модель Flash Gemini 2.0 для покращених розмовних можливостей.")  

 with st.sidebar:  
 pdf_docs = st.file_uploader(  
 "Завантажте ваші PDF-файли:",  
 accept_multiple_files=True,  
 type=["pdf"]  
 )  
 if st.button("Подати та обробити"):  
 with st.spinner("Обробляємо ваші файли..."):  
 raw_text = get_pdf_text(pdf_docs)  
 text_chunks = get_text_chunks(raw_text)  
 get_vector_store(text_chunks)  
 st.success("PDF оброблені та індексовані успішно!")  

 st.markdown(  
 "### Задавайте питання з ваших PDF-файлів :mag:\n"  
 "Після того, як ви завантажите та обробите свої PDF-документи, задайте питання нижче."  
 )  

 user_question = st.text_input("Введіть своє питання:", placeholder="Що ви хочете дізнатися?")  

 if user_question:  
 with st.spinner("Отримуємо вашу відповідь..."):  
 user_input(user_question)  

 st.sidebar.info(  
 "**Примітка:** Цей додаток використовує модель Flash Gemini 2.0 для точного відповідання на питання."  
 )  

if __name__ == "__main__":  
 main()

8. Запуск додатку

Щоб запустити цей додаток, просто виконайте наступну команду:

streamlit run chat_pdf.py

Це запустить веб-інтерфейс Streamlit, де користувачі зможуть завантажувати PDF-файли, ставити питання і отримувати відповіді на основі вмісту документа.

Висновок

Цей додаток демонструє, як моделі штучного інтелекту, такі як Flash Gemini 2.0, можна інтегрувати з такими інструментами, як LangChain, FAISS і Streamlit для створення потужних інтерактивних додатків.
Незалежно від того, чи працюєте ви з науковими статтями, посібниками чи будь-яким іншим типом документів, це рішення дозволяє легко витягувати знання з PDF-файлів та отримувати детальні відповіді в реальному часі.

Використовуючи потужність генеративного штучного інтелекту та пошуку за векторами, ми можемо створювати більш розумні та ефективні способи взаємодії з документами та інформацією.

Перекладено з: Chat with PDF Using Flash Gemini 2.0: A Streamlit App for Conversational PDF Querying

Leave a Reply

Your email address will not be published. Required fields are marked *