Перейти к содержанию

RAMBA AI Router: различия между версиями

Материал из RAMBA Wiki
Нет описания правки
Нет описания правки
 
Строка 1: Строка 1:
{{DISPLAYTITLE:RAMBA AI Router}}
<div class="portal-header">
<div class="portal-title">RAMBA AI Router</div>
<div class="portal-subtitle">
Локальный интеллектуальный маршрутизатор LLM для инфраструктуры RAMBA ART
</div>
</div>


= RAMBA AI Router =
<div class="portal-card">
'''RAMBA AI Router''' — собственный локальный маршрутизатор языковых моделей RAMBA ART.


'''RAMBA AI Router''' — локальная система интеллектуальной маршрутизации запросов между несколькими языковыми моделями проекта [[RAMBA AI]].
Router принимает запрос пользователя, анализирует его тип и контекст, выбирает подходящую локальную LLM, при необходимости повышает уровень модели, проверяет ответ через Verifier и использует постоянную память между диалогами.


Router анализирует входящий запрос пользователя, определяет его тип и автоматически выбирает наиболее подходящую локальную LLM.
'''Текущая стабильная версия:''' '''v4.7 — Semantic Long-Term Memory'''


Основная задача проекта — получить максимальное качество ответов при ограниченных вычислительных ресурсах, не используя одну большую модель для всех запросов.
<syntaxhighlight lang="text">
Release:  v4.7
Commit:    11b18b2
Backend:  Ollama
API:      FastAPI / Uvicorn
Storage:  SQLite
Inference: NVIDIA GPU
</syntaxhighlight>
</div>


На текущем этапе система использует три специализированных «мозга»:
__TOC__
 
= Назначение проекта =
 
RAMBA AI Router создаётся как центральный интеллектуальный слой локальной AI-инфраструктуры RAMBA ART.
 
Основная идея проекта:
 
<syntaxhighlight lang="text">
Пользователь
    │
    ▼
RAMBA AI Router
    │
    ├── анализ запроса
    ├── выбор модели
    ├── история диалога
    ├── долговременная память
    ├── escalation
    └── verification
              │
              ▼
        Local LLM
</syntaxhighlight>
 
Router позволяет использовать несколько моделей одновременно, не заставляя пользователя вручную выбирать модель для каждого запроса.
 
Основные задачи:
 
* автоматический выбор подходящей LLM;
* минимизация задержки ответа;
* рациональное использование GPU;
* сохранение контекста разговора;
* постоянная память между сессиями;
* автоматическое повышение уровня модели для сложных запросов;
* проверка потенциально ненадёжных ответов;
* создание основы для будущего AI Agent.
 
= Инфраструктура =
 
RAMBA AI Router работает в локальной инфраструктуре RAMBA ART.
 
Основной AI-хост:
 
<syntaxhighlight lang="text">
Host: depo
Platform: Proxmox VE
CPU: Xeon E5-2678 v3
GPU: NVIDIA GeForce GTX 1080
</syntaxhighlight>
 
Локальные модели обслуживаются через:
 
<syntaxhighlight lang="text">
Ollama
http://127.0.0.1:11434
</syntaxhighlight>
 
Router реализован на:
 
* Python;
* FastAPI;
* Uvicorn;
* SQLite;
* Ollama API.
 
= Модели =
 
В Router используются несколько специализированных моделей.


{| class="wikitable"
{| class="wikitable"
Строка 18: Строка 100:
| '''FAST'''
| '''FAST'''
| <code>gemma3:4b</code>
| <code>gemma3:4b</code>
| Простые вопросы, работа с текстом, короткие ответы
| Быстрые повседневные запросы
|-
|-
| '''INFRA'''
| '''INFRA'''
| <code>qwen3:8b</code>
| <code>qwen3:8b</code>
| Linux, Proxmox, сети, серверы, виртуализация и инфраструктура
| Linux, Proxmox, Docker, сети, инфраструктура
|-
|-
| '''SMART'''
| '''SMART'''
| <code>qwen3.5:9b</code>
| <code>qwen3.5:9b</code>
| Логика, математика, анализ и сложные задачи
| Более сложный анализ и рассуждение
|}
|}


== Общая архитектура ==
Общая идея:


<pre>
<syntaxhighlight lang="text">
                     Пользователь
                Request
                       
                     │
                       
                   
                ┌─────────────────┐
              RAMBA Router
                │ RAMBA AI Router
                   
                └────────┬────────┘
        ┌───────────┼───────────┐
                       
        │                    │
            анализ и классификация
        ▼           ▼          
                       
      FAST       INFRA       SMART
           ┌──────────────┼──────────────┐
  Gemma 3 4B   Qwen3 8B   Qwen3.5 9B
           │              │             
</syntaxhighlight>
           ▼             ▼             
       FAST          INFRA         SMART
    Gemma 3 4B       Qwen3 8B     Qwen3.5 9B
          │              │              │
          └──────────────┼──────────────┘
                        │
                        ▼
                      Ollama
                        │
                        ▼
                  NVIDIA GTX 1080
</pre>


Router работает как локальный API-сервис на базе '''FastAPI'''.
Такой подход позволяет не использовать самую тяжёлую модель для каждого простого запроса.


В качестве backend для запуска языковых моделей используется '''Ollama'''.
= Архитектура =


== Сервер ==
Текущая архитектура RAMBA AI Router v4.7:


RAMBA AI Router работает внутри виртуальной машины:
<syntaxhighlight lang="text">
                        Пользователь
                              │
                              ▼
                    ┌─────────────────┐
                    │ RAMBA AI Router
                    │      v4.7      │
                    └────────┬────────┘
                            │
                ┌───────────┴───────────┐
                │                      │
                ▼                      ▼
          Session Memory          Long-Term Memory
              v4.6                    v4.7
                │                      │
          messages_json            memory_facts
                │                      │
                └───────────┬───────────┘
                            │
                            ▼
                    Context + Routing
                            │
              ┌──────────────┼──────────────┐
              │              │              │
              ▼              ▼              ▼
            FAST          INFRA          SMART
          Gemma 3 4B      Qwen3 8B    Qwen3.5 9B
              │              │              │
              └──────────────┼──────────────┘
                            │
                            ▼
                        Escalation
                            │
                            ▼
                          Verifier
                            │
                            ▼
                      Финальный ответ
</syntaxhighlight>


<pre>
= Принцип работы =
VMID: 501
Hostname: ramba-ai
</pre>


Основной каталог проекта:
Обработка одного сообщения в актуальной версии выглядит примерно так:


<pre>
<syntaxhighlight lang="text">
/home/artem/ramba-router/
1. Получение /chat запроса
</pre>
2. Определение session_id
3. Загрузка Session Memory
4. Поиск Long-Term Memory
5. Анализ запроса
6. Выбор роли модели
7. Выбор FAST / INFRA / SMART
8. Формирование prompt
9. Добавление истории разговора
10. Добавление релевантной долговременной памяти
11. Вызов Ollama
12. Анализ результата
13. При необходимости Escalation
14. При необходимости Verifier
15. Сохранение Session Memory
16. Возврат ответа
</syntaxhighlight>


Основные файлы стабильной версии:
= История развития =


<pre>
== Router v1 ==
router.py
router-v3-perfect.py
test-router-v3.py
test-router-v3-perfect.py
</pre>


Контрольная резервная копия стабильной версии:
Первая версия Router была proof-of-concept.


<pre>
Основная задача заключалась в том, чтобы доказать сам принцип:
/home/artem/ramba-router-v3-perfect.tar.gz
</pre>


== Аппаратная платформа ==
'''один API может автоматически направлять разные запросы в разные локальные модели.'''


Для выполнения локальных моделей используется:
Маршрутизация в основном основывалась на простых правилах и ключевых словах.


* '''GPU:''' NVIDIA GeForce GTX 1080
Архитектура:
* '''VRAM:''' 8 GB
* '''Inference backend:''' Ollama
* '''API Router:''' FastAPI / Uvicorn


Из-за ограничения в 8 GB VRAM Router не пытается постоянно держать все основные модели в памяти видеокарты.
<syntaxhighlight lang="text">
Request
  │
  ▼
