<?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: Prashant Krishan Bharti</title>
    <description>The latest articles on DEV Community by Prashant Krishan Bharti (@kultzuki).</description>
    <link>https://dev.to/kultzuki</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%2F4108454%2F5b2c98a2-9c6f-4901-bd8f-8999786c0cdb.png</url>
      <title>DEV Community: Prashant Krishan Bharti</title>
      <link>https://dev.to/kultzuki</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kultzuki"/>
    <language>en</language>
    <item>
      <title>The agentic RAG pipeline that was faster and cheaper — and no more accurate than no agent at all</title>
      <dc:creator>Prashant Krishan Bharti</dc:creator>
      <pubDate>Sun, 04 Oct 2026 10:35:45 +0000</pubDate>
      <link>https://dev.to/kultzuki/the-agentic-rag-pipeline-that-was-faster-and-cheaper-and-no-more-accurate-than-no-agent-at-all-1gbg</link>
      <guid>https://dev.to/kultzuki/the-agentic-rag-pipeline-that-was-faster-and-cheaper-and-no-more-accurate-than-no-agent-at-all-1gbg</guid>
      <description>&lt;h1&gt;
  
  
  The agentic RAG pipeline that was faster and cheaper — and no more accurate than no agent at all
&lt;/h1&gt;

&lt;p&gt;I spent a few weeks building four retrieval architectures over the same graph database, pointing them at the same 150 questions, and measuring what each one cost.&lt;/p&gt;

&lt;p&gt;The headline numbers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;accuracy&lt;/th&gt;
&lt;th&gt;LLM tokens/q&lt;/th&gt;
&lt;th&gt;mean latency&lt;/th&gt;
&lt;th&gt;tool calls/q&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;P1 · RAG&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;td&gt;1,284&lt;/td&gt;
&lt;td&gt;27.0 s&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P2 · GraphRAG&lt;/td&gt;
&lt;td&gt;89%&lt;/td&gt;
&lt;td&gt;1,694&lt;/td&gt;
&lt;td&gt;32.2 s&lt;/td&gt;
&lt;td&gt;2.72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;P3 · Agentic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;552&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10.2 s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.95&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P4 · Deterministic control&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.1 s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.57&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One model — &lt;strong&gt;&lt;code&gt;Qwen3.8-27B&lt;/code&gt;&lt;/strong&gt;, with its reasoning trace enabled — served every pipeline, including the agentic orchestrator's planner and verifier.&lt;/p&gt;

&lt;p&gt;Only LLM tokens were counted; GSQL and Python were treated as zero-cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  The finding I did not expect
&lt;/h2&gt;

&lt;p&gt;I built P4 as a sanity check, not a competitor: strip out the model entirely, parse the question with regexes, and run one deterministic query. I expected it to score maybe 70% and lose badly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It scored 100%.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is the most useful result in the whole benchmark, and it changes how you should read every other row.&lt;/p&gt;

&lt;p&gt;The agentic pipeline is not better than the deterministic control. It is &lt;em&gt;more expensive&lt;/em&gt; — at 552 tokens per question — for identical accuracy.&lt;/p&gt;

&lt;p&gt;So why keep it?&lt;/p&gt;

&lt;p&gt;Because the control is a boundary marker, not a competitor. It tells you exactly how many questions never needed a model.&lt;/p&gt;

&lt;p&gt;And because the benchmark questions turned out to be templated, that number was &lt;strong&gt;all of them&lt;/strong&gt; — which is precisely the caveat I'll come back to at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why GraphRAG jumps 59 points
&lt;/h2&gt;

&lt;p&gt;The 150 questions come from five templates. Four of them are structured database queries wearing question marks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;template&lt;/th&gt;
&lt;th&gt;P1 · RAG&lt;/th&gt;
&lt;th&gt;P2 · GraphRAG&lt;/th&gt;
&lt;th&gt;P3 · Agentic&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;lookup&lt;/td&gt;
&lt;td&gt;63%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;temporal&lt;/td&gt;
&lt;td&gt;27%&lt;/td&gt;
&lt;td&gt;55%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;multi_hop&lt;/td&gt;
&lt;td&gt;32%&lt;/td&gt;
&lt;td&gt;96%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;aggregation&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;superlative&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;20%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Plain RAG scores 63% when the answer is in one document and &lt;strong&gt;5%&lt;/strong&gt; when the question asks how many events meet a condition.&lt;/p&gt;

