그래프 기반 엔터티 정합성 해소
이런! 방탄 프롬프트에 few-shot 예시까지 준비하고 행운을 빌었는데도, LLM이 Romeo Capulet이라는 인물을 환각으로 만들어서 데이터베이스에 몇 줄을 할당해 버렸네요.
{
"id": "romeo-capulet",
"name": "Romeo Capulet",
"family": "Montague"
}
다행히 지식 그래프의 관계를 활용해, 이 노드가 Romeo Montague라는 다른 노드의 실수로 인한 중복인지 판단할 수 있어요.
similarity_cypher Cypher 구문은 MEMBER_OF와 INTERACTS_WITH 관계를 사용해 다음과 같은 특성을 갖는 임의의 유사도 점수를 계산합니다:
| 조건 | Cypher | 점수 가중치 |
|---|---|---|
같은 가문으로의 MEMBER_OF 관계 |
af = bf |
+1 |
| 동일한 name 속성 | a.name = b.name |
+2 |
a와 b가 상호작용하는 등장인물의 교집합 비율 |
size(inCommon) / size(aInteractsWith) |
a가 b와 상호작용하는 비율로 곱함 |
도메인 지식에 따르면, 점수가 2이면 강한 상관관계를 의미합니다.
이 연습은 강의의 일부입니다
LangChain과 Neo4j로 배우는 Graph RAG
연습 안내
- 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['____'])