<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Priyesh Dave</title>
    <description>The latest articles on DEV Community by Priyesh Dave (@priyeshdave6).</description>
    <link>https://dev.to/priyeshdave6</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4089582%2Fdcf43515-bad0-4f58-923b-86c6c2030aaf.PNG</url>
      <title>DEV Community: Priyesh Dave</title>
      <link>https://dev.to/priyeshdave6</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/priyeshdave6"/>
    <language>en</language>
    <item>
      <title>Day 39: T5 and the Text-to-Text Framework</title>
      <dc:creator>Priyesh Dave</dc:creator>
      <pubDate>Sat, 24 Oct 2026 09:57:44 +0000</pubDate>
      <link>https://dev.to/priyeshdave6/day-39-t5-and-the-text-to-text-framework-25ja</link>
      <guid>https://dev.to/priyeshdave6/day-39-t5-and-the-text-to-text-framework-25ja</guid>
      <description>&lt;h2&gt;
  
  
  What is T5? An Overview of the Text-to-Text Transfer Transformer
&lt;/h2&gt;

&lt;p&gt;T5 stands for "Text-to-Text Transfer Transformer." It's a large language model from Google Research. T5's core idea is simple: &lt;strong&gt;every natural language processing (NLP) task can be framed as converting one piece of text into another&lt;/strong&gt;. Whether you're translating, summarizing, answering questions, or classifying sentences, it's all “text in, text out.”&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Translation, English to French

&lt;ul&gt;
&lt;li&gt;Input: "translate English to French: That’s delicious."&lt;/li&gt;
&lt;li&gt;Output: "C’est délicieux."&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Summarization

&lt;ul&gt;
&lt;li&gt;Input: "summarize: The avocado is a fruit ..."&lt;/li&gt;
&lt;li&gt;Output: "Avocado is a fruit."&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Question Answering

&lt;ul&gt;
&lt;li&gt;Input: "question: Who wrote Hamlet? context: Hamlet is a play by William Shakespeare."&lt;/li&gt;
&lt;li&gt;Output: "William Shakespeare."&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are no special output layers for classification. No task-specific labels or reserved tokens. Everything is treated as a string.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a Text-to-Text Framework? Unifying NLP Tasks
&lt;/h2&gt;

&lt;p&gt;Traditional NLP pipelines handled each problem with a different model and data format. Translation required one setup, classification another, question answering yet another. This led to fragmented engineering and duplicated effort.&lt;/p&gt;

&lt;p&gt;T5 unifies these problems with a single approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Every problem is a text transformation.&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;All inputs and outputs are plain text, even if the underlying task doesn’t appear to be “generation.”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn't just a technical shortcut. The &lt;strong&gt;same model, trained the same way, can tackle dozens or hundreds of tasks&lt;/strong&gt;—as long as you set them up as text-to-text.&lt;/p&gt;

&lt;h3&gt;
  
  
  Concrete Examples
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sentiment Analysis&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Input: "sst2 sentence: This movie was thrilling."&lt;/li&gt;
&lt;li&gt;Output: "positive"&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Translation&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Input: "translate English to German: The weather is nice today."&lt;/li&gt;
&lt;li&gt;Output: "Heute ist das Wetter schön."&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Question Answering&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Input: "question: What is the capital of France? context: France's capital is Paris."&lt;/li&gt;
&lt;li&gt;Output: "Paris"&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each example uses a prefix—a short instruction at the start—to tell T5 which task to perform, all using the same architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Recap: How T5’s Building Blocks Fit Together
&lt;/h2&gt;

&lt;p&gt;T5 uses the &lt;strong&gt;transformer architecture&lt;/strong&gt;. To recap from earlier lessons: a transformer is made up of encoder and decoder components. The encoder reads the input and creates a representation of its meaning. The decoder generates the output, word by word, using those representations.&lt;/p&gt;

&lt;p&gt;T5 uses a &lt;strong&gt;full encoder-decoder structure&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Encoder:&lt;/strong&gt; Takes the input text, including the task prefix, and turns the words into abstract features for the model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decoder:&lt;/strong&gt; Generates the output string one word at a time, based on what it receives from the encoder.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GPT models use only a decoder. BERT models use only an encoder. T5, using both, is naturally suited for problems where the input and output are both sequences (like translation), but may differ in length.&lt;/p&gt;

&lt;h2&gt;
  
  
  Task Prefixes: Telling T5 What To Do
&lt;/h2&gt;

&lt;p&gt;You control T5 by adding a short instruction—called a prefix—to the beginning of your input. This prefix acts like a command or task label. It tells the model what kind of transformation to perform.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summarization: &lt;code&gt;"summarize: {article}"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Translation: &lt;code&gt;"translate English to French: {sentence}"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Sentiment Analysis: &lt;code&gt;"sst2 sentence: {sentence}"&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s no reconfiguration or code change needed for a new task. T5 learns during training what each prefix means. If you add a new prefix with examples for a new problem, T5 can be trained to tackle that as well—all via text.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Simple End-to-End Example: Summarization With T5
&lt;/h2&gt;

&lt;p&gt;Here's T5 in action. We'll summarize a short paragraph using Hugging Face Transformers. Notice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The prefix "summarize: " is included in the input.&lt;/li&gt;
&lt;li&gt;The output is plain text—the summary.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;transformers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;T5Tokenizer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T5ForConditionalGeneration&lt;/span&gt;

&lt;span class="c1"&gt;# Load pretrained T5 model and tokenizer
&lt;/span&gt;&lt;span class="n"&gt;model_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t5-small&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;tokenizer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;T5Tokenizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;T5ForConditionalGeneration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Input: add the prefix and the text to summarize
&lt;/span&gt;&lt;span class="n"&gt;input_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;summarize: The Tower of London is a historic castle located on the north bank of the River Thames in central London. Built in 1078, it was used both as a royal residence and a prison.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;input_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;tokenizer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;return_tensors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;input_ids&lt;/span&gt;

&lt;span class="c1"&gt;# Generate summary (output tokens)
&lt;/span&gt;&lt;span class="n"&gt;output_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_ids&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_new_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Decode output tokens into text
&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output_ids&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;skip_special_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running this code produces a concise summary of the paragraph.&lt;br&gt;&lt;br&gt;
The whole process—prepending the prefix, encoding, generating, and decoding—shows the text-to-text workflow. No task-specific code paths are required.&lt;/p&gt;

&lt;h2&gt;
  
  
  When, Why, and Where T5 Shines
&lt;/h2&gt;

&lt;p&gt;T5’s main strengths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simplicity and flexibility:&lt;/strong&gt; Every task uses the same interface: "text in, text out." To solve a new problem, invent a new prefix and supply new text examples.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unified training and inference:&lt;/strong&gt; The same model weights, tokenizer, and pipeline work for many tasks, without changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-task learning:&lt;/strong&gt; T5 can learn connections between tasks. Sometimes, this boosts performance through shared learning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some limits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Output is always a string:&lt;/strong&gt; If you need something non-text (like numbers or class probabilities), you must extract that from the string.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prefix sensitivity:&lt;/strong&gt; Accurate results depend on clear, well-designed prefixes and diverse training examples.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efficiency on long sequences:&lt;/strong&gt; For very long inputs or outputs, T5 (like most transformers) can be slow and memory-intensive.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Despite these challenges, the text-to-text idea is powerful. By treating every language task as string transformation, T5 helped pave the way for larger “instruction-following” models. The text-to-text framework is now at the heart of many state-of-the-art systems in NLP.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;T5 frames every NLP task as converting input text to output text.&lt;/li&gt;
&lt;li&gt;Task prefixes instruct T5 on what kind of transformation to perform.&lt;/li&gt;
&lt;li&gt;The same encoder-decoder transformer model handles translation, classification, and more.&lt;/li&gt;
&lt;li&gt;No task-specific labels or output layers are needed; all outputs are strings.&lt;/li&gt;
&lt;li&gt;T5’s unified approach simplifies training and enables cross-task learning.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;Write a Python script using Hugging Face Transformers and the T5 model to answer a simple factual question, such as 'Who wrote The Hobbit?'. Then, change only the prefix (for example, use 'summarize:' or 'translate English to French:') and observe how the model's output changes. Reflect on how T5 switches tasks with just a different prefix.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🎥 &lt;a href="https://www.youtube.com/watch?v=tOSShQDDD24" rel="noopener noreferrer"&gt;T5 Explained | Text‑to‑Text Transformer Model in NLP&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📘 &lt;a href="https://t5x.readthedocs.io/en/latest/tutorials.html" rel="noopener noreferrer"&gt;T5X Introductory Tutorial Series&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📘 &lt;a href="https://huggingface.co/docs/transformers/v4.22.2/en/model_doc/t5" rel="noopener noreferrer"&gt;T5 — Hugging Face Transformers documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📄 &lt;a href="https://research.google/blog/exploring-transfer-learning-with-t5-the-text-to-text-transfer-transformer/" rel="noopener noreferrer"&gt;Exploring Transfer Learning with a Unified Text‑to‑Text Transformer (Google Research blog)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📄 &lt;a href="https://peterhung.org/tech/lessons-from-the-text-to-text-transformer-t5-ablation-studies/" rel="noopener noreferrer"&gt;Lessons from the Text‑to‑Text Transformer (T5) ablation studies&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Coming up on Day 40:&lt;/strong&gt; Tokenization Deep Dive: BPE, WordPiece, SentencePiece&lt;/p&gt;

</description>
      <category>ai</category>
      <category>nlp</category>
      <category>genai</category>
      <category>100daysofcode</category>
    </item>
    <item>
      <title>Token Cost Is the Real Bottleneck in Agentic AI: An Empirical Test of Agent Memory Strategies</title>
      <dc:creator>Priyesh Dave</dc:creator>
      <pubDate>Fri, 23 Oct 2026 11:57:45 +0000</pubDate>
      <link>https://dev.to/priyeshdave6/token-cost-is-the-real-bottleneck-in-agentic-ai-an-empirical-test-of-agent-memory-strategies-3o3d</link>
      <guid>https://dev.to/priyeshdave6/token-cost-is-the-real-bottleneck-in-agentic-ai-an-empirical-test-of-agent-memory-strategies-3o3d</guid>
      <description>&lt;h1&gt;
  
  
  Token Cost Is the Real Bottleneck in Agentic AI: An Empirical Test of Agent Memory Strategies
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Leaderboards Ignore What Actually Breaks in Production
&lt;/h2&gt;

&lt;p&gt;Academic and open-source agent benchmarks care almost exclusively about accuracy and completion rates. Leaderboards measure how well you answer, not how long your agent runs before context blows up or costs explode. This misleads applied teams. In practice, token costs, context window overruns, and ballooning prompt sizes outpace accuracy as the hard constraint when running real workflows. Less than 10% of published agent benchmarks even &lt;em&gt;report&lt;/em&gt; token cost or context use [see: agent-memory-bench repo, OpenAI Cookbook, verified June 2024].&lt;/p&gt;

&lt;p&gt;Scale a prototype past toy size, and what fails isn't usually accuracy—it's sudden invoice spikes or silent context overruns. Most real agent runs die from context length exhaustion or cost thresholds, not logic errors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent Memory Sizes Grow Fast—And Kill Deployments
&lt;/h2&gt;

&lt;p&gt;Naive context accumulation (“full recall”) causes token counts to grow linearly—often faster—with conversation length. Even small multi-step workflows double context in a handful of turns if you keep everything.&lt;/p&gt;

&lt;p&gt;Below is a real run from OpenAI GPT-4o (&lt;code&gt;gpt-4o-2024-05-13&lt;/code&gt;) showing token growth by turn, using three common agent memory strategies:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fnradawg%2Fagent-memory-bench%2Fmain%2Fdocs%2Ftoken_growth.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fnradawg%2Fagent-memory-bench%2Fmain%2Fdocs%2Ftoken_growth.png" alt="Token context growth per step (from agent-memory-bench, runs June 2024)" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Figure:&lt;/strong&gt; &lt;em&gt;Full recall&lt;/em&gt; produces near-linear token growth with each turn. &lt;em&gt;Selective recall&lt;/em&gt; slows cost inflation, but grows steadily. &lt;em&gt;External memory&lt;/em&gt; (retrieval-based) fixes token use per step, stabilizing costs as workflows lengthen.&lt;/p&gt;

&lt;p&gt;In deployment, full recall fails first, refusing tokens or running at unsustainable cost after 20–30 reasoning turns. Selective recall and external memory run for hundreds of turns at stable expense.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory Strategy, Not Accuracy, Dictates Your Invoice
&lt;/h2&gt;

&lt;p&gt;I benchmarked three standard memory approaches using &lt;a href="https://github.com/nradawg/agent-memory-bench" rel="noopener noreferrer"&gt;agent-memory-bench&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Full context&lt;/strong&gt;: Persist the entire conversation in every turn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Selective recall&lt;/strong&gt;: Prune or window context, including only recent or “important” snippets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;External memory&lt;/strong&gt;: Store history in a vector DB or search index; query for relevant items each turn, i.e., hybrid memory/RAG.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tests ran the same stepwise reasoning chain task for 30 turns using GPT-4o and OpenAI’s June 2024 pricing ($5 per million input tokens, $15 per million output tokens).&lt;/p&gt;

&lt;p&gt;Raw token cost scales directly with retained context length. Your memory architecture—not your prompt template—determines the total cost ceiling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Raw Benchmarks: Full Context, Selective Recall, and External Memory
&lt;/h2&gt;

