PDF-документы, являясь важным носителем корпоративной и личной информации, всегда представляли собой серьезную проблему в области обработки данных. С появлением модели Gemini 2.0 от Google DeepMind в этой области начались беспрецедентные изменения. В этой статье мы рассмотрим Gemini 2.0, как полностью изменить модель обработки PDF-файлов, и на примерах кода покажем, как использовать эту технологию для работы с различными типами PDF-документов.
Традиционные проблемы обработки PDF-файлов
В течение длительного времени преобразование PDF-документов в машиночитаемые структурированные данные было "большой проблемой" в области искусственного интеллекта и обработки данных. Традиционные решения можно условно разделить на три категории:
- сквозная модель с открытым исходным кодом: Часто перегружены сложностью верстки, с трудом распознают таблицы, графику и специальную типографику.
- Программа комбинирования нескольких моделейНапример, для развертывания nv-ingest от NVIDIA в Kubernetes требуется 8 сервисов и несколько GPU, что не только сложно, но и дорого для планирования.
- Коммерческие платные услуги: Несмотря на определенное удобство, точность при работе со сложными макетами оставляет желать лучшего, а стоимость при масштабном применении растет экспоненциально.
Этим решениям сложно найти баланс между точностью, масштабируемостью и экономической эффективностью, особенно когда речь идет о сценариях, в которых необходимо обработать сотни миллионов страниц документов, а стоимость зачастую оказывается непомерно высокой.

Настройка среды и установка Gemini 2.0
Чтобы начать использовать Gemini 2.0 для обработки PDF-документов, сначала нужно настроить среду и создать клиент для анализа. Вот конкретные шаги:
Установите необходимые библиотеки
%pip install "google-genai>=1"
Создание клиентов и конфигураций моделей
из google import genai
# Создайте клиента
api_key = "YOUR_API_KEY" # Замените на свой ключ API.
client = genai.Client(api_key=api_key)
# Определите модель, которая будет использоваться
model_id = "gemini-2.0-flash" # Также используйте "gemini-2.0-flash-lite-preview-02-05" или "gemini-2.0-pro-exp-02-05"
Загрузка и обработка файлов PDF
# Загрузка PDF-файла
invoice_pdf = client.files.upload(file="invoice.pdf", config={'display_name':'invoice'})
# Узнайте, в какое количество токенов преобразован файл
file_size = client.models.count_tokens(model=model_id, contents=invoice_pdf)
print(f'Файл: {invoice_pdf.display_name} равен {file_size.total_tokens} токенов')
# Вывод образца: Файл: счет-фактура равен 821 токену
Выполнив вышеописанные действия, мы завершили настройку базовой среды и успешно загрузили первый PDF-файл для обработки. Стоит отметить, что файловый API Gemini позволяет хранить до 20 ГБ файлов в одном проекте, максимум 2 ГБ на файл, а загруженные файлы сохраняются в течение 48 часов.
Практика извлечения структурированных данных в формате PDF
Мощной функцией Gemini 2.0 является возможность извлечения структурированных данных из PDF-файлов. Ниже на практических примерах мы покажем, как использовать модель Pydantic вместе с Gemini для достижения этой функции.
Определите общие методы извлечения данных
Во-первых, мы определяем общий метод для обработки PDF-файлов и возврата структурированных данных:
def extract_structured_data(file_path: str, model: BaseModel).
# Загрузка файла в File API
file = client.files.upload(file=file_path, config={'display_name': file_path.split('/')[-1].split('.') [0]})
# Генерирование структурированного ответа с помощью Gemini API
prompt = f "Извлеките структурированные данные из следующего PDF-файла"
response = client.models.generate_content(model=model_id,
contents=[prompt, file], config={'response_mime_content')
'response_schema': model})
# преобразует ответ в Pydantic-модель и возвращает ее
return response.parsed
Пример 1: извлечение данных из счета-фактуры
Для класса счетов-фактур PDF мы можем определить следующую модель для извлечения ключевой информации:
из pydantic import BaseModel, Field
class Item(BaseModel).
description: str = Field(description="Описание товара")
количество: float = Поле(description="Количество товара")
gross_worth: float = Field(description="Полная стоимость товара")
class Invoice(BaseModel).
"""Извлечение номера счета-фактуры, даты и всех элементов списка с описанием, количеством и стоимостью брутто, а также общей стоимостью брутто.""""
номер_фактуры: str = Field(description="Номер_фактуры, например, 1234567890")
дата: str = Поле(описание="Дата счета-фактуры, например 2024-01-01")
items: list[Item] = Field(description="Список товаров с описанием, количеством и валовой стоимостью")
total_gross_worth: float = Field(description="Общая валовая стоимость счета-фактуры")
# Извлеките данные с помощью этой модели
result = extract_structured_data("invoice.pdf", Invoice)
# Вывод результатов
print(f "Извлеченный счет-фактура: {result.invoice_number} на {result.date} с общей валовой стоимостью {result.total_gross_worth}")
for item in result.items: print(f "Item: {item_gross_worth}")
print(f "Товар: {item.description} с количеством {item.quantity} и общей стоимостью {item.gross_worth}")

