Skip to content

logunovFGP/Embeddings

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Анализ диалогов LLM-агентов с помощью TF-IDF, SVD и линейной регрессии

📘 Описание проекта

Данный проект предназначен для анализа истории диалогов между двумя LLM-агентамиanalytic и finance, работающими через API GigaChat.
Цель — построить простую модель, которая учится по текстам сообщений предсказывать численные оценки (score), характеризующие качество или релевантность реплик.

В основе лежит следующая последовательность шагов:

  1. Генерация или загрузка истории диалогов.
  2. Векторизация текстов с помощью TF-IDF.
  3. Снижение размерности с помощью Truncated SVD.
  4. Обучение линейной модели (Linear Regression).
  5. Применение обученной модели для предсказания оценок на тестовых данных.

🧩 Структура проекта

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                   # Основной исполняемый скрипт (тот, что приведён выше)

⚙️ Установка и запуск

1. Установите зависимости

pip install -r requirements.txt

или вручную:

pip install python-dotenv langchain_gigachat scikit-learn

2. Настройте .env

Создайте файл .env в корне проекта:

GIGACHAT_API_TOKEN=ваш_токен
GIGACHAT_MODEL=gpt
GIGACHAT_SCOPE=GIGACHAT_API_PERS

3. Запуск

python main.py

После выполнения в корне появится файл result.json с предсказаниями по каждому агенту.


🧠 Математическое описание

1. Векторизация текстов (TF-IDF)

Каждое сообщение преобразуется в вектор, где компоненты соответствуют статистической значимости слов и биграмм:

$$ \text{TF-IDF}(t, d) = \text{TF}(t, d) \times \log \frac{N}{\text{DF}(t)} $$

где:

  • $\text{TF}(t, d)$ — частота термина $t$ в документе $d$,
  • $\text{DF}(t)$ — количество документов, содержащих термин $t$,
  • $N$ — общее количество документов.

2. Снижение размерности (Truncated SVD)

TF-IDF векторы часто имеют тысячи признаков, что создаёт избыточность и шум.
Для устранения этого используется Truncated SVD (Singular Value Decomposition):

$$ X \approx U_k \Sigma_k V_k^T $$

где:

  • $X$ — матрица TF-IDF,
  • $U_k$, $\Sigma_k$, $V_k^T$ — усечённые матрицы размерности $k$,
  • $k$ — число главных компонент (N_COMPONENTS).

Это позволяет:

  • уменьшить размерность пространства (например, с 5000 до 100),
  • устранить мультиколлинеарность,
  • сохранить главные смысловые направления в данных.

Фактически SVD играет роль аналога PCA для разреженных матриц TF-IDF.


3. Линейная регрессия

После снижения размерности обучается модель:

$$ \hat{y} = XW + b $$

где:

  • $X$ — матрица признаков после SVD,
  • $W$, $b$ — параметры модели,
  • $\hat{y}$ — предсказанная оценка.

Модель минимизирует среднеквадратичную ошибку (MSE):

$$ \min_{W, b} | XW + b - y |^2 $$


🧮 Архитектура пайплайна

Обучение модели (pipeline_by_get_model)

  1. Преобразует тексты в TF-IDF матрицу.
  2. Применяет SVD для снижения размерности.
  3. Обучает LinearRegression на связи между матрицей и оценками.

Предсказание (pipeline_by_predict)

  1. Отбирает тексты конкретного автора.
  2. Применяет те же TF-IDF и SVD трансформации.
  3. Делает предсказание оценок на основе обученной модели.

📊 Результат

После выполнения сохраняется файл 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

About

Study project

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages