<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Minimum Viable Founder]]></title><description><![CDATA[Technical and commercial notes from bootstrapping as a solo-founder, and doing as little as possible on purpose.]]></description><link>https://www.minimumviablefounder.com</link><image><url>https://substackcdn.com/image/fetch/$s_!nJKu!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f7195d8-4413-4ea8-940a-2f59652a5a3a_1024x1024.png</url><title>Minimum Viable Founder</title><link>https://www.minimumviablefounder.com</link></image><generator>Substack</generator><lastBuildDate>Mon, 31 Aug 2026 01:00:31 GMT</lastBuildDate><atom:link href="https://www.minimumviablefounder.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Jai Juneja]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[theminimumviablefounder@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[theminimumviablefounder@substack.com]]></itunes:email><itunes:name><![CDATA[Jai Juneja]]></itunes:name></itunes:owner><itunes:author><![CDATA[Jai Juneja]]></itunes:author><googleplay:owner><![CDATA[theminimumviablefounder@substack.com]]></googleplay:owner><googleplay:email><![CDATA[theminimumviablefounder@substack.com]]></googleplay:email><googleplay:author><![CDATA[Jai Juneja]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[AI Evals Aren't Just for Big Tech]]></title><description><![CDATA[How a small bootstrapped team measures its AI the way frontier labs do: a practical approach to evals that you can copy.]]></description><link>https://www.minimumviablefounder.com/p/ai-evals-arent-just-for-big-tech</link><guid isPermaLink="false">https://www.minimumviablefounder.com/p/ai-evals-arent-just-for-big-tech</guid><dc:creator><![CDATA[Jai Juneja]]></dc:creator><pubDate>Wed, 29 Jul 2026 12:46:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!9Gsu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89472ab5-d23e-49d1-a187-c4543e4f9771_1483x897.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><p><em>&#128075; Hey, Jai here! I&#8217;m a software engineer and tech investor turned solo founder, now bootstrapping a software company. I write about using AI to build faster, sell smarter, and run a whole company solo. New here? Join me:</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.minimumviablefounder.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.minimumviablefounder.com/subscribe?"><span>Subscribe now</span></a></p><p><em>Or if you don&#8217;t like my work, send me <a href="mailto:hatemail@qxlabs.com?subject=I%20hate%20you">hate mail</a>.</em></p><div><hr></div><p>In my last post I described <a href="https://www.minimumviablefounder.com/p/why-ai-company-brains-fail">how we overhauled our enterprise &#8220;AI brain&#8221; product</a>. During the development process, there was one critical constraint: we only shipped code that had a measurable positive impact on our AI&#8217;s performance. </p><p>Today I&#8217;ll dive into the eval system we built to enforce this.</p><p>Evals (short for evaluations) measure whether an AI system performs well by grading its responses to a fixed set of questions or tasks. They help steer product development by telling you whether new features improve or regress results, and by pointing to the gaps that you should prioritise.</p><p>Evals have a reputation for being a complex and unwieldy discipline reserved for companies with big budgets; something that OpenAI and Anthropic do with dedicated teams, annotation pipelines, and fancy in-house platforms.</p><p>But in reality the inverse is true. <strong>Evals are incredibly useful for small teams.</strong> They&#8217;re cheap and easy to build while your product is still small.</p><p>My company <a href="https://www.qxlabs.com">QX Labs</a> is fully bootstrapped: I founded it solo and built our knowledge management system with one other engineer. Our eval harness took a few days to build and tune, and it has since dictated critical product decisions.</p><p>Here&#8217;s my underlying thesis. In business you need to solve for two things: velocity and trajectory. The most valuable thing you can build in the AI age isn&#8217;t the system itself, but the feedback loop that tells you whether your system works and how to improve it. Build the loop and you can sustain velocity without hitting a wall, because you&#8217;ll always know your next step. Evals are one of those loops.</p><p>By the end of this post you&#8217;ll have:</p><ul><li><p>A working mental model of what evals are and how the biggest AI companies use them</p></li><li><p>A copyable approach to evals for small teams</p></li><li><p>Real before/after numbers from our RAG evals</p></li></ul><h2>What an eval actually is</h2><p>An eval is made up of three things:</p><ol><li><p><strong>A dataset</strong> that represents your real workload (documents, tickets, conversations, or whatever your system operates on)</p></li><li><p><strong>A set of graded questions or tasks</strong> with pre-defined correct answers (&#8220;golden&#8221; questions)</p></li><li><p><strong>A scorer</strong> that runs every question through your system and outputs numbers</p></li></ol><p>You run it before and after a change, and the delta tells you the result of that change.</p><p>The closest analogy is an engineering test suite, but with one key difference: unit tests are binary (they pass or fail), while evals are statistical and directional (AI can get better for one set of questions and worse for another).</p><p>That&#8217;s the trap with LLM systems: they don&#8217;t fail by erroring, but instead by confidently delivering mediocre results. A retrieval system that misses half the relevant documents will write an authoritative response with gaping holes. Without evals, you&#8217;d never even know.</p><h2>What the experts recommend</h2><p>Before building our eval harness, I looked at how the top labs run theirs. Surprisingly, most of their advice is highly suited to small teams. Greg Brockman (President of OpenAI) is a strong advocate:</p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://x.com/gdb/status/1733553161884127435):&quot;,&quot;full_text&quot;:&quot;evals are surprisingly often all you need&quot;,&quot;username&quot;:&quot;gdb&quot;,&quot;name&quot;:&quot;Greg Brockman&quot;,&quot;profile_image_url&quot;:&quot;https://pbs.substack.com/profile_images/1347621377503711233/bHg3ipfD_normal.jpg&quot;,&quot;date&quot;:&quot;2023-12-09T18:24:16.000Z&quot;,&quot;photos&quot;:[],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:61,&quot;retweet_count&quot;:104,&quot;like_count&quot;:1358,&quot;impression_count&quot;:364816,&quot;expanded_url&quot;:null,&quot;video_url&quot;:null,&quot;video_preview_media_key&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><p>Here&#8217;s what they say:</p><p><strong>Gate your evals like a continuous integration (CI) pipeline.</strong> OpenAI <a href="https://github.com/openai/evals">open-sourced their evals framework</a> back in 2023, calling evals &#8220;one of the most impactful things you can do&#8221; when building with LLMs. They name the practice <em>eval-driven development</em>. &#8220;Evaluate early and often. Write scoped tests at every stage.&#8221;</p><p><strong>Start small and cover real failures.</strong> <a href="https://www.anthropic.com/engineering/demystifying-evals-for-ai-agents">Anthropic&#8217;s engineering guidance</a> says: &#8220;We see teams delay building evals because they think they need hundreds of tasks. In reality, 20&#8211;50 simple tasks drawn from real failures is a great start.&#8221; That&#8217;s totally feasible for a small team or a solopreneur.</p><p><strong>Eyeball your system&#8217;s outputs and errors before coming up with metrics.</strong> Hamel Husain&#8217;s &#8220;<a href="https://hamel.dev/blog/posts/evals/">Your AI Product Needs Evals</a>&#8221; is worth a read. He insists that the first step is to read your system&#8217;s actual outputs one-by-one and categorise the failures. Only then should you come up with the appropriate metrics to measure against those failures. Similar to Anthropic he recommends starting with ~30 hand-graded examples. In short: use your own product like your customers would, manually log and categorise the failures, then feed that data into your eval system.</p><p><strong>Avoid using LLM &#8220;judges&#8221; for grading.</strong> The big shops need AI judges to grade open-ended outputs at scale, but they calibrate them against human graders because research shows that LLM-graded evals can otherwise be very flimsy. <a href="https://arxiv.org/abs/2306.05685">The MT-Bench paper</a> (Zheng et al.) outlines their biases: position bias (judges favour the first response rather than the best one), verbosity bias (judges favour longer responses &gt;90% of the time regardless of quality), and self-enhancement (models score their own outputs higher). The lesson for a small team is not &#8220;don&#8217;t use judges,&#8221; it&#8217;s &#8220;don&#8217;t <em>start</em> with judges.&#8221; Stick to mechanical, deterministic scoring first.</p><p>In the end <strong>big-tech evaluation is expensive due to scale and not the underlying to process.</strong> A small team doesn&#8217;t need thousands of evals in CI, expensive annotation or judge calibration pipelines. They just need to run a process of getting fixed data, creating graded questions and scoring every change. That costs almost nothing.</p><h2>The small-team version: our recipe for evals</h2><p>First, some context: one of <a href="https://www.qxlabs.com">our products</a> at QX ingests a company&#8217;s documents (Drive, SharePoint, Granola, Notion, etc.) and lets AI agents answer questions across them. When we originally built the MVP it used a simple RAG pipeline for indexing and retrieval, but we wanted to turn it into a full knowledge graph. However, we needed a way to measure whether the changes we implemented were actually improving the agent&#8217;s ability to query data.</p><p>So before doing anything, we built the eval harness. Here&#8217;s how we approached it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9Gsu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89472ab5-d23e-49d1-a187-c4543e4f9771_1483x897.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9Gsu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89472ab5-d23e-49d1-a187-c4543e4f9771_1483x897.png 424w, https://substackcdn.com/image/fetch/$s_!9Gsu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89472ab5-d23e-49d1-a187-c4543e4f9771_1483x897.png 848w, https://substackcdn.com/image/fetch/$s_!9Gsu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89472ab5-d23e-49d1-a187-c4543e4f9771_1483x897.png 1272w, https://substackcdn.com/image/fetch/$s_!9Gsu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89472ab5-d23e-49d1-a187-c4543e4f9771_1483x897.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9Gsu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89472ab5-d23e-49d1-a187-c4543e4f9771_1483x897.png" width="1456" height="881" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/89472ab5-d23e-49d1-a187-c4543e4f9771_1483x897.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:881,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:115530,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.minimumviablefounder.com/i/207553120?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89472ab5-d23e-49d1-a187-c4543e4f9771_1483x897.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9Gsu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89472ab5-d23e-49d1-a187-c4543e4f9771_1483x897.png 424w, https://substackcdn.com/image/fetch/$s_!9Gsu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89472ab5-d23e-49d1-a187-c4543e4f9771_1483x897.png 848w, https://substackcdn.com/image/fetch/$s_!9Gsu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89472ab5-d23e-49d1-a187-c4543e4f9771_1483x897.png 1272w, https://substackcdn.com/image/fetch/$s_!9Gsu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89472ab5-d23e-49d1-a187-c4543e4f9771_1483x897.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>1. Build the eval around your customer archetype</h3><p>Our dataset uses ~1,000 real documents that represent one hypothetical customer&#8217;s universe. In our case we mimicked an investment firm&#8217;s internal data: PDFs, spreadsheets, decks, memos, meeting notes, scanned pages. Specifically, we wanted things to look multimodal, messy, and organised into a folder hierarchy an actual firm might accumulate over time. Having raised my owned fund and worked as an investor for 10 years, I had a very good mental model of what this should look like.</p><p>That right there is the secret sauce to good evals: <strong>model them closely on your end-customers&#8217; files and queries.</strong> Synthetic data is appealing because it&#8217;s easier to create, but it&#8217;s too clean. Real documents have tables that span pages, scans, duplicates, vague project codenames, folders whose names carry information the documents don&#8217;t, and so on. Modelling all of those nuances in a synthetic dataset is practically impossible.</p><p>And the gap between real and synthetic data is meaningful: <a href="https://jxnl.co/writing/2024/05/22/systematically-improving-your-rag/">Jason Liu found</a> that RAG systems had 97% recall on synthetic questions, then dropped to 55-65% on real user queries. If you truly have no real data, dig out some real public documents and then create synthetic documents woven around the same entities so that cross-document structure exists.</p><p>One decision that made it much cheaper for us to run evals is we <strong>froze the document extraction step.</strong> Extracting text from 1,000 multimodal files (with vision models, table parsing, etc.) is slow and expensive but broadly deterministic. So we did it up-front and committed the extracted text to its own git repo. That way, we could run every re-ingest from already-extracted text and only needed to pay for embedding + indexing the text. The eval loop became ~100x cheaper and similarly faster. It also enabled us to isolate document extraction from indexing + retrieval (two distinct processes that should be eval&#8217;d separately).</p><h3>2. Segment the questions by your product&#8217;s logic</h3><p>Instead of writing 100 random questions, we wrote ~20 questions in each of five classes that (1) matched customer behaviour (2) captured the spectrum of capabilities a &#8220;company brain&#8221; should have. The question categories broke down as follows:</p><ul><li><p><strong>Needle</strong> questions (that pull out one fact). Example: &#8220;What discount rate are we assuming in our DCF analysis for Acme?&#8221;</p></li><li><p><strong>Entity</strong> questions (that require the complete document set for one thing). Example: &#8220;What do we know about Acme Inc?&#8221;</p></li><li><p><strong>Multi-part</strong> questions (that require documents for different entities to co-appear). Example: &#8220;Compare Corp A and Corp B&#8217;s valuation metrics.&#8221;</p></li><li><p><strong>Aggregation</strong> questions (that need exact lists or counts). Example: &#8220;Do we have any expert calls discussing AI regulation in Europe?&#8221;</p></li><li><p><strong>Thematic</strong> questions (that broadly coverage a topic). Example: &#8220;What are the recurring risks across our food-delivery investments?&#8221;</p></li></ul><p><em>NB: each of our question categories had their own unique set of metrics that we evaluated (such as recall@20, mean reciprocal rank and F1 score). Those metrics are very specific to retrieval and recommendation systems, which you can <a href="https://www.pinecone.io/learn/offline-evaluation/">read about here</a>. Naturally your metrics should be well thought out and reflect what it is that you&#8217;re actually evaluating.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yjI2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d6a2bb-49b9-4c5e-9b8f-93131d50b33e_1812x901.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yjI2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d6a2bb-49b9-4c5e-9b8f-93131d50b33e_1812x901.png 424w, https://substackcdn.com/image/fetch/$s_!yjI2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d6a2bb-49b9-4c5e-9b8f-93131d50b33e_1812x901.png 848w, https://substackcdn.com/image/fetch/$s_!yjI2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d6a2bb-49b9-4c5e-9b8f-93131d50b33e_1812x901.png 1272w, https://substackcdn.com/image/fetch/$s_!yjI2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d6a2bb-49b9-4c5e-9b8f-93131d50b33e_1812x901.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yjI2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d6a2bb-49b9-4c5e-9b8f-93131d50b33e_1812x901.png" width="1456" height="724" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d0d6a2bb-49b9-4c5e-9b8f-93131d50b33e_1812x901.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:724,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:161098,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.minimumviablefounder.com/i/207553120?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d6a2bb-49b9-4c5e-9b8f-93131d50b33e_1812x901.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!yjI2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d6a2bb-49b9-4c5e-9b8f-93131d50b33e_1812x901.png 424w, https://substackcdn.com/image/fetch/$s_!yjI2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d6a2bb-49b9-4c5e-9b8f-93131d50b33e_1812x901.png 848w, https://substackcdn.com/image/fetch/$s_!yjI2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d6a2bb-49b9-4c5e-9b8f-93131d50b33e_1812x901.png 1272w, https://substackcdn.com/image/fetch/$s_!yjI2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d6a2bb-49b9-4c5e-9b8f-93131d50b33e_1812x901.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Why segment like this? Because a single overall score hides the nuance<strong>.</strong> Our baseline system scored a decent 0.83 overall, but scored only 0.59 on thematic questions and 0.69 on aggregation. The average score would have you believe that things were pretty good. But the category breakdown revealed significant failures for important use-cases. </p><p>Different question classes also improve for different reasons, which helps you connect metric movements back to specific engineering decisions. If your product has distinct usage patterns then each mode deserves its own question class.</p><h3>3. Make scoring mechanical (no judges)</h3><p>All of our questions were scored using deterministic measures, for example:</p><ul><li><p>Document-recall against expected document lists (&#8220;these specific documents should appear&#8221;)</p></li><li><p>Substring checks against expected evidence (&#8220;the retrieved chunk must contain 43%&#8221;)</p></li><li><p>Set precision/recall for list questions (&#8220;this many results should appear&#8221;)</p></li><li><p>Coverage of expected string groups for thematic questions (&#8220;these words or sentences should appear&#8221;)</p></li></ul><p>We didn&#8217;t use an LLM judge at all. This kept it free and fast, whereas a judge would have added a second AI system to tune and eval (Shankar et al. address this in &#8220;<a href="https://arxiv.org/abs/2404.12272">Who Validates the Validators</a>&#8221;). Add a judge only when a metric you need is actually unmeasurable without one. And when you do, calibrate it against your own judgment.</p><p>One other pointer: <strong>make sure your eval system gracefully handles version changes</strong> (new questions, new files etc). We version both the questions and the final eval reports in git. Our harness auto-generates reports with deltas against the previous run and can gracefully handle drift in the underlying questions and documents.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OSST!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8082a0f-e54f-42f1-b978-ab8d87722b22_1648x1078.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OSST!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8082a0f-e54f-42f1-b978-ab8d87722b22_1648x1078.png 424w, https://substackcdn.com/image/fetch/$s_!OSST!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8082a0f-e54f-42f1-b978-ab8d87722b22_1648x1078.png 848w, https://substackcdn.com/image/fetch/$s_!OSST!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8082a0f-e54f-42f1-b978-ab8d87722b22_1648x1078.png 1272w, https://substackcdn.com/image/fetch/$s_!OSST!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8082a0f-e54f-42f1-b978-ab8d87722b22_1648x1078.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OSST!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8082a0f-e54f-42f1-b978-ab8d87722b22_1648x1078.png" width="1456" height="952" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d8082a0f-e54f-42f1-b978-ab8d87722b22_1648x1078.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:952,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:173317,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.minimumviablefounder.com/i/207553120?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8082a0f-e54f-42f1-b978-ab8d87722b22_1648x1078.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!OSST!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8082a0f-e54f-42f1-b978-ab8d87722b22_1648x1078.png 424w, https://substackcdn.com/image/fetch/$s_!OSST!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8082a0f-e54f-42f1-b978-ab8d87722b22_1648x1078.png 848w, https://substackcdn.com/image/fetch/$s_!OSST!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8082a0f-e54f-42f1-b978-ab8d87722b22_1648x1078.png 1272w, https://substackcdn.com/image/fetch/$s_!OSST!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8082a0f-e54f-42f1-b978-ab8d87722b22_1648x1078.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Example summary eval report that is auto-generated. A more detailed JSON file also breaks down the results per question and highlights diffs vs prior evals.</figcaption></figure></div><h3>4. Curate the questions yourself</h3><p>We semi-automated the question generation: an LLM read the ingested corpus and proposed ~250 candidate questions along with ground truth. I then spent a couple hours removing bad questions, sharpening good ones, and drafting my own where I felt there were gaps. I ended up with 100 questions.</p><p>That couple of hours is crucial: <strong>the golden set is where you encode what &#8220;good&#8221; means for your customers.</strong> That&#8217;s a judgment only someone who properly understands the customer can make. Big labs pay annotation teams to do this, but frankly you have a better understanding of your customer than any outsourced annotator ever will, so make the most of it. It&#8217;s one of the few genuine advantages a small team has over a big one.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qcFO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5bf452-e10c-4309-a967-2ae82b3ab483_1680x995.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qcFO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5bf452-e10c-4309-a967-2ae82b3ab483_1680x995.png 424w, https://substackcdn.com/image/fetch/$s_!qcFO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5bf452-e10c-4309-a967-2ae82b3ab483_1680x995.png 848w, https://substackcdn.com/image/fetch/$s_!qcFO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5bf452-e10c-4309-a967-2ae82b3ab483_1680x995.png 1272w, https://substackcdn.com/image/fetch/$s_!qcFO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5bf452-e10c-4309-a967-2ae82b3ab483_1680x995.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qcFO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5bf452-e10c-4309-a967-2ae82b3ab483_1680x995.png" width="1456" height="862" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9e5bf452-e10c-4309-a967-2ae82b3ab483_1680x995.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:862,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:204059,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.minimumviablefounder.com/i/207553120?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5bf452-e10c-4309-a967-2ae82b3ab483_1680x995.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qcFO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5bf452-e10c-4309-a967-2ae82b3ab483_1680x995.png 424w, https://substackcdn.com/image/fetch/$s_!qcFO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5bf452-e10c-4309-a967-2ae82b3ab483_1680x995.png 848w, https://substackcdn.com/image/fetch/$s_!qcFO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5bf452-e10c-4309-a967-2ae82b3ab483_1680x995.png 1272w, https://substackcdn.com/image/fetch/$s_!qcFO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5bf452-e10c-4309-a967-2ae82b3ab483_1680x995.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>How it played out for us: real numbers</h2><p>We ran the eval at three checkpoints when <a href="https://www.minimumviablefounder.com/p/why-ai-company-brains-fail">improving our knowledge management system</a>: </p><ul><li><p><strong>Phase 0</strong> (baseline; our old RAG system implemented in 2024)</p></li><li><p><strong>Phase 1</strong> (improved document ingestion by adding contextual chunk headers, upgraded metadata extraction + filtering)</p></li><li><p><strong>Phase 2</strong> (built the entity layer that turned our system into a knowledge graph)</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!H_GH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd64d5240-9ce3-4845-af31-7a90e21fb6a1_1938x1037.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!H_GH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd64d5240-9ce3-4845-af31-7a90e21fb6a1_1938x1037.png 424w, https://substackcdn.com/image/fetch/$s_!H_GH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd64d5240-9ce3-4845-af31-7a90e21fb6a1_1938x1037.png 848w, https://substackcdn.com/image/fetch/$s_!H_GH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd64d5240-9ce3-4845-af31-7a90e21fb6a1_1938x1037.png 1272w, https://substackcdn.com/image/fetch/$s_!H_GH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd64d5240-9ce3-4845-af31-7a90e21fb6a1_1938x1037.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!H_GH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd64d5240-9ce3-4845-af31-7a90e21fb6a1_1938x1037.png" width="1456" height="779" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d64d5240-9ce3-4845-af31-7a90e21fb6a1_1938x1037.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:779,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:77233,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.minimumviablefounder.com/i/207553120?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd64d5240-9ce3-4845-af31-7a90e21fb6a1_1938x1037.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!H_GH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd64d5240-9ce3-4845-af31-7a90e21fb6a1_1938x1037.png 424w, https://substackcdn.com/image/fetch/$s_!H_GH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd64d5240-9ce3-4845-af31-7a90e21fb6a1_1938x1037.png 848w, https://substackcdn.com/image/fetch/$s_!H_GH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd64d5240-9ce3-4845-af31-7a90e21fb6a1_1938x1037.png 1272w, https://substackcdn.com/image/fetch/$s_!H_GH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd64d5240-9ce3-4845-af31-7a90e21fb6a1_1938x1037.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A few things stood out in the results:</p><p><strong>The biggest win was also the easiest to implement.</strong> Thematic recall jumped from 0.59 to 0.83 in Phase 1, the largest single movement we saw. Most of it came from some really easy changes, most notably prepending a two-sentence AI-generated context header to every chunk before embedding it (saying something like &#8220;This text is from document X and talks about Y&#8221;). Anthropic discuss that approach <a href="https://www.anthropic.com/engineering/contextual-retrieval">here</a>. The fancy entity layer we were so excited about in Phase 2 had a much smaller impact. Without the eval we would have credited the wrong work.</p><p><strong>The eval caught a regression that we would have otherwise missed.</strong> Multi-part recall actually dropped in Phase 2 from 0.88 to 0.82. It turned out that adding new retrieval tools to our agent impacted how results merged for comparison questions. This kind of degradation would have been invisible without evals, creating a hidden pile of technical debt.</p><p><strong>The eval also told us what not to build.</strong> Our original research mapped out a Phase 3: community detection and cluster summaries over the knowledge graph. But by Phase 2 our thematic scores had already hit 0.91 via much cheaper means so we parked it. Sometimes less work is good work; that&#8217;s the ethos of <em>The Minimum Viable Founder</em>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nO6Y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32b69148-92c4-4ef4-8009-222e27a692b2_1600x500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nO6Y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32b69148-92c4-4ef4-8009-222e27a692b2_1600x500.png 424w, https://substackcdn.com/image/fetch/$s_!nO6Y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32b69148-92c4-4ef4-8009-222e27a692b2_1600x500.png 848w, https://substackcdn.com/image/fetch/$s_!nO6Y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32b69148-92c4-4ef4-8009-222e27a692b2_1600x500.png 1272w, https://substackcdn.com/image/fetch/$s_!nO6Y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32b69148-92c4-4ef4-8009-222e27a692b2_1600x500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nO6Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32b69148-92c4-4ef4-8009-222e27a692b2_1600x500.png" width="1456" height="455" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/32b69148-92c4-4ef4-8009-222e27a692b2_1600x500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:455,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:85123,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.minimumviablefounder.com/i/207553120?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32b69148-92c4-4ef4-8009-222e27a692b2_1600x500.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!nO6Y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32b69148-92c4-4ef4-8009-222e27a692b2_1600x500.png 424w, https://substackcdn.com/image/fetch/$s_!nO6Y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32b69148-92c4-4ef4-8009-222e27a692b2_1600x500.png 848w, https://substackcdn.com/image/fetch/$s_!nO6Y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32b69148-92c4-4ef4-8009-222e27a692b2_1600x500.png 1272w, https://substackcdn.com/image/fetch/$s_!nO6Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32b69148-92c4-4ef4-8009-222e27a692b2_1600x500.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>It&#8217;s just a loop</h2><p>If you look at what we&#8217;re doing with evals, it&#8217;s just a feedback loop:</p><ol><li><p>Decide what &#8220;good&#8221; looks like (i.e. set the golden questions and choose what metrics to measure)</p></li><li><p>Make measurement cheap so that the loop can run frequently</p></li><li><p>Change one thing then measure the result</p></li><li><p>Decide what to ship (or not) based on the result</p></li></ol><p>These loops show up everywhere in business: pricing experiments, ad management, onboarding funnels, sales scripts. It&#8217;s nothing new.</p><h2>The startup checklist for building an eval harness</h2><ul><li><p><strong>Use a real corpus that reflects your customers.</strong> Only use synthetic files to fill gaps.</p></li><li><p><strong>Segment questions based on usage patterns.</strong></p></li><li><p><strong>Write the golden set yourself</strong> (AI-assisted, not AI-generated).</p></li><li><p><strong>Freeze any steps in your eval that are expensive and invariant.</strong> In our case, document extraction.</p></li><li><p><strong>Do mechanical scoring.</strong> Add an LLM judge if it&#8217;s the only way to measure your chosen metrics.</p></li><li><p><strong>Make running the eval super easy (one command).</strong> Otherwise you&#8217;ll never run it.</p></li><li><p><strong>Commit eval reports next to code.</strong> E.g. an /evals folder in your project root so that it&#8217;s easy to track history.</p></li><li><p><strong>Introduce new metrics as the product evolves.</strong> Don&#8217;t let the eval become dated and obsolete.</p></li></ul><p><em>If you&#8217;re building your own eval system or want to better understand how we approach things, I&#8217;d love to exchange notes.</em></p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6q-N!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6q-N!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 424w, https://substackcdn.com/image/fetch/$s_!6q-N!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 848w, https://substackcdn.com/image/fetch/$s_!6q-N!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 1272w, https://substackcdn.com/image/fetch/$s_!6q-N!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6q-N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp" width="368" height="92" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:368,&quot;bytes&quot;:26478,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6q-N!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 424w, https://substackcdn.com/image/fetch/$s_!6q-N!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 848w, https://substackcdn.com/image/fetch/$s_!6q-N!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 1272w, https://substackcdn.com/image/fetch/$s_!6q-N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.minimumviablefounder.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div>]]></content:encoded></item><item><title><![CDATA[Why AI 'Company Brains' Fail (and How We Built One that Doesn't)]]></title><description><![CDATA[Traditional RAG retrieval fails on the questions that matter. Knowledge graphs answer them at 1000x the cost. We shipped the middle path.]]></description><link>https://www.minimumviablefounder.com/p/why-ai-company-brains-fail</link><guid isPermaLink="false">https://www.minimumviablefounder.com/p/why-ai-company-brains-fail</guid><dc:creator><![CDATA[Jai Juneja]]></dc:creator><pubDate>Mon, 20 Jul 2026 10:27:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bc1p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0414d28-d625-4690-9c8c-b67c770d6d5c_1211x633.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><p><em>&#128075; Hey, Jai here! I&#8217;m a software engineer and tech investor turned solo founder building a bootstrapped software company. I write about using AI to build faster, sell smarter, and run a whole company solo. New here? Join me:</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.minimumviablefounder.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.minimumviablefounder.com/subscribe?"><span>Subscribe now</span></a></p><p><em>Or if you don&#8217;t like my work, send me <a href="mailto:hatemail@qxlabs.com?subject=I%20hate%20you">hate mail</a>.</em></p><div><hr></div><p>Almost every business I&#8217;ve spoken to at <a href="https://www.qxlabs.com">QX</a> has asked for some version of an AI &#8220;company brain&#8221; connected to their internal documents and systems. They echo the same complaint that their data is scattered across silos, and believe that the key to their competitive edge lies in unlocking this pent-up institutional knowledge.</p><p>In a world where AI is commoditising access to <em>public</em> knowledge, <em>internal</em> knowledge accumulated through domain experience and relationships become the primary moat. Two years ago, the AI brain discussion warranted an exploratory pilot, but today it&#8217;s table stakes. </p><p>The common way to build this is called RAG, or retrieval-augmented generation. This process involves breaking your company&#8217;s documents into passages, converting them into numerical representations that encode their meaning, and letting an AI answer questions by retrieving the passages that best match a query. It&#8217;s simple, cheap and demos well.</p><p>RAG was originally proposed by Meta AI researchers <a href="https://arxiv.org/abs/2005.11401">in a May 2020 paper</a>. In AI-years that&#8217;s almost pre-historic. And whilst it performed well on a limited set of questions, today it falls short for use-cases where real value is added. Microsoft then entered the frame in 2024 and published a technique called <a href="https://www.microsoft.com/en-us/research/blog/graphrag-unlocking-llm-discovery-on-narrative-private-data/">GraphRAG</a>. Their idea was to create a knowledge graph by using LLMs to extract the entities and relationships from documents, not just the text content. This would enable us to traverse a structured graph during retrieval (e.g. &#8220;find me documents related to this person, company, event etc&#8221;) instead of a simple text search. It gained a <em>lot</em> of hype.</p><p>I&#8217;ll get into the detail of GraphRAG shortly, but my view is that in practice it&#8217;s complete overkill. At QX, with the benefit of experience and testing, we have chosen a more pragmatic approach: take the best parts of GraphRAG and knowledge graphs, fit them into a much simpler architecture, and scrap the rest. Our approach has been shaped by what actually kills these AI brain projects in practice:</p><ul><li><p>Information is unstructured and spread across disconnected systems.</p></li><li><p>Retrieval quality has to sustain with scale, i.e. beyond a pilot.</p></li><li><p>Initial implementation needs to be fast and cheap, so that companies can see results and drive uptake before committing outright. Behavioural change is <em>always</em> the primary goal, everything else follows.</p></li></ul><p>Crucially, we wanted a system that our mid-market customers could switch on themselves, without consultants or setup workshops.</p><h2>Three kinds of questions</h2><p>While analysing the queries customers sent to their internal knowledge base, we identified three distinct categories.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SI5l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e89189-46bd-4418-84f3-a20c25afa869_1900x1025.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SI5l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e89189-46bd-4418-84f3-a20c25afa869_1900x1025.png 424w, https://substackcdn.com/image/fetch/$s_!SI5l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e89189-46bd-4418-84f3-a20c25afa869_1900x1025.png 848w, https://substackcdn.com/image/fetch/$s_!SI5l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e89189-46bd-4418-84f3-a20c25afa869_1900x1025.png 1272w, https://substackcdn.com/image/fetch/$s_!SI5l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e89189-46bd-4418-84f3-a20c25afa869_1900x1025.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SI5l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e89189-46bd-4418-84f3-a20c25afa869_1900x1025.png" width="1456" height="785" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/11e89189-46bd-4418-84f3-a20c25afa869_1900x1025.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:785,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:111734,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.minimumviablefounder.com/i/207183365?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e89189-46bd-4418-84f3-a20c25afa869_1900x1025.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SI5l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e89189-46bd-4418-84f3-a20c25afa869_1900x1025.png 424w, https://substackcdn.com/image/fetch/$s_!SI5l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e89189-46bd-4418-84f3-a20c25afa869_1900x1025.png 848w, https://substackcdn.com/image/fetch/$s_!SI5l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e89189-46bd-4418-84f3-a20c25afa869_1900x1025.png 1272w, https://substackcdn.com/image/fetch/$s_!SI5l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e89189-46bd-4418-84f3-a20c25afa869_1900x1025.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ol><li><p><strong>Needle</strong> <strong>questions.</strong> &#8220;What was the take rate in the 2017 valuation memo?&#8221; These typically ask for one fact in one document. Classic RAG is excellent here because searching by meaning finds that one passage reliably.</p></li><li><p><strong>Portfolio</strong> <strong>questions.</strong> &#8220;Tell me everything we know about Acme Inc.&#8221; This is a broad, often multi-step question that needs every relevant document, not the top ten passages. RAG gets you a decent sample but silently drops the rest which is dangerous for diligence or research work (creates blind spots).</p></li><li><p><strong>Counting questions.</strong> &#8220;Which fintech companies have we evaluated?&#8221; or &#8220;Which contracts mention this supplier?&#8221; These need an exact list or tally across the entire corpus. Top-k search results cannot answer them. The system will confidently name the companies it happened to retrieve and skip the rest, and you&#8217;ll never know.</p></li></ol><p>Most &#8220;AI brain&#8221; demos show needle questions, but real business value is often trapped behind the other two.</p><h2>Enter GraphRAG</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aG3D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b63f4eb-abe2-4733-b13e-2d5824f7375b_1560x797.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aG3D!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b63f4eb-abe2-4733-b13e-2d5824f7375b_1560x797.png 424w, https://substackcdn.com/image/fetch/$s_!aG3D!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b63f4eb-abe2-4733-b13e-2d5824f7375b_1560x797.png 848w, https://substackcdn.com/image/fetch/$s_!aG3D!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b63f4eb-abe2-4733-b13e-2d5824f7375b_1560x797.png 1272w, https://substackcdn.com/image/fetch/$s_!aG3D!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b63f4eb-abe2-4733-b13e-2d5824f7375b_1560x797.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aG3D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b63f4eb-abe2-4733-b13e-2d5824f7375b_1560x797.png" width="1456" height="744" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9b63f4eb-abe2-4733-b13e-2d5824f7375b_1560x797.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:744,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:133084,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.minimumviablefounder.com/i/207183365?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b63f4eb-abe2-4733-b13e-2d5824f7375b_1560x797.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!aG3D!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b63f4eb-abe2-4733-b13e-2d5824f7375b_1560x797.png 424w, https://substackcdn.com/image/fetch/$s_!aG3D!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b63f4eb-abe2-4733-b13e-2d5824f7375b_1560x797.png 848w, https://substackcdn.com/image/fetch/$s_!aG3D!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b63f4eb-abe2-4733-b13e-2d5824f7375b_1560x797.png 1272w, https://substackcdn.com/image/fetch/$s_!aG3D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b63f4eb-abe2-4733-b13e-2d5824f7375b_1560x797.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>GraphRAG took direct aim at solving for the limitations of classic RAG. Instead of just chopping documents into searchable passages, Microsoft proposed that an AI should parse the whole corpus and build a knowledge graph out of it. Every company, person, and product becomes a node. Relationships between them become edges. Clusters of related entities get pre-written AI summaries, so the system can answer big-picture questions from the summaries instead of hunting through passages.</p><p>It&#8217;s a clever idea and it works well for those latter question categories. The research is consistent: graph-based approaches shine on questions that require connecting information across many documents, what the original paper called &#8220;global sensemaking&#8221;.</p><p>GraphRAG became shorthand for &#8220;the serious way to do enterprise RAG&#8221;. But it came at a real cost.</p><h2>What the research says</h2><p>There were three major findings when evaluating GraphRAG, and most of them came directly from Microsoft.</p><p><strong>The index is very expensive.</strong> Building the graph means running AI extraction and summarisation over everything before anyone asks a single question. Microsoft&#8217;s own follow-up work, <a href="https://www.microsoft.com/en-us/research/blog/lazygraphrag-setting-a-new-standard-for-quality-and-cost/">LazyGraphRAG</a>, states the cost: a plain vector index costs about 0.1% of a full GraphRAG index. Three orders of magnitude, paid up front, on content nobody may ever query. The same work showed a lazy approach matching full GraphRAG&#8217;s answer quality on global questions at a small fraction of the query cost. In effect, Microsoft showed that the expensive part of GraphRAG is mostly unnecessary. Their productised solution accelerator for GraphRAG was even archived in 2025.</p><p><strong>The wins are narrow.</strong> A systematic evaluation published in 2025 (<a href="https://arxiv.org/abs/2502.11371">RAG vs. GraphRAG, arXiv:2502.11371</a>) found what practitioners kept rediscovering: vanilla RAG wins on direct factual questions, graphs win on multi-hop and summary questions, and the best results come from routing between approaches rather than betting on either. </p><p><strong>Entity resolution is the hardest part.</strong> For a graph to be useful, &#8220;Acme&#8221;, &#8220;ACME Holdings Inc.&#8221; and &#8220;Acme Corp&#8221; must become one node. Get that wrong in one direction and your graph fragments into disconnected shards. Get it wrong in the other direction and two different companies inconspicuously merge into a single fictional one, and every answer built on top inherits the error. This problem is old and largely unsolved in the popular GraphRAG tooling. Meanwhile a graph database brings its own operational tax: another system to run, back up, secure, and keep consistent with your documents, multiplied by every tenant if you&#8217;re a SaaS product.</p><p>The philosophy behind GraphRAG is right: documents alone aren&#8217;t enough, and tracking the entities that your corpus talks about unlocks question types that ordinary search can&#8217;t address. The architecture most people associate with it, an eagerly built knowledge graph in a graph database, is overkill for the majority of real workloads.</p><h2>What we built instead: graph-like RAG</h2><p>We kept the parts with evidence behind them and dropped the rest. The result looks like a graph but runs on a regular database: it has entities, relationships, and rich metadata that evolve over time&#8212;but no Neo4j, no up-front graph build, and no ontology to custom-design.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ekdR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a7f9a62-4611-4212-aad3-f7c414772c62_2055x1333.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ekdR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a7f9a62-4611-4212-aad3-f7c414772c62_2055x1333.png 424w, https://substackcdn.com/image/fetch/$s_!ekdR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a7f9a62-4611-4212-aad3-f7c414772c62_2055x1333.png 848w, https://substackcdn.com/image/fetch/$s_!ekdR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a7f9a62-4611-4212-aad3-f7c414772c62_2055x1333.png 1272w, https://substackcdn.com/image/fetch/$s_!ekdR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a7f9a62-4611-4212-aad3-f7c414772c62_2055x1333.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ekdR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a7f9a62-4611-4212-aad3-f7c414772c62_2055x1333.png" width="1456" height="944" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5a7f9a62-4611-4212-aad3-f7c414772c62_2055x1333.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:944,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:186972,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.minimumviablefounder.com/i/207183365?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a7f9a62-4611-4212-aad3-f7c414772c62_2055x1333.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ekdR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a7f9a62-4611-4212-aad3-f7c414772c62_2055x1333.png 424w, https://substackcdn.com/image/fetch/$s_!ekdR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a7f9a62-4611-4212-aad3-f7c414772c62_2055x1333.png 848w, https://substackcdn.com/image/fetch/$s_!ekdR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a7f9a62-4611-4212-aad3-f7c414772c62_2055x1333.png 1272w, https://substackcdn.com/image/fetch/$s_!ekdR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a7f9a62-4611-4212-aad3-f7c414772c62_2055x1333.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Graph-like RAG: taking the best bits of knowledge graphs and scrapping the rest</figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bc1p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0414d28-d625-4690-9c8c-b67c770d6d5c_1211x633.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bc1p!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0414d28-d625-4690-9c8c-b67c770d6d5c_1211x633.png 424w, https://substackcdn.com/image/fetch/$s_!bc1p!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0414d28-d625-4690-9c8c-b67c770d6d5c_1211x633.png 848w, https://substackcdn.com/image/fetch/$s_!bc1p!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0414d28-d625-4690-9c8c-b67c770d6d5c_1211x633.png 1272w, https://substackcdn.com/image/fetch/$s_!bc1p!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0414d28-d625-4690-9c8c-b67c770d6d5c_1211x633.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bc1p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0414d28-d625-4690-9c8c-b67c770d6d5c_1211x633.png" width="1211" height="633" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a0414d28-d625-4690-9c8c-b67c770d6d5c_1211x633.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:633,&quot;width&quot;:1211,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:973188,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.minimumviablefounder.com/i/207183365?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0414d28-d625-4690-9c8c-b67c770d6d5c_1211x633.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bc1p!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0414d28-d625-4690-9c8c-b67c770d6d5c_1211x633.png 424w, https://substackcdn.com/image/fetch/$s_!bc1p!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0414d28-d625-4690-9c8c-b67c770d6d5c_1211x633.png 848w, https://substackcdn.com/image/fetch/$s_!bc1p!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0414d28-d625-4690-9c8c-b67c770d6d5c_1211x633.png 1272w, https://substackcdn.com/image/fetch/$s_!bc1p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0414d28-d625-4690-9c8c-b67c770d6d5c_1211x633.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Knowledge graph generated from a Vault on QX (FYI you can <a href="https://platform.qxlabs.com/register">set up an account</a> for free, upload some documents and visualise this yourself)</figcaption></figure></div><p>The breakdown is as follows:</p><p><strong>Everything stays in ordinary infrastructure.</strong> Passages live in a search index. Entities live as plain database records: one record per company, person, product, project, event, or location, per client workspace. An entity record knows its name, its alternate spellings, which documents mention it, and which other entities it tends to appear alongside. Those &#8220;appears alongside&#8221; links are what effectively form the graph. They&#8217;re just a list stored on each record, computed by counting co-occurrences. There&#8217;s no graph query language and no new moving parts.</p><p><strong>The ontology is fixed, small, and universal.</strong> Six types (company, person, event, etc.) plus a handful of label fields (industry, category, topic) that adapt to whatever the documents contain. The fixed ontology is what makes the system self-serve. Custom ontologies are otherwise why traditional knowledge-graph projects begin with months of workshops. A pharma client and a private equity client get the same types, and the <em>content</em> of the graph adapts to their world automatically, because it&#8217;s extracted from their documents and evolves naturally as the corpus grows.</p><p><strong>Entity resolution follows a clear waterfall.</strong> When a document mentions a name, we check a &#8220;phone book&#8221; containing every spelling we&#8217;ve seen before for that entity. If there&#8217;s an exact hit, the entity is matched for free. If we miss, a similarity search proposes look-alike candidates for fractions of a cent. Only when there&#8217;s a genuinely ambiguous candidate does a small AI model get asked &#8220;are these the same real-world thing?&#8221;, and it&#8217;s instructed to say no when unsure. A wrong merge poisons everything downstream; a missed merge just leaves two entries that a recurring cleanup job can unite later. Every merge is reversible by design.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uGYb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3db5e8d-85db-468a-acf8-4588b98a034c_1900x902.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uGYb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3db5e8d-85db-468a-acf8-4588b98a034c_1900x902.png 424w, https://substackcdn.com/image/fetch/$s_!uGYb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3db5e8d-85db-468a-acf8-4588b98a034c_1900x902.png 848w, https://substackcdn.com/image/fetch/$s_!uGYb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3db5e8d-85db-468a-acf8-4588b98a034c_1900x902.png 1272w, https://substackcdn.com/image/fetch/$s_!uGYb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3db5e8d-85db-468a-acf8-4588b98a034c_1900x902.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uGYb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3db5e8d-85db-468a-acf8-4588b98a034c_1900x902.png" width="1456" height="691" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d3db5e8d-85db-468a-acf8-4588b98a034c_1900x902.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:691,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:127692,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.minimumviablefounder.com/i/207183365?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3db5e8d-85db-468a-acf8-4588b98a034c_1900x902.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uGYb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3db5e8d-85db-468a-acf8-4588b98a034c_1900x902.png 424w, https://substackcdn.com/image/fetch/$s_!uGYb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3db5e8d-85db-468a-acf8-4588b98a034c_1900x902.png 848w, https://substackcdn.com/image/fetch/$s_!uGYb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3db5e8d-85db-468a-acf8-4588b98a034c_1900x902.png 1272w, https://substackcdn.com/image/fetch/$s_!uGYb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3db5e8d-85db-468a-acf8-4588b98a034c_1900x902.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Entity summaries are built &#8220;lazily&#8221;.</strong> Nothing gets an AI-written profile until someone actually asks about it. This is the lesson from Microsoft&#8217;s LazyGraphRAG work. We want costs that scale with usage instead of costs that scale with the size of the corpus.</p><p><strong>The AI decides what retrieval strategy (graph vs text) to use for a given query.</strong> The agent answering your question has plain search for needle questions, a &#8220;resolve&#8221; tool that pulls everything about one entity, &#8220;expand&#8221; that walks to related entities (similar to &#8220;hopping&#8221; a graph database), and exact counting over the whole corpus for list questions. You can watch it chain these together. See the example below: we ask a broad portfolio-style question. It first uses <em>facet</em> to count entities (in this case companies) that get mentioned frequently in the context of food delivery, and then <em>resolves</em> each entity to dig deeper. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JNyS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e473819-68c1-4263-aaf0-200321792041_1658x1460.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JNyS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e473819-68c1-4263-aaf0-200321792041_1658x1460.png 424w, https://substackcdn.com/image/fetch/$s_!JNyS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e473819-68c1-4263-aaf0-200321792041_1658x1460.png 848w, https://substackcdn.com/image/fetch/$s_!JNyS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e473819-68c1-4263-aaf0-200321792041_1658x1460.png 1272w, https://substackcdn.com/image/fetch/$s_!JNyS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e473819-68c1-4263-aaf0-200321792041_1658x1460.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JNyS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e473819-68c1-4263-aaf0-200321792041_1658x1460.png" width="1456" height="1282" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1e473819-68c1-4263-aaf0-200321792041_1658x1460.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1282,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:310322,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.minimumviablefounder.com/i/207183365?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e473819-68c1-4263-aaf0-200321792041_1658x1460.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JNyS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e473819-68c1-4263-aaf0-200321792041_1658x1460.png 424w, https://substackcdn.com/image/fetch/$s_!JNyS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e473819-68c1-4263-aaf0-200321792041_1658x1460.png 848w, https://substackcdn.com/image/fetch/$s_!JNyS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e473819-68c1-4263-aaf0-200321792041_1658x1460.png 1272w, https://substackcdn.com/image/fetch/$s_!JNyS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e473819-68c1-4263-aaf0-200321792041_1658x1460.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Does it work?</h2><p>I&#8217;m obsessed with measurement, so before building any of this we developed an evaluation harness: a corpus of thousands of real documents and a graded set of questions across all three question types, scored automatically. Every architectural decision above had to move a number or it didn&#8217;t ship. In the end, the entity layer produced a clear uplift on exactly the question classes where plain RAG fails (portfolio and counting questions) while leaving needle questions at ceiling. The eval system deserves its own write-up so maybe I&#8217;ll get to that in a future post.</p><h2>The trade-offs</h2><p>It doesn&#8217;t do deep multi-hop reasoning. If your use case is &#8220;find the hidden path between these two entities four steps apart&#8221;, you want a real graph that can handle complex traversal.</p><p>Our links are co-occurrence, not typed relationships: the system knows that the company Acme and the person Jane Smith appear together constantly, but not that she&#8217;s the CEO. Our thesis is that, once the AI is supplied with the surrounding context for these two entities, it can gracefully deduce that Jane is the CEO without having to encode this in the graph itself.</p><p>Our conservative merging also means an occasional entity exists twice for a day until the cleanup job unifies it.</p><p>If your corpus is small and static, and your questions require you to connect tenuous dots across the graph, full GraphRAG is a good choice and the costs are probably worth it. Our bet is different: for working companies with living document sets, the graph-like version captures most of the value at a fraction of the cost and none of the operational weight.</p><h2>The self-serve factor</h2><p>Everything above runs self-serve. Connect Google Drive, SharePoint, Notion, Granola etc, and decide how frequently you want them to sync. The system extracts, resolves, links, and trues itself up on a schedule, and the costs of that upkeep scale with what changed, not with how much you&#8217;ve stored. Nobody designs a schema or labels anything. That was the constraint we started with, and I believe it was the best design decision we made.</p><div><hr></div><p><em>This is how we approached it at QX Labs. If you&#8217;re wrestling with the same problems, or you think we&#8217;re wrong somewhere, I&#8217;d love to exchange notes.</em></p><p><strong>Sources and further reading:</strong></p><ul><li><p>Lewis et al., <em><a href="https://arxiv.org/abs/2005.11401">Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks</a> </em>(arXiv:2005.11401), the first paper to propose RAG</p></li><li><p>Edge et al., <em><a href="https://arxiv.org/abs/2404.16130">From Local to Global: A Graph RAG Approach to Query-Focused Summarization</a></em> (arXiv:2404.16130), the original Microsoft GraphRAG paper</p></li><li><p>Microsoft Research, <em><a href="https://www.microsoft.com/en-us/research/blog/lazygraphrag-setting-a-new-standard-for-quality-and-cost/">LazyGraphRAG: Setting a new standard for quality and cost</a></em> (Nov 2024), source of the 0.1% indexing cost and 700x query cost comparisons</p></li><li><p>Han et al., <em><a href="https://arxiv.org/abs/2502.11371">RAG vs. GraphRAG: A Systematic Evaluation and Key Insights</a></em> (arXiv:2502.11371)</p></li><li><p>Anthropic, <em><a href="https://www.anthropic.com/engineering/contextual-retrieval">Introducing Contextual Retrieval</a></em> (2024), the highest-evidence cheap retrieval upgrade we adopted, measured at a 49% reduction in retrieval failures</p></li></ul><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6q-N!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6q-N!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 424w, https://substackcdn.com/image/fetch/$s_!6q-N!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 848w, https://substackcdn.com/image/fetch/$s_!6q-N!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 1272w, https://substackcdn.com/image/fetch/$s_!6q-N!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6q-N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp" width="368" height="92" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:368,&quot;bytes&quot;:26478,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6q-N!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 424w, https://substackcdn.com/image/fetch/$s_!6q-N!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 848w, https://substackcdn.com/image/fetch/$s_!6q-N!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 1272w, https://substackcdn.com/image/fetch/$s_!6q-N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.minimumviablefounder.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div>]]></content:encoded></item><item><title><![CDATA[Deep Research: How It Works and How to Build It]]></title><description><![CDATA[The architecture behind OpenAI, Google and Perplexity's research agents, explained by someone who built one. Code included.]]></description><link>https://www.minimumviablefounder.com/p/deep-research-how-it-works</link><guid isPermaLink="false">https://www.minimumviablefounder.com/p/deep-research-how-it-works</guid><dc:creator><![CDATA[Jai Juneja]]></dc:creator><pubDate>Tue, 25 Mar 2025 13:04:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vaO8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da3c1a1-5388-470e-b5cd-ba866753b8b9_982x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><p><em>&#128075; Hey, Jai here! I&#8217;m a software engineer and tech investor turned solo founder building a bootstrapped software company. I write about using AI to build faster, sell smarter, and run a whole company solo. New here? Join me:</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.minimumviablefounder.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.minimumviablefounder.com/subscribe?"><span>Subscribe now</span></a></p><p><em>Or if you don&#8217;t like my work, send me <a href="mailto:hatemail@qxlabs.com?subject=I%20hate%20you">hate mail</a>.</em></p><div><hr></div><h2>Before we dive in...</h2><p>If you&#8217;re keen to understand how deep research works, you can play with my Python implementation <strong><a href="https://github.com/qx-labs/agents-deep-research">here</a></strong> (~800 stars on GitHub) or install it with `pip install deep-researcher`. It produces detailed reports with one CLI command:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;shell&quot;,&quot;nodeId&quot;:&quot;2dc6c875-1ebe-4a72-a3f8-3b2848cc1f52&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-shell">deep-researcher --query "Write about Plato's life and works" </code></pre></div><div><hr></div><h2>A New Hope</h2><p>Back in 2023, <strong><a href="https://github.com/Significant-Gravitas/AutoGPT">AutoGPT</a></strong> dropped &#8212; and it felt like magic. It was the first major example we had of an AI agent that could <em>plan and execute complex tasks</em> autonomously. Given a high-level goal, it would break problems down into sub-tasks and use tools in a continuous loop to solve them. It could google stuff, open websites, write files, and even reflect on its own performance.</p><p>But... it also kind of sucked.</p><ul><li><p>It got stuck in loops</p></li><li><p>It forgot what it was doing mid-way</p></li><li><p>It hallucinated confidently</p></li><li><p>It burned through tokens (and your wallet)</p></li></ul><div><hr></div><h2>The LLM As The &#8220;Central Brain&#8221;</h2><p>Despite these limitations, AutoGPT and similar prototypes <strong>proved the concept</strong> of autonomous agentic AI. They established a basic architecture that many later systems would build on: an LLM as the central &#8220;brain&#8221;.</p><p>Research from this period introduced techniques like <strong><a href="https://arxiv.org/abs/2210.03629">ReAct (Reason + Act)</a></strong>, which had the model interweave reasoning statements with tool calls (e.g. &#8220;Thought: ...; Action: ...&#8221;), rather than issuing commands without explanation&#8203;. This helped create an internal chain-of-thought and reduced obvious failures. Other experiments introduced forms of self-reflection (having the model critique its own past actions) to prevent it from getting stuck in loops.</p><p>The early agent systems laid the groundwork by identifying what was needed: the ability to decompose tasks, remember intermediate results, leverage external knowledge sources, and safely remain goal-directed.</p><div><hr></div><h2>What Was Missing</h2><p>These early recursive agents needed 4 critical upgrades to work well:</p><ol><li><p><strong>Larger context windows</strong>: To <em>remember</em> the original task as well as historical actions and findings. GPT-3.5 originally had a context window of only 4k tokens vs 128k for GPT-4o and 200k for o3-mini.</p></li><li><p><strong>Multi-modal capability</strong>: To enable agents to interpret and interact with more resources - especially images.</p></li><li><p><strong>A stronger ecosystem of tools</strong>: The ability to use browsers, search the web, execute code in a sandboxed environment, access local files and APIs etc. The open source community has seen an explosion of tooling in the last year, for example:</p><ul><li><p><strong><a href="https://github.com/browser-use/browser-use">Browser Use</a></strong> to control browsers</p></li><li><p><strong><a href="https://tavily.com/">Tavily</a></strong>, <strong><a href="https://exa.ai/">Exa</a></strong>, <strong><a href="https://www.firecrawl.dev/">Firecrawl</a></strong> and <strong><a href="https://github.com/unclecode/crawl4ai">Crawl4AI</a></strong> for web search and retrieval</p></li><li><p><strong><a href="https://e2b.dev/">E2B</a></strong> for executing code in a sandbox</p></li><li><p>The <strong><a href="https://github.com/modelcontextprotocol">MCP protocol</a></strong> from Anthropic</p></li></ul></li><li><p><strong>Better tool selection capability</strong>: To actually pick the right tool for each task without getting stuck in loops, hallucinating or veering off-topic. GPT-4o, 4o-mini and o3-mini introduce massive improvements in tool-selection. <strong><a href="https://gorilla.cs.berkeley.edu/leaderboard.html">This leaderboard</a></strong> is my favourite reference on this - what&#8217;s incredible is how performant 4o-mini is despite being 10-50x cheaper (and substantially faster) than similarly ranked models.</p></li></ol><div><hr></div><h2>Fast Forward to Now...</h2><p>Huge improvements across all three fronts have led to the rise of:</p><ul><li><p><strong>Deep research agents</strong>: OpenAI, Google, Perplexity all offer their own versions of deep research.</p></li><li><p><strong>Open-source versions</strong>: <strong><a href="https://huggingface.co/blog/open-deep-research">Hugging Face</a></strong>, <strong><a href="https://github.com/langchain-ai/local-deep-researcher">LangChain</a></strong> and even <strong><a href="https://github.com/qx-labs/agents-deep-research">my own version</a></strong></p></li><li><p><strong>Other agentic apps</strong>: Like <strong><a href="https://manus.im/">Manus AI</a></strong> for general tasks, <strong><a href="https://convergence.ai/">Convergence</a></strong> for productivity, <strong><a href="https://github.com/RooVetGit/Roo-Code">Roo Code</a></strong> for coding. These combine deep research logic with broader, multi-tool capabilities - think coding, file analysis, PDFs, browsing, image understanding, etc.</p></li></ul><div><hr></div><h2>How Deep Research Works</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rOrb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e7f5343-a1c6-47e4-9b3e-ca41cedb16b2_1026x642.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rOrb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e7f5343-a1c6-47e4-9b3e-ca41cedb16b2_1026x642.png 424w, https://substackcdn.com/image/fetch/$s_!rOrb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e7f5343-a1c6-47e4-9b3e-ca41cedb16b2_1026x642.png 848w, https://substackcdn.com/image/fetch/$s_!rOrb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e7f5343-a1c6-47e4-9b3e-ca41cedb16b2_1026x642.png 1272w, https://substackcdn.com/image/fetch/$s_!rOrb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e7f5343-a1c6-47e4-9b3e-ca41cedb16b2_1026x642.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rOrb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e7f5343-a1c6-47e4-9b3e-ca41cedb16b2_1026x642.png" width="1026" height="642" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9e7f5343-a1c6-47e4-9b3e-ca41cedb16b2_1026x642.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:642,&quot;width&quot;:1026,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Deep Research Paradigms&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Deep Research Paradigms" title="Deep Research Paradigms" srcset="https://substackcdn.com/image/fetch/$s_!rOrb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e7f5343-a1c6-47e4-9b3e-ca41cedb16b2_1026x642.png 424w, https://substackcdn.com/image/fetch/$s_!rOrb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e7f5343-a1c6-47e4-9b3e-ca41cedb16b2_1026x642.png 848w, https://substackcdn.com/image/fetch/$s_!rOrb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e7f5343-a1c6-47e4-9b3e-ca41cedb16b2_1026x642.png 1272w, https://substackcdn.com/image/fetch/$s_!rOrb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e7f5343-a1c6-47e4-9b3e-ca41cedb16b2_1026x642.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You can think of two paradigms for building AI apps that sit on opposite ends of a spectrum.</p><ul><li><p><strong>Workflow tools</strong> follow a <em>fixed flow</em> often in a loop<br>E.g. Think &#8594; Search &#8594; Read &#8594; Repeat &#8594; Summarize.</p></li><li><p><strong>Purely agentic tools</strong> go wild with autonomy<br>E.g. one or many agents with defined roles autonomously deciding what tools to use, what to do next, who to pass tasks to, and when they&#8217;ve finished their task. This could mimic human teams - a supervisor, line-manager, teams of analysts working on sub-tasks.</p></li></ul><p>Most <strong>real-world implementations sit somewhere in between</strong>. Bear in mind that Deep Research is just one use-case (i.e. producing long reports), but similar frameworks with a wider set of tooling can cater to broader use-cases. For example, Manus AI demonstrates what you can achieve with a set of agents wrapped around Claude and Qwen with access to 29 tools. Under the hood, all of these apps are using fairly fixed workflows to minimise token usage and improve reliability.</p><h3>OpenAI&#8217;s Approach (Deep Research)</h3><ul><li><p>Based on a smart model (o3, not yet available via API) <em>fine-tuned</em> for multi-step reasoning and tool use</p></li><li><p>Uses an internal framework to plan &#8594; search &#8594; read &#8594; think &#8594; write</p></li><li><p>Utilizes their in-house browser tool (<strong>Operator</strong>) to interact with the web</p></li><li><p>Has the ability to backtrack to avoid getting stuck in loops</p></li><li><p>Outputs full reports with <strong>citations and source traceability</strong></p></li><li><p>Achieves <strong>state-of-the-art results</strong> on real-world benchmarks (GAIA, etc.)</p></li><li><p>But: it&#8217;s proprietary, compute-intensive, and gated to higher-tier users</p></li></ul><h3>Open Source Agents</h3><p>Most open-source approaches:</p><ul><li><p>Stick with <strong>workflow-first logic</strong> (to keep things predictable and cheap)</p></li><li><p>Can achieve <em>surprisingly good performance</em> even with open models like DeepSeek</p></li><li><p>Are often <strong>faster and cheaper</strong> to run and highly customizable.</p></li></ul><p>But they don&#8217;t yet have:</p><ul><li><p>Vision support (unless you bolt it on)</p></li><li><p>Sophisticated browsers like OpenAI&#8217;s Operator</p></li><li><p>As much safety and hallucination mitigation</p></li></ul><p>Hugging Face&#8217;s implementation uses <strong>code-based agents</strong>: instead of saying &#8220;search for X using the search tool&#8221; (in a JSON output), the model writes Python code to do it. This might sound odd at first, but it has some powerful advantages:</p><ul><li><p>Code can express more complex logic than a single / sequential set of tool calls</p></li><li><p>Code is more concise - e.g. it can write code to run a bunch of tools in parallel, which lowers token usage</p></li><li><p>LLMs are good at writing code and can self-debug if there are errors</p></li></ul><p>A <strong><a href="https://huggingface.co/papers/2402.01030">recent paper</a></strong> showed that letting the agent express complex action sequences in code can make the whole process more efficient and reliable&#8203;. The Hugging Face open deep research project implemented this idea and saw a big boost in performance: their accuracy on one benchmark jumped from <strong><a href="https://huggingface.co/blog/open-deep-research#:~:text=This%20bump%20in%20performance%20is%20due,average%20on%20the%20validation%20set">33% to 55%</a></strong> simply by switching from JSON-style actions to code-style actions (with the same underlying model and tasks).</p><div><hr></div><h2>The QX Labs Implementation</h2><p>For illustration, let me break down how my implementation works.</p><blockquote><p><em><strong>TL;DR: It leans workflow-heavy but with autonomy on tool selection and async execution for scale.</strong></em></p></blockquote><ol><li><p>Carries out initial research on the query to understand the topic</p></li><li><p>Splits the research topic into sub-topics and sub-sections</p></li><li><p>Iteratively runs research on each sub-topic - this is done in async/parallel to maximise speed</p></li><li><p>Consolidates all findings into a single report with references</p></li><li><p>(Optional) Includes a full trace of the workflow and agent calls in OpenAI&#8217;s trace system</p></li></ol><p>It has 2 modes:</p><ul><li><p><strong>Simple Mode</strong><br>Runs the iterative researcher (Step 3 above) on the full query in one go.<br>Great for fast answers on narrower topics.</p></li><li><p><strong>Deep Mode</strong><br>Runs the planning phase (Step 1+2 above) then spawns concurrent researchers for each sub-topic.<br>Ideal for multi-dimensional or expansive research questions.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!r8XC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fe69c31-ece8-4eb3-9f88-4bf7211b4eca_382x847.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!r8XC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fe69c31-ece8-4eb3-9f88-4bf7211b4eca_382x847.png 424w, https://substackcdn.com/image/fetch/$s_!r8XC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fe69c31-ece8-4eb3-9f88-4bf7211b4eca_382x847.png 848w, https://substackcdn.com/image/fetch/$s_!r8XC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fe69c31-ece8-4eb3-9f88-4bf7211b4eca_382x847.png 1272w, https://substackcdn.com/image/fetch/$s_!r8XC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fe69c31-ece8-4eb3-9f88-4bf7211b4eca_382x847.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!r8XC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fe69c31-ece8-4eb3-9f88-4bf7211b4eca_382x847.png" width="382" height="847" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5fe69c31-ece8-4eb3-9f88-4bf7211b4eca_382x847.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:847,&quot;width&quot;:382,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Deep Research - Simple Mode&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Deep Research - Simple Mode" title="Deep Research - Simple Mode" srcset="https://substackcdn.com/image/fetch/$s_!r8XC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fe69c31-ece8-4eb3-9f88-4bf7211b4eca_382x847.png 424w, https://substackcdn.com/image/fetch/$s_!r8XC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fe69c31-ece8-4eb3-9f88-4bf7211b4eca_382x847.png 848w, https://substackcdn.com/image/fetch/$s_!r8XC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fe69c31-ece8-4eb3-9f88-4bf7211b4eca_382x847.png 1272w, https://substackcdn.com/image/fetch/$s_!r8XC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fe69c31-ece8-4eb3-9f88-4bf7211b4eca_382x847.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vaO8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da3c1a1-5388-470e-b5cd-ba866753b8b9_982x512.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vaO8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da3c1a1-5388-470e-b5cd-ba866753b8b9_982x512.png 424w, https://substackcdn.com/image/fetch/$s_!vaO8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da3c1a1-5388-470e-b5cd-ba866753b8b9_982x512.png 848w, https://substackcdn.com/image/fetch/$s_!vaO8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da3c1a1-5388-470e-b5cd-ba866753b8b9_982x512.png 1272w, https://substackcdn.com/image/fetch/$s_!vaO8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da3c1a1-5388-470e-b5cd-ba866753b8b9_982x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vaO8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da3c1a1-5388-470e-b5cd-ba866753b8b9_982x512.png" width="982" height="512" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7da3c1a1-5388-470e-b5cd-ba866753b8b9_982x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:512,&quot;width&quot;:982,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Deep Research - Deep Mode&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Deep Research - Deep Mode" title="Deep Research - Deep Mode" srcset="https://substackcdn.com/image/fetch/$s_!vaO8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da3c1a1-5388-470e-b5cd-ba866753b8b9_982x512.png 424w, https://substackcdn.com/image/fetch/$s_!vaO8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da3c1a1-5388-470e-b5cd-ba866753b8b9_982x512.png 848w, https://substackcdn.com/image/fetch/$s_!vaO8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da3c1a1-5388-470e-b5cd-ba866753b8b9_982x512.png 1272w, https://substackcdn.com/image/fetch/$s_!vaO8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7da3c1a1-5388-470e-b5cd-ba866753b8b9_982x512.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>&#128161; Interesting Findings</h3><ul><li><p><strong>gpt-4o-mini</strong> works surprisingly well for this use case</p><ul><li><p>Matches o3-mini on <strong><a href="https://gorilla.cs.berkeley.edu/leaderboard.html">tool-use benchmarks</a></strong></p></li><li><p>Faster + cheaper</p></li><li><p>You don&#8217;t need the full GPT-4o brain since deep research relies more on <em>retrieved content</em> than parametric knowledge</p></li></ul></li><li><p>LLMs <strong>suck at following word count instructions</strong></p><ul><li><p>Better to use heuristics they&#8217;ve seen before like:</p><ul><li><p>&#8220;Length of a tweet&#8221;</p></li><li><p>&#8220;A few paragraphs&#8221;</p></li><li><p>&#8220;2 pages of text&#8221;</p></li></ul></li></ul></li><li><p>Most LLMs <strong>cap at ~2,000 words of output</strong> even though they can in theory output thousands more tokens</p><ul><li><p>Why? Because they weren&#8217;t trained to write 50-page documents</p></li><li><p>Want longer reports?</p><ul><li><p>Use a streaming writer pattern that chains LLM outputs (like <strong><a href="https://medium.com/@techsachin/longwriter-using-llm-agent-based-pipeline-to-scale-llms-output-window-size-to-10-000-words-33210d299e2b">this approach</a></strong>)</p></li><li><p>Or chunk by section and concatenate intelligently (watch out for repetition)</p></li></ul></li></ul></li></ul><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6q-N!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6q-N!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 424w, https://substackcdn.com/image/fetch/$s_!6q-N!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 848w, https://substackcdn.com/image/fetch/$s_!6q-N!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 1272w, https://substackcdn.com/image/fetch/$s_!6q-N!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6q-N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp" width="368" height="92" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:368,&quot;bytes&quot;:26478,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6q-N!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 424w, https://substackcdn.com/image/fetch/$s_!6q-N!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 848w, https://substackcdn.com/image/fetch/$s_!6q-N!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 1272w, https://substackcdn.com/image/fetch/$s_!6q-N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581ab53c-5e6e-414c-8008-5ded7a60bb59_1456x364.webp 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.minimumviablefounder.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div>]]></content:encoded></item><item><title><![CDATA[New beginnings]]></title><description><![CDATA[Let's get it started.]]></description><link>https://www.minimumviablefounder.com/p/new-beginnings</link><guid isPermaLink="false">https://www.minimumviablefounder.com/p/new-beginnings</guid><dc:creator><![CDATA[Jai Juneja]]></dc:creator><pubDate>Tue, 25 Feb 2025 19:44:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a0ad8a15-1fe8-4587-8b89-ee53fc8a0bab_729x504.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Back in 2011, as a first-year undergraduate, I built and maintained a <strong><a href="https://www.jaijuneja.com/">not-so-professional personal website</a></strong>. It remained a moderately well-kept secret for years, until friends started discovering and sharing it for laughs. Now it&#8217;s become a running joke to reveal it to unsuspecting friends years into knowing them.</p><p>Being born in the &#8216;90s - and not named John Smith - made it easy to secure myfullname.com. My 14-year quest to buy j.ai, however, is a different story. The domain has remained in the same hands all these years, leased to various users including <strong><a href="https://jasper.ai/">jasper.ai</a></strong> most recently. The owner asked for $50k back in 2012. It&#8217;s now listed for sale for $5m so I&#8217;d say the budget constraint still holds.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dBhf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5e75553-da62-471a-97c9-cb9bbfdc00ff_729x504.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dBhf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5e75553-da62-471a-97c9-cb9bbfdc00ff_729x504.png 424w, https://substackcdn.com/image/fetch/$s_!dBhf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5e75553-da62-471a-97c9-cb9bbfdc00ff_729x504.png 848w, https://substackcdn.com/image/fetch/$s_!dBhf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5e75553-da62-471a-97c9-cb9bbfdc00ff_729x504.png 1272w, https://substackcdn.com/image/fetch/$s_!dBhf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5e75553-da62-471a-97c9-cb9bbfdc00ff_729x504.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dBhf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5e75553-da62-471a-97c9-cb9bbfdc00ff_729x504.png" width="729" height="504" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b5e75553-da62-471a-97c9-cb9bbfdc00ff_729x504.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:504,&quot;width&quot;:729,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:33938,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.minimumviablefounder.com/i/207346463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5e75553-da62-471a-97c9-cb9bbfdc00ff_729x504.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dBhf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5e75553-da62-471a-97c9-cb9bbfdc00ff_729x504.png 424w, https://substackcdn.com/image/fetch/$s_!dBhf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5e75553-da62-471a-97c9-cb9bbfdc00ff_729x504.png 848w, https://substackcdn.com/image/fetch/$s_!dBhf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5e75553-da62-471a-97c9-cb9bbfdc00ff_729x504.png 1272w, https://substackcdn.com/image/fetch/$s_!dBhf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5e75553-da62-471a-97c9-cb9bbfdc00ff_729x504.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>I recently had to update and migrate the old website just to keep it running. Expired SSL certificates, deprecated PHP code... total mess. But it was worth it just to salvage that sordid blog from the archives.</p><p>It also gave me renewed inspiration to maintain a subtle web presence - less so on social media, more so tucked away behind an obscure domain: <a href="https://j2.gg">j2.gg</a>.</p><h2>Why J2?</h2><ul><li><p>This is version 2 of my website: J1 -&gt; J2</p></li><li><p>It reflects my initials: JJ -&gt; J2</p></li><li><p>It&#8217;s a <strong><a href="https://en.wikipedia.org/wiki/Numeronym">numeronym</a></strong> for my name: Jai -&gt; J2</p></li></ul><p>Pick your interpretation.</p><h2>Why now?</h2><p>Two years ago I stepped out of the cushy world of investing and decided to bootstrap a <strong><a href="https://www.qxlabs.com/">software/SaaS company</a></strong> as a solo-founder. It was a curious choice given that the biggest edge I gained as an investor was the ability to fundraise, but a deliberate choice nonetheless. The framework behind bootstraping vs. fundraising is perhaps a discussion for another post.</p><p>Caution has been thrown to the wind and I&#8217;m learning a tonne along the way. I hope to share my thoughts and experiences here.</p><p>Stay tuned. &#9996;&#65039;</p>]]></content:encoded></item></channel></rss>