<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Naveen</title>
    <description>The latest articles on DEV Community by Naveen (@naveen_2cf3175f7e0a47cbbf).</description>
    <link>https://dev.to/naveen_2cf3175f7e0a47cbbf</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4029470%2F532e04dd-1102-4952-93c9-735fbdddaa7d.png</url>
      <title>DEV Community: Naveen</title>
      <link>https://dev.to/naveen_2cf3175f7e0a47cbbf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/naveen_2cf3175f7e0a47cbbf"/>
    <language>en</language>
    <item>
      <title>RAG Isn't Dying. It's Doing the One Thing Agents Can't.</title>
      <dc:creator>Naveen</dc:creator>
      <pubDate>Wed, 15 Jul 2026 03:33:00 +0000</pubDate>
      <link>https://dev.to/naveen_2cf3175f7e0a47cbbf/rag-isnt-dying-its-doing-the-one-thing-agents-cant-511l</link>
      <guid>https://dev.to/naveen_2cf3175f7e0a47cbbf/rag-isnt-dying-its-doing-the-one-thing-agents-cant-511l</guid>
      <description>&lt;h2&gt;
  
  
  Where Should the Knowledge Live? Building a Cite-or-Refuse RAG (and Weighing the Alternatives)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1ge9cgyvz6jymsstnrkx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1ge9cgyvz6jymsstnrkx.png" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I built a compliance RAG on one rule — &lt;strong&gt;every claim carries a real document reference, or the system refuses.&lt;/strong&gt; Then I went looking at the alternatives. Here's the honest accounting: what I built, what exploring PageIndex taught me, and what I found when I evaluated fine-tuning.&lt;/p&gt;

&lt;p&gt;Before any architecture, one requirement drove everything: &lt;strong&gt;an answer is only trustworthy if it points at a real source.&lt;/strong&gt; Not a paraphrase, not "the model is fairly sure" — a specific document, a specific page, an exact quote you can go read yourself.&lt;/p&gt;

&lt;p&gt;In any regulated or high-stakes domain, a confident wrong answer isn't an embarrassing bug — it's a liability. So the choice is stark: either be &lt;strong&gt;confident and cite the source&lt;/strong&gt;, or &lt;strong&gt;refuse to answer&lt;/strong&gt;. There's no safe middle ground where the system guesses and hopes. The system either returns an answer &lt;em&gt;with a citation attached to every claim&lt;/em&gt;, or it returns &lt;em&gt;"Insufficient evidence found."&lt;/em&gt; Refusing is not a failure mode. It's the core feature. A citation you can verify is what separates a tool a domain expert can defend from a chatbot that merely sounds authoritative.&lt;/p&gt;

&lt;p&gt;That one requirement — &lt;strong&gt;cite a real reference, or refuse&lt;/strong&gt; — turns out to decide almost every downstream choice. This post is the honest version of how those choices went: the RAG I actually built, the reasoning-tree approach I seriously explored, and the fine-tuning path I evaluated and set aside. I'll put real costs and real advantages next to each, and I'll end genuinely unsure about one thing and hoping you'll tell me what I'm missing.&lt;/p&gt;




&lt;h2&gt;
  
  
  1 · What I built — vector RAG with a hard refusal gate
&lt;/h2&gt;

&lt;p&gt;A fairly classic retrieval pipeline with one opinionated addition. Documents are parsed and split into chunks; each chunk is embedded and stored in a vector database. At query time I embed the question, pull the closest chunks, and — this is the part that matters — &lt;em&gt;score the strength of that top evidence and gate on it.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# the whole guarantee, in one line
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;confidence&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;refuse&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;          &lt;span class="c1"&gt;# "Insufficient evidence found."
&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# answer, each claim cited to a chunk
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because the answer is generated &lt;em&gt;from&lt;/em&gt; the retrieved chunks, every claim has somewhere to point: the source document, the page, the quoted span. And because refusal is a threshold on a real number, it's &lt;strong&gt;mechanical and auditable&lt;/strong&gt; — I can tell an auditor "the best evidence scored below our floor, so the system declined," and show them the number. That legibility is the whole reason the design exists.&lt;/p&gt;

