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

推荐订阅源

A
About on SuperTechFans
K
Kaspersky official blog
P
Privacy & Cybersecurity Law Blog
The Hacker News
The Hacker News
S
Security Affairs
Attack and Defense Labs
Attack and Defense Labs
Simon Willison's Weblog
Simon Willison's Weblog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
C
Cyber Attacks, Cyber Crime and Cyber Security
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
F
Fortinet All Blogs
Jina AI
Jina AI
H
Hacker News: Front Page
L
LINUX DO - 最新话题
C
Check Point Blog
J
Java Code Geeks
有赞技术团队
有赞技术团队
G
Google Developers Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
T
The Blog of Author Tim Ferriss
U
Unit 42
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Recent Commits to openclaw:main
Recent Commits to openclaw:main
爱范儿
爱范儿
S
Secure Thoughts
Webroot Blog
Webroot Blog
V
V2EX
MyScale Blog
MyScale Blog
Blog — PlanetScale
Blog — PlanetScale
L
LINUX DO - 热门话题
D
Docker
Recorded Future
Recorded Future
The Last Watchdog
The Last Watchdog
云风的 BLOG
云风的 BLOG
AWS News Blog
AWS News Blog
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
The GitHub Blog
The GitHub Blog
Google DeepMind News
Google DeepMind News
P
Privacy International News Feed
MongoDB | Blog
MongoDB | Blog
Recent Announcements
Recent Announcements
AI
AI
O
OpenAI News
Hugging Face - Blog
Hugging Face - Blog
Stack Overflow Blog
Stack Overflow Blog
S
SegmentFault 最新的问题
博客园 - 聂微东
Martin Fowler
Martin Fowler

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

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет 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: строим ChatGPT с нуля за десять шагов
amaksr · 2026-06-17 · via Все публикации подряд на Хабре

Когда впервые сталкиваешься с современными языковыми моделями, легко потеряться в количестве новых терминов. Embeddings, Attention, KV Cache, Multi-Head Attention, Positional Encoding — в статьях про GPT и Llama всё это появляется уже на первых страницах.

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

Гораздо проще посмотреть на этот путь шаг за шагом:

Bigram model
↓
RNN
↓
Attention
↓
Transformer
↓
LLM

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


Часть I. Как устроен LLM

Шаг 1. Bigram Model: попугай на 49 параметров

Начнем с максимально простой языковой модели.

Пусть наш словарь состоит всего из семи токенов:

vocab = [
    "John",
    "Mary",
    "likes",
    "hates",
    "cats",
    "dogs",
    "<END>"
]

Обучающие данные:

John likes cats
John likes dogs
Mary likes cats
Mary hates dogs

Самая простая языковая модель хранит вероятность следующего токена после текущего.

Например:

P(likes | John)
P(hates | Mary)
P(cats | likes)
P(dogs | hates)

Такую модель можно представить как матрицу:

import numpy as np

vocab_size = 7

weights = np.random.randn(vocab_size, vocab_size)

print(weights.shape)

Результат:

(7, 7)

Всего:

7 × 7 = 49 параметров

Для генерации текста используется Softmax.

# превращает произвольные числовые оценки модели в вероятности,
# сумма которых равна 1
def softmax(x):
    e = np.exp(x - np.max(x))
    return e / e.sum()

john_id = 0

probs = softmax(weights[john_id])

print(probs)

Теперь модель умеет отвечать на вопрос:

Какой токен вероятнее всего идет после "John"?

Это уже настоящий Language Model.

Но есть проблема: после слова "likes" модель не помнит, кто именно любит кошек.

John likes cats
Mary likes cats

Для нее это одна и та же ситуация, так как памяти нет.


Шаг 2. RNN (Recurrent Neural Network): добавляем память

Логичное решение — хранить внутреннее состояние. Пусть модель читает предложение по одному слову.

John → likes → cats

После каждого токена обновляется скрытое состояние.

import numpy as np

# В начале предложения память пустая
h = np.zeros(2)

# Параметры модели, которые будут обучаться
Wx = np.random.randn(2, 2)
Wh = np.random.randn(2, 2)

def step(x, h):
    # Влияние текущего слова
    input_part = Wx @ x

    # Влияние прошлой памяти
    memory_part = Wh @ h

    # Новое скрытое состояние
    return np.tanh(input_part + memory_part)

Теперь вычисления выглядят так:

John
 ↓
h1

likes
 ↓
h2

cats
 ↓
h3