Пример 2: обработка форм с рукописным содержимым
Для форм, содержащих рукописное содержимое, мы также можем определить специализированные модели:
class Form(BaseModel).
"""Извлекаем номер формы, дату начала и окончания финансового периода, а также плановые обязательства на начало и конец года.""""
номер_формы: str = Поле(описание="Номер_формы")
start_date: str = Field(description="Дата вступления в силу")
beginning_of_year: float = Field(description="Обязательства по плану на начало года")
end_of_year: float = Field(description="Обязательства плана на конец года")
# Извлечение данных
result = extract_structured_data("handwriting_form.pdf", Form)
# Вывод результатов
print(f'Извлеченный номер формы: {result.form_number} с датой начала {result.start_date}. \nПлановые обязательства начало года {result.beginning_of_year} и конец года {result.end_of_year}')
# Пример вывода: извлеченный номер формы: CA530082 с датой начала 02/05/2022.
# Плановые обязательства на начало года 40000.0 и на конец года 55000.0
На примере выше мы видим, что Gemini 2.0 может точно определить текстовое содержимое PDF-файла, включая рукописный текст, и преобразовать его в структурированный формат данных JSON, значительно упрощая процесс извлечения данных.
Расширенные приложения: разбивка документов и семантическое понимание
В системах RAG (Retrieval Augmented Generation) структурирование документов является ключевым этапом в дополнение к основному извлечению текста, и Gemini 2.0 позволяет нам выполнять и OCR, и семантическое структурирование за один этап.
Пример семантического расщепления в PDF
Вот совет, как конвертировать PDF в Markdown и одновременно выполнять семантическую разбивку:
CHUNKING_PROMPT = """OCR следующей страницы в Markdown. Таблицы должны быть отформатированы как HTML.
Не окружать вывод тройными обратными знаками.
Разбейте документ на части примерно по 250-1000 слов. Наша цель -
Наша цель - определить части страницы с одинаковой семантической темой.
Эти фрагменты будут встроены и использованы в конвейере RAG.
Окружите фрагменты html-тегами."""".
# использует этот запрос для обработки
response = client.models.generate_content(
model=model_id,
contents=[CHUNKING_PROMPT, pdf_file]
)
chunked_content = response.text
Этот подход определяет семантические границы документа и генерирует более осмысленные фрагменты текста, значительно повышая точность последующего поиска. По сравнению с традиционной механической разбивкой на части, основанной на количестве символов, семантическая разбивка лучше сохраняет связность и целостность содержания.
Извлечение сложных данных с помощью Pydantic
Для более сложных сценариев мы можем определить вложенные модели Pydantic для работы с несколькими уровнями данных:
class Person(BaseModel): first_name: str = Field(description="Первое имя человека")
first_name: str = Field(description="Первое имя человека")
last_name: str = Field(description="Фамилия человека")
last_name: str = Поле(description="Фамилия человека") last_name: str = Поле(description="Фамилия человека")
work_topics: list[Topic] = Field(description="Области интересов человека, если не указано, верните пустой список")
# Сгенерируйте ответ, используя модель Person
prompt = "Филипп Шмид - старший инженер по связям с разработчиками ИИ в Google DeepMind, работающий над Gemini, Gemma с миссией помочь каждому разработчику ответственно подходить к созданию ИИ и получать от него пользу".
response = client.models.generate_content(
model=model_id,
contents=prompt,
config={'response_mime_type': 'application/json', 'response_schema': Person}
)
SDK # автоматически преобразует ответ в модель Pydantic
philipp: Person = response.parsed
print(f "First name is {philipp.first_name}")
Оптимизация производительности и лучшие практики
Вот несколько лучших практик для повышения эффективности и точности при обработке PDF-документов в масштабе:
Пакетная обработка и оптимизация токенов
При необходимости работы с большим количеством PDF-сцен вы можете выполнить пакетную обработку для повышения эффективности:
async def batch_process_pdfs(file_paths, model, batch_size=10):: results = [].
results = []
for i in range(0, len(file_paths), batch_size):: batch = file_paths[i:i+batch_size): batch = file_paths[i:i
batch = file_paths[i:i+batch_size]: results = [] for i in range(0, len(file_paths), batch_size).
tasks = [extract_structured_data(path, model) for path in batch].
batch_results = await asyncio.gather(*tasks)
results.extend(batch_results)
print(f "Processed batch {i//batch_size + 1}/{(len(file_paths)+batch_size-1)//batch_size}")
возврат результатов
Выбор модели и контроль затрат
Выбор правильного варианта модели в соответствии с реальными требованиями может значительно сократить расходы:
- Gemini 2.0 Flash: Лучший выбор для сценариев общего назначения при отличном соотношении цена/производительность
- Gemini 2.0 Flash-Light:: Обеспечивает лучшее соотношение цены и качества для простых документов
- Gemini 2.0 Pro: Работа с чрезвычайно сложными документами или сценами, требующими высокой точности.
Ниже приводится сравнение эффективности обработки данных в различных моделях:
моделирование | Обработка страниц PDF на доллар (преобразование в Markdown) |
---|---|
Gemini 2.0 Flash | Около 6 000 страниц |
Gemini 2.0 Flash Lite | Около 12 000 страниц |
Gemini 1.5 Flash | Около 10 000 страниц |
OpenAI 4-mini | Около 450 страниц |
OpenAI 4o | Около 200 страниц |
Антропный Клод-3.5 | Около 100 страниц |
Обработка ошибок и механизм повторных попыток
В производственной среде очень важно реализовать надежные механизмы обработки ошибок:
def extract_with_retry(file_path, model, max_retries=3):: for attempt in range(max_retries)
for attempt in range(max_retries).
try.
return extract_structured_data(file_path, model):: for attempt in range(max_retries): try.
except Exception as e: if attempt == max_retries
if attempt == max_retries - 1: print(f "Не удалось добраться до файла.
print(f "Не удалось обработать {file_path} после {max_retries} попыток: {e}")
return None
print(f "Попытка {attempt+1} не удалась, повторная попытка: {e}")
time.sleep(2 ** попытка) # экспоненциальная стратегия повторных попыток

Оптимизация обработки форм
Для PDF-файлов, содержащих сложные формы, можно использовать следующие слова-подсказки, чтобы повысить точность распознавания форм:
TABLE_EXTRACTION_PROMPT = """Извлеките все таблицы из PDF в виде HTML-таблиц.
Сохраните точную структуру, включая объединенные ячейки, заголовки и форматирование.
Каждая таблица должна быть семантически полной и сохранять связи между ячейками.
Для числовых значений сохраните их точный формат, как показано в документе.""""
заключительные замечания
С помощью методов и примеров кода, представленных в этой статье, вы уже можете начать использовать Gemini 2.0 для создания мощной системы обработки PDF-документов. От простого извлечения текста до сложного разбора структурированных данных, а затем семантического чанкинга, Gemini 2.0 показали отличную производительность и очень низкую стоимость.
Хотя в таких областях, как распознавание ограничительных рамок, еще есть куда стремиться, но по мере развития технологий у нас есть основания полагать, что будущее обработки PDF станет более интеллектуальным и эффективным. При необходимости крупномасштабной обработки документов для частных лиц или организаций Gemini 2.0, несомненно, заслуживает внимания и внедрения технологических прорывов.