В одному абзаці
Кадрове агентство знайомилося з кандидатами вручну. Людина натискала кнопку на сайті, наступного дня їй передзвонював рекрутер і 5–10 хвилин розпитував про те саме, про що й усіх: чим хоче займатися, який має досвід і документи, де шукає роботу, коли готова почати. Лише після цього рекрутер прикидав, чи підійде кандидат під одну з кількох сотень відкритих вакансій. Цей проєкт замінив перший дзвінок чат-агентом: та сама розмова триває 3–5 хвилин, іде цілодобово, а в адмінці рекрутера з’являється черга попередньо відібраних кандидатів. Агент запрацював за 6 днів, і тоді почалося найцікавіше – він зустрівся з живими людьми. Реальні розмови показали, що такий агент час від часу впевнено каже неправду – скажімо, «there are no vacancies in your city», хоча навіть не шукав, – а латати кожну таку фразу окремим словесним правилом марно: модель каже те саме іншими словами, і ти знову програєш. Тож агента перебудували з іншим розподілом ролей: що робити, вирішує код, як це сказати – модель, а кожне її твердження звіряють із тим, що насправді зробили інструменти, ще до того, як його побачить кандидат.
Проблема мовою бізнесу
Спершу все впиралося в календар рекрутера, і автоматизація першого дзвінка цю проблему зняла. На її місці з’явилася інша, тонша й дорожча: система, що говорить із людьми живою мовою, може помилятися так, як анкета не помилиться ніколи. Зламану анкету видно одразу. Агент помиляється гладко й переконливо: каже кандидатові з якраз потрібним досвідом, що для нього нічого немає, той вірить, іде до конкурентів – і ніхто ніколи не напише, що щось пішло не так. Головний ризик для бізнесу тут – не простій. Це впевнене речення, за яким нічого не стоїть, сказане саме тому кандидатові, якого варто було працевлаштувати. З боку супроводу картина та сама: 86 із перших 182 змін у коді виправляли помилки, і кожне нове правило наштовхувалося на попереднє.
- кожне виправлення забороняє одне формулювання, яке модель ужила минулого тижня
- модель обходить заборону іншими словами – і помилка повертається
- близько 25 фільтрів на регулярних виразах перечитують уже готову відповідь
- хибне «no vacancies» не відрізниш від правдивого
- згодом ніхто не скаже, яке твердження мало під собою підставу
- модель наперед називає свій крок – один з 11 дозволених
- код звіряє цей крок із тим, що насправді зробили інструменти
- безпідставне твердження перевіряють заново, послаблюють або справді виконують
- «no vacancies» з'являється лише після справжнього пошуку
- один підсумок доказів на кожну репліку – його видно в журналі адмінки
Чим це відрізняється від «чат-бота з доступом до бази»
Усе тримається на одному виборі – хто вирішує, що робити. У першій версії вирішувала модель, а словесні правила намагалися виправити її вже потім: кожне виправлення було здогадкою, яке ж формулювання заборонити, і ці здогадки так ні до чого й не привели. Тепер модель робить дві речі, які моделям справді вдаються, – розуміє, що сказав кандидат, і тепло йому відповідає, – а все інше робить код. Окремий дешевий прохід перечитує кожне повідомлення ще до того, як агент почне складати відповідь, тож усе, що відбувається далі, вже бачить оновлений профіль кандидата. Запитання під час знайомства код ставить у наперед заданому порядку; модель на цих кроках пише лише одне тепле речення і не виходить за жорсткі межі чесності. Кроки, що стосуються вакансій, повертають просту структуровану відповідь, і перше її поле – назва наміру. Саме те, що модель наперед називає свій крок, і дає змогу його перевірити: усі дії інструментів зводять в один запис доказів, кожен намір, що щось стверджує, перевіряють, чи є під ним підстава, а твердження без доказів виправляють за чіткими правилами – або справді запускають пошук заново, або послаблюють намір, або нарешті виконують відкликання, про яке модель лише говорила. Останнє повідомлення складає код, тож факти про вакансії модель не пише ніколи.
Друге рішення часто сприймають як компроміс. Постачальника моделі визначають вимоги до того, де зберігаються дані, бо в системі лежать імена кандидатів, їхні телефони й трудова історія. Але саме це обмеження і змусило зробити архітектуру як слід: коли від проблеми надійності не відкупишся сильнішою моделлю, чесність доводиться вбудовувати в саму конструкцію. Серед моделей дозволеного постачальника спробували й середню за рівнем – і відмовилися: вона дорожча і гірше тримає нитку розмови, а саме в цьому вся робота агента.
| критерій | словесні правила + фільтри на регулярних виразах | структурований намір, звірений із доказами обрано | купити сильнішу модель |
|---|---|---|---|
| ловить твердження, якого ще не траплялося | ні | так | частково |
| виправлення витримує перефразування | ні | так | частково |
| можна перевірити згодом | частково | так | ні |
| відповідає вимогам до зберігання даних | так | так | ні |
| вартість однієї розмови | базова | нижча | у 3–5 разів вища |
Постачальника обирають не за якістю моделі. Команди, що обирають за якістю, у регульованих процесах опиняються з архітектурою, яку не можуть обстояти. Ця система зберігає імена, номери телефонів і трудову історію, тож постачальника визначають місце зберігання даних і угода про їх обробку. «Взяти сильнішу модель» стає можливим лише тоді, коли сильніша модель відповідає обом вимогам.
Як це виглядає в роботі
Перед початком роботи
Кожна сесія починається з двох файлів. Перший пояснює, що це за система і які рішення вже ухвалено; другий – карта архітектури, яку генерують із самого коду, тож вона не може непомітно розійтися з тим, що насправді працює.
Три сесії нижче – це три обличчя цієї роботи. У першій вигадані кандидати проходять крізь справжнього агента й натрапляють на помилку, причина якої зрештою зовсім не в агенті. У другій рахунок виявляється у 4 рази більшим, ніж показувала його ж панель витрат. У третій вирішують, чи платити за окремий прохід, що витягує факти з описів вакансій, – і спершу збирають докази, що це того варте.
Нових функцій тут немає. Усі три – та робота, від якої залежить, чи переживе така система свій другий місяць: саме тоді більшості таких систем потихеньку перестають довіряти.
Знайти помилку раніше за кандидата
Агента перевіряє інший агент. Мовна модель грає кандидата: вона знає про нього все, але розкриває факти лише тоді, коли спитають, по одному, і пише так, як справді пишуть люди, – коротко, з маленької літери, перескакуючи з мови на мову посеред речення. Це куди суворіше випробування, ніж розмова за сценарієм, бо воно показує, що робить агент, коли відомості надходять не в тому порядку.
Цей раунд виловив дорогий збій. Кандидат питав про роботу в одній конкретній сфері, і йому 5 реплік поспіль відповідали, що нічого немає, хоча в індексі лежали 4 такі вакансії. Нічого не впало. У журналах порожньо. Для бізнесу гіршого не буває: кандидата, якого можна було працевлаштувати, тихо не працевлаштували.
Корінь проблеми ховався на три символи глибше, ніж зазвичай зазирають. У мові кандидатів деякі слова пишуться з апострофом усередині, а в текстах вакансій трапилося 6 різних знаків апострофа. Дрібниця з типографіки, але через неї одне й те саме слово зводилося до основи 3 різними способами – залежно від того, який символ підставила клавіатура телефона. Професії з апострофом у назві пошук не знаходив іще до перебудови, а синоніми з індексу підхопили ту саму ваду ще тоді, коли їх добували з текстів вакансій.
Саме виправлення – кілька рядків, що приводять усі апострофи до одного вигляду. Цінне інше: тестовий стенд подав проблему як одному конкретному кандидатові помилково відповіли «ні», а не як туманне відчуття, що пошук часом підводить. 28 таких раундів пройшли до запуску й після нього; кожну помилку простежили до справжнього запису розмови й закрили тестом, який голосно впаде, якщо вона повернеться.
Рахунок, що ховався за власною панеллю витрат
Від собівартості однієї розмови залежить, чи стане такий агент продуктом, чи лишиться науковим експериментом. Коли розмова коштує частку цента, з агентом може поговорити кожен, хто звернувся. Коли під долар – уже доводиться вирішувати, які звернення цього варті, а щойно таке питання постає, автоматизація перестає бути автоматичною.
Панель витрат занижувала суму приблизно в 4 рази: вона досі рахувала розмовну модель за тарифом, який постачальник уже змінив. Саме такий збій варто знати в обличчя: цифра була на місці, просто хибна й зручна, і тижнями всіх заспокоювала.
А за нею ховалася справжня знахідка. Приблизно 250 000 токенів на вході проти 4000 на виході означають, що розмова майже повністю складається з того самого незмінного промпту, який на кожній репліці надсилають за повною ціною. Постачальники віддають цей повторюваний початок запиту з кешу у 10 разів дешевше, але лише тоді, коли в запиті є ключ кешу, – а бібліотека, через яку працював агент, не вміла його передати, тож ключ дописують у тіло запиту просто перед відправленням.
Потім ця ж перевірка знайшла ту саму помилку на рівень глибше: текст поточної репліки стояв перед блоком правил на 7000 символів, і для кешу лишався початок завдовжки якихось 200 символів. Для моделі текст той самий, лише порядок інший – і повна ціна за кожну репліку. Рахунок схуд приблизно на 70%, а жодне речення, яке бачать кандидати, не змінилося.
Витратити гроші й довести, що воно того варте
У системі агентства вакансії – це вільний текст, який писав той, хто їх розміщував. У 98% із них трапляється зайва розмітка, а середній опис удвічі з гаком довший, ніж уміщає картка в чаті. Саме в цьому тексті захована відповідь, чи є обмеження за віком або статтю, який насправді графік і які умови, – тобто те, про що кандидат питає насамперед і до чого пошук за ключовими словами не дістає.
Майже третина каталогу згадує вікове обмеження лише в тексті. Окремого поля з віком, за яким можна відфільтрувати, немає, тож без витягування фактів агент або показуватиме людям роботу, на яку їх не візьмуть, або ховатиме ту, що їм підходить. Ось чому варто платити за окремий прохід по вакансіях, – і це аргумент бізнесовий, а не технічний.
Самі витрати обмежені від початку. Факти з кожної вакансії витягують один раз, а відбиток змісту (хеш) показує, чи змінився текст, тож за незмінну вакансію двічі не платять. Вакансії, що зникли із системи агентства, закривають звичайним SQL-запитом, без жодної моделі, – тож навіть коли витягування зовсім не працює, індекс не почне показувати вакансії, яких уже немає.
Еталонний набір – той крок, який найлегше пропустити. Це 16 вакансій, розмічених уручну; їх можна будь-коли прогнати заново, а поля, від яких залежить, що побачить кандидат, мають збігатися з розміткою повністю. Без такого набору дрібна правка промпту, що потихеньку псує витягування, лишається невидимою, аж поки кандидатові не запропонують роботу, на яку він за законом не має права. Увесь каталог обійшовся приблизно в 6 доларів – і саме ця цифра зробила рішення легким.
Що вже працює
- ● 01розбір повідомленняперечитує повідомлення ще до відповіді · лише заповнює прогалини
- ● 02стан + доступ до інструментівна кожній репліці обчислюється заново · неповнолітнім підбір вакансій вимкнено
- ● 03план або генераціязнайомство йде в наперед заданому порядку · решта – цикл викликів інструментів
- ● 04зведення доказіводин прохід журналом кроків · пошуки, записи, відкликання
- ● 05перевірка + виправленнябезпідставний намір → новий пошук, слабший намір або справжнє виконання
- ● 06складання + синхронізаціялише тут з'являється остаточне повідомлення · завжди одне запитання
- ● 01рекламна сторінкавбудована в наявний спільний репозиторій агентства · без нового конвеєра розгортання
- ● 02агент у чат-застосункуодна вакансія в одному повідомленні, тож відповідь може послатися на конкретну картку
- ● 03чат-віджет на сайтітой самий агент за другими дверима · одна людина – один запис
- ● 04адмінка рекрутеразаписи розмов із журналом інструментів · профіль · робота зі статусами
- ● 05окремий індексаторповторно витягує факти лише зі змінених вакансій · звіряється після кожного розгортання
Розмова спирається лише на дві речі: справжні вакансії з власної системи агентства та невеликий вивірений довідник із трудового права разом зі свіжими курсами валют. Вигаданих ринкових даних немає ніде на цьому шляху. Коли агент чогось не знає, чесну відповідь дає код, а не правило, яке модель мусить пам’ятати. До живого рекрутера кандидат потрапляє лише тоді, коли профіль заповнено повністю й номер телефону збережено, а відповідність вимогам закладено прямо в схему бази даних: щоб видалити кандидата, досить одного запиту – і від нього не лишиться жодного сліду.
У вересні в агента з’явилися другі двері – чат-віджет на сайті самого агентства, поруч із чат-застосунком. Ядро й раніше не залежало від того, звідки прийшло повідомлення, тож канал став просто властивістю кандидата, а не окремим видом користувача: одна людина – один запис, хоч би якими дверима вона зайшла, а розмову, почату на сайті, можна продовжити в застосунку з того самого місця. Поки агент думає над реплікою, віджет показує, що саме він робить: зрозумів, шукаю, перевіряю. Голий потік тексту від моделі так не вміє, бо остаточна відповідь з’являється лише тоді, коли її складе код. Завести нового відвідувача сайту нічого не коштує, тож на веб-вході стоїть дев’ять рівнів захисту й бюджет, який рахують у грошах, а не в токенах. Його налаштували на 60 днях живого трафіку: 331 розмова, 4 691 репліка кандидатів, близько 18 800 токенів і менше цента на репліку ще до кешування. А половину відвідувачів сайту просили залишити номер телефону лише тоді, коли вони вже обрали вакансію: A/B-тест на тому єдиному полі, від якого залежить, чи зможе рекрутер передзвонити.
Кеш підхоплює лише незмінний початок запиту, тож порядок, у якому складається системний промпт, важить більше, ніж здається. Поставте змінний блок перед незмінним – і частина, що потрапляє в кеш, тихо скоротиться до того, що стоїть перед ним. Жоден тест не впаде. Просто рахунок знову поповзе вгору, і ніщо в репозиторії не підкаже чому.
Скільки насправді коштує агент для першої розмови
Чи це продукт, чи науковий експеримент, вирішують дві цифри: скільки коштує одна розмова з агентом і скільки коштувала б та сама розмова в хвилинах рекрутера. Спробуйте зі своїми обсягами.
працює у вашому браузері · 0 мережевих запитів · щоразу той самий результат
Кожне твердження лишає слід
Ця система знімає цілий різновид ризику. Кожна компанія, що доручає мовній моделі говорити з клієнтами, рано чи пізно чує те саме питання – а звідки ви знаєте, що вона цього просто не вигадала? – і здебільшого відповідає на нього довшим промптом. Тут відповідь – запис: агент називає свій крок, код звіряє його з тим, що зробили інструменти, і всю розмову потім можна перечитати в журналі адмінки. Саме це й переноситься на будь-яку іншу галузь. Рекрутинг тут – лише приклад; головне – розподіл ролей між кодом і моделлю.
6 днів до першого запуску. 2 місяці живих розмов. Один розробник. 1190 сценаріїв поведінки під тестами, на 70% менший рахунок і агент, кожне твердження якого підкріплене доказом.
Цей кейс про архітектуру та підходи. Агентство, його ринок, система, з якої беруться вакансії, публічне ім’я бота й внутрішні адреси, що могли б видати будь-що з цього, навмисно знеособлено; тут важить розподіл ролей між кодом і моделлю, а не те, хто саме кандидати.