基于图的实体解析
糟了!即使提示词万无一失、加入了 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['____'])