Задача
Собрать локальный сервис, который классифицирует обращения, безопасно вызывает разрешённые инструменты и отвечает по документам с проверяемыми источниками.
Решение
- Ollama и
qwen3:8bдля локальной генерации; - Pydantic и JSON Schema для контрактов;
- allowlist из двух узких инструментов;
- SQLite для памяти, audit log и небольшого векторного индекса;
qwen3-embedding:0.6bдля поиска по русскоязычным документам;- FastAPI и Docker Compose для локального API;
- pytest и эталонный RAG-набор для измеримой проверки.
Проверенный результат
- 41 тест после добавления API-защиты и backup/restore;
- RAG evaluation: 6/6 сценариев, retrieval hit rate 100%;
- корректный отказ на вопрос, ответа на который нет в документах;
- контейнер ARM64 проходит health/readiness и обращается к Ollama хоста.
Цифры относятся к демонстрационному набору и не переносятся автоматически на данные клиента.
Обнаруженная ошибка
На первом сквозном тесте модель перепутала цену 2490 с числом 1001 из ID заказа. Универсальный калькулятор был заменён узким инструментом calculate_order_total, который получает цену из доверенного справочника. Это устранило возможность самостоятельно подставить цену.
Ограничения
- demo-документы вымышлены;
- SQLite-поиск рассчитан на небольшой объём;
- локальная модель может ошибаться;
- публичный доступ требует TLS, управления секретами, лимитов запросов и мониторинга;
- качество нового клиентского набора должно измеряться отдельно.