<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Articles on Ship of Theseus</title><link>https://www.fanfani.net/articles/</link><description>Recent content in Articles on Ship of Theseus</description><generator>Hugo -- 0.152.2</generator><language>en-us</language><lastBuildDate>Sun, 23 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.fanfani.net/articles/index.xml" rel="self" type="application/rss+xml"/><item><title>Ablation — Learning What a Model Needs by Taking Pieces Away</title><link>https://www.fanfani.net/articles/ablation/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/ablation/</guid><description>&lt;p&gt;There is an old and reliable way to find out what something does: remove it and see what breaks. Surgeons and neuroscientists have done this for centuries — lesion a small region of tissue, watch which ability fades, and infer that the region was responsible for it. The word is ablation, literally a carrying-away, and it has become one of the few tools that gets inside a large language model at all. A modern model is a black box of billions of interacting knobs, and nothing can be read off it directly. So the next best thing gets done instead. A piece is taken away — a layer, an attention head, a training trick, a single direction in the model&amp;rsquo;s internal space — the model runs again, and the damage is measured. The size of the damage is the measure of the part&amp;rsquo;s importance. This piece is about how that removal is defined, how the number is read, and how little a small number proves.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/ablation/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>AdamW — Letting Every Knob Move at Its Own Pace, and Pulling Them All Home</title><link>https://www.fanfani.net/articles/adamw/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/adamw/</guid><description>&lt;p&gt;Training a neural network is a downhill walk. The knobs start at random, the loss says how wrong the current settings are, and backpropagation hands us, for every knob in the tower, a small number saying which way to nudge it. What it never says is how far. Real training does not take that number at face value; it accumulates momentum and keeps a separate step size for every knob, and that machinery has a name, AdamW, which is the optimizer behind very nearly every large model trained in the last several years. This piece is about the two ideas it combines, and about the single-letter correction — the W — that turned a good optimizer into the default one.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/adamw/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Agents — Turning One Answer Into a Sequence of Actions</title><link>https://www.fanfani.net/articles/agents/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/agents/</guid><description>&lt;p&gt;A language model, in its ordinary use, receives an input and produces an output. An agent is what you get when the output is fed back in — when the model acts, observes what happened, and decides what to do next, repeatedly, until it judges the task finished. The change sounds procedural and is not. A single response either succeeds or fails and the user sees which; a loop of thirty steps can fail at step four and spend twenty-six more steps building on the failure, and nobody notices until the end. This piece is about that loop, about the arithmetic of compounding reliability that governs how long it can run, and about the fact that most of the difficulty turns out to be context management rather than reasoning.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/agents/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Arithmetic Intensity — Why Moving Numbers Costs More Than Using Them</title><link>https://www.fanfani.net/articles/arithmetic-intensity/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/arithmetic-intensity/</guid><description>&lt;p&gt;The cost of running a model is almost always quoted in operations. Training budgets are priced in floating-point operations, architectures are compared by operations per token, and halving the operation count of a component sounds unambiguously like progress. A great deal of work built on that premise produced no speedup, and some of it produced a slowdown. The arithmetic units on a current accelerator stopped being the scarce resource some time ago; they spend most of their existence waiting for numbers to arrive from memory, far more slowly than they can be consumed. Once that gap is wide enough the cost of a computation is set by how much data it touches rather than how much work it does with it, and a cost model counting only the work will misidentify what is expensive with near-perfect reliability. This piece is about the ratio that decides which of the two limits binds, why the same model sits on opposite sides of it in training and in generation, and what that fact explains about everything built on top.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/arithmetic-intensity/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Attention — Letting Every Word Ask the Others What It Needs</title><link>https://www.fanfani.net/articles/attention/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/attention/</guid><description>&lt;p&gt;Attention is the mechanism everything else in a transformer is arranged around, and it is almost always invoked as though it were already understood — named, granted, and moved past. It repays being paid for properly. The mechanism is not complicated — it is three linear projections, a dot product, a softmax, and a weighted sum, and you could write it on the back of a napkin. What is remarkable is how much follows from it: that a model can resolve a pronoun forty words back, that it can follow an instruction given at the top of a page, that the whole architecture parallelizes well enough to be worth training on a trillion tokens. This piece is about the mechanism itself, the reasoning that produced it, and the two things it conspicuously cannot do on its own.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/attention/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Batch Size — How Much Evidence to Gather Before Each Step</title><link>https://www.fanfani.net/articles/batch-size/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/batch-size/</guid><description>&lt;p&gt;The gradient the model actually receives is never the gradient of the thing we want to minimize. What we want is the average loss over all text; what we compute is the average loss over a few hundred thousand tokens drawn at random. The second is an estimate of the first, and how many tokens go into it is a choice — the batch size. Larger batches give a cleaner estimate and fewer steps per unit of data; smaller batches give a noisier estimate and more steps. It sounds like a straightforward accuracy-versus-cost trade, and it is not, because the noise turns out to be useful, because the returns from reducing it stop abruptly at a threshold that can be calculated, and because on the hardware these models run on the choice is entangled with how many machines you are using. This piece is about that threshold and what sits on either side of it.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/batch-size/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Chain-of-Thought Faithfulness — Whether the Reasoning Shown Is the Reasoning Done</title><link>https://www.fanfani.net/articles/cot-faithfulness/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/cot-faithfulness/</guid><description>&lt;p&gt;A reasoning model shows its working, and the working is the most reassuring thing about it. Ask something hard and there it is on the page: an approach considered, a difficulty noticed, a first attempt discarded, a conclusion reached. It reads like an account of how the answer was arrived at, and it is hard not to read it that way: the format is borrowed wholesale from how people explain themselves, and nobody has practice at reading fluent prose as anything other than a report. Then someone runs the obvious experiment. Slip a hint into the prompt, watch the answer move to match it, and read the accompanying reasoning: a clean, sensible argument that never mentions the hint. Nothing malfunctioned. The model did what it was trained to do. This piece is about the difference between reasoning that does work and reasoning that describes work, why the second was never trained for, and what that leaves of the case for reading traces at all.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/cot-faithfulness/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Context Engineering — Deciding What the Model Gets to See</title><link>https://www.fanfani.net/articles/context-engineering/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/context-engineering/</guid><description>&lt;p&gt;A team builds an agent that works beautifully for six steps and then begins repeating itself, and the diagnosis they reach for is that the model is not clever enough. They try a larger one. The repetition continues, because the problem was never the reasoning: by step twelve the original instruction sits forty thousand tokens back, sharing a window with three stale directory listings and the full text of a file the agent read once for a reason it can no longer recover. The name that has settled on the business of managing this is context engineering, which sounds like prompt writing with a grander vocabulary and is not quite that. What distinguishes it is that the decisions have measurable costs and trade against one another, which is what makes something an engineering problem rather than a set of habits. This piece is about the budget every component competes for, the ordering that the cache and the attention pattern argue about separately, and the losses that compaction and tool output quietly impose.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/context-engineering/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Continuous Batching and Paged Attention — Keeping the Machine Fed</title><link>https://www.fanfani.net/articles/continuous-batching/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/continuous-batching/</guid><description>&lt;p&gt;Accounts of what makes a language model fast tend to stop at the model. Cheaper attention kernels, fewer bits per weight, a small model guessing ahead — all of it aimed at making one forward pass cost less. Then they note, almost in passing, that serving is affordable because requests are batched, as though a batch were something you assemble and hand over. It is not. Requests arrive at times nobody chose and stop after wildly different numbers of tokens; one wants a yes or a no, the next a thousand-word summary. Nearly every difficulty in production serving descends from that variance, and the two mechanisms that deal with it are a scheduler and a memory allocator rather than anything inside the network. This piece is about how a batch is kept full when its members keep leaving, and about the allocator that decides how many members it may have.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/continuous-batching/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Cross-Entropy — Measuring Wrongness in Bits</title><link>https://www.fanfani.net/articles/cross-entropy/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/cross-entropy/</guid><description>&lt;p&gt;Every number in a model is where it is because of one quantity. The loss is what training minimizes, what scaling laws predict, what a training run is monitored by, and what all the machinery of optimization exists to descend. For a language model that quantity is cross-entropy, and it is usually introduced as a formula to be accepted rather than a thing to be understood. That is a shame, because it has an exact and rather beautiful interpretation — it is the number of bits you would waste encoding real text using the model&amp;rsquo;s beliefs about text — and once that reading is in hand, several otherwise mysterious facts about training curves and model evaluation become obvious. This piece is about what the loss measures, why it and not something simpler, and what its familiar cousin perplexity adds.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/cross-entropy/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Data Mixtures — Deciding What a Model Reads, and When</title><link>https://www.fanfani.net/articles/data-mixtures/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/data-mixtures/</guid><description>&lt;p&gt;Almost all the attention paid to language models concerns the machine: how it is shaped, how it is optimized, how it is served. What goes into it is the part with the least published detail and quite possibly the largest effect. Two organizations can train the same architecture at the same scale with the same optimizer and produce models of visibly different quality, and the difference is the corpus. The decisions involved are not glamorous — what fraction should be code, how many times may a document be repeated, what to do with the internet&amp;rsquo;s vast supply of near-duplicate junk, what to feed the model in its final week — and they are made with far less theory than any other part of the pipeline. This piece is about what those decisions are and the surprisingly small amount that is actually known about them.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/data-mixtures/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Decoding — Choosing a Word the Model Only Suggested</title><link>https://www.fanfani.net/articles/decoding/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/decoding/</guid><description>&lt;p&gt;A model never produces a word. What comes out of the tower is a set of scores, one per vocabulary entry, and after the softmax a set of odds — a forecast, not a decision. Something outside the model has to read that forecast, commit to a single token, and then do it again, and again, until the text is finished. That something is the decoding strategy, and it is governed by a handful of dials that appear in almost every interface and API you will meet. This piece is about what each of them does, why several of them exist to solve the same problem in different ways, and why not one of them makes a model smarter.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/decoding/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Diffusion Language Models — Writing a Sentence All at Once</title><link>https://www.fanfani.net/articles/diffusion-lms/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/diffusion-lms/</guid><description>&lt;p&gt;Nearly every language model in use writes the same way: one token, then the next, each conditioned on everything before it and on nothing after. That constraint is so fundamental it is easy to mistake for a fact about language rather than a choice about architecture. It is a choice, and it has costs — a model cannot revise a word it has already committed to, cannot plan the end of a sentence before writing its beginning, and must spend one full forward pass per token no matter how obvious the token is. Image generation abandoned sequential production years ago in favour of starting with noise and refining the whole canvas repeatedly. This piece is about what happens when the same idea is applied to text: why the translation is harder than it looks, what the working version actually does, and why the results are interesting without yet being decisive.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/diffusion-lms/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Distillation — Teaching a Small Model to Think Like a Big One</title><link>https://www.fanfani.net/articles/distillation/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/distillation/</guid><description>&lt;p&gt;The machinery that makes a large model good is well enough known: attention letting every word survey every other, a tall tower of blocks, and a long, expensive training run that settles billions of knobs into a capable configuration. Capability comes at a price. The best models are enormous, and every answer burns memory and time in proportion to their size — tolerable in a demonstration, punitive across billions of requests. So the wish is obvious: keep most of what a giant model knows while paying for a small one. Distillation is the technique that grants it, by transferring the large model&amp;rsquo;s judgement into a smaller one. This piece is about how the transfer works, why it works better than the size difference suggests, and what the student inherits along with the skill.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/distillation/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>DPO — Reading the Reward Off the Model Itself</title><link>https://www.fanfani.net/articles/dpo/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/dpo/</guid><description>&lt;p&gt;There is a boundary running through post-training. Where an answer can be checked by a program, verifiable rewards give a training signal that cannot be flattered, and we can push on it as hard as we like. But most of what we ask a model to do has no checker. There is no program that decides whether an explanation was pitched correctly, whether a refusal was gracious, whether a summary kept the right things. For that territory — which is most of the territory — we are back to human preference, and the standard way of learning from it is a three-stage apparatus with a reinforcement learning loop at the end. Direct preference optimization is the discovery that the whole apparatus collapses into a single loss you can train the way you train anything else. This piece is about how something that looks like reinforcement learning turns out, on inspection, to be classification.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/dpo/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Embeddings — The Two Maps a Model Keeps of Its Vocabulary</title><link>https://www.fanfani.net/articles/embeddings/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/embeddings/</guid><description>&lt;p&gt;A model does not see words. Long before the first block of the tower does anything, each token has been replaced by a list of a few thousand numbers pulled from a table with one row per entry in the vocabulary. That table is the embedding, and it is the model&amp;rsquo;s only point of contact with language as we write it. What is easy to miss is that nobody wrote the table — it begins as noise and is learned by exactly the same downhill walk that trains everything else, with one peculiarity in how the gradient reaches it. What is easier still to miss is that most models keep two such tables rather than one. This piece is about how a word finds its place, and about why reading a word and reaching for a word turn out to be different skills.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/embeddings/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Emergent Abilities — When a Curve Looks Like a Cliff</title><link>https://www.fanfani.net/articles/emergent-abilities/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/emergent-abilities/</guid><description>&lt;p&gt;For a few years the standard illustration of what scale buys you was a plot in which a line lies flat along the bottom of the chart for three or four orders of magnitude and then, past some particular model size, turns upward and climbs almost vertically. The claim attached to it was that the ability being measured is simply absent below that point and present above it — that something switched on. The plot did an enormous amount of work. It appeared in talks about safety, in arguments about regulation, and in forecasts of what the next training run would do. It is also, for a large fraction of the abilities it was drawn for, a property of how the vertical axis was defined rather than of the models along the horizontal one. That does not settle the matter, because a residue survives the objection and the residue is the interesting part. This piece is about what the original claim asserted, the deflationary account that dismantles most of it, and what is left standing.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/emergent-abilities/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Evaluation — Measuring Something That Refuses to Hold Still</title><link>https://www.fanfani.net/articles/evaluation/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/evaluation/</guid><description>&lt;p&gt;Almost everything else in the machinery of a language model can be verified. A gradient is correct or it is not; a cache holds the right keys or it does not; a quantized model produces outputs close to the original or it does not. Evaluation is the one activity where the ground keeps moving. We build models to be generally capable, then measure them with tests that are necessarily specific; the tests leak into the training data; the numbers rise while the thing being measured may not have improved; and the community moves to a new test and repeats the cycle. None of this is fraud, and most of it is not even carelessness — it is the predictable consequence of optimizing against a measurement. This piece is about why evaluation is genuinely hard, which failures are structural, and what can actually be trusted.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/evaluation/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Feed-Forward Layers — Where a Model Keeps What It Knows</title><link>https://www.fanfani.net/articles/feed-forward-layers/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/feed-forward-layers/</guid><description>&lt;p&gt;Every block in a transformer has two halves. Attention gets nearly all the discussion, and the other half — two matrix multiplications with a nonlinearity between them, applied to each token independently — gets described as &amp;ldquo;the feed-forward part&amp;rdquo; and passed over. This is an odd allocation of attention, given that the feed-forward layers hold roughly two thirds of the model&amp;rsquo;s parameters, and given that when researchers go looking for where a model stores the fact that Paris is in France, this is where they find it. Attention moves information between positions. The feed-forward layers are where information is looked up, transformed, and decided upon. This piece is about the half of the architecture that does the knowing.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/feed-forward-layers/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>FlashAttention — Never Writing Down the Matrix You Do Not Need</title><link>https://www.fanfani.net/articles/flashattention/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/flashattention/</guid><description>&lt;p&gt;Most improvements to attention have been approximations: restrict which positions may see which, or replace the mechanism with something cheaper that behaves roughly the same. This one is not. It computes the identical result to ordinary attention , to the last bit, and it is several times faster and uses a fraction of the memory. That combination should be suspicious — you do not usually get exactness and speed together — and the resolution is that the original implementation was not slow because of the arithmetic it performed. It was slow because of the data it moved. This piece is about the difference between those two things, and about the reordering of the computation that makes the largest intermediate result never need to exist.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/flashattention/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Gradient Checkpointing — Trading Recomputation for Room</title><link>https://www.fanfani.net/articles/gradient-checkpointing/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/gradient-checkpointing/</guid><description>&lt;p&gt;The memory accounting in the article on AdamW left something out. Weights, gradients, and optimizer state came to roughly sixteen bytes per parameter, which is a large number and a fixed one — it does not change with how much text you push through the model. Activations are the other half of the story, and they behave completely differently: they scale with the batch size and the sequence length, and for a large model on a long context they can dwarf everything else. The remedy is one of the more satisfying trades in the whole subject, because it exchanges a resource that is hard and expensive to obtain for one that is merely tedious. This piece is about why the backward pass needs so much stored material, and how throwing most of it away and computing it a second time turns out to be cheaper than keeping it.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/gradient-checkpointing/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Gradient Descent and Backpropagation — How a Model Learns Which Way to Move</title><link>https://www.fanfani.net/articles/gradient-descent/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/gradient-descent/</guid><description>&lt;p&gt;Training a neural network is routinely described as finding the settings that minimize a loss, which makes it sound like a search — as though a map existed and the procedure consisted of reading it. There is no map. A model in training has access to exactly one thing: the value of the loss at the point it currently occupies, together with the local slope of that loss in every direction at once. It cannot see the next valley, or tell whether the ground ahead rises or falls. From that poverty of information the entire apparatus of training follows — the tiny steps, the schedules, the momentum, the cautious business of nudging a billion numbers a fraction of a percent at a time. What makes any of it affordable is a piece of arithmetic bookkeeping so efficient it is easy to mistake for a triviality. This piece is about the constraint that only local slope is available, the reverse sweep that recovers that slope for every weight at once, and what the resulting number withholds.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/gradient-descent/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Grouped-Query Attention — Paying for Fewer Copies of the Same Notes</title><link>https://www.fanfani.net/articles/grouped-query-attention/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/grouped-query-attention/</guid><description>&lt;p&gt;The usual account of attention&amp;rsquo;s cost is that it grows with the square of the sequence length, and the well-known responses are aimed at that square. A machine serving a large model to a few hundred people at once is not usually failing on arithmetic. It is failing on space. Somewhere in its memory sits one key vector and one value vector for every token, of every head, in every layer, for every conversation in flight, and that structure — not the parameter count, not the score grid — decides how many people the machine can hold and therefore what a token costs to sell. The remedy has to be storing less per token. The technique that delivered it rests on an observation close to an insult: most of what is stored is redundant. This piece is about which part of an attention head carries its specialization, what it costs to make heads share the rest, and why the saving turns out to be so nearly free.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/grouped-query-attention/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Hallucination — Why a Model Cannot Tell You What It Does Not Know</title><link>https://www.fanfani.net/articles/hallucination/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/hallucination/</guid><description>&lt;p&gt;Ask a model for the page number of a quotation it has never seen and it will give you one. Not a hedge, not a refusal, not a note that the request is beyond it — a page number, formatted correctly, inside a sentence of ordinary competent prose. The common reading is that the model is guessing badly, or was trained carelessly, or is in some loose sense pretending. None of those is quite right. The behaviour is what the training procedure asks for, at every position, and a model that did otherwise would have scored worse for it. That turns hallucination from a mysterious defect into a consequence of what the objective measures and what the available text contains. This piece is about why abstention is never the rewarded action, what the model&amp;rsquo;s own probabilities do and do not tell you about its uncertainty, and which of the available interventions actually change the situation.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/hallucination/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Induction Heads — The First Circuit Anyone Fully Understood</title><link>https://www.fanfani.net/articles/induction-heads/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/induction-heads/</guid><description>&lt;p&gt;Most claims about what happens inside a language model are inferences from behaviour: the model does this, so something in it must be doing that. One case is different. There is a mechanism whose components have been located, whose wiring has been traced, whose function has been stated precisely, and which can be switched off to confirm that the behaviour it explains disappears with it. It is not complicated — two attention heads in sequence, performing a copy — and it accounts for a surprising share of what makes these models useful, including the ability to follow a pattern demonstrated in a prompt. It also arrives during training in a way that is visible from outside, in a small kink in the loss curve that turns out to mark the moment a capability comes into being. This piece is about that mechanism and what its existence suggests.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/induction-heads/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Inference Quantization — Shrinking a Finished Model to Fit</title><link>https://www.fanfani.net/articles/inference-quantization/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/inference-quantization/</guid><description>&lt;p&gt;QLoRA compressed a frozen model so that adapters could be trained beside it, and mixed precision worked out how few bits a model can be trained in. The third case is the one most people actually encounter: taking a model that is finished and will never be trained again, and making it smaller so that it fits on hardware someone owns. The situation is more forgiving than training, since there are no gradients to preserve and no accumulation to worry about — but it is also less forgiving in one specific way, because there is no opportunity to adapt. Whatever damage the compression does is permanent, and the model must live with it on every request. This piece is about how much can be taken away, why the activations turn out to be harder than the weights, and what the resulting formats actually buy.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/inference-quantization/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Initialization and muP — Starting So That the Dials Transfer</title><link>https://www.fanfani.net/articles/initialization/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/initialization/</guid><description>&lt;p&gt;Before the first gradient arrives, every weight in the model has to be set to something, and the something is drawn at random. This sounds like a detail to be got out of the way, and for a long time it was treated as one. It is not. The scale of those random draws determines whether a signal survives its journey up an eighty-block tower or dies on the way; it determines whether the gradient makes it back down; and — the part that turns a numerical nicety into an economic question — it determines whether a learning rate that worked on a small model still works on a large one. That last property has a name and a construction, and it is the reason nobody tunes hyperparameters on a frontier model directly. This piece is about how the starting point is chosen and why choosing it correctly lets you do your experiments somewhere cheap.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/initialization/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>KL Divergence — The Distance Between Two Sets of Odds</title><link>https://www.fanfani.net/articles/kl-divergence/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/kl-divergence/</guid><description>&lt;p&gt;One quantity keeps turning up across the training of language models, wearing a different job each time. It is the imitation metric in distillation , the leash in DPO and in reinforcement learning from human feedback, one of the damage measures in ablation , and the term that training actually minimizes once cross-entropy is decomposed. Four unrelated-looking uses, one formula. It is worth understanding on its own terms rather than meeting it four times as a piece of notation, particularly because it has a property that surprises everyone the first time — it is not symmetric, and which way round you write it changes what you are asking for. This piece is about what the quantity measures, why the asymmetry is a feature rather than a defect, and how to tell which direction you want.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/kl-divergence/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>KV Caching — Reading Each Word Once, and Carrying It Forever</title><link>https://www.fanfani.net/articles/kv-cache/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/kv-cache/</guid><description>&lt;p&gt;The generation loop takes one line to state: the model reads everything so far, produces a distribution over the vocabulary, one token is chosen and appended, and the whole thing runs again. Described that way it sounds tidy, and it hides something absurd. Taken literally, producing the thousandth word of an answer would mean pushing all nine hundred and ninety-nine earlier words back up through every block of the tower, from scratch, to compute representations the model had already computed nine hundred and ninety-nine times before. No system does this, and the thing that saves it is the KV cache — a running set of notes that turns a re-reading problem into a memory problem. This piece is about what is in those notes, why they consist of keys and values and nothing else, and why the memory problem they create now governs almost everything about what it costs to run a model.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/kv-cache/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Learning From AI Feedback — Replacing the Annotator With the Model</title><link>https://www.fanfani.net/articles/ai-feedback/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/ai-feedback/</guid><description>&lt;p&gt;The limit on human preference data is usually presented as a matter of money: annotation is expensive, budgets are finite, so the field went shopping for something cheaper. That framing gets the constraint wrong. What limits preference data is not its price but the fact that somebody has to read two long responses attentively enough to have a defensible opinion about which is better, and attention of that kind does not scale and cannot be bought in bulk. A second limit sits behind it: an annotator cannot demonstrate a good answer to a question they cannot answer, so on difficult material the ceiling is competence rather than diligence. The field&amp;rsquo;s answer was to hand the comparison to a model. This piece is about what that substitution leaves untouched, what it makes newly legible, and the moment its errors stop cancelling.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/ai-feedback/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Learning-Rate Schedules — Deciding When to Slow Down</title><link>https://www.fanfani.net/articles/learning-rate-schedules/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/learning-rate-schedules/</guid><description>&lt;p&gt;The learning rate is usually introduced as a number: one small constant, multiplied into every gradient and then left alone. Almost no large model has ever been trained that way. In practice it is a function of the step count — near zero for the opening few thousand steps, rising to a peak, then falling for the rest of the run — and the shape of that function is treated as somewhere between a solved problem and a superstition. It is neither. The opening ramp exists for a specific and slightly embarrassing reason to do with the optimizer&amp;rsquo;s own bookkeeping, and the conventional curve imposes a constraint so awkward that an entire alternative arrangement was invented to escape it. This piece is about why the rate has to move at all, what the two halves of the schedule are separately doing, and what the standard shape quietly costs.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/learning-rate-schedules/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Linear Attention — Trading Exactness for a Cost That Does Not Explode</title><link>https://www.fanfani.net/articles/linear-attention/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/linear-attention/</guid><description>&lt;p&gt;The quadratic cost of attention has attracted more attempts at circumvention than any other single fact in this field, and most of them have failed. The idea is a piece of algebra rather than an approximation heuristic: attention involves multiplying three matrices, matrix multiplication is associative, and doing the multiplications in the other order turns a quadratic cost into a linear one. That much is exactly true and costs nothing. What costs something is the softmax sitting in the middle, which blocks the reassociation and must be removed or replaced — and the entire history of this line of work is the history of discovering what the softmax was doing that nobody had noticed. This piece is about the family that has come closest, about what the softmax turned out to be doing, and about why &amp;ldquo;closest&amp;rdquo; has been such a moving target.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/linear-attention/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Logits — The Scores Beneath the Odds</title><link>https://www.fanfani.net/articles/logits/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/logits/</guid><description>&lt;p&gt;The shape of a forward pass is easy enough to state. A token comes in, the tower of blocks works on it, and out the far end comes a single arrow — a few thousand numbers holding everything the model has assembled about what should happen next. But a vector is not a word, and somewhere between that arrow and the token that finally appears on your screen there is a step that is easy to wave past. That step produces one number for every entry in the vocabulary, and those numbers are the logits. They are the last thing the model computes for itself, before any of it is turned into something a person would recognize as a prediction. This piece is about where they come from, what their name means, and the one property of them that trips up almost everyone who meets them.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/logits/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Long Context — When the Window Outgrows the Attention</title><link>https://www.fanfani.net/articles/long-context/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/long-context/</guid><description>&lt;p&gt;A model advertised as handling a million tokens is making two claims, and only one of them is usually true. The first is that it will accept an input that long without failing — a claim about position encodings, memory, and serving infrastructure, and one that is now routinely satisfied. The second is that it will use that input, attending to the relevant part of it as reliably at position nine hundred thousand as at position nine hundred. That claim is much weaker than the marketing implies, and the gap between the two is where most disappointment with long-context models lives. This piece is about what it takes to extend a window, what breaks when you do, and how to tell the difference between a model that can hold a document and one that can read it.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/long-context/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>LoRA — Teaching an Old Model New Tricks Without Retraining It</title><link>https://www.fanfani.net/articles/lora/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/lora/</guid><description>&lt;p&gt;A pretrained model arrives as billions of knobs, nudged downhill across a vast landscape until they settle into a capable configuration. It is rarely the configuration anyone wants. A model may need to answer in a house style, to reason about legal contracts, to write to a particular register, or to cover a speciality the general model knows only vaguely. The obvious fix is to keep training it on more specific data — a step called fine-tuning — and fine-tuning works. The trouble is that fine-tuning a giant model the ordinary way means adjusting all of its billions of knobs, which demands the same crushing hardware, memory and expense as the original training run, and produces a second full copy of an enormous model for every task. LoRA — short for Low-Rank Adaptation — sidesteps both costs by training a small set of new knobs and leaving the original untouched. This piece is about how that small set can be enough, what it saves, and what it cannot change.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/lora/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Loss Spikes — When a Training Run Falls Over</title><link>https://www.fanfani.net/articles/loss-spikes/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/loss-spikes/</guid><description>&lt;p&gt;The loss curves that appear in technical reports are smooth. They descend, they flatten, and they suggest that training a large language model is a matter of starting the machinery and waiting. The curves kept by the people running those jobs look different. Somewhere around step forty thousand, with nothing changed in the configuration, the loss jumps — not drifts, jumps — by a whole nat or two inside a handful of steps, and then does one of three things: claws its way back over a few thousand steps, settles permanently above the trajectory it left, or keeps rising until the model emits one token forever. This is a loss spike, and it is why a frontier run is watched on a rota rather than left alone over a weekend. This piece is about what happens when a run falls over, why the proposed causes are still argued about, and what the available defences cost.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/loss-spikes/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Memorization — What a Model Keeps Verbatim, and When That Matters</title><link>https://www.fanfani.net/articles/memorization/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/memorization/</guid><description>&lt;p&gt;Memorization arrived in machine learning with a settled meaning and a verdict attached: a model that had fitted its training set too closely, which was bad and, better still, detectable — watch the held-out loss, and when it turns upward while the training loss keeps falling, stop. That diagnostic is still taught, still correct on its own terms, and almost beside the point for a model trained once over a corpus it will never exhaust. The held-out loss does not turn upward. Nothing on the dashboard looks wrong. The model has nonetheless retained enough of its training data to reproduce parts of it word for word, including passages that appeared a handful of times and strings nobody wanted kept. The old alarm stays quiet because it was wired for a different fault. This piece is about why the training objective asks for verbatim retention rather than merely permitting it, what determines which sequences receive it, and what the available remedies do and do not remove.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/memorization/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Mixed Precision — Training in Half the Bits Without Losing the Thread</title><link>https://www.fanfani.net/articles/mixed-precision/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/mixed-precision/</guid><description>&lt;p&gt;The article on QLoRA introduced the idea of describing a number in fewer bits, and applied it to a frozen model being adapted. Training a model from scratch in reduced precision is a harder problem, because a frozen weight only has to be read accurately while a weight under training has to accumulate millions of tiny corrections without any of them being lost to rounding. The tension is sharp: half-precision arithmetic runs several times faster and halves the memory traffic, which is the difference between a training run costing one month and three, but the updates the optimizer wants to apply are frequently smaller than the smallest change a half-precision number can represent. This piece is about how that tension is resolved, why the resolution hinges on a detail of how floating-point numbers are laid out, and what changed when the format itself was redesigned for the purpose.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/mixed-precision/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Mixture of Experts — A Model That Only Switches On What It Needs</title><link>https://www.fanfani.net/articles/mixture-of-experts/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/mixture-of-experts/</guid><description>&lt;p&gt;Almost every language model shares a quiet assumption: to process a single word, it uses all of itself. Every one of its billions of knobs fires for every word, whether that word is a comma or a rare medical term. This feels so natural it barely registers as a choice — but it carries a heavy price. The only way to make such a model know more is to make it bigger, and a bigger model is proportionally slower and costlier, because all of it runs, all the time, for everything. Mixture of Experts — usually shortened to MoE — is the family of models that breaks this bargain. Its idea is to build something vast in what it knows while only switching on a small slice of itself for any given word. This piece is about how that trick works, the surprisingly awkward problems it creates, and the tidy division of labour it does not deliver.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/mixture-of-experts/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Multimodality — Teaching a Language Model to See</title><link>https://www.fanfani.net/articles/multimodality/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/multimodality/</guid><description>&lt;p&gt;A transformer does not care what its inputs mean. It consumes a sequence of vectors and produces a sequence of vectors, and nothing in attention or the feed-forward layers makes any reference to language. The embedding table is the only component that assumes its inputs are tokens, and it is a lookup rather than a computation. Which means the path to a model that sees is narrower than it looks: if you can turn an image into a sequence of vectors that live in the same space as token embeddings, the rest of the machinery will process it without modification. The interesting question is not whether this works — it plainly does — but what it costs, what gets lost, and why a model that can describe a photograph in detail will confidently misread a clock face. This piece is about the join between a vision system and a language model, and what remains awkward about it.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/multimodality/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Normalization — Keeping the Signal Steady Enough to Stack</title><link>https://www.fanfani.net/articles/normalization/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/normalization/</guid><description>&lt;p&gt;Every block in a transformer is preceded by a small operation that rescales its input, and it is the least glamorous thing in the architecture. It computes no features, stores no knowledge, and would be omitted from any diagram drawn on a napkin. It is also the difference between a model that trains and one that does not. The residual stream grows as it rises, because every block adds and nothing subtracts; a block trained to read a signal of one typical size will misbehave when handed one ten times larger; and the gradient inherits every one of those distortions on the way back down. This piece is about the operation that keeps the numbers in range, the variant that discarded half of it and lost nothing, and the placement decision that mattered more than either.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/normalization/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Parallelism — Splitting a Model Five Different Ways</title><link>https://www.fanfani.net/articles/parallelism/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/parallelism/</guid><description>&lt;p&gt;A frontier model does not fit on one machine, and the arithmetic makes the point without ceremony: the article on AdamW &amp;rsquo;s sixteen bytes per parameter puts a four-hundred-billion-parameter model at six and a half terabytes of training state, against perhaps eighty gigabytes on a single accelerator. Something has to be divided. What makes this more than a logistics problem is that there are five fundamentally different things you can divide — the data, the width of each matrix, the depth of the tower, the sequence itself, and, where the model has them, the experts — and each division has a completely different communication bill attached. Getting the combination right is worth a factor of several in training time, and getting it wrong produces a cluster of expensive machines mostly waiting for each other. This piece is about the five axes and how they are stacked.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/parallelism/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Positional Encoding — Putting Order Back Into a Mechanism That Ignores It</title><link>https://www.fanfani.net/articles/positional-encoding/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/positional-encoding/</guid><description>&lt;p&gt;Position is the detail most accounts of a transformer dispose of in half a sentence, somewhere near the embedding lookup, on the way to the interesting part. That treatment has it backwards. The mechanism at the centre of the architecture is not inattentive to word order but provably indifferent to it, making the dog bit the man and the man bit the dog one object as far as the arithmetic goes, and the fixes for that indifference are design decisions with measurable consequences — in how far a model can read, in how fast it runs, in what it quietly finds hard. A good deal of the difficulty with long inputs is a positional problem in other clothes. This piece is about why order has to be supplied from outside, what each scheme for supplying it has cost, and what none of them delivers.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/positional-encoding/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>PPO — Learning From a Judge Without Believing It Too Much</title><link>https://www.fanfani.net/articles/ppo/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/ppo/</guid><description>&lt;p&gt;Two of the better-known methods in post-training define themselves against this one: DPO exists to avoid it, and RLVR is it with the reward model replaced by a checker. The thing itself is worth describing directly. Proximal policy optimization arrived from robotics, where the problem was teaching a simulated body to walk without the training process destroying itself, and it turned out to transfer to language with remarkably little modification. The core difficulty it solves is the same in both settings and is worth stating before any of the machinery: in reinforcement learning, unlike in supervised learning, the model generates its own training data, so a bad update does not merely produce one bad step — it changes what the model will see next, and a policy that has degraded will collect worse experience, from which it will degrade further. Supervised learning is forgiving because the dataset does not move. This piece is about how to take the largest step you safely can when it does.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/ppo/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Pretraining Objectives — Why Predicting the Next Word Was Enough</title><link>https://www.fanfani.net/articles/pretraining-objectives/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/pretraining-objectives/</guid><description>&lt;p&gt;Ask why language models are trained to predict the next word and the answers tend toward the grand: that language is produced sequentially, that prediction is compression and compression is understanding, that anticipating what comes next is what a mind does. None of that is exactly wrong, and none of it is the reason. The objective won a competition against several serious rivals, on grounds that were largely accounting — how much learning can be squeezed out of each token of text, and out of each unit of compute. For a couple of years around 2018 the favourite was something else entirely. Why the sums came out as they did explains a good deal that otherwise looks arbitrary: why encoder models still beat decoders at certain jobs, why a model is never trained in the situation it is deployed in, and why a handful of losing objectives survive in particular corners. This piece is about the constraint that forced the choice, the arithmetic that settled it, and what the field gave up in exchange.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/pretraining-objectives/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>QLoRA — Fine-Tuning a Giant on a Single Graphics Card</title><link>https://www.fanfani.net/articles/qlora/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/qlora/</guid><description>&lt;p&gt;LoRA removed most of the price of adapting a giant model: only a small pair of narrow grids trains, and the original stays frozen. That collapses the training bookkeeping to almost nothing. One obstacle survives it. Training a small set of new knobs still requires holding the entire frozen model in memory throughout — all those billions of original numbers have to sit there so the calculations can flow through them. For the largest models that alone can demand hundreds of gigabytes, far beyond a single ordinary graphics card. QLoRA — Quantized Low-Rank Adaptation — is the trick that knocks down this last wall. The idea is direct: if the frozen model is what consumes the memory, store the frozen model in a more compact form. This piece is about how the compression works, why the rounding survives it, and what the saving does not reach.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/qlora/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>RAG — Giving a Model Something to Read Before It Answers</title><link>https://www.fanfani.net/articles/rag/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/rag/</guid><description>&lt;p&gt;A model&amp;rsquo;s knowledge is fixed at the end of training, distributed across billions of weights in a form nobody can inspect, edit, or attribute. It cannot tell you where it learned something. It cannot be told that a fact has changed without retraining. And when it does not know an answer it will frequently produce one anyway, because nothing in its training taught it to distinguish confident recall from confident invention. Retrieval-augmented generation addresses all of this by an intervention that is almost embarrassingly direct: before asking the model to answer, go and find the relevant documents, and put them in the prompt. Nearly all the difficulty, however, lives in the retrieval step and in the seam between the two systems, and the naive version fails in ways that are entirely predictable once that seam is understood. This piece is about where the pipeline actually breaks, what the seam demands of both halves, and when retrieval is the wrong instrument to reach for.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/rag/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Reasoning Models — Teaching a Model to Think Before It Speaks</title><link>https://www.fanfani.net/articles/reasoning-models/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/reasoning-models/</guid><description>&lt;p&gt;An ordinary language model has a curious habit: it answers instantly. Give it a question and it produces the next word, then the next, marching straight from the prompt to a reply with no visible pause for thought. For a great many tasks this is fine — recalling a fact, rephrasing a sentence, drafting an email. But ask an ordinary model to multiply two large numbers, or to work through a tricky logic puzzle, or to debug a subtle piece of code, and it often stumbles, blurting out a confident answer that happens to be wrong. It behaves like a student who has been forbidden from using scratch paper and must announce the answer the instant the question is read aloud. Reasoning models are what appears when that ban is lifted. They are trained to think first — to spend time working a problem through, step by step, before committing to an answer. This piece is about what &amp;ldquo;thinking&amp;rdquo; means for a machine that only knows how to predict words, how such models are made, and what the extra room does not buy.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/reasoning-models/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Regularization at Scale — Why the Old Defences Stopped Mattering</title><link>https://www.fanfani.net/articles/regularization/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/regularization/</guid><description>&lt;p&gt;Anyone who learned this subject from the textbooks of the twenty-tens learned that the central hazard of fitting a flexible model to data was overfitting, and learned an apparatus for holding it off: a penalty on the size of the weights, noise injected into the activations, a held-out split watched for the moment its curve turns up, augmentation to manufacture examples the collection lacked. That training was sound and the techniques worked. Then you read a technical account of a large language model and find almost none of it. No noise injection. No stopping criterion based on held-out loss, because nothing turns upward to stop at. A weight decay coefficient, retained, listed among the settings with no explanation beyond its value. The tempting conclusion — that the received wisdom was wrong, or that scale makes carelessness affordable — is not what happened. This piece is about which precondition stopped holding, what the surviving weight decay is actually doing, and what took over the job the old defences performed.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/regularization/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Retrieval Embeddings — Turning Meaning Into a Searchable Coordinate</title><link>https://www.fanfani.net/articles/retrieval-embeddings/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/retrieval-embeddings/</guid><description>&lt;p&gt;The article on embeddings concerned the table at the bottom of a language model, which turns each token into a vector so the tower has something to work with. The object here is a different one with an unfortunately identical name: a model whose entire output is a single vector representing a whole passage, built so that passages about the same thing land near each other and can be found by searching. The two share a word and a geometric intuition and almost nothing else. The distinction is worth insisting on, because a great deal of confusion in practice comes from expecting one to do the other&amp;rsquo;s job — and in particular from the reasonable-seeming and wrong idea that a good language model must contain a good search index. This piece is about why it does not, what the training objective actually asks for, and what the resulting vectors cannot be made to do.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/retrieval-embeddings/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Reward Models — Turning Human Taste Into a Number</title><link>https://www.fanfani.net/articles/reward-models/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/reward-models/</guid><description>&lt;p&gt;Training a language model is, up to a point, mechanical: choose a loss, differentiate it, descend. Each stage works because it has something concrete to compare against — the next token in the corpus, a demonstration written by a person, the verdict of a test suite. Then the requirement becomes be helpful, and the machinery has nothing to bite on. Nobody can write a differentiable expression whose minimum is a tactful reply, or one that prefers the right amount of hedging to slightly too much. The properties are real; they have no closed form. What people can do is look at two answers to the same question and say which is better, often without being able to say why. Preference-based alignment rests on one substitution made at that point: fit a function to the comparisons, then treat the function as the objective. This piece is about how that function is built, what the substitution buys, and the ways it goes wrong.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/reward-models/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>RLVR — Letting the Answer Key Do the Teaching</title><link>https://www.fanfani.net/articles/rlvr/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/rlvr/</guid><description>&lt;p&gt;Almost every model in wide use has learned by being shown what a good answer looks like. In pretraining the good answer is simply the next token in the corpus. In supervised fine-tuning it is a demonstration written by a person. In preference learning it is whichever of two responses a human preferred — or, more precisely, whichever a reward model, itself trained to imitate those humans, predicts a human would have preferred. That last substitution is a compromise the field has quietly lived with for years: the thing doing the grading is a neural network with opinions and blind spots of its own. Reinforcement learning from verifiable rewards, usually shortened to RLVR, is what becomes possible when you can throw the grader away and simply check the answer. This piece is about what changes when the reward stops being a judgement and starts being a fact.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/rlvr/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>RoPE — Telling a Model Where a Word Sits by Turning It</title><link>https://www.fanfani.net/articles/rope/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/rope/</guid><description>&lt;p&gt;The machinery of attention is simple enough to state: every word in a sentence gets to look at every other word, weigh how much each one matters, and gather in what it needs. It is a flexible mechanism, and it hides a blind spot. Left to itself, attention has no idea what order the words came in. A sentence arrives as a handful of scrabble tiles tipped onto a table: all the pieces are there, and nothing says which came first. &amp;ldquo;Dog bites man&amp;rdquo; and &amp;ldquo;man bites dog&amp;rdquo; are, to raw attention, the same pile. Since word order carries a great deal of meaning, something has to hand the model the seating chart. Rotary Position Embedding — RoPE — is how most current models do it, and the move is physical: it tells each word where it sits by rotating it. This piece is about why that works, what it buys at longer lengths, and the one thing it does not fix.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/rope/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Safety and Refusal — Teaching a Model to Decline</title><link>https://www.fanfani.net/articles/safety-and-refusal/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/safety-and-refusal/</guid><description>&lt;p&gt;A model that turns down a request appears to be exercising judgement, and the wording encourages that reading, since it tends to say it cannot help with that, as though something in it were unable rather than unwilling. Nothing in the system is unable. The material that would answer the question sits where it sat before anyone trained the model to decline, and what was added on top is a behaviour — a learned tendency to produce one kind of continuation rather than another, installed by the same optimizer as everything else and heir to the same failures. Reading refusal as a capability removed rather than a behaviour added is the most common misunderstanding here, and nearly every surprising result follows from getting it the right way round. This piece is about how refusal is actually trained, why its two failure modes trade against each other, and why the behaviour is thinner than it looks.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/safety-and-refusal/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Scaling Laws — Predicting Quality Before You Train</title><link>https://www.fanfani.net/articles/scaling-laws/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/scaling-laws/</guid><description>&lt;p&gt;There is something peculiar about the fact that this works at all. A neural network is a chaotic object — billions of parameters set by a stochastic process, on data nobody has fully inspected, through an optimization that visits an incomprehensible landscape. Nothing about that description suggests predictability. And yet the loss such a model achieves is a smooth, regular function of three numbers: how large it is, how much it read, and how much arithmetic was spent. Plot loss against any of them on logarithmic axes and you get a straight line, holding over many orders of magnitude. This is what makes it possible to spend a hundred million dollars on a training run with any confidence about the outcome, and it is the closest thing the field has to a physical law. This piece is about the relationship, the correction that reshaped the field&amp;rsquo;s spending, and the ways the law is more limited than its elegance suggests.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/scaling-laws/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Softmax — Forcing a Choice When There May Be None to Make</title><link>https://www.fanfani.net/articles/softmax/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/softmax/</guid><description>&lt;p&gt;The softmax turns up nearly everywhere in a language model, almost always as a piece of settled machinery: the thing that turns scores into odds. It deserves a closer look, because it is not a neutral conversion. It imposes a condition — that the results must sum to one — and that condition, harmless when the question is which word comes next, becomes a genuine constraint when the same function is used inside attention, where the honest answer is sometimes that nothing here is worth attending to. A model given no way to say nothing will say something anyway, and where it puts that unwanted output turns out to explain a scattering of otherwise baffling observations: strange spikes in attention on the first token of every sequence, outliers that ruin quantization, and models that collapse when their oldest tokens are discarded. This piece is about what the softmax insists on, and what a model does when it cannot comply.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/softmax/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Sparse Attention — Choosing Who Is Allowed to See Whom</title><link>https://www.fanfani.net/articles/sparse-attention/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/sparse-attention/</guid><description>&lt;p&gt;Plot the attention weights of a trained transformer and the picture is nearly empty. A bright diagonal, a stripe down the first column or two, the occasional long arc joining a quotation to its opening mark — and around all of it a grey field of numbers too small to move anything. The grid that produced that picture was computed in full, at every layer and every head, one entry for every pair of positions, so the overwhelming majority of the arithmetic went into establishing that two tokens had nothing to do with one another. The obvious response is to stop paying for those: decide ahead of time which pairs are worth comparing, and skip the rest. That move is cheap to describe, has been tried in more variations than almost anything else in this area, and carries a catch that no amount of ingenuity has removed. This piece is about the schemes that restrict who may see whom, the bet each of them makes, and why the hardware has been so unfriendly to the elegant ones.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/sparse-attention/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Speculative Decoding — Guessing Ahead and Checking in Bulk</title><link>https://www.fanfani.net/articles/speculative-decoding/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/speculative-decoding/</guid><description>&lt;p&gt;Speculative decoding is usually mentioned in passing, with the claim that makes it interesting left unjustified: that you can get several tokens for the price of one without changing the output at all. That is a strong claim. A method that produced almost-as-good text twice as fast would be a reasonable engineering trade; a method that produces text drawn from exactly the same distribution as the original model, several times faster, sounds like it must be getting something for nothing. It is not, and the thing it is exploiting was described in the article on KV cache : during generation, an accelerator spends well over ninety-nine percent of its time waiting for weights to arrive and almost none of it computing. There is an enormous surplus of idle arithmetic. This piece is about how to convert that surplus into tokens, and about the sampling argument that makes the conversion exact.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/speculative-decoding/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>State Space Models — Carrying the Past in a Fixed-Size Summary</title><link>https://www.fanfani.net/articles/state-space-models/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/state-space-models/</guid><description>&lt;p&gt;The article on attention opened by dismissing the running summary: a fixed-size vector, updated word by word, that must hold everything worth knowing about a sequence and inevitably crowds out the distant past. Attention replaced it with direct access to every position, and the field never looked back. Except that the running summary had one property attention gave up, and after a decade of paying for it, the property became worth revisiting. A model that carries a fixed-size state does not have a KV cache that grows without limit, and does not cost more per token as the conversation lengthens. It is also, as the article on linear attention shows, where you arrive if you start from attention and simplify rather than starting from recurrence and repairing. This piece is about what it took to make the running summary competitive again, what it still cannot do, and why the answer that is winning is neither one thing nor the other.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/state-space-models/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Superposition — Packing More Ideas Than There Are Neurons</title><link>https://www.fanfani.net/articles/superposition/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/superposition/</guid><description>&lt;p&gt;Look for the neuron that detects sarcasm and you will not find it. You will find a neuron that fires on sarcasm, and also on a particular kind of legal boilerplate, and also on the word &amp;ldquo;notwithstanding,&amp;rdquo; and on nothing else that connects those three. This is the standard experience of examining a trained network, and for a long time it was treated as an embarrassment — evidence that the model&amp;rsquo;s internals were simply a mess, or that our concepts were the wrong ones to look for. The better explanation is that the mess is deliberate. A model needs to represent far more distinguishable things than it has dimensions to spare, and it resolves the shortfall by storing them on top of one another. This piece is about how that packing works, why it is the right strategy rather than a compromise, and the technique that has recently made it possible to unpack.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/superposition/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Supervised Fine-Tuning — Teaching a Model to Answer Rather Than Continue</title><link>https://www.fanfani.net/articles/supervised-fine-tuning/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/supervised-fine-tuning/</guid><description>&lt;p&gt;Take a freshly pretrained model — one that has read a large fraction of the written internet, that can finish a legal clause or a Haskell function with unnerving fluency — and ask it a plain question. What often comes back is not an answer. It is another question, or three more questions, or a table of contents, or the same question rephrased and then a different one. The natural reading is that the model is being obtuse, or does not know, or has been loaded wrong. None of those is what happened. Documents containing a question very frequently continue with further questions, which is what a list of frequently asked questions is, and the model is doing exactly the thing it was trained to do: guess what comes next. It is not withholding an answer. It has never been told that answering is the activity. This piece is about the stage that installs that convention, why it needs so little data, and the ceiling it cannot pass.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/supervised-fine-tuning/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Test-Time Compute — Buying Accuracy With Sampling</title><link>https://www.fanfani.net/articles/test-time-compute/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/test-time-compute/</guid><description>&lt;p&gt;There is a familiar experience with a hard question. The model answers, the answer is wrong, you paste the identical prompt back in, and the second answer is right. Nothing changed. What happened is that a language model does not hold an answer, it holds a distribution over answers, and the reply on the screen is one draw from it. On a hard question it is spread across candidates, one of them correct, and the reply you were shown was the unlucky sample. Industrialized, that observation becomes the family of techniques filed under test-time compute: buying accuracy with extra forward passes when the question is asked rather than extra parameters when the model is built. This piece is about how the buying is done, what the price schedule looks like, and where the purchase stops working.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/test-time-compute/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>The Residual Stream — The Shared Channel Every Layer Reads and Writes</title><link>https://www.fanfani.net/articles/residual-stream/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/residual-stream/</guid><description>&lt;p&gt;A transformer is usually described as a tower of blocks , each doing its work and handing the result to the next, and that picture is good enough for most purposes but quietly wrong in one respect. The blocks do not hand anything to each other. They all read from, and write to, a single vector that runs the full height of the model — entering at the bottom as an embedded token and leaving at the top to be turned into scores. Each block adds its contribution to that vector rather than replacing it. Once you see the architecture this way, as a shared channel with many contributors rather than a pipeline of transformations, a great deal that seemed arbitrary starts to look inevitable. This piece is about the residual stream: what it is, why addition rather than replacement turned out to matter so much, and what it explains about how these models are read and repaired.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/residual-stream/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>The Transformer Block — The Unit That Gets Stacked</title><link>https://www.fanfani.net/articles/transformer-block/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/transformer-block/</guid><description>&lt;p&gt;Descriptions of a language model tend to arrive as an inventory. There is attention, which moves information between positions; there is a feed-forward layer, which holds most of the parameters; there is normalization, which keeps the numbers in range; there is a residual connection, which lets the gradient travel. Each part gets explained on its own terms, and then a diagram appears showing eighty of something stacked in a column, and the column is called the tower. The step in between is skipped. Which is a shame, because that step is where the architecture is decided — the components are not arranged arbitrarily but in the one shape that makes a hundred copies of the same unit safe to pile on top of one another. This piece is about why the block alternates between mixing across positions and computing within them, what the two wrappers around those operations are for, and how much of the design is left unspecified.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/transformer-block/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Tokenization — Cutting Language Into Pieces a Model Can Count</title><link>https://www.fanfani.net/articles/tokenization/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/tokenization/</guid><description>&lt;p&gt;Before a model sees anything, text has to be cut into pieces and each piece assigned a number. This is the only step in the entire pipeline that does not learn. The embedding table is trained, the attention weights are trained, the output map is trained; the tokenizer is a fixed recipe, built once from a sample of text by an algorithm with no notion of meaning, and thereafter frozen. Everything the model can express is expressed in units this recipe chose, and a surprising number of the odd behaviours people notice — trouble with arithmetic, trouble counting letters, uneven costs across languages, occasional total derangement on a particular string — trace back to it. This piece is about how the pieces are chosen and what the choice costs.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/tokenization/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Tool Use — Letting a Model Call Something That Actually Knows</title><link>https://www.fanfani.net/articles/tool-use/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.fanfani.net/articles/tool-use/</guid><description>&lt;p&gt;There are things a language model is bad at that a pocket calculator from 1975 does perfectly. Multiplying two ten-digit numbers. Telling you today&amp;rsquo;s date. Reporting what a particular file contains. These are not hard problems; they are problems of a kind the model is architecturally unsuited to, because it has no persistent state, no access to the world, and no mechanism for exact computation — only a very good sense of what text usually follows what. Tool use is the arrangement that lets it stop trying. The model writes down what it wants done, something else does it, and the result comes back as text the model can read. What makes this more than plumbing is that the interface between a probabilistic text generator and a piece of software that expects exact arguments is a genuinely awkward joint, and most of the engineering is about that joint. This piece is about how the call is made, how it is made reliably, and what the model still has to get right.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.fanfani.net/articles/tool-use/"&gt;Read the full post →&lt;/a&gt;&lt;/p&gt;</description></item></channel></rss>