&lt;p&gt;A few choices inside that pipeline mattered more than I expected:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parsing with &lt;a href="https://github.com/docling-project/docling" rel="noopener noreferrer"&gt;Docling&lt;/a&gt;.&lt;/strong&gt; Chunk quality caps retrieval quality — you can't cite a table the parser mangled. I use Docling, IBM's layout-aware parser, as the default loader because regulatory PDFs are full of tables, columns, and reading-order traps that a naive text extractor flattens into nonsense. (A lightweight &lt;code&gt;pypdf&lt;/code&gt; path stays available for simple text PDFs.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parent-child chunking.&lt;/strong&gt; This is the pattern I settled on: embed &lt;em&gt;small&lt;/em&gt; child chunks so retrieval stays precise, but hand the LLM the &lt;em&gt;larger&lt;/em&gt; parent chunk for context. Search on the needle, answer from the paragraph around it. It's meaningfully better than one flat chunk size trying to do both jobs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A swappable embedding model.&lt;/strong&gt; Embeddings decide what "close" even means, so I kept the model behind an interface. I default to a self-hosted BGE model (&lt;code&gt;bge-small-en-v1.5&lt;/code&gt;) to avoid shipping documents to a third party, with an OpenAI embedding path as a drop-in alternative for quick experiments. Different embedding models genuinely change which chunks surface — a dial worth testing, not set-and-forget.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cost profile
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;When you pay&lt;/th&gt;
&lt;th&gt;Order of magnitude&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chunking &amp;amp; ingest&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Once per corpus (re-run only when docs change)&lt;/td&gt;
&lt;td&gt;CPU-minutes to parse + split + embed the document set. Re-ingesting the whole corpus is minutes, not hours.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Retrieval&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Every query&lt;/td&gt;
&lt;td&gt;~1 embedding call for the question + a millisecond-scale vector lookup. Cheap enough to be interactive.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Generation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Every answered query&lt;/td&gt;
&lt;td&gt;One LLM call over the retrieved context. Refusals skip it entirely — refusing is nearly free.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Advantages
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Citations are native.&lt;/strong&gt; The answer is built from chunks, so every claim already has an address.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refusal is a hard signal.&lt;/strong&gt; Weak retrieval → low score → decline. No model judgment required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Updates are cheap.&lt;/strong&gt; A rule changes, you re-ingest one file in minutes. The knowledge lives outside the model, on disk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fully auditable.&lt;/strong&gt; Every answer and every refusal traces to an observable step.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The honest weakness
&lt;/h3&gt;

&lt;p&gt;Retrieval is only as good as similarity. Embedding-based search matches on &lt;em&gt;topical closeness&lt;/em&gt;, not on whether a passage truly &lt;em&gt;supports&lt;/em&gt; the answer — so a question about one threshold can surface a high-scoring chunk about a &lt;em&gt;different&lt;/em&gt; threshold in the same family. High score, wrong rule. That single weakness is what sent me exploring the next two approaches.&lt;/p&gt;




&lt;h2&gt;
  
  
  2 · What I explored — reasoning-tree retrieval (PageIndex)
&lt;/h2&gt;

&lt;p&gt;The near-miss weakness above is a known limitation of pure similarity search, and reasoning-tree approaches like &lt;a href="https://github.com/VectifyAI/PageIndex" rel="noopener noreferrer"&gt;PageIndex&lt;/a&gt; attack it head-on. Instead of chunk-and-embed, they build a &lt;em&gt;hierarchical map&lt;/em&gt; of each document — a table of contents with summarized nodes — and let an LLM &lt;em&gt;navigate&lt;/em&gt; it at query time, asking "which section most likely contains this answer?" the way a person uses an index. There's no embedding-similarity step in the core path at all.&lt;/p&gt;

&lt;p&gt;I explored this seriously because the fit for structured regulatory text is genuinely strong: regs are deeply hierarchical, and a reasoner asking "does this section actually address the question?" is far less likely to be fooled by the vocabulary-overlap near-miss that trips up cosine similarity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cost profile
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;When you pay&lt;/th&gt;
&lt;th&gt;Order of magnitude&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tree build / index&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Once per corpus&lt;/td&gt;
&lt;td&gt;More than chunking — you're summarizing nodes with an LLM, so it's LLM-calls at build time, not just CPU-minutes. Still a one-time, re-runnable cost.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Retrieval&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Every query&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Multiple LLM calls per query&lt;/strong&gt; — each navigation hop is a model call. Meaningfully slower and pricier per query than a vector lookup, and it grows with tree depth.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Generation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Every answered query&lt;/td&gt;
&lt;td&gt;One LLM call over the selected nodes, same as RAG.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Advantages
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Structure-aware.&lt;/strong&gt; It exploits the document hierarchy that vector search flattens away.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fewer near-misses.&lt;/strong&gt; Reasoning about relevance beats measuring distance on structured text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Still citable.&lt;/strong&gt; Answers point at real tree nodes — the cite-a-source property survives.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why I didn't just swap it in
&lt;/h3&gt;

&lt;p&gt;The catch is what it does to &lt;em&gt;refusal&lt;/em&gt;. My gate thresholds a scalar — the strength of the top evidence. A navigation trace doesn't natively produce that number; refusal would become "the model decided the tree had no answer," which is a &lt;em&gt;softer, model-judged&lt;/em&gt; signal than a threshold I can defend line-by-line. Add the per-query latency and cost of multiple LLM hops on an interactive system, and the tradeoff isn't obvious.&lt;/p&gt;




&lt;h2&gt;
  
  
  3 · What I evaluated — fine-tuning a base model on the PDFs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;An honest disclaimer first:&lt;/strong&gt; fine-tuning is not my area of hands-on expertise. I haven't trained a model on this corpus, and I won't pretend the cost figures below come from my own training runs — they're my best understanding of the shape of the work, not measured numbers. I evaluated this path on paper, reasoned about how it collides with the cite-or-refuse requirement, and decided not to build it. &lt;strong&gt;If you've actually done this and I've got something wrong, I especially want to hear from you.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With that said: the most tempting idea, and the one I spent the most time reasoning through before deciding &lt;em&gt;not&lt;/em&gt; to build it, is to stop retrieving and just train a base model on the documents so it "knows" them. It sounds like the more advanced move. Evaluated against the cite-or-refuse requirement, it comes apart — and the failure looks structural rather than a matter of quality.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cost profile
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;When you pay&lt;/th&gt;
&lt;th&gt;Order of magnitude&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dataset build&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Before every training run&lt;/td&gt;
&lt;td&gt;Turning raw PDFs into training pairs is real, manual, error-prone work — and it has to be redone as the corpus grows.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Training&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Per update&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;GPU-hours&lt;/strong&gt; (and the dollars that come with them) for each run. Not interactive, not incremental — a batch job.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A rule changes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Per change&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Retrain&lt;/strong&gt; to unlearn a stale figure. Compare: RAG re-ingests one file in minutes. This is the cost that compounds most painfully.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inference&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Every query&lt;/td&gt;
&lt;td&gt;One model call — genuinely cheap and fast per query. The cheapest column, and the only one where fine-tuning wins.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Advantages (and I want to be fair to them)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fast, self-contained inference.&lt;/strong&gt; No retrieval hop, no vector store to run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fluent, in-domain phrasing.&lt;/strong&gt; The model internalizes the vocabulary and reads as a native of the domain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No retrieval infrastructure&lt;/strong&gt; to build, host, or keep healthy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why it fails the requirement anyway
&lt;/h3&gt;

&lt;p&gt;Every advantage above is real, and none of them matter if the system can't do the one thing it exists to do. Three problems that look structural to me, in order of how badly they seem to hurt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No source to cite.&lt;/strong&gt; Knowledge in the weights is generated from parametric memory — there's no chunk, no page, no quote to attach. The answer &lt;em&gt;requires&lt;/em&gt; a citation and the model has nothing to fill it with. That alone disqualifies it here.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confident exactly where it's dangerous.&lt;/strong&gt; Regulations turn on precise figures, and a fine-tuned model produces them fluently whether or not it memorized the right one. The near-miss confusion doesn't get fixed — it gets baked into the weights, invisible and un-inspectable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It can't refuse.&lt;/strong&gt; A retrieval system has a real "found nothing" state. A generative model always generates — there's no mechanical place for the gate to stand, and no honest way for it to say "the rule is silent on this."&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Where I landed:&lt;/strong&gt; Fine-tuning is the wrong tool for &lt;em&gt;knowledge&lt;/em&gt; and the right tool for &lt;em&gt;behavior&lt;/em&gt;. I won't train facts into a generator I need to cite and audit — that just produces a more fluent, less honest answer. If I fine-tune anything, it'll be the &lt;em&gt;retriever&lt;/em&gt; — a domain-tuned embedder or reranker sharpens which evidence surfaces while every guarantee stays intact.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The pattern underneath all three
&lt;/h2&gt;

&lt;p&gt;Line the three up and they're answers to one question — &lt;em&gt;where does the knowledge live?&lt;/em&gt; Vector RAG and reasoning-trees keep it &lt;strong&gt;outside&lt;/strong&gt; the model, where it can be quoted, swapped when a rule changes, audited by a stranger, and reported as &lt;em&gt;absent&lt;/em&gt; when it's missing. Fine-tuning moves it &lt;strong&gt;inside&lt;/strong&gt;, where it can't be cited, goes stale silently, and never admits it doesn't know.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Vector RAG (I built)&lt;/th&gt;
&lt;th&gt;Reasoning tree (I explored)&lt;/th&gt;
&lt;th&gt;Fine-tune (I evaluated)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cite a real reference&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ from the chunk&lt;/td&gt;
&lt;td&gt;✅ from tree nodes&lt;/td&gt;
&lt;td&gt;❌ no address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hard, auditable refusal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ score &amp;lt; threshold&lt;/td&gt;
&lt;td&gt;⚠️ soft, model-judged&lt;/td&gt;
&lt;td&gt;❌ always generates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost to update a rule&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ minutes (re-ingest)&lt;/td&gt;
&lt;td&gt;✅ minutes (re-index)&lt;/td&gt;
&lt;td&gt;❌ retrain (GPU-hours)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Per-query cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ low (1 embed + lookup)&lt;/td&gt;
&lt;td&gt;⚠️ high (multi-hop LLM)&lt;/td&gt;
&lt;td&gt;✅ low (1 model call)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Confident-hallucination risk&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ low (gated)&lt;/td&gt;
&lt;td&gt;⚠️ low–med&lt;/td&gt;
&lt;td&gt;❌ high (baked in)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read down the columns: the two that keep knowledge external can do what a compliance system must; the one that internalizes it can't. For &lt;em&gt;my&lt;/em&gt; requirement this isn't a close call decided by retrieval accuracy — it's decided by topology, upstream of any benchmark.&lt;/p&gt;

&lt;p&gt;And the discipline that held across all three was the same: &lt;strong&gt;don't optimize a number you can't see.&lt;/strong&gt; Build the instrument — a set of questions that &lt;em&gt;should&lt;/em&gt; be refused, and one honest metric for how often the system answers when it should have stayed silent — then let measurements settle the debates that demos can't.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where I'm genuinely unsure — tell me what I'm missing
&lt;/h2&gt;

&lt;p&gt;I've committed to external knowledge and a hard refusal gate because the compliance domain seems to demand it. But I hold that conviction loosely, and there are a few directions I haven't resolved. I'd genuinely like your read on any of these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid over either/or?&lt;/strong&gt; Is the real answer a reasoning-tree &lt;em&gt;retriever&lt;/em&gt; feeding a threshold-able confidence signal — PageIndex's navigation quality with RAG's hard gate? Has anyone made tree-retrieval produce a defensible refusal number?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fine-tuning the retriever, not the generator.&lt;/strong&gt; A domain-tuned embedder or reranker on hard near-miss pairs seems like the one place training helps without costing me a guarantee. Worth it, or is a good reranker enough?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is a threshold too blunt?&lt;/strong&gt; "Confidence &amp;lt; X → refuse" is legible, but a single scalar is a crude proxy for "does this evidence actually support the claim." What's a better refusal signal that stays auditable?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Am I wrong about fine-tuning entirely?&lt;/strong&gt; Is there a citation-preserving way to put knowledge in weights that I'm dismissing too fast?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've built something in this space — or you think I've drawn a line in the wrong place — I'd love to hear it. &lt;strong&gt;Comments, disagreements, and "you missed an approach" are all very welcome.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>rag</category>
      <category>llm</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
