You search.
DNA learns.
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
Built for searches like these. And yours.
- Which tool should my agent call?
- Which agent should I delegate this task to?
- Which product fits this customer?
- Which document answers this question?
- Which candidate fits this job?
- Which ticket goes to which team?