Данный проект предназначен для анализа истории диалогов между двумя LLM-агентами — analytic и finance, работающими через API GigaChat.
Цель — построить простую модель, которая учится по текстам сообщений предсказывать численные оценки (score), характеризующие качество или релевантность реплик.
В основе лежит следующая последовательность шагов:
- Генерация или загрузка истории диалогов.
- Векторизация текстов с помощью TF-IDF.
- Снижение размерности с помощью Truncated SVD.
- Обучение линейной модели (Linear Regression).
- Применение обученной модели для предсказания оценок на тестовых данных.
project/
│
├── src/
│ ├── dialogue/
│ │ ├── history.py # Функции для генерации и чтения истории диалогов
│ ├── llm/
│ │ ├── agent.py # Класс Agent для взаимодействия с GigaChat
│ │ ├── prompts.py # Системные промпты для агентов (analytic, finance)
│ ├── utils.py # Утилиты (пайплайн, фильтры, сохранение, сериализация)
│
├── train_history.json # История обучения (если сохранена)
├── test_history_v2.json # Тестовая история
├── result.json # Результаты предсказания
│
├── .env # Токен и параметры GigaChat
└── main.py # Основной исполняемый скрипт (тот, что приведён выше)
pip install -r requirements.txtили вручную:
pip install python-dotenv langchain_gigachat scikit-learnСоздайте файл .env в корне проекта:
GIGACHAT_API_TOKEN=ваш_токен
GIGACHAT_MODEL=gpt
GIGACHAT_SCOPE=GIGACHAT_API_PERS
python main.pyПосле выполнения в корне появится файл result.json с предсказаниями по каждому агенту.
Каждое сообщение преобразуется в вектор, где компоненты соответствуют статистической значимости слов и биграмм:
где:
-
$\text{TF}(t, d)$ — частота термина$t$ в документе$d$ , -
$\text{DF}(t)$ — количество документов, содержащих термин$t$ , -
$N$ — общее количество документов.
TF-IDF векторы часто имеют тысячи признаков, что создаёт избыточность и шум.
Для устранения этого используется Truncated SVD (Singular Value Decomposition):
где:
-
$X$ — матрица TF-IDF, -
$U_k$ ,$\Sigma_k$ ,$V_k^T$ — усечённые матрицы размерности$k$ , -
$k$ — число главных компонент (N_COMPONENTS).
Это позволяет:
- уменьшить размерность пространства (например, с 5000 до 100),
- устранить мультиколлинеарность,
- сохранить главные смысловые направления в данных.
Фактически SVD играет роль аналога PCA для разреженных матриц TF-IDF.
После снижения размерности обучается модель:
где:
-
$X$ — матрица признаков после SVD, -
$W$ ,$b$ — параметры модели, -
$\hat{y}$ — предсказанная оценка.
Модель минимизирует среднеквадратичную ошибку (MSE):
- Преобразует тексты в TF-IDF матрицу.
- Применяет SVD для снижения размерности.
- Обучает
LinearRegressionна связи между матрицей и оценками.
- Отбирает тексты конкретного автора.
- Применяет те же TF-IDF и SVD трансформации.
- Делает предсказание оценок на основе обученной модели.
После выполнения сохраняется файл result.json, содержащий словари вида:
{
"analytic": {
"matrix": [[...], [...], ...],
"predict": [0.12, 0.08, 0.15, ...]
},
"finance": {
"matrix": [[...], [...], ...],
"predict": [0.10, 0.09, 0.13, ...]
}
}| Параметр | Описание | Значение |
|---|---|---|
NGRAM_RANGE |
Диапазон n-грамм для TF-IDF | (1, 2) |
MAX_FEATURES |
Максимальное число признаков | 5000 |
STOP_WORDS |
Список стоп-слов | ["russian"] |
N_COMPONENTS |
Количество компонент SVD | 100 |
RANDOM_STATE |
Фиксированное зерно случайности | 42 |
SIZE_FOR_GENERATE |
Размер сгенерированной истории | 100 |
train_history, test_history = make_history()
model_analytic = make_predict()(train_history, "analytic")
predict_analytic = model_analytic(test_history)Результат — численные предсказания, зависящие от текста сообщений.
- Python 3.10+
- LangChain GigaChat — для взаимодействия с LLM
- scikit-learn — для TF-IDF, SVD и регрессии
- dotenv — для управления токенами API
- JSON — для сохранения результатов
- Python 3.13