Разрешение сущностей на основе графа
Вот незадача! Даже при тщательно выверенном промпте, примерах few-shot и всех принятых мерах предосторожности языковая модель всё равно «придумала» персонажа по имени Romeo Capulet и добавила ему несколько реплик в базе данных.
{
"id": "romeo-capulet",
"name": "Romeo Capulet",
"family": "Montague"
}
К счастью, вы можете использовать связи в графе знаний, чтобы определить, не является ли этот узел случайным дубликатом узла Romeo Montague.
Cypher-запрос similarity_cypher использует связи MEMBER_OF и INTERACTS_WITH для построения произвольной оценки схожести со следующими свойствами:
| Условие | Cypher | Модификатор баллов |
|---|---|---|
Связь MEMBER_OF с одним и тем же семейством |
af = bf |
+1 |
| Одинаковое значение свойства name | a.name = b.name |
+2 |
Доля общих персонажей, с которыми взаимодействуют a и b |
size(inCommon) / size(aInteractsWith) |
Умножается на долю персонажей b, с которыми взаимодействует a |
Исходя из предметных знаний, оценка 2 свидетельствует о высокой степени совпадения.
Это упражнение является частью курса
Graph RAG с LangChain и Neo4j
Инструкции к упражнению
- Выполните запрос к
graphс помощью Cypher-запроса (similarity_cypher), чтобы рассчитать оценки схожести между"romeo-capulet"и остальными узлами персонажей. - Извлеките
"bId","bFamily"и"score"— именно в таком порядке — из каждой строкиrowвresults.
Интерактивное практическое упражнение
Попробуйте выполнить это упражнение, дополнив этот пример кода.
# 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['____'])