ETL
Данный модуль платформы Compressa позволяет извлекать данные из неструктурированных документов и нарезать их на чанки с учетом структуры документов. Это важно для эффективного поиска / RAG или использования в LLM.
Составим запрос на примере документа для сотрудников маркетплейса:
- Python (requests)
- cURL
# pip install requests, если у вас нет этой библиотеки
import requests
import os
# при локальном запуске замените на ваш url, например http://localhost:8080/api/v1/layout
# при локальном запуске вы можете не требовать API ключ или создать свой
# Скачиваем для примера PDF файл для сотрудников маркетплейса:
pdf_url = "https://docs.ozon.ru/company/attachments/6828150/6828198.pdf"
pdf_response = requests.get(pdf_url)
# Сохраняем файл
with open("ozon_guide.pdf", "wb") as file:
file.write(pdf_response.content)
# Отправляем файл для нарезки на чанки
compressa_url = "https://compressa-api.mil-team.ru/v1/layout"
headers = {
"Authorization": Bearer Ваш_API_ключ_Compressa",
"accept": "application/json",
}
# Указываем путь к нашему файлу
files = {"files": open("marketplace_guide.pdf", "rb")}
# Задаем параметры создания чанков
data = {
"output_format": "application/json",
"coordinates": "false",
"strategy": "fast",
"languages": ["rus", "eng"]
}
response = requests.post(
compressa_url,
headers=headers,
files=files,
data=data
)
# Выводим чанки документа в JSON формате
print(response.json())
# при локальном запуске замените на ваш url, например http://localhost:8080/api/v1/layout
# при локальном запуске вы можете не требовать API ключ или создать свой
curl -X POST "https://compressa-api.mil-team.ru/v1/layout" \
-H "Authorization: Bearer Ваш_API_ключ_Compressa" \
-H "accept: application/json" \
-F "files=@path/to/file.pdf" \
-F "xml_keep_tags=false" \
-F "output_format=application/json" \
-F "coordinates=false" \
-F "strategy=auto" \
-F "languages[]=rus" \
-F "languages[]=eng"
Ниже мы разберем подробнее часть настроек, полная схема API доступна здесь.
Стратегия обработки документа (strategy)
fast: стратегия "rule-based" использует традиционные техники извлечения на основе NLP для быстрого извлечения всех текстовых элементов. Стратегия "fast" не рекомендуется для файлов, со держащих сложные макеты, изображения и другие элементы визуального стиля.
hi_res: стратегия "model-based" определяет макет документа. Преимущество стратегии "hi_res" заключается в том, что она использует макет документа для получения дополнительной информации о его элементах. Мы рекомендуем использовать эту стратегию, если ваш случай использования требует высокой точности классификации элементов документа.
auto: cтратегия "auto" автоматически выбирает метод разбиения документа в зависимости от его характеристик и других переданных параметров.
Параметры чанкинга (нарезки текста)
max_characters (по умолчанию = 500) — жёсткий предел размера для одного блока. Ни один блок не будет превышать указанного количества символов. Если элемент сам по себе превышает этот размер, он будет разделён на два или более блоков с использованием текстового разбиения.
new_after_n_chars (по умолчанию = max_characters) — "мягкий" предел размера блока. Блок, который уже достиг этого количества символов, не будет расширен, даже если следующий элемент поместится без превышения жёсткого предела. Этот параметр можно использовать вместе с max_characters, чтобы задать "предпочтительный" размер, например: "Предпочитаю блоки около 1000 символов, но лучше взять блок размером 1500 (max_characters), чем прибегать к разбиению текста". Это можно задать как (..., max_characters=1500, new_after_n_chars=1000).
overlap (по умолчанию = 0) — при использовании текстового разбиения для разделения слишком большого блока, включается указанное количество символов с конца предыдущего блока в качестве префикса для следующего. Это помогает смягчить эффект разрыва семантической единицы, представленной большим элементом.
overlap_all (по умолчанию = False) — также применяет overlap между "обычными" блоками, а не только при разбиении больших элементов. Так как обычные блоки формируются из целых элементов, каждый из которых имеет чёткую семантическую границу, эта опция может добавить шума в нормальные блоки. Нужно учитывать специфику вашего случая использования, чтобы решить, подходит ли вам этот параметр.
Чтобы узнать больше о CompressaChunking на практическом примере — посмотрите наш гайд.