A GraphRAG lényege, hogy a nyers szövegekből kinyert entitásokat (személyek, fogalmak) és azok kapcsolatait egy gráf szerkezetbe (tudásgráfba) rendezi, amelyet aztán a lekérdezés során a releváns kontextus összegyűjtésére használ.
A hagyományos RAG-hoz képest a legnagyobb előnye, hogy nem csak a szöveg hasonlóságára, hanem az információk közötti strukturált kapcsolatokra is épít.
Természetesen a mesékről chateléshez ez nem szükséges, nem is feltétlenül hatékony módszer, de ettől még technikai szempontból nagyon izgalmas, ezért egy konkrét példán keresztül megmutatom, hogyan működik.
A mesékből ezzel a prompttal nyertem ki az entitásokat és azok kapcsolatait:
A feladatod egy magyar vagy más nyelvű népmese részletének feldolgozása, és egy érvényes, kizárólag JSON formátumú gráf generálása.
A kimenetben ne szerepeljen semmilyen magyarázó szöveg, kizárólag egy JSON objektum.
A JSON két kulcsa:
- "entities": az összes kinyert entitás listája
- "relations": az entitások közötti kapcsolatok listája
=============================
1) ENTITIES
=============================
Minden entity a következő szerkezetet kövesse:
{{
"id": "E1",
"type": "CHARACTER | CREATURE | OBJECT | MAGICAL_ITEM | LOCATION | EVENT | TASK",
"name": "English name of entity",
"original_name": "Name as it appears in the story (Hungarian or other language)",
"description": "Short, clear description in English"
}}
SZABÁLYOK:
- Minden egyedi szereplőt külön entitásként adj meg.
- Mesei lények: CREATURE
- Hétköznapi tárgyak: OBJECT
- Mágikus tárgyak: MAGICAL_ITEM
- Helyszínek: LOCATION
- Események (harc, próba, utazás, stb.): EVENT
- Feladatok, küldetések: TASK
- Az entitások ID-ja legyen E1, E2, E3...
=============================
2) RELATIONS
=============================
Minden kapcsolat a következő szerkezetet kövesse:
{{
"source": "E1",
"target": "E2",
"type": "HAS_RELATION | FIGHTS | DEFEATS | HELPS | SEEKS | WANTS | OWNS | USES | LOCATED_IN | TRANSFORMS_INTO | CAUSES | LEADS_TO",
"description": "Short, informative description in English"
}}
SZABÁLYOK:
- Minden kapcsolat legyen informatív.
- A kapcsolat típusát angolul add meg.
- Csak létező entity-k között definiálj kapcsolatot.
=============================
MESE SZÖVEGE
=============================
{story_content}
=============================
KIMENET (csak ez jelenjen meg):
=============================
A teljes válasz kizárólag az alábbi szerkezetű JSON legyen:
{{
"entities": [],
"relations": []
}}
A „Tizenkét hónap” című meséhez tartozó gráf így néz ki:

Az összes többi meséhez tartozó gráffal összefésülve kapjuk a teljes tudásgráfot.
A „Sophia és Daria milyen viszonyban vannak, mit csináltak egymással?” kérdésből a következő ontológiát nyeri ki az algoritmus:
{ "confidence": 0.6, "entity_types": [ "CHARACTER" ], "keywords": [ "Sophia", "Daria", "relationship", "between", "did", "each other" ], "relations": [] }
Ebből születnek meg a legkérdezések, amik közül ez valóban ad eredményt:
MATCH (ce:Entity)
WHERE ce.type IN ["CHARACTER", "CREATURE"] AND (toLower(ce.name) CONTAINS toLower('Sophia') OR toLower(ce.name) CONTAINS toLower('Daria') OR toLower(ce.name) CONTAINS toLower('relationship') OR toLower(ce.name) CONTAINS toLower('between') OR toLower(ce.name) CONTAINS toLower('did') OR toLower(ce.name) CONTAINS toLower('each other'))
MATCH (e:Entity)-[:INSTANCE_OF]->(ce)
OPTIONAL MATCH (e)-[r:DEFEATS|FIGHTS|CAUSES]-(target:Entity)
OPTIONAL MATCH (e)-[:LOCATED_IN]-(ev:Entity)
RETURN ce, e, r, target, ev
LIMIT 50
A lekérdezés eredménye neo4J-ben így néz ki:

Kicsit szebben, Mermaid segítségével ábrázolva pedig így néz ki:

Valójában a context-et szövegként lehet leginkább hasznosítani:
NODES:
- Daria (CHARACTER): Canonical character entity: daria
- Daria (CHARACTER): A rich, miserly woman who becomes envious of Sophia's good fortune.
- Daria Forces Sophia to Wash Hands Under Watch (EVENT): Daria humiliates Sophia by making her scrub her hands in front of her, suspecting theft.
- Seaside Village (LOCATION): A small village by the sea at the foot of great mountains.
- Daria Questions Sophia (EVENT): Daria interrogates Sophia to learn the source of her newfound wealth.
- Snakes (CREATURE): Snakes that emerge from Daria's chest and crawl over her.
- Worms (CREATURE): Worms that emerge from Daria's chest and swarm on her.
- Sophia (CHARACTER): Canonical character entity: sophia
- Sophia (CHARACTER): A poor mother of many children, hardworking and kind, who receives gifts from the Twelve Months.
- Sophia Hosts the Twelve Months Each Year (EVENT): After prospering, Sophia annually welcomes and feeds the Twelve Months.
- Daria Drives Sophia Out (EVENT): Daria accuses Sophia of stealing dough and expels her from the house.
- Sophias Children (CHARACTER): Canonical character entity: sophias children
- Sophia's Children (CHARACTER): Sophia's many children who suffer hunger at first and later live well.
RELATIONSHIPS:
- 285::E4 -> 285::E12 (CAUSES)
- 285::E4 -> 285::E25 (CAUSES)
- 285::E28 -> 285::E4 (FIGHTS)
- 285::E29 -> 285::E4 (FIGHTS)
- 285::E5 -> 285::E32 (CAUSES)
- 285::E13 -> 285::E5 (CAUSES)
Az alábbi prompt segítségével ebből készül a válasz:
Te egy szakértő folklorista AI vagy. A megadott GRAPH CONTEXT-ben az elemek előtt álló számok (pl. 82::) az egyes mesék azonosítói (ID).
A feladatod:
Sorold fel a meséket, amelyeknél a GRAPH CONTEXT-ben található információ a kérdés megválaszolásához.
A választ minden esetben így formázd: Mese #[ID]: [Válasz]
Kizárólag a megadott kontextusból dolgozz. A válaszodat azon a nyelven írd, amin a kérdést kapod.
GRAPH CONTEXT: {context}
KÉRDÉS: {question}
Az LLM-től kapott válaszban a mese ID-ját kicserélem az adatbázis alapján a mese címére, így a végső válasz így néz ki:
Tizenkét hónap: Daria egy gazdag, fösvény nő, aki irigy Sophia jó szerencséjére; ellenségként bánik vele: felügyelet alatt megalázza Sophia-t, kéri, hogy mossa a kezét; kikérdezi Sophia-t vagyonának forrásáról; végül kiűzi Sophia-t a házból.
