Use case · Retrieval-augmented generation
Ground your RAG in a versioned ontology.
The same concept, the same labels, the same definitions — every time your model retrieves. Tag a known-good state. Re-index when you choose. Stop watching your AI drift.
The problem
Your model is grounded in a moving target.
Most RAG pipelines pull domain knowledge from a wiki, a Notion page, or a flat-file glossary. The content moves around. Definitions get rewritten without notice. A maintainer renames a concept on Tuesday and every retrieval after lunch returns subtly wrong context. You discover it on Friday when a customer support call goes sideways.
The AI didn't hallucinate. The data did. And there's no log, no revert, no way to point at the change that broke things — because the upstream system was never built to track them.
The shape
A typed graph your pipeline can pin to.
Semlify gives every concept a stable id, a SKOS-aligned label set, and a typed relation map. Your retriever indexes the JSON-LD or SKOS Turtle export. When you're ready to ship a change, you tag it. Until then, your pipeline pins to the last-known-good tag.
- Stable concept ids that survive label changes
- Multilingual labels — your retriever can pick a locale per query
- Typed relations let you walk neighbours during retrieval
- Every change is reversible — a botched edit can be undone in one click
Wire it in
From the editor to your retriever.
Three calls — fetch the concepts, index them, subscribe to tag webhooks for incremental re-indexing.
import requests, os
ONT = "https://api.semlify.com/v1/ontologies/your_ontology"
TOKEN = os.environ["ONTOLOGIA_TOKEN"]
TAG = os.environ.get("ONTOLOGIA_TAG", "latest")
# 1. Pull the latest tagged snapshot as JSON-LD
resp = requests.get(
f"{ONT}/concepts",
params={"tag": TAG, "lang": "en", "format": "jsonld"},
headers={"Authorization": f"Bearer {TOKEN}"},
)
graph = resp.json()["@graph"]
# 2. Index each concept — id is stable across label changes
for c in graph:
embed_and_upsert(
id=c["@id"],
text=" ".join([
c["skos:prefLabel"][0]["@value"],
*[a["@value"] for a in c.get("skos:altLabel", [])],
c.get("skos:definition", [{}])[0].get("@value", ""),
]),
meta={"tag": TAG, "scheme": c["skos:inScheme"]},
)
# 3. Subscribe to tag webhooks for incremental re-indexing
# POST /v1/webhooks {url, events: ["tag.created"]} Your first week
From signup to grounded retrieval in seven days.
- 1
Day 1 · Pick a starter and add the first 30 concepts
The Catalog template seeds you with a usable T-Box and a scheme. Replace the example concepts with your own using the CSV import wizard or the New Concept modal.
- 2
Day 2 · Tag v0.1 and wire the indexer
Tag the current state. Point your retrieval pipeline at the JSON-LD export. Run a quality check on retrieval against ten known queries.
- 3
Day 3–4 · Curate, fix, re-tag
Use the Validation panel to catch orphans, duplicates, and domain violations. Accept the AI-suggested altLabels for the queries that under-recalled. Re-tag as v0.2.
- 4
Day 5 · Subscribe to tag webhooks
Ship the webhook listener so the indexer re-runs whenever a maintainer publishes a new tag. Production pipelines pin to a known tag, dev pipelines follow latest.
- 5
Day 6–7 · Multilingual or multi-scheme
Add a second language with the auto-translate AI helper. Or split your ontology into two schemes (e.g. products vs. categories) and index them as separate Faiss / Pinecone namespaces.
Stable on the wire
Your retriever sees the API, not the editor.
The Schema, Taxonomies, and AI work happens in the editor. Your retrieval pipeline only sees the API. Pin to a tag. Negotiate language. Pick JSON-LD or SKOS Turtle. The shape doesn't change between releases — only the data inside it does.
Stop debugging upstream drift.
Free workspace. Catalog starter pre-loaded. Wire your retriever in an afternoon.