Вектор h играет роль памяти. Если в начале предложения встретился John, информация может сохраниться внутри состояния и использоваться позже.Это огромный шаг вперед.

Но появляется новая проблема. Если предложение становится длинным:

The cat that lived in the house near the river ...

то информация постепенно забывается. Все прошлое приходится сжимать в один маленький вектор. Это называется bottleneck.


Шаг 3. Attention: перестаем всё помнить

RNN решил проблему отсутствия памяти, но породил новую. Вся история предложения должна теперь помещаться в один скрытый вектор:

John likes cats

Пока предложения короткие, это работает неплохо. Но что произойдет, если предложение состоит из многих слов?

The cat that lived in the house near the river ...

Модели приходится постоянно сжимать всё прошлое в один небольшой набор чисел. Чем длиннее становится текст, тем сложнее сохранить важную информацию.

Возникает естественная идея: А что если не пытаться помнить всё? Что если хранить все предыдущие токены и при необходимости просто обращаться к нужным? Предположим, мы обрабатываем предложение:

John likes cats

В данный момент модель находится на слове:

cats

Чтобы понять контекст, она может посмотреть назад на предыдущие слова:

John
likes
cats

Но как определить, какие слова важнее? Как вариант, можно вычислить некоторое число для каждого токена, показывающее степень его релевантности текущему слову. Например, допустим, модель решила, что для слова "cats":

John  → 1.2
likes → 0.8
cats  → 0.3

Чем больше число, тем сильнее внимание. Пока это ещё не вероятности, а просто оценки важности (attention scores). Для преобразования их в вероятности используется Softmax:

import numpy as np

scores = np.array([1.2, 0.8, 0.3])

weights = np.exp(scores)
weights /= weights.sum()

print(weights)

Получаем:

John   0.47
likes  0.32
cats   0.21

Теперь веса суммируются к единице и могут интерпретироваться как распределение внимания. Модель буквально говорит:

При обработке слова "cats" я примерно на 47% смотрю на "John", на 32% — на "likes" и на 21% — на текущее слово.

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

Откуда вообще берутся числа:

1.2
0.8
0.3

Ответ на него приводит нас к Transformer.


Шаг 4. Transformer: превращаем Attention в архитектуру

До сих пор мы просто предполагали, что модель каким-то образом умеет вычислять attention scores. Теперь разберёмся, как это происходит на самом деле.

В 2017 году вышла статья: "Attention Is All You Need". Её авторы предложили радикальную идею. Если Attention умеет выбирать важные части контекста, то, возможно, рекурсия вообще не нужна. Можно полностью отказаться от RNN и построить всю архитектуру вокруг механизма внимания. Для каждого токена модель сначала вычисляет его эмбеддинг.

Например:

John  → embedding
likes → embedding
cats  → embedding

Затем из каждого эмбеддинга строятся три новых вектора:

import numpy as np

embedding_dim = 4

embedding = np.random.randn(embedding_dim)

Q = np.random.randn(embedding_dim)
K = np.random.randn(embedding_dim)
V = np.random.randn(embedding_dim)

Именно отсюда появляются знаменитые Query, Key и Value. Можно представить их следующим образом:

  • Query отвечает на вопрос: "Что я сейчас ищу?"

  • Key отвечает: "Какую информацию я содержу?"

  • Value отвечает: "Какую информацию я передам дальше, если меня выберут?"

Теперь предположим, что мы снова обрабатываем слово:

cats

Его Query сравнивается с Key каждого токена в контексте:

score = Q @ K

Скалярное произведение показывает степень сходства между запросом и кандидатом. Для каждого слова получается свой score:

John  → 1.2
likes → 0.8
cats  → 0.3

Вот откуда появились числа из предыдущего раздела. Они не берутся случайно и не задаются вручную. Это результат сравнения Query текущего токена с Key всех остальных токенов. После этого применяется Softmax и получаются веса внимания:

John   0.47
likes  0.32
cats   0.21

Затем эти веса используются для смешивания Value-векторов.

В результате формируется новая репрезентация слова "cats", которая уже учитывает весь контекст предложения. Самое важное здесь то, что каждый токен может напрямую обращаться к любому другому токену внутри контекстного окна. Больше не нужно передавать информацию через длинную цепочку скрытых состояний, как в RNN. Именно поэтому Transformer лучше работает с длинными текстами, легче обучается на GPU и стал фундаментом всех современных LLM.


Шаг 5. LLM: просто очень большой Transformer

