← Blog

RAG для расплывчатых вопросов, детерминированный CLI для точных

DEENESRUUK

Оперативна пам'ять телекому знаходиться в його системі тікетів. Наша — IBM Maximo: кожен випадок несправності, кожен обрив оптоволокна, кожен візит на об'єкт. Питання, які люди їй ставлять, поділяються на дві дуже різні форми — і цікаве інженерне рішення полягало в тому, щоб відповідати на них двома різними інструментами.

Два типи запитань

  • "Чи були подібні збої на цьому маршруті минулої зими? Що зазвичай спричиняє нестабільність у цій PoP?" — розмиті, семантичні питання, що вимагають судження.
  • "Скільки тікетів про несправності було у березні? Перерахуйте відкриті для України." — точні, підрахункові питання.

Помилкою буде кидати обидва типи запитань в мовну модель. LLM чудово справляється з першим типом і тихо непередбачувана у другому — попросіть її порахувати, і вона впевнено надасть число, яке майже правильне. Тому інструментарій розділяє їх:

  • RAG (Onyx). maximo_sync.py входжує до Maximo (тільки для читання), парсить структуру об'єктів тікетів, перетворює кожен тікет на текстовий документ плюс агреговані документи "резюме" та завантажує їх у локальний індекс Onyx. Тепер розмиті питання можна ставити природною мовою. Синхронізація є ідемпотентною (хеш маніфест), тому вона безпечна під cron.
  • Детермінарний CLI. maximo_stats.py відповідає на підрахункові питання, запитуючи Maximo напряму — --year, --month, --type, --status, --list, --json. Жодної моделі в циклі, жодних галюцинаторних підсумків. Це нудотний, але правильний відповідник до RAG.

Цей поділ — LLM для значення, код для арифметики — і є всією ідеєю.

На околицях

  • Панель стану. Щогодинний знімок створюється для кожної країни та синхронізується з веб-хостом; невеликий PHP дашборд відображає його, включаючи карту PoP (Leaflet) та блок аналітики на основі евристики — проксі MTTR/SLA, згадки обладнання, гарячі точки обривів оптоволокна. Аналітика навмисно приблизна і маркується як така.
  • Спостерігач Telegram. Він відстежує активні тікети про несправності для певного місця та надсилає мені сповіщення про нові/закриті події, а також щогодинне консолідоване резюме того, що все ще відкрите.

Створено для безпеки та портативності

Усе тільки для читання щодо Maximo — лише запити GET, обліковий запис з правами на читання, нічого, що може змінити тікет. Python інструменти використовують лише стандартну бібліотеку, жодних сторонніх пакетів, тому вони працюють на будь-якому боксі з Python. І ніщо специфічне для розгортання не вбудовано: кінцеві точки, облікові дані та область дії беруться з env файлів (chmod 600, поза репозиторієм), тоді як еталонні дані, що постачаються в репозиторій, є невеликими синтетичними зразками — реальні експортні файли, облікові дані та знімки ігноруються gitignore.

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

Прозорість: більшість дописів тут створено за допомогою ШІ, а неанглійські версії перекладені локальною LLM і вичитані. Помітили помилку? Напишіть мені.