Keyword Rules
  │
  ├── FAST
  ├── INFRA
  └── SMART
</syntaxhighlight>


Вместо этого необходимая модель загружается по требованию.
Главный результат v1 — подтверждение жизнеспособности идеи локального multi-model Router.


== Выбор моделей ==
== Router v2 ==


До разработки Router было проведено тестирование нескольких локальных моделей.
Во второй версии была улучшена логика классификации запросов.


В ходе тестов оценивались:
Вместо одного простого совпадения ключевых слов Router начал учитывать несколько признаков запроса.


* русский язык;
Появилась более стабильная специализация моделей.
* логическое мышление;
* задачи по Proxmox/Linux;
* программирование;
* понимание AI/VRAM;
* скорость генерации;
* стабильность ответов.


В результате для Router были выбраны три основные модели.
Основная проблема всё ещё сохранялась:


=== FAST — Gemma 3 4B ===
* Router практически не понимал контекст;
* follow-up сообщения могли классифицироваться неправильно;
* история разговора не являлась частью маршрутизации.


<pre>
== Router v3 ==
gemma3:4b
</pre>


Используется для относительно простых запросов.
Router v3 стал заметным архитектурным шагом вперёд.


Примеры:
Основным изменением стала '''score-based routing'''.


* исправление текста;
Каждая роль могла получать собственный score.
* переформулирование;
* короткие объяснения;
* простые вопросы;
* задачи, не требующие глубокого анализа.


Преимущество модели — высокая скорость.
Пример:


В тестах скорость генерации составляла примерно:
<syntaxhighlight lang="text">
Запрос:
"Как пробросить GPU в Proxmox?"


<pre>
FAST  = 0
~59 tok/s
INFRA  = 8
</pre>
SMART  = 2


=== INFRA — Qwen3 8B ===
Результат:
INFRA
</syntaxhighlight>


<pre>
Это позволило отказаться от жёсткой схемы:
qwen3:8b
</pre>


Основная техническая модель RAMBA AI.
<syntaxhighlight lang="text">
нашли одно слово → выбрали модель
</syntaxhighlight>


Используется для вопросов, связанных с:
в пользу:


* Proxmox VE;
<syntaxhighlight lang="text">
* Linux;
несколько признаков
* VFIO;
      │
* IOMMU;
      ▼
* PCI Passthrough;
score каждого класса
* systemd;
      │
* Docker;
      ▼
* NFS;
лучший маршрут
* ZFS;
</syntaxhighlight>
* сетями;
* виртуальными машинами;
* серверным администрированием.


Типичная скорость:
В поколении v3 были заложены основы дальнейшего Router v4.


<pre>
= Router v4 =
~35 tok/s
</pre>


=== SMART Qwen3.5 9B ===
'''RAMBA AI Router v4''' текущее поколение системы.


<pre>
Если v1–v3 в основном решали задачу выбора модели, то серия v4 постепенно превратила Router в полноценный интеллектуальный middleware.
qwen3.5:9b
</pre>


Наиболее интеллектуально сильная из трёх основных моделей.
Основные возможности поколения v4:


Используется для:
* context-aware routing;
* session affinity;
* hysteresis;
* история диалога;
* persistent session memory;
* escalation;
* Verifier;
* Semantic Long-Term Memory;
* диагностический API;
* SQLite persistence.


* математических задач;
== Версии Router v4 ==
* логики;
* анализа;
* сложных технических вопросов;
* многоэтапных рассуждений;
* задач с процентами и зависимостями.


Типичная скорость:
{| class="wikitable"
! Версия
! Основное изменение
! Статус
|-
| '''v4.1'''
| Развитие новой архитектуры Router v4
| Готово
|-
| '''v4.2'''
| Улучшение контекстной маршрутизации
| Готово
|-
| '''v4.3'''
| Стабилизация routing logic
| Готово
|-
| '''v4.4'''
| Escalation
| Готово
|-
| '''v4.5'''
| Verifier и дальнейшее развитие маршрутизации
| Готово
|-
| '''v4.6'''
| Persistent Context / Session Memory
| Готово
|-
| '''v4.7'''
| Semantic Long-Term Memory
| '''Текущая стабильная версия'''
|}
 
= Context-Aware Routing =
 
Одной из ключевых проблем ранних версий были короткие follow-up сообщения.
 
Например:
 
<syntaxhighlight lang="text">
Пользователь:
В Proxmox vfio-pci не захватывает GTX 1080.
 
Router:
INFRA
 
Пользователь:
А как проверить?
</syntaxhighlight>


<pre>
Если анализировать только вторую фразу:
~29-30 tok/s
</pre>


== Router v1 ==
<syntaxhighlight lang="text">
А как проверить?
</syntaxhighlight>


Первая версия RAMBA AI Router была proof-of-concept.
она почти не содержит информации для классификации.


Маршрутизация выполнялась преимущественно по ключевым словам.
Router v4 учитывает историю разговора и может сохранить прежнюю специализацию.


Упрощённо:
Таким образом:


<pre>
<syntaxhighlight lang="text">
Proxmox / VFIO / Linux
Proxmox / GPU passthrough
         │
         │
         ▼
         ▼
    Qwen3 8B
      INFRA
 
сложная задача
         │
         │
         ▼
         ▼
  Qwen3.5 9B
"А как проверить?"
 
остальные запросы
         │
         │
         ▼
         ▼
    Gemma 3 4B
      INFRA
</pre>
</syntaxhighlight>


Версия доказала работоспособность основной концепции:
= Session Affinity и Hysteresis =


'''одна точка входа → несколько специализированных локальных моделей.'''
В Router v4 используется концепция session affinity.


== Router v2 ==
Если разговор уже уверенно ведётся одной специализированной моделью, Router не должен переключаться между моделями из-за каждого короткого сообщения.


Во второй версии маршрутизатор стал значительно сложнее.
Hysteresis снижает число ненужных переключений.


Были добавлены:
Упрощённо:


* score-based routing;
<syntaxhighlight lang="text">
* определение загруженной Ollama-модели;
Current role = INFRA
* session affinity;
* hysteresis;
* статистика;
* журналирование;
* контроль переключения моделей.


Router начал использовать Ollama API:
Новый score:


<pre>
FAST  3
GET /api/ps
INFRA  4
</pre>


для определения модели, которая в данный момент находится в памяти.
Разница небольшая
        │
        ▼
оставить INFRA
</syntaxhighlight>


В API Router появились служебные endpoint'ы:
Это делает разговор стабильнее.


<pre>
= Escalation =
/chat
/health
/stats
</pre>


=== Проблема Router v2 ===
Escalation позволяет автоматически повысить уровень модели, если первоначально выбранная модель не подходит для запроса.


Во время тестирования была обнаружена важная ошибка классификации.
Пример:


Запрос:
<syntaxhighlight lang="text">
Request
  │
  ▼
FAST
  │
  ├── ответ достаточный → вернуть
  │
  └── требуется усиление
            │
            ▼
          SMART
</syntaxhighlight>


<pre>
Или:
Есть три сервера A, B и C.
A быстрее B на 20%.
B быстрее C на 25%.
Если C выполняет задачу за 100 секунд,
сколько времени потребуется A?
</pre>


является математической задачей.
<syntaxhighlight lang="text">
INFRA
  │
  └── сложный анализ
          │
          ▼
        SMART
</syntaxhighlight>


Однако Router воспринимал слово:
Таким образом Router может начинать с более дешёвой и быстрой модели, а более мощную использовать только тогда, когда это действительно требуется.


<pre>
= Verifier =
сервер
</pre>


как инфраструктурный признак и отправлял запрос в:
Verifier используется как дополнительная проверка ответа.


<pre>
Его задача — снизить риск выдачи явно слабого, противоречивого или потенциально ненадёжного результата.
INFRA → Qwen3 8B
</pre>


Это показало недостаток простой маршрутизации по ключевым словам.
Упрощённая схема:


== Router v3 ==
<syntaxhighlight lang="text">
Primary Model
      │
      ▼
    Answer
      │
      ▼
  Verifier
      │
      ├── OK
      │
      └── требуется correction
