[{"data":1,"prerenderedAt":661},["ShallowReactive",2],{"blog-rag-access-control-permissions-hu":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":27,"sources":37,"cover":62,"og":63,"expertise":64,"locales":65,"lang":68,"title":69,"description":70,"coverAlt":71,"metaTitle":72,"takeaways":73,"faq":79,"toc":95,"blocks":126,"others":423},"rag-access-control-permissions","2026-10-17",9,"rag",[9,10,11,12,13],"RAG","Access control","Security","Multi-tenancy","Vector search",[15,16,17,18,19,20,21,22,23,24,25,26],"rag access control","permission aware rag","document level security rag","rag multi tenancy","vector database access control","pgvector row level security","security trimming azure ai search","openfga rag authorization","qdrant multitenancy","pinecone namespaces multitenancy","owasp llm08 vector and embedding weaknesses","rag data leakage",[28,31,34],{"name":29,"url":30},"Access-control list","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAccess-control_list",{"name":32,"url":33},"Multitenancy","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMultitenancy",{"name":35,"url":36},"Retrieval-augmented generation","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRetrieval-augmented_generation",[38,41,44,47,50,53,56,59],{"title":39,"url":40},"OWASP GenAI Security Project: LLM08:2025 Vector and Embedding Weaknesses","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm082025-vector-and-embedding-weaknesses\u002F",{"title":42,"url":43},"PostgreSQL documentation: Row Security Policies","https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fddl-rowsecurity.html",{"title":45,"url":46},"pgvector README: filtering and iterative index scans","https:\u002F\u002Fgithub.com\u002Fpgvector\u002Fpgvector",{"title":48,"url":49},"Qdrant: Multitenancy and partitions guide","https:\u002F\u002Fqdrant.tech\u002Fdocumentation\u002Fguides\u002Fmultiple-partitions\u002F",{"title":51,"url":52},"Pinecone: Implement multitenancy using namespaces","https:\u002F\u002Fdocs.pinecone.io\u002Fguides\u002Findex-data\u002Fimplement-multitenancy",{"title":54,"url":55},"Microsoft Learn: Document-level access control in Azure AI Search","https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fsearch\u002Fsearch-document-level-access-overview",{"title":57,"url":58},"OpenFGA: RAG authorization use case","https:\u002F\u002Fopenfga.dev\u002Fdocs\u002Fuse-cases\u002Frag-authorization",{"title":60,"url":61},"Morris et al.: Text Embeddings Reveal (Almost) As Much As Text (EMNLP 2023)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2310.06816","\u002Fimages\u002Fblog\u002Frag-access-control-permissions\u002Fcover.webp","\u002Fimages\u002Fblog\u002Frag-access-control-permissions\u002Fog.jpg","ai-engineer",[66,67,68],"en","de","hu","Hozzáférés-kezelés RAG-hoz: jogosultságtudatos visszakeresés dokumentumszivárgás nélkül","Hogyan szivárogtatnak dokumentumot a RAG-asszisztensek, és hogyan állítsd meg: ACL minden chunkon, előszűrés, sorszintű biztonság pgvectorban, jogszinkron.","Hét kártya sorban, haton lakat jelvény, a csupasz kártya nyilat küld kifelé.","Hozzáférés-kezelés RAG-hoz · Balázs Csorba",[74,75,76,77,78],"A jogosultságokat a visszakeresési lekérdezésben érvényesítsd, mielőtt bármilyen szöveg a modellhez jut; a rendszerprompt nem hozzáférés-kezelés.","Minden chunk örökli a forrásdokumentuma ACL-jét, lehetőleg csoportazonosítókként, mellé bérlőazonosítót és az utolsó ACL-szinkron időpontját.","A szűrt vektoros keresésnek van egy recall-csapdája: a pgvector a szűrőt a HNSW-bejárás után alkalmazza, így egy 10%-os szűrő iteratív bejárás nélkül kb. 4 találatot hagyhat.","A jogosultságváltozások csak akkor hatnak, amikor elérik az indexet, ezért az ACL-eket a tartalomtól külön szinkronizáld, a magas kockázatú forrásokat pedig lekérdezéskor ellenőrizd.","A gyorsítótárak, összefoglalók, memória és embeddingek származtatott adatok, és ugyanazok a jogosultságok kellenek nekik, mint a forrásdokumentumaiknak.",[80,83,86,89,92],{"q":81,"a":82},"Mi a jogosultságtudatos RAG?","Olyan RAG-rendszer, amely csak azokat a chunkokat keresi vissza, amelyeket a kérdező felhasználó a forrásrendszerben olvashat. A felhasználó identitását csoportokra oldjuk fel, és ezek a csoportok szűrik a keresést, mielőtt bármilyen szöveg a modellhez kerülne.",{"q":84,"a":85},"A vektoros keresés előtt vagy után szűrjek?","Előtte, amikor csak a tároló támogatja. A lekérdezésbe épített előszűrés a jogosulatlan chunkokat eleve kizárja a jelöltek közül. Az engedélyezési szolgáltatással végzett utószűrés is működik, de többet kell lekérned, és üres találati oldalakat kockáztatsz.",{"q":87,"a":88},"Biztonságosabb a bérlőnkénti index, mint a metaadat-szűrő?","Erősebb elszigetelést ad: egy lekérdezés akkor sem éri el egy másik bérlő adatait, ha hiányzik egy szűrő, a kivezetés pedig a névtér törlése. A Pinecone bérlőnként egy névteret javasol. Egy bérlőn belül azonban továbbra is dokumentumszintű szűrők kellenek.",{"q":90,"a":91},"Kiszivárogtathatják az embeddingek az eredeti szöveget?","Igen, bizonyos mértékig. Morris és társai 2023-ban kimutatták, hogy egy iteratív inverziós módszer a 32 tokenes bemenetek 92%-át pontosan visszaállította az embeddingjeikből. A vektortárolót ugyanúgy védd, mint a forrásdokumentumokat.",{"q":93,"a":94},"Hogyan teszteljem, hogy a jogosultságok tartanak?","Helyezz el csak egy csoport által látható kanári-dokumentumokat, futtass rögzített kérdéskészletet minden csoport felhasználójaként, és ellenőrizd, hogy egyetlen kanári-chunk sem jelenik meg olyan találati halmazban, ahová nem tartozik. Futtasd CI-ban és a jogosultságszinkron minden módosítása után.",[96,99,102,105,108,111,114,117,120,123],{"id":97,"title":98},"how-rag-leaks","Hogyan szivárogtat dokumentumot egy RAG-rendszer?",{"id":100,"title":101},"where-to-enforce","Hol történjen az engedélyezés?",{"id":103,"title":104},"patterns","Külön indexek, előszűrés vagy utószűrés?",{"id":106,"title":107},"chunk-metadata","Mit kell rendelkeznie minden chunknak?",{"id":109,"title":110},"pgvector-rls","Hogyan csináld pgvectorban?",{"id":112,"title":113},"vector-databases","Mit kínál a Qdrant, a Pinecone és az Azure AI Search?",{"id":115,"title":116},"permission-sync","Hogyan tartsd szinkronban a jogosultságokat?",{"id":118,"title":119},"derived-data","Mi a helyzet a gyorsítótárakkal, összefoglalókkal és embeddingekkel?",{"id":121,"title":122},"leak-tests","Hogyan teszteld, hogy semmi sem szivárog?",{"id":124,"title":125},"sources","Források",[127,131,134,137,140,169,178,179,182,191,203,204,207,255,263,264,271,273,280,281,288,290,310,311,340,341,344,369,370,378,381,382,385,387,395,396],{"type":128,"content":129},"paragraph",[130],"Egy belső RAG-asszisztens legrövidebb útja, ha mindent egyetlen szolgáltatásfiókkal indexelsz, és hagyod, hogy a modell válaszoljon. Ez egyben a legrövidebb út ahhoz is, hogy egy gyakornok rákérdezzen „az idei fizetési sávokra”, és forrásmegjelöléssel ellátott választ kapjon egy HR-táblázatból. A forrásrendszerben voltak jogosultságok; az index eltüntette őket.",{"type":128,"content":132},[133],"Az OWASP ezt LLM08:2025 néven, a vektorok és embeddingek gyengeségeiként tartja számon: gyenge hozzáférés-kezelés az embeddingeken, szivárgás a bérlők között közös vektoradatbázisokban, és embedding-inverzió. Ez a cikk a gyakorlati oldal: hol érvényesítsd a jogosultságokat, mit kell minden chunknak hordoznia, hogyan csináld pgvectorban, Qdrantban, Pinecone-ban és Azure AI Searchben, hogyan tartsd szinkronban a jogokat, és hogyan teszteld, hogy semmi sem szivárog.",{"type":135,"level":136,"id":97,"text":98},"heading",2,{"type":128,"content":138},[139],"Az általam átnézett rendszerekben a szivárgás ritkán ered ügyes támadásból. Ott keletkezik, ahol a jogosultságokat soha nem kapcsolták hozzá az adatokhoz:",{"type":141,"items":142},"list",[143,149,154,159,164],[144,148],{"tag":145,"children":146},"strong",[147],"ACL nélküli index."," A tartalmat rendszergazdai vagy szolgáltatásfiókkal gyűjtötték be, és a chunkok semmilyen információt nem hordoznak arról, ki olvashatja őket.",[150,153],{"tag":145,"children":151},[152],"Nyitva hibázó szűrők."," Egy hiányzó csoport-claim üres szűrőt eredményez, az üres szűrő pedig mindenre illeszkedik.",[155,158],{"tag":145,"children":156},[157],"Elavult jogosultságok."," Valakit múlt héten eltávolítottak egy SharePoint-webhelyről; az index még mindig tartalmazza.",[160,163],{"tag":145,"children":161},[162],"Származtatott adatok."," Egy szemantikus gyorsítótár, egy beszélgetési memória vagy több dokumentumot összevonó összefoglaló egy második felhasználónak olyan anyagból válaszol, amelyet csak az első láthatott.",[165,168],{"tag":145,"children":166},[167],"Túljogosított ágensek."," Egy visszakereső eszköz a felhasználó identitása helyett a szolgáltatásfiókkal fut, így az ágens olyat is elér, amit a felhasználó nem.",{"type":128,"content":170},[171,172,177],"Az utolsó pont az általános szabály a ",{"tag":173,"to":174,"children":175},"link","\u002Fblog\u002Fai-agent-identity-least-privilege",[176],"Az MI-ágensek identitások"," cikkből: a visszakeresés a felhasználó nevében, a felhasználó jogaival működjön, ne az őt futtató rendszer jogaival.",{"type":135,"level":136,"id":100,"text":101},{"type":128,"content":180},[181],"A visszakeresési lekérdezésben, mielőtt bármi a modellhez érne. Ha egy chunk egyszer bekerült a promptba, semmilyen utasítás nem tartja megbízhatóan távol a választól, a prompt injection pedig közvetlenül rá is kérdezhet. A folyamat minden technológiai környezetben ugyanaz: hitelesítsd a felhasználót, oldd fel a csoportjait, add hozzá ezeket szűrőként a kereséshez, és csak a megmaradt chunkokat add tovább rerankelésre és generálásra.",{"type":183,"attrs":184,"inner":188,"caption":189},"diagram",{"viewBox":185,"role":186,"aria-labelledby":187},"0 0 720 170","img","acl1-t acl1-d","\u003Ctitle id=\"acl1-t\">Jogosultságtudatos visszakeresés\u003C\u002Ftitle>\u003Cdesc id=\"acl1-d\">A felhasználói tokent bérlőre és csoportlistára oldjuk fel. A keresési lekérdezés ezekre a csoportokra szűr, így a jogosulatlan chunkok soha nem lesznek jelöltek. A rerankelés és a nyelvi modell csak engedélyezett chunkokat lát.\u003C\u002Fdesc>\u003Cdefs>\u003Cmarker id=\"acl1-ah\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\">\u003Cpath d=\"M0 0L10 5L0 10z\" class=\"d-head\" \u002F>\u003C\u002Fmarker>\u003C\u002Fdefs>\u003Crect x=\"20\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"79\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Felhasználói token\u003C\u002Ftext>\u003Ctext x=\"79\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">OIDC, Entra\u003C\u002Ftext>\u003Cpath d=\"M138 85H158\" class=\"d-line\" marker-end=\"url(#acl1-ah)\" \u002F>\u003Crect x=\"160\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-accent\" \u002F>\u003Ctext x=\"220\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Feloldás\u003C\u002Ftext>\u003Ctext x=\"220\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">bérlő, csoportok\u003C\u002Ftext>\u003Cpath d=\"M279 85H299\" class=\"d-line\" marker-end=\"url(#acl1-ah)\" \u002F>\u003Crect x=\"301\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-gold\" \u002F>\u003Ctext x=\"360\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Szűrt keresés\u003C\u002Ftext>\u003Ctext x=\"360\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">ACL a lekérdezésben\u003C\u002Ftext>\u003Cpath d=\"M419 85H439\" class=\"d-line\" marker-end=\"url(#acl1-ah)\" \u002F>\u003Crect x=\"441\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"500\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">Rerank\u003C\u002Ftext>\u003Ctext x=\"500\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">csak engedélyezett\u003C\u002Ftext>\u003Cpath d=\"M560 85H580\" class=\"d-line\" marker-end=\"url(#acl1-ah)\" \u002F>\u003Crect x=\"582\" y=\"47\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-mint\" \u002F>\u003Ctext x=\"641\" y=\"81\" text-anchor=\"middle\" class=\"d-text\">LLM\u003C\u002Ftext>\u003Ctext x=\"641\" y=\"103\" text-anchor=\"middle\" class=\"d-small\">forrást idéz\u003C\u002Ftext>",[190],"Ha a csoportfeloldás sikertelen, a kérés is sikertelen; soha nem esik vissza szűretlen keresésre.",{"type":192,"variant":193,"title":194,"body":195},"callout","warn","A rendszerprompt nem hozzáférés-kezelés",[196],[197,198,202],"A rendszerpromptban szereplő „Ne add ki a HR-dokumentumokat nem HR-es munkatársaknak” remény, nem kontroll. Bármi, ami a kontextusablakban van, a kimenetbe kerülhet, különösen ",{"tag":173,"to":199,"children":200},"\u002Fblog\u002Fprompt-injection-lethal-trifecta-patterns",[201],"a halálos hármas"," cikkben leírt injection-mintáknál. Ehelyett tartsd távol a jogosulatlan szöveget a kontextustól.",{"type":135,"level":136,"id":103,"text":104},{"type":128,"content":205},[206],"Négy minta létezik, és a legtöbb valós rendszer kettőt kombinál: szigorú elszigetelést a bérlők között, és dokumentumszintű szűrést minden bérlőn belül.",{"type":208,"head":209,"rows":218},"table",[210,212,214,216],[211],"Minta",[213],"Működés",[215],"Erősség",[217],"Gyengeség",[219,228,237,246],[220,222,224,226],[221],"Bérlőnkénti index vagy névtér",[223],"A lekérdezés egy bérlő partícióját célozza",[225],"Hiányzó szűrő nem léphet át bérlőt; kivezetés törléssel",[227],"Bérlőn belül nincs dokumentumszintű jog",[229,231,233,235],[230],"Metaadat-előszűrés",[232],"Engedélyezett csoportok chunkonként, szűrő a lekérdezésben",[234],"Jogosulatlan chunk soha nem lesz jelölt",[236],"Az ACL-eket be kell szinkronizálni az indexbe",[238,240,242,244],[239],"Utószűrés engedélyezési szolgáltatással",[241],"Jelöltek lekérése, majd mindegyik ellenőrzése OpenFGA-val vagy hasonlóval",[243],"Mindig aktuális jogok",[245],"Túllekérés, üres oldalak, késleltetés",[247,249,251,253],[248],"Sorszintű biztonság az adatbázisban",[250],"A Postgres-szabályok a munkamenet szerepköre szerint szűrik a sorokat",[252],"Alapból tilt, az alkalmazás alatt érvényesül",[254],"Csak Postgreshez; recall-csapda ANN-indexekkel",{"type":128,"content":256},[257,258,262],"Az OpenFGA leírja az utószűrés változatait: minden jelöltnél ellenőrizd a ",{"tag":259,"children":260},"code",[261],"can_view"," relációt, vagy hívd meg egyszer a list-objects műveletet, hogy megkapd az összes dokumentumot, amelyet a felhasználó olvashat, és metszd a jelöltekkel. Kis halmazokra dokumentumonkénti ellenőrzést, nagyobbakra list-objects-et javasol. Minden utószűrés ára, hogy a szükségesnél többet kell lekérned, mert egyes jelöltek kiesnek.",{"type":135,"level":136,"id":106,"text":107},{"type":128,"content":265},[266,267,270],"A chunkok öröklik a forrásdokumentumuk jogosultságait. Ahol lehet, egyéni felhasználók helyett csoportokat tárolj; a Microsoft ugyanezt tanácsolja az ACL-lel védett tartalmakhoz Azure AI Searchben, a Pinecone pedig antipatternnek nevezi a hosszú felhasználóazonosító-listákra szűrést, ahol egy ",{"tag":259,"children":268},[269],"$in"," operátor legfeljebb 10 000 értéket fogad. Egy minimális adatcsomag:",{"type":259,"code":272},"{\n  \"chunk_id\": \"sp-hr-0412#7\",\n  \"tenant_id\": \"acme\",\n  \"doc_id\": \"sp-hr-0412\",\n  \"source\": \"sharepoint:\u002F\u002Fhr\u002Fsalary-bands-2026.xlsx\",\n  \"allowed_groups\": [\"grp-hr\", \"grp-exec\"],\n  \"classification\": \"confidential\",\n  \"acl_version\": \"2026-10-16T22:05:11Z\",\n  \"text\": \"...\"\n}",{"type":128,"content":274},[275,276,279],"Az ",{"tag":259,"children":277},[278],"acl_version"," mező teszi auditálhatóvá a szinkront: látod, milyen régiek az egyes chunkok jogosultságai, és megtalálod azokat, amelyekből kimaradt egy frissítés. Bármihez, ami több dokumentumból származik, például egy összefoglalóhoz, a csoportjaik metszetét használd, ne az unióját.",{"type":135,"level":136,"id":109,"text":110},{"type":128,"content":282},[283,284,287],"A Postgres sorszintű biztonsága az alkalmazás alá helyezi a szűrőt. Ha egy táblán bekapcsolod, minden normál hozzáférést egy szabálynak kell engedélyeznie, szabály nélkül pedig alapból tiltás érvényes. A szuperfelhasználók, a BYPASSRLS jogú szerepkörök és általában a tábla tulajdonosa megkerülik, ezért az alkalmazásnak külön szerepkörrel kell csatlakoznia, a ",{"tag":259,"children":285},[286],"FORCE ROW LEVEL SECURITY"," pedig a tulajdonosra is kiterjeszti a szabályt.",{"type":259,"code":289},"ALTER TABLE chunks ENABLE ROW LEVEL SECURITY;\nALTER TABLE chunks FORCE ROW LEVEL SECURITY;\n\n-- The app sets the caller's tenant and groups per transaction.\nCREATE POLICY chunk_read ON chunks FOR SELECT TO rag_app\n  USING (\n    tenant_id = current_setting('app.tenant_id')\n    AND allowed_groups && string_to_array(current_setting('app.groups'), ',')\n  );\n\nBEGIN;\nSET LOCAL app.tenant_id = 'acme';\nSET LOCAL app.groups = 'grp-sales,grp-all';\nSET LOCAL hnsw.iterative_scan = relaxed_order;   -- pgvector 0.8.0+\nSELECT chunk_id, text FROM chunks\nORDER BY embedding \u003C=> $1 LIMIT 20;\nCOMMIT;",{"type":128,"content":291},[292,293,296,297,300,301,304,305,309],"Az utolsó beállítás fontosabb, mint amilyennek látszik. A pgvector a szűrőket a közelítő index bejárása után alkalmazza, és az alapértelmezett 40-es ",{"tag":259,"children":294},[295],"hnsw.ef_search"," mellett egy, a sorok 10%-ára illeszkedő szűrő kb. 4 találatot hagy. A jogosultsági szűrő pontosan ilyen szűrő, a tünet pedig nem szivárgás, hanem egy asszisztens, amely kevés joggal rendelkező felhasználóknak „nem talál” dokumentumokat. A pgvector 0.8.0-ban bevezetett iteratív indexbejárás addig folytatja, amíg elég sor nem illeszkedik, legfeljebb ",{"tag":259,"children":298},[299],"hnsw.max_scan_tuples"," sorig (alapból 20 000). Bérlőknél segít egy B-fa index a ",{"tag":259,"children":302},[303],"tenant_id"," oszlopon vagy a bérlő szerinti listapartícionálás is. A ",{"tag":173,"to":306,"children":307},"\u002Fblog\u002Fpgvector-vs-vector-databases",[308],"pgvector és vektoradatbázisok"," összehasonlításom megmutatja, mikor elég ez.",{"type":135,"level":136,"id":112,"text":113},{"type":141,"items":312},[313,326,331],[314,317,318,321,322,325],{"tag":145,"children":315},[316],"A Qdrant"," egy bérlőmezős gyűjteményt javasol a bérlőnkénti gyűjtemények helyett. Egy ",{"tag":259,"children":319},[320],"is_tenant"," true értékű kulcsszavas payload-index (v1.11-től) együtt tárolja az egyes bérlők vektorait, minden lekérdezés ",{"tag":259,"children":323},[324],"must"," szűrőt visz a bérlőre, v1.16-tól pedig a többszintű bérlőkezelés a nagy bérlőket saját shardba emeli. A dokumentumszintű csoportok további szűrőként a payloadba kerülnek.",[327,330],{"tag":145,"children":328},[329],"A Pinecone"," bérlőnként egy névteret javasol egy serverless indexben. A névterek külön tárolódnak, amit a Pinecone fizikai elszigetelésnek nevez, a kivezetés pedig a névtér törlése. A lekérdezéseket a névtér mérete szerint számlázzák, így egy közös 100 GB-os névtér szűrése százszor többe kerül, mint egy 1 GB-os bérlői névtér lekérdezése.",[332,335,336,339],{"tag":145,"children":333},[334],"Az Azure AI Search"," támogatja a biztonsági szűrőket, vagyis egyszerű karakterlánc-összehasonlítást egy, az alkalmazás által kitöltött identitásmezőn, előzetes verzióban pedig natív dokumentumszintű ACL-eket és RBAC-hatóköröket, SharePoint ACL-eket és Purview bizalmassági címkéket, amelyeket a felhasználó Entra tokenje érvényesít az ",{"tag":259,"children":337},[338],"x-ms-query-source-authorization"," fejlécben. A Microsoft egyértelművé teszi, hogy a biztonsági szűrő karakterlánc-egyezés, nem hitelesítés, tehát az alkalmazásnak előbb ellenőriznie kell az identitást.",{"type":135,"level":136,"id":115,"text":116},{"type":128,"content":342},[343],"Az index másolat, a másolatok pedig elavulnak. A Microsoft dokumentációja ezt kerek perec kimondja: a forrásrendszer jogosultságváltozásai csak akkor jelennek meg a keresési eredményekben, ha a metaadatok szinkronizálódtak az indexbe, SharePointnál pedig a szülő webhelyről, tárból vagy mappából örökölt változásokhoz kifejezett frissítés kell. Minden más technológiai környezet ugyanígy működik, akár dokumentálják, akár nem. Három intézkedés tartja kicsiben az ablakot:",{"type":141,"ordered":345,"items":346},true,[347,359,364],[348,351,352,355,356,358],{"tag":145,"children":349},[350],"Az ACL-eket a tartalomtól külön szinkronizáld."," Az ",{"tag":259,"children":353},[354],"allowed_groups"," frissítése metaadat-írás, nem újraembeddelés. Sokkal gyakrabban futtasd, mint a tartalomindexelést, és riassz, ha az ",{"tag":259,"children":357},[278]," lemarad.",[360,363],{"tag":145,"children":361},[362],"A csoportokat lekérdezéskor oldd fel."," A csoportokat a chunkokon tárold, a felhasználó aktuális csoporttagságát pedig kérésenként az identitásszolgáltatótól kérd le, így egy csoportból való eltávolítás azonnal hat.",[365,368],{"tag":145,"children":366},[367],"A magas kockázatú forrásokat élőben ellenőrizd újra."," HR-, jogi vagy igazgatósági anyagoknál a végső jelöltekre adj hozzá utószűrést a forrásrendszer vagy egy engedélyezési szolgáltatás felé, és csak ezeknél a gyűjteményeknél fogadd el a többletkésleltetést.",{"type":135,"level":136,"id":118,"text":119},{"type":128,"content":371},[372,373,377],"Minden, amit dokumentumokból számolunk, örökli azok érzékenységét. Egy szemantikus gyorsítótár kulcsának tartalmaznia kell a felhasználó jogosultsághalmazát, különben az egyik felhasználó válasza egy másikhoz kerül; a hatókör kezelését a ",{"tag":173,"to":374,"children":375},"\u002Fblog\u002Fsemantic-caching-llm-responses",[376],"szemantikus gyorsítótárazás"," cikkben írtam le. A beszélgetési memória egyetlen felhasználóé. A több dokumentumból generált összefoglalók, entitásleírások és chunkkontextusok a csoportjaik metszetét kapják.",{"type":128,"content":379},[380],"Az embeddingek sem névtelenek. Morris és társai 2023-ban megmutatták, hogy egy iteratív inverziós módszer a 32 tokenes bemenetek 92%-át pontosan visszaállította az embeddingjeikből, klinikai jegyzetekből pedig teljes neveket nyert vissza. A vektortároló kapja meg ugyanazt a hálózati elszigetelést, titkosítást és hozzáférés-naplózást, mint a forrásdokumentumok, és vond be a törlési kérelmekbe is.",{"type":135,"level":136,"id":121,"text":122},{"type":128,"content":383},[384],"A visszakeresési réteget teszteld, ne a válaszokat. A modell megtagadhatja egy kapott chunk idézését, ezzel elfedve a hibát. Helyezz el egyedi jelölőszöveggel ellátott kanári-dokumentumokat, mindegyiket pontosan egy csoport számára láthatóan, és a visszakeresett chunkazonosítókra írj ellenőrzést:",{"type":259,"code":386},"import pytest\n\nPERSONAS = {\"sales\": [\"grp-sales\"], \"hr\": [\"grp-hr\"], \"none\": []}\nCANARIES = {\"canary-hr\": \"grp-hr\", \"canary-sales\": \"grp-sales\"}\nQUERIES = [\"salary bands\", \"canary report\", \"confidential\", \"*\"]\n\n@pytest.mark.parametrize(\"persona,groups\", PERSONAS.items())\n@pytest.mark.parametrize(\"query\", QUERIES)\ndef test_no_canary_leaks(persona, groups, query):\n    hits = retrieve(query, tenant=\"acme\", groups=groups, k=50)\n    for doc_id, owner_group in CANARIES.items():\n        if owner_group not in groups:\n            assert all(h.doc_id != doc_id for h in hits), (persona, query, doc_id)\n\ndef test_missing_groups_fail_closed():\n    with pytest.raises(PermissionError):\n        retrieve(\"anything\", tenant=\"acme\", groups=None, k=10)",{"type":128,"content":388},[389,390,394],"Adj hozzá még két ellenőrzést: a visszavonási késleltetést, amikor egy tesztfelhasználót eltávolítasz egy csoportból, és méred, mennyi idő alatt tűnik el a kanári, valamint a bérlői elszigetelést, amikor az A bérlő érvényes tokenjével a B bérlő névterére kérdezel. Futtasd a tesztkészletet CI-ban és a szinkronfeladat minden módosítása után. A hozzáférés-kezelés a ",{"tag":173,"to":391,"children":392},"\u002Fblog\u002Frag-poisoning-knowledge-base-attacks",[393],"RAG-mérgezés"," elleni védekezés mellé tartozik: mindkettő a tudásbázist védi, az egyik az olvasás, a másik az írás ellen.",{"type":135,"level":136,"id":124,"text":125},{"type":141,"ordered":345,"items":397},[398,402,405,408,411,414,417,420],[399],{"tag":400,"href":40,"children":401},"a",[39],[403],{"tag":400,"href":43,"children":404},[42],[406],{"tag":400,"href":46,"children":407},[45],[409],{"tag":400,"href":49,"children":410},[48],[412],{"tag":400,"href":52,"children":413},[51],[415],{"tag":400,"href":55,"children":416},[54],[418],{"tag":400,"href":58,"children":419},[57],[421],{"tag":400,"href":61,"children":422},[60],[424,496,554,607],{"slug":425,"published":5,"minutes":6,"category":7,"tags":426,"keywords":430,"about":443,"sources":453,"cover":490,"og":491,"expertise":64,"locales":492,"lang":68,"title":493,"description":494,"coverAlt":495},"embedding-model-selection-2026",[427,9,428,13,429],"Embeddings","MTEB","Model selection",[431,432,433,434,435,436,437,438,439,440,441,442],"best embedding model 2026","how to choose an embedding model","embedding model comparison","MTEB leaderboard explained","RTEB benchmark","open source embedding model","multilingual embedding model","voyage-4 vs openai embeddings","Qwen3-Embedding","EmbeddingGemma","embedding model for RAG","switching embedding models re-embed",[444,447,450],{"name":445,"url":446},"Word embedding","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWord_embedding",{"name":448,"url":449},"Information retrieval","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FInformation_retrieval",{"name":451,"url":452},"Discounted cumulative gain","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FDiscounted_cumulative_gain",[454,457,460,463,466,469,472,475,478,481,484,487],{"title":455,"url":456},"Enevoldsen et al.: MMTEB, Massive Multilingual Text Embedding Benchmark (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2502.13595",{"title":458,"url":459},"Hugging Face: Introducing RTEB, a new standard for retrieval evaluation (Oct 2025)","https:\u002F\u002Fhuggingface.co\u002Fblog\u002Frteb",{"title":461,"url":462},"OpenAI: Vector embeddings guide","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Fembeddings",{"title":464,"url":465},"OpenAI: API pricing","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fpricing",{"title":467,"url":468},"Voyage AI: The Voyage 4 model family, shared embedding space with MoE architecture (Jan 2026)","https:\u002F\u002Fblog.voyageai.com\u002F2026\u002F01\u002F15\u002Fvoyage-4\u002F",{"title":470,"url":471},"Voyage AI: Text embeddings documentation","https:\u002F\u002Fdocs.voyageai.com\u002Fdocs\u002Fembeddings",{"title":473,"url":474},"Voyage AI: Pricing","https:\u002F\u002Fdocs.voyageai.com\u002Fdocs\u002Fpricing",{"title":476,"url":477},"Google: Gemini API embeddings documentation","https:\u002F\u002Fai.google.dev\u002Fgemini-api\u002Fdocs\u002Fembeddings",{"title":479,"url":480},"Google: Gemini API pricing","https:\u002F\u002Fai.google.dev\u002Fgemini-api\u002Fdocs\u002Fpricing",{"title":482,"url":483},"Cohere: Embed models documentation","https:\u002F\u002Fdocs.cohere.com\u002Fdocs\u002Fcohere-embed",{"title":485,"url":486},"Qwen: Qwen3-Embedding-8B model card","https:\u002F\u002Fhuggingface.co\u002FQwen\u002FQwen3-Embedding-8B",{"title":488,"url":489},"Google Developers Blog: Introducing EmbeddingGemma (Sep 2025)","https:\u002F\u002Fdevelopers.googleblog.com\u002Fen\u002Fintroducing-embeddinggemma\u002F","\u002Fimages\u002Fblog\u002Fembedding-model-selection-2026\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fembedding-model-selection-2026\u002Fog.jpg",[66,67,68],"Embedding-modell választása 2026-ban: ranglisták, költségek és összehasonlító teszt a saját adatokon","Hogyan válassz embedding-modellt RAG-hoz 2026-ban: mit mond az MTEB és az RTEB, API vagy nyílt súlyok, árak, dimenziók és egy egyhetes összehasonlító teszt.","Három oszlop egymásra rakott kockákból, középen a legmagasabb, mindegyik rövid sávval mérve.",{"slug":497,"published":5,"minutes":498,"category":7,"tags":499,"keywords":503,"about":515,"sources":523,"cover":548,"og":549,"expertise":64,"locales":550,"lang":68,"title":551,"description":552,"coverAlt":553},"contextual-retrieval-late-chunking",10,[9,500,427,501,502],"Chunking","Contextual retrieval","Late chunking",[504,505,506,507,508,509,510,511,512,513,514],"contextual retrieval","anthropic contextual retrieval","late chunking","contextual chunk embeddings","contextual embeddings rag","contextual bm25","chunk context rag","voyage-context-3","voyage-context-4","late chunking vs contextual retrieval","rag chunking context loss",[516,517,520],{"name":35,"url":36},{"name":518,"url":519},"Okapi BM25","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOkapi_BM25",{"name":521,"url":522},"Sentence embedding","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSentence_embedding",[524,527,530,533,536,539,542,545],{"title":525,"url":526},"Anthropic: Introducing Contextual Retrieval (Sep 2024)","https:\u002F\u002Fwww.anthropic.com\u002Fnews\u002Fcontextual-retrieval",{"title":528,"url":529},"Günther et al.: Late Chunking, Contextual Chunk Embeddings Using Long-Context Embedding Models (2024, rev. 2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2409.04701",{"title":531,"url":532},"Jina AI: Late Chunking in Long-Context Embedding Models (Aug 2024)","https:\u002F\u002Fjina.ai\u002Fnews\u002Flate-chunking-in-long-context-embedding-models\u002F",{"title":534,"url":535},"Voyage AI: Introducing voyage-context-3 (Jul 2025)","https:\u002F\u002Fblog.voyageai.com\u002F2025\u002F07\u002F23\u002Fvoyage-context-3\u002F",{"title":537,"url":538},"Voyage AI: voyage-context-4 (Jun 2026)","https:\u002F\u002Fblog.voyageai.com\u002F2026\u002F06\u002F29\u002Fvoyage-context-4\u002F",{"title":540,"url":541},"Voyage AI: Contextualized chunk embeddings documentation","https:\u002F\u002Fdocs.voyageai.com\u002Fdocs\u002Fcontextualized-chunk-embeddings",{"title":543,"url":544},"Anthropic: Claude API pricing","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fabout-claude\u002Fpricing",{"title":546,"url":547},"Qu, Tu and Bao: Is Semantic Chunking Worth the Computational Cost? (2024)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2410.13070","\u002Fimages\u002Fblog\u002Fcontextual-retrieval-late-chunking\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fcontextual-retrieval-late-chunking\u002Fog.jpg",[66,67,68],"Kontextuális visszakeresés és késleltetett chunkolás: a RAG-chunkok visszakapják a kontextusukat","A chunkok elveszítik a dokumentumukat. Hogyan javít ezen a contextual retrieval, a late chunking és a kontextusos embedding, mennyibe kerül, és mikor hagyd ki.","Négy szabad négyzet, alul széles kapocs fogja össze, mindegyik felfelé egy nagy laphoz kapcsolódik.",{"slug":555,"published":556,"minutes":6,"category":7,"tags":557,"keywords":562,"about":573,"sources":581,"cover":601,"og":602,"expertise":64,"locales":603,"lang":68,"title":604,"description":605,"coverAlt":606},"pdf-document-parsing-for-rag","2026-10-16",[9,558,559,560,561],"PDF parsing","OCR","Docling","Document AI",[563,564,565,566,567,568,569,570,571,572],"pdf parsing for rag","best pdf parser for rag","docling vs marker","marker vs mineru","pdf to markdown for llm","extract tables from pdf for rag","ocr for rag pipeline","olmocr bench","scanned pdf rag","document parsing llm",[574,577,580],{"name":575,"url":576},"PDF","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPDF",{"name":578,"url":579},"Optical character recognition","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOptical_character_recognition",{"name":35,"url":36},[582,585,588,591,594,597,600],{"title":583,"url":584},"Docling: README, features and license (GitHub)","https:\u002F\u002Fgithub.com\u002Fdocling-project\u002Fdocling",{"title":586,"url":587},"Auer et al.: Docling: An Efficient Open-Source Toolkit for AI-driven Document Conversion (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2501.17887",{"title":589,"url":590},"Datalab: Marker README, olmOCR-bench results and license (GitHub)","https:\u002F\u002Fgithub.com\u002Fdatalab-to\u002Fmarker",{"title":592,"url":593},"OpenDataLab: MinerU README and license (GitHub)","https:\u002F\u002Fgithub.com\u002Fopendatalab\u002FMinerU",{"title":595,"url":596},"Poznanski et al.: olmOCR: Unlocking Trillions of Tokens in PDFs with Vision Language Models (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2502.18443",{"title":598,"url":599},"Claude Platform Docs: PDF support","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fpdf-support",{"title":525,"url":526},"\u002Fimages\u002Fblog\u002Fpdf-document-parsing-for-rag\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fpdf-document-parsing-for-rag\u002Fog.jpg",[66,67,68],"PDF-feldolgozás RAG-hoz: layout-pipeline-ok, OCR és vizuális modellek összevetve","Miért a PDF-feldolgozáson múlik a RAG minősége, miben más a Docling, a Marker, a MinerU és a VLM-OCR, és hogyan teszteld a parsert saját dokumentumokon.","Rendezetlen blokkok egy lapon egyenletes sorrá válnak a második lapon.",{"slug":608,"published":556,"minutes":609,"category":7,"tags":610,"keywords":614,"about":624,"sources":634,"cover":655,"og":656,"expertise":64,"locales":657,"lang":68,"title":658,"description":659,"coverAlt":660},"multilingual-rag-german-hungarian",7,[9,611,427,612,613],"Multilingual","German","Hungarian",[615,616,617,618,437,619,620,621,622,623],"multilingual rag","german rag embeddings","hungarian nlp search","cross-lingual retrieval","bge-m3 german","german compound words search","hungarian stemming postgres","multilingual-e5-large-instruct","qwen3 embedding multilingual",[625,628,631],{"name":626,"url":627},"Cross-language information retrieval","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCross-language_information_retrieval",{"name":629,"url":630},"Agglutinative language","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAgglutinative_language",{"name":632,"url":633},"Compound (linguistics)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCompound_(linguistics)",[635,637,640,643,646,649,652],{"title":636,"url":456},"Enevoldsen et al.: MMTEB: Massive Multilingual Text Embedding Benchmark (2025)",{"title":638,"url":639},"Chen et al.: M3-Embedding (BGE-M3): Multi-Linguality, Multi-Functionality, Multi-Granularity (2024)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2402.03216",{"title":641,"url":642},"Zhang et al.: Qwen3 Embedding: Advancing Text Embedding and Reranking Through Foundation Models (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2506.05176",{"title":644,"url":645},"Hugging Face: intfloat\u002Fmultilingual-e5-large-instruct model card","https:\u002F\u002Fhuggingface.co\u002Fintfloat\u002Fmultilingual-e5-large-instruct",{"title":647,"url":648},"Elasticsearch Reference: Hyphenation decompounder token filter","https:\u002F\u002Fwww.elastic.co\u002Fdocs\u002Freference\u002Ftext-analysis\u002Fanalysis-hyp-decomp-tokenfilter",{"title":650,"url":651},"PostgreSQL 18 Documentation: Text search dictionaries","https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Ftextsearch-dictionaries.html",{"title":653,"url":654},"Snowball: stemming algorithms by language","https:\u002F\u002Fsnowballstem.org\u002Falgorithms\u002F","\u002Fimages\u002Fblog\u002Fmultilingual-rag-german-hungarian\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fmultilingual-rag-german-hungarian\u002Fog.jpg",[66,67,68],"Többnyelvű RAG német és magyar tartalomra: embeddingek, összetett szavak és nyelvek közötti keresés","RAG német és magyar tartalom fölött: többnyelvű embeddingek, összetett szavak, szótövezés, ékezetek és nyelvenkénti értékelés.","Két sor kis négyzet, mindegyik fölött pont, olvad össze egyetlen magas téglalappá.",1792222774323]