Односторонняя подмена не помнит, что подменяла, и не знает, куда подставлять обратно. Ниже — три вещи, которые у неё не получаются, и почему «найти подмену поиском по тексту» ломается на первом же склонении.
Маскирование задумано как операция в одну сторону: текст вошёл, подмена вышла. Дальше она живёт своей жизнью — в памяти диалога, в аргументе вызова и в записи, которую ваш агент создал.
Вот одна и та же заявка после обработки. Слева — если настоящие значения никто не вернул.
Простое решение выглядит так: запомнили пару «настоящее ↔ подмена», модель ответила, нашли подмену в тексте и вернули настоящее. Это работает, пока модель повторяет подмену буква в букву. В аргументах вызова инструмента она этого почти никогда не делает.
Требовать от модели аккуратности бессмысленно — она пишет так, как ей удобно, и это правильное поведение. Поэтому подстраиваемся мы: узнаём свою подмену в любой форме, в которую её превратила модель.
Женское имя подменяется женским, улица — улицей, падеж сохраняется, у СНИЛС сходится контрольная сумма. Рассогласованную подмену модель замечает и начинает править сама — и вот тогда агент действительно ломается.
Просклоняла, сократила до инициалов, разнесла по трём полям, написала латиницей — мы узнаём своё значение в любой из этих форм и подставляем настоящее в том виде, в котором его ждёт ваша база.
Обе половины — про русский язык, падежи и документы РФ. Похожие вещи на рынке есть, но задачу они не решают: закрыть значение от модели — это половина дела. Вторая, вернуть настоящее в аргумент вызова, как готовый рабочий продукт есть только у нас.