</syntaxhighlight>


В Router v3 алгоритм классификации был переработан.
Verifier является частью поколения Router v4.


Основная идея разные слова должны иметь '''разный вес'''.
= Persistent Session Memory v4.6 =


=== Слабые инфраструктурные признаки ===
Версия '''v4.6''' добавила постоянное хранение истории сессий.


Например:
До этого часть session state зависела от жизни процесса Router.


<pre>
Основная SQLite-база:
сервер
Linux
Ubuntu
VM
NVIDIA
сеть
</pre>


Сами по себе такие слова больше не должны гарантировать выбор INFRA.
<syntaxhighlight lang="text">
/home/artem/ramba-router/ramba-context.db
</syntaxhighlight>


=== Сильные инфраструктурные признаки ===
Для session memory используется таблица:


Больший вес получили специфические технические термины:
<syntaxhighlight lang="text">
sessions
</syntaxhighlight>


<pre>
Основные поля:
Proxmox
vfio-pci
IOMMU
lspci
hostpci
systemctl
journalctl
initramfs
ZFS
NFS
</pre>


=== SMART-признаки ===
<syntaxhighlight lang="text">
session_id
role
model
messages_json
created_at
updated_at
</syntaxhighlight>


Для определения аналитических задач используются признаки:
Архитектура:


<pre>
<syntaxhighlight lang="text">
сколько
Пользователь
проценты
    │
быстрее
    ▼
медленнее
session_id
рассчитай
    │
объясни расчёт
    ▼
вероятность
RAMBA Router
логическая задача
    │
</pre>
    ▼
SQLite sessions
    │
    ▼
messages_json
    │
    ▼
LLM Context
</syntaxhighlight>


Таким образом Router вычисляет несколько независимых оценок:
В результате история диалога переживает перезапуск процесса Uvicorn.


<pre>
После рестарта Router может загрузить session state из SQLite.
FAST
INFRA
SMART
</pre>


и выбирает роль с максимальным результатом.
= Semantic Long-Term Memory — v4.7 =


== Пример работы Router v3 ==
Версия '''v4.7''' добавила второй независимый механизм памяти.


Для математической задачи с тремя серверами Router получил:
Если Session Memory хранит историю конкретного разговора, Long-Term Memory хранит отдельные знания.


<pre>
Пример:
FAST  = 1
INFRA = 1
SMART = 16
</pre>


Результат:
<syntaxhighlight lang="text">
На сервере depo установлена NVIDIA GeForce GTX 1080.
</syntaxhighlight>


<pre>
Такой факт не относится к одной конкретной session_id.
role: smart
model: qwen3.5:9b
</pre>


Модель правильно решила задачу:
Он может использоваться:


<pre>
* завтра;
C = 100 секунд
* после restart Router;
* в новой сессии;
* в разговоре с другим session_id.


B быстрее C на 25%:
== Два уровня памяти ==
100 / 1.25 = 80 секунд


A быстрее B на 20%:
{| class="wikitable"
80 / 1.2 = 66.67 секунды
! Возможность
</pre>
! Session Memory
! Long-Term Memory
|-
| Версия
| v4.6
| v4.7
|-
| Привязана к session_id
| Да
| Нет
|-
| Хранит историю диалога
| Да
| Нет
|-
| Хранит отдельные знания
| Нет
| Да
|-
| SQLite persistence
| Да
| Да
|-
| Переживает restart
| Да
| Да
|-
| Работает между сессиями
| Нет
| Да
|-
| Tags
| Нет
| Да
|-
| Importance
| Нет
| Да
|-
| Статистика использования
| Нет
| Да
|}


Ответ:
Архитектурно:


<pre>
<syntaxhighlight lang="text">
A ≈ 66.67 секунды
                RAMBA Router
</pre>
                    │
          ┌──────────┴──────────┐
          │                    │
          ▼                    ▼
    Session Memory        Long-Term Memory
          │                    │
    current dialog          knowledge
          │                    │
          └──────────┬──────────┘
                    ▼
                LLM Context
</syntaxhighlight>


== Пример инфраструктурного запроса ==
= Таблица memory_facts =


Запрос:
Для долговременной памяти используется отдельная SQLite-таблица:


<pre>
<syntaxhighlight lang="sql">
В Proxmox lspci показывает nouveau вместо vfio-pci.
CREATE TABLE memory_facts (
Что проверить?
    id INTEGER PRIMARY KEY AUTOINCREMENT,
</pre>
    scope TEXT NOT NULL,
    fact TEXT NOT NULL,
    tags TEXT,
    importance REAL NOT NULL DEFAULT 0.5,
    created_at TEXT NOT NULL,
    updated_at TEXT NOT NULL,
    last_used_at TEXT,
    use_count INTEGER NOT NULL DEFAULT 0
);
</syntaxhighlight>


Router определил:
Поля:


<pre>
{| class="wikitable"
FAST  = 1
! Поле
INFRA = 23
! Назначение
SMART = 0
|-
</pre>
| <code>id</code>
| Уникальный ID факта
|-
| <code>scope</code>
| Область действия
|-
| <code>fact</code>
| Текст знания
|-
| <code>tags</code>
| Поисковые теги
|-
| <code>importance</code>
| Важность
|-
| <code>created_at</code>
| Время создания
|-
| <code>updated_at</code>
| Время изменения
|-
| <code>last_used_at</code>
| Последнее использование
|-
| <code>use_count</code>
| Количество использований
|}


и выбрал:
= Пример Memory Fact =


<pre>
<syntaxhighlight lang="json">
role: infra
{
model: qwen3:8b
  "fact": "На сервере depo установлена видеокарта NVIDIA GeForce GTX 1080",
</pre>
  "scope": "global",
  "tags": [
    "depo",
    "gpu",
    "nvidia",
    "gtx1080"
  ],
  "importance": 0.9
}
</syntaxhighlight>


То есть специализированный инфраструктурный запрос был направлен технической модели.
= Memory Retrieval =


== Пример FAST-запроса ==
Перед вызовом LLM Router выполняет поиск релевантной долговременной памяти.


Запрос:
Функция:


<pre>
<syntaxhighlight lang="python">
Исправь текст:
retrieve_memories()
я одел куртку и вышел на улицу
</syntaxhighlight>
</pre>


Router получил:
Упрощённая схема:


<pre>
<syntaxhighlight lang="text">
FAST  = 6
User message
INFRA = 0
    │
SMART = 0
    ▼
</pre>
retrieve_memories()
    │
    ▼
memory_facts
    │
    ▼
relevance score
    │
    ▼
top memories
    │
    ▼
System Context
    │
    ▼
LLM
</syntaxhighlight>


и правильно выбрал:
В версии v4.7 retrieval основан на:


<pre>
* совпадениях слов;
role: fast
* совпадениях тегов;
model: gemma3:4b
* importance.
</pre>


Однако сама модель ответила:
Количество одновременно добавляемых фактов ограничено:


<pre>
<syntaxhighlight lang="python">
Я одел куртку и вышел на улицу.
MAX_MEMORY_FACTS = 5
</pre>
</syntaxhighlight>


вместо:
Это защищает prompt от чрезмерного разрастания.


<pre>
Нерелевантная память не добавляется.
Я надел куртку и вышел на улицу.
</pre>


Это продемонстрировало важное различие:
= Memory API =


'''правильная маршрутизация не гарантирует правильность ответа модели.'''
Версия v4.7 предоставляет отдельное API управления памятью.


В дальнейшем для решения подобных проблем планируется отдельный слой проверки ответов — '''Verifier'''.
== Добавление факта ==


== Переключение моделей ==
Endpoint:


Router получает информацию о моделях, загруженных Ollama.
<syntaxhighlight lang="text">
POST /memory
</syntaxhighlight>


Пример ответа <code>/health</code>:
Пример:


<pre>
<syntaxhighlight lang="json">
{
{
   "router": "ok",
   "fact": "На сервере depo установлена видеокарта NVIDIA GeForce GTX 1080",
   "version": "3",
   "scope": "global",
   "ollama_loaded_models": [
   "tags": ["depo", "gpu", "nvidia", "gtx1080"],
    "gemma3:4b"
   "importance": 0.9
  ],
   "sessions": 3
}
}
</pre>
</syntaxhighlight>
 
