Hogyan tanítsuk könyvtárunk csetbotját a település történetére - bevezetés

A mesterséges intelligencia és gépi tanulás területe rohamos fejlődésen megy keresztül, egyre több intézmény és szervezet használja ezeket a technológiákat különböző projektekben. Ebben a blogposztban bemutatjuk, hogyan tanítsuk könyvtárunk csetbotját a település történetére, A posztban a GPT Neo nevű modellt használom és bemutatom a fontosabb kódrészleteket.

1. A neurális hálózatok és a GPT Neo modell

A GPT Neo egy mély neurális hálózaton alapuló modell, amely a természetes nyelvfeldolgozás területén alkalmazott egyik legkorszerűbb technológia. Ahhoz, hogy megértsük ennek a modellnek a működését, először ismernünk kell néhány kulcsfontosságú fogalmat:

Neuronok: Ezek az alapvető egységek a neurális hálózatban, a neuronok olyan matematikai függvények, amelyek veszik a bemeneti adatokat, ezeket feldolgozzák és továbbítják a hálózatban.

Súlyok (Weights): A súlyok a neuronok kapcsolatait jelentik. Ezek a számértékek határozzák meg, hogy mennyire fontos egy adott bemeneti információ egy neurón számára. Gyakorlatilag a súlyok olyan mátrixok, amelyek meghatározzák, milyen mértékben befolyásolják az egyik neuron kimeneti értékét a bemenetek.

Biasok (Biases): Ezek olyan vektorok, amelyek segítenek eltolni a neuron aktiválási függvényét. A biasok segítenek a neurális hálózatnak abban, hogy alkalmazkodjon a különböző típusú bemenetekhez és tanuljon azoktól. Ha nem lennének biasok, a hálózat sokkal kevésbé lenne alkalmazkodóképes és hatékony a tanulás során.

Aktiváló függvények: Ezek a függvények döntik el, hogy egy neurón mennyire aktiválódik az adott bemenetek alapján. A leggyakrabban használt aktiváló függvények közé tartozik az “Sigmoid”, a “ReLU” (Rectified Linear Unit) és a “Tanh”. Például a ReLU, a következő módon számolja ki az aktiválódás mértékét:

Ha a bemenet nagyobb vagy egyenlő 0-val, akkor az aktiválódás mértéke megegyezik a bemenettel (y = x). Ha a bemenet kisebb, mint 0, akkor az aktiválódás mértéke 0 (y = 0). Ez azt jelenti, hogy a neuronok csak pozitív bemenetekre válaszolnak, míg a negatív bemenetekre nem válaszolnak (azaz nem aktiválódnak).

A GPT Neo modell rendkívül mély hálózatokból áll, és körülbelül három milliárd paramétert tartalmaz, ennek ellenére egy átlagos irodai gépen is képes - ha lassan is ugyan, de - működni.

2. A tanítási folyamat és a paraméterek szerepe

Térjünk át a tanítási folyamatra és a modell paramétereinek szerepére. A csetbotunk tanításához szükségünk van megfelelő adatkészletre és egy jól strukturált tanítási folyamatra.

2.1. Adatkészlet összeállítása

Az első lépés az adatkészlet elkészítése. A GPT Neo modell megértéséhez és válaszadásához szükségünk van olyan adatokra, amelyek a település történetét, eseményeit és fontos információit tartalmazzák. Az adatok lehetnek szöveges dokumentumok, cikkek, könyvek vagy bármilyen olyan forrás, amely releváns információkat tartalmaz. Fontos, hogy az adatkészlet információk sokaságát tartalmazza, hogy a csetbotunk minél gazdagabb tudással rendelkezzen.

2.2. Adatkészlet struktúrája

Az adatkészletet jól strukturáltan kell összeállítani. A dokumentumokat vagy cikkeket címsorokra, bekezdésekre és mondatokra kell bontani, hogy a modell könnyebben tanuljon belőlük. Ezenkívül fontos, hogy az adatokhoz tartozzon cím, tartalom, és időbélyeg, ha lehetséges, hogy a modell tudja, mikor történtek az események. Az adatok strukturált felépítése segít a modellnek abban, hogy könnyebben navigáljon és megtalálja a releváns információkat a válaszok generálásához.

2.3. Kontextus, kérdés és válasz

A csetbotot úgy tanítjuk, hogy a felhasználókkal interaktív módon tudjon kommunikálni. Ehhez a tanítási adatkészletnek tartalmaznia kell kontextust, kérdéseket és válaszokat. Például:

Kontextus: “Budapest története a 19. században.”

Kérdés: “Mik voltak Budapest főbb eseményei a 19. században?”

Válasz: “A 19. században Budapest gyors fejlődésen ment keresztül, a forradalmak és változások idején.”

Ez a struktúra lehetővé teszi a csetbot számára, hogy a felhasználók által megadott kontextusra válaszoljon releváns információk alapján.

Nézzünk egy konkrét példát egy ilyen fájl tartalmaára, json formátumban:

{
    "context": "Az igazi fejlődés azonban csak a 19. század első felében, a reformkor idején indult meg, amikor Pest az ország kulturális és gazdasági központja lett. A korszak jelképeként megépült a két várost összekötő Széchenyi lánchíd. Az 1848. március 15-i pesti forradalom a magyar történelem egyik fő eseménye volt, ez a nap ma nemzeti ünnep. Az 1848-as forradalmi események során Pest-Buda az ország fővárosa lett, majd harcok után osztrák kézre került. A magyar honvédsereg Buda 1849-es bevételével a szabadságharc egyik legnagyobb katonai sikerét érte el. A szabadságharc bukását követő osztrák elnyomás egy időre megakasztotta a fejlődést, az 1867-es kiegyezést követően azonban világvárosi növekedés kezdődött. A vezetők 1872 decemberében fogadták el Pest, Buda és Óbuda egyesítését, majd a mai Budapest 1873 őszén jött létre. A főváros napját az egyesítés emlékére november 17-én ünnepelik, ugyanis 1873-ban ezen a napon ült össze az egyesített város tanácsa átvéve az elődvárosok tanácsától az ügyek intézését (ez azonban csak egy volt az egyesítéshez kapcsolódó átszervezés eseményei közül, az önkormányzati választást már szeptemberben megtartották, a főpolgármestert és a polgármestert pedig októberben megválasztották). Budapest Európa leggyorsabban növekvő városa lett, a lakosság húsz év alatt megduplázódva a századfordulóra közel háromnegyedmilliósra duzzadt. Ekkor alakult ki a mai város képe, a hidakkal, körutakkal, modern közlekedési hálózattal, Európa első Nagy-Britannián kívüli földalatti vasútjával, a belső és külső kerületekkel, az Országházzal és a többi országos középülettel. Világhírűek lettek Budapest színházai, kávéházai, gyógyfürdői, a pezsgő kulturális élet, és a híres „pesti éjszaka”. A fejlődés jelképeként tartották meg 1896-ban a millenáris kiállítást és ünnepségeket.",
    "qa_pairs": [
        {
            "question": "Mi volt a reformkor jelentősége Budapest történetében?",
            "answer": "A reformkor idején Pest az ország kulturális és gazdasági központja lett, és a Széchenyi lánchíd is ebben az időszakban épült meg, mint a korszak jelképe."
        },
        {
            "question": "Milyen híd épült a reformkor idején?",
            "answer": "A reformkorban épült meg a Széchenyi lánchíd, amely Budapest két részét, Pestet és Budát kötötte össze."
        },
        {
            "question": "Mikor indult meg az igazi fejlődés Budapest történetében?",
            "answer": "Az igazi fejlődés a 19. század első felében, a reformkor idején indult meg, amikor Pest a kulturális és gazdasági központtá vált."
        },
        {
            "question": "Mi volt az 1848-as forradalom szerepe Pest-Budán?",
            "answer": "Az 1848. március 15-i pesti forradalom során Pest-Buda az ország fővárosává vált, majd harcok után osztrák kézre került."
        },
        {
            "question": "Milyen események vezettek Budapest egyesítéséhez?",
            "answer": "Az 1872 decemberében elfogadott egyesítési törvény vezetett Budapest egyesítéséhez, majd 1873-ban hozták létre a mai Budapestet."
        }
    ]
}

A formátum lehet xls, de akár egyszerű txt.

2.4. Epochok és visszafelé terjesztés

Az epochok a tanítási fázisokat jelentik. Meg kell határoznunk, hogy hányszor fusson át az adatkészlet a modellen a tanítása folyamat során. Ha túl kevés az epizódok száma, az alultanulást eredményez, míg a túl sok epoch overfittinghez vezethet. Fontos az optimális szám megtalálása kísérletezéssel és validációs tesztekkel.

A visszafelé terjesztés (backpropagation) egy olyan folyamat, amely során a modell becsléseihez képest a hibákat visszaterjesztik a hálózatban, és a súlyokat frissítik a hibák minimalizálása érdekében. Ezt a folyamatot iteratívan hajtjuk végre a tanítási folyamat során. Röviden: nem megfelelő válasz esetén az algoritmus visszafelé halad és állítja be a változók értékeit.

Egy ilyen finomhangolt a modell több milliárd paraméterrel rendelkezik, amelyek a súlyok, biasok és aktiváló függvények által definiált működést irányítják. Ezek a paraméterek lehetővé teszik a modellnek, hogy a bemenetek alapján releváns válaszokat generáljon, és egyre optimálisabban tanuljon a finr-tuning során.

3 A tanított modell finomhangolása és optimalizálása

A tanított modell finomhangolása és optimalizálása kulcsfontosságú lépés ahhoz, hogy a csetbotunk minél pontosabban és kreatívabban válaszoljon a felhasználók kérdéseire. Néhány fontos tényezőt mutatok be, amelyek segítenek abban, hogy a modell jobban működjön:

3.1. Kreativitás és hőmérséklet