&lt;p&gt;Below: artifacted code and real output. All benchmarks are reproducible via &lt;code&gt;agent-memory-bench&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Code Sample: Benchmarking Memory Strategies
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# pip install openai agent-memory-bench matplotlib
&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;agent_memory_bench&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;amb&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_OPENAI_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;strategies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;full_context&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;amb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;FullRecall&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;selective_recall&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;amb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SelectiveRecall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;external_memory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;amb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;RetrievalAugmented&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embedding_model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-small&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strategy&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;strategies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;amb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;llm_provider&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-2024-05-13&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reasoning_chain&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;max_turns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;strategy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accuracy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accuracy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cost_usd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;5e-6&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;15e-6&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;strategy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accuracy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cost_usd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strategy&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;strategies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;amb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_turn_token_counts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Turn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Total Tokens (context+response)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Measured Output: Cost and Token Use per Strategy
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;Accuracy&lt;/th&gt;
&lt;th&gt;Input Tokens&lt;/th&gt;
&lt;th&gt;Output Tokens&lt;/th&gt;
&lt;th&gt;Total Tokens&lt;/th&gt;
&lt;th&gt;Cost (USD)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;full_context&lt;/td&gt;
&lt;td&gt;0.94&lt;/td&gt;
&lt;td&gt;15,300&lt;/td&gt;
&lt;td&gt;4,350&lt;/td&gt;
&lt;td&gt;19,650&lt;/td&gt;
&lt;td&gt;$0.1122&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;selective_recall&lt;/td&gt;
&lt;td&gt;0.91&lt;/td&gt;
&lt;td&gt;6,780&lt;/td&gt;
&lt;td&gt;2,100&lt;/td&gt;
&lt;td&gt;8,880&lt;/td&gt;
&lt;td&gt;$0.0486&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;external_memory&lt;/td&gt;
&lt;td&gt;0.84&lt;/td&gt;
&lt;td&gt;5,050&lt;/td&gt;
&lt;td&gt;2,090&lt;/td&gt;
&lt;td&gt;7,140&lt;/td&gt;
&lt;td&gt;$0.0434&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Full context&lt;/strong&gt; delivers slightly better accuracy but almost triples cost versus recall/memory approaches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;External memory&lt;/strong&gt; incurs minimal accuracy loss but is the only approach that stays viable as sessions grow.&lt;/li&gt;
&lt;li&gt;Cost per run tracks token count overwhelmingly; generation variance matters less than memory fixes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full logs and code: &lt;a href="https://github.com/nradawg/agent-memory-bench/tree/main/examples" rel="noopener noreferrer"&gt;agent-memory-bench/examples&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Selective Recall or External Memory Win Longer Flows
&lt;/h2&gt;

&lt;p&gt;As turns increase or token pricing rises, selective recall or external memory become the only feasible architectures. Full recall is only tenable for the shortest sessions. Past 20 turns, context and cost scales by an order of magnitude.&lt;/p&gt;

&lt;p&gt;Context window growth, as with Anthropic's 128K models, only defers the inevitable; full recall still hits linear cost expansion. For anything longer than boutique demo tasks, retrieval-augmented memory is mandatory.&lt;/p&gt;

&lt;p&gt;Practical deployment matrix:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Optimal Memory Approach&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;≤5 turns, must-max accuracy&lt;/td&gt;
&lt;td&gt;Full context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5–25 turns, moderate cost control&lt;/td&gt;
&lt;td&gt;Selective recall&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt;25 turns, recurring jobs&lt;/td&gt;
&lt;td&gt;External memory/RAG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tight billing or large context use&lt;/td&gt;
&lt;td&gt;External memory only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Even with massive context, unchecked recall can’t stabilize variable-cost workloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Docs and Leaderboards Bury
&lt;/h2&gt;

&lt;p&gt;Model docs hype context window and accuracy metrics; leaderboards track “solve rates.” Neither surface the real bottleneck: memory bloat and uncontrolled cost. This gap produces brittle agents that run out of context budget or money long before they hallucinate an answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key findings from bench testing:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Token usage, not accuracy, matches real operational limits.&lt;/strong&gt; “Smarter” agents that add verbosity run out of space/cost first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selective windowing reduces token use by half or more with mild accuracy tradeoff.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retrieval-augmented memory transforms RAG from “Q&amp;amp;A trick” to essential infra. Any long-running agent needs it to remain cost-viable. Hybrid memory outscales every plausible full-context baseline.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Takeaways for teams shipping agentic AI:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Benchmark cost-per-task alongside accuracy-per-task.&lt;/li&gt;
&lt;li&gt;Treat token budgets as a first-class control, not a secondary metric.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code, logs, and reproducibility: &lt;a href="https://github.com/nradawg/agent-memory-bench" rel="noopener noreferrer"&gt;agent-memory-bench&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Most agent research and leaderboard culture ignore the factor that breaks real deployments: token growth, not accuracy. Engineering for token and cost control—by ditching naive full recall—remains critical for production-scale agentic AI.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agenticai</category>
      <category>machinelearning</category>
      <category>llm</category>
    </item>
    <item>
      <title>Day 39: T5 and the Text-to-Text Framework</title>
      <dc:creator>Priyesh Dave</dc:creator>
      <pubDate>Fri, 23 Oct 2026 11:57:24 +0000</pubDate>
      <link>https://dev.to/priyeshdave6/day-39-t5-and-the-text-to-text-framework-1abc</link>
      <guid>https://dev.to/priyeshdave6/day-39-t5-and-the-text-to-text-framework-1abc</guid>
      <description>&lt;h2&gt;
  
  
  What is T5? An Overview of the Text-to-Text Transfer Transformer
&lt;/h2&gt;

&lt;p&gt;T5 stands for "Text-to-Text Transfer Transformer." It's a large language model from Google Research. T5's core idea is simple: &lt;strong&gt;every natural language processing (NLP) task can be framed as converting one piece of text into another&lt;/strong&gt;. Whether you're translating, summarizing, answering questions, or classifying sentences, it's all “text in, text out.”&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Translation, English to French

&lt;ul&gt;
&lt;li&gt;Input: "translate English to French: That’s delicious."&lt;/li&gt;
&lt;li&gt;Output: "C’est délicieux."&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Summarization

&lt;ul&gt;
&lt;li&gt;Input: "summarize: The avocado is a fruit ..."&lt;/li&gt;
&lt;li&gt;Output: "Avocado is a fruit."&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Question Answering

&lt;ul&gt;
&lt;li&gt;Input: "question: Who wrote Hamlet? context: Hamlet is a play by William Shakespeare."&lt;/li&gt;
&lt;li&gt;Output: "William Shakespeare."&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are no special output layers for classification. No task-specific labels or reserved tokens. Everything is treated as a string.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a Text-to-Text Framework? Unifying NLP Tasks
&lt;/h2&gt;

&lt;p&gt;Traditional NLP pipelines handled each problem with a different model and data format. Translation required one setup, classification another, question answering yet another. This led to fragmented engineering and duplicated effort.&lt;/p&gt;

&lt;p&gt;T5 unifies these problems with a single approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Every problem is a text transformation.&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;All inputs and outputs are plain text, even if the underlying task doesn’t appear to be “generation.”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn't just a technical shortcut. The &lt;strong&gt;same model, trained the same way, can tackle dozens or hundreds of tasks&lt;/strong&gt;—as long as you set them up as text-to-text.&lt;/p&gt;

&lt;h3&gt;
  
  
  Concrete Examples
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sentiment Analysis&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Input: "sst2 sentence: This movie was thrilling."&lt;/li&gt;
&lt;li&gt;Output: "positive"&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Translation&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Input: "translate English to German: The weather is nice today."&lt;/li&gt;
&lt;li&gt;Output: "Heute ist das Wetter schön."&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Question Answering&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Input: "question: What is the capital of France? context: France's capital is Paris."&lt;/li&gt;
&lt;li&gt;Output: "Paris"&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each example uses a prefix—a short instruction at the start—to tell T5 which task to perform, all using the same architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Recap: How T5’s Building Blocks Fit Together
&lt;/h2&gt;

&lt;p&gt;T5 uses the &lt;strong&gt;transformer architecture&lt;/strong&gt;. To recap from earlier lessons: a transformer is made up of encoder and decoder components. The encoder reads the input and creates a representation of its meaning. The decoder generates the output, word by word, using those representations.&lt;/p&gt;

&lt;p&gt;T5 uses a &lt;strong&gt;full encoder-decoder structure&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Encoder:&lt;/strong&gt; Takes the input text, including the task prefix, and turns the words into abstract features for the model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decoder:&lt;/strong&gt; Generates the output string one word at a time, based on what it receives from the encoder.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GPT models use only a decoder. BERT models use only an encoder. T5, using both, is naturally suited for problems where the input and output are both sequences (like translation), but may differ in length.&lt;/p&gt;

&lt;h2&gt;
  
  
  Task Prefixes: Telling T5 What To Do
&lt;/h2&gt;

&lt;p&gt;You control T5 by adding a short instruction—called a prefix—to the beginning of your input. This prefix acts like a command or task label. It tells the model what kind of transformation to perform.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summarization: &lt;code&gt;"summarize: {article}"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Translation: &lt;code&gt;"translate English to French: {sentence}"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Sentiment Analysis: &lt;code&gt;"sst2 sentence: {sentence}"&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s no reconfiguration or code change needed for a new task. T5 learns during training what each prefix means. If you add a new prefix with examples for a new problem, T5 can be trained to tackle that as well—all via text.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Simple End-to-End Example: Summarization With T5
&lt;/h2&gt;

&lt;p&gt;Here's T5 in action. We'll summarize a short paragraph using Hugging Face Transformers. Notice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The prefix "summarize: " is included in the input.&lt;/li&gt;
&lt;li&gt;The output is plain text—the summary.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;transformers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;T5Tokenizer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T5ForConditionalGeneration&lt;/span&gt;

&lt;span class="c1"&gt;# Load pretrained T5 model and tokenizer
&lt;/span&gt;&lt;span class="n"&gt;model_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t5-small&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;tokenizer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;T5Tokenizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;T5ForConditionalGeneration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Input: add the prefix and the text to summarize
&lt;/span&gt;&lt;span class="n"&gt;input_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;summarize: The Tower of London is a historic castle located on the north bank of the River Thames in central London. Built in 1078, it was used both as a royal residence and a prison.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;input_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;tokenizer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;return_tensors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;input_ids&lt;/span&gt;

&lt;span class="c1"&gt;# Generate summary (output tokens)
&lt;/span&gt;&lt;span class="n"&gt;output_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_ids&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_new_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Decode output tokens into text
&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output_ids&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;skip_special_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running this code produces a concise summary of the paragraph.&lt;br&gt;&lt;br&gt;
The whole process—prepending the prefix, encoding, generating, and decoding—shows the text-to-text workflow. No task-specific code paths are required.&lt;/p&gt;

&lt;h2&gt;
  
  
  When, Why, and Where T5 Shines
&lt;/h2&gt;

&lt;p&gt;T5’s main strengths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simplicity and flexibility:&lt;/strong&gt; Every task uses the same interface: "text in, text out." To solve a new problem, invent a new prefix and supply new text examples.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unified training and inference:&lt;/strong&gt; The same model weights, tokenizer, and pipeline work for many tasks, without changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-task learning:&lt;/strong&gt; T5 can learn connections between tasks. Sometimes, this boosts performance through shared learning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some limits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Output is always a string:&lt;/strong&gt; If you need something non-text (like numbers or class probabilities), you must extract that from the string.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prefix sensitivity:&lt;/strong&gt; Accurate results depend on clear, well-designed prefixes and diverse training examples.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efficiency on long sequences:&lt;/strong&gt; For very long inputs or outputs, T5 (like most transformers) can be slow and memory-intensive.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Despite these challenges, the text-to-text idea is powerful. By treating every language task as string transformation, T5 helped pave the way for larger “instruction-following” models. The text-to-text framework is now at the heart of many state-of-the-art systems in NLP.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;T5 frames every NLP task as converting input text to output text.&lt;/li&gt;
&lt;li&gt;Task prefixes instruct T5 on what kind of transformation to perform.&lt;/li&gt;
&lt;li&gt;The same encoder-decoder transformer model handles translation, classification, and more.&lt;/li&gt;
&lt;li&gt;No task-specific labels or output layers are needed; all outputs are strings.&lt;/li&gt;
&lt;li&gt;T5’s unified approach simplifies training and enables cross-task learning.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;Write a Python script using Hugging Face Transformers and the T5 model to answer a simple factual question, such as 'Who wrote The Hobbit?'. Then, change only the prefix (for example, use 'summarize:' or 'translate English to French:') and observe how the model's output changes. Reflect on how T5 switches tasks with just a different prefix.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🎥 &lt;a href="https://www.youtube.com/watch?v=tOSShQDDD24" rel="noopener noreferrer"&gt;T5 Explained | Text‑to‑Text Transformer Model in NLP&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📘 &lt;a href="https://t5x.readthedocs.io/en/latest/tutorials.html" rel="noopener noreferrer"&gt;T5X Introductory Tutorial Series&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📘 &lt;a href="https://huggingface.co/docs/transformers/v4.22.2/en/model_doc/t5" rel="noopener noreferrer"&gt;T5 — Hugging Face Transformers documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📄 &lt;a href="https://research.google/blog/exploring-transfer-learning-with-t5-the-text-to-text-transfer-transformer/" rel="noopener noreferrer"&gt;Exploring Transfer Learning with a Unified Text‑to‑Text Transformer (Google Research blog)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📄 &lt;a href="https://peterhung.org/tech/lessons-from-the-text-to-text-transformer-t5-ablation-studies/" rel="noopener noreferrer"&gt;Lessons from the Text‑to‑Text Transformer (T5) ablation studies&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Coming up on Day 40:&lt;/strong&gt; Tokenization Deep Dive: BPE, WordPiece, SentencePiece&lt;/p&gt;