== Просмотр памяти ==


При запросе другой категории Router может переключить модель.
<syntaxhighlight lang="text">
GET /memory
</syntaxhighlight>


Например:
== Удаление памяти ==
 
<syntaxhighlight lang="text">
DELETE /memory/{id}
</syntaxhighlight>
 
= Почему память пока управляемая =
 
В v4.7 модель '''не записывает новые факты автоматически'''.
 
Это намеренное решение.
 
Если сразу разрешить LLM сохранять любые данные из разговора, могут быстро появиться:
 
* случайные факты;
* ошибочные утверждения;
* временная информация;
* дубликаты;
* противоречащие друг другу записи;
* слишком большой объём памяти.
 
Поэтому v4.7 сначала реализует прозрачный жизненный цикл:
 
<syntaxhighlight lang="text">
explicit add
    │
    ▼
SQLite
    │
    ▼
retrieval
    │
    ▼
usage statistics
    │
    ▼
explicit delete
</syntaxhighlight>
 
Автоматическое извлечение памяти будет добавляться отдельным этапом.
 
= Использование Long-Term Memory в /chat =
 
При поступлении нового сообщения выполняется:
 
<syntaxhighlight lang="text">
/chat
  │
  ├── get_session()
  │
  ├── load Session Memory
  │
  ├── retrieve Long-Term Memory
  │
  ├── route request
  │
  ├── build prompt
  │
  ├── ask Ollama
  │
  ├── escalation / verifier
  │
  ├── save session
  │
  └── response
</syntaxhighlight>
 
Ответ API v4.7 содержит диагностическое поле:
 
<syntaxhighlight lang="json">
"memory_used": [...]
</syntaxhighlight>
 
Это позволяет увидеть, какие факты были реально добавлены в запрос модели.
 
= Production-проверка v4.7 =
 
После реализации v4.7 был выполнен отдельный production-тест.
 
В Long-Term Memory был добавлен факт:
 
<syntaxhighlight lang="text">
На сервере depo установлена видеокарта NVIDIA GeForce GTX 1080.
</syntaxhighlight>
 
Затем была создана новая сессия.
 
Запрос:
 
<syntaxhighlight lang="text">
Какая видеокарта установлена на сервере depo?
</syntaxhighlight>
 
Router нашёл memory fact и ответил:
 
<syntaxhighlight lang="text">
NVIDIA GeForce GTX 1080.
</syntaxhighlight>
 
После этого процесс Router был полностью перезапущен.
 
После restart была создана ещё одна новая сессия.
 
Запрос:


<pre>
<syntaxhighlight lang="text">
Gemma 3 4B
Что за GPU стоит на depo?
    │
</syntaxhighlight>
    ▼
Qwen3 8B
    │
    ▼
Qwen3.5 9B
</pre>


В API-ответе отображаются диагностические данные:
Результат:


<pre>
<syntaxhighlight lang="text">
model
NVIDIA GeForce GTX 1080.
role
</syntaxhighlight>
loaded_before
switch
scores
route_reason
elapsed
eval_count
eval_duration
load_duration
tok_s
</pre>


Это позволяет анализировать не только результат маршрутизации, но и производительность системы.
При этом:


== Стоимость переключения ==
<syntaxhighlight lang="text">
history_messages = 0
memory_used      = memory #1
use_count        = 2
</syntaxhighlight>


Загрузка другой модели в VRAM занимает заметное время.
Таким образом доказано:


На используемой системе переключение обычно добавляет несколько секунд ожидания.
* ответ не зависел от Session Memory;
* память работала в новой сессии;
* память пережила restart Router;
* SQLite persistence работает;
* retrieval правильно нашёл нужный факт.


Поэтому Router старается избегать ненужного переключения модели.
= Тестирование =


Для этого используются механизмы:
Для каждой версии Router используется regression suite.


* session affinity;
Для v4.7:
* hysteresis;
* определение уже загруженной модели.


В перспективе Router должен учитывать не только качество предполагаемого ответа, но и '''стоимость переключения модели'''.
<syntaxhighlight lang="text">
test-router-v4.7.py
</syntaxhighlight>


== Контрольный тест Router v3 ==
Проверяются:


Для проверки Router v3 был создан отдельный тест:
* базовая маршрутизация;
* score routing;
* context routing;
* session affinity;
* hysteresis;
* escalation;
* verifier;
* session history;
* persistent session storage;
* Long-Term Memory;
* add memory;
* list memory;
* retrieve memory;
* no-match retrieval;
* use_count;
* last_used_at;
* delete memory;
* SQLite persistence;
* HTTP Memory API.


<pre>
Финальный результат regression suite:
test-router-v3.py
</pre>


Он содержит '''30 запросов''':
<syntaxhighlight lang="text">
=== v4.7 MEMORY REGRESSION OK ===


{| class="wikitable"
🎉 ALL TESTS PASSED
! Категория
</syntaxhighlight>
! Количество
|-
| FAST
| 10
|-
| INFRA
| 10
|-
| SMART
| 10
|-
! Всего
! 30
|}


Для каждого запроса заранее задаётся ожидаемая категория.
Memory regression выполняется на временной SQLite-базе и не изменяет production memory.


Тест сравнивает:
= Health API =


<pre>
Для диагностики используется:
EXPECTED
</pre>


с:
<syntaxhighlight lang="text">
GET /health
</syntaxhighlight>


<pre>
Пример v4.7:
ACTUAL
</pre>


=== Итог тестирования ===
<syntaxhighlight lang="json">
{
  "router": "ok",
  "version": "4.7",
  "ollama_loaded_models": [
    "gemma3:4b"
  ],
  "sessions": 2,
  "sessions_memory": 0,
  "sessions_persistent": 2,
  "memory_facts": 1
}
</syntaxhighlight>


22 августа 2026 года Router v3 успешно прошёл полный контрольный тест.
Параметр:


<pre>
<syntaxhighlight lang="text">
RESULT: 30/30 = 100.0%
memory_facts
</syntaxhighlight>


PERFECT ROUTING — 30/30
показывает количество долговременных фактов.
</pre>


{| class="wikitable"
= Файлы проекта =
! Категория
! Результат
! Модель
|-
| FAST
| 10 / 10
| Gemma 3 4B
|-
| INFRA
| 10 / 10
| Qwen3 8B
|-
| SMART
| 10 / 10
| Qwen3.5 9B
|-
! Итого
! '''30 / 30 (100%)'''
!
|}


Таким образом Router v3 стал первой зафиксированной стабильной версией RAMBA AI Router.
Основные файлы текущей версии:


== Фиксация стабильной версии ==
<syntaxhighlight lang="text">
/home/artem/ramba-router/router_v47.py
/home/artem/ramba-router/test-router-v4.7.py
/home/artem/ramba-router/ramba-context.db
</syntaxhighlight>


После успешного теста были сохранены контрольные копии:
Исторические версии Router сохранены отдельно и доступны через Git history и release tags.


<pre>
= Production endpoints =
router-v3-perfect.py
test-router-v3-perfect.py
</pre>


и создан архив:
Текущий Router v4.7:


<pre>
<syntaxhighlight lang="text">
/home/artem/ramba-router-v3-perfect.tar.gz
127.0.0.1:8003
</pre>
</syntaxhighlight>


Размер архива на момент создания:
Дополнительно оставлена резервная контрольная версия v4.5:


<pre>
<syntaxhighlight lang="text">
6.4 KB
127.0.0.1:8002
</pre>
</syntaxhighlight>


Router v3 после этого считается '''стабильной контрольной точкой проекта'''.
Она используется как fallback при разработке новых версий.


== Ограничения Router v3 ==
= Git workflow =


Несмотря на успешный результат 30/30, версия v3 имеет ряд архитектурных ограничений.
Разработка каждой крупной возможности ведётся в отдельной feature-ветке.


Главное из них — недостаточное понимание контекста разговора.
Для v4.7 использовалась:


