<?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: Joel Trout II</title>
    <description>The latest articles on DEV Community by Joel Trout II (@getarbiter).</description>
    <link>https://dev.to/getarbiter</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%2F4148221%2Fe23b736d-c63d-461a-8ee3-52f3a2ad6ef9.png</url>
      <title>DEV Community: Joel Trout II</title>
      <link>https://dev.to/getarbiter</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/getarbiter"/>
    <language>en</language>
    <item>
      <title>Your Vector Search Knows “Bank” Is Related to “Bank.” It Doesn’t Know Which Bank You Mean.</title>
      <dc:creator>Joel Trout II</dc:creator>
      <pubDate>Tue, 29 Sep 2026 00:04:03 +0000</pubDate>
      <link>https://dev.to/getarbiter/your-vector-search-knows-bank-is-related-to-bank-it-doesnt-know-which-bank-you-mean-38fh</link>
      <guid>https://dev.to/getarbiter/your-vector-search-knows-bank-is-related-to-bank-it-doesnt-know-which-bank-you-mean-38fh</guid>
      <description>&lt;p&gt;Vector search is very good at similarity.&lt;/p&gt;

&lt;p&gt;Similarity is not always the same thing as meaning.&lt;/p&gt;

&lt;p&gt;That distinction starts becoming expensive when retrieval feeds an LLM.&lt;/p&gt;

&lt;p&gt;Consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;financial bank
river bank
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;They share the same word.&lt;/p&gt;

&lt;p&gt;A similarity system has every reason to place them near each other.&lt;/p&gt;

&lt;p&gt;A useful reasoning system often needs to do the opposite.&lt;/p&gt;

&lt;p&gt;It needs to separate the senses.&lt;/p&gt;

&lt;p&gt;That problem is one of the reasons I built &lt;strong&gt;ARBITER&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;ARBITER is a deterministic measurement engine. You give it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;context
+
a field of possibilities
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and it returns a coherence-ordered field.&lt;/p&gt;

&lt;p&gt;It does not generate an answer.&lt;/p&gt;

&lt;p&gt;It measures the possibilities you supplied.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters for RAG
&lt;/h2&gt;

&lt;p&gt;A common RAG pipeline looks roughly like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;query
  ↓
vector retrieval
  ↓
top N chunks
  ↓
LLM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The retrieval stage is intentionally broad.&lt;/p&gt;

&lt;p&gt;That is useful, but it also means bad context can survive long enough to reach generation.&lt;/p&gt;

&lt;p&gt;Once incorrect-but-related context enters the prompt, the generator has to reason around it.&lt;/p&gt;

&lt;p&gt;A different pipeline is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;query
  ↓
vector retrieval
  ↓
candidate field
  ↓
ARBITER
  ↓
coherence-ordered field
  ↓
LLM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ARBITER does not replace retrieval.&lt;/p&gt;

&lt;p&gt;It gives you a deterministic measurement step between retrieval and generation.&lt;/p&gt;

&lt;h2&gt;
  
  
  A simple example
&lt;/h2&gt;

&lt;p&gt;Here is a live ARBITER call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://arbiter.grip.fyi/v1/compare &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'content-type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{
    "query":"python memory",
    "candidates":[
      "garbage collection",
      "malloc",
      "snake habitat"
    ],
    "top_k":3
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The resulting ordering:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0.483573  garbage collection
0.324794  malloc
0.167992  snake habitat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same interface:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;state / intent / context
+
field of possibilities
→
ARBITER
→
ranked resonance field
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The field could contain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;documents
tools
routes
robot actions
suppliers
code paths
hypotheses
agents
products
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The primitive does not change. :chatgpt-content-reference{index="0"}&lt;/p&gt;

&lt;h2&gt;
  
  
  The harder test: word senses
&lt;/h2&gt;

&lt;p&gt;An earlier ARBITER compression/disambiguation benchmark compared a 768-dimensional source representation compressed to 72 dimensions using PCA versus ARBITER.&lt;/p&gt;

&lt;p&gt;The similarity-retention result was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PCA       0.8693
ARBITER   0.9653
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the more interesting result was sense separation.&lt;/p&gt;

&lt;p&gt;For ambiguous words:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                PCA       ARBITER

bank            ~0.85      0.066
bat             ~0.85      0.073
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lower here means better separation between competing senses.&lt;/p&gt;

&lt;p&gt;So &lt;code&gt;river bank&lt;/code&gt; and &lt;code&gt;financial bank&lt;/code&gt; remained strongly entangled after PCA compression, while ARBITER separated them much more sharply.&lt;/p&gt;

&lt;p&gt;The same benchmark reduced the representation from 768 dimensions to 72: a 10.7× dimensional reduction. :chatgpt-content-reference{index="1"}&lt;/p&gt;

&lt;p&gt;That is the part I care about.&lt;/p&gt;

&lt;p&gt;Not simply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can I preserve similarity?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can the representation preserve enough structure to distinguish what something means in context?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  More examples
&lt;/h2&gt;

&lt;p&gt;The same behavior shows up in ordinary ambiguous language.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Best bass fishing spots in freshwater lakes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ARBITER produced:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0.772  Largemouth bass in shallow weedy areas
0.542  Bass amplifiers and speaker impedance
0.293  Bass clef instruments in orchestra
0.272  Bass guitar string gauges
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Crane safety regulations on construction sites
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;it produced:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0.828  Tower cranes require certified operators
0.325  Sandhill cranes migrate through Nebraska
0.274  Origami cranes symbolize peace in Japan
0.173  Crane flies are harmless insects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cell division rates in tumor growth analysis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;returned:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0.823  Mitotic cell division in tumor tissue
0.312  Prison cell division protocols
0.287  Cellular network division coverage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are not generated answers.&lt;/p&gt;

&lt;p&gt;They are measurements over an explicit candidate field. :chatgpt-content-reference{index="2"}&lt;/p&gt;

&lt;h2&gt;
  
  
  Context can reorganize the same field
&lt;/h2&gt;

&lt;p&gt;This is where things get more interesting.&lt;/p&gt;

&lt;p&gt;Take &lt;code&gt;Python&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Without extra context:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Programming   0.796
Snakes        0.284
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now change the supplied perspective:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"As a herpetologist..."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the same meanings reorganize:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Snakes        0.700
Programming   0.422
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apple behaves similarly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;baseline:
Tech company  0.861
Fruit         0.252
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"As a chef..."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the ordering flips:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fruit         0.668
Tech company  0.397
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No retraining.&lt;/p&gt;

&lt;p&gt;The supplied context changed, so the field changed. :chatgpt-content-reference{index="3"}&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I think this matters
&lt;/h2&gt;

&lt;p&gt;A lot of current AI infrastructure treats representation as a lookup problem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Which stored object is closest?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But many useful machine decisions are closer to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Given this exact state,
which of these possibilities fits best?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those are not identical questions.&lt;/p&gt;

&lt;p&gt;RAG is an obvious place to use that distinction because retrieval already gives you a bounded field.&lt;/p&gt;

&lt;p&gt;But the same operation applies to agent routing, tool selection, robotics, screening, planning, and other systems where the candidates already exist.&lt;/p&gt;

&lt;p&gt;The generator does not always need to make the decision.&lt;/p&gt;

&lt;p&gt;Sometimes the candidates are already there.&lt;/p&gt;

&lt;p&gt;What you need is a measurement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The live endpoint is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST https://arbiter.grip.fyi/v1/compare
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or install the lightweight CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://arbiter.grip.fyi/install | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;arb &lt;span class="s2"&gt;"python memory"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"garbage collection"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"malloc"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"snake habitat"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI is just the interface to the hosted ARBITER service.&lt;/p&gt;

&lt;p&gt;The current developer surface includes 10 successful calls per day free, after which the same endpoint moves to native x402 payment at $0.01 per call. :chatgpt-content-reference{index="4"}&lt;/p&gt;

&lt;p&gt;Try a field where you already know what the answer should be.&lt;/p&gt;

&lt;p&gt;Ambiguous words are a good place to start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ARBITER:&lt;/strong&gt; &lt;a href="https://arbiter.grip.fyi" rel="noopener noreferrer"&gt;https://arbiter.grip.fyi&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Description:&lt;br&gt;
Similarity is not the same thing as meaning. A deterministic measurement step for RAG, reranking, and bounded decision fields.&lt;/p&gt;

&lt;p&gt;Tags:&lt;br&gt;
ai, rag, machinelearning, programming&lt;/p&gt;

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