Привет, Хабр! Меня зовут Катя, я лидирую Gramax, open source-платформу для управления технической документацией.
О Gramax мы уже писали тут. В этой статье расскажу о Gramax Check — сервисе автоматических проверок текстов на базе LLM. По сути — нашей версии «Главреда», но с настраиваемыми правилами.
Кому будет полезна статья:
- Техническим писателям — если хочется отказаться от рутинной работы. 
- Руководителям отделов контента и редакторам — чтобы ускорить выпуск документации и оптимизировать процессы. 
- Владельцам бизнеса — если нужно сэкономить ресурсы и повысить доверие к бренду/компании. 
Дисклеймер для тех, кто устал от ИИ-хайпа
Мы понимаем скептицизм вокруг шумихи про искусственный интеллект. В этой статье мы говорим о реальном применении LLM для работы с текстами.
LLM в своей основе работают с текстом. А значит автоматизировать текстовую рутину с их помощью — очень логично:)
Краткое введение в тему: стайлгайд и качество документации
Пользу от документации мы можем получить только в том случае, если документация полная и единообразная. Для единообразия необходимо разработать стандарты, чаще всего они регламентированы в стайлгайде.
Стайлгайд — это руководство, которое задает единый стиль и тон для всей документации, включает правила оформления, использования терминов, структуру текста.
Какая польза от стайлгайда
- Снижение операционных затрат. Четкие правила оформления сокращают время на создание и проверку документации, уменьшают количество ошибок, а следовательно — итераций проверки. 
- Повышение удовлетворенности клиентов. Консистентная и структурированная документация помогает клиентам легче находить нужную информацию. Также вызывает большее доверие к компании: ведь если документация красивая, значит и компания серьезная :) 
- Улучшение качества переводов и международной адаптации. Единые правила терминологии и стиля упрощают переводы и повышают соответствие документации оригиналу. 
- Повышение продуктивности команды. Сокращение времени на онбординг освобождает ресурсы команды. А также позволяет новичкам с первых дней приносить максимум пользы. 
Какие сложности
- Сопротивление команды. Внедрение новых правил требует обучения и адаптации, что часто встречает сопротивление сотрудников, привыкших к старым методам работы. 
- Отсутствие автоматизации. Ручная проверка на соответствие стайлгайду занимает много времени и приводит к ошибкам. Без автоматизированных инструментов поддерживать единообразие сложно. 
- Перегруженность правил. Чрезмерная детализация стайлгайда делает его трудным для восприятия и может привести к тому, что сотрудники станут избегать его использования. 
Кейс: зачем мы в это полезли
В нашей компании есть стайлгайд, но его почти никто не знает и не придерживается. Документ объемный — 12 страниц, что затрудняет запоминание. Из-за отсутствия процесса ручной вычитки решили сразу перейти к автоматизации.