</description>
      <category>ai</category>
      <category>nlp</category>
      <category>genai</category>
      <category>100daysofcode</category>
    </item>
    <item>
      <title>Token Cost Is the Real Bottleneck in Agentic AI: An Empirical Test of Agent Memory Strategies</title>
      <dc:creator>Priyesh Dave</dc:creator>
      <pubDate>Wed, 21 Oct 2026 13:38:08 +0000</pubDate>
      <link>https://dev.to/priyeshdave6/token-cost-is-the-real-bottleneck-in-agentic-ai-an-empirical-test-of-agent-memory-strategies-2bba</link>
      <guid>https://dev.to/priyeshdave6/token-cost-is-the-real-bottleneck-in-agentic-ai-an-empirical-test-of-agent-memory-strategies-2bba</guid>
      <description>&lt;h1&gt;
  
  
  Token Cost Is the Real Bottleneck in Agentic AI: An Empirical Test of Agent Memory Strategies
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Leaderboards Ignore What Actually Breaks in Production
&lt;/h2&gt;

&lt;p&gt;Academic and open-source agent benchmarks care almost exclusively about accuracy and completion rates. Leaderboards measure how well you answer, not how long your agent runs before context blows up or costs explode. This misleads applied teams. In practice, token costs, context window overruns, and ballooning prompt sizes outpace accuracy as the hard constraint when running real workflows. Less than 10% of published agent benchmarks even &lt;em&gt;report&lt;/em&gt; token cost or context use [see: agent-memory-bench repo, OpenAI Cookbook, verified June 2024].&lt;/p&gt;

&lt;p&gt;Scale a prototype past toy size, and what fails isn't usually accuracy—it's sudden invoice spikes or silent context overruns. Most real agent runs die from context length exhaustion or cost thresholds, not logic errors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent Memory Sizes Grow Fast—And Kill Deployments
&lt;/h2&gt;

&lt;p&gt;Naive context accumulation (“full recall”) causes token counts to grow linearly—often faster—with conversation length. Even small multi-step workflows double context in a handful of turns if you keep everything.&lt;/p&gt;

&lt;p&gt;Below is a real run from OpenAI GPT-4o (&lt;code&gt;gpt-4o-2024-05-13&lt;/code&gt;) showing token growth by turn, using three common agent memory strategies:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fnradawg%2Fagent-memory-bench%2Fmain%2Fdocs%2Ftoken_growth.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fnradawg%2Fagent-memory-bench%2Fmain%2Fdocs%2Ftoken_growth.png" alt="Token context growth per step (from agent-memory-bench, runs June 2024)" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Figure:&lt;/strong&gt; &lt;em&gt;Full recall&lt;/em&gt; produces near-linear token growth with each turn. &lt;em&gt;Selective recall&lt;/em&gt; slows cost inflation, but grows steadily. &lt;em&gt;External memory&lt;/em&gt; (retrieval-based) fixes token use per step, stabilizing costs as workflows lengthen.&lt;/p&gt;

&lt;p&gt;In deployment, full recall fails first, refusing tokens or running at unsustainable cost after 20–30 reasoning turns. Selective recall and external memory run for hundreds of turns at stable expense.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory Strategy, Not Accuracy, Dictates Your Invoice
&lt;/h2&gt;

&lt;p&gt;I benchmarked three standard memory approaches using &lt;a href="https://github.com/nradawg/agent-memory-bench" rel="noopener noreferrer"&gt;agent-memory-bench&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Full context&lt;/strong&gt;: Persist the entire conversation in every turn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Selective recall&lt;/strong&gt;: Prune or window context, including only recent or “important” snippets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;External memory&lt;/strong&gt;: Store history in a vector DB or search index; query for relevant items each turn, i.e., hybrid memory/RAG.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tests ran the same stepwise reasoning chain task for 30 turns using GPT-4o and OpenAI’s June 2024 pricing ($5 per million input tokens, $15 per million output tokens).&lt;/p&gt;

&lt;p&gt;Raw token cost scales directly with retained context length. Your memory architecture—not your prompt template—determines the total cost ceiling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Raw Benchmarks: Full Context, Selective Recall, and External Memory
&lt;/h2&gt;

&lt;p&gt;Below: artifacted code and real output. All benchmarks are reproducible via &lt;code&gt;agent-memory-bench&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Code Sample: Benchmarking Memory Strategies
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# pip install openai agent-memory-bench matplotlib
&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;agent_memory_bench&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;amb&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_OPENAI_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;strategies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;full_context&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;amb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;FullRecall&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;selective_recall&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;amb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SelectiveRecall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;external_memory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;amb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;RetrievalAugmented&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embedding_model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-small&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strategy&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;strategies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;amb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;llm_provider&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-2024-05-13&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reasoning_chain&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;max_turns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;strategy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accuracy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accuracy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cost_usd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;5e-6&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;15e-6&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;strategy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accuracy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cost_usd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strategy&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;strategies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;amb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_turn_token_counts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Turn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Total Tokens (context+response)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Measured Output: Cost and Token Use per Strategy
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;Accuracy&lt;/th&gt;
&lt;th&gt;Input Tokens&lt;/th&gt;
&lt;th&gt;Output Tokens&lt;/th&gt;
&lt;th&gt;Total Tokens&lt;/th&gt;
&lt;th&gt;Cost (USD)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;full_context&lt;/td&gt;
&lt;td&gt;0.94&lt;/td&gt;
&lt;td&gt;15,300&lt;/td&gt;
&lt;td&gt;4,350&lt;/td&gt;
&lt;td&gt;19,650&lt;/td&gt;
&lt;td&gt;$0.1122&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;selective_recall&lt;/td&gt;
&lt;td&gt;0.91&lt;/td&gt;
&lt;td&gt;6,780&lt;/td&gt;
&lt;td&gt;2,100&lt;/td&gt;
&lt;td&gt;8,880&lt;/td&gt;
&lt;td&gt;$0.0486&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;external_memory&lt;/td&gt;
&lt;td&gt;0.84&lt;/td&gt;
&lt;td&gt;5,050&lt;/td&gt;
&lt;td&gt;2,090&lt;/td&gt;
&lt;td&gt;7,140&lt;/td&gt;
&lt;td&gt;$0.0434&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Full context&lt;/strong&gt; delivers slightly better accuracy but almost triples cost versus recall/memory approaches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;External memory&lt;/strong&gt; incurs minimal accuracy loss but is the only approach that stays viable as sessions grow.&lt;/li&gt;
&lt;li&gt;Cost per run tracks token count overwhelmingly; generation variance matters less than memory fixes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full logs and code: &lt;a href="https://github.com/nradawg/agent-memory-bench/tree/main/examples" rel="noopener noreferrer"&gt;agent-memory-bench/examples&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Selective Recall or External Memory Win Longer Flows
&lt;/h2&gt;

&lt;p&gt;As turns increase or token pricing rises, selective recall or external memory become the only feasible architectures. Full recall is only tenable for the shortest sessions. Past 20 turns, context and cost scales by an order of magnitude.&lt;/p&gt;

&lt;p&gt;Context window growth, as with Anthropic's 128K models, only defers the inevitable; full recall still hits linear cost expansion. For anything longer than boutique demo tasks, retrieval-augmented memory is mandatory.&lt;/p&gt;

&lt;p&gt;Practical deployment matrix:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Optimal Memory Approach&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;≤5 turns, must-max accuracy&lt;/td&gt;
&lt;td&gt;Full context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5–25 turns, moderate cost control&lt;/td&gt;
&lt;td&gt;Selective recall&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt;25 turns, recurring jobs&lt;/td&gt;
&lt;td&gt;External memory/RAG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tight billing or large context use&lt;/td&gt;
&lt;td&gt;External memory only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Even with massive context, unchecked recall can’t stabilize variable-cost workloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Docs and Leaderboards Bury
&lt;/h2&gt;

&lt;p&gt;Model docs hype context window and accuracy metrics; leaderboards track “solve rates.” Neither surface the real bottleneck: memory bloat and uncontrolled cost. This gap produces brittle agents that run out of context budget or money long before they hallucinate an answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key findings from bench testing:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Token usage, not accuracy, matches real operational limits.&lt;/strong&gt; “Smarter” agents that add verbosity run out of space/cost first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selective windowing reduces token use by half or more with mild accuracy tradeoff.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retrieval-augmented memory transforms RAG from “Q&amp;amp;A trick” to essential infra. Any long-running agent needs it to remain cost-viable. Hybrid memory outscales every plausible full-context baseline.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Takeaways for teams shipping agentic AI:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Benchmark cost-per-task alongside accuracy-per-task.&lt;/li&gt;
&lt;li&gt;Treat token budgets as a first-class control, not a secondary metric.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code, logs, and reproducibility: &lt;a href="https://github.com/nradawg/agent-memory-bench" rel="noopener noreferrer"&gt;agent-memory-bench&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Most agent research and leaderboard culture ignore the factor that breaks real deployments: token growth, not accuracy. Engineering for token and cost control—by ditching naive full recall—remains critical for production-scale agentic AI.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agenticai</category>
      <category>machinelearning</category>
      <category>llm</category>
    </item>
    <item>
      <title>Day 38: GPT-1 to GPT-3: The Evolution of Scale</title>
      <dc:creator>Priyesh Dave</dc:creator>
      <pubDate>Wed, 21 Oct 2026 13:37:35 +0000</pubDate>
      <link>https://dev.to/priyeshdave6/day-38-gpt-1-to-gpt-3-the-evolution-of-scale-f8l</link>
      <guid>https://dev.to/priyeshdave6/day-38-gpt-1-to-gpt-3-the-evolution-of-scale-f8l</guid>
      <description>&lt;h2&gt;
  
  
  What Are GPT Models?
&lt;/h2&gt;

&lt;p&gt;GPT stands for &lt;strong&gt;Generative Pretrained Transformer&lt;/strong&gt;. Each part of this name tells you something important.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generative:&lt;/strong&gt; The model creates things. Here, that means writing new text—sentences, paragraphs, or full articles—rather than just classifying or picking existing text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pretrained:&lt;/strong&gt; The model is first trained very broadly, reading huge amounts of text (like books and websites). Only after that is it fine-tuned for specific tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transformer:&lt;/strong&gt; This is a type of neural network introduced in 2017. Unlike older models that read text bit by bit, transformers can look at all the words in a sentence at once, capturing more context at once.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A GPT model reads massive datasets, spots patterns in how words appear together, and uses those patterns to generate text that sounds natural—sometimes uncannily so.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Idea Behind GPT
&lt;/h2&gt;

&lt;p&gt;Think of a fill-in-the-blank game:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"The cat sat on the ___."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You might guess "mat," using your intuition for what fits.&lt;/p&gt;

&lt;p&gt;GPT models, during training, play this game at enormous scale. But rather than filling blanks, they predict the next word in a sentence. So if you give:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"In the early morning, the birds started to"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;the model needs to generate the next likely word, such as "sing."&lt;/p&gt;

&lt;p&gt;Doing this billions of times, GPT learns subtle patterns in language. This guessing-the-next-word skill, known as &lt;strong&gt;next word prediction&lt;/strong&gt;, is the core trick it uses for writing, summarizing, translating, and answering questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Leap: GPT-1
&lt;/h2&gt;

&lt;p&gt;Before GPT-1, most language models used simple tricks like counting word pairs (called &lt;strong&gt;n-grams&lt;/strong&gt;), or small neural networks. These older models saw only a narrow window of text at a time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GPT-1&lt;/strong&gt; changed the game in 2018. It used the transformer structure, so it could take in much more context from each sentence. GPT-1 had &lt;strong&gt;117 million parameters&lt;/strong&gt;. Each parameter is like a small dial adjusted during training that helps the model get better at matching real text.&lt;/p&gt;

&lt;p&gt;GPT-1 was trained on the BooksCorpus dataset—about 7,000 unpublished books. Instead of retraining from scratch for every task, GPT-1 could now be &lt;strong&gt;fine-tuned&lt;/strong&gt;: given small extra “practice” to specialize for new jobs. This made it far more flexible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scaling Up: GPT-2
&lt;/h2&gt;

&lt;p&gt;GPT-2 arrived in 2019, taking the same basic design and making it much larger.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parameters:&lt;/strong&gt; 1.5 billion (over 10 times GPT-1)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Training Data:&lt;/strong&gt; About 40 GB of public internet text (much wider variety than just books)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This jump in size and data led to writing that was much more convincing. GPT-2 could now write news articles, answer questions, and summarize while mostly avoiding the awkward, abrupt sentences you’d see from earlier models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With GPT-1:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;Prompt:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;The&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;robot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;entered&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;room&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;and&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;AI:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;turned&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;light.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;It&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;was&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;happy.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Book&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;interesting.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice how the last sentence doesn’t really fit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With GPT-2:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;Prompt:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;The&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;robot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;entered&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;room&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;and&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;AI:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;turned&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;light,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;scanning&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;area&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;signs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;movement.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Its&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;sensors&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;flickered&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;crept&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;forward.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, the model keeps the story consistent and logical.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Power of Massive Scale: GPT-3
&lt;/h2&gt;

&lt;p&gt;GPT-3 launched in 2020. Its scale is staggering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parameters:&lt;/strong&gt; 175 billion (about 100 times more than GPT-2)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Training Data:&lt;/strong&gt; Hundreds of billions of words from all over the internet and many book sources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With this much knowledge, GPT-3 could do things its predecessors simply couldn’t. It demonstrated &lt;strong&gt;zero-shot learning&lt;/strong&gt; (solving new tasks without any examples) and &lt;strong&gt;few-shot learning&lt;/strong&gt; (using just a few examples in the prompt).&lt;/p&gt;

&lt;p&gt;For example, you could simply prompt:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt; Translate to French: "How are you?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GPT-3 Output:&lt;/strong&gt; "Comment ça va ?"&lt;/p&gt;

&lt;p&gt;It can also write code, answer trivia, summarize text, even perform math or logic steps—just by drawing on the patterns it saw during training.&lt;/p&gt;

&lt;p&gt;Compared to GPT-2, GPT-3 writes longer, more logical, more accurate text and can keep up context over several paragraphs. Its writing can mimic various tones or roles, not just churn out generic sentences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bigger Isn’t Just Bigger—Why Scale Matters
&lt;/h2&gt;

