グラフに基づくエンティティ解決
なんてことでしょう。堅牢なプロンプトや few-shot の例を用意して祈ってみたのに、LLM が Romeo Capulet という架空のキャラクターを幻覚し、データベースにいくつかのセリフまで割り当ててしまいました。
{
"id": "romeo-capulet",
"name": "Romeo Capulet",
"family": "Montague"
}
幸い、ナレッジグラフ内のリレーションシップを使って、このノードが Romeo Montague という別人物の誤重複である可能性を判断できます。
similarity_cypher の Cypher 文は、MEMBER_OF と INTERACTS_WITH のリレーションシップを用いて、次の特性をもつ任意の類似度スコアを算出します。
| Condition | Cypher | Points Modifier |
|---|---|---|
同じ家系への MEMBER_OF リレーションシップ |
af = bf |
+1 |
| 同一の name プロパティ | a.name = b.name |
+2 |
a と b がやり取りしているキャラクターの割合 |
size(inCommon) / size(aInteractsWith) |
a がやり取りしている b の割合で乗算 |
ドメイン知識から、スコアが 2 であれば強い相関を示すとわかっています。
この演習はコースの一部です
Graph RAG with LangChain and Neo4j
演習の手順
- Cypher クエリ(
similarity_cypher)でgraphにクエリを実行し、"romeo-capulet"と他のキャラクターノードとの類似度スコアを計算します。 resultsの各rowから、"bId"、"bFamily"、"score"の順で値を取り出してください。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# Query the graph with similarity_cypher
result = ____
# Extract and print the results
for row in result:
print(row['____'], 'from', row['____'], 'has similarity score of ', row['____'])