Например:
<syntaxhighlight lang="text">
feature/semantic-memory-v4.7
</syntaxhighlight>


<pre>
Основной commit:
Пользователь:
В Proxmox vfio-pci не захватывает GTX 1080.


Router:
<syntaxhighlight lang="text">
INFRA
18563ba Add semantic long-term memory for router v4.7
</pre>
</syntaxhighlight>


Следующее сообщение:
После успешных тестов feature-ветка была объединена с main.


<pre>
Merge commit:
А как это проверить?
</pre>


само по себе почти не содержит признаков INFRA.
<syntaxhighlight lang="text">
11b18b2 Merge branch 'feature/semantic-memory-v4.7' into 'main'
</syntaxhighlight>


Человек понимает контекст предыдущего сообщения, однако Router v3 в основном анализирует текущий запрос.
Релиз зафиксирован тегом:


Именно эта проблема является основной целью следующей версии.
<syntaxhighlight lang="text">
v4.7
</syntaxhighlight>


= Router v4 =
На момент релиза:


Следующий этап разработки — '''RAMBA AI Router v4'''.
<syntaxhighlight lang="text">
HEAD -> main
origin/main
tag: v4.7
</syntaxhighlight>


Главное изменение:
указывали на один релизный commit.


'''контекстная маршрутизация.'''
= Релизы =


Router должен учитывать не только последнее сообщение, но и историю текущего диалога.
{| class="wikitable"
! Версия
! Основное изменение
! Статус
|-
| v1
| Первый keyword router
| Историческая
|-
| v2
| Улучшенная классификация
| Историческая
|-
| v3
| Score-based routing
| Историческая
|-
| v4.1–v4.3
| Context-aware архитектура
| Стабильные этапы
|-
| v4.4
| Escalation
| Готово
|-
| v4.5
| Verifier
| Готово
|-
| v4.6
| Persistent Session Memory
| Готово
|-
| '''v4.7'''
| '''Semantic Long-Term Memory'''
| '''Current Stable'''
|}


Планируемая структура сессии:
= Ограничения текущей версии =


<pre>
Версия v4.7 уже имеет persistent long-term memory, но это всё ещё первая управляемая реализация.
session
├── session_id
├── current_role
├── previous_model
└── messages
      │
      ├── user
      ├── assistant
      ├── user
      ├── assistant
      └── ...
</pre>


Например:
Текущие ограничения:


<pre>
* память записывается через API;
Пользователь:
* отсутствует automatic memory extraction;
В Proxmox vfio-pci не захватывает GTX 1080.
* отсутствует автоматическое обновление фактов;
* нет автоматической дедупликации;
* нет memory consolidation;
* retrieval основан на словах и тегах;
* embeddings пока не используются;
* vector database отсутствует;
* нет confidence-модели для автоматически полученных фактов.


→ INFRA / Qwen3 8B
Это сделано намеренно.


Пользователь:
Для текущего оборудования с GTX 1080 приоритетными являются:
А как проверить?


→ анализ контекста
* прозрачность;
→ сохранение роли INFRA
* стабильность;
→ Qwen3 8B
* низкие накладные расходы;
</pre>
* простая диагностика;
* контроль над содержимым памяти.


== План Router v4 ==
= Следующий этап =


Первый этап:
Следующее поколение RAMBA AI Router должно добавить автоматическое извлечение и управление памятью.


# хранение истории диалога;
Предварительная архитектура:
# передача контекста модели;
# ограничение размера истории;
# sticky routing;
# корректная обработка коротких follow-up сообщений.


Второй этап:
<syntaxhighlight lang="text">
Conversation
    │
    ▼
Memory Extractor
    │
    ├── ignore
    │
    ├── create fact
    │
    ├── update fact
    │
    └── merge duplicate
              │
              ▼
        memory_facts
              │
              ▼
      Memory Retrieval
              │
              ▼
            LLM
</syntaxhighlight>


# отдельный system prompt для FAST;
Основные задачи следующего этапа:
# отдельный system prompt для INFRA;
# отдельный system prompt для SMART.


Третий этап:
* Automatic Memory Extraction;
* классификация полезности факта;
* защита от случайного запоминания;
* confidence;
* дедупликация;
* обновление изменившихся знаний;
* consolidation;
* conflict detection;
* подготовка к embeddings.


# оценка уверенности Router;
После стабилизации жизненного цикла памяти можно переходить к:
# автоматическая эскалация FAST → SMART;
# обработка неоднозначных запросов;
# дополнительные контрольные тесты.


== Дальнейшее развитие ==
* semantic embeddings;
* vector retrieval;
* RAG;
* внешним knowledge base;
* tool calling;
* AI Agent.


Перспективная архитектура RAMBA AI:
= Перспективная архитектура =


<pre>
Долгосрочная цель проекта:
                    Пользователь
                          │
                          ▼
                  RAMBA AI Router
                          │
            ┌─────────────┼─────────────┐
            ▼            ▼            ▼
          FAST          INFRA        SMART
            │            │            │
            └─────────────┼─────────────┘
                          │
                          ▼
                      Verifier
                          │
                          ▼
                        RAG
                          │
                          ▼
                  Финальный ответ
</pre>


Планируется развитие следующих компонентов:
<syntaxhighlight lang="text">
                        User
                          │
                          ▼
                  ┌─────────────────┐
                  │ RAMBA AI Agent  │
                  └────────┬────────┘
                          │
                          ▼
                  ┌─────────────────┐
                  │  RAMBA Router  │
                  └────────┬────────┘
                          │
            ┌─────────────┼─────────────┐
            │            │            │
            ▼            ▼            ▼
          Memory          RAG          Tools
            │            │            │
            └─────────────┼─────────────┘
                          │
                          ▼
                  Model Orchestration
                          │
              ┌────────────┼────────────┐
              │            │            │
              ▼            ▼            ▼
            FAST        INFRA        SMART
                          │
                          ▼
                      Local GPU
</syntaxhighlight>


* '''Context Memory''' — память текущего диалога;
В такой архитектуре Router становится не конечным приложением, а центральным AI orchestration layer.
* '''Verifier''' — проверка качества и корректности ответа;
* '''Escalation''' — передача сложного запроса более сильной модели;
* '''RAG''' — подключение собственной базы знаний RAMBA;
* '''Infrastructure Knowledge''' — информация о серверах и сервисах RAMBA;
* '''Tool Calling''' — выполнение разрешённых действий через инструменты;
* '''Metrics''' — статистика качества, скорости и маршрутизации.


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


{| class="wikitable"
{| class="wikitable"
! Компонент
! Компонент
! Статус
! Статус
! Версия
|-
|-
| Ollama
| Ollama
| '''Готово'''
| '''Готово'''
| —
|-
| NVIDIA GPU inference
| '''Готово'''
| —
|-
| FAST / Gemma 3 4B
| '''Готово'''
| —
|-
| INFRA / Qwen3 8B
| '''Готово'''
| —
|-
| SMART / Qwen3.5 9B
| '''Готово'''
| —
|-
| Score-based Routing
| '''Готово'''
| v3
|-
| Context-Aware Routing
| '''Готово'''
| v4
|-
|-
| GPU inference
| Session Affinity
| '''Готово'''
| '''Готово'''
| v4
|-
|-
| FAST model
| Hysteresis
| '''Готово'''
| '''Готово'''
| v4
|-
|-
| INFRA model
| Escalation
| '''Готово'''
| '''Готово'''
| v4.4
|-
|-
| SMART model
| Verifier
| '''Готово'''
| '''Готово'''
| v4.5
|-
|-
| Router API
| Session Memory
| '''Готово'''
| '''Готово'''
| v4.6
|-
|-
| Score-based routing
| Persistent Context
| '''Готово'''
| '''Готово'''
| v4.6
|-
|-
| Ollama model detection
| Semantic Long-Term Memory
| '''Готово'''
| '''Готово'''
| '''v4.7'''
|-
|-
| Session affinity
| Memory API
| '''Готово'''
| '''Готово'''
| '''v4.7'''
|-
| Automatic Memory Extraction
| Планируется
| Следующий этап
|-
|-
| Router v3 test
| Memory Consolidation
| '''30/30'''
| Планируется
| Следующий этап
|-
|-
| Context-aware routing
| Embeddings
| В разработке (v4)
| Планируется
| Позднее
|-
|-
| Verifier
| Vector Search
| Планируется
| Планируется
| Позднее
|-
|-
| RAG
| RAG
| Планируется
| Планируется
| Позднее
|-
| Tool Calling
| Планируется
| Позднее
|-
| RAMBA AI Agent
| Планируется
| Будущий этап
|}
|}