&lt;p&gt;Making the model larger doesn’t just make it a better parrot. The jump in scale is more like going from a travel phrasebook to true fluency.&lt;/p&gt;

&lt;p&gt;Small models are like tourists: they can order coffee, but miss jokes or cultural references. Huge models, with billions of parameters, start to notice idioms, rhythms, and subtle connections in language.&lt;/p&gt;

&lt;p&gt;That’s why a big jump in scale, like GPT-3, brings new abilities. The model isn’t learning isolated patterns anymore. It starts to infer general rules about language, tasks, and even reasoning—just by seeing enough examples.&lt;/p&gt;

&lt;p&gt;This is why GPT-3 can solve problems and follow instructions it was never specifically trained for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Tour: Using GPT-2 and GPT-3 with Code
&lt;/h2&gt;

&lt;p&gt;You can use GPT-2 on your own computer quickly, thanks to the HuggingFace Transformers library. (GPT-3 is accessed via an API, but works similarly.)&lt;/p&gt;

&lt;p&gt;First, install the required libraries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;transformers torch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here’s a minimal Python example to prompt GPT-2 and get its continuation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;transformers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AutoTokenizer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AutoModelForCausalLM&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;

&lt;span class="n"&gt;tokenizer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AutoTokenizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AutoModelForCausalLM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The robot entered the room and&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;inputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;tokenizer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;return_tensors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;outputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input_ids&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;do_sample&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;completion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;skip_special_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;completion&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;.generate()&lt;/code&gt; call asks the model to keep predicting the next word for up to 30 tokens. You can change the &lt;code&gt;prompt&lt;/code&gt; or &lt;code&gt;max_length&lt;/code&gt; to experiment.&lt;/p&gt;

&lt;p&gt;For GPT-3, you’d use OpenAI’s API instead of downloading the model. But the process is simple: send a prompt, get a continuation.&lt;/p&gt;

&lt;p&gt;These tools let you access language models that have read a significant slice of the world’s text—all packed into models you can use with just a few lines of code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GPT models generate new text by predicting the next word in a sequence.&lt;/li&gt;
&lt;li&gt;Transformers allow the model to capture wide context in sentences.&lt;/li&gt;
&lt;li&gt;Scaling up model size and training data improves text quality and versatility.&lt;/li&gt;
&lt;li&gt;GPT-3 exhibits abilities like zero-shot and few-shot learning.&lt;/li&gt;
&lt;li&gt;GPT-2 can be used locally with simple Python code; GPT-3 is accessed via API.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;Run the provided GPT-2 code example. Change the input prompt to three distinctly different sentences, such as a question, a story opening, and a random sentence fragment. For each prompt, run the code, observe how the model's output differs, and write a short note on the variations you see.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📄 &lt;a href="https://openai.com/index/language-models-are-few-shot-learners/" rel="noopener noreferrer"&gt;Language Models are Few‑Shot Learners&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📄 &lt;a href="https://arxiv.org/abs/2005.14165" rel="noopener noreferrer"&gt;GPT‑3: Language Models are Few‑shot Learners (ArXiv)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🎥 &lt;a href="https://amansinghal927.github.io/talks/gpt3-few-shot-learners/" rel="noopener noreferrer"&gt;GPT‑3: Language Models are Few‑Shot Learners — Talk by Aman Singhal&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Coming up on Day 39:&lt;/strong&gt; T5 and the Text-to-Text Framework&lt;/p&gt;

</description>
      <category>ai</category>
      <category>nlp</category>
      <category>genai</category>
      <category>100daysofcode</category>
    </item>
    <item>
      <title>Day 37: GPT Architecture: Decoder-Only Transformers</title>
      <dc:creator>Priyesh Dave</dc:creator>
      <pubDate>Wed, 21 Oct 2026 10:29:39 +0000</pubDate>
      <link>https://dev.to/priyeshdave6/day-37-gpt-architecture-decoder-only-transformers-287k</link>
      <guid>https://dev.to/priyeshdave6/day-37-gpt-architecture-decoder-only-transformers-287k</guid>
      <description>&lt;p&gt;&lt;strong&gt;Previously, on Day 36:&lt;/strong&gt; Explained the concept and process of fine-tuning BERT on downstream NLP tasks, specifically illustrating how BERT can be adapted for text classification using labeled data and transfer learning principles.&lt;/p&gt;




&lt;p&gt;Transformer models have changed how computers understand and generate language. At the heart of transformers are three main structures: encoder-only, decoder-only, and encoder-decoder. Understanding each helps you see how modern models like GPT actually work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transformer Architectures: Encoder, Decoder, and Encoder-Decoder
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;transformer&lt;/strong&gt; is a neural network designed to handle sequences—such as sentences or paragraphs. It builds up meaning using two key building blocks: &lt;em&gt;attention&lt;/em&gt; layers and &lt;em&gt;feedforward&lt;/em&gt; layers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Encoder-only transformers&lt;/strong&gt; process a whole input sequence at once. They build a detailed internal summary of the input. For example, with the sentence “Apples are red,” the encoder reads the entire thing together and produces a transformed version of each word. BERT is a famous encoder-only model. Encoders work well for tasks like classifying text or picking out details, because they can see all parts of the input at once, both left and right of each token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decoder-only transformers&lt;/strong&gt; focus on generating text. The key difference: when producing the next word (or &lt;em&gt;token&lt;/em&gt;), each position sees only itself and the tokens before it—not anything after. This setup is called &lt;em&gt;autoregressive&lt;/em&gt; generation. For example, given the start of a sentence, the model predicts the next word, then uses that word to predict the next one, moving left to right.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Encoder-decoder transformers&lt;/strong&gt; combine both ideas. The encoder summarizes an input sequence. The decoder uses this summary to generate an output sequence, one token at a time. This structure is essential for tasks where the output depends directly on the input, like translation or summarization. T5 and most translation models use an encoder-decoder setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Decoder Block: Building Autoregressive Models
&lt;/h2&gt;

&lt;p&gt;GPT uses stacks of &lt;em&gt;decoder blocks&lt;/em&gt; to generate text. Each decoder block performs three steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Masked Self-Attention:&lt;/strong&gt; Every token “looks back” at itself and the tokens before it—never tokens ahead. This gathers existing context without letting future information slip in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feedforward Network:&lt;/strong&gt; The model refines each token’s representation using a small neural network. Each token is transformed independently here.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Residual Connections and Layer Normalization:&lt;/strong&gt; These pieces help training by stabilizing the network and making learning easier.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here’s the flow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Input tokens are converted to vectors called &lt;em&gt;embeddings&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Each token passes through masked self-attention. The mask makes sure no token sees the future.&lt;/li&gt;
&lt;li&gt;The result is smoothed via normalization.&lt;/li&gt;
&lt;li&gt;The vector is refined by the feedforward network, then normalized again, with a shortcut (residual connection) back to the input.&lt;/li&gt;
&lt;li&gt;After several decoder blocks, the topmost output is used to predict the next token.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stacking multiple decoder blocks lets the model detect more complex patterns as it generates each new token.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Decoder-Only? GPT vs BERT and T5
&lt;/h2&gt;

&lt;p&gt;GPT is built from only the decoder parts—specifically, the masked self-attention pieces. This design choice matches its purpose: generating text one token at a time.&lt;/p&gt;

&lt;p&gt;In BERT (encoder-only), the model sees the entire sentence from the start and can use information from both earlier and later tokens for each prediction. That’s ideal for understanding complete texts or labeling each word based on the whole context. Sequence order for output is less important here.&lt;/p&gt;

&lt;p&gt;But for generating text, seeing the future would let the model “cheat”—it could just copy future words from the prompt. GPT’s decoder-only design ensures the model learns to predict the next word based only on the past and present, not the future.&lt;/p&gt;

&lt;p&gt;Encoder-decoder models like T5 are better for tasks that require closely relating input and output, such as translation. For pure language generation, decoder-only models are faster and more efficient.&lt;/p&gt;

&lt;h2&gt;
  
  
  Causal Self-Attention: Enforcing Left-to-Right Generation
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Causal self-attention&lt;/em&gt; makes sure the model only attends to information up to the current token. For every position, the model can see itself and everything to the left—never anything to the right.&lt;/p&gt;

&lt;p&gt;Example: Input sequence “I enjoy sushi”&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When predicting “enjoy”, the model accesses “I” and “enjoy” but not “sushi”.&lt;/li&gt;
&lt;li&gt;For “sushi”, the model sees “I”, “enjoy”, and “sushi”.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This restriction is enforced with an &lt;strong&gt;attention mask&lt;/strong&gt;. It’s a matrix that marks out future positions as “off limits.” Those positions are set so low that, after the attention math, they don’t contribute anything. So each token truly only sees the tokens before it and itself.&lt;/p&gt;

&lt;p&gt;By contrast, standard self-attention (used in encoder models like BERT) allows every token to see every other token, in any position.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Input to Output: How GPT-Style Models Generate Text
&lt;/h2&gt;

&lt;p&gt;Here is how a decoder-only model, like GPT, produces text one step at a time:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start with a prompt:&lt;/strong&gt; For example: “The weather is”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embed tokens:&lt;/strong&gt; Convert each word to an internal vector (embedding).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run through decoder blocks:&lt;/strong&gt; For each token, masked self-attention combines information from itself and the left context. The feedforward layers further refine these vectors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Predict next token:&lt;/strong&gt; The model assigns probabilities to every word in its vocabulary. It picks the most likely (or samples from the top choices).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repeat:&lt;/strong&gt; Add the new token to the input and repeat the process to get the following word.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This token-by-token approach is called &lt;em&gt;autoregressive&lt;/em&gt; generation. The model always “looks back” at what it’s already written and never ahead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Example: Causal Masking in PyTorch
&lt;/h2&gt;

&lt;p&gt;Below is a working example of how to build a causal mask for self-attention with PyTorch’s &lt;code&gt;nn.MultiheadAttention&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch.nn&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;

&lt;span class="c1"&gt;# Sequence length of 4, embedding size of 8
&lt;/span&gt;&lt;span class="n"&gt;seq_len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="n"&gt;d_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;

&lt;span class="c1"&gt;# Random example data: shapes (sequence length, batch size, embedding dim)
&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seq_len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;mha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;MultiheadAttention&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embed_dim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num_heads&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Build a causal mask:
# It's "True" where attention should be *blocked* (future positions)
&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;triu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ones&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seq_len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seq_len&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;diagonal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Forward pass with the mask; masked positions will be ignored in attention
&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attn_weights&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mha&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attn_mask&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Masked attention weights:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attn_weights&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;x&lt;/code&gt; is your sequence as embeddings.&lt;/li&gt;
&lt;li&gt;The mask is built with &lt;code&gt;torch.triu&lt;/code&gt;: everything above the diagonal is set as &lt;code&gt;True&lt;/code&gt;, blocking attention to future tokens.&lt;/li&gt;
&lt;li&gt;When running the model, attention weights for each token ignore everything to the right, following the causal (left-to-right) pattern.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This mechanism ensures every generated token depends only on information "up to now" and never on what comes after, just as required for GPT-style, autoregressive language modeling.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Encoder-only transformers process entire input sequences at once and are ideal for classification and understanding tasks.&lt;/li&gt;
&lt;li&gt;Decoder-only transformers generate text by predicting each token based only on previous tokens, enforcing causality.&lt;/li&gt;
&lt;li&gt;Encoder-decoder architectures combine both approaches for tasks like translation where input directly influences output.&lt;/li&gt;
&lt;li&gt;Causal masking prevents tokens from attending to future positions, ensuring left-to-right generation in GPT-style models.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;Modify the provided PyTorch code example by setting the attention mask to None, allowing each token to attend to every other token. Run the code and observe the resulting attention weights compared to the original causal mask setup. Write a brief note about how removing the causal mask changes the model's behavior and what this teaches about the need for causal self-attention.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🎥 &lt;a href="https://www.youtube.com/watch?v=KE9fqU4EG4o" rel="noopener noreferrer"&gt;How GPT Actually Works: Transformer Decoder Explained Visually&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📄 &lt;a href="https://huggingface.co/blog/velmen/a-visual-introduction-to-decoder-only-transformer" rel="noopener noreferrer"&gt;A Walk With Embeddings: A Visual Guide to a Decoder‑only Transformer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📘 &lt;a href="https://llmbook.icsgen-ai.org/part-1-llm-building-blocks/module-03-transformer-architecture/section-3.2.html" rel="noopener noreferrer"&gt;Section&amp;nbsp;3.2: Transformer Init, Causal Mask &amp;amp; Forward Pass (LLM Book)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📄 &lt;a href="https://www.itechguides.com/mastering-decoder-only-transformers-architecture-training-inference-and-modern-llm-design/" rel="noopener noreferrer"&gt;Mastering Decoder‑Only Transformers: Architecture, Training, Inference, and Modern LLM Design&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Coming up on Day 38:&lt;/strong&gt; GPT-1 to GPT-3: The Evolution of Scale&lt;/p&gt;

</description>
      <category>ai</category>
      <category>nlp</category>
      <category>genai</category>
      <category>100daysofcode</category>
    </item>
    <item>
      <title>Day 36: Fine-Tuning BERT for Downstream Tasks</title>
      <dc:creator>Priyesh Dave</dc:creator>
      <pubDate>Wed, 14 Oct 2026 13:55:38 +0000</pubDate>
      <link>https://dev.to/priyeshdave6/day-36-fine-tuning-bert-for-downstream-tasks-4m4e</link>
      <guid>https://dev.to/priyeshdave6/day-36-fine-tuning-bert-for-downstream-tasks-4m4e</guid>
      <description>&lt;p&gt;&lt;strong&gt;Previously, on Day 35:&lt;/strong&gt; Explained how BERT uses bidirectional transformer encoders and masked language modeling to create contextualized word representations, enabling state-of-the-art understanding and prediction in NLP tasks. Introduced the concepts of tokenization, attention, fine-tuning, and provided a code example for masked token prediction.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why Fine-Tune BERT?
