Arhitektura
Upit putuje od preglednika do Flask orkestratora, koji ga usmjerava kroz trostupanjski NLP vodopad i sastavlja odgovor od tipiziranih rezultata alata.
[Preglednik]
│ HTTP (JSON)
▼
[Flask orkestrator :5000]
│ spaCy NLP + regex gramatike (en/de/fr/es/hr) + bodovanje pouzdanosti
│ razrješavač entiteta (SQLite + rapidfuzz, granice riječi)
│ LLM planer (stupanj 2/3)
│ Redis keš (TTL po domeni, pričuvni LRU u memoriji)
│
├─ [FastAPI Data API :8000] ← qalc, chempy, mendeleev, sympy+matplotlib,
│ Wikidata, Open-Meteo, registar konektora (cia/food/hjp/dictionary)
└─ U procesu: temporal_calc, fermi_estimate
Stupanj 1 — klasifikacija namjere (< 50 ms)
- spaCy tokenizira upit i označava vrste riječi.
- 32 prioritizirane regex gramatike pokušavaju se podudariti s
normaliziranim nizom tokena (skupovi gramatika po jeziku kroz
grammars_for(lang)). - Razrješavač entiteta neizrazito podudara imenovane entitete s primarnim ključevima baze (rapidfuzz, prag 75).
- Računa se ocjena pouzdanosti:
| Signal | Težina |
|---|---|
| Osnovna pouzdanost gramatike | 60% |
| spaCy NER oznaka odgovara domeni | 20% |
| Pogodak razrješavača entiteta visoke pouzdanosti | 20% |
Gramatike s base_confidence ≥ 0.95 u potpunosti zaobilaze ponderiranu
formulu i izravno pokreću alat.
Pouzdanost → akcija:
≥ 0.85— brzi put stupnja 1, LLM se zaobilazi0.50 – 0.84— stupanj 2: LLM planer s kontekstom entiteta< 0.50— stupanj 3: LLM planer bez unaprijed razriješenog konteksta- Pogodci entiteta u više domena ograničavaju pouzdanost na 0.60 i proizvode pod "Jeste li mislili?" — osim ako je gramatika ≥ 0.95 već odredila namjeru
Ako poziv alata u stupnju 1 vrati grešku, cjevovod automatski propada u stupanj 2 — pohlepne gramatike ne mogu blokirati planer. Pod s greškom stupnja 1 čuva se kao posljednja pričuva.
Stupanj 2/3 — LLM planer (< 3–5 s)
LLM prima upit, kontekst entiteta (samo stupanj 2), trenutni datum i lokaciju te potpunu shemu registra alata. Vraća jedan JSON niz poziva alata, validiran JSON shemom prije izvršavanja.
Planer koristi Anthropic API kada je postavljen ANTHROPIC_API_KEY, inače
bilo koju krajnju točku kompatibilnu s OpenAI-jem (LLM_API_URL). LLM
nikada ne proizvodi konačne odgovore — samo validirane grafove alata.
Dispečer izvršava pozive alata u paralelnim valovima prema deklariranim
depends_on ovisnostima, razrješavajući predloške
{stepN.result.field} između valova.
Razrješavanje entiteta
Razrješavač entiteta stoji između NLP cjevovoda i svih poziva alata te sprječava klasu grešaka tipa "NYC naspram New York City":
- SQLite tablica
entity_aliases(alias, canonical_key, domain, confidence)izgrađena pri unosu podataka; - podudaranje n-grama na granicama riječi — točno za kratke aliase, rapidfuzz omjer ≥ 75 za aliase od 4+ znakova; podnizovi se nikad ne podudaraju;
- kanonski ključ uvijek nadjačava tekst entiteta izvučen gramatikom;
- napaja i bodovanje pouzdanosti stupnja 1 i kontekst planera.
Registar alata
Svih deset alata vraća tipizirane objekte rezultata, nikad sirove stringove — obavezno za determinističko ulančavanje alata:
| Alat | Pozadinski sustav |
|---|---|
execute_math |
qalc potproces (data API) |
execute_symbolic |
qalc kroz WL→qalc prevoditelj |
generate_plot |
sympy + matplotlib |
balance_chemistry |
chempy |
element_lookup |
mendeleev + qalc |
fetch_weather |
Open-Meteo + geokodiranje |
query_database |
Registar konektora: cia, food_facts, hjp, dictionary |
query_wikidata |
Wikidata API + Wikipedija |
temporal_calc |
python-dateutil (u procesu) |
fermi_estimate |
statička tablica (u procesu) |
Ključne izvorne datoteke
| Datoteka | Svrha |
|---|---|
app/nlp/pipeline.py |
Ulazna točka cjevovoda — run() |
app/nlp/stage1/grammars.py |
Grammar dataklase + grammars_for(lang) |
app/nlp/stage1/classifier.py |
spaCy NER + bodovanje pouzdanosti |
app/nlp/entity_resolver.py |
Entitet → kanonski ključ |
app/nlp/stage2/planner.py |
LLM planer |
app/nlp/stage2/dispatcher.py |
Paralelni izvršitelj alata po valovima |
app/tools/registry.py |
Tablica TOOL_REGISTRY |
app/assembler/pod_builder.py |
Rezultati alata → lista Podova |
app/schemas/validators.py |
JSON shema izlaza planera |
data_api/routers/ |
FastAPI računski routeri |
data_api/connectors/ |
Jedna DataConnector podklasa po izvoru podataka |