&lt;p&gt;That is not a retrieval-quality problem.&lt;/p&gt;

&lt;p&gt;A vector retriever cannot count. It returns chunks, the model reads them, and the model is bad at counting over a set — so no amount of chunk quality fixes it.&lt;/p&gt;

&lt;p&gt;GraphRAG fixed it by pushing aggregation into the database.&lt;/p&gt;

&lt;p&gt;The GSQL does &lt;strong&gt;&lt;code&gt;count&lt;/code&gt;&lt;/strong&gt; with a predicate and returns a number. The model's job shrinks from "compute this" to "read this", which is the job models are actually good at.&lt;/p&gt;

&lt;p&gt;This is the real dividing line between RAG and GraphRAG, and it has nothing to do with graph databases being fashionable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's arithmetic.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the agent got &lt;em&gt;cheaper&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;The agentic pipeline costs 67% fewer tokens than GraphRAG while being 11 points more accurate.&lt;/p&gt;

&lt;p&gt;Agents are normally assumed to be expensive — more calls, more context, more chances to ramble.&lt;/p&gt;

&lt;p&gt;Mine did less work.&lt;/p&gt;

&lt;p&gt;Three design decisions did that.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The planner chooses the tool; deterministic parsing fills the slots
&lt;/h3&gt;

&lt;p&gt;The orchestrator emits &lt;strong&gt;&lt;code&gt;STEP: count_above&lt;/code&gt;&lt;/strong&gt; and nothing else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;sport&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;year&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;season&lt;/code&gt;&lt;/strong&gt;, and &lt;strong&gt;&lt;code&gt;threshold&lt;/code&gt;&lt;/strong&gt; come from a regex parser.&lt;/p&gt;

&lt;p&gt;An earlier version let the planner's parameters override the parsed ones. Because questions say "biathlon" while the graph says "Biathlon", every aggregation silently answered zero.&lt;/p&gt;

&lt;p&gt;Slot filling is mechanical.&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;plan&lt;/em&gt; is the part that varies with the question, and that's the part worth spending tokens on.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Stopping is an explicit decision with a recorded reason
&lt;/h3&gt;

&lt;p&gt;When a tool returns a definite value and the deterministic verifier agrees, the loop accepts it and stops rather than paying for another round trip.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;72 of 100 public questions ended that way.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. A repeated query ends the investigation
&lt;/h3&gt;

&lt;p&gt;A planner re-issuing the same query is looping, not reasoning.&lt;/p&gt;

&lt;p&gt;Detecting the repeat and telling it to move on is what keeps the average at ~2 tool calls instead of burning the step budget on one empty result.&lt;/p&gt;

&lt;p&gt;The reason P3 is also the &lt;em&gt;fastest&lt;/em&gt; pipeline is the same mechanism.&lt;/p&gt;

&lt;p&gt;GraphRAG's 1,694 tokens are spent almost entirely on the model doing sums that the database could have done, and every token is also latency.&lt;/p&gt;

&lt;h2&gt;
  
  
  TigerGraph specifics worth knowing
&lt;/h2&gt;

&lt;p&gt;If you build on TigerGraph, some of this will save you days.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;vectorSearch()&lt;/code&gt; does not work in interpreted queries
&lt;/h3&gt;

&lt;p&gt;It fails with:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;GSQL-2500 Unsupported Statement | TOPK_VEC_SEARCH_FUNC&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It has to live in an &lt;em&gt;installed&lt;/em&gt; query, which means one &lt;strong&gt;&lt;code&gt;CREATE QUERY&lt;/code&gt;&lt;/strong&gt; + &lt;strong&gt;&lt;code&gt;INSTALL QUERY&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;&lt;code&gt;USE GRAPH&lt;/code&gt;&lt;/strong&gt; prefix also has to be repeated in every call because it does not persist between them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Interpreted queries refuse parameters
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;INTERPRET QUERY (sp=STRING)&lt;/code&gt;&lt;/strong&gt; is rejected whether you pass a dict or a query string.&lt;/p&gt;

&lt;p&gt;So values get inlined as escaped literals.&lt;/p&gt;

&lt;p&gt;If you build this, make sure every inlined value originates from your own parser and not from user input.&lt;/p&gt;

&lt;h3&gt;
  
  
  This deployment runs GSQL syntax v2