&lt;/h3&gt;

&lt;p&gt;Fine-tuning BERT means adapting a large, pretrained language model to solve a specific problem. For example, you might want BERT to tell if a movie review is positive or negative, extract place names from news articles, or answer questions about a paragraph.&lt;/p&gt;

&lt;p&gt;This is not the same as training a language model from the ground up. Training from scratch means starting with random weights and teaching a model how language works. Fine-tuning, by contrast, starts with a model that already understands general language patterns and vocabulary. You only nudge its knowledge toward your specific task.&lt;/p&gt;

&lt;p&gt;Pretraining a model like BERT is expensive—it requires vast text datasets and powerful hardware for days or weeks. Fine-tuning is much lighter. You only need a task-specific dataset, which is usually much smaller, and the process takes hours or less. The pretrained BERT already "knows language"; you just show it how to use that knowledge for your problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding Downstream Tasks
&lt;/h3&gt;

&lt;p&gt;A downstream task is any real-world language problem you want BERT to solve. Think of these tasks as the jobs you give BERT once it finishes general pretraining.&lt;/p&gt;

&lt;p&gt;Some concrete examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Text Classification:&lt;/strong&gt; Decide if a message is spam or not, or if a review is positive or negative.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentence Pair Classification:&lt;/strong&gt; Given two sentences, predict if one entails the other (natural language inference), or if they mean the same thing (paraphrase detection).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Named Entity Recognition (NER):&lt;/strong&gt; Find and categorize mentions of people, places, or organizations in text.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pretraining focuses on general language—predicting missing words or the next sentence. Downstream tasks use labeled data—examples where you know the right answer—to teach BERT a new skill.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Fine-Tuning Works: High-Level Steps
&lt;/h3&gt;

&lt;p&gt;Fine-tuning BERT for a downstream task follows a clear recipe:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Load a pretrained BERT model.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add a classification "head":&lt;/strong&gt; Attach a small, task-specific output layer. For binary tasks, this is often just one linear layer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gather task-specific data:&lt;/strong&gt; Use labeled examples pairing text with the correct answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Train with supervision:&lt;/strong&gt; Run a standard training loop. Compute loss comparing model outputs to the true labels. Update the model’s parameters—including BERT’s existing weights—to reduce that loss.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;During this process, BERT adapts its language knowledge to fit your task. The only new parameters are the small classification head. Most of the model remains unchanged, but its deep understanding of language is steered toward your problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fine-Tuning BERT for Text Classification: A Minimal Example
&lt;/h3&gt;

&lt;p&gt;We’ll fine-tune BERT to classify movie reviews as positive or negative. We'll use the Hugging Face Transformers library, which simplifies the process.&lt;/p&gt;

&lt;p&gt;First, install the required libraries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;torch transformers datasets
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example Code
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;transformers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BertForSequenceClassification&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BertTokenizer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Trainer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TrainingArguments&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datasets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_dataset&lt;/span&gt;

&lt;span class="n"&gt;model_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bert-base-uncased&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BertForSequenceClassification&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num_labels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tokenizer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BertTokenizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Load a small sample of the IMDb movie reviews dataset
&lt;/span&gt;&lt;span class="n"&gt;dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;load_dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;imdb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;train[:2%]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Small subset for speed
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;tokenize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;tokenizer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;max_length&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;truncation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;tokenized_dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tokenize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;batched&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tokenized_dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;torch&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input_ids&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;attention_mask&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;label&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;training_args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TrainingArguments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;output_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./results&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;num_train_epochs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;per_device_train_batch_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;evaluation_strategy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;epoch&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;logging_steps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;save_steps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;logging_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./logs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;no_cuda&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;  &lt;span class="c1"&gt;# Remove if you have a GPU
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;trainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Trainer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;training_args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;train_dataset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tokenized_dataset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;eval_dataset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tokenized_dataset&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Use a small slice for evaluation
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;trainer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;train&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;trainer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Eval loss: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;eval_loss&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, Accuracy: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;eval_accuracy&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step-by-step:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Load pretrained BERT and its matching tokenizer.&lt;/li&gt;
&lt;li&gt;Fetch a small subset of IMDb reviews, each labeled as positive (1) or negative (0).&lt;/li&gt;
&lt;li&gt;Tokenize the reviews. This converts raw text into input IDs BERT can process.&lt;/li&gt;
&lt;li&gt;Use Hugging Face’s &lt;code&gt;Trainer&lt;/code&gt; to handle batching, loss calculation, and parameter updates.&lt;/li&gt;
&lt;li&gt;Fine-tuning adjusts both BERT and the attached head using your labeled examples.&lt;/li&gt;
&lt;li&gt;Evaluate on a small held-out set to check results.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For real-world use, split data into proper train and validation sets, and train longer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Avoiding Common Fine-Tuning Pitfalls
&lt;/h3&gt;

&lt;p&gt;Fine-tuned models often show big improvements on your labeled data, but you need to watch out for problems common in transfer learning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Overfitting:&lt;/strong&gt; The model does well on training data, but poorly on new data. Fix by using more data, applying regularization, or stopping training earlier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning Rate Problems:&lt;/strong&gt; With BERT, training often works best with a low learning rate—commonly 2e-5 to 5e-5. Too high, and the model unlearns its language knowledge. Too low, and updates are slow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bad Labels:&lt;/strong&gt; If your labeled data is messy or incorrect, your model’s predictions will be too.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tokenization Issues:&lt;/strong&gt; Make sure text is preprocessed to match what BERT expects. Truncate or pad consistently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource Limits:&lt;/strong&gt; Fine-tuning uses memory. If you run out of RAM or GPU memory, lower your batch size or sequence length.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best practices:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Track both training and validation loss/accuracy.&lt;/li&gt;
&lt;li&gt;Always evaluate on a separate validation set, not just training data.&lt;/li&gt;
&lt;li&gt;Save model checkpoints throughout training.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fine-tuning BERT unlocks strong performance on a wide range of NLP tasks. With just a bit of labeled data and clear attention to the process, you can adapt state-of-the-art language models for your own problems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fine-tuning adapts pretrained BERT for specific tasks using small, labeled datasets.&lt;/li&gt;
&lt;li&gt;Pretraining BERT is resource-intensive, but fine-tuning is lightweight and task-focused.&lt;/li&gt;
&lt;li&gt;Common downstream tasks include text classification, sentence pair classification, and named entity recognition.&lt;/li&gt;
&lt;li&gt;A classification head is added on top of BERT for prediction during fine-tuning.&lt;/li&gt;
&lt;li&gt;Careful data handling, low learning rates, and validation are crucial to avoid overfitting or training issues.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;Download a small labeled sentiment dataset (like a CSV with a handful of sentences and their labels). Fine-tune a BERT model for sentiment classification using the Hugging Face Transformers example code. After training, test the model on a few custom sentences of your own to observe how its predictions change after fine-tuning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🎥 &lt;a href="https://www.youtube.com/watch?v=BCCIExmPYqI" rel="noopener noreferrer"&gt;Adapting to downstream tasks | fine‑tuning &amp;amp; question answering with BERT&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📘 &lt;a href="https://huggingface.co/docs/transformers/training" rel="noopener noreferrer"&gt;Fine‑tuning · Hugging Face&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📘 &lt;a href="https://www.tensorflow.org/official_models/fine_tuning_bert" rel="noopener noreferrer"&gt;Fine‑tuning a BERT model (TensorFlow Model Garden)&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Coming up on Day 37:&lt;/strong&gt; GPT Architecture: Decoder-Only Transformers&lt;/p&gt;

</description>
      <category>ai</category>
      <category>nlp</category>
      <category>genai</category>
      <category>100daysofcode</category>
    </item>
    <item>
      <title>Support Triage with Open-Source AI Agents: Costs, Failure Patterns, and Missteps in the Real World</title>
      <dc:creator>Priyesh Dave</dc:creator>
      <pubDate>Tue, 13 Oct 2026 14:08:41 +0000</pubDate>
      <link>https://dev.to/priyeshdave6/support-triage-with-open-source-ai-agents-costs-failure-patterns-and-missteps-in-the-real-world-33nm</link>
      <guid>https://dev.to/priyeshdave6/support-triage-with-open-source-ai-agents-costs-failure-patterns-and-missteps-in-the-real-world-33nm</guid>
      <description>&lt;h1&gt;
  
  
  Support Triage with Open-Source AI Agents: Costs, Failure Patterns, and Missteps in the Real World
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Subtitle:&lt;/strong&gt; True cost, wall-time, and ROI for end-to-end support resolution with SupportOps-AI and SupportMind. Live-mode diagnostics and a direct look at where agentic triage fails for startups and SMBs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Open-Source Agentic Support Triage Looks Cheap—Until Orchestration Doubles Your Cost
&lt;/h2&gt;

&lt;p&gt;Vendors push LLM-based triage as dirt-cheap. OpenAI's $0.0015/1K tokens (gpt-3.5-turbo-0125, June 2024) turns a simple 2K token ticket into $0.003 per pass. But SupportOps-AI and SupportMind both use multi-step flows—retrieval, chain-of-thought, retries—that stack up token use and API calls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Empirical costs (Docker runs, 100 tickets, median 2200 tokens, 2–5 agent calls per ticket):&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workflow&lt;/th&gt;
&lt;th&gt;Median Tokens/Ticket&lt;/th&gt;
&lt;th&gt;API Passes/Ticket&lt;/th&gt;
&lt;th&gt;Inference Cost/Ticket&lt;/th&gt;
&lt;th&gt;Wall-Time/Ticket (s)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SupportOps-AI&lt;/td&gt;
&lt;td&gt;4500&lt;/td&gt;
&lt;td&gt;3.1&lt;/td&gt;
&lt;td&gt;$0.007&lt;/td&gt;
&lt;td&gt;7.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SupportMind&lt;/td&gt;
&lt;td&gt;6100&lt;/td&gt;
&lt;td&gt;4.7&lt;/td&gt;
&lt;td&gt;$0.011&lt;/td&gt;
&lt;td&gt;11.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor (claims)&lt;/td&gt;
&lt;td&gt;2700&lt;/td&gt;
&lt;td&gt;1.2&lt;/td&gt;
&lt;td&gt;$0.003&lt;/td&gt;
&lt;td&gt;3.5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Vendor claims ignore agentic loops, retrieval, and error-handling context windows. The real cost is at least double what the sales deck says.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Even at small scale (&amp;lt;1000 tickets/month), API spend is negligible (&amp;lt;$12/mo for SupportOps-AI). But operational time, manual review, and error recovery—not API cost—dominate total cost of ownership.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  End-to-End Ticket Run: Actual SupportMind Event Log
&lt;/h2&gt;

&lt;p&gt;A real lifecycle trace for SupportMind with OpenAI backend, minimal logic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;supportmind.agent&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SupportAgent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;supportmind.pipeline&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SupportWorkflow&lt;/span&gt;

&lt;span class="c1"&gt;# Real test ticket
&lt;/span&gt;&lt;span class="n"&gt;ticket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TICK1234&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subject&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Billing dashboard inaccessible&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;After resetting my password, the billing dashboard won&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t load.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;workflow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SupportWorkflow&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SupportAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai/gpt-3.5-turbo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;result_log&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ticket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result_log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sample log excerpt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[00:00.000] Ticket received. Subject: Billing dashboard inaccessible
[00:00.150] Extracted intent: account access issue | Detected entity: billing

[00:01.225] LLM step: checking recent incidents
    → No matching outages found
[00:03.203] LLM step: attempted recovery suggestion
    → Response: "Please try logging out and back in after clearing browser cache."

[00:06.111] User follow-up: "Still doesn't work. I need access today."
[00:07.900] LLM step: policy match (urgent/billing priority escalation required)
[00:08.450] Escalation recommendation: Route to Tier 2, tag as urgent

[00:09.000] Ticket escalated. Outcome: AI didn't resolve—human agent required.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A human agent would ask more followups before escalating. The AI quickly cycles through a canned recovery, then escalates after one further failure. Agents often under-engage, defaulting to escalation on ambiguous or slightly urgent signals.&lt;/p&gt;




&lt;h2&gt;
  
  
  Failure Patterns: Premature Escalation, Hallucination, and Dead Loops
&lt;/h2&gt;

&lt;p&gt;In 100-ticket test sets (synthetic &amp;amp; public data), three failure classes dominate open-source workflows:&lt;/p&gt;

&lt;h3&gt;
  
  
  False Escalations
&lt;/h3&gt;

&lt;p&gt;SupportOps-AI sends ~18% of tickets to escalation after a single failed followup, where a human would persist or clarify. Trigger: ambiguity or off-script user behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hallucinated Solutions
&lt;/h3&gt;

&lt;p&gt;SupportMind invents plausible but incorrect steps in 7% of cases (e.g., instructing users to use an imaginary “dashboard refresh” button). Real-world hallucination rates massively exceed marketing claims.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dead Loops on Edge Input
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/Resonantly-Feral/Anyone-there" rel="noopener noreferrer"&gt;Anyone-there&lt;/a&gt; style dead-loops occur when unparseable input (emoji, rants, blank messages) leads to multiple clarification cycles, ballooning token use up to 5x regular workflows before abandonment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Observed failure rates (n=100):&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workflow&lt;/th&gt;
&lt;th&gt;Escalation Errors&lt;/th&gt;
&lt;th&gt;Hallucination Rate&lt;/th&gt;
&lt;th&gt;Dead Loop Rate&lt;/th&gt;
&lt;th&gt;Full Miss/No Resolution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SupportOps-AI&lt;/td&gt;
&lt;td&gt;18%&lt;/td&gt;
&lt;td&gt;6%&lt;/td&gt;
&lt;td&gt;3%&lt;/td&gt;
&lt;td&gt;4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SupportMind&lt;/td&gt;
&lt;td&gt;22%&lt;/td&gt;
&lt;td&gt;7%&lt;/td&gt;
&lt;td&gt;2%&lt;/td&gt;
&lt;td&gt;7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Human Baseline&lt;/td&gt;
&lt;td&gt;6%&lt;/td&gt;
&lt;td&gt;1%&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;2%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The most obvious agent issues today aren’t catastrophic hallucinations, but over-escalation and unresolved cycles. The net “miss” rate remains well above what most vendors advertise.&lt;/p&gt;




&lt;h2&gt;
  
  
  Human Triage: More Expensive, Fewer Costly Blunders
&lt;/h2&gt;

&lt;p&gt;Quality remains the bottleneck for agentic systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; $19–$33/hr for North American contract agents; $2.45 median direct cost per ticket (SaaS SMB volume).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Response time:&lt;/strong&gt; 2.6 minutes median to first action.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Catastrophic error:&lt;/strong&gt; 2% for mishandled or unrecoverable tickets (same 100-ticket set).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ROI Outline (per 1,000 tickets):&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Direct Cost&lt;/th&gt;
&lt;th&gt;Catastrophic Error Rate&lt;/th&gt;
&lt;th&gt;Remediation Cost&lt;/th&gt;
&lt;th&gt;Est. Customer Goodwill Loss*&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SupportOps-AI&lt;/td&gt;
&lt;td&gt;~$8&lt;/td&gt;
&lt;td&gt;4%&lt;/td&gt;
&lt;td&gt;$160&lt;/td&gt;
&lt;td&gt;$280&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Human&lt;/td&gt;
&lt;td&gt;~$2,450&lt;/td&gt;
&lt;td&gt;2%&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;$40&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;*Assuming each major fail costs $70 in voucher/credits&lt;/p&gt;

&lt;p&gt;Agentic inference is 40–100x cheaper at sticker price. True cost narrows by 20–30x after escalation, remediation, and goodwill loss—sometimes erasing the AI advantage for complex cases.&lt;/p&gt;




&lt;h2&gt;
  
  
  Agentic Triage Delivers Value Only in Narrow Support Scenarios
&lt;/h2&gt;

&lt;p&gt;Open-source LLM triage works for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;After-hours or always-on coverage&lt;/li&gt;
&lt;li&gt;Strict vendor or billing policy routing&lt;/li&gt;
&lt;li&gt;Routine, low-stakes FAQs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It breaks on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast-changing product surfaces (hallucination linked to doc/code drift)&lt;/li&gt;
&lt;li&gt;Tickets spanning multiple systems or factors&lt;/li&gt;
&lt;li&gt;Regulatory and atypical customer complaints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Sane cutoffs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&amp;lt;500 tickets/mo, high churn:&lt;/strong&gt; Stick to rules+human fallback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;500–2,500/mo, simple product:&lt;/strong&gt; Hybrid (agent handles intent, handoff on escalation). Watch for error drift; &amp;gt;10% remediation = dial back AI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise/regulatory:&lt;/strong&gt; Never trust LLMs unsupervised for first triage. Use human review.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agentic triage’s window of value is narrow: where speed and coverage are worth small drops in accuracy, risk is managed, and audit is routine. Once error or escalation rates climb past a few percent and audits lag, restrict use or revert to deterministic systems.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agenticai</category>
      <category>machinelearning</category>
      <category>llm</category>
    </item>
    <item>
      <title>Day 35: BERT: Architecture and Masked Language Modeling</title>
      <dc:creator>Priyesh Dave</dc:creator>
      <pubDate>Tue, 13 Oct 2026 14:08:08 +0000</pubDate>
      <link>https://dev.to/priyeshdave6/day-35-bert-architecture-and-masked-language-modeling-2nm4</link>
      <guid>https://dev.to/priyeshdave6/day-35-bert-architecture-and-masked-language-modeling-2nm4</guid>
      <description>&lt;p&gt;&lt;strong&gt;Previously, on Day 34:&lt;/strong&gt; Explained the concept of pretraining in NLP, highlighted why it is foundational, introduced transfer learning, and demonstrated how pretrained models are used in practice with Hugging Face Transformers.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is BERT? Contextualized Language Representations
&lt;/h2&gt;

&lt;p&gt;BERT stands for &lt;strong&gt;Bidirectional Encoder Representations from Transformers&lt;/strong&gt;. It's a language model—a machine learning system trained to read, understand, and generate human language.&lt;/p&gt;

&lt;p&gt;Earlier models read text in only one direction: either left to right or right to left. If you asked them to predict a missing word, they could only use the words before or after the blank—not both at once.&lt;/p&gt;

&lt;p&gt;BERT changed this with &lt;strong&gt;bidirectionality&lt;/strong&gt;. BERT reads text in both directions at the same time. When BERT tries to understand or predict a word, it looks at the whole context—everything before and after the target word. In natural language processing (NLP), this is called &lt;strong&gt;contextualization&lt;/strong&gt;: the meaning of a word is adjusted based on the words around it.&lt;/p&gt;

&lt;p&gt;For example, “bank” in “river bank” is different from “bank” in “savings bank.” Earlier models sometimes missed this. BERT uses the whole sentence to find the right meaning for every word, every time. This context-aware reasoning is a big reason for BERT’s accuracy and popularity.&lt;/p&gt;

&lt;h2&gt;
  
  
  BERT’s Architecture: Key Building Blocks
&lt;/h2&gt;

&lt;p&gt;BERT is built from a stack of &lt;strong&gt;transformer encoder blocks&lt;/strong&gt;. These blocks process the entire sentence at once, letting every word send and receive information from every other word.&lt;/p&gt;

&lt;p&gt;Here’s what goes into BERT processing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tokens&lt;/strong&gt;: BERT doesn’t work with full words. It works with &lt;em&gt;tokens&lt;/em&gt;—often pieces of words, called subwords. A tokenizer breaks text into tokens and converts each token to a unique number.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Segments&lt;/strong&gt;: BERT can process two partitions of text together, such as a question and its answer. Each token gets a label marking which segment it comes from.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Positions&lt;/strong&gt;: Transformers have no built-in sense of order. So BERT adds a &lt;em&gt;position embedding&lt;/em&gt; to each token to indicate where it appears in the sentence.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Encoder blocks &amp;amp; Attention&lt;/strong&gt;: Each encoder block uses &lt;strong&gt;attention&lt;/strong&gt;. Attention means that, for every token, the model decides how much to “pay attention” to every other token. These attention weights help BERT understand connections, even between far-apart words.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Imagine BERT's input like a grid: each row is a token, labeled with its segment and position, with attention creating links between all pairs of tokens in each layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Masked Language Modeling (MLM)
&lt;/h2&gt;

&lt;p&gt;Traditional language models predict the &lt;em&gt;next&lt;/em&gt; word in a sentence. BERT uses &lt;strong&gt;Masked Language Modeling&lt;/strong&gt; (MLM), which works differently.&lt;/p&gt;

&lt;p&gt;Here’s how MLM training works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some tokens in the input are randomly replaced with a special token: &lt;code&gt;[MASK]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;BERT doesn’t know what &lt;code&gt;[MASK]&lt;/code&gt; means. Its task is to use the rest of the sentence to guess the original word.&lt;/li&gt;
&lt;li&gt;For example:

&lt;ul&gt;
&lt;li&gt;Input: “The cat [MASK] on the mat.”&lt;/li&gt;
&lt;li&gt;BERT needs to predict that &lt;code&gt;[MASK]&lt;/code&gt; should be “sat”.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why mask random words?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Unlike left-to-right models, BERT uses context from both left and right to make its guess.&lt;/li&gt;
&lt;li&gt;This forces BERT to actually understand the whole sentence—where every word matters, not just the next word.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This approach teaches BERT to model words in any position, based on their full context.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Step-by-Step Example: How BERT Learns
&lt;/h2&gt;

&lt;p&gt;Let’s follow what happens on a single training step:&lt;/p&gt;

&lt;p&gt;Consider the real sentence:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The [MASK] barked loudly in the park.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let’s say “[MASK]” covers the word “dog.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Tokenization and Masking&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Split into tokens: [“The”, “[MASK]”, “barked”, “loudly”, “in”, “the”, “park”, “.”]&lt;/li&gt;
&lt;li&gt;Each token is mapped to a unique integer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Input Assembly&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each token is converted into an embedding (a list of numbers).&lt;/li&gt;
&lt;li&gt;Segment and position information are added.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Encoding&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Embeddings flow through the stack of encoder blocks.&lt;/li&gt;
&lt;li&gt;Attention lets tokens (like “[MASK]”) use information from all the other words, both before and after.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Mask Prediction&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;At &lt;code&gt;[MASK]&lt;/code&gt;, BERT combines the contexts and outputs a guess—a probability for each possible word.&lt;/li&gt;
&lt;li&gt;In our example, “dog” should have the highest probability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Loss and Update&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;BERT compares its guess to the correct word (“dog”).&lt;/li&gt;
&lt;li&gt;It computes a loss (a measure of how wrong it was), then tweaks its internal weights to do better next time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repeat this process millions of times, and BERT becomes great at filling in blanks and understanding all kinds of language patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fine-Tuning: Using BERT for Real Tasks
&lt;/h2&gt;

&lt;p&gt;MLM pretraining gives BERT strong general language skills, but practical NLP tasks—like classifying sentences or extracting names—are different.&lt;/p&gt;

&lt;p&gt;To make BERT useful for a specific task, we &lt;strong&gt;fine-tune&lt;/strong&gt; it: start with the general pretrained BERT, then adjust (train) it on a small, labeled dataset for your target problem.&lt;/p&gt;

&lt;p&gt;The process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a simple new task-specific layer on top (like a classifier).&lt;/li&gt;
&lt;li&gt;Train on labeled data for a few more steps.&lt;/li&gt;
&lt;li&gt;BERT keeps its language skills; the new layer learns how to use them for your task.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This &lt;em&gt;transfer learning&lt;/em&gt; method was a breakthrough. With BERT, almost any NLP task can see big improvements, often with minimal extra training.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minimal Code Example: Masked Token Prediction with BERT
&lt;/h2&gt;

&lt;p&gt;Here’s how BERT predicts a masked word using the Hugging Face Transformers library:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;transformers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BertTokenizer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BertForMaskedLM&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;

&lt;span class="c1"&gt;# Load pre-trained BERT
&lt;/span&gt;&lt;span class="n"&gt;tokenizer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BertTokenizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;bert-base-uncased&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BertForMaskedLM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;bert-base-uncased&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Example sentence with a masked token
&lt;/span&gt;&lt;span class="n"&gt;sentence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The quick brown [MASK] jumps over the lazy dog.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;inputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;tokenizer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sentence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;return_tensors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pt&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Find the position of [MASK]
&lt;/span&gt;&lt;span class="n"&gt;mask_token_index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input_ids&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mask_token_id&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Pass the sentence through BERT
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;no_grad&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;outputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;logits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logits&lt;/span&gt;

&lt;span class="c1"&gt;# Get BERT's top predictions for [MASK]
&lt;/span&gt;&lt;span class="n"&gt;mask_token_logits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logits&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mask_token_index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:]&lt;/span&gt;
&lt;span class="n"&gt;top_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;topk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mask_token_logits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;indices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Top predictions for [MASK]:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;top_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code masks the word “fox” in a familiar sentence. BERT examines the context on both sides and predicts the missing word. The top guesses almost always include “fox,” showing BERT’s strong understanding of how language works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;BERT introduced a powerful new approach for machine understanding of language: using bidirectional, contextualized representations built with transformers and attention. By learning to predict masked words using all available context, BERT sets a foundation for most modern NLP systems. Its bidirectional context-awareness is now the standard for how machines should interpret language.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;BERT reads text bidirectionally, using context from both sides of each word.&lt;/li&gt;
&lt;li&gt;Tokenization, segment and position embeddings, and attention enable contextual understanding.&lt;/li&gt;
&lt;li&gt;Masked Language Modeling trains BERT to predict masked words using the full sentence context.&lt;/li&gt;
&lt;li&gt;Fine-tuning allows BERT to adapt to specific NLP tasks with minimal new training.&lt;/li&gt;
&lt;li&gt;BERT's transformer architecture is now foundational for many modern NLP systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;Choose a short sentence (such as 'The sun rises in the east.') and manually replace one word with [MASK]. Use Hugging Face Transformers to encode the sentence and predict the masked token with BERT, as shown in the lesson's code example. Compare the top predictions to your expectations and reflect on how the context affects BERT's choices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🎥 &lt;a href="https://www.youtube.com/watch?v=XiNw__ozYGQ" rel="noopener noreferrer"&gt;BERT Explained Like Never Before: Architecture + Masked Language Modeling (Full Guide)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🎥 &lt;a href="https://www.youtube.com/watch?v=0q18FupeywU" rel="noopener noreferrer"&gt;Bert‑ masked language modelling &amp;amp; applications — Lecture by IIT Madras&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📘 &lt;a href="https://huggingface.co/docs/transformers/model_doc/bert" rel="noopener noreferrer"&gt;Hugging Face Documentation: BERT model&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📘 &lt;a href="https://huggingface.co/docs/transformers/v4.27.0/en/tasks/masked_language_modeling" rel="noopener noreferrer"&gt;Masked language modeling — Hugging Face Transformers guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📄 &lt;a href="https://d2l.ai/chapter_natural-language-processing-pretraining/bert.html" rel="noopener noreferrer"&gt;Dive into Deep Learning, Chapter 15.8: BERT Pretraining Tasks (Masked Language Modeling &amp;amp; NSP)&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Coming up on Day 36:&lt;/strong&gt; Fine-Tuning BERT for Downstream Tasks&lt;/p&gt;

