<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>notes on meowy</title>
		<link>https://sushh.com/notes/</link>
		<description>Recent content in notes on meowy</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
		
			<lastBuildDate>Sat, 30 May 2026 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://sushh.com/notes/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>It all happens in the context window</title>
				<link>https://sushh.com/notes/the-context-window/</link>
				<pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate>
				<guid>https://sushh.com/notes/the-context-window/</guid>
				<description>&lt;p&gt;Everything starts with one small fact, the model only ever sees what we put in front of it. It has no memory of my files, my last conversation, anything. The only thing it knows in the moment is whatever text we hand it in that one call. That text is the context window, and it is not infinite. There is a hard limit to how much fits.&lt;/p&gt;&#xA;&lt;p&gt;And one thing worth noting is that the model doesn&amp;rsquo;t read words or characters, it reads tokens. A token is just a chunk of text, roughly three-quarters of a word on average, so &amp;ldquo;cat&amp;rdquo; is one token and something like &amp;ldquo;tokenization&amp;rdquo; is a few.&#xA;This matters because the window limit is counted in tokens, not words, and so is the bill for the model.&#xA;When we hear a model has a &amp;ldquo;128k context,&amp;rdquo; they mean 128,000 tokens. So tokens are the thing we&amp;rsquo;re actually budgeting when we decide what goes into that window.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The LLM is the smallest part of the AI app</title>
				<link>https://sushh.com/notes/the-llm-is-the-smallest-part/</link>
				<pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate>
				<guid>https://sushh.com/notes/the-llm-is-the-smallest-part/</guid>
				<description>&lt;p&gt;Everyone obsesses over the model. Which one is smartest, which one just dropped, GPT vs Claude vs whatever came out this week. But the funny thing is, once I actually sat down and built something with an LLM, calling the model turned out to be &lt;strong&gt;one line of code&lt;/strong&gt;, basically. I send it some text, it sends text back. That&amp;rsquo;s the easy bit.&lt;/p&gt;&#xA;&lt;p&gt;The actual work, the stuff that we end up fighting day to day, is everything wrapped around that one call. What goes into the context window. What history to keep and what to throw away. What all of it costs in latency and money. And what to check before it goes in and after it comes back. Because the model will happily do something dumb if we let it.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The window isn&#39;t free</title>
				<link>https://sushh.com/notes/the-window-isnt-free/</link>
				<pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate>
				<guid>https://sushh.com/notes/the-window-isnt-free/</guid>
				<description>&lt;p&gt;Since everything in the window is counted in tokens and I pay for those tokens, a big context window isn&amp;rsquo;t free space, it&amp;rsquo;s a budget. And it bills me in two currencies: money, and latency. (Latency is just the technical word for the wait, the time from hitting send to getting an answer back.) It&amp;rsquo;s tempting to treat the window like free real estate and paste everything in, the model has a huge one anyway. But every token in there costs me twice, once on the bill, once on the clock.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Trust nothing on either end</title>
				<link>https://sushh.com/notes/trust-nothing-on-either-end/</link>
				<pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate>
				<guid>https://sushh.com/notes/trust-nothing-on-either-end/</guid>
				<description>&lt;p&gt;The last bit of work wrapping the model is what we check on the way in and on the way out. And the way I think about it is something I already do with my web3 programs, &lt;strong&gt;trust boundaries&lt;/strong&gt;. A trust boundary is just the line where data crosses from somewhere I don&amp;rsquo;t control into somewhere I do, and the rule at that line is always the same, validate it, don&amp;rsquo;t assume it&amp;rsquo;s safe.&lt;/p&gt;</description>
			</item>
			<item>
				<title>What history do we even keep</title>
				<link>https://sushh.com/notes/what-history-do-we-even-keep/</link>
				<pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate>
				<guid>https://sushh.com/notes/what-history-do-we-even-keep/</guid>
				<description>&lt;p&gt;We need to understand that the model remembers nothing, it&amp;rsquo;s &lt;strong&gt;stateless&lt;/strong&gt; (every call starts from zero, nothing carries over from the last one). Every single call is a blank slate, it has no idea what I asked it thirty seconds ago. So when a chatbot seems to &amp;ldquo;remember&amp;rdquo; the conversation, that isn&amp;rsquo;t the model remembering anything, it&amp;rsquo;s the app quietly re-sending the whole past conversation back into the window on every call. The &amp;ldquo;memory&amp;rdquo; is really just the app replaying history.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Embeddings</title>
				<link>https://sushh.com/notes/embeddings/</link>
				<pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate>
				<guid>https://sushh.com/notes/embeddings/</guid>
				<description>&lt;h2 id=&#34;what-an-embedding-is&#34;&gt;What an embedding is&lt;/h2&gt;&#xA;&lt;p&gt;For &lt;code&gt;text-embedding-3-small&lt;/code&gt;, an embedding is &lt;strong&gt;a list of 1536 floating-point numbers&lt;/strong&gt; between roughly -1 and 1. Same text → same vector, always. Different texts → different vectors. Texts with similar meaning → similar vectors.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;#34;what is ownership in rust&amp;#34;      → [0.012, -0.034, 0.567, ..., -0.089]&#xA;&amp;#34;explain rust ownership&amp;#34;         → [0.011, -0.031, 0.572, ..., -0.085]   (very similar)&#xA;&amp;#34;how do I cook pasta&amp;#34;            → [-0.42, 0.81, -0.15, ..., 0.33]       (very different)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The embedding model was trained on billions of text pairs so that semantically similar text produces vectors close to each other in this 1536-dim space. You don&amp;rsquo;t see or interact with the training; you just call the model and get back numbers.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Evals for RAG</title>
				<link>https://sushh.com/notes/evals-for-rag/</link>
				<pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate>
				<guid>https://sushh.com/notes/evals-for-rag/</guid>
				<description>&lt;h2 id=&#34;why-eval-matters-for-llm-apps&#34;&gt;Why eval matters for LLM apps&lt;/h2&gt;&#xA;&lt;p&gt;Regular web app tests are deterministic: input X → assert output Y. RAG is non-deterministic: same question → potentially different answers, both &amp;ldquo;correct&amp;rdquo; in different phrasings. Asserting exact strings is useless.&lt;/p&gt;&#xA;&lt;p&gt;You need metrics that measure &lt;strong&gt;quality in aggregate&lt;/strong&gt;, even when individual responses vary. Without them, every prompt tweak is a guess. With them: &amp;ldquo;I changed X, faithfulness dropped from 0.95 to 0.78, revert.&amp;rdquo;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Ingestion</title>
				<link>https://sushh.com/notes/ingestion/</link>
				<pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate>
				<guid>https://sushh.com/notes/ingestion/</guid>
				<description>&lt;h2 id=&#34;what-the-word-means&#34;&gt;What the word means&lt;/h2&gt;&#xA;&lt;p&gt;&amp;ldquo;Ingestion&amp;rdquo; is borrowed from data engineering. Generically it means &amp;ldquo;pulling data into your system from somewhere else.&amp;rdquo; In RAG specifically, it means:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Source documents → chunks → embeddings → stored in a vector database.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Once ingestion is done, your system can answer questions about those documents. Without ingestion, the system has nothing to retrieve from.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-ingestion-does-in-my-rag-app&#34;&gt;What ingestion does in my RAG app&lt;/h2&gt;&#xA;&lt;p&gt;In my RAG app, &lt;code&gt;src/rag_app/ingest.py&lt;/code&gt; is the entire ingestion script. It runs once (or whenever my notes change). What it does, in order:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Stack decisions for a RAG app</title>
				<link>https://sushh.com/notes/rag-app-stack-decisions/</link>
				<pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate>
				<guid>https://sushh.com/notes/rag-app-stack-decisions/</guid>
				<description>&lt;h2 id=&#34;the-starting-point&#34;&gt;The starting point&lt;/h2&gt;&#xA;&lt;p&gt;The goal was a RAG service over a folder of markdown notes, with one binding constraint: &lt;strong&gt;the stack should mirror a real team&amp;rsquo;s production stack closely.&lt;/strong&gt; That constraint did most of the architectural work. Without it, you have infinite freedom. With it, every choice gets one question: &amp;ldquo;does the team use it?&amp;rdquo;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-stack-decisions-in-order&#34;&gt;The stack decisions, in order&lt;/h2&gt;&#xA;&lt;p&gt;These got locked in roughly in this sequence:&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-python-313--uv-language--toolchain&#34;&gt;1. Python 3.13 + uv (language + toolchain)&lt;/h3&gt;&#xA;&lt;p&gt;Team uses Python 3.13. &lt;code&gt;uv&lt;/code&gt; is the modern toolchain - one binary that replaces pip + virtualenv + pyenv + poetry. Picked it because it&amp;rsquo;s the only Python tooling that feels like cargo. One command for everything.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
