You search.
DNA learns.

Illustration: a double helix whose strands are your searches and your items. DNA proposes results between them; results your feedback confirms light up. Counters show top results found and the LLM calls saved compared with RAG plus a reranker.

The search engine that learns from feedback. Smarter and cheaper with every search.

Your models. Our search.

local
local

Embedder

Data in, vectors out. Any model works.

DNA

Finds the best result. Learns from every score.

Judge

An LLM, a small model, or your users.

Simple, as it should be.

Send embeddings, search, and send back a score when you have one. DNA trains on its side, so you don't host or tune a model.

Nodes can be tools, products, documents, people, or anything else you can imagine.

Read the quick start
pick.py
import httpx

dna = httpx.Client(
    base_url="https://dna.hashgrid.ai/api/v1",
    headers={"Authorization": "Bearer hg-…"},
)

# Populate: one embedding per item, from any model, under a key of your choice.
items = …
for i, item in enumerate(items):
    node = {"key": str(i), "emb": embed(item)}
    item_id = dna.post("/nodes", json=node).json()['id']
    candidates[item_id] = item

# Search: DNA returns its best result.
query = …
query_id = dna.post("/nodes", json={"emb": embed(query)}).json()['id']
candidate_id = dna.post(f"/nodes/{query_id}/edges").json()['id']
candidate = candidates[candidate_id]

# Feedback: score the result, so that DNA learns from it.
score = judge(query, candidate)
dna.patch(f"/nodes/{query_id}/edges/{candidate_id}", json={"score": score})

# Use DNA's result.
use(query, candidate)

Anonymous by design.

DNA never receives your data, your prompts or who your users are. Swap embedders or LLMs anytime.

What DNA sees

{ "id": "93d77a9cf9dcdcbb",
  "key": "42",
  "emb": [0.0123, -0.0456, 0.0871, …] }

{ "id": "f43125171437b656",
  "score": 0.72 }

What does it cost?

7× fewer LLM calls than standard retrieval, on average.

100 calls

LLM checks every item

36 calls

RAG + Reranker

5 calls

DNA

one of the top 3 results not a top 3 result How many times an LLM is asked before the top 3 results among 100 items are found. Average across our three test tasks.

Built for searches like these. And yours.