Instructions to use Elda-AI/intenter with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use Elda-AI/intenter with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("token-classification", model="Elda-AI/intenter")# Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("Elda-AI/intenter", device_map="auto") - Notebooks
- Google Colab
- Kaggle
Access to Intenter
Intenter is released for research, evaluation, internal validation and education. Tell us who you are and we will grant access.
By requesting access you agree to the Elda Community License 1.0: no commercial use, no redistribution of the weights or derivatives, and attribution as "Built with Elda". Commercial licensing is available on request.
Log in or Sign Up to review the conditions and access this model content.
Intenter — real-time Korean speech-act + entity extraction in a single pass
Intenter reads an utterance and returns, in one forward pass, four aligned channels: what the speaker is doing (speech act), what they are talking about (entities), and the attribute/predicate structure that binds them.
It is not a general-purpose NER model. It is the perception layer of a live conversational system, built for the one constraint that shapes everything else in that setting: latency budgets measured in tens of milliseconds.
"간판의 품격이라는 음식점이 있다며, 그 음식점은 어디에 있냐고"
intent QUESTION
entity 간판의 품격 → ORGANIZATION
음식점이 → ORGANIZATION
signals is_pure_negation=0 · is_claim=0 · polarity=0 · depends_on_prev=1
Why an encoder
| Intenter | typical small-LLM extraction | |
|---|---|---|
| Parameters | 281M | 500M – 4B |
| Latency (single, incl. heads) | p50 27.8 ms | hundreds of ms |
| Latency (batch of 16) | 118.5 ms | seconds |
| Serving precision | fp32 (2 workers, 6.1 GB GPU) | varies |
| Output | fixed contract, char offsets | free text to be parsed |
Measured on the production serving path (RTX 3060, fp32, heads attached).
A decoder can be prompted into this task and will be more flexible. It cannot be fast at it. When a dialogue turn has a 300 ms end-to-end budget and perception is one of five stages inside it, 27.8 ms is the difference between a design that works and one that does not.
Output contract
Four Global Pointer channels over one shared mDeBERTa-v3 backbone, plus four frozen binary-signal heads and five gap-fill heads.
channels entity · intent · attribute · predicate (span, char offsets)
entity types 17 ANIMAL · ARTIFACTS · CIVILIZATION · DATE · DURATION · EVENT ·
KNOWLEDGE · LOCATION · MATERIAL · ORGANIZATION · PERSONA ·
PHENOMENON · PLANT · QUANTITY · TERM · TIME · WORK
speech acts 17 DESCRIBE · NARRATE · RECALL · EVALUATE · EXPRESS_EMOTION ·
EXCLAIM · SOCIAL_RITUAL · REQUEST · COMMAND · INSTRUCT · OFFER ·
PROMISE · PLAN · ANNOUNCE · QUESTION · AGREE · DISAGREE
signals 4 is_pure_negation · is_claim · polarity · depends_on_prev
Spans follow a published convention (see below): particles stay outside the span, names are never split internally, and head nouns adjacent to a name are not folded in.
Entity subtypes are emitted on a best-effort basis. The subtype catalogue is not published; out-of-catalogue values can appear and downstream consumers are expected to treat subtype as advisory. Type is the deterministic axis.
Usage
The bundle is self-contained — weights, tokenizer, modelling code and the backbone configuration. Nothing further is fetched at load time.
import torch, json
from pathlib import Path
from transformers import AutoTokenizer
REPO = "Elda-AI/intenter" # gated — request access first
from huggingface_hub import snapshot_download
d = Path(snapshot_download(REPO))
cfg = json.loads((d / "config.json").read_text())
tok = AutoTokenizer.from_pretrained(d)
# modeling_btrack_4ch*.py are included in the repo
import sys; sys.path.insert(0, str(d))
from modeling_btrack_4ch_w4 import UnifiedBTrack4
model = UnifiedBTrack4(cfg["base_model"]).float().eval()
model.load_state_dict(torch.load(d / "model.pt", map_location="cpu"))
# model.safetensors carries the same weights in the same dtype, if you prefer it:
# from safetensors.torch import load_file
# model.load_state_dict(load_file(d / "model.safetensors"))
Notes that matter in practice:
- Serve in fp32. Dynamic INT8 quantisation is not supported for this architecture.
- Do not strip the trailing
?. Punctuation carries signal; the model handles both punctuated and unpunctuated forms. - The five gap-fill heads only ever fill spans the base did not produce — base span output is unchanged by their presence.
How it was built
Four months of cycles, and the model is the smallest part of what came out of them.
The corpus is the asset. Training data is hand-curated and continuously audited — 38k sentences across Korean, English and Japanese, grown one narrow capability at a time rather than by bulk generation. Every addition is targeted at a weakness that was first measured, and the builder refuses to emit a file that repeats a failure pattern we have already named.
Every round is a regression test. A build ships only after it survives a standing battery of frozen held-out gates covering role nouns, referent expressions, possessive structure, occupational drift, organisation generalisation, safety-critical utterances and binary discourse signals. Gates are evaluated per surface, not summed — a total that rises while a single surface falls is treated as a regression and blocks the round.
Boundaries are a written contract. Span conventions are agreed across the teams that consume this model and versioned by content hash, so a change in compliance can always be attributed to the model or to the ruler, never left ambiguous.
Capabilities are added without disturbing what works. New behaviour is introduced through isolated, frozen-stage training so that existing detection and type outputs are unchanged by construction rather than by hope — then verified against held-out surfaces the model was never shown.
Selected measurements
Production build 42c7c248 (2026-09-24), measured on frozen held-out sets that are
excluded from training by construction. Each row is a distinct capability axis; all of
them are re-run on every build.
| Role nouns — detection / typing (405 slots) | 405 / 399 |
| Occupational drift (56 cells) | 56 / 56 |
| Organisation generalisation (24 cells) | 20 / 24, zero misses |
| Referent expressions, held out | 23 · 23 · 22 |
| Conversational-speech detection / safety floor | 91.7 % · 12 / 12 |
| Possessive structure (40 surfaces) | 32 / 40 |
| Discourse signals — false positives on short utterances | 0 / 48 |
| Discourse signals — polarity grid | 24 / 24 |
| Name-span probe, third-party ruler (126 sentences) | exact 72, ORG 48, missing 0 |
| Span-convention compliance, third-party ruler | 67 / 126 |
The name-span probe and the convention compliance figure are produced by a separate team on their own infrastructure, from sentences this model has never been trained on.
Public benchmark — KLUE-NER (dev)
| entity F1 | boundary F1 | |
|---|---|---|
| as emitted | 59.8 | 62.3 |
| with our published span convention applied | 66.2 | 69.2 |
600 dev sentences, 1,687 gold entities, none of which appear anywhere in training — the evaluator refuses to run if an overlap is found. Our 17 entity types are mapped back onto KLUE's six; anything outside that mapping is counted as an error rather than skipped.
Our span convention keeps Korean particles outside the span, as KLUE's annotation does. The second row applies that published rule to the raw output — it is a format conversion, not a tuned post-process, and the gap between the rows is itself a measurement we track.
The two schemes also differ in scope, not only in labels. We mark 관객 ("audience"), 여배우 ("actress") and 식당 ("restaurant") as entities where KLUE annotates proper names only. Those are counted against us in the table above.
Versioning
Internal builds move fast; this repository does not. It is refreshed roughly monthly, and every refresh carries the full gate battery described above — a build is never published on a single headline number.
Promotion to production is a separate track with its own bar: a staging round, a downstream end-to-end gate on live harnesses, and a human decision.
- Previously published:
42c7c248(promoted to production 2026-09-24) - Current: v6.4.1 — the first build trained with public-benchmark material, published for the benchmark results above. Production promotion follows its own schedule.
License & access
Released under the Elda Community License 1.0 (see LICENSE).
- ✅ Research, evaluation, internal validation, education — free of charge
- ✳ Attribution: "Built with Elda"
- ⛔ Commercial use and redistribution require a separate agreement
Access is gated: tell us who you are and access is granted automatically. Training data and evaluation sets are not distributed.
Citation
@software{intenter2026,
title = {Intenter: real-time Korean speech-act and entity extraction},
author = {Elda AI},
year = {2026},
url = {https://huggingface.co/Elda-AI/intenter}
}
- Downloads last month
- -