From fc4b7bc2ecc4bca3fb491d285667eaa5690d152a Mon Sep 17 00:00:00 2001 From: midnight Date: Thu, 24 Oct 2024 22:24:04 +0200 Subject: [PATCH] =?UTF-8?q?Update=20Feldolgoz=C3=A1s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Feldolgoz%C3%A1s.md | 103 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 102 insertions(+), 1 deletion(-) diff --git a/Feldolgoz%C3%A1s.md b/Feldolgoz%C3%A1s.md index 5b56fab..93fa792 100644 --- a/Feldolgoz%C3%A1s.md +++ b/Feldolgoz%C3%A1s.md @@ -43,4 +43,105 @@ A content pedig minden olyan tartalom ami a keresések megválaszolásához szü A chunkok ebből a fa szerkezetből épülnek fel, ahogy bejárjuk a fát minden context-et összefűzünk egészen addig amíg nem érkezünk egy olyan levélhez ami content-et tartalmaz. Ezáltal a végén kapunk egy olyan egybefüggő szöveget amiben szerkezet szerint a kontextus-ban szerepel minden content-ig vezető információ, és a contentben összefűzve az kereshető rész áll elő. A legvégén pedig eltávolítunk minden HMTL/XML elemet a szövegből. -A `jhId` (NJT-n való anchor linkek előállításához szükséges) hozzárendelése a chunkokhoz egyszerűen a fában való felfele kereséssel lett megoldva, így a chunkhoz legközelebbi `jhId`-t tudjuk meghatározni. \ No newline at end of file +A `jhId` (NJT-n való anchor linkek előállításához szükséges) hozzárendelése a chunkokhoz egyszerűen a fában való felfele kereséssel lett megoldva, így a chunkhoz legközelebbi `jhId`-t tudjuk meghatározni. + + +## Keresési találatok szövegkiemelése + +A beérkező kérést feldaraboljuk szavakra és eltávolítunk belőle minden nem a magyar ABC-ben szereplő karaktert. +Ezeknek a szavaknak megkeressük a szótöveit a Hunspell nevű könyvtárral, majd ezeknek az összegyűjtött szavaknak és szótöveknek megkeressük a szinonímáit egy Thesaurus nevű könyvtárral és ezeket is belerakjuk a lehetséges kiemelendő szavak közé. + +A kiemelt szavakat szűrjük egy előre megírt listával ami tartalmazza a kötőszavakat/kérdőszavakat és egyéb szavakat amit nem szeretnénk semmilyen formában látni a kiemelés során. + +A folyamat végén pedig megkeressük a szavakat a keresési eredmények között és a szövegben megtalált szavakat kiegészítjük hogy teljes szavakat emeljük ki. (pl adat -> adatok, adatai) + + +## Metadatás keresés évszámos és sorszámos keresések + +A keresés több stratégiával is működik, ha a beérkező kérést felismerjük valamilyen minta szerint akkor tudunk a törvények meta-adatai között is keresni. +Jelenleg az alábbi stratégiák támogatottak. + +#### Évszámos és Sorszámos keresés +Évszámot és sorszámot is akkor tudunk így is keresni különböző formátumokban. +- A következő formátumok támogatottak: + - `2016. évi XXXIII. törvény` + - `2016 / 33` + - `2016. 33.` + - `2016. XXXIII.` + - `2016 33` + - a fentieknek akár fordított formában is, pl: `33 2016.` + +Ha nem sikerül jól beazonosítani hogy melyik rész az évszám vagy a sorszám, akkor mindkét verzióban megpróbáljuk. + +#### Évszámos keresés +Ha évszámot adunk meg akkor a jogszabályok évszámában keresünk. + +#### Sorszámos keresés +Ha számot vagy római számot kapunk, akkor a jogszabályok sorszámaiban keresünk. + + +## Keresési kifejezés/kérdés kiegészítése + +Lehetőségünk van arra hogy mielőtt a beérkező keresést módosítsuk a jobb találtok érdekében, ez a beérkező kérés elején egy előre meghatározott gyűjteményből tudunk szöveget kicserélni. Így képesek vagyunk olyan kereséseket is finomhangolni ami nem feltétlenül szerepel a jogszabályban és nehezen lenne kereshető. (pl: Mi a chipsadó? -> Mi a Népegészségügyi termékadó?) + +Továbbá a chunk építés során gyűjtünk egy listát ami alias-okat tartalmaz, ezt a "továbbiakban" különböző variációinak felismeréséből építjük fel. +(pl. NEBEK -> Nemzetközi Bűnügyi Együttműködési Központ) + + +# Vektor keresés +## Embedding Modellek + +- Llama 3.2 72B + - Backend: Ollama + - Tapasztalat: az egyes embeddingek vektorai túl hasonlóak, ezért nem alkalmasak keresésre +- gte-Qwen2-7B-instruct + - Backend: Ollama + - Tapasztalat: + Ez a modell specifikusan embedding célokra van tanítva, ezért a generált vektorok között nagyobb a távolság, jól kereshető. + A kisebb paraméterszám ellenére is jobb találatokat ad, mint a Llama3.2 modell. + Ezen felül sokkal gyorsabb a vektorok generálása, az előzetes embedding generálás és a felhasználó keresések során egyaránt. +- bge-multilingual-gemma2 + - Backend: egyedi (SentenceTransformer) + - Tapasztalat: + A Qwen embedding modellhez hasonlóan szintén jól összehasonlítható vektorokat generál. +- nv-embed-v2 + - backend: egyedi (SentenceTransformer) + - Tapasztalat: + - nem generál megfelelő vektorokat 16bit precízió mellett GPU-n, 32bites módban nincs elég VRAM + + +## Embedding Backendek + +- Ollama + - hivatalos Docker image + - CPU/GPU support + - GGUF formátum + - egyedi modellarchitektúrák konvertálása alkalom adtán nehézkes lehet (gemma, nv-embed) +- egyedi (SentenceTransformer) + - python alapú szerver, docker konténerben + - egyszerű REST API + - CPU/GPU support + - HF/Transformers modell formátum, a legtöbb modell alapra ebben készül +- Spring ONNX integráció + - alkalmazásszerverbe épül be + - CPU/GPU support + - ONNX formátum szükséges, csak támogatott architektúrákkal megy + +## Reranking + +- [reranking service] + +## Vektoros keresés + +- Qdrant + - nagyobb méretű vektorok támogatása +- hivatalos Docker image + +# Válaszgenerálás +- OpenAI API GPT4-en keresztül generált +- prompt: + - instrukciók + - relevánsnak ítélt kontextus + - user query +- Az első két találat chunkjait (és a hozzájuk tartozó contextet) tartalmazza a kérés kontextje +- A kérés REST API-n történik, a válasz egyben meg van várva, nincsen streamelve \ No newline at end of file