惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Know Your Adversary
Know Your Adversary
小众软件
小众软件
L
LangChain Blog
月光博客
月光博客
博客园 - Franky
Microsoft Azure Blog
Microsoft Azure Blog
Y
Y Combinator Blog
有赞技术团队
有赞技术团队
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
MongoDB | Blog
MongoDB | Blog
Recorded Future
Recorded Future
V
Visual Studio Blog
TaoSecurity Blog
TaoSecurity Blog
S
Schneier on Security
C
Cybersecurity and Infrastructure Security Agency CISA
P
Privacy & Cybersecurity Law Blog
T
Threat Research - Cisco Blogs
D
DataBreaches.Net
L
LINUX DO - 热门话题
C
Check Point Blog
F
Fortinet All Blogs
Hugging Face - Blog
Hugging Face - Blog
The Hacker News
The Hacker News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Security Blog
Microsoft Security Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The GitHub Blog
The GitHub Blog
P
Proofpoint News Feed
L
Lohrmann on Cybersecurity
博客园 - 司徒正美
T
Threatpost
P
Palo Alto Networks Blog
A
About on SuperTechFans
Spread Privacy
Spread Privacy
Engineering at Meta
Engineering at Meta
N
News | PayPal Newsroom
T
Tailwind CSS Blog
The Last Watchdog
The Last Watchdog
Blog — PlanetScale
Blog — PlanetScale
A
Arctic Wolf
量子位
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
博客园 - 聂微东
Google Online Security Blog
Google Online Security Blog
Google DeepMind News
Google DeepMind News
www.infosecurity-magazine.com
www.infosecurity-magazine.com
V
Vulnerabilities – Threatpost
H
Hacker News: Front Page

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Как мы в отделе документации создали LLM агента для автоматизированного перевода с английского на другие языки
akdengi (HOS · 2026-05-21 · via Все публикации подряд на Хабре

Уровень сложностиСредний

Время на прочтение9 мин

Охват и читатели95

Кейс

Автор: Александр Казанцев, руководитель отдела документации и контента

Представьте, что вы поддерживаете крупный проект с документацией на нескольких языках. Каждый раз, когда в английской версии появляется новое руководство или исправляется ошибка, нужно вручную обновлять все переводы в других языковых версиях. Это дорого, медленно и чревато рассинхронизацией. Даже два дополнительных языка начинают создавать проблему, а если их больше?

LLM-модели на вашем сервере

Лучшие LLM-модели на профессиональных серверах с GPU-картами

Посмотреть

Именно такую проблему решает специализированный агент для автоматического перевода технической документации, о котором пойдёт речь. Сразу скажем, что на английском языке мы делаем перевод с русского (или пишем изначально) вручную, а далее всю работу за нас делает наше создание.

Что это за агент и зачем он нужен

Агент — это не просто скрипт, который отправляет текст в нейросеть и записывает ответ. Это продуманная система, которая понимает специфику технической документации: сохраняет код и команды без изменений, не переводит названия кнопок и элементов интерфейса, следит за форматированием Markdown и даже автоматически генерирует оглавление в нужном стиле. 

В основе лежит идея оркестрации нескольких специализированных компонентов. Есть переводчик, который получает исходный текст и выдаёт черновой перевод. Есть валидатор — отдельная модель, которая проверяет результат по чётким правилам: все ли разделы на месте, не переведены ли случайно команды терминала, соблюдена ли терминология. Если валидатор находит ошибки, запускается корректор, который вносит точечные правки. Этот цикл может повторяться несколько раз, пока качество не достигнет приемлемого уровня, оцениваемого по шкале от 0% до 100%.

Почему не взять готовое решение

Возникает закономерный вопрос: зачем писать свой агент, если есть OpenClaw, различные обёртки над LLM или даже готовые сервисы машинного перевода? Ответ кроется в трёх ключевых требованиях, которые редко выполняются в универсальных инструментах.

  1. Техническая документация — это не художественный текст. Здесь критически важно сохранить работоспособность примеров кода, точность терминов и структуру разметки. Универсальные переводчики часто «ломают» код, переводят переменные или меняют форматирование, что делает результат непригодным для публикации.

  1. Процесс перевода документации — это не разовая операция, а непрерывный поток изменений. Нужна интеграция с системой контроля версий, возможность обрабатывать только изменённые файлы, синхронизировать удаления и учитывать правила исключения отдельных разделов. Готовые инструменты редко предоставляют такую гибкость «из коробки».

  1. Качество перевода должно контролироваться автоматически. В агенте валидация встроена в конвейер: каждая правка проверяется, ошибки фиксируются, а при необходимости запускается повторная генерация. В универсальных решениях эту логику пришлось бы надстраивать вручную, что сводит на нет преимущество их использования.

Плюсы специализированного подхода

Главное преимущество агента — предсказуемость результата. Благодаря чётким правилам в промптах валидатора система знает, что строки в кавычках вроде "Code successfully verified" — это сообщения интерфейса, которые должны остаться на английском. Что команды в блоках кода трогать нельзя. Что оглавление генерируется отдельным скриптом, поэтому модель не должна создавать своё.

Другой плюс — модульность. Компоненты агента слабо связаны: можно заменить модель перевода, не переписывая валидатор; можно отключить генерацию оглавления для определённых языков; можно добавить новый язык (сейчас у нас есть французский и турецкий, но в планах перевод еще на испанский, голландский и, самое сложное, китайский), просто прописав новые параметры в файле конфигурации. Это делает систему устойчивой к изменениям и простой в поддержке.

Третий важный аспект — прозрачность. Все этапы работы логируются, ошибки валидации сохраняются в отдельный файл, а при включённом отладочном режиме можно увидеть полные запросы и ответы моделей. Это критически важно для отладки и дообучения промптов.

Минусы и ограничения

У подхода есть и обратная сторона. Во-первых, сложность настройки. Чтобы агент заработал, нужно подготовить конфигурационный файл, прописать пути к репозиторию, настроить исключения, подобрать параметры контекста для моделей. Для разового перевода это избыточно.

Во-вторых, зависимость от качества промптов. Если правила валидатора сформулированы неточно, агент может пропустить ошибку или, наоборот, начать бесконечно исправлять стилистические нюансы. Требуются итерации и ручная проверка результатов на старте. В нашем случае для перевода использовались те же промпты и модели, что и в ручном варианте, поэтому результат был достаточно предсказуем. Но также потребовал вносить изменения как в промпты переводчика, так и валидатора при настройке агента.

В-третьих, ресурсоёмкость. Цикл валидации с несколькими попытками исправления означает, что на один файл может уйти в разы больше токенов, чем при простом переводе. Это увеличивает стоимость и время обработки, особенно для крупных документов. В нашем случае у нас у отдела документации есть свой GPU сервер, не самый мощный на связке из четырех Nvidia V100 по 16 Гб. И у него пиковая скорость примерно 50-60 токенов в секунду. То есть в среднем перевод с валидацией одной статьи может занимать от 3 до 20 минут, в зависимости от размера и числа повторов каждого этапа.

Наконец, агент заточен под конкретный формат документации — Markdown с определённой структурой (у нас это Material for MkDocs с нашими доработками). Если нам (вдруг) потребуется работать с reStructuredText, AsciiDoc или другим форматом, значительную часть логики придётся переписывать.

Архитектура: модульность и разделение ответственности

Агент построен по принципу слабосвязанных модулей, написанных на Python, каждый из которых решает одну задачу. В центре находится конфигурация — класс AgentConfig, который загружает настройки из YAML-файла и предоставляет единый интерфейс доступа к параметрам. Это позволяет менять поведение системы, не переписывая код: добавить новый язык, скорректировать лимиты токенов или изменить правила исключения файлов.

Далее идут специализированные компоненты. OpenWebUIClient отвечает за низкоуровневое общение с API нейросети: формирование запросов, обработку ответов, повторные попытки при сбоях. TranslationValidator управляет циклом валидации и исправления, но не знает, как именно отправляются запросы. ImageSync занимается только копированием изображений, а RepoWatcher отслеживает изменения в репозитории через Git. Такая изоляция упрощает тестирование: можно заменить клиент API, не затрагивая логику валидации.

Вся постобработка вынесена в утилиты: генерация оглавления, очистка ссылок, оценка токенов. Это не случайно. Когда логика размазана по коду, любое изменение требует правок в десятке мест. Когда она собрана в одном месте — достаточно обновить одну функцию.

Конвейер обработки: от изменения в репозитории до готового файла

Пайплайн агента можно представить как последовательность этапов, через которые проходит каждый файл.

Запускается конвейер простой командой вида

python3 ./main.py --lang tr --file /billing/billing_cycle.md --since "24 hours ago"

которая говорит агенту (в данном случае для турецкого языка) отследить все изменения турецкой языковой ветки в файле billing_cycle.md, который находится в директории billing, за последние 24 часа и если они есть, сделать перевод. Таким же образом можно работать как с целыми директориями (параметр --dir), так и даже со всей веткой.

Первый этап — обнаружение изменений. Агент может работать в нескольких режимах: обработать один файл по запросу, просканировать всю директорию или отследить изменения через Git с момента последнего запуска. Фильтрация по исключениям применяется сразу: если файл попадает в exclude_dirs или соответствует паттерну в exclude_files, он игнорируется.

Второй этап — подготовка контекста. Исходный Markdown читается, из него удаляется старое внутреннее оглавление (чтобы модель не пыталась его переписать или продублировать), оценивается размер в токенах. Это важно: если текст не влезает в контекстное окно, его нужно разбить или запросить у модели больше памяти.

Третий этап — перевод. Очищенный текст отправляется в модель-переводчик с минимальной температурой (обычно 0.1), чтобы снизить вариативность и получить максимально детерминированный результат.

Четвёртый этап — валидация. Здесь в игру вступает вторая модель, настроенная на критический анализ. Она сравнивает исходник и перевод, проверяет полноту, сохранность кода, терминологию и формат. Если найдены ошибки, запускается цикл исправления: корректор получает список замечаний и вносит точечные правки. Цикл повторяется до достижения порога качества или исчерпания лимита попыток.

Пятый этап — постобработка. Ссылки очищаются от якорей, генерируется новое оглавление в формате MkDocs, результат сохраняется в целевую директорию. Параллельно копируются отсутствующие изображения.

Шестой этап — логирование. Если валидация не пройдена, детальный отчёт с примерами ошибок сохраняется в JSONL-файл для последующего анализа.

Технически все крутится на связке Ollama + OpenWebUI, а за нейросети отдувается модель Qwen 3.6:27b.

Работа с LLM: не просто отправить запрос

Самая интересная часть здесь, это как агент общается с нейросетями.

Динамическое управление контекстом. Модели имеют ограничение на длину входного окна. Агент не использует фиксированное значение, а рассчитывает его на лету: оценивает размер входного текста в токенах, добавляет запас на ответ и убедится, что сумма не превышает максимум, разрешённый конфигурацией (у нас это 100 000 токенов, больше связка из двух V100 с суммарными 32 гигабайтами не вытягивает).

# Упрощённый пример расчёта контекста
estimated = len(text) / 4  # грубая оценка: 4 символа ≈ 1 токен
max_input = context_max - response_reserve
actual_input = min(estimated * 1.05, max_input)
num_ctx = actual_input + response_reserve

Это позволяет обрабатывать как короткие заметки, так и многостраничные руководства, не теряя в качестве.

Разделение промптов для разных ролей. Модель-переводчик получает минимальные инструкции именно в агенте, так как полный системный промт уже настроен в ее кастомной реализации внутри OpenWebUI. 

Валидатор же получает подробный системный промпт с правилами: что проверять, что игнорировать, в каком формате возвращать ответ.

Пример фрагмента промпта валидатора:

✅ CHECK:

1. COMPLETENESS: All sections from source are present.
2. CODE/COMMANDS: $VAR, /paths, curl — DO NOT translate.
3. TERMINOLOGY: Use standard translations or keep original.
4. FORMAT: Markdown syntax is preserved.

❌ IGNORE:
- TOC blocks, link anchors, admonition syntax.

⚡ CRITICAL: ALL UI STRINGS IN QUOTES MUST REMAIN IN ENGLISH.

Такая специализация повышает качество: переводчик не отвлекается на проверку, а валидатор не пытается переписать текст.

Обработка неидеальных ответов. Нейросети не всегда возвращают валидный JSON, особенно когда просят структурированный вывод. Агент включает механизм «ремонта» ответа: удаляет markdown-обёртки, вырезает объект от первой { до последней }, исправляет висячие запятые, экранирует кавычки внутри строк.

# Упрощённая логика ремонта JSON
response = re.sub(r'^```json\s*', '', response)
start = response.find('{')
end = response.rfind('}') + 1
response = response[start:end]
response = re.sub(r',\s*}', '}', response)  # убираем ,}

Если даже после этого парсинг не удаётся, агент пытается восстановить данные по частям или записывает ошибку для ручного разбора.

Повторные попытки и экспоненциальная задержка. Сетевые сбои, таймауты, перегрузка сервера — обычное дело. Агент не сдаётся после первой ошибки. Он повторяет запрос до пяти раз, увеличивая паузу между попытками по экспоненте: 2 секунды, потом 4, потом 8, но не больше 30. Это баланс между настойчивостью и уважением к ресурсам сервера.

Цикл валидации: как несколько вызовов LLM работают вместе

Одно из ключевых отличий агента — многошаговая валидация. Это не просто «перевели и забыли», а итеративный процесс улучшения качества.

На первом шаге валидатор получает исходник и черновой перевод, возвращает список замечаний в структурированном виде и оценивает качество перевода (от 0 до 1). Если ошибок нет или нас устраивает оценка (сейчас это 0.85), то файл считается готовым. Если есть — корректор получает те же тексты плюс список проблем и инструкцию исправить только их, не переписывая остальное.

После исправления валидатор проверяет результат снова. Цикл повторяется до трёх-пяти раз. Такой подход позволяет ловить ошибки, которые модель-переводчик пропустила с первого раза: пропущенный абзац, неправильно переведённый термин, сломанная разметка.

Важный нюанс: валидатор настроен на строгость, но с разумными исключениями. Он не ругается за отсутствие оглавления (его генерирует скрипт), не обращает внимания на пробелы, не требует идеального стиля. Это предотвращает бесконечные циклы исправлений из-за субъективных замечаний. С учетом того, что мы допускаем до 15% несущественных ошибок, цикл перевода и валидации часто идет непрерывно и без повторов.

Почему оркестрация важнее одной мощной модели

Можно было бы попробовать решить задачу одной моделью: «переведи и проверь себя сама». Но на практике это работает хуже. Одна модель, получающая противоречивые инструкции («будь креативным» и «будь строгим»), начинает путаться. Она может пропустить ошибку, потому что «и так сойдёт», или, наоборот, начать переписывать рабочий код в погоне за стилем.

Разделение на переводчика и валидатора имитирует рабочий процесс человеческой команды: один делает черновик, другой вычитывает. Каждая модель фокусируется на своей задаче, промпты остаются простыми и понятными, а результат — предсказуемым.

Кроме того, оркестрация даёт гибкость. Можно использовать более дешёвую модель для перевода и более точную — для валидации. Можно отключить валидацию для черновых сборок и включить для релиза. Можно собрать статистику: какие типы ошибок встречаются чаще, и дообучить промпты.

Когда такой агент оправдан

Специализированный агент — это не панацея и замена сотрудников отдела (хотя они, скажу честно, уже косо смотрят на него). Он не нужен, если вы переводите пару статей раз в полгода. Но он становится незаменимым, когда:

  • документация обновляется ежедневно;

  • требуется поддерживать более трёх языков;

  • важны точность терминов и сохранение примеров кода;

  • есть требования к единообразию оформления;

  • процесс должен быть воспроизводимым и контролируемым.

В таких условиях затраты на разработку и настройку агента окупаются за счёт сокращения ручного труда, уменьшения количества ошибок и ускорения выпуска обновлений.

Вместо заключения

Автоматизация перевода технической документации — это не про замену людей, а про освобождение их от рутины. Агент берёт на себя черновую работу: первичный перевод, проверку формата, синхронизацию файлов. А человек сосредотачивается на том, что действительно требует экспертизы: выверке сложных формулировок, адаптации примеров под локальные особенности, финальном ревью.

Специализированный агент, в отличие от универсального инструмента, заточен под конкретную задачу. Он знает контекст, соблюдает правила и работает предсказуемо. Да, его сложнее настроить. Но когда поток изменений становится постоянным, именно такая предсказуемость превращает хаос в управляемый процесс.

LLM-модели на вашем сервере

Лучшие LLM-модели на профессиональных серверах с GPU-картами

Посмотреть