AI-chatbot-fejlesztés: hogyan csináltuk és mit tanultunk belőle?
IT megoldásokkal foglalkozó vállalatként fontos számunkra, hogy mindig lépést tartsunk a legújabb technológiákkal. Ezért tűztük ki célként, hogy egy olyan AI-chatbotot hozunk létre, amely nagy nyelvi modellekre (LLM) építve segíti a felhasználókat.
Ami a chatbot témáját illeti, a korábbi tapasztalatainkra építve a GDPR-rendeletet és az EU AI Act-et választottuk. A cél egy olyan rendszer létrehozása volt, amely képes értelmezni és megválaszolni az adatvédelmi jogszabályokkal kapcsolatos kérdéseket, kizárólag az általunk megadott tudásanyag alapján.

A projektet R&D-keretben indítottuk, kifejezetten kísérleti céllal — a hangsúly nem a kész terméken, hanem az úton volt: a tanuláson, tapasztalatszerzésen és a technológiai határok megismerésén.
A kezdeti cél és technológiai döntések
Az első célkitűzés egyszerű volt: „Válaszoljon a témában feltett kérdésre a megkapott tudásanyagokból.”
Korábbi projektjeink tapasztalataira építve hamar kialakult a technológiai stack:
- LLM: OpenAI modellek – kezdetben chatgpt-4o-mini, majd chatgpt-4.1-mini,
- Vektoralapú keresés: ChromaDB fájlrendszer-szintű tárolással,
- Beágyazás (embedding): text-embedding-3-large,
- Keretrendszer: LangChain és LangGraph,
- Backend: FastAPI (Python),
- Frontend: React + NextJS.
A kezdetektől az volt a cél, hogy ne nulláról építkezzünk, hanem meglévő komponensekre építve, kísérletezéssel és iterációval fejlesszünk.
Az első verzió – tesztelés új szemszögből
A chatbot első verziója a RAG-alapú keresésből nyert találatokat a felhasználói kérdéssel együtt továbbította az LLM-nek, egy rövid utasítással kiegészítve, hogy milyen választ várunk. A RAG lekérdezés során a teljes felhasználói üzenetet felhasználtuk, amiről később kiderült, hogy nem volt jó megoldás. Az üzenetek ellenőrzésére egy statikus ellenőrző motort építettünk, amely előre definiált kulcsszavas szótárra támaszkodott.
Az első tesztelői visszajelzések során világossá vált, hogy az első megoldás nem bizonyult megfelelőnek. A tesztelők olyan, egyébként jogos, követelményeket állítottak a chatbot elé, amikre az elején nem gondoltunk.
Új kihívást jelentett az is, hogy a tesztelők számára teljesen ismeretlen terep volt egy LLM-alapú chatbot tesztelése. Ezáltal olyan problémákkal szembesültünk fejlesztői oldalon is, amelyek megoldásához újfajta szemléletmódra volt szükség.
A tesztelői visszajelzéseket figyelembe véve új követelmények kerültek előtérbe:
- a chatbot emlékezzen a korábbi kérdésekre és válaszokra,
- kizárólag a megadott témán belül maradjon,
- ne hajtson végre parancsokat,
- ne legyen kikényszeríthető technikai információk kiadása,
- mindig udvarias és szakmai hangnemben kommunikáljon,
- tudja kezelni a hétköznapi társalgási fordulatokat (pl. köszönés, visszakérdezés, visszautalás),
- képes legyen több nyelven is válaszolni,
- releváns, a kontextusnak megfelelő válaszokat adjon,
- megfelelő legyen a chatbot válaszideje (maximum 15-20 másodperc),
- szükség esetén figyelmeztesse a felhasználót, hogy ne adjon meg személyes adatokat.
A tesztelők kreatív szövegekkel próbálták feltárni a chatbot határait, amelyekkel „átverhették” a chatbotot, figyelembe véve a beszélgetés teljes kontextusát. Ez a fajta tesztelés jelentősen eltért a hagyományos szoftvertesztelési módszertanoktól.
Fejlesztői kihívások
Az előző fejezetben bemutatott új követelmények teljesítése során hamar nyilvánvalóvá vált, hogy teljesen új megközelítést kell alkalmaznunk. A klasszikus módszerek – például a statikus ellenőrzés – nem működtek megbízhatóan, így olyan megoldásokat kellett használnunk, amelyek valóban illeszkednek egy LLM-alapú chatbot működéséhez.
Off-topic szűrés – system prompt bevezetése
A chatbotot úgy kellett irányítani, hogy csak a megadott témán belül válaszoljon.
Ezt egy system prompt definiálásával oldottuk meg, amely előre meghatározta, hogy miről beszélhet a modell, hogyan reagálhat különféle esetekre és mit kell elutasítania.
Ez a megoldás sokkal megbízhatóbbnak bizonyult, mint a korábbi kulcsszavas ellenőrzés.
Memóriakezelés – a kontextus megtartása
Az első verzió nem emlékezett a korábbi beszélgetésekre, így hiányzott a folytonosság.
A problémát LangChain memóriakomponensek (RunnableWithMessageHistory, InMemoryChatMessageHistory) használatával oldottuk meg, amelyek képesek megőrizni a párbeszéd történetét, és ezzel természetesebbé tették a kommunikációt.
Az eredmény jól érzékelhető volt, a chatbot képes volt a válaszadás során a beszélgetési előzményeket is felhasználni és ezzel javult a felhasználói élmény.
Társalgási képesség – agent-alapú megközelítés
A memória bevezetése után hamar kiderült, hogy ez önmagában nem elég. A chatbot nem tudta természetesen kezelni a hétköznapi társalgási helyzeteket, mint a visszakérdezés vagy a korábbi üzenetekre való hivatkozás.
A probléma megoldására a korábbi, manuálisan összeállított LLM-hívások helyett agent-alapú megközelítést alkalmaztunk, a LangChain tool_calling_agent komponens segítségével.
Ez a megoldás lehetővé tette, hogy a chatbot jobban értse a kontextust, felismerje a beszélgetés logikai kapcsolatait, és természetesebb módon reagáljon. A párbeszédek így életszerűbbé és folyamatosabbá váltak, viszont új biztonsági kockázatok is megjelentek. A chatbot bizonyos helyzetekben olyan információkat is kiadott, amelyeket nem kellett volna.
Ezt a problémát a system prompt finomhangolásával sikerült kezelni, de ezzel sem sikerült minden esetet lefedni.
Modellváltás – repromptolás
A projekt fejlődésével nőtt a chatbot által kezelt tudásbázis és a system prompt mérete is. A chatgpt-4o-mini modell már nem tudta megfelelő sebességgel és minőségben kiszolgálni az elvárásainkat emiatt LLM váltásra volt szükség.
Elsőként a chatgpt-5-mini modellt választottuk, de az OpenAI API-n keresztüli kommunikáció túl lassúnak bizonyult – a válaszidő gyakran meghaladta a 30 másodpercet.
Végül a chatgpt-4.1-mini modell bizonyult megfelelőnek ahhoz a feladathoz amire mi szerettük volna használni.
A váltás ugyanakkor komoly átdolgozást igényelt. Az addig használt promptokat teljes egészében újra kellett írni, mivel a különböző modellek eltérően reagáltak ugyanarra az utasításra. A promptok újra írása további tesztelést és prompt finomítási iterációkat hozott magával.
Parancsvégrehajtás kezelése
Ahogy a chatbot kommunikációja természetesebbé vált, a felhasználóknak különböző megfogalmazásokkal sikerült rávenniük parancsok végrehajtására, például receptek írására vagy promptok generálására.
Ezt egy ellenőrző tool bevezetésével oldottuk meg, amely felismeri a parancsvégrehajtásra utaló üzeneteket. A system prompt finomításával a chatbot már a RAG lekérdezés előtt kiszűri ezeket, és szükség esetén megtagadja a végrehajtást.
Ez a megoldás nagymértékben növelte a rendszer biztonságát, és megakadályozta, hogy a chatbotot nem kívánt műveletek végrehajtására is használni lehessen.
Személyes adatokra való figyelmeztetés
Szerettük volna, hogy a chatbot felismerje, ha a felhasználó személyes adatot ad meg, és ilyen esetben figyelmeztesse őt, hogy kerülje ezeknek a megadását.
A legjobb eredményt úgy értük el, hogy az agent elé beillesztettünk egy külön feldolgozási lépést, amely egy önálló LLM hívás és dedikált prompt segítségével automatikusan eltávolította a személyes adatokat a felhasználói üzenetből.
Ennek köszönhetően az agent két információval dolgozott, egyrészt tudta, hogy az eredeti üzenet tartalmazott-e személyes adatot, másrészt a megtisztított üzenetet kapta meg így a válaszban nem tudta visszaadni az eredeti üzenetben szereplő személyes adatokat.
AI-chatbot-fejlesztés kipipálva: az elkészült megoldás
A projekt végére egy stabil, biztonságos és felhasználóbarát chatbot készült, amely LLM- és RAG-alapú megközelítést alkalmaz.
A fejlesztés során több optimalizálási lépés is történt. A memóriakezelés terén a RunnableWithMessageHistory megoldást lecseréltük a LangChain AgentExecutor beépített funkciójával, kiegészítve egy saját, session-alapú memóriakezeléssel. A RAG-paraméterek finomhangolása, valamint több embedding modell tesztelése után sikerült javítani mind a válaszidőt, mind a találatok pontosságát.
Az elkészült chatbot képes kontextusfüggő és többnyelvű válaszadásra, biztonsági figyelmeztetések megfogalmazására, valamint természetes, emberközeli társalgás folytatására.
Mit tanultunk a projektből?
A fejlesztési folyamat nem csupán technológiai, hanem szemléletbeli tanulási élmény is volt. A csapat megtanulta, hogyan működnek a gyakorlatban az LLM-alapú rendszerek, és milyen egyedi kihívásokkal jár a fejlesztésük. A tesztelés során világossá vált, hogy az ilyen rendszerek értékelése eltér a hagyományos szoftverteszteléstől. A chatbot viselkedése kontextusfüggő, ezért a tesztelésnek is dinamikusnak, kreatívnak és adaptívnak kell lennie.
Kiemelt szerepe volt a „kreatív tesztelésnek” és a modell tudatos „átverésére” irányuló próbálkozások segítettek feltárni a rendszer gyenge pontjait.
Fejlesztői szempontból a legfontosabb tanulság az volt, hogy egy LLM-alapú rendszer sikerét az architektúra határozza meg. A komponensek – mint a prompt-kezelés, a RAG, az agent-mechanizmus vagy a memória – pontos ismerete és tudatos kombinálása elengedhetetlen egy stabil és bővíthető rendszer létrehozásához.
Összességében a projekt bebizonyította, hogy a mesterséges intelligencia és a nagy nyelvi modellek valódi kihívása nem magában a modellben rejlik, hanem abban, hogyan építjük köré a rendszert.
Az Ön cégénél is hasznos lehet egy AI-alapú chatbot? Miért ne beszélgessünk erről egy kávé mellett?

