SINTARIS Pišite nam
← Vsi članki

UI in izvorni dokumenti: kako preprečiti halucinacije jezikovnih modelov

2026-06-28 · Sintaris · rag, citations, hallucinations, grounding, document-ai, ocr

TL;DR. „Halucinacija“ velikega jezikovnega modela (LLM) je simptom, ne diagnoza. Diagnoza je običajno slabo iskanje po dokumentih, slabo navajanje virov ali oboje. V članku pokažemo, kako odgovore UI na podlagi dokumentov stranke zgradimo tako, da je vsaka trditev povezana s konkretnim odlomkom konkretnega dokumenta in da lahko vsak inženir odgovor preveri v desetih sekundah. Pristop sestavljajo obvezno navajanje virov pri generiranju, hibridno iskanje, strukturiran zajem dokumentov in zanesljiv evalvacijski nabor.

1. Problem: „UI si je to izmislila“

Prizor iz prakse: UI-asistent dela z dokumenti stranke. Teden dni pozneje vodja oddelka napiše: „Asistent pravi, da naš pravilnik določa X. Odprl sem pravilnik in X-a tam ni. Kaj pa zdaj?“

Če ekipa odgovori, da gre pač za halucinacijo LLM-ja, ki se včasih zgodi, in da bodo izboljšali poziv, je projekt praktično mrtev. Stranka je izgubila zaupanje, zaupanje pa se le redko vrne.

Problem je rešljiv, rešitev pa je v arhitekturi, ne v tem, da LLM prosimo, naj bo „bolj previden“. Ključna ideja: vsaka trditev v odgovoru mora imeti sklic na konkreten odlomek konkretnega dokumenta, sklic pa mora biti mogoče samodejno preveriti.

2. Za koga je to pomembno

3. Pogosta napaka

  1. Vzamemo standardno predlogo RAG: razrez na odlomke → vektorske vložitve → top-K → LLM.
  2. Predpostavimo: „LLM je pameten, vire bo našel sam.“
  3. Dobimo odgovore brez navedbe virov ali pa z navedbami, kot je „v skladu z dokumentom X“, a brez številke strani.
  4. Ko pravnik prosi, naj mu pokažemo, kje točno to piše, odgovora ni.

Dodatne pasti:

4. Tehnični pristop: strukturiran zajem in obvezno navajanje virov

Tako bi moral biti videti cevovod:

flowchart LR
  RAW[PDF / DOCX / HTML] --> PARSE[Strukturiran razčlenjevalnik<br/>stran, poglavje, tabela]
  PARSE --> CHUNK[Pameten razrez<br/>ob upoštevanju strukture]
  CHUNK --> META[Metapodatki<br/>stran, poglavje, jezik]
  META --> EMB[Vložitve + FTS]
  EMB --> PG[(Postgres + pgvector)]
  QUERY[Vprašanje uporabnika] --> HYBRID[Hibridno iskanje<br/>BM25 + vektorsko + RRF]
  HYBRID --> RERANK[Ponovno razvrščanje<br/>s cross-encoderjem]
  RERANK --> PROMPT[Poziv z obveznim navajanjem virov]
  PROMPT --> LLM[LLM]
  LLM --> VALIDATE[Preverjanje navedb virov]
  VALIDATE -- ok --> ANSWER[Odgovor z oznakami<br/>doc:42#p:18#§:4.2]
  VALIDATE -- fail --> RETRY[Ponovni poskus<br/>z obveznimi top-3]
  RETRY --> VALIDATE

4.1. Strukturiran razčlenjevalnik

Ne „PDF → besedilo“, temveč „PDF → zaporedje zapisov (stran, poglavje, razpon znakov, besedilo, tabela?, slika?)“. Za to uporabljamo:

4.2. Pameten razrez na odlomke

Pravila, ki jih uporabljamo:

4.3. Poziv z obveznim navajanjem virov

Predloga (poenostavljena):

Odgovarjate samo na podlagi spodnjih odlomkov.
Vsaka trditev v odgovoru se MORA končati z oznako
v obliki [doc:ID#chunk:N].
Če odlomki ne vsebujejo odgovora, odgovorite:
„Priloženi viri ne vsebujejo odgovora na to vprašanje.“
Ne dodajajte dejstev, ki jih v odlomkih ni.

Odlomki:
[doc:42#chunk:7] (stran 18, §4.2) ... besedilo ...
[doc:42#chunk:8] (stran 19, §4.3) ... besedilo ...
...

Vprašanje: {vprašanje}

4.4. Naknadno preverjanje

Po generiranju odgovor preveri preprosta koda:

def validate_citations(answer: str, allowed_chunk_ids: set[str]) -> bool:
    sentences = split_sentences(answer)
    for s in sentences:
        markers = re.findall(r"\[doc:(\d+)#chunk:(\d+)\]", s)
        if not markers:
            return False  # stavek brez navedbe vira
        for doc_id, chunk_id in markers:
            if f"{doc_id}#{chunk_id}" not in allowed_chunk_ids:
                return False  # navedba napačnega vira
    return True

Če preverjanje ne uspe, LLM pokličemo znova, tokrat s tremi najboljšimi odlomki kot obveznim kontekstom in s strožjim pozivom. Če tudi to ne pomaga, sistem odgovori: „Viri ne vsebujejo odgovora.“

5. Tabela: merila za „pravo“ navajanje virov

Merilo Šibko Dobro Odlično
Dokument je naveden „v skladu s pravilnikom“ „v skladu s pravilnikom X“ ID dokumenta + naziv
Stran je navedena ne na koncu odstavka pri vsakem stavku
Poglavje je navedeno ne poglavje poglavje + člen ali točka
Navedbo je mogoče samodejno preveriti ne z regularnim izrazom strojno berljivo + povezava
Zavrnitev, ko vira ni ne včasih vedno
Evalvacijski nabor za zavrnitve ne 5–10 vprašanj 30 ali več testnih vprašanj

6. Primer iz prakse SINTARIS

Worksafety Superassistant je naša najzahtevnejša izvedba z obveznim navajanjem virov. Korpus obsega približno 3000 strani predpisov s področja varnosti in zdravja pri delu ter interne standardne postopke (SOP) stranke.

Kaj smo naredili:

Metrike po šestih mesecih:

Podrobnosti: Worksafety § 6 RAG pipeline.

7. Kontrolni seznam (15 točk) za RAG z obveznim navajanjem virov

  1. Razčlenjevalnik ohrani strukturo (stran, poglavje, člen) in ne obravnava celotnega PDF-ja kot enega kosa besedila.
  2. Razrez upošteva strukturo in ne reže stavkov ali tabel.
  3. Metapodatki (stran, poglavje) so shranjeni pri vsakem odlomku.
  4. Hibridno iskanje (BM25 + vektorsko + RRF), ne samo vložitve.
  5. Ponovno razvrščanje s cross-encoderjem: top-12 → top-5.
  6. Predloga poziva zahteva oznake virov.
  7. Naknadno preverjanje ugotovi, ali so oznake navedene.
  8. Vzorec zavrnitve: „tega v virih ni“ je enakovreden, načrtovan odgovor.
  9. Evalvacijski nabor: najmanj 30 vprašanj z referenčnimi navedbami.
  10. Testni nabor za zavrnitve: najmanj 20 vprašanj, na katera v virih ni odgovora.
  11. Natančnost navedb se meri in je prikazana v Grafani, ne pa preverjena „kdaj pa kdaj ročno“.
  12. Delež zavrnitev se meri ločeno od natančnosti.
  13. Spremljanje odstopanj: vsak teden preverimo, ali so metrike padle.
  14. Prag za iskanje: če je ocena najboljšega zadetka nižja od X, sistem odgovor zavrne.
  15. Povezave v odgovorih: uporabnik klikne in vidi izvorni dokument.

8. Tveganja

9. Kaj storiti naprej

Če že imate pilotni sistem RAG, ki si občasno kaj „izmisli“, začnite z dvema korakoma:

  1. Vklopite poziv z obveznim navajanjem virov in naknadno preverjanje.
  2. Sestavite testni nabor z 20 vprašanji, na katera v korpusu ni odgovora, in izmerite pravilnost zavrnitev.

Pogosto že ta dva koraka dvigneta kakovost z „včasih pravilno“ na „vedno bodisi pravilno bodisi pošteno zavrnjeno“.

Za celoten cikel je na voljo pilot z UI, ki traja 4–8 tednov in kot standardni vzorec vključuje gradnjo sistema RAG z obveznim navajanjem virov. Obseg in ceno določimo po uvodnem pogovoru.

10. Viri


SINTARIS gradi sisteme RAG s preverljivimi navedbami virov za podjetja v EU. Uvodni pogovor je brezplačen in traja 30 minut.