A newer version of the Gradio SDK is available:
6.6.0
Пакетне тестування генерації правових позицій
Опис функціоналу
Нова закладка "📊 Пакетне тестування" дозволяє проводити масове тестування генерації правових позицій із текстів судових рішень, завантажених з CSV файлу.
Як користуватися
1. Підготовка CSV файлу
CSV файл повинен містити обов'язкову колонку text з текстами судових рішень:
id_lp,text
1,"Текст судового рішення 1..."
2,"Текст судового рішення 2..."
3,"Текст судового рішення 3..."
Приклади тестових файлів:
test_docs/test_sample.csv- простий приклад для демонстраціїtest_docs/df_lp_part_cd_test_29_result.csv- повний набір тестових даних
2. Використання інтерфейсу
Відкрийте закладку "📊 Пакетне тестування"
Виберіть провайдера та модель LLM:
- Провайдер AI: OpenAI, Anthropic, Gemini, DeepSeek
- Модель генерації: відповідна модель обраного провайдера
Налаштуйте паузу між запитами:
- Використовуйте слайдер "⏱️ Пауза між запитами (секунди)"
- Діапазон: від 0 до 10 секунд
- За замовчуванням: 1 секунда
- Крок: 0.5 секунди
- Рекомендації:
- 0-1 сек: для швидкої обробки малих обсягів
- 1-2 сек: оптимально для більшості випадків
- 3-5 сек: для уникнення rate limits при великих обсягах
- 5-10 сек: для консервативної обробки або при обмеженнях API
Завантажте CSV файл:
- Натисніть "📁 Завантажте CSV файл з тестовими даними"
- Виберіть ваш CSV файл
- Натисніть "📂 Завантажити CSV файл"
- Перевірте попередній перегляд завантажених даних
Запустіть пакетне тестування:
- Натисніть "▶️ Запустити пакетне тестування"
- Слідкуйте за прогресом обробки
- Дочекайтеся завершення
Завантажте результати:
- Після завершення з'явиться кнопка "📥 Завантажити результати"
- Файл буде збережено у папці
test_results/ - Назва файлу містить назву моделі та мітку часу
3. Формат результатів
Результуючий CSV файл містить:
- Всі оригінальні колонки з вхідного файлу
- Нова колонка з назвою моделі (наприклад,
gemini-3.0-flash,gpt-4o-mini,claude-3-5-sonnet-20241022) - У новій колонці - повний JSON об'єкт з усіма полями правової позиції
Приклад результату:
id_lp,text,gemini-3.0-flash
1,"Текст судового рішення 1...","{""title"": ""Заголовок позиції"", ""text"": ""Текст правової позиції"", ""proceeding"": ""Кримінальне судочинство"", ""category"": ""Категорія""}"
2,"Текст судового рішення 2...","{""title"": ""Заголовок позиції 2"", ""text"": ""Текст правової позиції 2"", ""proceeding"": ""Цивільне судочинство"", ""category"": ""Категорія 2""}"
Структура JSON об'єкту:
{
"title": "Заголовок судового рішення",
"text": "Текст короткого змісту позиції суду",
"proceeding": "Тип судочинства",
"category": "Категорія судового рішення"
}
Приклад реального результату:
{
"title": "Обчислення розміру відшкодування шкоди, заподіяної внаслідок незаконного добування (збирання) або знищення цінних видів водних біоресурсів",
"text": "Обчислення розміру відшкодування шкоди, заподіяної внаслідок незаконного добування (збирання) або знищення цінних видів водних біоресурсів, можливо здійснювати на підставі Такс, затверджених постановою КМУ від 21.11.2011 № 1209, без проведення експертизи.",
"proceeding": "Кримінальне судочинство",
"category": "Встановлення розміру шкоди (стаття 135)"
}
4. Обробка результатів
Після завантаження CSV файлу з результатами, ви можете:
- Парсити JSON у Python:
import pandas as pd
import json
# Завантажити результати
df = pd.read_csv('test_results/batch_test_results_gemini-3.0-flash_20260103_120000.csv')
# Парсити JSON з колонки моделі
df['parsed'] = df['gemini-3.0-flash'].apply(json.loads)
# Витягти окремі поля
df['title'] = df['parsed'].apply(lambda x: x['title'])
df['text'] = df['parsed'].apply(lambda x: x['text'])
df['proceeding'] = df['parsed'].apply(lambda x: x['proceeding'])
df['category'] = df['parsed'].apply(lambda x: x['category'])
- Експортувати у зручний формат:
# Розгорнути JSON в окремі колонки
df_expanded = pd.concat([df.drop(['gemini-3.0-flash', 'parsed'], axis=1),
pd.json_normalize(df['parsed'])], axis=1)
# Зберегти у новий CSV з розгорнутими полями
df_expanded.to_csv('results_expanded.csv', index=False)
Алгоритм роботи
- Завантаження CSV файлу - система зчитує файл та перевіряє наявність колонки
text - Валідація - перевірка формату та коректності даних
- Пакетна генерація - для кожного рядка:
- Зчитується текст з колонки
text - Виконується генерація правової позиції з використанням
LEGAL_POSITION_PROMPT - Повний JSON результат (з усіма полями: title, text, proceeding, category) записується в нову колонку
- Зчитується текст з колонки
- Збереження - результати зберігаються у файл з міткою часу
Технічні деталі
Використовувані файли та функції
Основні файли:
interface.py- інтерфейс користувача (нова закладка)prompts.py- промптLEGAL_POSITION_PROMPTдля генераціїmain.py- функціяgenerate_legal_position()для генерації
Нові функції в interface.py:
async def load_csv_file(file) -> Tuple[str, Optional[pd.DataFrame]]
"""Завантаження та валідація CSV файлу"""
async def process_batch_testing(
df: pd.DataFrame,
provider: str,
model_name: str,
progress=gr.Progress()
) -> Tuple[str, Optional[str]]
"""Пакетна обробка тестових даних"""
Структура директорій
Legal_Position_2/
├── test_docs/ # Тестові CSV файли
│ ├── test_sample.csv
│ └── df_lp_part_cd_test_29_result.csv
├── test_results/ # Результати пакетного тестування
│ └── batch_test_results_<model>_<timestamp>.csv
├── interface.py # Інтерфейс з новою закладкою
├── prompts.py # Промпти для генерації
└── main.py # Основна логіка генерації
Обробка помилок
Система обробляє наступні випадки:
- Відсутність колонки
textу CSV файлі - Помилки кодування (підтримується UTF-8 та CP1251)
- Помилки генерації для окремих рядків (записується текст помилки)
- Помилки збереження результатів
Продуктивність
- Прогрес-бар - показує поточний стан обробки
- Послідовна обробка - рядки обробляються один за одним
- Пауза між запитами - налаштовується для уникнення rate limits
- Час виконання - залежить від:
- Кількості рядків у CSV файлі
- Швидкості відповіді API провайдера
- Налаштованої паузи між запитами
Приклад розрахунку часу:
- 100 рядків × (3 сек на запит + 1 сек пауза) =
400 секунд (6.7 хвилин) - 100 рядків × (3 сек на запит + 0 сек пауза) =
300 секунд (5 хвилин) - 10 рядків × (3 сек на запит + 1 сек пауза) = ~40 секунд
Підтримувані провайдери та моделі
- OpenAI: GPT-4o, GPT-4o-mini, GPT-4-turbo та інші
- Anthropic: Claude 3.5 Sonnet, Claude 3 Opus та інші
- Gemini: Gemini 3.0 Flash, Gemini 2.0 Flash та інші
- DeepSeek: DeepSeek Chat та інші
Приклади використання
Приклад 1: Тестування з GPT-4o-mini
- Виберіть провайдера: OpenAI
- Виберіть модель: gpt-4o-mini
- Завантажте файл:
test_docs/test_sample.csv - Запустіть тестування
- Результат:
test_results/batch_test_results_gpt-4o-mini_20260103_115530.csv
Приклад 2: Порівняння моделей
- Запустіть тестування з GPT-4o-mini
- Завантажте той самий CSV знову
- Запустіть тестування з Claude 3.5 Sonnet
- Порівняйте результати в обох файлах
Rate Limits та рекомендації
Обмеження API провайдерів
Різні провайдери мають різні обмеження на кількість запитів:
OpenAI:
- Free tier: ~3 RPM (requests per minute)
- Paid tier: 60-500 RPM залежно від плану
Anthropic:
- Free tier: обмежено
- Paid tier: залежить від підписки
Gemini:
- Free tier: 15 RPM
- Paid tier: вищі ліміти
DeepSeek:
- Залежить від підписки
Рекомендовані налаштування паузи
| Кількість рядків | Рекомендована пауза | Причина |
|---|---|---|
| 1-10 | 0.5-1 сек | Швидка обробка, мінімальний ризик |
| 10-50 | 1-2 сек | Баланс між швидкістю та надійністю |
| 50-100 | 2-3 сек | Уникнення rate limits |
| 100+ | 3-5 сек | Консервативний підхід |
Порада: Якщо ви отримуєте помилки про перевищення ліміту запитів (rate limit errors), збільште паузу на 1-2 секунди.
Додаткова інформація
- Результати не впливають на інші закладки додатку
- Кожен запуск створює новий файл результатів
- Результати зберігаються локально у папці
test_results/ - Папка
test_results/додана в.gitignore - Пауза застосовується між запитами, але не після останнього
- При помилці в одному рядку обробка продовжується для наступних