ENCSPožádat o přístup ke kódu

Systém

Znalostní báze

Znalostní báze pro jednu firmu s řízením přístupu: nahraje dokumenty firmy a odpovídá na otázky výhradně z těch zdrojů, které tazatel smí vidět. Radí, nejedná — odpovídá, nikdy sama nic nedělá.

Problém

Naivní „chat nad našimi dokumenty“ pokazí přesně to, na čem záleží: přístup. Některé dokumenty jsou pro celou firmu, jiné osobní. Model, který vidí všechno, vyzradí; model, kterému řeknete „buď opatrný“, nepředvídatelně odmítá i ty, kdo nárok mají. Oprávnění se proto musí vynutit dřív, než model cokoli uvidí, a model ho nesmí znovu posuzovat.

Jak to funguje

  1. Přístup v SQL. Jedno pravidlo viditelnosti — sdíleno s celou firmou, nebo osobní a viditelné vlastníkovi a uživatelům a rolím z jeho ACL. Bez obcházení, ani pro majitele firmy. Uplatní se v každém dotazu, který čte kusy: ve vektorovém hledání, ve hledání slov, ve statistikách slov i ve slovníku překlepů. → Rozhodnutí 0001
  2. Hybridní vyhledávání. Vektorová podobnost (lokální vícejazyčný embeddingový model; dokumenty server neopouštějí) sloučená s hledáním slov váženou metodou Reciprocal Rank Fusion. Slova se párují klíči lemma + kmen, spočítanými v Pythonu a uloženými v databázi; předpona bez diakritiky je jen pojistka s poloviční vahou. → Rozhodnutí 0006
  3. Doklad, nebo nic. Kus se počítá jen s blízkým vektorem, nebo se silnou shodou vzácných slov otázky pokrývající většinu otázky vážené podle idf. Překlep se nejdřív opraví podle vlastního slovníku tazatele. Bez dokladu zní odpověď „tohle ve znalostní bázi není“ a model se nevolá. → Proč nám samotné vektorové vyhledávání nestačilo
  4. Jen citované zdroje. Model cituje názvy dokumentů v hranatých závorkách; jako zdroje se ukážou jen citované dokumenty, jeden na dokument, s úryvkem. → Rozhodnutí 0003

V kódu dále

  • Členy jsou lidé i AI agenti — oba procházejí stejným filtrem oprávnění.
  • Tajemství zůstávají na serveru. Token propojené služby je uložený šifrovaně (Fernet, klíč odvozený přes HKDF z vyhrazeného klíče) a používá ho jen proxy na serveru se seznamem povolených cest a stropem velikosti požadavku; prohlížeč ho nikdy nevidí.
  • Jedna firma = jedna instance: jedna znalostní báze, jeden vyhrazený Postgres + pgvector.

Jak je otestovaná

  • Jednotkové testy bez databáze: klíče slov („musí najít“ / „nesmí najít“), hybridní slučování, zdroje, přístup, proxy.
  • Integrační testy nad skutečným Postgresem + pgvector: pravidlo přístupu skutečnými dotazy pro členy s různými právy, vyhledávání, migrace.
  • Běh s vynuceným selháním v kopii vrátí každou opravu a vyžaduje, aby její testy spadly; brána CI ho pouští jako první a chybějící databáze je selhání, ne přeskočený test. → Rozhodnutí 0005

Technologie

Python 3.11 · FastAPI · SQLAlchemy 2 (async) · Postgres + pgvector · embeddingy fastembed / ONNX (multilingual-e5-large) · simplemma + Snowball · Alembic · malé UI v čistém HTML/JS.