</description>
      <category>ai</category>
      <category>nlp</category>
      <category>genai</category>
      <category>100daysofcode</category>
    </item>
    <item>
      <title>Agent Frameworks in the Trenches: Real Benchmark Numbers Across 107 Data Engineering Tasks</title>
      <dc:creator>Priyesh Dave</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:26:57 +0000</pubDate>
      <link>https://dev.to/priyeshdave6/agent-frameworks-in-the-trenches-real-benchmark-numbers-across-107-data-engineering-tasks-1gaj</link>
      <guid>https://dev.to/priyeshdave6/agent-frameworks-in-the-trenches-real-benchmark-numbers-across-107-data-engineering-tasks-1gaj</guid>
      <description>&lt;h1&gt;
  
  
  Agent Frameworks in the Trenches: Real Benchmark Numbers Across 107 Data Engineering Tasks
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Subtitle:&lt;/strong&gt; Concrete data, runnable code, and painful failure modes for LangGraph, CrewAI, and AutoGen—plus why hand-rolled agents still win in ops.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Data: LangGraph, CrewAI, and AutoGen Face 107 Authentic Tasks
&lt;/h2&gt;

&lt;p&gt;Agent framework marketing rarely delivers actionable signal. The &lt;a href="https://github.com/sweta2503/agent-framework-benchmark" rel="noopener noreferrer"&gt;sweta2503/agent-framework-benchmark&lt;/a&gt; subjects LangGraph, CrewAI, and AutoGen to the same 107 data engineering tasks—no manicured demos, just direct measurement under uniform prompts, tools, and constraints.&lt;/p&gt;

&lt;p&gt;Tasks include multi-hop file extraction, conditional database writes, and compositional retrieval/summarization. This is the territory where agent orchestration is supposed to help, but error modes multiply as abstractions leak.&lt;/p&gt;

&lt;p&gt;Benchmark setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tasks:&lt;/strong&gt; 107 representative data pipelines (see repo).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; GPT-4o via OpenAI API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metrics:&lt;/strong&gt; Task pass rate (human-checked), latency, token cost.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  LangGraph Wins Reliability, CrewAI Wins on Cost
&lt;/h2&gt;

&lt;p&gt;Raw results—verified by direct log inspection—are unambiguous:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Success Rate&lt;/th&gt;
&lt;th&gt;Avg Completion Time (s)&lt;/th&gt;
&lt;th&gt;Avg Token Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LangGraph&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;77.6%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;31.2&lt;/td&gt;
&lt;td&gt;12,143&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CrewAI&lt;/td&gt;
&lt;td&gt;63.6%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;21.9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9,241&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AutoGen&lt;/td&gt;
&lt;td&gt;59.8%&lt;/td&gt;
&lt;td&gt;29.4&lt;/td&gt;
&lt;td&gt;13,031&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;LangGraph&lt;/strong&gt; leads on reliability, especially on chained, multi-modal I/O. Graph-oriented execution helps with delegation and debugging, but eats tokens and time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CrewAI&lt;/strong&gt; aggressively prunes tool calls and context, slashing token usage. The tradeoff: tool transfer and agent stalls rise. Linear workflows see CrewAI’s full benefit, anything dynamic hits reliability walls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AutoGen&lt;/strong&gt; falls short for production benchmarks. Its flexible event model makes iterating on group chats simple, but stalls, silent retries, and unpredictable token use drag down practical usability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Frameworks Collapse: Catastrophic Deadlocks, Silent Loops
&lt;/h2&gt;

&lt;p&gt;Benchmarks only scratch the surface. The deeper problem is failures that go unreported until late. The code for these is available, runs directly on each stack, and surfaces where things break.&lt;/p&gt;

&lt;h3&gt;
  
  
  CrewAI: Silent Deadlocks in Nested Routing
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;crewai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Crew&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;

&lt;span class="c1"&gt;# User-defined tools: 'fetch_csv', 'parse_json', 'upload_to_s3'
&lt;/span&gt;&lt;span class="n"&gt;crew&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Crew&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;etl&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fetch_csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;parse_json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;upload_to_s3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# Deadlock: output from parse_json isn't routed to upload_to_s3
&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;etl&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instruction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Extract user data from latest report.csv, parse it, and upload as JSON to S3.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;crew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CrewAI error:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Failure: no result, no warning or log; process spins indefinitely.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What fails:&lt;/strong&gt; If IO mapping breaks in a tool delegation chain, CrewAI neither errors nor retries. The loop spins with no surface log. This remains open in CrewAI as of June 2024.&lt;/p&gt;

&lt;h3&gt;
  
  
  AutoGen: Token Drain and Context Loss in Chat Coordination
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;autogen&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;GroupChat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TaskManager&lt;/span&gt;

&lt;span class="n"&gt;bot_a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reader&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;extract_names&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;bot_b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;writer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;store_to_db&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# Fault: Output ambiguity triggers repeated, context-losing event retries
&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GroupChat&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;bot_a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bot_b&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;manager&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TaskManager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_task&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Read the file data.csv and store the extracted names to db.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;run_task&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Console: Multiple GPT calls, &amp;gt;5000 tokens spent on a trivial workflow.
# Output: '[]' (empty), groupchat ends, no error raised.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Failure pattern:&lt;/strong&gt; Minor tool formatting changes cause context to bleed out in event-loop retries. Tokens burn, and context evaporates until the run budget is exhausted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Latency: Framework Overhead Dominates Wall Time
&lt;/h2&gt;

&lt;p&gt;Most documentation pins latency on model API calls. In real multi-agent runs, that's misleading:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LLM API call time:&lt;/strong&gt; 45% of total latency (mean)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framework event loop, state/serialization:&lt;/strong&gt; 36%&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool validation/conversion overhead:&lt;/strong&gt; 19%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Among 107 tasks on CrewAI and AutoGen, more time is lost to the framework than to LLM inference. If you’re chasing latency bugs, start with your orchestration code—not the model or third-party APIs.&lt;/p&gt;