&lt;/h3&gt;

&lt;p&gt;It is stricter than you'd expect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A bare &lt;strong&gt;&lt;code&gt;SELECT e FROM Event:e&lt;/code&gt;&lt;/strong&gt; is rejected — every &lt;code&gt;SELECT&lt;/code&gt; needs a vertex-set variable.&lt;/li&gt;
&lt;li&gt;You cannot traverse &lt;em&gt;from&lt;/em&gt; a filtered vertex set. &lt;strong&gt;&lt;code&gt;Games:g &amp;lt;-IN_GAMES- Event:e&lt;/code&gt;&lt;/strong&gt; doesn't parse. Run it forwards and filter the target in the same &lt;code&gt;SELECT&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;FOREACH&lt;/code&gt;&lt;/strong&gt; doesn't mix with v2 accumulators, and &lt;strong&gt;&lt;code&gt;MaxAccum&lt;/code&gt;&lt;/strong&gt; can't be assigned to a global.&lt;/li&gt;
&lt;li&gt;There is no &lt;strong&gt;&lt;code&gt;coalesce&lt;/code&gt;&lt;/strong&gt; and no &lt;strong&gt;&lt;code&gt;IFF&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A null in an accumulator is silently dropped from that column while its neighbours still get the row — so your columns shift and you return confidently wrong answers. I now write sentinel values instead of skipping attributes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Adding a vector attribute needs a &lt;code&gt;SCHEMA_CHANGE JOB&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A bare &lt;strong&gt;&lt;code&gt;ALTER ... ADD VECTOR ATTRIBUTE&lt;/code&gt;&lt;/strong&gt; is not valid GSQL.&lt;/p&gt;

&lt;p&gt;And if any type in your schema is declared &lt;em&gt;global&lt;/em&gt;, the job must be global too.&lt;/p&gt;

&lt;p&gt;The full list is &lt;strong&gt;31 footguns&lt;/strong&gt; in the repo, each one of which produced a silently wrong answer before it was found.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bugs my tests caught that my summary table didn't
&lt;/h2&gt;

&lt;p&gt;This is the part I'd most want other people to take away.&lt;/p&gt;

&lt;p&gt;My results summary reported &lt;strong&gt;&lt;code&gt;100/100&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;errors: 0&lt;/code&gt;&lt;/strong&gt; — both true — while &lt;strong&gt;26 of 150 agentic answers were a whole sentence where a bare number was due&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;"'Men's foil' has nations=29"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;instead of:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"29"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The cause: my answer extractor's markers were all &lt;em&gt;spaced&lt;/em&gt; — &lt;strong&gt;&lt;code&gt;" is "&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;" = "&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;": "&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The tool emitted an &lt;em&gt;unspaced&lt;/em&gt; &lt;strong&gt;&lt;code&gt;key=value&lt;/code&gt;&lt;/strong&gt; tail.&lt;/p&gt;

&lt;p&gt;All three markers missed, the function fell through to &lt;strong&gt;&lt;code&gt;return line.strip()&lt;/code&gt;&lt;/strong&gt;, and the clause became the answer.&lt;/p&gt;

&lt;p&gt;I found it by grepping the artefacts for the &lt;em&gt;shape&lt;/em&gt; of an answer, not by reading the summary.&lt;/p&gt;

&lt;p&gt;The summary was accurate about what it measured and completely silent about what it didn't.&lt;/p&gt;

&lt;h3&gt;
  
  
  The scorer had a similar blind spot
&lt;/h3&gt;

&lt;p&gt;My scorer returned &lt;strong&gt;&lt;code&gt;True&lt;/code&gt;&lt;/strong&gt; for:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;is_correct("c", ["Chen Ding"])&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;because containment had no length floor, so any single character landing inside the gold scored as correct.&lt;/p&gt;

&lt;p&gt;A needle now has to be &lt;strong&gt;4+ characters or a standalone token&lt;/strong&gt;, which keeps &lt;strong&gt;&lt;code&gt;"29"&lt;/code&gt;&lt;/strong&gt; matching inside &lt;strong&gt;&lt;code&gt;"29 nations"&lt;/code&gt;&lt;/strong&gt; while rejecting &lt;strong&gt;&lt;code&gt;"4"&lt;/code&gt;&lt;/strong&gt; inside &lt;strong&gt;&lt;code&gt;"24"&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Both defects were scored &lt;code&gt;correct&lt;/code&gt; the whole time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Containment hid the first one, and the second had nothing to fire on because the pipelines emit corpus-exact strings.&lt;/p&gt;

&lt;p&gt;I re-scored the entire benchmark with the hardened scorer and &lt;em&gt;nothing moved&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That is the point.&lt;/p&gt;

&lt;p&gt;They were latent, not active.&lt;/p&gt;

&lt;h3&gt;
  
  
  Others in the same family
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Diacritics were not folded when scoring, though the rules state they are normalized.&lt;/li&gt;
&lt;li&gt;Abbreviated month names (&lt;strong&gt;&lt;code&gt;"Aug 7 (prelim), Aug 10 (final)"&lt;/code&gt;&lt;/strong&gt;) yielded no date tokens at all, silently costing that event its multi-hop match.&lt;/li&gt;
&lt;li&gt;A report generator referenced an element ID the markup never defined, so one section rendered blank while everything else looked fine.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The general lesson:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aggregate metrics are blind to shape defects.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A summary can be entirely correct about accuracy and tell you nothing about whether your answers are in the right form to be graded.&lt;/p&gt;

&lt;p&gt;I ended up with &lt;strong&gt;74 tests&lt;/strong&gt; using Python's standard-library &lt;strong&gt;&lt;code&gt;unittest&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They need neither the graph nor the model — which matters more than it sounds, because the model endpoint was down a lot during this build.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I did not prove
&lt;/h2&gt;

&lt;p&gt;Two things, stated plainly because the results invite the wrong conclusion.&lt;/p&gt;

&lt;h3&gt;
  
  
  The agent's recovery path is untested
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;changed_strategy&lt;/code&gt;&lt;/strong&gt; is &lt;strong&gt;0/100&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every one of &lt;strong&gt;211 tool calls&lt;/strong&gt; returned data — no question ever made the first move fail, so the re-planning machinery never fired.&lt;/p&gt;

&lt;p&gt;The agent demonstrably runs multi-step plans and gets them right, but I never observed it recover from a bad step.&lt;/p&gt;

&lt;p&gt;An adversarial probe set — misspelled sport, invented venue, impossible Games edition — would exercise that, and I didn't build one.&lt;/p&gt;

&lt;p&gt;Worth noting that such a probe set probably wouldn't show the agent winning anyway.&lt;/p&gt;

&lt;p&gt;Both the agentic and deterministic pipelines share the same regex parser and the same entity linker, so corrupting an entity breaks &lt;em&gt;both&lt;/em&gt; equally.&lt;/p&gt;

&lt;p&gt;My mental model of "the router fails, the agent recovers" was wrong about this architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  Latency is not a system property
&lt;/h3&gt;

&lt;p&gt;All three pipelines call a 27B reasoning model over a tunnel, so those &lt;strong&gt;27–32 second&lt;/strong&gt; figures are dominated by network round-trips to a model runtime, not by retrieval.&lt;/p&gt;

&lt;p&gt;The graph itself answers in well under a second.&lt;/p&gt;

&lt;p&gt;The zero-token control finishes a full 150-question pass in &lt;strong&gt;0.1 s average&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you see &lt;strong&gt;32 s for a graph database&lt;/strong&gt;, ask what fraction of it was the model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this goes next
&lt;/h2&gt;

&lt;p&gt;If I were picking this up again, the interesting work isn't squeezing accuracy — that's saturated, and the deterministic control already proves it.&lt;/p&gt;

&lt;p&gt;It's building the adversarial probe set, because the only untested claim in the whole system is whether the agent can recover when its first move fails.&lt;/p&gt;

&lt;p&gt;Everything else is measured.&lt;/p&gt;




&lt;h2&gt;
  
  
  Repo
&lt;/h2&gt;

&lt;p&gt;Full source, traces, and the hidden-50 outputs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Kultzuki/TigerGraph" rel="noopener noreferrer"&gt;https://github.com/Kultzuki/TigerGraph&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Live results page (self-contained, no dependencies):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://kultzuki.github.io/TigerGraph/olympic-graphrag/results/report.html" rel="noopener noreferrer"&gt;https://kultzuki.github.io/TigerGraph/olympic-graphrag/results/report.html&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Setup is one dependency:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>tigergraph</category>
      <category>graphrag</category>
      <category>rag</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