== Итог ==
= Итог =
 
'''RAMBA AI Router v4.7''' — текущая стабильная версия локального интеллектуального маршрутизатора RAMBA ART.
 
Проект прошёл путь:
 
<syntaxhighlight lang="text">
Keyword Router
      │
      ▼
Score Routing
      │
      ▼
Context Routing
      │
      ▼
Escalation
      │
      ▼
Verifier
      │
      ▼
Persistent Session Memory
      │
      ▼
Semantic Long-Term Memory
</syntaxhighlight>
 
Текущая система уже умеет:


'''RAMBA AI Router v3''' подтвердил работоспособность архитектуры динамического выбора локальных языковых моделей.
* автоматически выбирать локальную модель;
* учитывать специализацию запроса;
* сохранять роль в контексте разговора;
* избегать ненужного переключения моделей;
* повышать уровень модели при необходимости;
* проверять ответ;
* сохранять историю сессий в SQLite;
* восстанавливать сессии после restart;
* хранить отдельные долгосрочные знания;
* находить релевантные факты;
* использовать знания в совершенно новой сессии;
* сохранять долговременную память после restart Router.


Контрольный тест показал:
Ключевой результат v4.7:


<pre>
'''RAMBA AI получил настоящий persistent knowledge layer, независимый от конкретного диалога.'''
30 / 30
100%
PERFECT ROUTING
</pre>


Вместо запуска одной универсальной модели RAMBA AI использует несколько специализированных моделей и выбирает подходящую в зависимости от характера задачи.
Production-проверка подтвердила полный цикл:


Следующий этап проекта — '''Router v4''', который добавит память диалога и контекстную маршрутизацию.
<syntaxhighlight lang="text">
Memory Fact
    │
    ▼
SQLite
    │
    ▼
Router Restart
    │
    ▼
New Session
    │
    ▼
Memory Retrieval
    │
    ▼
Correct LLM Answer
</syntaxhighlight>


[[Категория:RAMBA]]
Следующий этап проекта — автоматическое извлечение, обновление и консолидация памяти с последующим переходом к semantic retrieval, RAG и полноценному RAMBA AI Agent.
[[Категория:RAMBA AI]]
[[Категория:Искусственный интеллект]]
[[Категория:Серверы]]

Текущая версия от 01:05, 8 сентября 2026

RAMBA AI Router

Локальный интеллектуальный маршрутизатор LLM для инфраструктуры RAMBA ART

RAMBA AI Router — собственный локальный маршрутизатор языковых моделей RAMBA ART.

Router принимает запрос пользователя, анализирует его тип и контекст, выбирает подходящую локальную LLM, при необходимости повышает уровень модели, проверяет ответ через Verifier и использует постоянную память между диалогами.

Текущая стабильная версия: v4.7 — Semantic Long-Term Memory

Release:   v4.7
Commit:    11b18b2
Backend:   Ollama
API:       FastAPI / Uvicorn
Storage:   SQLite
Inference: NVIDIA GPU

Назначение проекта

RAMBA AI Router создаётся как центральный интеллектуальный слой локальной AI-инфраструктуры RAMBA ART.

Основная идея проекта:

Пользователь
     │
     ▼
RAMBA AI Router
     │
     ├── анализ запроса
     ├── выбор модели
     ├── история диалога
     ├── долговременная память
     ├── escalation
     └── verification
              │
              ▼
         Local LLM

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

Основные задачи:

  • автоматический выбор подходящей LLM;
  • минимизация задержки ответа;
  • рациональное использование GPU;
  • сохранение контекста разговора;
  • постоянная память между сессиями;
  • автоматическое повышение уровня модели для сложных запросов;
  • проверка потенциально ненадёжных ответов;
  • создание основы для будущего AI Agent.

Инфраструктура

RAMBA AI Router работает в локальной инфраструктуре RAMBA ART.

Основной AI-хост:

Host: depo
Platform: Proxmox VE
CPU: Xeon E5-2678 v3
GPU: NVIDIA GeForce GTX 1080

Локальные модели обслуживаются через:

Ollama
http://127.0.0.1:11434

Router реализован на:

  • Python;
  • FastAPI;
  • Uvicorn;
  • SQLite;
  • Ollama API.

Модели

В Router используются несколько специализированных моделей.

Роль Модель Назначение
FAST gemma3:4b Быстрые повседневные запросы
INFRA qwen3:8b Linux, Proxmox, Docker, сети, инфраструктура
SMART qwen3.5:9b Более сложный анализ и рассуждение

Общая идея:

                 Request
                    │
                    ▼
              RAMBA Router
                    │
        ┌───────────┼───────────┐
        │           │           │
        ▼           ▼           ▼
      FAST        INFRA       SMART
   Gemma 3 4B   Qwen3 8B   Qwen3.5 9B

Такой подход позволяет не использовать самую тяжёлую модель для каждого простого запроса.

Архитектура

Текущая архитектура RAMBA AI Router v4.7:

                         Пользователь
                              │
                              ▼
                    ┌─────────────────┐
                    │ RAMBA AI Router │
                    │      v4.7       │
                    └────────┬────────┘
                             │
                 ┌───────────┴───────────┐
                 │                       │
                 ▼                       ▼
          Session Memory          Long-Term Memory
              v4.6                     v4.7
                 │                       │
           messages_json             memory_facts
                 │                       │
                 └───────────┬───────────┘
                             │
                             ▼
                    Context + Routing
                             │
              ┌──────────────┼──────────────┐
              │              │              │
              ▼              ▼              ▼
             FAST           INFRA          SMART
          Gemma 3 4B      Qwen3 8B     Qwen3.5 9B
              │              │              │
              └──────────────┼──────────────┘
                             │
                             ▼
                         Escalation
                             │
                             ▼
                          Verifier
                             │
                             ▼
                      Финальный ответ

Принцип работы

Обработка одного сообщения в актуальной версии выглядит примерно так:

1. Получение /chat запроса
2. Определение session_id
3. Загрузка Session Memory
4. Поиск Long-Term Memory
5. Анализ запроса
6. Выбор роли модели
7. Выбор FAST / INFRA / SMART
8. Формирование prompt
9. Добавление истории разговора
10. Добавление релевантной долговременной памяти
11. Вызов Ollama
12. Анализ результата
13. При необходимости Escalation
14. При необходимости Verifier
15. Сохранение Session Memory
16. Возврат ответа

История развития

Router v1

Первая версия Router была proof-of-concept.

Основная задача заключалась в том, чтобы доказать сам принцип:

один API может автоматически направлять разные запросы в разные локальные модели.

Маршрутизация в основном основывалась на простых правилах и ключевых словах.

Архитектура:

Request
   │
   ▼
Keyword Rules
   │
   ├── FAST
   ├── INFRA
   └── SMART

Главный результат v1 — подтверждение жизнеспособности идеи локального multi-model Router.

Router v2

Во второй версии была улучшена логика классификации запросов.

Вместо одного простого совпадения ключевых слов Router начал учитывать несколько признаков запроса.

Появилась более стабильная специализация моделей.

Основная проблема всё ещё сохранялась:

  • Router практически не понимал контекст;
  • follow-up сообщения могли классифицироваться неправильно;
  • история разговора не являлась частью маршрутизации.

Router v3

Router v3 стал заметным архитектурным шагом вперёд.

Основным изменением стала score-based routing.

Каждая роль могла получать собственный score.

Пример:

Запрос:
"Как пробросить GPU в Proxmox?"

FAST   = 0
INFRA  = 8
SMART  = 2

Результат:
INFRA

Это позволило отказаться от жёсткой схемы:

нашли одно слово → выбрали модель