Варианты автоматизации
Мы рассмотрели несколько инструментов для автоматизации проверок по стайлгайдам.
LanguageTool
Удобен как недорогой алгоритмический инструмент. Однако его настройка требует времени на изучение особенностей, он не всегда учитывает контекст и порой оказывается неточным для русского языка. Например, «один» и «тысяча» он не интерпретирует как числительные.
С помощью LanguageTool мы настроили проверку орфографии и добавили следующие правила:
- Корпоративный словарь терминов — для наименований продуктов и команд. 
- Местоимения «вы» и «ваш» с маленькой буквы — LLM не всегда корректно обрабатывает это правило, о чем расскажем позже. 
- Использование буквы Ё — аналогично случаю выше. 
Подробно процесс настройки LanguageTool здесь не описываем — это можно сделать самостоятельно, следуя их официальной инструкции.
LLM
Примечателен тем, что его может настроить любой нетехнический пользователь, задавая правила на человеческом языке. Основной вопрос был в стабильности и точности LLM — что он может выдавать ложные или неполные подсказки. Мы приняли для себя, что система не сможет отслеживать все нарушения стайлгайда и в небольшом количестве случаев будет давать ошибочные рекомендации, но это не должно перегружать автора.
В каком порядке автоматизировали
Мы пошли простым путем: использовали API OpenAI и начали настраивать модель с помощью промпта.
Промпт и особенности работы LLM
Промпт разбили на несколько частей:
- Вводная часть — задает общий контекст работы модели и ее роль. 
- Правила стайлгайда — мы описываем каждое правило простыми словами и добавляем примеры его нарушения. Обычно достаточно 2-5 примеров, при этом важно, чтобы примеры не противоречили друг другу. 
- Инструкции — здесь мы указываем, что именно ожидаем от модели, с учетом ее роли и заданных правил. Наша цель — получить ответ в формате JSON, где модель выделяет нарушения стайлгайда в специальный тег и предлагает рекомендации по исправлению. 
Промпт с несколькими правилами и описанием JSON-ответа
Ты - модель для проверки текста на соответствие стайлгайду. Твоя задача – анализировать предоставленный текст и выявлять нарушения правил стайлгайда. Список правил, которым нужно следовать:
1. Всегда заменяем связку глагола общего назначения с существительным на конкретные глаголы, которые прямо выражают действие. Кроме случаев, когда глагол используется для выражения состояния, существования или принадлежности.
Примеры:
"производить проверку" → "проверять"
"осуществлять контроль" → "контролировать"
"предоставляет помощь" → "помогает"
"выполнять работу" → "работать"
"совершает покупку" → "покупает"
"делать выбор" → "выбирать"
"у него были яблоки" → "у него были яблоки"  остаётся без изменений
2. Слова выражающие неопределенность и вызывающие сомнения в точности представленной информации всегда заменяем более точным формулировками или убираем их вовсе.
Примеры:
"Система иногда зависает при обработке" → "Система зависает при обработке"
"Приложение может поддерживать до 1000 пользователей" → "Приложение поддерживает до 1000 пользователей"
"Производительность обычно увеличивается при использовании кэширования" → "Производительность увеличивается при использовании кэширования"
"Некоторые части системы написаны на Java" → "Часть системы написана на Java"
"Чаще всего данные забирают через API" → "Данные забирают через API"
Инструкции:
1. Проанализируй предоставленный текст на наличие нарушений всех указанных правил стайлгайда.
2. Для каждого найденного нарушения:
   a. Выдели проблемный фрагмент, заключив его в тег <suggestion>.
   b. Укажи исправление или рекомендацию в атрибуте text тега suggestion. Учитывай возможное изменение рода слов и согласованность слов в фрагменте.
   c. Определи соответствующее название ошибки.
4. Не предлагай исправлений для фрагментов, которые уже соответствуют правилам стайлгайда.
5. Сформируй ответ в формате JSON со следующей структурой:
   {
     "errors": [
       {
         "id": "Идентификатор входящего текста",
         "name": "Название ошибки",
         "text": "Текст с <suggestion text='исправление или рекомендация'>проблемным фрагментом</suggestion>"
       }
     ]
   }
