Kérdésgenerálás
Az automatikus tesztelés első alapvető kérdése, hogy mit tesztelünk. Nem szeretnénk folyamatosan manuális adathalmazokat írni, annotálni. Erre hivatott megoldást adni az automatikus kérdésgenerálás modul.
A „kérdésgenerálás“ alatt alapvetően a következő feladatot értjük:
Kérdésgenerálás
Adott: Egy \(T\) szöveg (dokumentum, chunk, stb…)
Feladat: Generáljunk egy értelmes, emberszerű \(q\) kérdést és \(a\) választ úgy, hogy a kérdés teljes mértékben megválaszolható \(T\) alapján, ugyanakkor hiánytalanul értelmezhető annak ismerete nélkül is.
A feladat egyszerű hangzása ellenére igen bonyolulttá tud fajulni. Az alábbi problémák merülhetnek fel például:
-
A megírt kérdésben használt fogalmak nem „abszolút“ fogalmak, azaz a szöveg ismerete nélkül félreérthető, hogy mire referálnak. (Pl. a „Mennyi a bankszámla éves díja?“ kérdés értelmetlen, hiszen csak \(T\) tartalmazná, hogy melyik számláról van egyáltalán szó).
-
A megírt kérdéshez nem csak \(T\)-ből szükséges információ. (Pl. kis kiegészítések bankszámlacsomagoknál, melyeket nem ismerünk, ha csak nem konkrétan azt a dokumentumot nézzük.)
-
A megírt válasz feltételezéseket használ, melyek a szövegben nem szerepeltek.
-
\(T\) nem tartalmaz érdemi információt, amiből kérdést lehetne feltenni.
A többlépéses kérdésgenerálási folyamat során ezeket próbáljuk meg kezelni úgy, hogy a végén egy kielégítő adathalmazt kapjunk. A folyamat lépései a következők:
-
Generálunk egy \(q_0\) kérdést \(T\)-ből.
-
Átírjuk a kérdést, akár többször (\(q_1\), \(q_2, \dots\)) egyes hibák javítására koncentrálva. Az átírások végén megapjuk a végső \(q\) kérdést.
-
Leellenőrizzük, hogy \(q\)-ra adható-e teljeskörű válasz a szöveg alapján. Ha nem, megszakítjuk a folyamatot.
-
Megválaszoljuk a kérdést, ezzel megkapva \(a\)-t, majd visszaadjuk a \((q, a)\) párt.
Mik azok az átírások?
Az átírások tetszőlegesek lehetnek, vagy akár nem is kell megadni egyet se. Olyan korrekciókat érdemes megadni, melyekről tudjuk, hogy a \(q_0\) generálási folyamat gyengeségei. Például ha tudjuk, hogy a generált kérdés sokszor nem megfelelő nyelvtanilag, vagy valamilyen adott stílusba akarjuk kényszeríteni a választ, akkor azt meg lehet ilyen formában fogalmazni.
A lépések szabályozása
A (2) és (3) lépések kikapcsolhatók a megfelelő konfigurációs beállításokkal. A (2) lépéshez az LLM promptok a qa_properties.yml fájlban szabályozhatók a correction-steps segítségével.
Megjelenés a kódban
Alapvetően minden lépést LLM-mel végeztetünk. Emellett a kódban ez a folyamat lépésenként megjelenik a QAGenerator osztályban, azon belül is a _generate_qa_ methodon belül. Az (1) lépést az _extract_simple_questions, a (2)-t a _reformulate_question, a (3)-at az _is_quesiton_answerable, a (4)-et pedig az _answer_quesiton végzi.
A használt prompt-ok a qa_properties.yml fájlban találhatók.