Після побудови повноцінної AI-платформи з агентами, інструментами, базою знань, потоковим чатом та middleware постає питання: як тестувати код, що викликає штучний інтелект? Звертатися до OpenAI у тестовому наборі неможливо - це повільно, коштує грошей на кожному запуску, а відповіді змінюються щоразу, тому assertions ніколи не спрацьовують стабільно.
Фейкування AI-викликів
У цьому епізоді вся система тестується за допомогою Pest без жодного API-виклику, використовуючи систему фейків SDK. Це працює точно так само, як фейкування пошти, нотифікацій або черг у Laravel. Ви визначаєте відповіді заздалегідь і перевіряєте, що були надіслані правильні промпти.
Спочатку проводиться швидке очищення коду: middleware переноситься в окремий namespace AI/middleware. Потім пишуться тести, які перевіряють, що агент отримує коректні промпти, обробляє контекст розмови та повертає детерміновані відповіді.
Запобігання випадковим викликам
Використовується метод preventStrayPrompts, щоб виявляти випадкові AI-виклики у потоках, які не повинні активувати агента взагалі, наприклад при створенні тікета. Це гарантує, що AI спрацьовує лише там, де це передбачено архітектурою.
Тестування черг та інструментів
Черговані промпти теж потрапляють під тестування. Перевіряється, що TicketClassifier додається до черги при валідному поданні та не потрапляє туди при невалідному. Кастомні інструменти тестуються безпосередньо на реальних записах бази даних.
Під час запису один із тестів виявляє помилку у фабриці, яку автор виправляє в реальному часі. Саме такі баги тести і повинні ловити.
Feature-тестування та векторні сховища
Чат-ендпоінт проходить feature-тестування на автентифікацію, валідацію та коректну взаємодію з агентом. Потім тестується налаштування векторного сховища та заповнення бази знань шляхом фейкування створення store, завантаження документів та генерації embeddings.
Результати
Наприкінці всі 12 AI-тестів проходять успішно, виконуються швидко і ніколи не торкаються зовнішнього API. Їх можна запускати на кожному коміті без турбот про вартість чи нестабільність результатів.
Що далі
Наступний епізод присвячений безпеці. Агент захищається від prompt injection та інших атак, включаючи перевірку кожного повідомлення локальною LLM ще до того, як воно потрапить до OpenAI. Заблоковані повідомлення не коштують жодного центу на API-викликах.
Відеотуторіал епізоду доступний на YouTube та триває 15 хвилин. Код проєкту опублікований на GitHub.