RAMBA AI Router: различия между версиями
Нет описания правки |
Artem (обсуждение | вклад) Нет описания правки |
||
| Строка 1: | Строка 1: | ||
<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. | |||
Router принимает запрос пользователя, анализирует его тип и контекст, выбирает подходящую локальную LLM, при необходимости повышает уровень модели, проверяет ответ через Verifier и использует постоянную память между диалогами. | |||
'''Текущая стабильная версия:''' '''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> | ||
| | | Более сложный анализ и рассуждение | ||
|} | |} | ||
Общая идея: | |||
< | <syntaxhighlight lang="text"> | ||
Request | |||
│ | |||
▼ | |||
RAMBA Router | |||
│ | |||
┌───────────┼───────────┐ | |||
│ │ │ | |||
▼ ▼ ▼ | |||
FAST INFRA SMART | |||
Gemma 3 4B Qwen3 8B Qwen3.5 9B | |||
</syntaxhighlight> | |||
▼ | |||
</ | |||
Такой подход позволяет не использовать самую тяжёлую модель для каждого простого запроса. | |||
= Архитектура = | |||
Текущая архитектура 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> | |||
= Принцип работы = | |||
Обработка одного сообщения в актуальной версии выглядит примерно так: | |||
< | <syntaxhighlight lang="text"> | ||
/ | 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. Возврат ответа | |||
</syntaxhighlight> | |||
= История развития = | |||
== Router v1 == | |||
Первая версия Router была proof-of-concept. | |||
Основная задача заключалась в том, чтобы доказать сам принцип: | |||
'''один API может автоматически направлять разные запросы в разные локальные модели.''' | |||
Маршрутизация в основном основывалась на простых правилах и ключевых словах. | |||
Архитектура: | |||
<syntaxhighlight lang="text"> | |||
Request | |||
│ | |||
▼ | |||
Keyword Rules | |||
│ | |||
├── FAST | |||
├── INFRA | |||
└── SMART | |||
</syntaxhighlight> | |||
Главный результат v1 — подтверждение жизнеспособности идеи локального multi-model Router. | |||
== | == Router v2 == | ||
Во второй версии была улучшена логика классификации запросов. | |||
Вместо одного простого совпадения ключевых слов Router начал учитывать несколько признаков запроса. | |||
Появилась более стабильная специализация моделей. | |||
Основная проблема всё ещё сохранялась: | |||
* Router практически не понимал контекст; | |||
* follow-up сообщения могли классифицироваться неправильно; | |||
* история разговора не являлась частью маршрутизации. | |||
== Router v3 == | |||
Router v3 стал заметным архитектурным шагом вперёд. | |||
Основным изменением стала '''score-based routing'''. | |||
Каждая роль могла получать собственный score. | |||
Пример: | |||
<syntaxhighlight lang="text"> | |||
Запрос: | |||
"Как пробросить GPU в Proxmox?" | |||
FAST = 0 | |||
INFRA = 8 | |||
SMART = 2 | |||
Результат: | |||
INFRA | |||
</syntaxhighlight> | |||
Это позволило отказаться от жёсткой схемы: | |||
<syntaxhighlight lang="text"> | |||
нашли одно слово → выбрали модель | |||
</syntaxhighlight> | |||
в пользу: | |||
<syntaxhighlight lang="text"> | |||
несколько признаков | |||
│ | |||
▼ | |||
score каждого класса | |||
│ | |||
▼ | |||
лучший маршрут | |||
</syntaxhighlight> | |||
В поколении 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 == | |||
{| 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> | |||
Если анализировать только вторую фразу: | |||
= | <syntaxhighlight lang="text"> | ||
А как проверить? | |||
</syntaxhighlight> | |||
она почти не содержит информации для классификации. | |||
Router v4 учитывает историю разговора и может сохранить прежнюю специализацию. | |||
Таким образом: | |||
< | <syntaxhighlight lang="text"> | ||
Proxmox / | Proxmox / GPU passthrough | ||
│ | │ | ||
▼ | ▼ | ||
INFRA | |||
│ | │ | ||
▼ | ▼ | ||
"А как проверить?" | |||
│ | │ | ||
▼ | ▼ | ||
INFRA | |||
</ | </syntaxhighlight> | ||
= Session Affinity и Hysteresis = | |||
В Router v4 используется концепция session affinity. | |||
Если разговор уже уверенно ведётся одной специализированной моделью, Router не должен переключаться между моделями из-за каждого короткого сообщения. | |||
Hysteresis снижает число ненужных переключений. | |||
Упрощённо: | |||
<syntaxhighlight lang="text"> | |||
Current role = INFRA | |||
Новый score: | |||
FAST 3 | |||
INFRA 4 | |||
Разница небольшая | |||
│ | |||
▼ | |||
оставить INFRA | |||
</syntaxhighlight> | |||
Это делает разговор стабильнее. | |||
= Escalation = | |||
Escalation позволяет автоматически повысить уровень модели, если первоначально выбранная модель не подходит для запроса. | |||
Пример: | |||
<syntaxhighlight lang="text"> | |||
Request | |||
│ | |||
▼ | |||
FAST | |||
│ | |||
├── ответ достаточный → вернуть | |||
│ | |||
└── требуется усиление | |||
│ | |||
▼ | |||
SMART | |||
</syntaxhighlight> | |||
Или: | |||
<syntaxhighlight lang="text"> | |||
INFRA | |||
│ | |||
└── сложный анализ | |||
│ | |||
▼ | |||
SMART | |||
</syntaxhighlight> | |||
Таким образом Router может начинать с более дешёвой и быстрой модели, а более мощную использовать только тогда, когда это действительно требуется. | |||
= Verifier = | |||
как | Verifier используется как дополнительная проверка ответа. | ||
Его задача — снизить риск выдачи явно слабого, противоречивого или потенциально ненадёжного результата. | |||
Упрощённая схема: | |||
= | <syntaxhighlight lang="text"> | ||
Primary Model | |||
│ | |||
▼ | |||
Answer | |||
│ | |||
▼ | |||
Verifier | |||
│ | |||
├── OK | |||
│ | |||
└── требуется correction | |||
</syntaxhighlight> | |||
Verifier является частью поколения Router v4. | |||
= Persistent Session Memory — v4.6 = | |||
Версия '''v4.6''' добавила постоянное хранение истории сессий. | |||
До этого часть session state зависела от жизни процесса Router. | |||
Основная SQLite-база: | |||
<syntaxhighlight lang="text"> | |||
/home/artem/ramba-router/ramba-context.db | |||
</syntaxhighlight> | |||
Для session memory используется таблица: | |||
<syntaxhighlight lang="text"> | |||
sessions | |||
</syntaxhighlight> | |||
Основные поля: | |||
= | <syntaxhighlight lang="text"> | ||
session_id | |||
role | |||
model | |||
messages_json | |||
created_at | |||
updated_at | |||
</syntaxhighlight> | |||
Архитектура: | |||
< | <syntaxhighlight lang="text"> | ||
Пользователь | |||
│ | |||
▼ | |||
session_id | |||
│ | |||
▼ | |||
RAMBA Router | |||
│ | |||
</ | ▼ | ||
SQLite sessions | |||
│ | |||
▼ | |||
messages_json | |||
│ | |||
▼ | |||
LLM Context | |||
</syntaxhighlight> | |||
В результате история диалога переживает перезапуск процесса Uvicorn. | |||
После рестарта Router может загрузить session state из SQLite. | |||
= Semantic Long-Term Memory — v4.7 = | |||
Версия '''v4.7''' добавила второй независимый механизм памяти. | |||
Если Session Memory хранит историю конкретного разговора, Long-Term Memory хранит отдельные знания. | |||
Пример: | |||
<syntaxhighlight lang="text"> | |||
На сервере depo установлена NVIDIA GeForce GTX 1080. | |||
</syntaxhighlight> | |||
Такой факт не относится к одной конкретной session_id. | |||
Он может использоваться: | |||
* завтра; | |||
* после restart Router; | |||
* в новой сессии; | |||
* в разговоре с другим session_id. | |||
== Два уровня памяти == | |||
{| class="wikitable" | |||
! Возможность | |||
! Session Memory | |||
! Long-Term Memory | |||
|- | |||
| Версия | |||
| v4.6 | |||
| v4.7 | |||
|- | |||
| Привязана к session_id | |||
| Да | |||
| Нет | |||
|- | |||
| Хранит историю диалога | |||
| Да | |||
| Нет | |||
|- | |||
| Хранит отдельные знания | |||
| Нет | |||
| Да | |||
|- | |||
| SQLite persistence | |||
| Да | |||
| Да | |||
|- | |||
| Переживает restart | |||
| Да | |||
| Да | |||
|- | |||
| Работает между сессиями | |||
| Нет | |||
| Да | |||
|- | |||
| Tags | |||
| Нет | |||
| Да | |||
|- | |||
| Importance | |||
| Нет | |||
| Да | |||
|- | |||
| Статистика использования | |||
| Нет | |||
| Да | |||
|} | |||
Архитектурно: | |||
< | <syntaxhighlight lang="text"> | ||
RAMBA Router | |||
</ | │ | ||
┌──────────┴──────────┐ | |||
│ │ | |||
▼ ▼ | |||
Session Memory Long-Term Memory | |||
│ │ | |||
current dialog knowledge | |||
│ │ | |||
└──────────┬──────────┘ | |||
▼ | |||
LLM Context | |||
</syntaxhighlight> | |||
= | = Таблица memory_facts = | ||
Для долговременной памяти используется отдельная SQLite-таблица: | |||
< | <syntaxhighlight lang="sql"> | ||
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 | |||
); | |||
</syntaxhighlight> | |||
Поля: | |||
< | {| class="wikitable" | ||
! Поле | |||
! Назначение | |||
|- | |||
</ | | <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 = | |||
< | <syntaxhighlight lang="json"> | ||
{ | |||
"fact": "На сервере depo установлена видеокарта NVIDIA GeForce GTX 1080", | |||
</ | "scope": "global", | ||
"tags": [ | |||
"depo", | |||
"gpu", | |||
"nvidia", | |||
"gtx1080" | |||
], | |||
"importance": 0.9 | |||
} | |||
</syntaxhighlight> | |||
= Memory Retrieval = | |||
Перед вызовом LLM Router выполняет поиск релевантной долговременной памяти. | |||
Функция: | |||
< | <syntaxhighlight lang="python"> | ||
retrieve_memories() | |||
</syntaxhighlight> | |||
</ | |||
Упрощённая схема: | |||
< | <syntaxhighlight lang="text"> | ||
User message | |||
│ | |||
▼ | |||
</ | retrieve_memories() | ||
│ | |||
▼ | |||
memory_facts | |||
│ | |||
▼ | |||
relevance score | |||
│ | |||
▼ | |||
top memories | |||
│ | |||
▼ | |||
System Context | |||
│ | |||
▼ | |||
LLM | |||
</syntaxhighlight> | |||
В версии v4.7 retrieval основан на: | |||
* совпадениях слов; | |||
* совпадениях тегов; | |||
* importance. | |||
Количество одновременно добавляемых фактов ограничено: | |||
< | <syntaxhighlight lang="python"> | ||
MAX_MEMORY_FACTS = 5 | |||
</ | </syntaxhighlight> | ||
Это защищает prompt от чрезмерного разрастания. | |||
Нерелевантная память не добавляется. | |||
= Memory API = | |||
Версия v4.7 предоставляет отдельное API управления памятью. | |||
== Добавление факта == | |||
Endpoint: | |||
<syntaxhighlight lang="text"> | |||
POST /memory | |||
</syntaxhighlight> | |||
Пример | Пример: | ||
< | <syntaxhighlight lang="json"> | ||
{ | { | ||
" | "fact": "На сервере depo установлена видеокарта NVIDIA GeForce GTX 1080", | ||
" | "scope": "global", | ||
" | "tags": ["depo", "gpu", "nvidia", "gtx1080"], | ||
"importance": 0.9 | |||
" | |||
} | } | ||
</ | </syntaxhighlight> | ||
== Просмотр памяти == | |||
<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 была создана ещё одна новая сессия. | |||
Запрос: | |||
< | <syntaxhighlight lang="text"> | ||
Что за GPU стоит на depo? | |||
</syntaxhighlight> | |||
</ | |||
Результат: | |||
< | <syntaxhighlight lang="text"> | ||
NVIDIA GeForce GTX 1080. | |||
</syntaxhighlight> | |||
</ | |||
При этом: | |||
== | <syntaxhighlight lang="text"> | ||
history_messages = 0 | |||
memory_used = memory #1 | |||
use_count = 2 | |||
</syntaxhighlight> | |||
Таким образом доказано: | |||
* ответ не зависел от Session Memory; | |||
* память работала в новой сессии; | |||
* память пережила restart Router; | |||
* SQLite persistence работает; | |||
* retrieval правильно нашёл нужный факт. | |||
= Тестирование = | |||
Для | Для каждой версии Router используется regression suite. | ||
Для v4.7: | |||
<syntaxhighlight lang="text"> | |||
test-router-v4.7.py | |||
</syntaxhighlight> | |||
Проверяются: | |||
* базовая маршрутизация; | |||
* 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: | |||
<syntaxhighlight lang="text"> | |||
=== v4.7 MEMORY REGRESSION OK === | |||
🎉 ALL TESTS PASSED | |||
</syntaxhighlight> | |||
Memory regression выполняется на временной SQLite-базе и не изменяет production memory. | |||
= Health API = | |||
Для диагностики используется: | |||
<syntaxhighlight lang="text"> | |||
GET /health | |||
</syntaxhighlight> | |||
Пример v4.7: | |||
= | <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> | |||
Параметр: | |||
< | <syntaxhighlight lang="text"> | ||
memory_facts | |||
</syntaxhighlight> | |||
показывает количество долговременных фактов. | |||
= Файлы проекта = | |||
Основные файлы текущей версии: | |||
= | <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. | |||
= Production endpoints = | |||
Текущий Router v4.7: | |||
< | <syntaxhighlight lang="text"> | ||
127.0.0.1:8003 | |||
</ | </syntaxhighlight> | ||
Дополнительно оставлена резервная контрольная версия v4.5: | |||
< | <syntaxhighlight lang="text"> | ||
127.0.0.1:8002 | |||
</ | </syntaxhighlight> | ||
Она используется как fallback при разработке новых версий. | |||
= | = Git workflow = | ||
Разработка каждой крупной возможности ведётся в отдельной feature-ветке. | |||
Для v4.7 использовалась: | |||
<syntaxhighlight lang="text"> | |||
feature/semantic-memory-v4.7 | |||
</syntaxhighlight> | |||
Основной commit: | |||
<syntaxhighlight lang="text"> | |||
18563ba Add semantic long-term memory for router v4.7 | |||
</ | </syntaxhighlight> | ||
После успешных тестов feature-ветка была объединена с main. | |||
Merge commit: | |||
<syntaxhighlight lang="text"> | |||
11b18b2 Merge branch 'feature/semantic-memory-v4.7' into 'main' | |||
</syntaxhighlight> | |||
Релиз зафиксирован тегом: | |||
<syntaxhighlight lang="text"> | |||
v4.7 | |||
</syntaxhighlight> | |||
На момент релиза: | |||
<syntaxhighlight lang="text"> | |||
HEAD -> main | |||
origin/main | |||
tag: v4.7 | |||
</syntaxhighlight> | |||
указывали на один релизный commit. | |||
= Релизы = | |||
{| 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''' | |||
|} | |||
= Ограничения текущей версии = | |||
Версия v4.7 уже имеет persistent long-term memory, но это всё ещё первая управляемая реализация. | |||
Текущие ограничения: | |||
* память записывается через API; | |||
* отсутствует automatic memory extraction; | |||
* отсутствует автоматическое обновление фактов; | |||
* нет автоматической дедупликации; | |||
* нет memory consolidation; | |||
* retrieval основан на словах и тегах; | |||
* embeddings пока не используются; | |||
* vector database отсутствует; | |||
* нет confidence-модели для автоматически полученных фактов. | |||
Это сделано намеренно. | |||
Для текущего оборудования с GTX 1080 приоритетными являются: | |||
* прозрачность; | |||
* стабильность; | |||
* низкие накладные расходы; | |||
* простая диагностика; | |||
* контроль над содержимым памяти. | |||
= | = Следующий этап = | ||
Следующее поколение RAMBA AI Router должно добавить автоматическое извлечение и управление памятью. | |||
Предварительная архитектура: | |||
<syntaxhighlight lang="text"> | |||
Conversation | |||
│ | |||
▼ | |||
Memory Extractor | |||
│ | |||
├── ignore | |||
│ | |||
├── create fact | |||
│ | |||
├── update fact | |||
│ | |||
└── merge duplicate | |||
│ | |||
▼ | |||
memory_facts | |||
│ | |||
▼ | |||
Memory Retrieval | |||
│ | |||
▼ | |||
LLM | |||
</syntaxhighlight> | |||
Основные задачи следующего этапа: | |||
* Automatic Memory Extraction; | |||
* классификация полезности факта; | |||
* защита от случайного запоминания; | |||
* confidence; | |||
* дедупликация; | |||
* обновление изменившихся знаний; | |||
* consolidation; | |||
* conflict detection; | |||
* подготовка к embeddings. | |||
После стабилизации жизненного цикла памяти можно переходить к: | |||
* semantic embeddings; | |||
* vector retrieval; | |||
* RAG; | |||
* внешним knowledge base; | |||
* tool calling; | |||
* AI Agent. | |||
Перспективная архитектура | = Перспективная архитектура = | ||
Долгосрочная цель проекта: | |||
<syntaxhighlight lang="text"> | |||
User | |||
│ | |||
▼ | |||
┌─────────────────┐ | |||
│ RAMBA AI Agent │ | |||
└────────┬────────┘ | |||
│ | |||
▼ | |||
┌─────────────────┐ | |||
│ RAMBA Router │ | |||
└────────┬────────┘ | |||
│ | |||
┌─────────────┼─────────────┐ | |||
│ │ │ | |||
▼ ▼ ▼ | |||
Memory RAG Tools | |||
│ │ │ | |||
└─────────────┼─────────────┘ | |||
│ | |||
▼ | |||
Model Orchestration | |||
│ | |||
┌────────────┼────────────┐ | |||
│ │ │ | |||
▼ ▼ ▼ | |||
FAST INFRA SMART | |||
│ | |||
▼ | |||
Local GPU | |||
</syntaxhighlight> | |||
В такой архитектуре Router становится не конечным приложением, а центральным AI orchestration layer. | |||
= Статус проекта = | |||
{| 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 | |||
|- | |- | ||
| | | 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 | | 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> | |||
Текущая система уже умеет: | |||
* автоматически выбирать локальную модель; | |||
* учитывать специализацию запроса; | |||
* сохранять роль в контексте разговора; | |||
* избегать ненужного переключения моделей; | |||
* повышать уровень модели при необходимости; | |||
* проверять ответ; | |||
* сохранять историю сессий в SQLite; | |||
* восстанавливать сессии после restart; | |||
* хранить отдельные долгосрочные знания; | |||
* находить релевантные факты; | |||
* использовать знания в совершенно новой сессии; | |||
* сохранять долговременную память после restart Router. | |||
Ключевой результат v4.7: | |||
'''RAMBA AI получил настоящий persistent knowledge layer, независимый от конкретного диалога.''' | |||
Production-проверка подтвердила полный цикл: | |||
<syntaxhighlight lang="text"> | |||
Memory Fact | |||
│ | |||
▼ | |||
SQLite | |||
│ | |||
▼ | |||
Router Restart | |||
│ | |||
▼ | |||
New Session | |||
│ | |||
▼ | |||
Memory Retrieval | |||
│ | |||
▼ | |||
Correct LLM Answer | |||
</syntaxhighlight> | |||
Следующий этап проекта — автоматическое извлечение, обновление и консолидация памяти с последующим переходом к semantic retrieval, RAG и полноценному RAMBA AI Agent. | |||
Текущая версия от 01:05, 8 сентября 2026
Локальный интеллектуальный маршрутизатор 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 LLMRouter позволяет использовать несколько моделей одновременно, не заставляя пользователя вручную выбирать модель для каждого запроса.
Основные задачи:
- автоматический выбор подходящей 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:11434Router реализован на:
- 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
│
▼
"А как проверить?"
│
▼
INFRASession 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
│
└── требуется correctionVerifier является частью поколения 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 PASSEDMemory 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.