После понимания Transformer исчезает большая часть магии вокруг современных языковых моделей.

С инженерной точки зрения GPT, Claude, Gemini или Llama выглядят удивительно скучно. Это всё тот же Transformer, только масштабированный до десятков или сотен слоёв, обученный на огромном количестве текстов и содержащий миллиарды параметров.

Типичная схема выглядит примерно так:

Tokenizer
    ↓
Embeddings
    ↓
Transformer × N
    ↓
Softmax

На каждом шаге модель делает ровно одну вещь: предсказывает следующий токен. Например, получив контекст:

The capital of France is

модель вычисляет вероятности:

{
  "Paris": 0.93,
  "London": 0.02,
  "Berlin": 0.01,
  "Rome": 0.01
}

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


Часть II. Откуда берётся рассуждение

Шаг 6. Где находится мышление?

После знакомства с архитектурой Transformer многие испытывают одинаковое разочарование. Несколько разделов подряд мы говорили про внимание, эмбеддинги, матрицы и миллиарды параметров. А затем выяснилось, что вся система решает одну-единственную задачу — предсказывает следующий токен. Возникает закономерный вопрос: где именно находится мышление?

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


Шаг 7. Почему модель пишет промежуточные шаги?

В обучающих данных постоянно встречаются последовательности вроде:

Вопрос
    ↓
Решение
    ↓
Промежуточные вычисления
    ↓
Ответ

Для человека это выглядит как рассуждение. Для модели — как статистическая закономерность. Если в интернете миллионы раз встречалась структура:

17 × 20 = 340
17 × 3 = 51
340 + 51 = 391

то после появления фрагмента:

17 × 20 =

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


Шаг 8. Chain of Thought: внешний блокнот для модели

Теперь становится понятно, почему техника Chain of Thought работает настолько хорошо.

Когда мы пишем:

Рассуждай шаг за шагом

мы не включаем какой-то скрытый модуль логики. Мы заставляем модель генерировть дополнительные промежуточные токены. Эти токены затем попадают обратно в контекст и становятся доступными для следующих вычислений. Получается любопытный цикл:

Модель пишет текст
        ↓
Текст попадает в контекст
        ↓
Модель читает этот текст
        ↓
Использует его для следующих шагов

Фактически модель использует собственный вывод как внешний блокнот. Часть вычислений оказывается вынесена из весов сети непосредственно в текст.


Шаг 9. Почему модель умеет решать новые задачи?

На этом этапе обычно возникает ещё один вопрос.

Если модель просто воспроизводит шаблоны из обучающих данных, почему она способна решать задачи, которых никогда раньше не видела?

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

Предположим, в обучающих данных встречаются предложения:

John likes cats
John likes dogs
Mary likes cats
Mary likes dogs

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

Но градиентный спуск находит более простое решение.

Во всех примерах слова "John" и "Mary" появляются в похожем контексте. А слова "cats" и "dogs" тоже часто оказываются взаимозаменяемыми. Во время обучения параметры постепенно изменяются так, чтобы похожие слова получили похожие представления внутри модели.

В результате эмбеддинги могут стать примерно такими:

John  → [0.8, 0.2]
Mary  → [0.7, 0.3]
cats  → [0.1, 0.9]
dogs  → [0.2, 0.8]

Точные числа не важны. Важно, что John и Mary оказываются близко друг к другу в пространстве признаков, а cats и dogs — в другом кластере. После этого модель фактически начинает работать не с конкретными словами, а с их свойствами.

Поэтому предложение "Bob likes cats" оказывается не полностью новой ситуацией.

Если эмбеддинг Bob похож на эмбеддинги John и Mary, модель может применить уже известные закономерности к новому слову.

Именно так возникает обобщение. Модель не выводит правило в символьном виде:

<имя> likes <животное>

как сделал бы программист.

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


Шаг 10. Почему фраза "LLM просто предсказывает следующий токен" вводит в заблуждение

Фраза:

LLM всего лишь предсказывает следующий токен.

технически абсолютно верна. Но она создаёт ложное впечатление, будто модель является очень сложным автодополнением текста. Это примерно то же самое, что сказать:

Процессор всего лишь выполняет инструкции.

или:

Мозг всего лишь передаёт электрические импульсы.

На уровне отдельной операции это правда. Однако сложное поведение возникает на уровне всей системы.

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

Рассуждение возникает не вопреки механизму next-token prediction.

Рассуждение возникает именно из него.