Часть I

Механика галлюцинаций

Что это такое, почему возникает, как проявляется

Что такое галлюцинации LLM?

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

Уверенный тон

Модель не сомневается, даже когда полностью неправа. Нет индикатора «я не уверен».

</>

Правдоподобность

Ответ похож на настоящий — структура, термины, синтаксис. Форма правильная, содержание — нет.

⚠️

Невозможность отличить

Без экспертизы в предметной области галлюцинация неотличима от правды.

🔍 Почему возникают галлюцинации?

Статистическое предсказание

LLM предсказывает следующий токен на основе вероятностей, а не «понимает» предмет. Если правильный ответ редок в обучающих данных — модель выбирает более частотный, но неверный вариант.

Смешение контекстов

Модель обучена на текстах про все архитектуры сразу: Z80, 6502, x86, ARM, MIPS. При генерации берёт куски отовсюду — синтаксис от одного, семантику от другого.

Квантизация и размер

Маленькие модели (8B) с квантизацией (q4/q5) теряют редкие знания первыми. Z80 ассемблер — капля в море по сравнению с Python. Ёмкости не хватает для разделения архитектур.

Chain-of-Thought иллюзия

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

🔬 Эксперимент: условия

Установка

Модель: Qwen3-8B (q4 квантизация)

GPU: NVIDIA RTX 3050 (8 ГБ VRAM)

Инференс: Ollama / llama.cpp (локально)

Параметры: 8 млрд параметров, ~4.5 ГБ в q4

Задание

Написать сложение двух чисел на ассемблере Z80. Числа в регистрах A и B, результат в A.

Правильный ответ ADD A, B ; A = A + B ; опкод 0x80 ; 1 байт, 4 такта

Одна инструкция. Один байт. Четыре такта.