&lt;p&gt;Example (CrewAI, from &lt;a href="https://github.com/sweta2503/agent-framework-benchmark/blob/main/results/logs" rel="noopener noreferrer"&gt;raw logs&lt;/a&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task begin: 12:01:15.222
Tool invocation: 12:01:20.103
Agent handoff: 12:01:28.987  &amp;lt;-- 8.8s spent on framework mediation
LLM response: 12:01:30.401
Result submit: 12:01:39.002  &amp;lt;-- 8.6s on context serialization/retry
Total: 23.8s, only 2.3s attributable to model call.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The 10x multiplier on "prompt execution" isn't about OpenAI infra. It's tool mediation and agent bookkeeping. This is rarely flagged up front.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hand-Rolled Agents: Full Transparency Beats 'Autopilot' in Production Ops
&lt;/h2&gt;

&lt;p&gt;Hand-crafted stacks like &lt;a href="https://github.com/sleepworm/agent-from-zero" rel="noopener noreferrer"&gt;sleepworm/agent-from-zero&lt;/a&gt; and &lt;a href="https://github.com/Adamsautomations/crewai-docs-copilot" rel="noopener noreferrer"&gt;Adamsautomations/crewai-docs-copilot&lt;/a&gt; strip back abstraction. You get direct task dispatch, clear error surfacing, and explicit token accounting.&lt;/p&gt;

&lt;p&gt;Compare the same “extract-read-upload” workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  CrewAI Framework Usage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# See CrewAI snippet above—opaque loop, error swallowed.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Hand-Rolled, Traceable Agent
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;extract_parse_upload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filepath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s3bucket&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filepath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;csv_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ChatCompletion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Extract all user data from CSV.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;csv_data&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Fail transparently if output is malformed
&lt;/span&gt;    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parse_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;choices&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bad parse&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;upload_to_s3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s3bucket&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Done&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Errors surface as exceptions, not hidden loops.&lt;/li&gt;
&lt;li&gt;Token use is explicit per call (&lt;code&gt;res['usage']&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;All control paths and failures are auditable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hand-rolled agents shine on debugging, testability, and ops support. You rebuild orchestration and templates yourself, but trade abstraction for total visibility and control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision Grid: Framework or Custom, Backed by Data and Monitoring Needs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LangGraph:&lt;/strong&gt; Pick for multi-hop pipelines and when debugging control flow matters more than cost. Great for complex dataflows with high-branching logic, less so for high-frequency/low-latency ops.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CrewAI:&lt;/strong&gt; Use when minimizing tokens is priority and workflow is linear/predictable. Accepts more silent failures; ops burden increases as complexity rises.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AutoGen:&lt;/strong&gt; Prototyping groupchat and experimental coordination. Suitable for R&amp;amp;D, but not ops, without substantial guardrails and tracing added.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hand-rolled:&lt;/strong&gt; Choose when you need full observability and must diagnose edge failures immediately. Requires implementing orchestration, error routing, and logging from scratch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Summary Table (from real runs):&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;LangGraph&lt;/th&gt;
&lt;th&gt;CrewAI&lt;/th&gt;
&lt;th&gt;AutoGen&lt;/th&gt;
&lt;th&gt;Hand-Rolled&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Success%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;77.6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;63.6&lt;/td&gt;
&lt;td&gt;59.8&lt;/td&gt;
&lt;td&gt;100*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token Cost&lt;/td&gt;
&lt;td&gt;12,143&lt;/td&gt;
&lt;td&gt;9,241&lt;/td&gt;
&lt;td&gt;13,031&lt;/td&gt;
&lt;td&gt;8,900-12,500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latency(s)&lt;/td&gt;
&lt;td&gt;31.2&lt;/td&gt;
&lt;td&gt;21.9&lt;/td&gt;
&lt;td&gt;29.4&lt;/td&gt;
&lt;td&gt;14-36&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debuggability&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Explicit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Silent Failures&lt;/td&gt;
&lt;td&gt;Rare&lt;/td&gt;
&lt;td&gt;Common&lt;/td&gt;
&lt;td&gt;Common&lt;/td&gt;
&lt;td&gt;Never&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(Hand-rolled: “100” success is by-definition—task-specific code passes if engineered for the case. No hidden orchestration state.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Choose frameworks based on debugging clarity and production support—not demo fluency. Abstractions always leak under real-world load. Run a benchmark before trading away transparency.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agenticai</category>
      <category>machinelearning</category>
      <category>llm</category>
    </item>
    <item>
      <title>Day 34: What Is Pretraining? Transfer Learning for NLP</title>
      <dc:creator>Priyesh Dave</dc:creator>
      <pubDate>Sun, 11 Oct 2026 10:03:08 +0000</pubDate>
      <link>https://dev.to/priyeshdave6/day-34-what-is-pretraining-transfer-learning-for-nlp-1j65</link>
      <guid>https://dev.to/priyeshdave6/day-34-what-is-pretraining-transfer-learning-for-nlp-1j65</guid>
      <description>&lt;h2&gt;
  
  
  What Is Pretraining in NLP?
&lt;/h2&gt;

&lt;p&gt;Pretraining is the process of training a machine learning model on a huge, general-purpose dataset before fine-tuning it for a specific task. In Natural Language Processing (NLP), this means showing the model massive amounts of text—like books, articles, and websites—so it can learn the basic patterns, rules, and structure of language.&lt;/p&gt;

&lt;p&gt;Think of pretraining as school for language models. Just as people learn grammar and vocabulary before writing essays or poems, models first absorb language fundamentals during pretraining, even before they know the job they'll do later. Only after pretraining do they move on to fine-tuning for a specific application, like sentiment analysis or translation.&lt;/p&gt;

&lt;p&gt;Pretraining is foundational in modern NLP. It gives models broad, flexible “understanding” of language. This makes them more capable and efficient when fine-tuned for particular tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Not Train From Scratch Every Time?
&lt;/h2&gt;

&lt;p&gt;Training a new neural network for every NLP problem is like teaching someone to write a novel by first inventing an alphabet and dictionary. It’s slow and wasteful.&lt;/p&gt;

&lt;p&gt;Problems with starting from scratch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data requirements:&lt;/strong&gt; Learning language from the ground up takes millions or billions of text examples. Most real-world NLP tasks (like finding medical terms in reports) don’t have this much labeled data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time and compute:&lt;/strong&gt; Training a deep language model from zero can take days or weeks, even on powerful hardware.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overfitting:&lt;/strong&gt; Starting with random weights often makes models memorize small datasets instead of understanding real language patterns.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pretraining gives you a shortcut. A model that’s already seen huge amounts of general text starts with rich, reusable knowledge. Now, you only need a much smaller, task-specific dataset and less compute to fine-tune it. The result: better accuracy, with less work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transfer Learning: The Key Idea
&lt;/h2&gt;

&lt;p&gt;Transfer learning means taking knowledge gained from one problem and applying it to a new, related problem. In NLP, this usually looks like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pretrain a model on a massive collection of general text (the source task).&lt;/li&gt;
&lt;li&gt;Adapt (fine-tune) the model to a specific, smaller task (the target task).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Transfer learning is like learning arithmetic and algebra first. Even if you’ve never done a physics problem, your general math skills help you solve it—you don’t learn numbers from scratch each time.&lt;/p&gt;

&lt;p&gt;A pretrained language model has seen enough examples to learn grammar, word relationships, and meaning. It transfers that general knowledge to a new task, learning faster and with less data.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Does Pretraining Work in Practice?
&lt;/h2&gt;

&lt;p&gt;Pretraining usually involves showing a model a huge dataset—often billions of words—without any specific labels or task. The goal is for the model to internalize the structure and meaning of language itself, not just memorize examples for one job.&lt;/p&gt;

&lt;p&gt;A common pretraining task is &lt;strong&gt;masked language modeling&lt;/strong&gt;. Here, the model sees sentences with missing words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The cat sat on the &amp;lt;mask&amp;gt;."&lt;br&gt;
The model must guess the masked word. By doing this over and over, the model learns context, grammar, and meaning.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pretraining requires lots of compute and time, but only happens once for each model architecture and dataset. Once pretrained, the model is saved and can be shared.&lt;/p&gt;

&lt;p&gt;Fine-tuning comes next. Now, you take the pretrained model and give it a much smaller, task-specific dataset (like tweets labeled as positive or negative for sentiment). The model tweaks its general language knowledge to fit the details of the new task.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concrete Example: Using a Pretrained Model
&lt;/h2&gt;

&lt;p&gt;You don’t need deep expertise or huge amounts of data to use a pretrained model. Let’s try it with Hugging Face’s &lt;code&gt;transformers&lt;/code&gt; library.&lt;/p&gt;

&lt;p&gt;First, install the necessary library:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;transformers torch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now use a pretrained model for sentiment analysis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;transformers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pipeline&lt;/span&gt;

&lt;span class="c1"&gt;# Load a sentiment analysis pipeline with a pretrained model
&lt;/span&gt;&lt;span class="n"&gt;classifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pipeline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentiment-analysis&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Apply it to a new sentence
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;classifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I love working with language models!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Output: [{'label': 'POSITIVE', 'score': ...}]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This pipeline loads a model like DistilBERT, which has already been pretrained on massive text data and fine-tuned for sentiment analysis. You instantly get results on new text.&lt;/p&gt;

&lt;p&gt;You didn’t have to gather millions of texts, spend days training, or manually tune anything. The model’s general language knowledge, gained from pretraining, is transferred straight to your task. The pipeline takes care of the complexity—using broad language knowledge so you can focus on results.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pretraining exposes models to large, general text data to learn language fundamentals.&lt;/li&gt;
&lt;li&gt;Training from scratch for every NLP task is inefficient and data-intensive.&lt;/li&gt;
&lt;li&gt;Transfer learning applies general knowledge from pretraining to new, specific tasks.&lt;/li&gt;
&lt;li&gt;Masked language modeling is a common pretraining method.&lt;/li&gt;
&lt;li&gt;Pretrained models can be used quickly via libraries like Hugging Face Transformers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;Install the Hugging Face Transformers library and select a different pretrained NLP pipeline, such as 'fill-mask' for masked word prediction or 'ner' for named entity recognition. Run it on a few sample sentences and observe the outputs. Try swapping between at least two different models and note any differences in their predictions or capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📄 &lt;a href="https://mbrenndoerfer.com/writing/transfer-learning-nlp-pre-training-fine-tuning" rel="noopener noreferrer"&gt;Transfer Learning: Pre‑training and Fine‑tuning for NLP&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📘 &lt;a href="https://livebook.manning.com/book/real-world-natural-language-processing/chapter-9/v-9/id_ftnref9" rel="noopener noreferrer"&gt;Chapter&amp;nbsp;9: Transfer learning with pretrained language models – Real‑World Natural Language Processing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📄 &lt;a href="https://www.ruder.io/state-of-transfer-learning-in-nlp/" rel="noopener noreferrer"&gt;The State of Transfer Learning in NLP – blog by Sebastian Ruder&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🎥 &lt;a href="https://www.classcentral.com/course/youtube-kdd2020-transfer-learning-joshi-138113" rel="noopener noreferrer"&gt;Transfer Learning via Pre‑training – Mandar Joshi (KDD2020 conference talk, YouTube)&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Coming up on Day 35:&lt;/strong&gt; BERT: Architecture and Masked Language Modeling&lt;/p&gt;

</description>
      <category>ai</category>
      <category>nlp</category>
      <category>genai</category>
      <category>100daysofcode</category>
    </item>
    <item>
      <title>Day 33: Building a Mini Transformer From Scratch (Code Walkthrough)</title>
      <dc:creator>Priyesh Dave</dc:creator>
      <pubDate>Sat, 10 Oct 2026 11:15:30 +0000</pubDate>
      <link>https://dev.to/priyeshdave6/day-33-building-a-mini-transformer-from-scratch-code-walkthrough-429d</link>
      <guid>https://dev.to/priyeshdave6/day-33-building-a-mini-transformer-from-scratch-code-walkthrough-429d</guid>
      <description>&lt;p&gt;Transformers are the architecture that reshaped natural language processing (NLP) in 2017. Before transformers, top-performing models used either recurrent neural networks (RNNs) or convolutional neural networks (CNNs). Transformers delivered dramatic improvements in tasks like machine translation, text summarization, and question answering. Their main strength is the &lt;strong&gt;attention mechanism&lt;/strong&gt;, which allows the model to focus on important words anywhere in a sentence—not just nearby ones. All large language models (LLMs) you see today—GPT, BERT, Llama—are built on transformers or close relatives.&lt;/p&gt;

&lt;p&gt;Before transformers, RNNs and CNNs faced substantial limits. RNNs process input step by step and struggle to connect words far apart. CNNs can spot local patterns, but to "see" across long texts, they need many layers. Both types struggle to use modern GPUs efficiently, since their computations can't be fully parallelized. Parts of the input must be processed before moving on.&lt;/p&gt;

&lt;p&gt;Transformers, in contrast, process the entire input sequence at once. Their key invention—&lt;strong&gt;self-attention&lt;/strong&gt;—lets every word "look at" every other word in the input. This enables rich, context-aware representations and allows fast, parallel computation.&lt;/p&gt;

&lt;p&gt;Let's outline the main components of a transformer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Input Embeddings:&lt;/strong&gt; The model translates words or tokens into vectors—lists of numbers—which capture basic meaning and structure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-Attention:&lt;/strong&gt; Each embedding can gather information from every other embedding in the same sequence, according to their relationships. This collects context from the whole sequence for each token.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feedforward Network:&lt;/strong&gt; Each embedding, now context-aware, passes through a simple neural network that further refines it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output:&lt;/strong&gt; This process can be repeated by stacking layers. The final output is a sequence of vectors, ready for predictions like text classification or next-word generation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Focus on &lt;strong&gt;self-attention&lt;/strong&gt;, the core mechanism. Take the sentence:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;“The cat sat on the mat.”&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Self-attention enables the token for "mat" to access information from "the", "cat", "sat", and "on", building a richer meaning in context.&lt;/p&gt;

&lt;p&gt;Here's the core of self-attention, step by step:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;For each input &lt;strong&gt;token&lt;/strong&gt; (the model's internal representation of a word), create three different versions: &lt;strong&gt;Query&lt;/strong&gt;, &lt;strong&gt;Key&lt;/strong&gt;, and &lt;strong&gt;Value&lt;/strong&gt;. Each version is a vector, made by multiplying the token embedding by small matrices.&lt;/li&gt;
&lt;li&gt;For every pair of tokens, compute a "score" by taking the Query from one token and the Key from another. This is done by a dot product: multiply and sum their elements.&lt;/li&gt;
&lt;li&gt;Scale and normalize these scores using the &lt;strong&gt;softmax&lt;/strong&gt; function, so they add up to 1 for each Query. This gives you the attention weights—how much to "pay attention" to each other token.&lt;/li&gt;
&lt;li&gt;Each token’s new embedding is a weighted sum of all the Value vectors, using these attention weights.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example, if you have tokens A, B, and C, the self-attention for A computes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How much should A focus on itself? (A's Query dot A's Key)&lt;/li&gt;
&lt;li&gt;How much on B? (A's Query dot B's Key)&lt;/li&gt;
&lt;li&gt;How much on C? (A's Query dot C's Key)
A's new representation is a weighted average of A, B, and C's Value vectors. Repeat for each token.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A &lt;strong&gt;transformer layer&lt;/strong&gt; contains two main parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;Multi-Head Self-Attention&lt;/strong&gt; block (often runs several attention operations in parallel; for simplicity, we’ll use a single one here)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Feedforward block&lt;/strong&gt; (a small neural network for each position)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Transformers stack several of these layers in sequence, creating deep and flexible representations.&lt;/p&gt;

&lt;p&gt;Below is a runnable, minimal transformer built step by step with NumPy. This version is stripped to essentials: a single self-attention head, basic feedforward network, no extra features.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;softmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;keepdims&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# For numerical stability
&lt;/span&gt;    &lt;span class="n"&gt;e_x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;e_x&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e_x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;keepdims&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MiniTransformer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seq_len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vocab_size&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seq_len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;seq_len&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vocab_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vocab_size&lt;/span&gt;

        &lt;span class="c1"&gt;# Random token embeddings (vocab_size x d_model)
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;token_embeddings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vocab_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Self-attention projection matrices (each d_model x d_model)
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;W_Q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;W_K&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;W_V&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Feedforward: (d_model x d_ff) then (d_ff x d_model)
&lt;/span&gt;        &lt;span class="n"&gt;d_ff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;  &lt;span class="c1"&gt;# Hidden size in feedforward
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;W1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_ff&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;d_ff&lt;/span&gt;&lt;span class="p"&gt;,))&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;W2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_ff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_ff&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,))&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;forward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token_ids&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# token_ids: (seq_len,) sequence of integers (token indices)
&lt;/span&gt;        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;token_embeddings&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;token_ids&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# (seq_len, d_model)
&lt;/span&gt;
        &lt;span class="c1"&gt;# -- Self-Attention --
&lt;/span&gt;        &lt;span class="n"&gt;Q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;W_Q&lt;/span&gt;      &lt;span class="c1"&gt;# (seq_len, d_model)
&lt;/span&gt;        &lt;span class="n"&gt;K&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;W_K&lt;/span&gt;      &lt;span class="c1"&gt;# (seq_len, d_model)
&lt;/span&gt;        &lt;span class="n"&gt;V&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;W_V&lt;/span&gt;      &lt;span class="c1"&gt;# (seq_len, d_model)
&lt;/span&gt;
        &lt;span class="c1"&gt;# Attention scores (seq_len, seq_len)
&lt;/span&gt;        &lt;span class="n"&gt;attn_scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Q&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;K&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;attn_weights&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;softmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attn_scores&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# (seq_len, seq_len)
&lt;/span&gt;
        &lt;span class="c1"&gt;# Weighted sum: (seq_len, seq_len) @ (seq_len, d_model) -&amp;gt; (seq_len, d_model)
&lt;/span&gt;        &lt;span class="n"&gt;attn_output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;attn_weights&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;V&lt;/span&gt;

        &lt;span class="c1"&gt;# -- Feedforward block --
&lt;/span&gt;        &lt;span class="n"&gt;ff_hidden&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;maximum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attn_output&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;W1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# ReLU activation
&lt;/span&gt;        &lt;span class="n"&gt;ff_output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ff_hidden&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;W2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b2&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ff_output&lt;/span&gt;  &lt;span class="c1"&gt;# (seq_len, d_model)
&lt;/span&gt;
&lt;span class="c1"&gt;# Example usage:
&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;vocab_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="n"&gt;d_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;  &lt;span class="c1"&gt;# Embedding size
&lt;/span&gt;&lt;span class="n"&gt;seq_len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;

&lt;span class="c1"&gt;# A sample "sentence": a list of integer token IDs
&lt;/span&gt;&lt;span class="n"&gt;token_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MiniTransformer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seq_len&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;seq_len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vocab_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;vocab_size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;output_vectors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output_vectors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# (5, 8)
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output_vectors&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What does this code do?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Takes a fake sentence: a list of token IDs.&lt;/li&gt;
&lt;li&gt;Looks up their embeddings.&lt;/li&gt;
&lt;li&gt;Applies self-attention to let every token mix information from every other.&lt;/li&gt;
&lt;li&gt;Passes the updated vectors through a small neural network layer for refinement.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not a production system. There’s no training, no multi-head attention, no normalization, residual connections, or positional encoding—just the bare minimum mechanics. Its purpose is to make the moving parts of a transformer visible and concrete.&lt;/p&gt;

&lt;p&gt;Change the input tokens, sequence length, or embedding size. Pass new sequences to &lt;code&gt;model.forward()&lt;/code&gt;. Observe how the output vectors update.&lt;/p&gt;

&lt;p&gt;By walking line-by-line through this simple transformer, you now see how input tokens turn into rich, context-aware representations. Self-attention and feedforward layers—each a simple mix of matrix multiplication and softmax—form the heart of every transformer. Modern large language models stack these pieces higher and wider, but the foundations remain the same.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Transformers use self-attention to allow tokens to access information from any other token in the sequence.&lt;/li&gt;
&lt;li&gt;Previous models like RNNs and CNNs were limited by sequential processing and locality.&lt;/li&gt;
&lt;li&gt;Key components of a transformer include input embeddings, self-attention, and feedforward networks.&lt;/li&gt;
&lt;li&gt;Self-attention computes attention scores between all token pairs to mix contextual information.&lt;/li&gt;
&lt;li&gt;A minimalist transformer can be built with just matrix multiplications and softmax operations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;Modify the provided mini-transformer code to use an input sequence of 6 token IDs instead of 5. Print out the attention matrix (&lt;code&gt;attn_weights&lt;/code&gt; in the code) for the new sequence. In 1-2 sentences, describe how the model redistributes attention across positions and what patterns you notice in the weights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🎥 &lt;a href="https://www.youtube.com/watch?v=ISNdQcPhsts" rel="noopener noreferrer"&gt;Coding a Transformer from scratch on PyTorch, with full explanation, training and inference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🎥 &lt;a href="https://www.youtube.com/watch?v=XefFj4rLHgU" rel="noopener noreferrer"&gt;How to Code a Transformer FROM SCRATCH!&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📘 &lt;a href="https://github.com/M-Wasil/Mini-Transformer-From-Scratch" rel="noopener noreferrer"&gt;Mini Transformer from Scratch (decoder‑only GPT‑style in PyTorch)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📘 &lt;a href="https://github.com/Arpit-sakhreliya/mini-transformer-from-scratch" rel="noopener noreferrer"&gt;Mini Transformer: End‑to‑End Walkthrough (NumPy implementation)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📄 &lt;a href="https://pythonanddatascience.com/blog/building-a-miniature-transformer-from-scratch-the-lego-approach-to-deep-learning" rel="noopener noreferrer"&gt;Building a Miniature Transformer From Scratch: The 'Lego' Approach to Deep Learning&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Coming up on Day 34:&lt;/strong&gt; What Is Pretraining? Transfer Learning for NLP&lt;/p&gt;

</description>
      <category>ai</category>
      <category>nlp</category>
      <category>genai</category>
      <category>100daysofcode</category>
    </item>
  </channel>
</rss>
