π Before Transformers β The LSTM Era
Before transformers took over, the go-to architecture was the LSTM (Long Short-Term Memory) β a type of Recurrent Neural Network (RNN).
These models read text the way you'd read a sentence out loud β one word at a time, in order:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>The LSTM Bottleneck</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Newsreader:ital,opsz,wght@0,6..72,600&family=Inter:wght@500;600;700;800&family=JetBrains+Mono:wght@500;600&display=swap" rel="stylesheet">
<style>
html, body { margin: 0; padding: 0; }
.infographic-lstm {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--red: #d64545;
--red-soft: #fbe9e9;
--radius: 10px;
--display-font: 'Newsreader', serif;
--body-font: 'Inter', system-ui, sans-serif;
--mono-font: 'JetBrains Mono', monospace;
box-sizing: border-box;
max-width: 700px;
margin: 0 auto;
padding: 2rem 1.5rem 2.25rem;
font-family: var(--body-font);
color: var(--ink);
background: var(--paper);
}
.infographic-lstm[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #13171F;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--red: #e77a7a;
--red-soft: #362021;
}
.infographic-lstm * { box-sizing: border-box; }
.infographic-lstm .lst-title { font-family: var(--display-font); font-weight: 600; font-size: 1.2rem; text-align: center; margin: 0 0 0.35rem; }
.infographic-lstm .lst-subtitle { text-align: center; color: var(--ink-soft); font-size: 0.85rem; margin: 0 0 1.75rem; }
.infographic-lstm .lst-controls { display: flex; justify-content: center; gap: 0.5rem; margin-bottom: 2rem; }
.infographic-lstm .lst-btn {
display: flex; align-items: center; justify-content: center; width: 38px; height: 38px; border-radius: 50%;
border: 1px solid var(--line); background: var(--paper); color: var(--ink); cursor: pointer;
box-shadow: 0 2px 6px rgba(0,0,0,0.06);
}
.infographic-lstm .lst-btn:hover { border-color: var(--accent); color: var(--accent); }
.infographic-lstm .lst-btn svg { width: 16px; height: 16px; }
.infographic-lstm .lst-queue { display: flex; justify-content: center; gap: 0.5rem; margin-bottom: 1.25rem; flex-wrap: wrap; }
.infographic-lstm .lst-chip {
font-family: var(--mono-font); font-size: 0.85rem; font-weight: 600; padding: 0.4rem 0.75rem;
border-radius: 999px; background: var(--paper-alt); color: var(--ink-soft); border: 1px solid var(--line);
opacity: 0.5; transform: scale(1);
}
.infographic-lstm .lst-stage { display: flex; flex-direction: column; align-items: center; gap: 0.4rem; margin-bottom: 1.5rem; }
.infographic-lstm .lst-arrow-down { color: var(--line); }
.infographic-lstm .lst-arrow-down svg { width: 18px; height: 18px; }
.infographic-lstm .lst-node {
width: 82px; height: 82px; border-radius: 50%; background: var(--accent-soft); color: var(--accent);
display: flex; align-items: center; justify-content: center; box-shadow: 0 3px 10px rgba(37,99,235,0.15);
}
.infographic-lstm .lst-node svg { width: 36px; height: 36px; }
.infographic-lstm .lst-node-label { font-size: 0.72rem; font-weight: 700; color: var(--ink-soft); margin-top: 0.3rem; }
.infographic-lstm .lst-output {
font-family: var(--mono-font); font-size: 1.05rem; font-weight: 600; min-height: 1.6em;
display: flex; gap: 0.4rem; justify-content: center; flex-wrap: wrap; margin-bottom: 1.75rem;
}
.infographic-lstm .lst-out-word { opacity: 0; color: var(--accent); }
.infographic-lstm .lst-problems { display: flex; justify-content: center; gap: 0.6rem; flex-wrap: wrap; }
.infographic-lstm .lst-problem {
display: flex; flex-direction: column; align-items: center; gap: 0.4rem; width: 130px;
padding: 0.8rem 0.5rem; border: 1px solid var(--line); border-radius: var(--radius); background: var(--paper-alt);
opacity: 0;
}
.infographic-lstm .lst-problem-icon {
width: 34px; height: 34px; border-radius: 50%; background: var(--red-soft); color: var(--red);
display: flex; align-items: center; justify-content: center; position: relative;
}
.infographic-lstm .lst-problem-icon svg { width: 18px; height: 18px; }
.infographic-lstm .lst-problem-x {
position: absolute; top: -4px; right: -4px; width: 16px; height: 16px; border-radius: 50%;
background: var(--red); color: #fff; display: flex; align-items: center; justify-content: center;
border: 2px solid var(--paper);
}
.infographic-lstm .lst-problem-x svg { width: 10px; height: 10px; }
.infographic-lstm .lst-problem-label { font-size: 0.7rem; font-weight: 700; text-align: center; color: var(--ink); }
/* --- Word timings: 6 words, ~11% each, 0-66% --- */
.infographic-lstm.is-playing .lst-chip[data-w="1"] { animation: lstChip1 12s ease-in-out infinite; }
.infographic-lstm.is-playing .lst-chip[data-w="2"] { animation: lstChip2 12s ease-in-out infinite; }
.infographic-lstm.is-playing .lst-chip[data-w="3"] { animation: lstChip3 12s ease-in-out infinite; }
.infographic-lstm.is-playing .lst-chip[data-w="4"] { animation: lstChip4 12s ease-in-out infinite; }
.infographic-lstm.is-playing .lst-chip[data-w="5"] { animation: lstChip5 12s ease-in-out infinite; }
.infographic-lstm.is-playing .lst-chip[data-w="6"] { animation: lstChip6 12s ease-in-out infinite; }
@keyframes lstChip1 { 0%,2%{opacity:0.5; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} 5%,9%{opacity:1; transform:scale(1.12); background:var(--accent); color:#fff;} 11%,100%{opacity:0.35; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} }
@keyframes lstChip2 { 0%,11%{opacity:0.5; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} 14%,18%{opacity:1; transform:scale(1.12); background:var(--accent); color:#fff;} 20%,100%{opacity:0.35; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} }
@keyframes lstChip3 { 0%,20%{opacity:0.5; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} 23%,27%{opacity:1; transform:scale(1.12); background:var(--accent); color:#fff;} 29%,100%{opacity:0.35; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} }
@keyframes lstChip4 { 0%,29%{opacity:0.5; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} 32%,36%{opacity:1; transform:scale(1.12); background:var(--accent); color:#fff;} 38%,100%{opacity:0.35; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} }
@keyframes lstChip5 { 0%,38%{opacity:0.5; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} 41%,45%{opacity:1; transform:scale(1.12); background:var(--accent); color:#fff;} 47%,100%{opacity:0.35; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} }
@keyframes lstChip6 { 0%,47%{opacity:0.5; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} 50%,54%{opacity:1; transform:scale(1.12); background:var(--accent); color:#fff;} 56%,100%{opacity:0.35; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} }
.infographic-lstm.is-playing .lst-node { animation: lstNode 12s ease-in-out infinite; }
@keyframes lstNode {
0%,3% { box-shadow: 0 3px 10px rgba(37,99,235,0.15); }
5%,54% { box-shadow: 0 0 0 9px var(--accent-soft); }
58%,100% { box-shadow: 0 3px 10px rgba(37,99,235,0.15); }
}
.infographic-lstm.is-playing .lst-out-word[data-w="1"] { animation: lstOut1 12s ease-in-out infinite; }
.infographic-lstm.is-playing .lst-out-word[data-w="2"] { animation: lstOut2 12s ease-in-out infinite; }
.infographic-lstm.is-playing .lst-out-word[data-w="3"] { animation: lstOut3 12s ease-in-out infinite; }
.infographic-lstm.is-playing .lst-out-word[data-w="4"] { animation: lstOut4 12s ease-in-out infinite; }
.infographic-lstm.is-playing .lst-out-word[data-w="5"] { animation: lstOut5 12s ease-in-out infinite; }
.infographic-lstm.is-playing .lst-out-word[data-w="6"] { animation: lstOut6 12s ease-in-out infinite; }
@keyframes lstOut1 { 0%,9%{opacity:0;} 12%,96%{opacity:1;} 99%,100%{opacity:0;} }
@keyframes lstOut2 { 0%,18%{opacity:0;} 21%,96%{opacity:1;} 99%,100%{opacity:0;} }
@keyframes lstOut3 { 0%,27%{opacity:0;} 30%,96%{opacity:1;} 99%,100%{opacity:0;} }
@keyframes lstOut4 { 0%,36%{opacity:0;} 39%,96%{opacity:1;} 99%,100%{opacity:0;} }
@keyframes lstOut5 { 0%,45%{opacity:0;} 48%,96%{opacity:1;} 99%,100%{opacity:0;} }
@keyframes lstOut6 { 0%,54%{opacity:0;} 57%,96%{opacity:1;} 99%,100%{opacity:0;} }
.infographic-lstm.is-playing .lst-problem[data-p="1"] { animation: lstProb1 12s ease-in-out infinite; }
.infographic-lstm.is-playing .lst-problem[data-p="2"] { animation: lstProb2 12s ease-in-out infinite; }
.infographic-lstm.is-playing .lst-problem[data-p="3"] { animation: lstProb3 12s ease-in-out infinite; }
@keyframes lstProb1 { 0%,60%{opacity:0; transform:translateY(6px);} 66%,96%{opacity:1; transform:translateY(0);} 99%,100%{opacity:0;} }
@keyframes lstProb2 { 0%,66%{opacity:0; transform:translateY(6px);} 72%,96%{opacity:1; transform:translateY(0);} 99%,100%{opacity:0;} }
@keyframes lstProb3 { 0%,72%{opacity:0; transform:translateY(6px);} 78%,96%{opacity:1; transform:translateY(0);} 99%,100%{opacity:0;} }
@media (prefers-reduced-motion: reduce) {
.infographic-lstm * { animation: none !important; }
}
</style>
</head>
<body>
<div class="infographic-lstm" id="lstmRoot">
<div class="lst-controls">
<button class="lst-btn" id="lstPlayBtn" aria-label="Play">
<svg id="lstPlayIcon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="6 3 20 12 6 21 6 3"/></svg>
<svg id="lstPauseIcon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="display:none"><rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/></svg>
</button>
<button class="lst-btn" id="lstRestartBtn" aria-label="Restart">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"/><path d="M3 3v5h5"/><path d="M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16"/><path d="M16 16h5v5"/></svg>
</button>
</div>
<div class="lst-queue">
<span class="lst-chip" data-w="1">The</span>
<span class="lst-chip" data-w="2">cat</span>
<span class="lst-chip" data-w="3">sat</span>
<span class="lst-chip" data-w="4">on</span>
<span class="lst-chip" data-w="5">the</span>
<span class="lst-chip" data-w="6">mat</span>
</div>
<div class="lst-stage">
<span class="lst-arrow-down"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 5v14"/><path d="m19 12-7 7-7-7"/></svg></span>
<div class="lst-node">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"/><path d="M3 3v5h5"/><path d="M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16"/><path d="M16 16h5v5"/></svg>
</div>
<span class="lst-node-label">LSTM Cell</span>
</div>
<div class="lst-output">
<span class="lst-out-word" data-w="1">The</span>
<span class="lst-out-word" data-w="2">cat</span>
<span class="lst-out-word" data-w="3">sat</span>
<span class="lst-out-word" data-w="4">on</span>
<span class="lst-out-word" data-w="5">the</span>
<span class="lst-out-word" data-w="6">mat</span>
</div>
<div class="lst-problems">
<div class="lst-problem" data-p="1">
<div class="lst-problem-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M11 5h10"/><path d="M11 12h10"/><path d="M11 19h10"/><path d="M4 4h1v5"/><path d="M4 9h2"/><path d="M6.5 20H3.4c0-1 2.6-1.925 2.6-3.5a1.5 1.5 0 0 0-2.6-1.02"/></svg>
<span class="lst-problem-x"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg></span>
</div>
<span class="lst-problem-label">No Parallel Processing</span>
</div>
<div class="lst-problem" data-p="2">
<div class="lst-problem-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/></svg>
<span class="lst-problem-x"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg></span>
</div>
<span class="lst-problem-label">Slow, Expensive Training</span>
</div>
<div class="lst-problem" data-p="3">
<div class="lst-problem-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 17h6v-6"/><path d="m22 17-8.5-8.5-5 5L2 7"/></svg>
<span class="lst-problem-x"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg></span>
</div>
<span class="lst-problem-label">Hard to Scale</span>
</div>
</div>
</div>
<script>
(function () {
var wrapper = document.getElementById('lstmRoot');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
var playBtn = document.getElementById('lstPlayBtn');
var restartBtn = document.getElementById('lstRestartBtn');
var playIcon = document.getElementById('lstPlayIcon');
var pauseIcon = document.getElementById('lstPauseIcon');
var playing = false;
function setPlaying(state) {
playing = state;
wrapper.classList.toggle('is-playing', playing);
playIcon.style.display = playing ? 'none' : '';
pauseIcon.style.display = playing ? '' : 'none';
}
playBtn.addEventListener('click', function () { setPlaying(!playing); });
restartBtn.addEventListener('click', function () {
wrapper.classList.remove('is-playing');
void wrapper.offsetWidth;
var animated = wrapper.querySelectorAll('.lst-chip, .lst-node, .lst-out-word, .lst-problem');
animated.forEach(function (el) {
el.style.animation = 'none';
void el.offsetWidth;
el.style.animation = '';
});
setPlaying(true);
});
})();
</script>
</body>
</html>π‘ How Transformers Fixed This
Transformers threw out the step-by-step approach entirely. Instead of processing words one after another, they look at everything at once.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Transformers β Parallel Processing</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Newsreader:ital,opsz,wght@0,6..72,600&family=Inter:wght@500;600;700;800&family=JetBrains+Mono:wght@500;600&display=swap" rel="stylesheet">
<style>
html, body { margin: 0; padding: 0; }
.infographic-transformer {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--green: #1f8a3b;
--green-soft: #e2f5e6;
--radius: 10px;
--display-font: 'Newsreader', serif;
--body-font: 'Inter', system-ui, sans-serif;
--mono-font: 'JetBrains Mono', monospace;
box-sizing: border-box;
max-width: 700px;
margin: 0 auto;
padding: 2rem 1.5rem 2.25rem;
font-family: var(--body-font);
color: var(--ink);
background: var(--paper);
}
.infographic-transformer[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #13171F;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--green: #5fcf7c;
--green-soft: #16301e;
}
.infographic-transformer * { box-sizing: border-box; }
.infographic-transformer .tr-title { font-family: var(--display-font); font-weight: 600; font-size: 1.2rem; text-align: center; margin: 0 0 0.35rem; }
.infographic-transformer .tr-subtitle { text-align: center; color: var(--ink-soft); font-size: 0.85rem; margin: 0 0 1.75rem; }
.infographic-transformer .tr-controls { display: flex; justify-content: center; gap: 0.5rem; margin-bottom: 2rem; }
.infographic-transformer .tr-btn {
display: flex; align-items: center; justify-content: center; width: 38px; height: 38px; border-radius: 50%;
border: 1px solid var(--line); background: var(--paper); color: var(--ink); cursor: pointer;
box-shadow: 0 2px 6px rgba(0,0,0,0.06);
}
.infographic-transformer .tr-btn:hover { border-color: var(--accent); color: var(--accent); }
.infographic-transformer .tr-btn svg { width: 16px; height: 16px; }
.infographic-transformer .tr-queue { display: flex; justify-content: center; gap: 0.5rem; margin-bottom: 1.25rem; flex-wrap: wrap; }
.infographic-transformer .tr-chip {
font-family: var(--mono-font); font-size: 0.85rem; font-weight: 600; padding: 0.4rem 0.75rem;
border-radius: 999px; background: var(--paper-alt); color: var(--ink-soft); border: 1px solid var(--line);
opacity: 0.5; transform: scale(1);
}
.infographic-transformer .tr-fan { position: relative; display: flex; justify-content: center; margin-bottom: 0.4rem; }
.infographic-transformer .tr-fan svg { width: 100%; max-width: 300px; height: 40px; }
.infographic-transformer .tr-fan-line { stroke: var(--line); stroke-width: 1.5; }
.infographic-transformer .tr-stage { display: flex; flex-direction: column; align-items: center; gap: 0.4rem; margin-bottom: 1.5rem; }
.infographic-transformer .tr-node {
width: 82px; height: 82px; border-radius: 50%; background: var(--accent-soft); color: var(--accent);
display: flex; align-items: center; justify-content: center; box-shadow: 0 3px 10px rgba(37,99,235,0.15);
}
.infographic-transformer .tr-node svg { width: 36px; height: 36px; }
.infographic-transformer .tr-node-label { font-size: 0.72rem; font-weight: 700; color: var(--ink-soft); margin-top: 0.3rem; }
.infographic-transformer .tr-output {
font-family: var(--mono-font); font-size: 1.05rem; font-weight: 600; min-height: 1.6em;
display: flex; gap: 0.4rem; justify-content: center; flex-wrap: wrap; margin-bottom: 1.75rem;
}
.infographic-transformer .tr-out-word { opacity: 0; color: var(--accent); }
.infographic-transformer .tr-benefits { display: flex; justify-content: center; gap: 0.6rem; flex-wrap: wrap; }
.infographic-transformer .tr-benefit {
display: flex; flex-direction: column; align-items: center; gap: 0.4rem; width: 130px;
padding: 0.8rem 0.5rem; border: 1px solid var(--line); border-radius: var(--radius); background: var(--paper-alt);
opacity: 0;
}
.infographic-transformer .tr-benefit-icon {
width: 34px; height: 34px; border-radius: 50%; background: var(--green-soft); color: var(--green);
display: flex; align-items: center; justify-content: center; position: relative;
}
.infographic-transformer .tr-benefit-icon svg { width: 18px; height: 18px; }
.infographic-transformer .tr-benefit-check {
position: absolute; top: -4px; right: -4px; width: 16px; height: 16px; border-radius: 50%;
background: var(--green); color: #fff; display: flex; align-items: center; justify-content: center;
border: 2px solid var(--paper);
}
.infographic-transformer .tr-benefit-check svg { width: 10px; height: 10px; }
.infographic-transformer .tr-benefit-label { font-size: 0.7rem; font-weight: 700; text-align: center; color: var(--ink); }
/* --- All chips activate almost together (0-16%) --- */
.infographic-transformer.is-playing .tr-chip[data-w="1"] { animation: trChip1 12s ease-in-out infinite; }
.infographic-transformer.is-playing .tr-chip[data-w="2"] { animation: trChip2 12s ease-in-out infinite; }
.infographic-transformer.is-playing .tr-chip[data-w="3"] { animation: trChip3 12s ease-in-out infinite; }
.infographic-transformer.is-playing .tr-chip[data-w="4"] { animation: trChip4 12s ease-in-out infinite; }
.infographic-transformer.is-playing .tr-chip[data-w="5"] { animation: trChip5 12s ease-in-out infinite; }
.infographic-transformer.is-playing .tr-chip[data-w="6"] { animation: trChip6 12s ease-in-out infinite; }
@keyframes trChip1 { 0%,3%{opacity:0.5; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} 6%,16%{opacity:1; transform:scale(1.12); background:var(--accent); color:#fff;} 19%,100%{opacity:0.35; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} }
@keyframes trChip2 { 0%,4%{opacity:0.5; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} 7%,16%{opacity:1; transform:scale(1.12); background:var(--accent); color:#fff;} 19%,100%{opacity:0.35; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} }
@keyframes trChip3 { 0%,3.5%{opacity:0.5; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} 6.5%,16%{opacity:1; transform:scale(1.12); background:var(--accent); color:#fff;} 19%,100%{opacity:0.35; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} }
@keyframes trChip4 { 0%,4.5%{opacity:0.5; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} 7.5%,16%{opacity:1; transform:scale(1.12); background:var(--accent); color:#fff;} 19%,100%{opacity:0.35; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} }
@keyframes trChip5 { 0%,3%{opacity:0.5; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} 6%,16%{opacity:1; transform:scale(1.12); background:var(--accent); color:#fff;} 19%,100%{opacity:0.35; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} }
@keyframes trChip6 { 0%,4%{opacity:0.5; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} 7%,16%{opacity:1; transform:scale(1.12); background:var(--accent); color:#fff;} 19%,100%{opacity:0.35; transform:scale(1); background:var(--paper-alt); color:var(--ink-soft);} }
.infographic-transformer.is-playing .tr-node { animation: trNode 12s ease-in-out infinite; }
@keyframes trNode {
0%,4% { box-shadow: 0 3px 10px rgba(37,99,235,0.15); }
7%,18% { box-shadow: 0 0 0 12px var(--accent-soft); }
22%,100% { box-shadow: 0 3px 10px rgba(37,99,235,0.15); }
}
/* All output words fade in nearly together too */
.infographic-transformer.is-playing .tr-out-word[data-w="1"] { animation: trOut1 12s ease-in-out infinite; }
.infographic-transformer.is-playing .tr-out-word[data-w="2"] { animation: trOut2 12s ease-in-out infinite; }
.infographic-transformer.is-playing .tr-out-word[data-w="3"] { animation: trOut3 12s ease-in-out infinite; }
.infographic-transformer.is-playing .tr-out-word[data-w="4"] { animation: trOut4 12s ease-in-out infinite; }
.infographic-transformer.is-playing .tr-out-word[data-w="5"] { animation: trOut5 12s ease-in-out infinite; }
.infographic-transformer.is-playing .tr-out-word[data-w="6"] { animation: trOut6 12s ease-in-out infinite; }
@keyframes trOut1 { 0%,18%{opacity:0;} 21%,90%{opacity:1;} 96%,100%{opacity:0;} }
@keyframes trOut2 { 0%,19%{opacity:0;} 22%,90%{opacity:1;} 96%,100%{opacity:0;} }
@keyframes trOut3 { 0%,18.5%{opacity:0;} 21.5%,90%{opacity:1;} 96%,100%{opacity:0;} }
@keyframes trOut4 { 0%,19.5%{opacity:0;} 22.5%,90%{opacity:1;} 96%,100%{opacity:0;} }
@keyframes trOut5 { 0%,18%{opacity:0;} 21%,90%{opacity:1;} 96%,100%{opacity:0;} }
@keyframes trOut6 { 0%,19%{opacity:0;} 22%,90%{opacity:1;} 96%,100%{opacity:0;} }
.infographic-transformer.is-playing .tr-benefit[data-b="1"] { animation: trBen1 12s ease-in-out infinite; }
.infographic-transformer.is-playing .tr-benefit[data-b="2"] { animation: trBen2 12s ease-in-out infinite; }
.infographic-transformer.is-playing .tr-benefit[data-b="3"] { animation: trBen3 12s ease-in-out infinite; }
@keyframes trBen1 { 0%,32%{opacity:0; transform:translateY(6px);} 38%,90%{opacity:1; transform:translateY(0);} 96%,100%{opacity:0;} }
@keyframes trBen2 { 0%,38%{opacity:0; transform:translateY(6px);} 44%,90%{opacity:1; transform:translateY(0);} 96%,100%{opacity:0;} }
@keyframes trBen3 { 0%,44%{opacity:0; transform:translateY(6px);} 50%,90%{opacity:1; transform:translateY(0);} 96%,100%{opacity:0;} }
@media (prefers-reduced-motion: reduce) {
.infographic-transformer * { animation: none !important; }
}
</style>
</head>
<body>
<div class="infographic-transformer" id="transformerRoot">
<div class="tr-controls">
<button class="tr-btn" id="trPlayBtn" aria-label="Play">
<svg id="trPlayIcon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="6 3 20 12 6 21 6 3"/></svg>
<svg id="trPauseIcon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="display:none"><rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/></svg>
</button>
<button class="tr-btn" id="trRestartBtn" aria-label="Restart">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"/><path d="M3 3v5h5"/><path d="M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16"/><path d="M16 16h5v5"/></svg>
</button>
</div>
<div class="tr-queue">
<span class="tr-chip" data-w="1">The</span>
<span class="tr-chip" data-w="2">cat</span>
<span class="tr-chip" data-w="3">sat</span>
<span class="tr-chip" data-w="4">on</span>
<span class="tr-chip" data-w="5">the</span>
<span class="tr-chip" data-w="6">mat</span>
</div>
<div class="tr-fan" aria-hidden="true">
<svg viewBox="0 0 300 40" preserveAspectRatio="none">
<line class="tr-fan-line" x1="20" y1="0" x2="150" y2="40" />
<line class="tr-fan-line" x1="76" y1="0" x2="150" y2="40" />
<line class="tr-fan-line" x1="132" y1="0" x2="150" y2="40" />
<line class="tr-fan-line" x1="168" y1="0" x2="150" y2="40" />
<line class="tr-fan-line" x1="224" y1="0" x2="150" y2="40" />
<line class="tr-fan-line" x1="280" y1="0" x2="150" y2="40" />
</svg>
</div>
<div class="tr-stage">
<div class="tr-node">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="18" height="18" x="3" y="3" rx="2"/><path d="M12 3v18"/></svg>
</div>
<span class="tr-node-label">Self-Attention</span>
</div>
<div class="tr-output">
<span class="tr-out-word" data-w="1">The</span>
<span class="tr-out-word" data-w="2">cat</span>
<span class="tr-out-word" data-w="3">sat</span>
<span class="tr-out-word" data-w="4">on</span>
<span class="tr-out-word" data-w="5">the</span>
<span class="tr-out-word" data-w="6">mat</span>
</div>
<div class="tr-benefits">
<div class="tr-benefit" data-b="1">
<div class="tr-benefit-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="18" height="18" x="3" y="3" rx="2"/><path d="M12 3v18"/></svg>
<span class="tr-benefit-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg></span>
</div>
<span class="tr-benefit-label">Parallel Processing</span>
</div>
<div class="tr-benefit" data-b="2">
<div class="tr-benefit-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z"/></svg>
<span class="tr-benefit-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg></span>
</div>
<span class="tr-benefit-label">Much Faster Training</span>
</div>
<div class="tr-benefit" data-b="3">
<div class="tr-benefit-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 7h6v6"/><path d="m22 7-8.5 8.5-5-5L2 17"/></svg>
<span class="tr-benefit-check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg></span>
</div>
<span class="tr-benefit-label">Bigger Models & Data</span>
</div>
</div>
</div>
<script>
(function () {
var wrapper = document.getElementById('transformerRoot');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
var playBtn = document.getElementById('trPlayBtn');
var restartBtn = document.getElementById('trRestartBtn');
var playIcon = document.getElementById('trPlayIcon');
var pauseIcon = document.getElementById('trPauseIcon');
var playing = false;
function setPlaying(state) {
playing = state;
wrapper.classList.toggle('is-playing', playing);
playIcon.style.display = playing ? 'none' : '';
pauseIcon.style.display = playing ? '' : 'none';
}
playBtn.addEventListener('click', function () { setPlaying(!playing); });
restartBtn.addEventListener('click', function () {
wrapper.classList.remove('is-playing');
void wrapper.offsetWidth;
var animated = wrapper.querySelectorAll('.tr-chip, .tr-node, .tr-out-word, .tr-benefit');
animated.forEach(function (el) {
el.style.animation = 'none';
void el.offsetWidth;
el.style.animation = '';
});
setPlaying(true);
});
})();
</script>
</body>
</html>This is exactly what the famous 2017 paper "Attention Is All You Need" argued β you don't need complex recurrent mechanisms. Simple attention + large-scale parallelization is enough to get better results.
π‘ Even though LSTMs were arguably more sophisticated in design, transformers won simply because they were faster, cheaper, and easier to scale.
π When AI Hit the Mainstream
When ChatGPT exploded in popularity, the public reaction was a mix of shock, amazement, and confusion. Terms like transformer, GPT, and LLM suddenly entered everyday conversation.
But not everyone was impressed. Some researchers pushed back with a sharp criticism:
π¦ The "Stochastic Parrots" Argument
The concern was that LLMs aren't actually thinking β they're just very good at predicting which word comes next. Critics worried this would lead to:
Misinformation spreading at scale
AI hallucinating confidently wrong answers
People blindly trusting AI outputs
β¨ The Surprise Nobody Expected β Emergent Intelligence
Everyone assumed bigger AI models would just get better at sounding convincing. What actually happened was far more surprising β they started getting things genuinely right.
Not just text that looks like an answer, but actual correct solutions to maths problems, working code, logical plans, and accurate summaries.
Ask it 25 Γ 12 and instead of text that sounds like an answer, you get 300. The right answer.
This phenomenon is called Emergent Intelligence β as models grow larger and train on more data, they begin displaying capabilities that were never explicitly programmed into them.
π Researchers understand the math and the training process β but why scale alone produces intelligence-like behaviour remains one of AI's biggest unsolved mysteries.
π§© Prompt Engineering β Context Engineering
πΌ The Prompt Engineering Phase
For a while, knowing how to talk to AI effectively was genuinely a high-paying skill. Good prompts included:
β Background context
β Clear instructions
β Desired style and format
β Examples and constraints
π How It Evolved
Over time, everyone naturally picked up prompting β developers, writers, students, businesses. It stopped being a specialist skill and became just... how people use AI.
This matured into something broader called Context Engineering (RAG) β the practice of giving an LLM the best possible information and tools to solve a task.
Think of a travel chatbot. If you feed it live ticket prices, schedules, and policies β it gives you accurate, useful answers. Better inputs β Better outputs. That's context engineering in a nutshell.
π€ The Rise of Copilots
The next big leap was AI Copilots β tools like Microsoft Copilot and GitHub Copilot designed for human-AI collaboration rather than just conversation.
Copilots could:
Generate and review code
Draft and summarise documents
Assist with tasks and workflows
Accelerate everyday work
π€ Agentic AI β The Current Frontier
Today's hottest topic in AI is Agentic AI β and for good reason.
What Makes AI "Agentic"?
A regular LLM responds to your input. An agentic AI takes initiative. It can:
Break a goal into a plan
Choose which tools to use
Execute tasks autonomously
Evaluate results and adjust
Keep going until the job is done
This is often described as LLM + Loop + Tools β the model thinks, acts, checks the result, and repeats:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>The Agent Loop</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Newsreader:ital,opsz,wght@0,6..72,600&family=Inter:wght@600;700;800&display=swap" rel="stylesheet">
<style>
html, body { margin: 0; padding: 0; }
.infographic-agentloop {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--radius: 10px;
--display-font: 'Newsreader', serif;
--body-font: 'Inter', system-ui, sans-serif;
box-sizing: border-box;
max-width: 520px;
margin: 0 auto;
padding: 2rem 1.5rem 2.25rem;
font-family: var(--body-font);
color: var(--ink);
background: var(--paper);
}
.infographic-agentloop[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #13171F;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
}
.infographic-agentloop * { box-sizing: border-box; }
.infographic-agentloop .al-title { font-family: var(--display-font); font-weight: 600; font-size: 1.2rem; text-align: center; margin: 0 0 1.5rem; }
.infographic-agentloop .al-controls { display: flex; justify-content: center; gap: 0.5rem; margin-bottom: 1.5rem; }
.infographic-agentloop .al-btn {
display: flex; align-items: center; justify-content: center; width: 38px; height: 38px; border-radius: 50%;
border: 1px solid var(--line); background: var(--paper); color: var(--ink); cursor: pointer;
box-shadow: 0 2px 6px rgba(0,0,0,0.06);
}
.infographic-agentloop .al-btn:hover { border-color: var(--accent); color: var(--accent); }
.infographic-agentloop .al-btn svg { width: 16px; height: 16px; }
.infographic-agentloop .al-diagram { position: relative; width: 100%; max-width: 420px; margin: 0 auto; }
.infographic-agentloop .al-svg { width: 100%; height: auto; overflow: visible; }
.infographic-agentloop .al-arc { fill: none; stroke: var(--line); stroke-width: 3; stroke-linecap: round; }
.infographic-agentloop .al-arc-fill { fill: none; stroke: var(--accent); stroke-width: 3; stroke-linecap: round; stroke-dasharray: 185; stroke-dashoffset: 185; }
.infographic-agentloop .al-arrowhead { fill: var(--line); }
.infographic-agentloop .al-node-badge {
width: 58px; height: 58px; border-radius: 50%; background: var(--paper-alt); color: var(--ink-soft);
display: flex; align-items: center; justify-content: center; box-shadow: 0 2px 8px rgba(0,0,0,0.08);
transform: scale(1);
}
.infographic-agentloop .al-node-badge svg { width: 26px; height: 26px; }
.infographic-agentloop .al-node-label { font-size: 0.72rem; font-weight: 700; text-align: center; color: var(--ink-soft); margin-top: 0.85rem; line-height: 1.3; }
.infographic-agentloop .al-node { position: absolute; display: flex; flex-direction: column; align-items: center; transform: translate(-50%, -50%); }
.infographic-agentloop .al-repeat-tag {
position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%);
display: flex; align-items: center; gap: 0.3rem; font-size: 0.68rem; font-weight: 700; color: var(--ink-soft);
background: var(--paper); padding: 0.25rem 0.55rem; border-radius: 999px; border: 1px solid var(--line);
}
.infographic-agentloop .al-repeat-tag svg { width: 12px; height: 12px; }
.infographic-agentloop.is-playing .al-node-badge[data-n="1"] { animation: alActive1 10s ease-in-out infinite; }
.infographic-agentloop.is-playing .al-node-badge[data-n="2"] { animation: alActive2 10s ease-in-out infinite; }
.infographic-agentloop.is-playing .al-node-badge[data-n="3"] { animation: alActive3 10s ease-in-out infinite; }
.infographic-agentloop.is-playing .al-node-badge[data-n="4"] { animation: alActive4 10s ease-in-out infinite; }
.infographic-agentloop.is-playing .al-node-badge[data-n="5"] { animation: alActive5 10s ease-in-out infinite; }
@keyframes alActive1 { 0%,2%{transform:scale(1); box-shadow:0 2px 8px rgba(0,0,0,0.08); background:var(--paper-alt); color:var(--ink-soft);} 5%,15%{transform:scale(1.12); box-shadow:0 0 0 9px var(--accent-soft); background:var(--accent); color:#fff;} 92%,100%{transform:scale(1); box-shadow:0 2px 8px rgba(0,0,0,0.08); background:var(--paper-alt); color:var(--ink-soft);} }
@keyframes alActive2 { 0%,19%{transform:scale(1); box-shadow:0 2px 8px rgba(0,0,0,0.08); background:var(--paper-alt); color:var(--ink-soft);} 22%,32%{transform:scale(1.12); box-shadow:0 0 0 9px var(--accent-soft); background:var(--accent); color:#fff;} 39%,100%{transform:scale(1); box-shadow:0 2px 8px rgba(0,0,0,0.08); background:var(--paper-alt); color:var(--ink-soft);} }
@keyframes alActive3 { 0%,39%{transform:scale(1); box-shadow:0 2px 8px rgba(0,0,0,0.08); background:var(--paper-alt); color:var(--ink-soft);} 42%,52%{transform:scale(1.12); box-shadow:0 0 0 9px var(--accent-soft); background:var(--accent); color:#fff;} 59%,100%{transform:scale(1); box-shadow:0 2px 8px rgba(0,0,0,0.08); background:var(--paper-alt); color:var(--ink-soft);} }
@keyframes alActive4 { 0%,59%{transform:scale(1); box-shadow:0 2px 8px rgba(0,0,0,0.08); background:var(--paper-alt); color:var(--ink-soft);} 62%,72%{transform:scale(1.12); box-shadow:0 0 0 9px var(--accent-soft); background:var(--accent); color:#fff;} 79%,100%{transform:scale(1); box-shadow:0 2px 8px rgba(0,0,0,0.08); background:var(--paper-alt); color:var(--ink-soft);} }
@keyframes alActive5 { 0%,79%{transform:scale(1); box-shadow:0 2px 8px rgba(0,0,0,0.08); background:var(--paper-alt); color:var(--ink-soft);} 82%,92%{transform:scale(1.12); box-shadow:0 0 0 9px var(--accent-soft); background:var(--accent); color:#fff;} 99%,100%{transform:scale(1); box-shadow:0 2px 8px rgba(0,0,0,0.08); background:var(--paper-alt); color:var(--ink-soft);} }
.infographic-agentloop.is-playing .al-arc-fill[data-seg="1"] { animation: alArc1 10s ease-in-out infinite; }
.infographic-agentloop.is-playing .al-arc-fill[data-seg="2"] { animation: alArc2 10s ease-in-out infinite; }
.infographic-agentloop.is-playing .al-arc-fill[data-seg="3"] { animation: alArc3 10s ease-in-out infinite; }
.infographic-agentloop.is-playing .al-arc-fill[data-seg="4"] { animation: alArc4 10s ease-in-out infinite; }
.infographic-agentloop.is-playing .al-arc-fill[data-seg="5"] { animation: alArc5 10s ease-in-out infinite; }
@keyframes alArc1 { 0%,10%{stroke-dashoffset:185;} 20%,98%{stroke-dashoffset:0;} 100%{stroke-dashoffset:185;} }
@keyframes alArc2 { 0%,30%{stroke-dashoffset:185;} 40%,98%{stroke-dashoffset:0;} 100%{stroke-dashoffset:185;} }
@keyframes alArc3 { 0%,50%{stroke-dashoffset:185;} 60%,98%{stroke-dashoffset:0;} 100%{stroke-dashoffset:185;} }
@keyframes alArc4 { 0%,70%{stroke-dashoffset:185;} 80%,98%{stroke-dashoffset:0;} 100%{stroke-dashoffset:185;} }
@keyframes alArc5 { 0%,90%{stroke-dashoffset:185;} 97%,98%{stroke-dashoffset:0;} 100%{stroke-dashoffset:185;} }
@media (prefers-reduced-motion: reduce) {
.infographic-agentloop * { animation: none !important; }
}
</style>
</head>
<body>
<div class="infographic-agentloop" id="agentloopRoot">
<h1 class="al-title">The Agent Loop</h1>
<div class="al-controls">
<button class="al-btn" id="alPlayBtn" aria-label="Play">
<svg id="alPlayIcon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="6 3 20 12 6 21 6 3"/></svg>
<svg id="alPauseIcon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="display:none"><rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/></svg>
</button>
<button class="al-btn" id="alRestartBtn" aria-label="Restart">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"/><path d="M3 3v5h5"/><path d="M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16"/><path d="M16 16h5v5"/></svg>
</button>
</div>
<div class="al-diagram">
<svg class="al-svg" viewBox="0 0 400 400" xmlns="http://www.w3.org/2000/svg">
<!-- background arcs -->
<path class="al-arc" d="M 200,60 A 140,140 0 0 1 333.1,156.7" />
<path class="al-arc" d="M 333.1,156.7 A 140,140 0 0 1 282.3,313.3" />
<path class="al-arc" d="M 282.3,313.3 A 140,140 0 0 1 117.7,313.3" />
<path class="al-arc" d="M 117.7,313.3 A 140,140 0 0 1 66.9,156.7" />
<path class="al-arc" d="M 66.9,156.7 A 140,140 0 0 1 200,60" />
<!-- animated draw-in arcs -->
<path class="al-arc-fill" data-seg="1" d="M 200,60 A 140,140 0 0 1 333.1,156.7" />
<path class="al-arc-fill" data-seg="2" d="M 333.1,156.7 A 140,140 0 0 1 282.3,313.3" />
<path class="al-arc-fill" data-seg="3" d="M 282.3,313.3 A 140,140 0 0 1 117.7,313.3" />
<path class="al-arc-fill" data-seg="4" d="M 117.7,313.3 A 140,140 0 0 1 66.9,156.7" />
<path class="al-arc-fill" data-seg="5" d="M 66.9,156.7 A 140,140 0 0 1 200,60" />
<!-- arrowheads at each node showing direction of travel -->
<polygon class="al-arrowhead" points="326,143 340,151 331,166" />
<polygon class="al-arrowhead" points="296,309 285,323 273,308" />
<polygon class="al-arrowhead" points="127,323 111,323 118,308" />
<polygon class="al-arrowhead" points="70,143 59,151 68,166" />
<polygon class="al-arrowhead" points="191,68 200,53 209,68" />
</svg>
<div class="al-node" style="left:50%; top:15%;">
<div class="al-node-badge" data-n="1">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><circle cx="12" cy="12" r="6"/><circle cx="12" cy="12" r="2"/></svg>
</div>
<span class="al-node-label">Task</span>
</div>
<div class="al-node" style="left:83.3%; top:39.2%;">
<div class="al-node-badge" data-n="2">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="6" cy="19" r="3"/><path d="M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15"/><circle cx="18" cy="5" r="3"/></svg>
</div>
<span class="al-node-label">Plan</span>
</div>
<div class="al-node" style="left:70.6%; top:78.3%;">
<div class="al-node-badge" data-n="3">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z"/></svg>
</div>
<span class="al-node-label">Use Tool</span>
</div>
<div class="al-node" style="left:29.4%; top:78.3%;">
<div class="al-node-badge" data-n="4">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m21 21-4.34-4.34"/><circle cx="11" cy="11" r="8"/></svg>
</div>
<span class="al-node-label">Analyse<br/>Result</span>
</div>
<div class="al-node" style="left:16.7%; top:39.2%;">
<div class="al-node-badge" data-n="5">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m15 17 5-5-5-5"/><path d="M4 18v-2a4 4 0 0 1 4-4h12"/></svg>
</div>
<span class="al-node-label">Next<br/>Action</span>
</div>
<div class="al-repeat-tag">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"/><path d="M3 3v5h5"/><path d="M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16"/><path d="M16 16h5v5"/></svg>
Repeat
</div>
</div>
</div>
<script>
(function () {
var wrapper = document.getElementById('agentloopRoot');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
var playBtn = document.getElementById('alPlayBtn');
var restartBtn = document.getElementById('alRestartBtn');
var playIcon = document.getElementById('alPlayIcon');
var pauseIcon = document.getElementById('alPauseIcon');
var playing = false;
function setPlaying(state) {
playing = state;
wrapper.classList.toggle('is-playing', playing);
playIcon.style.display = playing ? 'none' : '';
pauseIcon.style.display = playing ? '' : 'none';
}
playBtn.addEventListener('click', function () { setPlaying(!playing); });
restartBtn.addEventListener('click', function () {
wrapper.classList.remove('is-playing');
void wrapper.offsetWidth;
var animated = wrapper.querySelectorAll('.al-node-badge, .al-arc-fill');
animated.forEach(function (el) {
el.style.animation = 'none';
void el.offsetWidth;
el.style.animation = '';
});
setPlaying(true);
});
})();
</script>
</body>
</html>β‘ The Key Word: Autonomy
The AI doesn't just answer β it decides what happens next. It picks tools, manages workflows, and self-corrects along the way. Real-world examples include coding agents, research assistants, and multi-step workflow orchestrators.
Even so, at its core, every agentic system still works the same fundamental way β input goes in, output comes out. The difference is that those outputs now include actions, plans, and decisions, not just text.
π₯ The Full Evolution at a Glance
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>The Road to Agentic AI</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Newsreader:ital,opsz,wght@0,6..72,600&family=Inter:wght@600;700;800&display=swap" rel="stylesheet">
<style>
html, body { margin: 0; padding: 0; }
.infographic-roadmap {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--line-arrow: #c9c2b3;
--radius: 10px;
--display-font: 'Newsreader', serif;
--body-font: 'Inter', system-ui, sans-serif;
box-sizing: border-box;
max-width: 1080px;
margin: 0 auto;
padding: 2rem 1.5rem 2.5rem;
font-family: var(--body-font);
color: var(--ink);
background: var(--paper);
}
.infographic-roadmap[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #13171F;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--line-arrow: #3a4051;
}
.infographic-roadmap * { box-sizing: border-box; }
.infographic-roadmap .rm-title { font-family: var(--display-font); font-weight: 600; font-size: 1.3rem; text-align: center; margin: 0 0 2rem; }
.infographic-roadmap .rm-flow {
display: flex; flex-direction: row; align-items: flex-start; justify-content: center;
flex-wrap: wrap; row-gap: 2rem; column-gap: 0;
}
.infographic-roadmap .rm-node { display: flex; flex-direction: column; align-items: center; gap: 0.75rem; width: 108px; flex-shrink: 0; }
.infographic-roadmap .rm-badge {
width: 60px; height: 60px; border-radius: 50%; background: var(--accent-soft); color: var(--accent);
display: flex; align-items: center; justify-content: center; box-shadow: 0 2px 8px rgba(37,99,235,0.12);
}
.infographic-roadmap .rm-badge svg { width: 27px; height: 27px; }
.infographic-roadmap .rm-badge.rm-final { background: var(--ink); color: var(--paper); }
.infographic-roadmap[data-theme="dark"] .rm-badge.rm-final { background: var(--accent); color: var(--paper); }
.infographic-roadmap .rm-label { font-weight: 700; font-size: 0.8rem; text-align: center; }
.infographic-roadmap .rm-arrow { flex-shrink: 0; width: 34px; height: 60px; display: flex; align-items: center; justify-content: center; }
.infographic-roadmap .rm-arrow svg { width: 20px; height: 20px; color: var(--line-arrow); }
@media (max-width: 900px) {
.infographic-roadmap .rm-node { width: 82px; }
.infographic-roadmap .rm-badge { width: 48px; height: 48px; }
.infographic-roadmap .rm-badge svg { width: 21px; height: 21px; }
.infographic-roadmap .rm-label { font-size: 0.7rem; }
.infographic-roadmap .rm-arrow { width: 22px; height: 48px; }
.infographic-roadmap .rm-arrow svg { width: 16px; height: 16px; }
}
</style>
</head>
<body>
<div class="infographic-roadmap" id="roadmapRoot">
<h1 class="rm-title">The Road to Agentic AI</h1>
<div class="rm-flow">
<div class="rm-node">
<div class="rm-badge">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"/><path d="M3 3v5h5"/><path d="M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16"/><path d="M16 16h5v5"/></svg>
</div>
<span class="rm-label">RNN</span>
</div>
<div class="rm-arrow"><svg viewBox="0 0 24 24" fill="currentColor"><path d="M4 11h13.17l-4.58-4.59L14 5l7 7-7 7-1.41-1.41L17.17 13H4z"/></svg></div>
<div class="rm-node">
<div class="rm-badge">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 12v-2"/><path d="M12 18v-2"/><path d="M16 12v-2"/><path d="M16 18v-2"/><path d="M2 11h1.5"/><path d="M20 18v-2"/><path d="M20.5 11H22"/><path d="M4 18v-2"/><path d="M8 12v-2"/><path d="M8 18v-2"/><rect x="2" y="6" width="20" height="10" rx="2"/></svg>
</div>
<span class="rm-label">LSTM</span>
</div>
<div class="rm-arrow"><svg viewBox="0 0 24 24" fill="currentColor"><path d="M4 11h13.17l-4.58-4.59L14 5l7 7-7 7-1.41-1.41L17.17 13H4z"/></svg></div>
<div class="rm-node">
<div class="rm-badge">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="18" height="18" x="3" y="3" rx="2"/><path d="M12 3v18"/></svg>
</div>
<span class="rm-label">Transformer</span>
</div>
<div class="rm-arrow"><svg viewBox="0 0 24 24" fill="currentColor"><path d="M4 11h13.17l-4.58-4.59L14 5l7 7-7 7-1.41-1.41L17.17 13H4z"/></svg></div>
<div class="rm-node">
<div class="rm-badge">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z"/><path d="M9 13a4.5 4.5 0 0 0 3-4"/><path d="M6.003 5.125A3 3 0 0 0 6.401 6.5"/><path d="M3.477 10.896a4 4 0 0 1 .585-.396"/><path d="M6 18a4 4 0 0 1-1.967-.516"/><path d="M12 13h4"/><path d="M12 18h6a2 2 0 0 1 2 2v1"/><path d="M12 8h8"/><path d="M16 8V5a2 2 0 0 1 2-2"/><circle cx="16" cy="13" r=".5"/><circle cx="18" cy="3" r=".5"/><circle cx="20" cy="21" r=".5"/><circle cx="20" cy="8" r=".5"/></svg>
</div>
<span class="rm-label">GPT</span>
</div>
<div class="rm-arrow"><svg viewBox="0 0 24 24" fill="currentColor"><path d="M4 11h13.17l-4.58-4.59L14 5l7 7-7 7-1.41-1.41L17.17 13H4z"/></svg></div>
<div class="rm-node">
<div class="rm-badge">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 10a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 14.286V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z"/><path d="M20 9a2 2 0 0 1 2 2v10.286a.71.71 0 0 1-1.212.502l-2.202-2.202A2 2 0 0 0 17.172 19H10a2 2 0 0 1-2-2v-1"/></svg>
</div>
<span class="rm-label">ChatGPT</span>
</div>
<div class="rm-arrow"><svg viewBox="0 0 24 24" fill="currentColor"><path d="M4 11h13.17l-4.58-4.59L14 5l7 7-7 7-1.41-1.41L17.17 13H4z"/></svg></div>
<div class="rm-node">
<div class="rm-badge">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72"/><path d="m14 7 3 3"/><path d="M5 6v4"/><path d="M19 14v4"/><path d="M10 2v2"/><path d="M7 8H3"/><path d="M21 16h-4"/><path d="M11 3H9"/></svg>
</div>
<span class="rm-label">Copilots</span>
</div>
<div class="rm-arrow"><svg viewBox="0 0 24 24" fill="currentColor"><path d="M4 11h13.17l-4.58-4.59L14 5l7 7-7 7-1.41-1.41L17.17 13H4z"/></svg></div>
<div class="rm-node">
<div class="rm-badge">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z"/><path d="M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12"/><path d="M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17"/></svg>
</div>
<span class="rm-label">Context<br/>Engineering</span>
</div>
<div class="rm-arrow"><svg viewBox="0 0 24 24" fill="currentColor"><path d="M4 11h13.17l-4.58-4.59L14 5l7 7-7 7-1.41-1.41L17.17 13H4z"/></svg></div>
<div class="rm-node">
<div class="rm-badge rm-final">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="8" height="8" x="3" y="3" rx="2"/><path d="M7 11v4a2 2 0 0 0 2 2h4"/><rect width="8" height="8" x="13" y="13" rx="2"/></svg>
</div>
<span class="rm-label">Agentic AI</span>
</div>
</div>
</div>
<script>
(function () {
var wrapper = document.getElementById('roadmapRoot');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
})();
</script>
</body>
</html>