Технический взгляд на то, почему GPT, Claude и Gemini генерируют похожий «средний» текст, и как с этим работать в продакшене
Когда мы интегрируем LLM в продакшн — будь то генерация описаний товаров, ответов техподдержки или внутренней документации — рано или поздно сталкиваемся с одной и той же проблемой. Текст модели читаем. Грамотен. И при этом видно, что его написала модель. Заказчик жалуется, пользователи отписываются от рассылки, в комментариях пишут «опять ваш чат-бот». Хочется сделать так, чтобы было незаметно — но какие именно патчи накладывать на промпт или пайплайн, не очевидно.
Я работаю с генеративными моделями около двух лет — встраивал их в продуктовые пайплайны, и попутно много редактирую и собственные тексты, и тексты коллег. За это время накопились наблюдения о том, какие именно паттерны сразу выдают LLM-генерацию, и почему они появляются на уровне архитектуры модели, а не как «недоработка обучения».
В статье покажу десять самых выразительных стилистических маркеров, объясню каждый через архитектуру и обучение моделей, и расскажу про практические подходы — что можно сделать на уровне промпта, sampling-параметров и постобработки. Это не «как обмануть детектор» (об этом отдельно в конце, и тема не такая, как её подают). Это про то, как сделать, чтобы выход LLM не выглядел как выход LLM.
Откуда берутся маркеры на архитектурном уровне
Прежде чем перечислять паттерны, нужно понять, почему они появляются. Иначе любая попытка их убрать через промпт будет действовать вслепую.
Большая языковая модель — это статистический инструмент. На каждом шаге генерации она вычисляет распределение вероятностей по словарю токенов и выбирает следующий токен в соответствии с этим распределением. Параметр temperature управляет тем, насколько строго модель следует распределению: при temperature=0 всегда выбирается самый вероятный токен, при temperature=1 выбор случайнее.
Грубая иллюстрация процесса генерации:
import numpy as np def sample_next_token(logits, temperature=1.0, top_p=0.9): """ Семплирование следующего токена из распределения logits. Параметры temperature и top_p критически влияют на «живость» текста. """ # Применяем temperature: чем меньше, тем острее распределение scaled_logits = logits / temperature # Конвертируем в вероятности через softmax probs = np.exp(scaled_logits) / np.sum(np.exp(scaled_logits)) # Top-p (nucleus) sampling: оставляем только токены, чья суммарная # вероятность не превышает top_p sorted_indices = np.argsort(probs)[::-1] cumulative_probs = np.cumsum(probs[sorted_indices]) cutoff = np.searchsorted(cumulative_probs, top_p) + 1 # Зануляем вероятности всех токенов за порогом valid_indices = sorted_indices[:cutoff] valid_probs = probs[valid_indices] valid_probs /= valid_probs.sum() return np.random.choice(valid_indices, p=valid_probs)
Это упрощение — на практике в продакшен-моделях добавляются ещё repetition_penalty, frequency_penalty, presence_penalty и более сложные стратегии. Но базовый принцип такой: модель всегда выбирает что-то близкое к статистическому центру обучающего корпуса, потому что именно эти продолжения имеют самые высокие вероятности.
Что важно: распределение вероятностей у модели формируется из обучающих данных. Если в корпусе на 10 миллиардов токенов фраза «It is important to note that» встречается миллион раз, а «Кстати, тут важная вещь» — тысячу, у первой будет на три порядка более высокая вероятность. При типичных значениях temperature=0.7 и top_p=0.9 редкие, живые формулировки просто не пройдут отсечение и не попадут в выборку.
К этому добавляется второй слой — post-training. После базового претрейна модель учат отвечать на запросы людей через RLHF (Reinforcement Learning from Human Feedback) или DPO. На этом этапе из распределений активно «выбиваются» нежелательные паттерны: грубость, категоричность, отказ от ответа. Но попутно выбиваются и многие живые черты речи: эмоциональная окрашенность, резкие переходы, нестандартные обороты.
Результат: моделям буквально сложно генерировать что-то стилистически нестандартное. Это не баг, это следствие комбинации статистики обучающих данных и инженерных решений на пост-тренинге.
Десять маркеров, разобранных через причину
Дальше пройдусь по конкретным паттернам. Для каждого — что это, почему возникает, как обходить.
1. Параллельные тройки
ИИ обожает структурировать ответы тройками: «гибкость, скорость и качество», «быстрее, дешевле, надёжнее».
Причина. В английских корпусах обучающих данных риторическая конструкция «X, Y, and Z» встречается чрезвычайно часто — это устойчивая структура классической риторики. Vidi, vici, veni, life-liberty-pursuit-of-happiness, blood-sweat-tears. Российские корпуса унаследовали это через переводные тексты и русскую публицистику XX века. Модель учится, что «трёхчленная конструкция = хороший конец предложения».
Как обходить. В промпте — явная инструкция: «избегай перечислений из трёх элементов; используй пары или одиночные понятия». В постобработке — регулярка для поиска паттерна \b\w+, \w+ и \w+\b и ручная правка частых случаев.
2. Финальный абзац-резюме
ИИ практически всегда заканчивает текст итоговым абзацем — «таким образом», «подводя итог», «в заключение».
Причина. На пост-тренинге модель учат давать структурированные, законченные ответы. Это полезно для технической документации и chatGPT-стайла «вопрос → ответ». Но та же привычка переносится на эссе, посты, статьи, где итоговый абзац обычно избыточен.
Как обходить. В промпте: «не пиши заключительный абзац; закончи последней содержательной мыслью». В постобработке: автоматическая проверка последнего абзаца на стартовые маркеры («таким образом», «итак», «в заключение») и его удаление с ручным контролем.
3. Универсальные хеджи и оговорки
«Стоит отметить», «важно понимать», «следует признать», «безусловно», «несомненно».
Причина. В обучающих корпусах много академических, юридических и корпоративных текстов, где такие обороты — норма. Плюс пост-тренинг закрепляет осторожные формулировки, потому что категоричность считается нежелательным паттерном (модель не должна делать заявлений, которые могут оказаться неверными).
Как обходить. Список хеджей-стопов в постобработке. Для русского:
HEDGE_PATTERNS = [ r"\bстоит отметить,?\s*", r"\bважно (понимать|учитывать|подчеркнуть),?\s*", r"\bследует (отметить|признать|учитывать),?\s*", r"\b(безусловно|несомненно|очевидно|разумеется),?\s*", r"\bпотенциально\s+(может|способен|возможно)",] def remove_hedges(text: str) -> str: """Убирает наиболее частые ИИ-хеджи из текста.""" import re for pattern in HEDGE_PATTERNS: # Заменяем на пустую строку с учётом регистра первой буквы text = re.sub(pattern, "", text, flags=re.IGNORECASE) # Восстанавливаем заглавную букву после удаления в начале предложения text = re.sub(r"(^|\.\s+)([а-я])", lambda m: m.group(1) + m.group(2).upper(), text) return text
Этот код не идеален — может удалить хедж, который реально нужен в контексте — но как первая итерация для длинных текстов работает.
4. «В современном мире» и подобные открывалки
Стартовые фразы абзацев типа «в эпоху цифровизации», «не секрет, что», «как известно».
Причина. Это паттерны академических введений и пресс-релизов. В корпусах обучения их много (особенно в новостных архивах и научно-популярных текстах), поэтому модель использует их как «безопасный старт».
Как обходить. В промпте: «начинай абзацы с конкретного факта или события, без обобщающих формулировок». В постобработке: blacklist начальных фраз и их удаление при обнаружении.
5. Симметрия «с одной стороны / с другой стороны»
При обсуждении спорных тем модель почти всегда даёт сбалансированную картину: аргументы за, аргументы против, нейтральный вывод о компромиссе.
Причина. Здесь именно пост-тренинг доминирует. Модели специально учат не занимать сторону в спорных вопросах, чтобы избежать политических, этических и других рисков. Anthropic называет это политикой нейтральности по контентам, OpenAI — model neutrality. Это сознательное решение, и его сложно обойти промптом.
Как обходить. Если вам нужен текст с авторской позицией — полезнее давать в промпт «персону»: «ты пишешь от лица главного инженера компании X, который твёрдо считает, что нужно использовать Y». Тогда модель занимает сторону внутри роли. Или — после генерации — провести редактуру вручную, заменив симметрию на утверждение.
6. Идеальная синтаксическая правильность
Каждое предложение модели грамматически безупречно. Длинные предложения хорошо построены, короткие сбалансированы. Никаких «неправильных» конструкций для эффекта.
Причина. Корпусы обучения — это в основном отредактированные тексты. Книги, газетные статьи, википедия. Спонтанной письменной речи там мало (форумы и Reddit есть, но они уже взвешены вниз во многих моделях). Соответственно, модель учится писать «правильно», а не «выразительно».
Как обходить. Постобработка с осторожными нарушениями: иногда заменить запятую на точку для драматического эффекта, иногда оставить одно слово абзацем. Это сложно делать алгоритмически — обычно требуется человек или вторая модель с явной инструкцией «добавь стилистические вольности».
7. Однородная длина абзацев
ИИ-тексты имеют статистически узкое распределение длин абзацев — обычно 3-5 предложений каждый, с редкими отклонениями.
Причина. Это композиционный паттерн, выученный из «среднего абзаца» в корпусах. У живого автора распределение длин широкое: есть абзацы из одного предложения, есть из десяти. У модели — узкое.
Как обходить. Можно проверять алгоритмически:
import numpy as np def paragraph_length_variance(text: str) -> tuple[float, float]: """ Возвращает среднюю длину абзаца (в предложениях) и её стандартное отклонение. Если std/mean < 0.3, текст с большой вероятностью сгенерирован LLM. """ paragraphs = [p.strip() for p in text.split("\n\n") if p.strip()] sentence_counts = [ len([s for s in p.split(".") if s.strip()]) for p in paragraphs ] mean_len = np.mean(sentence_counts) std_len = np.std(sentence_counts) cv = std_len / mean_len if mean_len > 0 else 0 return mean_len, cv # Пример: текст человека обычно даёт cv > 0.5# Текст модели — cv < 0.3
Если у вас в пайплайне cv стабильно ниже 0.3 — это сигнал, что нужно добавить вариативности (например, через постобработку с разрезанием/слиянием абзацев) или перенастроить промпт.
8. Безопасные метафоры
«Открывает новые возможности», «играет ключевую роль», «является важным аспектом», «выходит на новый уровень».
Причина. Эти фразы чрезвычайно часты в корпорах деловой и публицистической речи. Они «нейтрально-удачные»: ничего не значат конкретно, но звучат прилично. Модель использует их как заглушку, когда нужно сказать что-то общее.
Как обходить. В промпте: «используй конкретные числа, имена, события вместо обобщений; не используй фразы “открывает возможности”, “играет ключевую роль”, “выходит на новый уровень”». Модели обычно неплохо реагируют на такие явные негативные инструкции.
9. Логические связки между абзацами
«Таким образом», «в этой связи», «при этом стоит учитывать», «в данном контексте».
Причина. Связки чаще всего встречаются в академических текстах и эссе, и модель усвоила, что «хорошо написанный текст» имеет явные связки между мыслями. Но в живой публицистике мысли часто просто соседствуют — связь понимается из содержания.
Как обходить. В постобработке — удалить связки в начале абзацев и проверить, всё ли понятно. Если нет — оставить или переформулировать первое предложение, чтобы связь стала явной из содержания.
10. Избыточные хеджи на твёрдых фактах
«Python потенциально может быть использован для веб-разработки». «Технология React, как правило, применяется в продакшене».
Причина. Это тот же эффект, что и пункт 3, но на уровне фактических утверждений. Модель учат не делать слишком категоричных заявлений, и она хеджит даже там, где факт твёрдый.
Как обходить. В промпте: «когда утверждение фактически верно, не добавляй “потенциально”, “как правило”, “обычно”». В постобработке: словарь хеджей-стопов рядом с маркерами фактов (числа, имена технологий, имена компаний).
Что это означает для продакшен-пайплайна
Если вы интегрируете LLM в продакт и хотите, чтобы выход не выглядел как «опять чат-бот написал», базовые рекомендации такие.
На уровне промпта. Стоит явно описать стилистические запреты. Не «пиши живо и интересно» (это не работает), а «не используй фразы “стоит отметить”, “важно понимать”, “таким образом”; не делай перечислений из трёх элементов; не пиши заключительного абзаца». Конкретные инструкции работают лучше абстрактных.
На уровне sampling-параметров. При temperature=0.3 модель производит максимально предсказуемый «средний» выход — со всеми маркерами в чистом виде. При temperature=0.9-1.1 начинает появляться вариативность, но и качество может проседать. Подбирать под задачу. Для творческих текстов имеет смысл temperature=1.0 плюс top_p=0.95.
На уровне постобработки. Регулярки для удаления хеджей и повторов работают на удивление неплохо — особенно для длинных текстов. Это не панацея, но первая итерация очистки занимает несколько минут разработки и убирает 60-70% самых очевидных маркеров.
На уровне второй модели. Иногда хорошо работает schema: первая модель генерирует черновик, вторая (с другим промптом или другая модель — например, Claude после GPT) делает редактуру в живом стиле. Это удваивает стоимость, но качество обычно ощутимо выше.
На уровне человека. Если бюджет позволяет — финальная редактура человеком на 5-10 минут текста закрывает оставшиеся 30%. Это разница между «работает» и «незаметно».
Про детекторы и «обход»
Не могу не сказать пару слов про связанную тему — детекторы ИИ-текста и попытки их обходить. В рунете эта тема активно продаётся в формате «промпт для обхода Антиплагиат-вуз», «лайфхак для курсовых».
Технически детекторы работают на тех же принципах, что я описал выше: ищут статистические аномалии, характерные для LLM-генерации. Распределение длин предложений, повторение определённых n-gram, «гладкость» текста по перплексии относительно базовой языковой модели. Современные детекторы (GPTZero, Originality, академические Антиплагиаты) дают на чистом ИИ-тексте 80-95% точности.
«Промпт для обхода» — это попытка сместить распределение в выходе модели, чтобы статистика стала больше похожа на человеческую. Косметически это работает на простых детекторах. На современных — нет. Я тестировал несколько таких промптов, выход прогонял через GPTZero и Антиплагиат — обнаружение в большинстве случаев сохранялось, потому что глубокие статистические маркеры (распределения) промптом не меняются.
Что действительно работает — это глубокая редактура с привнесением своего. Вы берёте ИИ-черновик, сохраняете тезисы, но переписываете формулировки, добавляете личные примеры, ломаете структуру, убираете все паттерны из списка выше. К моменту, когда вы это сделали — у вас в руках уже ваш текст, в котором ИИ был использован как болванка. Это нормальная практика, и говорить тут об «обмане детектора» странно.
В контексте академических работ ситуация особая. Если ваша задача — сдать курсовую, диссертацию или контрольную, и вы хотите проскочить проверку с минимальным усилием — это плохая стратегия. И не потому, что детектор поймает (он, возможно, не поймёт), а потому что у учёбы есть смысл за пределами оценки. Когда вы пишете курсовую руками, вы разбираетесь в теме. Когда вы прогоняете её через ИИ и облагораживаете промптом — у вас в голове ничего не остаётся. Через год вы не вспомните, о чём была эта работа. И на последующих курсах, на дипломе, на работе вы будете в дефиците знаний, который придётся как-то компенсировать.
В контексте продуктовых задач (генерация контента для пользователей, поддержка, документация) — наоборот, всё описанное в статье полезно. Никого вы не обманываете, вы просто делаете выход модели читаемым.
Главная мысль
Маркеры ИИ-текста — это не магия и не «секретная утечка из обучения». Это статистическое следствие того, как модели устроены: усреднение по корпусу плюс пост-тренинг с акцентом на нейтральность. Отсюда — параллельные тройки, симметричные структуры, безопасные метафоры, заключительные абзацы.
Знание этих маркеров полезно по двум причинам. Первая — практическая: если вы интегрируете LLM в продукт, вы можете системно бороться с «AI look» через промпт, sampling и постобработку. Вторая — общая: этот же набор паттернов описывает разницу между «средним хорошо написанным текстом» и «живым авторским текстом», и это полезно знать любому, кто работает со словом.
Главное — относиться к этому не как к набору лайфхаков для обхода, а как к описанию реальной разницы между двумя типами текстов. Тогда инструменты редактуры, описанные выше, начинают работать сами собой.
Полезные источники:
-
Holtzman et al. «The Curious Case of Neural Text Degeneration» — классическая работа про nucleus sampling и статистику генерации
-
Mitchell et al. «DetectGPT» — академический подход к обнаружению LLM-текста через изменение перплексии
-
Стэнфордское исследование о false-positive детекторов на текстах non-native English speakers (Liang et al., 2023)
ссылка на оригинал статьи https://habr.com/ru/articles/1033450/