Skip to content

SENATOROVAI/Lab_arena

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 

Repository files navigation

Lab_arena

Лабораторная работа по локальным языковым моделям: два самостоятельных приложения, которые работают поверх локального OpenAI-совместимого сервера (LM Studio или Ollama) — без облака и без платных API.

  1. Мини LM Arena — сравнение ответов локальных моделей с Elo-рейтингом и автоматическим судейством (LLM-as-a-judge).
  2. RAG-приложение — ответы на вопросы по загруженным документам с гибридным поиском и ссылками на источники.

Цель работы

Базовые версии из лекций умели немногое: арена сравнивала две модели в один клик, а RAG искал по эмбеддингам в одном текстовом файле. Цель доработки — довести обе программы до состояния, в котором ими можно реально пользоваться: добавить устойчивое хранение результатов, автоматизацию, поддержку разных бэкендов и форматов, а также улучшить качество поиска и оценки.

Решение

Задание 2 — Мини LM Arena (arena.py)

Веб-приложение на Flask, которое стравливает две локальные модели на одном вопросе и ведёт турнирную таблицу.

  • Elo-рейтинг с настраиваемым коэффициентом K и стартовым значением; история рейтинга сохраняется после каждой битвы.
  • Авто-режим — программа сама генерирует вопрос по одной из тем (код, математика, текст, диалог), а оценку выносят модели-судьи (LLM-as-a-judge) с защитой от позиционного смещения.
  • Журнал и экспорт — каждая битва записывается целиком (вопрос, оба ответа, голоса судей, изменение рейтингов) и выгружается в arena_export.json.
  • Персистентность — состояние переживает перезапуск через arena_state.json (атомарная запись через временный файл).
  • Backend-agnostic — модели определяются и для LM Studio (через его внутренний REST API с реально загруженными моделями), и для Ollama (через стандартный /v1/models).

Прогон без веб-интерфейса для генерации отчёта — run_arena_battles.py: он проводит N битв с чередованием тем и печатает итоговую таблицу.

Задание 3 — RAG-приложение (rag_app.py)

Веб-приложение на Flask: загрузка документов, индексация в ChromaDB и чат с ответами строго по содержимому документов.

  • Гибридный поиск — эмбеддинги + лексический BM25, результаты объединяются через Reciprocal Rank Fusion (RRF). Это позволяет находить и смысловые совпадения, и точные слова, номера, термины.
  • Форматы.txt, .md, .pdf (pypdf) и .docx (python-docx).
  • Чанкинг — по абзацам или посимвольным скользящим окном с overlap.
  • Ссылки на источники — найденные фрагменты с метаданными, в ответе модели проставляются ссылки вида [#1].
  • Несколько документов одновременно с фильтром по источнику.
  • Настройки прямо в интерфейсе — top-k, размер чанка, стратегия поиска переопределяются на каждый запрос.

Результат

Пример прогона 12 авто-битв (arena_export.json) — итоговая таблица:

Ранг Модель Elo W / L / T
1 gemma2:2b 1071.5 5 / 0 / 1
2 mistral:7b 1015.8 3 / 2 / 0
3 phi3:mini 971.8 3 / 5 / 0
4 qwen2.5:3b 940.9 0 / 4 / 1

В экспорт попадают метаданные прогона, финальные рейтинги, история Elo по каждой модели и полный журнал битв.


Технологический стек

Назначение Технология
Язык Python 3.11+
Веб-сервер Flask 3.1
Доступ к LLM OpenAI SDK 2.0 (OpenAI-совместимый API)
Бэкенды моделей LM Studio / Ollama (локальный сервер :1234)
Векторная БД ChromaDB 1.5 (HNSW, косинусная метрика)
Лексический поиск rank-bm25 (BM25Okapi) + RRF
Чтение документов pypdf, python-docx
Численные операции NumPy

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

Нужен запущенный локальный OpenAI-совместимый сервер на 127.0.0.1:1234 (LM Studio или Ollama) с парой chat-моделей, а для RAG — ещё и эмбеддинг-модель.

python -m venv .venv
source .venv/bin/activate
pip install -r Лабораторная_работа/requirements.txt
cd Лабораторная_работа

# Мини LM Arena — веб-интерфейс
python arena.py                       # http://localhost:5010

# Генерация отчёта без веб-интерфейса
python run_arena_battles.py --battles 12
python run_arena_battles.py --battles 8 --keep   # дописать к текущему

# RAG-приложение
python rag_app.py                     # http://localhost:5011

Конфигурация

Параметры задаются через переменные окружения.

Переменная Назначение По умолчанию
ARENA_BASE_URL Адрес сервера моделей http://127.0.0.1:1234/v1
ARENA_PORT Порт веб-арены 5010
ARENA_ELO_K Коэффициент K в Elo 32
RAG_BASE_URL Адрес сервера моделей http://127.0.0.1:1234/v1
RAG_PORT Порт RAG-приложения 5011
RAG_EMBEDDING_MODEL Модель эмбеддингов nomic-embed-text
RAG_LLM_MODEL Чат-модель для генерации ответа qwen2.5:3b

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

Лабораторная_работа/
├── arena.py               # Мини LM Arena: веб-приложение и логика битв
├── run_arena_battles.py   # Прогон авто-битв и экспорт в JSON
├── rag_app.py             # RAG-приложение: загрузка, индексация, чат
├── arena_export.json      # Пример результата прогона арены
├── sample_doc.txt         # Тестовый документ для RAG
└── requirements.txt       # Зависимости

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages