Text2Cypher
所需图结构
背景
两种相关的 GraphRAG 模式:Cypher 模板和动态 Cypher 生成都受限于在实现过程中定义的查询/查询片段。
描述
用户问题与图模式结合,由 LLM 翻译成 Cypher 查询,然后针对数据库执行。执行返回的数据将提供给 LLM 进行问题解答。
用法
这种模式非常灵活。没有预定义的查询,并且(理论上)LLM 可以生成任何符合所提供模式的查询。然而,这种模式并非 100% 可靠,因为它受限于基础模型对 Cypher 查询语言的理解。通过微调模型以改进生成(见下文)可以改善这种情况。LLM 在将文本翻译成 Cypher 时并不完美,因此需要人工干预(HITL)或适当的防护措施,如语法检查或只读执行。如果发生错误,可以将问题、模式和错误重试到 LLM,以获得更好的结果。
所需预处理
LLM 应该获取数据库模式以及域描述。这将显著改善结果。模式可以通过实际数据值样本、分布或分类值列表进行可选增强,以改善从问题到查询的值翻译。
进一步考虑
如果我们将Cypher 模板、动态 Cypher 生成和 Text2Cypher 进行比较,我们可以使用以下类比(如下图所示):
- Cypher 模板就像拥有不同相似的单件玩具。自由度不大。
- 动态 Cypher 生成就像玩积木。组合方式有更大的自由度,但仍然相当不容易出错。
- Text2Cypher 就像绘画。有很多自由度,但也很容易失败。
上述模式也面临同样的挑战:当从用户问题中提取实体时,实体别名需要与数据库中的现有值匹配,否则查询将无法返回任何结果。这个问题可以通过提供增强模式或使用数据库上的全文索引搜索来缓解,如LangChain 模板:Neo4j 高级 RAG (Neo4j Cypher FT)。
Text2Cypher 模式是最灵活的,但也是最不可靠的。然而,为提高其可靠性,正在进行大量工作。方法包括:
- 在自然语言到 Cypher 翻译上微调 LLM(见下文)
- 优化少量样本示例的使用(例如,通过上下文学习和微调增强 text2cypher 或通过少量样本示例中隐含推理改进基于 LLM 的 KGQA 进行多跳问答)
- 自我修复生成——如果生成的查询无法在数据库上执行,将查询和获得的异常消息返回给 LLM,LLM 将有机会生成更好的查询(例如,使用 ChatGPT 4 在任何图模式上生成 Cypher 查询)
- 语言模型的选择也对结果的好坏起着作用,因为每个语言模型都有其独特的优势和劣势。(LLM 查询基准:Cypher vs SQL)
模式考量
为了生成正确的查询,必须考虑数据库的模式。这就是为什么向 LLM 提供需要生成查询的数据库的具体模式描述是有意义的。
- 节点(标签和属性名称及类型)
- 关系(类型和属性名称及类型)
- 源-关系->目标(节点类型之间的关系)
可以提供有关现有索引或约束的信息,以便 LLM 能够利用它们(考虑向量、全文或空间索引)。
此外,用有关属性的附加信息来增强模式也可能很有用。这些信息可以被用于正确转换用户输入中的值或推断有效范围或模式。
- 详细的类型信息
- 数值类型的范围(最小值、最大值)
- 分类值的(示例)值列表(和分布)
- 属性的格式和描述
微调模型
大型基础模型(GPT-4o、Gemini 1.5 Pro、Claude Sonnet 3.6、Llama3.1 70bn+ 和 Qwen 2.5 Coder)已经展示出令人印象深刻的 Cypher 预训练和理解能力。
这些模型可以正确生成中等复杂的 Cypher 查询。它们主要在最近的语法、关系方向和未知属性类型或值方面遇到困难。添加额外信息(如 Cypher 参考)或来自查询日志的示例作为少量样本示例有助于提高输出质量。
通过使用精选的问题-模式-查询数据集进行微调模型,可以实现改进的另一步飞跃,请参阅下面的博客文章。
来自使用 Neo4j Text2Cypher (2024) 数据集进行基准测试
延伸阅读
训练数据集
微调
- (Huggingface:text2cypher 训练数据集和微调模型)[https://hugging-face.cn/neo4j]
- 推出微调后的 Neo4j Text2Cypher (2024) 模型 - 图数据库与分析
少量样本示例
基准测试
现有实现
-
将 Neo4j 集成到 LangChain 生态系统 (Tomaz Bratanic, 2024 年 4 月)
-
LangChain Cypher 搜索:提示与技巧 (Tomaz Bratanic, 2024 年 6 月)