в пользу:

несколько признаков
      │
      ▼
score каждого класса
      │
      ▼
лучший маршрут

В поколении v3 были заложены основы дальнейшего Router v4.

Router v4

RAMBA AI Router v4 — текущее поколение системы.

Если v1–v3 в основном решали задачу выбора модели, то серия v4 постепенно превратила Router в полноценный интеллектуальный middleware.

Основные возможности поколения v4:

  • context-aware routing;
  • session affinity;
  • hysteresis;
  • история диалога;
  • persistent session memory;
  • escalation;
  • Verifier;
  • Semantic Long-Term Memory;
  • диагностический API;
  • SQLite persistence.

Версии Router v4

Версия Основное изменение Статус
v4.1 Развитие новой архитектуры Router v4 Готово
v4.2 Улучшение контекстной маршрутизации Готово
v4.3 Стабилизация routing logic Готово
v4.4 Escalation Готово
v4.5 Verifier и дальнейшее развитие маршрутизации Готово
v4.6 Persistent Context / Session Memory Готово
v4.7 Semantic Long-Term Memory Текущая стабильная версия

Context-Aware Routing

Одной из ключевых проблем ранних версий были короткие follow-up сообщения.

Например:

Пользователь:
В Proxmox vfio-pci не захватывает GTX 1080.

Router:
INFRA

Пользователь:
А как проверить?

Если анализировать только вторую фразу:

А как проверить?

она почти не содержит информации для классификации.

Router v4 учитывает историю разговора и может сохранить прежнюю специализацию.

Таким образом:

Proxmox / GPU passthrough
        │
        ▼
      INFRA
        │
        ▼
"А как проверить?"
        │
        ▼
      INFRA

Session Affinity и Hysteresis

В Router v4 используется концепция session affinity.

Если разговор уже уверенно ведётся одной специализированной моделью, Router не должен переключаться между моделями из-за каждого короткого сообщения.

Hysteresis снижает число ненужных переключений.

Упрощённо:

Current role = INFRA

Новый score:

FAST   3
INFRA  4

Разница небольшая
        │
        ▼
оставить INFRA

Это делает разговор стабильнее.

Escalation

Escalation позволяет автоматически повысить уровень модели, если первоначально выбранная модель не подходит для запроса.

Пример:

Request
   │
   ▼
FAST
   │
   ├── ответ достаточный → вернуть
   │
   └── требуется усиление
             │
             ▼
           SMART

Или:

INFRA
  │
  └── сложный анализ
           │
           ▼
         SMART

Таким образом Router может начинать с более дешёвой и быстрой модели, а более мощную использовать только тогда, когда это действительно требуется.

Verifier

Verifier используется как дополнительная проверка ответа.

Его задача — снизить риск выдачи явно слабого, противоречивого или потенциально ненадёжного результата.

Упрощённая схема:

Primary Model
      │
      ▼
    Answer
      │
      ▼
   Verifier
      │
      ├── OK
      │
      └── требуется correction

Verifier является частью поколения Router v4.

Persistent Session Memory — v4.6

Версия v4.6 добавила постоянное хранение истории сессий.

До этого часть session state зависела от жизни процесса Router.

Основная SQLite-база:

/home/artem/ramba-router/ramba-context.db

Для session memory используется таблица:

sessions

Основные поля:

session_id
role
model
messages_json
created_at
updated_at

Архитектура:

Пользователь
     │
     ▼
 session_id
     │
     ▼
RAMBA Router
     │
     ▼
SQLite sessions
     │
     ▼
messages_json
     │
     ▼
LLM Context

В результате история диалога переживает перезапуск процесса Uvicorn.

После рестарта Router может загрузить session state из SQLite.

Semantic Long-Term Memory — v4.7

Версия v4.7 добавила второй независимый механизм памяти.

Если Session Memory хранит историю конкретного разговора, Long-Term Memory хранит отдельные знания.

Пример:

На сервере depo установлена NVIDIA GeForce GTX 1080.

Такой факт не относится к одной конкретной session_id.

Он может использоваться:

  • завтра;
  • после restart Router;
  • в новой сессии;
  • в разговоре с другим session_id.

Два уровня памяти

Возможность Session Memory Long-Term Memory
Версия v4.6 v4.7
Привязана к session_id Да Нет
Хранит историю диалога Да Нет
Хранит отдельные знания Нет Да
SQLite persistence Да Да
Переживает restart Да Да
Работает между сессиями Нет Да
Tags Нет Да
Importance Нет Да
Статистика использования Нет Да

Архитектурно:

                RAMBA Router
                     │
          ┌──────────┴──────────┐
          │                     │
          ▼                     ▼
    Session Memory        Long-Term Memory
          │                     │
    current dialog          knowledge
          │                     │
          └──────────┬──────────┘
                     ▼
                 LLM Context

Таблица memory_facts

Для долговременной памяти используется отдельная SQLite-таблица:

CREATE TABLE memory_facts (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    scope TEXT NOT NULL,
    fact TEXT NOT NULL,
    tags TEXT,
    importance REAL NOT NULL DEFAULT 0.5,
    created_at TEXT NOT NULL,
    updated_at TEXT NOT NULL,
    last_used_at TEXT,
    use_count INTEGER NOT NULL DEFAULT 0
);

Поля:

Поле Назначение
id Уникальный ID факта
scope Область действия
fact Текст знания
tags Поисковые теги
importance Важность
created_at Время создания
updated_at Время изменения
last_used_at Последнее использование
use_count Количество использований

Пример Memory Fact

{
  "fact": "На сервере depo установлена видеокарта NVIDIA GeForce GTX 1080",
  "scope": "global",
  "tags": [
    "depo",
    "gpu",
    "nvidia",
    "gtx1080"
  ],
  "importance": 0.9
}

Memory Retrieval

Перед вызовом LLM Router выполняет поиск релевантной долговременной памяти.

Функция:

retrieve_memories()

Упрощённая схема:

User message
     │
     ▼
retrieve_memories()
     │
     ▼
memory_facts
     │
     ▼
relevance score
     │
     ▼
top memories
     │
     ▼
System Context
     │
     ▼
LLM

В версии v4.7 retrieval основан на:

  • совпадениях слов;
  • совпадениях тегов;
  • importance.

Количество одновременно добавляемых фактов ограничено:

MAX_MEMORY_FACTS = 5

Это защищает prompt от чрезмерного разрастания.

Нерелевантная память не добавляется.

Memory API

Версия v4.7 предоставляет отдельное API управления памятью.

Добавление факта

Endpoint:

POST /memory

Пример:

{
  "fact": "На сервере depo установлена видеокарта NVIDIA GeForce GTX 1080",
  "scope": "global",
  "tags": ["depo", "gpu", "nvidia", "gtx1080"],
  "importance": 0.9
}

Просмотр памяти

GET /memory

Удаление памяти

DELETE /memory/{id}

Почему память пока управляемая

В v4.7 модель не записывает новые факты автоматически.

Это намеренное решение.

Если сразу разрешить LLM сохранять любые данные из разговора, могут быстро появиться:

  • случайные факты;
  • ошибочные утверждения;
  • временная информация;
  • дубликаты;
  • противоречащие друг другу записи;
  • слишком большой объём памяти.

Поэтому v4.7 сначала реализует прозрачный жизненный цикл:

explicit add
    │
    ▼
SQLite
    │
    ▼
retrieval
    │
    ▼
usage statistics
    │
    ▼
explicit delete

Автоматическое извлечение памяти будет добавляться отдельным этапом.

Использование Long-Term Memory в /chat

При поступлении нового сообщения выполняется:

/chat
  │
  ├── get_session()
  │
  ├── load Session Memory
  │
  ├── retrieve Long-Term Memory
  │
  ├── route request
  │
  ├── build prompt
  │
  ├── ask Ollama
  │
  ├── escalation / verifier
  │
  ├── save session
  │
  └── response

Ответ API v4.7 содержит диагностическое поле:

"memory_used": [...]

Это позволяет увидеть, какие факты были реально добавлены в запрос модели.

Production-проверка v4.7

После реализации v4.7 был выполнен отдельный production-тест.

