Русский
Мелкие ошибки MCP-сервера и кто за них платит
Однажды в сентябре я задал дешёвому AI-ассистенту три вопроса по своей базе знаний, а потом прочитал не его ответы, а всё, что он делал по дороге к ним. Нашёл шесть мелких дефектов в сервисе, с которым ассистент разговаривает. О них никто не сообщал, и я понимаю почему. Продолжение A/B про инструкцию.
Когда AI-ассистент отвечает на вопрос по документам компании, он читает их не так, как вы. Он отправляет короткие запросы сервису, где документы лежат: найди вот это, открой вот то, покажи оглавление этой страницы. На каждый запрос приходит ответ, и по этому ответу ассистент решает, что спросить дальше. Обычный вопрос это десяток таких обменов. Вы видите итоговый ответ. Обмены происходят за кадром.
Сервис может ошибаться так, что никто не заметит, потому что никто не смотрит. Не падения. Мелочи. Сообщение об ошибке, которое повторяет вам вашу же опечатку в качестве исправления. Полезный факт, который сервис знает, но пишет на бланке, куда ассистент не заглядывает. Оглавление, которое на просьбу открыть главу отвечает «спросите на стойке» вместо того, чтобы её открыть. Каждая правка на одну строку. И у каждой перекошенная цена. Про этот перекос и текст.
Дорогой ассистент дефект проглатывает. Обходит его догадкой, пробует другую формулировку, тратит два-три лишних обмена и отвечает верно. Ваш счёт вырастает на пару центов, а пару центов никто не расследует. Дешёвый ассистент проглотить его не может. Он три раза утыкается в одну и ту же стену, тратит свой лимит обменов и отвечает из общих знаний, а не по вашим документам. Дефект тот же. Видимым его делает только дешёвый.
Что я запускал
У trip2g есть публичная база знаний, которая связывает вместе несколько баз поменьше. Вопрос про Марка Аврелия и Конфуция, к примеру, должен дотянуться до двух разных собраний: собрание Марка Аврелия лежит прямо у главного входа, собрание Конфуция внутри отдельного хаба из 21 философа, этажом ниже. Я взял визуализатор поиска, страницу на этом сайте, которая показывает шаги ассистента как живую карту, и превратил его в скрипт, который делает то же самое без браузера, scripts/mcp_search_logger.py. Он запускает дешёвую модель, даёт ей около десяти обменов на вопрос и записывает каждый шаг: что ассистент подумал, что спросил, что ответил сервис, каким получился ответ. Три вопроса: что Марк Аврелий и Конфуций говорят о том, как вставать по утрам; в чём Эпиктет и Уоттлс расходятся насчёт того, что в нашей власти; как настроить постоянную память для Claude Code через trip2g.
Ошибка, которая повторяет вашу же опечатку
2 сентября ассистент не ответил по документам ни на один из трёх вопросов. Вот момент, где умер первый. Ассистент уже нашёл карточку с описанием собрания Марка Аврелия и угадывал адрес самого собрания:
Ассистент спросил: собрание «trip2g/markavrelii»
Сервис ответил: такого собрания нет; обращайтесь к нему как «trip2g/markavrelii»
Ассистент отправил адрес, а сервис посоветовал ему этот же адрес. Сообщение было шаблоном с пропуском, пропуск никто не заполнил, и шаблон возвращал то, что пришло. Представьте, что вы спросили на ресепшене номер 214, вам ответили «нет, вам нужен номер 214», и вы пошли обратно к лифту. Ассистент поверил сервису, попробовал ещё раз, попробовал третью догадку и исчерпал лимит.
Правильный адрес всё это время был в ответе сервиса. Сервис знал номер полки. Он просто записал его на обороте бланка, в служебной части, которую большинство ассистентских программ, включая мою, модели не показывают. Модель видит только лицевую сторону, обычный текст. Факт, которого ассистент не видит, не существует.
Два других вопроса наткнулись на то же семейство проблем. В инструкции по настройке Claude Code ассистент попросил прочитать три разных раздела и три раза получил один и тот же абзац: остаток от прошлого поиска тихо перевесил раздел, о котором его просили сейчас. В итоговом ответе была описана настройка, но не было ни одной команды. А когда ассистент попросил оглавление открыть главу без подглав, сервис ответил подсказкой «прочитайте её другим инструментом» вместо того, чтобы показать главу. По одному потерянному обмену на главу, из десяти. Ничто из этого не выглядело как ошибка. Ничто не уронило тест.
Ошибка стала подробнее, и стало хуже
Всё это я починил в тот же день, PR #339. Результаты поиска теперь обычными словами говорят, на какое собрание указывает карточка и как туда попасть. Раздел, который вы назвали, важнее остатков. А сообщение об ошибке называет ту часть адреса, которую не узнало, и перечисляет собрания, которые знает. Через час первый вопрос получил ответ по источнику, пятая книга «Размышлений» с цитатой и ссылкой: вставать ради человеческого дела, а не чтобы греться под одеялом.
Потом ту же починку получили соседние собрания, и первый вопрос сломался обратно. Хаб философов стал перечислять в сообщении об ошибке всех своих 21 участника, и ассистент остался внутри этого списка. Он ушёл к Эпиктету как к ближайшему стоику и больше не посмотрел на главный вход, где Марк Аврелий и живёт. Утреннее, более расплывчатое сообщение «поищите в хабе» случайно работало лучше. Более подробная ошибка сжала мир ассистента до одного хаба. PR #341 научил сообщение называть оба уровня: участников этого хаба и собрания у главного входа. 6 сентября все три вопроса получили ответ по документам в каждом прогоне. Та же дешёвая модель, тот же лимит, около цента за вопрос до и после. Цена не сдвинулась. Сдвинулось то, куда уходил лимит: в ответ или в стену.
Кто платит
Тут мне надо быть аккуратным. Дорогого ассистента на сломанной версии я не запускал. Утверждение, что сильная модель проглотила бы эти дефекты молча, взято из наблюдений за сильными моделями в рабочей эксплуатации плюс из чтения записей: на повторяющей ошибке сильная модель, по всей видимости, сама попробовала бы короткий адрес и заплатила бы за это два-три обмена. Догадка с механизмом внутри, а не замер. Замер дешёвый: проиграть сентябрьские записи до первой ошибки на сильной модели и посчитать, сколько обменов ей нужно, чтобы выкарабкаться. Я этого не сделал.
Вторую половину я измерил. На дешёвой модели эти дефекты были разницей между ответом по вашим документам и ответом без них. Поэтому они и жили так долго. Дорогой ассистент превращает неисправный сервис в чуть больший счёт, а счёт это не баг-репорт. Дешёвый превращает его в неправильный ответ, а неправильный ответ это баг-репорт, если кто-то читает запись.
О чём попросить команду
Возьмите вопросы, на которые ваш ассистент отвечает чаще других. Попросите команду прогнать их один раз на дешёвой модели, с лимитом на число обменов, и прочитать, что ассистент делал, шаг за шагом. Не ответ. Шаги. Каждое место, где ответ сервиса стоил ассистенту ещё одного обмена, это дефект, похоже оно на ошибку или нет. Скрипт лежит в scripts/mcp_search_logger.py, браузерная версия это визуализатор на этом сайте. Десяти обменов и цента за прогон хватило, чтобы найти шесть.