A GPT Neo alapú modell rendkívül kreatív lehet, de néha túlságosan is az tud lenni és irreleváns válaszokat generálhat. Ezt szabályozni lehet a temperature vagy hőmérséklet beállításávcal. A magas hőmérséklet nagyobb kreativitást eredményez, míg az alacsony hőmérsékletű válaszok inkább “merevebbek” lesznek. A temperature beállítás segítségével szabályozhatjuk a válaszok stílusát és kreativitását, hogy az illeszkedjen a kontextushoz.

3.2. Optimalizált értékek

Az epoch szám és a batch size értékek optimalizálása is kulcsfontosságú a modell hatékony működéséhez. Az epochok számának és a batch size-nak a kísérletezéssel kell megtalálni az optimális kombinációt. Az epochok számának növelése hozzájárulhat a modell jobb teljesítményéhez, míg a batch size szabályozása befolyásolhatja a tanítási sebességet és a memóriaigényt.

3.3. Informatív visszacsatolás és felügyelet

Az emberi felügyelet és pozitív visszacsatolás fontos a tanított modell fejlesztésében. Az elvárásainknak megfelelő kérdés-válasz példák segítik a modell további képzését. A felügyelet a helyes válaszok és a történeti információk mellett segíthet abban, hogy a modell ne adjon helytelen vagy irreleváns válaszokat.

3.4. Adatfrissítés és finomhangolás

Fontos időről időre frissíteni az adatkészletet és finomhangolni a modellt a legfrissebb információk és elvárások szerint. Az adatok frissítése segíthet a csetbotnak, hogy naprakész tudással rendelkezzen. A finomhangolás során az új adatokat az eredeti tanítási adatokhoz hozzá lehet adni, hogy a modell tovább javuljon a válaszok generálásában.

4. A GPT Neo 3b modell használata

4.1. Könyvtárak és csomagok importálása

A GPT Neo 3b modell használatához először is importálnunk kell a megfelelő könyvtárakat és csomagokat a Python környezetünkbe. A GPT Neo-t a Hugging Face Transformers könyvtárból használhatjuk, amelyet előzetesen telepítenünk kell.

# Importáljuk a szükséges könyvtárakat és csomagokat
from transformers import GPTNeoForCausalLM, GPT2Tokenizer
import torch

4.2. Modell inicializálása és tokenizer beállítása

Miután az importálás megtörtént, inicializálnunk kell a GPT Neo modellt és a hozzá tartozó tokenezőt. A tokenizer segít az input szöveg előkészítésében és tokenekre bontásában.

# Inicializáljuk a GPT Neo modellt és a tokenizer-t
model = GPTNeoForCausalLM.from_pretrained("EleutherAI/gpt-neo-3.3B")
tokenizer = GPT2Tokenizer.from_pretrained("EleutherAI/gpt-neo-3.3B")

4.4. Tanítási algoritmus és adatok beolvasása

A GPT Neo modell tanításához először be kell olvasni a megfelelő adatkészletet és inicializálni a tanítási paramétereket. Az alábbiakban bemutatjuk egy egyszerű példát, hogyan tehetjük ezt meg.

# Importáljuk a szükséges könyvtárakat és modulokat
import torch
from transformers import GPTNeoForCausalLM, GPT2Tokenizer, TextDataset, DataCollatorForLanguageModeling, Trainer, TrainingArguments

# Definiáljuk az adatfájlt
training_file = "telepules_tortenet.json"

# Inicializáljuk a GPT Neo modellt és a tokenizer-t
model = GPTNeoForCausalLM.from_pretrained("EleutherAI/gpt-neo-3.3B")
tokenizer = GPT2Tokenizer.from_pretrained("EleutherAI/gpt-neo-3.3B")

# Betöltjük az adatkészletet és előkészítjük a tanításhoz
dataset = TextDataset(tokenizer=tokenizer, file_path=training_file, block_size=128)
data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)

# Inicializáljuk a tanítási argumentumokat és a Trainer-t
training_args = TrainingArguments(
    per_device_train_batch_size=4,
    num_train_epochs=3,
    output_dir="./telepules_tortenet_model",
    overwrite_output_dir=True,
)
trainer = Trainer(
    model=model,
    args=training_args,
    data_collator=data_collator,
    train_dataset=dataset,
)

# Kezdjük el a tanítást
trainer.train()

# Mentjük a tanított modellt
model.save_pretrained("./telepules_tortenet_model")
tokenizer.save_pretrained("./telepules_tortenet_model")

4.5. Input szöveg előkészítése és generálása

Most már készen állunk arra, hogy generáljuk a csetbot válaszait a modell segítségével. Az input szöveget először tokenekké kell alakítani, majd generálni a modell segítségével.

# Előkészítjük az input szöveget és tokenekké alakítjuk
input_text = "Mik voltak Budapest főbb eseményei a 19. században?"
input_tokens = tokenizer(input_text, return_tensors="pt", padding=True, truncation=True)

# Generáljuk a választ a modell segítségével
output = model.generate(input_tokens["input_ids"])

4.6. Válasz megjelenítése

A generált válaszokat tokenekként kapjuk meg, amelyeket vissza kell alakítani olvasható szöveggé.

# Alakítsuk vissza a választ olvasható szöveggé
response_text = tokenizer.decode(output[0], skip_special_tokens=True)
print("Csetbot válasza: ", response_text)