#1 Трёхоперандный синтаксис
Выход Qwen3-8B ADD A, B, A
<think>
"I think there's an ADD instruction which adds two registers... ADD src1, src2, dest. So if I have numbers in A and B, maybe I can do ADD A,B,A. That should add A and B, put the result back into A."
Полный ответ Qwen3-8B (попытка #1)
<think> I need to write Z80 assembly to add two numbers. I think there's an ADD instruction which adds two registers... ADD src1, src2, dest. So if I have numbers in A and B, maybe I can do ADD A,B,A. That should add A and B, put the result back into A. Wait, maybe I should use ADI for immediate addition? Or maybe there's an ALU OP2 mode... Let me think about the register stack model... Actually, the Z80 has different addressing modes. </think> In Z80 assembly, to add two numbers stored in registers A and B, with the result in A: ADD A, B, A This uses the three-operand ADD instruction to add the values in registers A and B, storing the result back in register A.
#2 Побитовый сумматор
Выход Qwen3-8B LD C, 0 LD D, 0 LDD 7 XOR A, B LDX $-1 AND A, B INCR C CP D, 3 JZ $+10 LD A, D

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

Полный ответ Qwen3-8B (попытка #2)
<think> OK let me think about this differently. Addition is really just bitwise XOR for the sum bits and AND for the carry bits. I can implement a full adder using logical operations. I need a loop that processes each bit position, computes XOR for sum and AND for carry, then shifts... Let me use LDD for the loop counter. </think> Here is a Z80 implementation of addition using a bitwise full adder approach: LD C, 0 ; initialize sum LD D, 0 ; initialize counter LDD 7 ; loop 7 times (8 bits) XOR A, B ; sum bit = A XOR B LDX $-1 ; loop back AND A, B ; carry = A AND B INCR C ; increment carry counter CP D, 3 ; check overflow JZ $+10 ; jump if zero LD A, D ; store result This implements binary addition bit by bit using XOR for sum and AND for carry propagation.
#3 Несуществующие инструкции
Выход Qwen3-8B LD A, 100 LD B, 200 ADC C MASK C, 0FF STO 300, C

Модель перемешала Z80, 6502, 8080 и псевдокод из учебников в одну кашу. 8B параметров с квантизацией — не хватает ёмкости чтобы разделить архитектуры в «памяти» весов.

Полный ответ Qwen3-8B (попытка #3)
<think> The user wants to add two numbers on Z80. Let me load the numbers into registers first, then use ADC to add with carry into register C. After that I need to mask the result to 8 bits and store it to memory. </think> To add two numbers in Z80 assembly: LD A, 100 ; load first number LD B, 200 ; load second number ADC C ; add A and B into C with carry MASK C, 0FF ; mask to 8-bit result STO 300, C ; store result to address 300 The ADC instruction adds the accumulator and register B with the carry flag, storing the result in C. The MASK instruction ensures the result stays within 8-bit range, and STO stores the final value to memory.

⚠️ Паттерн: уверенная бессмыслица

4 попытки — 4 разных способа ошибиться:

#1ADD A, B, AВыдуманный 3-операндный синтаксис (MIPS/ARM)
#2LDD 7 / XOR / LDX...Побитовый сумматор на несуществующих командах
#3LD A,100 / STO 300,CКаша из Z80, 6502, 8080 и псевдокода
#4MASK C, 0FFМаскирование 8-бит регистра до 8 бит
✓ Правильный ответ
ADD A, B

🔄 Chain-of-Thought: когда рассуждения вредят

Зачем нужен CoT?

Трансформер генерирует токен за токеном. Каждый новый видит все предыдущие. Когда модель записывает промежуточные шаги, они становятся частью контекста для финального ответа — модель использует свой вывод как «рабочую память» (scratchpad). Без CoT всё «вычисление» должно уместиться в один forward pass — как перемножить трёхзначные числа в уме, не записывая промежуточные результаты. С CoT каждый записанный шаг даёт дополнительный forward pass с новой информацией. Это увеличивает «вычислительный бюджет» и даёт измеримый прирост точности на математике, логике, программировании.

⚡ Но когда знаний нет — CoT превращается в положительную обратную связь

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

Неверное предположение
Попадает в контекст
Модель развивает ошибку
Уверенный неверный ответ

CoT помогает

Модель «знает» предмет, данных достаточно. CoT помогает структурировать знания, не терять промежуточные шаги. Аналогия: перемножать числа на бумаге, а не в уме.

CoT вредит

Знаний нет — модель структурирует заблуждения. Без CoT могла бы случайно выдать ADD A, B как частотный паттерн. С CoT «убеждает себя» в неправильном варианте.

🧠 В теории управления

Это runaway feedback — система без демпфирования. У человека есть внутренний «стоп»: написал ADD A, B, A, посмотрел, подумал «у Z80 нет трёх операндов». Модель не сверяет рассуждения с реальностью — генерирует наиболее вероятное продолжение написанного.

🪞 Может ли модель проверить себя?

Короткий ответ — нет. У LLM нет механизма, который говорит «это я знаю точно, а тут не уверен». Нет внутренней базы фактов для сверки. Степень «уверенности» — это распределение вероятностей следующего токена, а не осознанная оценка достоверности.

Что работает косвенно:

Согласованность обучающих данных

Когда тема хорошо представлена — тысячи статей, учебников — в весах формируются устойчивые паттерны. Ламповый усилитель, основы SQL, базовый Verilog — всё подкреплено из множества независимых источников. Результат правильный не потому что модель себя проверила, а потому что статистика обучающих данных сходится к верному ответу.

Выученная осторожность (RLHF)

В процессе обучения с обратной связью модели «учат» распознавать области неопределённости и добавлять оговорки: «если не ошибаюсь», «стоит проверить». Но это выученный паттерн поведения, а не настоящая рефлексия — модель не отличает случаи, когда она права, от случаев, когда ошибается.

Где данных мало — всё ломается

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

Как на практике обнаружить галлюцинацию:

Проверка через реальность

Код компилируется? Железо работает? Это самый надёжный фильтр — но только для обратимых действий. Verilog хорош тем, что Quartus не скомпилирует чушь, а FPGA не заработает с ошибкой в логике.

Перекрёстная проверка

Проверять не весь ответ, а ключевые утверждения: по документации, даташиту, учебнику. Если LLM говорит «используй always @(posedge clk)» — это легко проверить. Если утверждает что-то про тайминги конкретного чипа — вот тут стоит сверить.

Внутренняя согласованность

Если модель в одном месте утверждает одно, в другом — противоречит, это красный флаг. Также: переспроси тот же вопрос иначе. Ответы согласуются — скорее всего правильно. Расходятся — модель «плавает».

Подозрительная конкретика

Когда LLM уверенно пишет конкретные числа, регистры, тайминги — это либо точно знает, либо точно врёт. Общие принципы обычно надёжнее конкретных параметров. «Cyclone IV EP4CE6 содержит 6272 логических элемента» — стоит проверить именно такие факты.

💣 Обратимые и необратимые ошибки

Подход «проверяй на практике» работает не всегда

Залил неправильный Verilog на FPGA — не работает, поправил, залил снова. А вот с sudo dd if=/dev/urandom of=/dev/sda1 второго шанса нет. Команда синтаксически безупречна, dd выполнит её без ошибок, все формальные проверки пройдены — а данные потеряны навсегда.

🔁

Обратимые

  • Код не компилируется → исправить
  • FPGA не работает → перезалить
  • Тест не проходит → отладить
  • HTML выглядит криво → поправить CSS
  • Уровень верификации: обычный
💀

Необратимые

  • dd на боевой диск → данные потеряны
  • DROP TABLE в продакшене → без бэкапа всё
  • Дыра в безопасности → утечка данных
  • Неправильная дозировка → здоровье
  • Уровень верификации: максимальный
⚠️ Замкнутый круг проверки

«Перепроверить в гугле» упирается в ту же проблему — нужно знать, что именно проверять. Если не знаешь, что /dev/sda1 — это диск с данными, и в гугле не поймёшь, что команда опасна. Загуглишь «dd if urandom», найдёшь статьи про безопасное стирание дисков и решишь, что всё правильно.

Чем выше цена ошибки —
тем больше нужна собственная экспертиза,
а не внешняя проверка
Оглавление II. Экономика ошибки и граница компетентности →