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.

Kapcsolódó bejegyzések