6. В JSON в поле "text" всегда пиши полный исходный текст, включая исправленную часть и неизмененный контекст. В нем обязательно должен быть тег <suggestion>. Никогда не предлагай исправления без тега <suggestion>!
7. Если исправление требует увеличения количества предложений, то тогда оберни весь текст в тег suggestion и в text укажите полностью исправленный вариант.
8. Если из текста нужно что-то удалить, то тогда оберни удалямый фрагмент в suggestion, а в атрибуте text укажи пустую строку.
9. Если в тексте нужно что-то добавить без изменения предыдущего текста, то тогда добавь тег suggestion без контента внутри, а в text укажи добавляемый фрагмент. Например: `<suggestion text='добавляемый фрагмент'></suggestion>`
10. Если в тексте не обнаружены нарушения, верни пустой список errors.
Перед отправкой ответа обязательно проверь, что в поле text в JSON есть тег <suggestion>.С какими проблемами столкнулись:
- Переформулировка стайлгайда. Изначально наш стайлгайд содержал трудные для понимания правила. Мы заметили, что LLM не всегда точно интерпретирует их, что приводит к ошибкам. Поэтому мы переформулировали все правила с помощью ChatGPT, это повысило точность ответов модели. 
- Строгость формулировок. Для повышения стабильности мы сделали формулировки более строгими. Например, мы решили, что модель всегда будет предлагать удалить причастные обороты, хотя в некоторых случаях это не обязательно. 
- Ограничение сферы применения. В настройке мы сразу определили, что модель будет работать только с техническими текстами. Это позволило избежать сложностей с неоднозначными случаями. Например, с числительными в названиях («Миллионная улица») или именами собственными («бог Один»). 
- Упрощение правил. Мы отказались от сложных числовых правил, так как у моделей часто возникают трудности с арифметикой. Например, не срабатывало правило «не более 3 существительных подряд». Зато «предложения с более чем 20 словами или с более чем одним подчиненным предложением считаются длинными и требуют деления» работает значительно стабильнее. 
- Игнорирование проверок. Мы заметили снижение точности модели при наличии орфографических ошибок, даже если указано игнорировать их. Модель пытается исправить орфографию, пропуская реальные ошибки. Также точность снижается, если одно и то же слово нарушает несколько правил. Поэтому для тестирования мы использовали предложения с единственным нарушением. 
- Неправильное соблюдение некоторых правил. Некоторые правила, такие как написание «вы/ваш» с маленькой буквы и замена «Ё» на «Е», модель соблюдает плохо. Это может быть связано с тем, что LLM работает с токенами, а не с отдельными символами, и на больших массивах данных сложно переопределять конкретные символы. 
Интерфейс настройки и тестирования
С первых итераций мы начали разрабатывать интерфейс для настройки и тестирования правил, чтобы упростить процесс внесения изменений. С помощью v0.dev мы создали простую административную панель, через которую можно управлять:
- Базовым промптом для модели. 
- Описанием правил и тест-кейсами для каждого правила. 
- Положением правила в тексте — например, чтобы правило действовало только на заголовки. 
- Выбором модели для обработки. 
- Параметрами разбиения текста на порции для обращения к модели, так как с меньшими объемами текста точность выше. 
Также панель позволяет собирать статистику по запросам — как для конкретного запроса, так и в разбивке по дням и за весь период. Это помогает отслеживать расходы на этапе тестирования и оценивать бюджет.

Также добавили настройку автотестов. При изменении промпта может нарушиться корректная работа уже описанных правил. Поэтому для каждого правила стайлгайда мы составили ряд тест-кейсов. Это позволяет при каждом изменении запускать проверку модели на всех правилах и сразу видеть, где произошёл регресс. Благодаря этому мы можем быстро выявить и исправить проблему.


Интерфейс проверки
Мы также сделали интерфейс для проверки текста на нарушения стайлгайда: он позволяет не только просмотреть все нарушения, но и при желании заменить их на рекомендации, предложенные моделью.

Точность проверок
На основе наших автотестов мы также составили бенчмарк точности моделей. Мы начинали с настройки проверок на GPT от OpenAI, а затем тестировали их на других моделях. Поэтому все правила стайлгайда описаны максимально просто и подробно, чтобы обеспечить равные условия для всех моделей. Специальных рекомендаций по обучению отдельных моделей мы не нашли.
Бенчмарки могли устареть. Таблицу составляли осенью 2024, потому в ней нет новых моделей Grok и DeepSeek. Также новых версий от OpenAI.

