Update Feldolgozás

2024-10-24 22:24:04 +02:00
parent 7a8f30c068
commit fc4b7bc2ec

@@ -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.
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