Лабораторная работа по локальным языковым моделям: два самостоятельных приложения, которые работают поверх локального OpenAI-совместимого сервера (LM Studio или Ollama) — без облака и без платных API.
- Мини LM Arena — сравнение ответов локальных моделей с Elo-рейтингом и автоматическим судейством (LLM-as-a-judge).
- RAG-приложение — ответы на вопросы по загруженным документам с гибридным поиском и ссылками на источники.
Базовые версии из лекций умели немногое: арена сравнивала две модели в один клик, а RAG искал по эмбеддингам в одном текстовом файле. Цель доработки — довести обе программы до состояния, в котором ими можно реально пользоваться: добавить устойчивое хранение результатов, автоматизацию, поддержку разных бэкендов и форматов, а также улучшить качество поиска и оценки.
Веб-приложение на 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 битв с чередованием тем и печатает итоговую таблицу.
Веб-приложение на 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.txtcd Лабораторная_работа
# Мини 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 # Зависимости