Система, которая анализирует статистические данные о доходах фрилансеров (Freelancer Earnings & Job Trends) и предоставляет ответы на запросы, сформулированные на естественном языке
- Склонируйте репозиторий
git clone https://github.com/alexysxeightn/freelancer_da_system.git
cd freelancer_da_system
- Установите зависимости
pip install -r requirements.txt
- Создайте
.env-файл, в который положите ключ API OpenAI
OPENAI_API_KEY=your_openai_api_key
- Запустите консольное приложение
python main.py
- Запуск тестов
python -m unittest tests.test_core -v
freelancer_da_system/
├── __init__.py
├── freelancer_earnings_bd.csv # Данные для базы данных
├── .env # Ключ OpenAI API
├── requirements.txt # Зависимости
├── README.md # Документация
├── main.py # Приложение
├── config.py # Конфигурация (пути до файлов, ключи, название модели)
├── schema.py # Схема базы данных (добавляется в промпт)
├── database.py # Работа с базой данных
├── llm_utils.py # Работа с LLM
├── logger.py # Логика логирования
├── cli.py # Логика консольного приложения
└── tests/ # Тесты
├── __init__.py
└── test_core.py
Система принимает вопросы на естественном языке, преобразует их в безопасные SQL-запросы, выполняет эти запросы над набором данных и возвращает человекочитаемый ответ.
- Загрузка датасета: данные из
CSVфайла загружаются в память какSQLiteБД для удобства выполненияSQL-запросов. - Генерация SQL-запроса: на основе вопроса пользователя и описания структуры данных модель
GPTгенерируетSQL-запрос. - Проверка безопасности SQL: проверяем, не содержит ли запрос опасных операций (
DROP,DELETEи т.д.). - Выполнение SQL: Запрос выполняется через
pandas.read_sql_query. - Формирование ответа: результат обрабатывается
GPT, который формирует понятный ответ на русском языке. - Логирование: Все этапы логируются в
JSON-linesфайл для отладки и аудита.
Формат логов:
{
'query': 'Текст вопроса',
'llm_sql_query': 'Текст SQL-запроса, полученный от LLM',
'result_sql_query': 'Результат выполнения SQL-запроса',
'answer': 'Текст ответа, который отправляется пользователю'
}
В силу "неточности" естественного языка могут быть ситуации, когда модель выдает разные ответы на один и тот же вопрос. Например, в вопросе "Насколько выше доход у фрилансеров, принимающих оплату в криптовалюте, по сравнению с другими способами оплаты?" не понятно в каком формате ожидается ответ, в процентах, или в абсолютных величинах. Можно улучшить систему, чтобы для таких случаев она задавала уточняющие вопросы.
В плане эффективности в среднем система обрабатывает один запрос 2-3 секунды. Это значение может варьироваться в зависимости от скорости интернета и доступности OpenAI API.
Для проверки точности систему можно проверить на запросах разной природы (с оконными функциями, подзапросами, большим количеством условий, пустым ответом и т.д.). Проведена проверка системы на следующих вопросах:
| Вопрос | Ответ модели | Корректность (проверена вручную через sql) |
|---|---|---|
| Насколько выше доход у фрилансеров, принимающих оплату в криптовалюте, по сравнению с другими способами оплаты? | Доход фрилансеров, принимающих оплату в криптовалюте, на 165,31 долларов США выше, чем у остальных. | ✅ |
| Как распределяется доход фрилансеров в зависимости от региона проживания? | Средний доход фрилансеров распределяется по регионам следующим образом: в Канаде он составляет 5350 долларов США, в Азии — 5172 доллара, в Великобритании — 5047 долларов, в Австралии — 4966 долларов, в Европе — 4891 доллар, в США — 4873 доллара и на Ближнем Востоке — 4871 доллар. | ✅ |
| Какой процент фрилансеров, считающих себя экспертами, выполнил менее 100 проектов? | 33,85% фрилансеров, считающих себя экспертами, выполнили менее 100 проектов. | ✅ |
| Какой процент фрилансеров использует криптовалюту как основной способ оплаты? | 26,36% фрилансеров используют криптовалюту как основной способ оплаты. | ✅ |
| Какой фрилансер в категории "Graphic Design" имеет самый высокий доход, и насколько он выше среднего по этой категории? | Фрилансер с ID 593 в категории "Graphic Design" имеет самый высокий доход — 9974 долларов США, что на 4837,13 долларов США выше среднего дохода по этой категории. | ✅ |
| Какие платформы имеют хотя бы одного фрилансера с доходом выше $10000? | Платформы с фрилансерами, имеющими доход выше 10 000 долларов США, отсутствуют. | ✅ |
| Каково соотношение начинающих и опытных фрилансеров на платформе Upwork, у которых менее 50 выполненных проектов? | Соотношение начинающих и опытных фрилансеров на платформе Upwork с менее чем 50 выполненными проектами составляет 20 к 22. | ✅ |
| Раздели фрилансеров на три группы по количеству выполненных проектов: до 50, от 50 до 200, больше 200. Сколько в каждой группе? | Фрилансеров, выполнивших до 50 проектов, 309 человек; от 50 до 200 проектов — 989 человек; больше 200 проектов — 652 человека. | ✅ |
| Какая категория имеет наибольшее суммарное число выполненных проектов, и какая — минимальное | Категория "Веб-разработка" имеет наибольшее суммарное число выполненных проектов — 39 262, а категория "Копирайтинг" — минимальное, всего 33 748 проектов. | ✅ |
| Найди всех фрилансеров из Европы или США, у которых уровень успеха выше 90%, и они зарабатывают больше максимального среднего дохода среди всех категорий. | Ниже приведён список фрилансеров из Европы или США с уровнем успеха выше 90%, которые зарабатывают больше максимального среднего дохода среди всех категорий. Их идентификаторы: 13, 68, 122, 141, 151, 183, 187, 253, 271, 379, 384, 513, 519, 531, 555, 578, 619, 708, 726, 749, 814, 938, 1005, 1049, 1051, 1102, 1111, 1172, 1231, 1272, 1278, 1310, 1323, 1335, 1396, 1407, 1441, 1445, 1456, 1469, 1477, 1481, 1513, 1545, 1560, 1574, 1665, 1666, 1674, 1684, 1728, 1756, 1839, 1845, 1859, 1865, 1871, 1882, 1907. | ✅ |
Ни на одном из вопросов система не ошиблась (единственное замечание, отношение 20 к 22 выглядит странно, LLM не догадалась сократить на 2)
Используется:
LangChain+ChatOpenAI- для генерацииSQLи текстовых ответовSQLite- для быстрой обработка запросовPandas- удобная работа с даннымиRich CLI- более удобное и красивое консольное приложениеUnit-тесты - для обнаружения ошибок при изменениях в проектеdotenv- для безопасного хранения API-ключаJSON-логирование - для диагностика ошибок (в том числе логических)
Изначально хотел использовать PythonREPLTool, но такой вариант тратит больше токенов и является более сложным для решения такой задачи, реализованный метод проще
Точность ответа - корректность итогового численного значения или текстового вывода
Читаемость ответа - ясность и грамматическая правильность ответа на русском языке
Безопасность SQL - отсутствие возможности выполнить вредоносный запрос
Производительность - быстрое выполнение запроса и получение результата
Логируемость - наличие записи всех этапов в лог
Поддерживаемость кода - простота расширения и изменения функциональности
Юзабилити - понятный интерфейс и подсказки
Иногда GPT может генерировать некорректные SQL, можно добавить fallback на повторную попытку.
Система может долго отвечать, можно кэшировать часто задаваемые вопросы.
Также могут быть внутренние ошибки OpenAI, поэтому можно добавить автоматические retry с экспоненциальной задержкой.
