RAG для расплывчатых вопросов, детерминированный CLI для точных
Оперативна пам'ять телекому знаходиться в його системі тікетів. Наша — 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 і вичитані. Помітили помилку? Напишіть мені.