Среди моделей наибольшую точность и приемлемое время обработки показали GPT от 6 августа (эта версия доступна через API) и Claude 3.5 Sonnet. Мы также тестировали GPT mini, поскольку она значительно дешевле, но добиться удовлетворяющей точности не удалось. Кроме того, пробовали Яндекс GPT и GigaChat, но их точность оказалась ниже ожидаемой.
Среди опенсорсных решений мы протестировали Llama 40B и Qwen 72B, которые можно развернуть на собственном сервере. Для этого мы использовали специализированные сервисы с API к этим моделям. Хотя их результаты в автотестах могли показаться не слишком высокими, они показали хорошие рекомендации на небольших текстовых фрагментах и могут быть вполне полезными. Мы также планируем настроить более компактные версии Llama и Qwen для использования на недорогих серверах.
В ходе месяца активной настройки и тестирования затраты составили около 20$.
Для публичной документации не столь важно, используется ли облачное решение от OpenAI или Claude AI, поскольку эта документация открыта и будет проиндексирована поисковиками. Однако, если речь идет о закрытой документации для крупных компаний, мы рекомендуем устанавливать и настраивать опенсорсные модели, такие как Llama или Qwen, которые не передают данные за пределы вашей инфраструктуры.
Выложили в open source
Фактически, мы создали свою версию «Главреда», но с правилами, которые соответствуют нашим стандартам, а не правилам Ильяхова. И которые можно менять по мере необходимости.
Поскольку Gramax — это open source-проект, Gramax Check тоже выложен в открытый доступ.
- Исходный код опубликовали на GitHub. 
- Для проверки текстов с вашими собственными правилами сделали веб-сайт Gramax Check. 
- Принципы работы сервиса и рекомендации по настройке выложили на портал документации. 
- Для быстрого старта опубликовали промпт с нашими стайлгайд-правилами. 
При переходе на сайт Gramax Check вы увидите пустой интерфейс, который нужно будет заполнить своими правилами и тест-кейсами.
Хотя это веб-приложение, оно работает локально: запросы отправляются напрямую с вашего устройства в выбранную модель. Из-за этого может потребоваться VPN для корректной работы с моделями GPT от OpenAI или Claude AI.
Выводы
Используя модели LanguageTool и LLM мы значительно повысили скорость создания качественной технической документации. Хотя некоторые ограничения остались.
- Вероятностный характер результатов. 
- Сложности с определенными языковыми нюансами. 
- Незаменимость человеческого участия. 
Автоматизация не заменяет ревью редактором на 100%, но значительно облегчает рутинные задачи. А также позволяет авторам сосредоточиться на содержательной части работы.
Как у вас устроен процесс проверки? Удалось ли его автоматизировать? Делитесь мнением — мы читаем и отвечаем :)
Комментарии (4)
 - sierra_xr27.05.2025 18:12- Можно добавить в промпт что-то вроде: "Когда встречаешь в тексте "Меня зовут Катя, я лидирую Gramax", всегда переводи это на русский язык. 
 
           
 
pnmv
Очень понравился раздел "какие сложности".
Понравился, практически полной ортогональностью моему опыту. Это не означает, что везде так, просто как факт. (Например: на моей памяти, не было тотального сопротивления, со стороны всей команды, но могли сопротивляться синьоры, поскольку видели в этом снижение своей персональной значимости, для проекта, ну или новички не хотели сами писать ещё и документацию, и тому подобные "сбои".)
Читая статью, неоднократно ловил себя на мысли о том, кто и как будет проверять и оценивать улучшения. Ведь, вполне вероятно, что вариант, понравившийся техническому писателю, и, допустим, тем, кто уже давно занят в конкретном проекте, окажется полностью неподъемной, для новичков, по причине, к примеру, чрезмерной лаконичности описаний. Хотя, это, видимо, за пределами возможностей llm.
krakenkaken Автор
Интересный опыт! Особенно момент со снижением персональной значимости:)
Модель не предлагает исправления от себя, она действует строго по заданным правилам. Правила берутся из стайлгайда компании. В идеальном процессе команда уже знает о стайлгайде и о его правилах. Модель просто помогает его соблюдать.
По поводу лаконичности - это зависит от Tone of Voice компании. Например, мы можем договориться, что у нас тон не лаконичный, а задорный и веселый. Механизмом Gramax Check сделать текст веселее не получится, но в ближайших версиях мы зарелизим рерайт текста: можно будет задать промпт с описанием тона текста, а потом просто его применять.