У цій статті ми розглянемо, як побудувати додаток для розмовного асистента, який дозволяє користувачам взаємодіяти з 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