В Long-Term Memory был добавлен факт:

На сервере depo установлена видеокарта NVIDIA GeForce GTX 1080.

Затем была создана новая сессия.

Запрос:

Какая видеокарта установлена на сервере depo?

Router нашёл memory fact и ответил:

NVIDIA GeForce GTX 1080.

После этого процесс Router был полностью перезапущен.

После restart была создана ещё одна новая сессия.

Запрос:

Что за GPU стоит на depo?

Результат:

NVIDIA GeForce GTX 1080.

При этом:

history_messages = 0
memory_used       = memory #1
use_count         = 2

Таким образом доказано:

  • ответ не зависел от Session Memory;
  • память работала в новой сессии;
  • память пережила restart Router;
  • SQLite persistence работает;
  • retrieval правильно нашёл нужный факт.

Тестирование

Для каждой версии Router используется regression suite.

Для v4.7:

test-router-v4.7.py

Проверяются:

  • базовая маршрутизация;
  • score routing;
  • context routing;
  • session affinity;
  • hysteresis;
  • escalation;
  • verifier;
  • session history;
  • persistent session storage;
  • Long-Term Memory;
  • add memory;
  • list memory;
  • retrieve memory;
  • no-match retrieval;
  • use_count;
  • last_used_at;
  • delete memory;
  • SQLite persistence;
  • HTTP Memory API.

Финальный результат regression suite:

=== v4.7 MEMORY REGRESSION OK ===

🎉 ALL TESTS PASSED

Memory regression выполняется на временной SQLite-базе и не изменяет production memory.

Health API

Для диагностики используется:

GET /health

Пример v4.7:

{
  "router": "ok",
  "version": "4.7",
  "ollama_loaded_models": [
    "gemma3:4b"
  ],
  "sessions": 2,
  "sessions_memory": 0,
  "sessions_persistent": 2,
  "memory_facts": 1
}

Параметр:

memory_facts

показывает количество долговременных фактов.

Файлы проекта

Основные файлы текущей версии:

/home/artem/ramba-router/router_v47.py
/home/artem/ramba-router/test-router-v4.7.py
/home/artem/ramba-router/ramba-context.db

Исторические версии Router сохранены отдельно и доступны через Git history и release tags.

Production endpoints

Текущий Router v4.7:

127.0.0.1:8003

Дополнительно оставлена резервная контрольная версия v4.5:

127.0.0.1:8002

Она используется как fallback при разработке новых версий.

Git workflow

Разработка каждой крупной возможности ведётся в отдельной feature-ветке.

Для v4.7 использовалась:

feature/semantic-memory-v4.7

Основной commit:

18563ba Add semantic long-term memory for router v4.7

После успешных тестов feature-ветка была объединена с main.

Merge commit:

11b18b2 Merge branch 'feature/semantic-memory-v4.7' into 'main'

Релиз зафиксирован тегом:

v4.7

На момент релиза:

HEAD -> main
origin/main
tag: v4.7

указывали на один релизный commit.

Релизы

Версия Основное изменение Статус
v1 Первый keyword router Историческая
v2 Улучшенная классификация Историческая
v3 Score-based routing Историческая
v4.1–v4.3 Context-aware архитектура Стабильные этапы
v4.4 Escalation Готово
v4.5 Verifier Готово
v4.6 Persistent Session Memory Готово
v4.7 Semantic Long-Term Memory Current Stable

Ограничения текущей версии

Версия v4.7 уже имеет persistent long-term memory, но это всё ещё первая управляемая реализация.

Текущие ограничения:

  • память записывается через API;
  • отсутствует automatic memory extraction;
  • отсутствует автоматическое обновление фактов;
  • нет автоматической дедупликации;
  • нет memory consolidation;
  • retrieval основан на словах и тегах;
  • embeddings пока не используются;
  • vector database отсутствует;
  • нет confidence-модели для автоматически полученных фактов.

Это сделано намеренно.

Для текущего оборудования с GTX 1080 приоритетными являются:

  • прозрачность;
  • стабильность;
  • низкие накладные расходы;
  • простая диагностика;
  • контроль над содержимым памяти.

Следующий этап

Следующее поколение RAMBA AI Router должно добавить автоматическое извлечение и управление памятью.

Предварительная архитектура:

Conversation
     │
     ▼
Memory Extractor
     │
     ├── ignore
     │
     ├── create fact
     │
     ├── update fact
     │
     └── merge duplicate
              │
              ▼
         memory_facts
              │
              ▼
      Memory Retrieval
              │
              ▼
             LLM

Основные задачи следующего этапа:

  • Automatic Memory Extraction;
  • классификация полезности факта;
  • защита от случайного запоминания;
  • confidence;
  • дедупликация;
  • обновление изменившихся знаний;
  • consolidation;
  • conflict detection;
  • подготовка к embeddings.

После стабилизации жизненного цикла памяти можно переходить к:

  • semantic embeddings;
  • vector retrieval;
  • RAG;
  • внешним knowledge base;
  • tool calling;
  • AI Agent.

Перспективная архитектура

Долгосрочная цель проекта:

                         User
                           │
                           ▼
                  ┌─────────────────┐
                  │ RAMBA AI Agent  │
                  └────────┬────────┘
                           │
                           ▼
                  ┌─────────────────┐
                  │  RAMBA Router   │
                  └────────┬────────┘
                           │
             ┌─────────────┼─────────────┐
             │             │             │
             ▼             ▼             ▼
          Memory          RAG           Tools
             │             │             │
             └─────────────┼─────────────┘
                           │
                           ▼
                  Model Orchestration
                           │
              ┌────────────┼────────────┐
              │            │            │
              ▼            ▼            ▼
             FAST        INFRA        SMART
                           │
                           ▼
                      Local GPU

В такой архитектуре Router становится не конечным приложением, а центральным AI orchestration layer.

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

Компонент Статус Версия
Ollama Готово
NVIDIA GPU inference Готово
FAST / Gemma 3 4B Готово
INFRA / Qwen3 8B Готово
SMART / Qwen3.5 9B Готово
Score-based Routing Готово v3
Context-Aware Routing Готово v4
Session Affinity Готово v4
Hysteresis Готово v4
Escalation Готово v4.4
Verifier Готово v4.5
Session Memory Готово v4.6
Persistent Context Готово v4.6
Semantic Long-Term Memory Готово v4.7
Memory API Готово v4.7
Automatic Memory Extraction Планируется Следующий этап
Memory Consolidation Планируется Следующий этап
Embeddings Планируется Позднее
Vector Search Планируется Позднее
RAG Планируется Позднее
Tool Calling Планируется Позднее
RAMBA AI Agent Планируется Будущий этап

Итог

RAMBA AI Router v4.7 — текущая стабильная версия локального интеллектуального маршрутизатора RAMBA ART.

Проект прошёл путь:

Keyword Router
      │
      ▼
Score Routing
      │
      ▼
Context Routing
      │
      ▼
Escalation
      │
      ▼
Verifier
      │
      ▼
Persistent Session Memory
      │
      ▼
Semantic Long-Term Memory

Текущая система уже умеет:

  • автоматически выбирать локальную модель;
  • учитывать специализацию запроса;
  • сохранять роль в контексте разговора;
  • избегать ненужного переключения моделей;
  • повышать уровень модели при необходимости;
  • проверять ответ;
  • сохранять историю сессий в SQLite;
  • восстанавливать сессии после restart;
  • хранить отдельные долгосрочные знания;
  • находить релевантные факты;
  • использовать знания в совершенно новой сессии;
  • сохранять долговременную память после restart Router.

Ключевой результат v4.7:

RAMBA AI получил настоящий persistent knowledge layer, независимый от конкретного диалога.

Production-проверка подтвердила полный цикл:

Memory Fact
     │
     ▼
SQLite
     │
     ▼
Router Restart
     │
     ▼
New Session
     │
     ▼
Memory Retrieval
     │
     ▼
Correct LLM Answer

Следующий этап проекта — автоматическое извлечение, обновление и консолидация памяти с последующим переходом к semantic retrieval, RAG и полноценному RAMBA AI Agent.