<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Ethan Tenison — Blog</title>
<link>https://etenison.com/blog.html</link>
<atom:link href="https://etenison.com/blog.xml" rel="self" type="application/rss+xml"/>
<description>Writing on applied AI/ML, production machine learning, and Bayesian reasoning.</description>
<generator>quarto-1.9.36</generator>
<lastBuildDate>Tue, 14 Apr 2026 05:00:00 GMT</lastBuildDate>
<item>
  <title>When GraphRAG is worth it</title>
  <dc:creator>Ethan Tenison</dc:creator>
  <link>https://etenison.com/posts/2026-04-14-when-graphrag-worth-it/</link>
  <description><![CDATA[ 





<p>People often reach for GraphRAG too early, but a graph only adds value when the answer actually depends on relationships that plain retrieval cannot preserve.</p>
<p>That is the practical question. Not whether a graph is elegant, but whether the problem is relational enough to justify the cost. If the task is simple lookup, summarization, or FAQ-style retrieval, a well-built RAG system is usually enough. If the answer depends on entities, links, dependencies, or multi-hop reasoning, GraphRAG can add real value.</p>
<p>In other words, a graph does not make a system smarter by itself. It helps only when the structure of the data matters to the answer. The decision flow below in Figure&nbsp;1 is the simplest version of the rule I use in practice. It also sets up the legal example that follows.</p>
<div class="cell" data-layout-align="default">
<div class="cell-output-display">
<div id="fig-rag-vs-graphrag" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-rag-vs-graphrag-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<div>
<pre class="mermaid mermaid-js" data-label="fig-rag-vs-graphrag">flowchart TD
 A["Answer in a few chunks?"]
 C["Missing text, not structure?"]
 B["Do relationships matter?"]

 R["Use RAG"]
 G["Use GraphRAG"]

 A --&gt;|Yes| R
 A --&gt;|No| C

 C --&gt;|Yes| R
 C --&gt;|No| B

 B --&gt;|No| R
 B --&gt;|Yes| G

 style A fill:#FAF7F2,color:#2A1F1A,stroke:#2A1F1A,stroke-width:2.25px
 style B fill:#FAF7F2,color:#2A1F1A,stroke:#2A1F1A,stroke-width:2.25px
 style C fill:#FAF7F2,color:#2A1F1A,stroke:#2A1F1A,stroke-width:2.25px

 style R fill:#EDE0D4,color:#2A1F1A,stroke:#2A1F1A,stroke-width:1.75px
 style G fill:#6B7A3A,color:#FAF7F2,stroke:#2A1F1A,stroke-width:2.5px

 linkStyle 0 stroke:#3D3530,stroke-width:2.25px,color:#2A1F1A
 linkStyle 1 stroke:#3D3530,stroke-width:2.25px,color:#2A1F1A
 linkStyle 2 stroke:#3D3530,stroke-width:2.25px,color:#2A1F1A
 linkStyle 3 stroke:#3D3530,stroke-width:2.25px,color:#2A1F1A
 linkStyle 4 stroke:#3D3530,stroke-width:2.25px,color:#2A1F1A
 linkStyle 5 stroke:#3D3530,stroke-width:2.25px,color:#2A1F1A
</pre>
</div>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-rag-vs-graphrag-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1: Use RAG when the answer is local. Use GraphRAG when correctness depends on relationships across entities or documents.
</figcaption>
</figure>
</div>
</div>
</div>
<section id="case-study-legal-research-where-relationships-determine-the-answer" class="level2">
<h2 class="anchored" data-anchor-id="case-study-legal-research-where-relationships-determine-the-answer">Case study: legal research where relationships determine the answer</h2>
<p>To make that concrete, consider legal research. A legal research question often looks simple until you try to answer it with retrieval alone.</p>
<blockquote class="blockquote">
<p>How does the definition of “personal data” under the <a href="https://www.britannica.com/topic/General-Data-Protection-Regulation">General Data Protection Regulation</a> compare to “personal information” under the <a href="https://www.oag.ca.gov/privacy/ccpa">California Consumer Privacy Act</a>, and in what scenarios would a U.S.-based company need to comply with both?</p>
</blockquote>
<p>A question like this does not live in one passage. It spans multiple legal regimes, overlapping definitions, territorial scope, and conditional obligations. To answer it well, the system has to connect terms, jurisdictions, exceptions, and compliance triggers across documents. The issue is not that the evidence is far apart. The issue is that the answer depends on how those pieces relate.</p>
<p>In legal data, those relationships are the substance of the answer:</p>
<ul>
<li><strong>Statutes</strong> define terms and establish obligations</li>
<li><strong>Cases</strong> interpret, narrow, or extend those terms</li>
<li><strong>Regulations</strong> refine scope and implementation</li>
<li><strong>Clauses</strong> apply only under specific conditions and exceptions</li>
</ul>
<p>A plain RAG system can retrieve relevant passages, but it can still miss how those passages fit together. That is the failure mode. The problem is not missing text. It is missing structure.</p>
<p>This is where GraphRAG can earn its cost. A graph gives the system a way to preserve entities, citations, dependencies, and exceptions across documents. When correctness depends on those links, a graph is not extra architecture. It is part of how retrieval stays grounded.</p>
<div id="cell-fig-legal-knowledge-graph" class="cell" data-execution_count="1">
<div class="cell-output cell-output-display">
<div id="fig-legal-knowledge-graph" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-legal-knowledge-graph-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<img src="https://etenison.com/posts/2026-04-14-when-graphrag-worth-it/index_files/figure-html/fig-legal-knowledge-graph-output-1.svg" class="img-fluid figure-img">
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-legal-knowledge-graph-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;2: A relationship-heavy legal query often depends on traversing links between definitions, obligations, clauses, and parties, not just retrieving nearby text.
</figcaption>
</figure>
</div>
</div>
</div>
<p>The point of this example is not that legal data can be drawn as a network. The point is that the answer depends on paths through that network. To answer whether a company must comply with both regimes, the system has to connect definitions, scope, obligations, exceptions, and the entities those obligations apply to. That is what justifies the graph. It is a relationship problem, not just a retrieval problem.</p>
<p>Once you see that distinction, the decision becomes simpler.</p>
</section>
<section id="how-should-you-decide" class="level2">
<h2 class="anchored" data-anchor-id="how-should-you-decide">How should you decide?</h2>
<p>Start with plain RAG. It is cheaper, faster, and easier to debug. Move to GraphRAG only when answer quality breaks because the task depends on relationships across entities, documents, or events. If you cannot name that failure mode, you probably do not need GraphRAG yet. The rubric in Table&nbsp;1 is the decision rule I would use.</p>
<div id="tbl-rag-graphrag-rubric" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-tbl figure">
<div aria-describedby="tbl-rag-graphrag-rubric-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<table class="table">
<colgroup>
<col style="width: 33%">
<col style="width: 33%">
<col style="width: 33%">
</colgroup>
<thead>
<tr class="header">
<th>Question</th>
<th>Signals Plain RAG</th>
<th>Signals GraphRAG</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Where does the answer live?</td>
<td>One document or a few chunks</td>
<td>Across linked entities or documents</td>
</tr>
<tr class="even">
<td>What is failing?</td>
<td>Retrieval quality</td>
<td>Relationship structure</td>
</tr>
<tr class="odd">
<td>What kinds of questions break?</td>
<td>Lookup, summarization, FAQ</td>
<td>Citations, dependencies, exceptions, multi-hop reasoning</td>
</tr>
<tr class="even">
<td>What must the system preserve?</td>
<td>Relevant text</td>
<td>Relationships and structure</td>
</tr>
<tr class="odd">
<td>Is added complexity justified?</td>
<td>Probably not</td>
<td>Possibly yes</td>
</tr>
</tbody>
</table>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-tbl" id="tbl-rag-graphrag-rubric-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Table&nbsp;1: Decision rubric for when plain RAG is enough and when GraphRAG earns its cost.
</figcaption>
</figure>
</div>
</section>
<section id="what-id-do-in-practice" class="level2">
<h2 class="anchored" data-anchor-id="what-id-do-in-practice">What I’d do in practice</h2>
<p>In practice, I would start with plain RAG and define a small benchmark around the real failure mode. Then I would measure where it breaks.</p>
<p>If the failures are mostly retrieval quality, I would improve chunking, embeddings, ranking, and citations before adding graph complexity. If the failures are relational, I would add GraphRAG narrowly, around the specific query classes that need it.</p>
<p>That approach keeps the system honest. A graph should earn its place.</p>
</section>
<section id="you-do-not-have-to-choose-one-forever" class="level2">
<h2 class="anchored" data-anchor-id="you-do-not-have-to-choose-one-forever">You do not have to choose one forever</h2>
<p>That is also why this is not always a clean either-or decision. For example, while building my own GraphRAG agent, I realized it did not make sense to treat the graph as a standalone answer engine given the diversity of ways that evidence could be relevant to the questions I cared about. Instead, I used a hybrid retrieval design with dense, sparse, graph, and reranked modes, plus a plan-retrieve-reason-verify workflow. In production, I imagine this is a more realistic path for building systems that need to answer complex questions from diverse evidence sources.</p>
<blockquote class="blockquote">
<p>Use graph structure where relationships matter, then use ranking or reranking to decide which evidence is most relevant to the final answer.</p>
</blockquote>
<p>The benchmark results for my hybrid graphrag project validated this choice for this context. A later hybrid configuration improved context recall from 0.5275 to 0.6525, context precision from 0.1880 to 0.2013, and answer faithfulness from 0.7467 to 0.8267. Pure graph mode, by contrast, still lagged badly on retrieval quality, with context recall at 0.2473 and context precision at 0.0675. That is the real lesson. Graph structure helped most when it was combined with stronger retrieval and reranking, not when it replaced them.</p>
<p>If you want to see how I approached this trade-off in practice, see my RiskFolio GraphRAG agent experiment <a href="https://github.com/ethantenison/riskfolio-graphrag-agent">here</a>.</p>
<p>The important decision is not “graph or no graph” in the abstract. It is where structure improves retrieval enough to justify the added complexity.</p>
</section>
<section id="the-practical-takeaway" class="level2">
<h2 class="anchored" data-anchor-id="the-practical-takeaway">The practical takeaway</h2>
<p>GraphRAG is not the default answer. It is the right answer only when the problem depends on structure that plain retrieval cannot reliably preserve.</p>
<p>Start with the simplest system that can succeed. If plain RAG breaks because the answer depends on relationships, add graph structure where it actually helps. And if the task benefits from both, you do not have to choose a pure architecture. In practice, hybrid systems are often the honest solution.</p>
</section>
<section id="discussion-question" class="level2">
<h2 class="anchored" data-anchor-id="discussion-question">Discussion question</h2>
<p><strong>Question:</strong> What failure mode are you actually trying to solve, missing context or missing relationships?</p>


<!-- -->

</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>RAG</category>
  <category>GraphRAG</category>
  <guid>https://etenison.com/posts/2026-04-14-when-graphrag-worth-it/</guid>
  <pubDate>Tue, 14 Apr 2026 05:00:00 GMT</pubDate>
</item>
</channel>
</rss>
