Перевод текста
с проверкой фактов
Как переложить массив из 268 разноязычных источников на русский конвейером из трёх ИИ-агентов и проверить каждую запись, чтобы модель не переврала датировки, атрибуцию источников и медицинские факты.
Задача
naidiyogu.ru — социальная сеть для людей, вовлечённых в йогу: преподаватели, ученики, студии, расписания. В какой-то момент проекту понадобился собственный энциклопедический раздел — асаны, пранаямы, замки, шаткармы, философские термины, школы, первоисточники. Не подборка ссылок на чужие сайты, а свой свод, собранный из проверенных источников на разных языках (санскритские первоисточники, английская академическая литература, русские переводы) и переложенный на русский. Двести шестьдесят восемь статей.
Из этих 268 примерно половина — про здоровье. У каждой асаны есть раздел «чем полезна» и раздел «когда стоит воздержаться». Это меняет всю постановку задачи. Справочный контент о здоровье бьёт по двум порогам сразу.
Перекладывать эти 268 записей на русский руками — месяцы работы редактора, знающего и санскрит, и анатомию. Opus 4.8 переводит и переписывает запись за секунды, с санскритским именем, датировкой трактата и списком источников. Но на фактах уровня «в каком именно трактате впервые описана эта поза» модель галлюцинирует: уверенно ставит не тот текст, не ту дату, тащит противопоказание с коммерческого сайта, который сам его переписал у другого. В статье про здоровье, под которой стоит имя площадки, это источник обеих бед сразу.
Поэтому реальная задача — не просто перевести массив на русский, а проверить, что при переводе факты не переврались. Причём проверку проходят две инстанции, и работают они по-разному. Сначала фактам должен поверить человек, который эти факты знает, — читатель и преподаватель. Потом разделу должен поверить поисковик, который приведёт туда читателя. Первая половина текста — как переводили массив с проверкой каждой записи. Вторая — самая тонкая проверка, медицинских фактов, чтобы раздел о здоровье не улетел в бан.
Один проход модели не годится
Наивная схема — дать модели список из 268 названий и промпт «напиши статью про каждое». На выходе 268 гладких текстов, из которых порядка 250 верны. Проблема в остальных: они выглядят так же уверенно, как верные. Модель не помечает, где сомневается, — весь текст одинаково убедителен. Именно эти невидимые полтора-два десятка статей и есть тот риск, ради которого всё затевалось.
Значит, тексту нельзя доверять от того же агента, что его написал. Нужна редакция: автор пишет, независимый скептик ищет ошибки, автор правит по замечаниям. Все три роли играет Opus 4.8, но разными вызовами с разными задачами, а склеивает их скрипт-оркестратор.
Конвейер: три роли, Workflow, Opus 4.8
Оркестрация построена на Workflow — это механизм Claude Code, где скрипт на JS запускает субагентов, каждый со своим промптом и своей схемой ответа. Скелет конвейера — три фазы на статью:
export const meta = {
name: 'glossary-batch',
phases: [
{ title: 'Написание' },
{ title: 'Проверка' },
{ title: 'Исправление' },
],
}
const CHUNK = 4
async function runOne(item) {
const entry = await agent(writePrompt(item), { schema: ENTRY_SCHEMA, phase: 'Написание' })
const v = await agent(verifyPrompt(entry), { schema: VERDICT_SCHEMA, phase: 'Проверка' })
if (v.facts_ok === false && v.issues.length) {
const fix = await agent(fixPrompt(entry, v), { schema: ENTRY_SCHEMA, phase: 'Исправление' })
return { entry: fix, fixed: true }
}
return { entry, fixed: false }
}
agent() — вызов субагента на модели сессии, то есть на Opus 4.8. schema заставляет его вернуть строго структурированный ответ. Третий вызов — исправление — запускается только если проверка вернула facts_ok: false с непустым списком проблем. Никакого прямого HTTP к API из скрипта нет: субагенты ходят в модель и в веб через сам харнесс Claude Code, а для сверки фактов у них есть встроенные веб-поиск и загрузка страниц.
Запускался конвейер не сразу на всех 268, а пачками — датасет разбит на 10 партий по 15–30 записей, сгруппированных по темам (топовые асаны, термины ямы-ниямы и чакры, стили и школы, пранаямы, мудры и замки, первоисточники). Каждая партия — отдельный прогон:
Workflow(scriptPath: 'pipeline/glossary-batch.js',
args: { inputDir: '<сырьё>', batchName: 'batch7', items: [...] })
Два промпта, на которых всё держится
Промпт автора. Ценность не в «напиши хорошо», а в жёстко заданных источниках — именно на источниках модель и врёт:
Ты редактор энциклопедии йоги. Аудитория: преподаватели и ученики, не специалисты.
Пиши простым языком, своими словами.
Источники, обязательно:
- термины и этимология, из словаря Монье-Вильямса и первоисточников (Йога-сутры,
Упанишады, Гита) в проверенных переводах;
- история асан, из академического Roots of Yoga (Маллинсон и Синглтон) и самих
трактатов (Хатха-Йога Прадипика, Гхеранда Самхита). Не путай трактаты, точно
указывай, в каком тексте описана поза, это самая частая ошибка;
- техника и польза, минимум два авторитетных источника; коммерческие йога-сайты
нельзя как единственный источник.
Через веб-поиск проверь 2-3 самых рискованных утверждения (датировки, авторы, номера
стихов), не распыляйся на очевидное.
Открытый раздел, нужна уникальность: никаких переводов и близких пересказов,
английские цитаты из источников в публикацию не идут.
Строчка про «не путай трактаты» — не перестраховка. Атрибуция первоисточника (в какой книге впервые описана поза) — ровно то, на чём Opus 4.8 галлюцинирует чаще всего, и именно она чаще всего требовала ручной доводки в конце.
Промпт проверяющего. Установка принципиально другая:
Адверсариальная проверка статьи энциклопедии йоги. Цель: найти ошибки, не одобрить.
Материал: <JSON статьи>
1. Факты. Возьми 1-2 НЕЗАВИСИМЫХ источника, которых НЕТ в списке у статьи (первоисточник,
Монье-Вильямс, академический Roots of Yoga). Проверь рискованное: датировки, авторов,
атрибуцию трактатов, номера сутр, этимологию, медицинские противопоказания.
2. Уникальность. Не является ли русский текст замаскированным переводом источника.
Верни: facts_ok (да/нет), issues (конкретные проблемы), uniqueness_ok, independent_sources.
При обоснованном сомнении: facts_ok = нет, с пояснением.
Два слова здесь несут всю нагрузку. «Адверсариальная» — проверяющий настроен опровергать, а не подтверждать, иначе он штампует «сойдёт». «Независимых» — сверка идёт по источникам, которых у автора не было, иначе проверка сводится к перечитыванию тех же ссылок и ничего не ловит.
Схема ответа и оркестрация
И автор, и проверяющий отвечают не прозой, а строго по JSON-схеме. У статьи:
ENTRY_SCHEMA = {
required: ['slug', 'section', 'name_ru', 'lead', 'sections',
'sources_verified', 'needs_check'],
sections: [{ heading, body }],
sources_verified: [{ name, url }], // минимум один источник не-энциклопедия
needs_check: Boolean, // true, если надёжного первоисточника по сути нет
}
У вердикта — свои поля: facts_ok, issues[], uniqueness_ok, independent_sources[].
Смысл жёсткой схемы прикладной. Свободный ответ модели надо парсить и угадывать, где кончилась статья и началась болтовня. Схема проверяется автоматически на выходе: если модель вернула не тот формат, вызов повторяется, пока не сойдётся. Это превращает капризный вывод в предсказуемые данные, которые скрипт кладёт в свод без ручного разбора. 268 статей нельзя собрать вручную из вольных ответов — из структурированных можно.
Оркестрация. Внутри пачки статьи шли волнами по четыре параллельно — быстрее, чем по одной, но не настолько массово, чтобы упереться в лимит запросов провайдера:
for (let i = 0; i < items.length; i += CHUNK) {
const slice = items.slice(i, i + CHUNK)
const res = await parallel(slice.map((it) => () => runOne(it)))
// ...сложить результаты, залогировать прогресс
}
const missing = items.filter((it) => !done[it.slug])
if (missing.length) await sweep(missing) // второй заход по упавшим
Упавшие статьи (сеть моргнула, модель не уложилась в схему) собирались после основного прохода и прогонялись повторно. Между большими пачками — строго последовательно: параллельный запуск нескольких партий ловил всплеск лимита, и падало больше, чем экономилось.
Что дал конвейер, где споткнулся, и картинки
По своду: 49 статей поправлено автоматически на фазе проверки (facts_ok: false → фикс), ещё 4 доведены руками, когда даже проверяющий не поймал тонкость. Все четыре — про атрибуцию трактатов: в одной стойку на руках приписали не тому тексту, в статье про позу кошки притянули источники, которых там быть не могло, в третьей датировку трактата поставили на век мимо. Ошибки такого рода не «выглядят» ошибками — текст вокруг гладкий; их видно только при сверке по первоисточнику.
Картинки — отдельный трек. Иллюстрации к асанам (90 штук) генерились отдельным Python-скриптом через google-genai, вне текстового конвейера:
from google import genai
from google.genai import types
client = genai.Client(api_key=os.environ['GKEY'])
resp = client.models.generate_content(
model='gemini-3.1-flash-image',
contents=prompt,
config=types.GenerateContentConfig(
temperature=0.35,
response_modalities=['IMAGE'],
image_config=types.ImageConfig(aspect_ratio='4:3'),
),
)
Единый стиль — винтажная литография в духе старинного индийского трактата, промпт и настройки вынесены в один конфиг, чтобы не расходились между позами. Скрипт с чекпоинтом: пропускает уже сгенерированные файлы, дорисовывает только недостающие, три попытки на картинку. Пол в позах распределён вручную — 60 мужских, 30 женских.
Итог первой части: 268 статей, где расхождения не «наверное где-то есть», а найдены и закрыты поимённо; спорное помечено флагом. Достоверность как факт — есть. Дальше её надо предъявить тому, кто про этот факт ничего не знает.
YMYL: почему справочник о здоровье под особым прицелом
Google выделяет класс тем YMYL — «твои деньги или твоя жизнь»: финансы, право, здоровье, всё, где плохой совет вредит человеку напрямую. Йога с «пользой» и «противопоказаниями» попадает в «здоровье» целиком, и для этого класса планка доверия к автору поднята в разы: обычной странице хватает быть полезной, странице о здоровье надо ещё доказать, что за ней стоит кто-то, кому есть основания верить.
Две интуиции здесь заводят прямо в фильтр. Первая: кажется, что выкатывать сотни страниц разом опасно, безопаснее «капать». Наоборот. Представитель Google формулирует прямо: массовая публикация сама по себе — норма, а искусственное растягивание «создаёт больше проблем, чем решает». Разом — правильнее. Вторая, важнее: кажется, что санкция бьёт по ИИ-контенту. Она бьёт по бесполезности — по тексту без ценности, с низкой уникальностью, без редактуры, сделанному ради манипуляции выдачей. Метод не при чём: тот же текст, написанный человеком наспех, попадёт под тот же фильтр. Поэтому уникальность и сверка по источникам из первой части — не перфекционизм, а входной билет. У Яндекса своя версия того же фильтра — АГС, против авто-сгенерированного бесполезного контента.
Как проверяли уникальность
Раз уникальность — входной билет, её мерили инструментально, а не на глаз. Каждую готовую статью прогоняли через сторонний сервис проверки (text.ru) по его API: сервис сравнивает текст с проиндексированным вебом и возвращает процент оригинальности. Пакет на сервисе покупается символами и списывается с пробелами, а весь свод — 787 537 символов; закупленного пакета хватило на 179 статей из 268, на остатке квота кончилась.
| Раздел | Средняя уникальность | Ровно 100% |
|---|---|---|
| Термины и философия | 99.6% | 64 |
| Стили и школы | 100% | все проверенные |
| Асаны | 97.5% | 68 |
| Весь свод (179 из 268) | 98.6% | 154 статьи |
Все статьи ниже 90% оказались именно асанами (одна из балансовых поз стоя — 78.65%). Это не плагиат, а структурное свойство: раздел «как выполнять» у любой позы — конечная последовательность одних и тех же шагов, и на всех йога-сайтах она описана похоже. Уникальны вводка, польза и история; техника объективно совпадает. Поэтому технику не переписывали ради процентов, а остаток квоты не докупали — по проверенным разделам картина уже ясна, средняя под 99% держит контент на безопасной стороне фильтра.
Авторство без фейка
Поисковик требует, чтобы за медицинским контентом стоял кто-то заслуживающий доверия. Напрашивается лёгкий ход — подписать статьи именами преподавателей: «проверено преподавателем таким-то». Это единственный по-настоящему опасный шаг во всей истории.
Легальный путь — не подделка, а понижение планки того, что именно ты утверждаешь. Три рычага, работающие вместе:
Разница между этими рычагами и фейковой подписью — это разница между «предъявить то, что есть» и «нарисовать то, чего нет». Первое движок вознаграждает, второе карает.
Чистка мифов: самое неочевидное место работы
Главная угроза достоверности медсправочника — не там, где источников не хватает, а там, где источник вроде есть, но неверный. Традиционные «противопоказания» кочуют по всем йога-сайтам, звучат авторитетно, а наукой либо не подтверждаются, либо прямо опровергаются. Пилот на пяти «опасных» позах показал трёхуровневую картину.
Уровень 1 — серьёзные противопоказания, у которых источники есть. Для перевёрнутых поз, переразгибания шеи, силовых нагрузок нашлись рецензируемые работы, часть — поимённо. Глаукома при инверсиях подтверждена сильнее всего: систематический обзор побочек йоги 2013 года в PLOS One называет стойку на плечах прямо, отдельное исследование меряет рост внутриглазного давления в позе плуга — с 18 до 22.5. Это оставляют и подкрепляют.
Уровень 2 — мифы, которые наука опровергает. Это важнее источников, потому что это правка самого контента. «Нельзя перевёрнутые при менструации» — авторитетные источники прямо опровергают, идёт это из традиции одной школы, не из медицины. «Поза стимулирует щитовидку» — миф без научной основы. Глаукома, приписанная позе, которая вообще не инверсия, — перенос факта не туда. Оставить в справочнике о здоровье медицински опровергнутое — ровно тот сигнал недостоверности, за который прилетает. По этому уровню отдельный агентский проход прошёл по 44 статьям и внёс 38 правок — убрал неподтверждённые противопоказания. Не вслепую: сохранил обоснованные (реальный механизм — вакуум живота в определённых практиках, прямое давление на горло в некоторых позах, сильные инверсии при мигрени), сохранил пользу и не тронул ни одного упоминания беременности.
Уровень 3 — бытовая осторожность лёгких поз. Источников не требует, закрывается тем самым общим дисклеймером.
Достоверность медконтента — не только «добавить источники», но и «убрать ложные утверждения, которые все переписывают друг у друга не глядя». Второе тоньше и важнее.
Как достоверность показана на странице
Последний слой — обвязка, чтобы поисковик всё это увидел. На каждой статье микроразметка Schema.org: разметка определения термина и разметка статьи плюс хлебные крошки — машиночитаемое «это справочная статья с таким определением и такими источниками». Источники, по которым сверялись, показаны прямо на странице. Дисклеймер выводится автоматически на тех и только тех статьях, где есть блок противопоказаний.
Перелинковка — «хаб и спицы»: витрина, связанные статьи и, ключевое, связка каждой статьи с каталогом преподавателей (статья про стиль ведёт на тех, кто его ведёт). Это убирает страницы-сироты, которые плохо индексируются, и гонит ссылочный вес на коммерческие страницы, ради которых справочник и делали.
Промпты, которые можно забрать
Три заготовки с реального конвейера, обобщённые. В тексте статьи длинные тире на месте, а в промптах для копирования заменены на запятые — так удобнее отдавать файл агенту.
P01 · Автор статьи справочника
Ты редактор справочника по <теме>. Аудитория: практики, не специалисты.
Пиши простым языком, своими словами.
Источники, обязательно:
- бери из первоисточников и академических работ, не только из энциклопедий общего профиля;
- коммерческие тематические сайты нельзя как единственный источник;
- через веб-поиск проверь 2-3 самых рискованных утверждения (датировки, авторство,
точные ссылки), не распыляйся на очевидное.
Открытый раздел, нужна уникальность: никаких переводов и близких пересказов.
Верни строго по схеме: название, лид, блоки {заголовок, тело}, источники {название, ссылка},
пометка needs_check (true, если надёжного первоисточника по сути нет). Без текста вне схемы.
P02 · Адверсариальный проверяющий
Адверсариальная проверка статьи. Цель: найти ошибки, не одобрить.
Материал: <JSON статьи>
1. Факты. Возьми 1-2 НЕЗАВИСИМЫХ источника, которых нет в списке у статьи. Проверь
рискованное: датировки, авторство, точные ссылки, спорные утверждения о здоровье.
2. Уникальность. Не замаскированный ли это перевод или близкий пересказ.
Верни строго по схеме: facts_ok (да/нет), issues (конкретные проблемы), uniqueness_ok,
independent_sources. При обоснованном сомнении: facts_ok = нет, с пояснением.
P03 · Чеклист запуска раздела о здоровье (YMYL)
Перед публикацией массового справочного раздела о здоровье проверь:
- авторство площадки указано (редакция + страница о проекте), персональных фейк-подписей нет;
- дисклеймер "общая справка, не медицинский совет" на каждой статье с противопоказаниями;
- именная проверка специалистом только там, где реально проверено (топ запросов);
- мифические противопоказания вычищены, обоснованные и беременность сохранены;
- источники показаны на странице;
- микроразметка (определение термина, статья, хлебные крошки);
- перелинковка хаб-и-спицы + связка с коммерческим разделом, страниц-сирот нет;
- выкат целиком, не по частям.
Чем это живёт дальше
Раздел на проде: 268 статей, у асан — литографии в едином стиле. Достоверность здесь оказалась не свойством модели, а свойством конструкции вокруг неё: три роли на статью вместо одного прохода, адверсариальная проверка вместо самооценки, узаконенный флаг «не знаю источник» вместо выдумки, и отдельно — предъявление этой достоверности поисковику, где главной работой была не добавка источников, а чистка чужих мифов.
Свод собран на русском. Перевод раздела на другие языки — следующий заход: система перевода на площадке уже есть, статьи под неё пойдут отдельной партией. И то, что осталось открытым, — тоже про честность: уникальность части статей не проверена, потому что кончилась квота сервиса; медицинская проверка живым преподавателем сделана точечно на самых искомых позах, а не на всех 140 с противопоказаниями.
Перевод, которому можно верить, отличается от просто перевода именно этим — он не прячет, где заканчивается проверенное.
// Обсуждение
Можно писать анонимно. Укажите email, чтобы получать уведомления об ответах.