技术指南:使用 FalkorDB 实现 GraphRAG 架构,适用于 BFSI(银行、金融服务和保险)应用。涵盖知识图谱创建、Cypher 查询生成以及大语言模型(LLM)集成,用于企业级 AI 助手的开发。
自从企业开始采用检索增强生成(Retrieval Augmented Generation,RAG)以来,这项技术已经取得了显著进步。正如我们所见,各组织不断探索创新方法以挖掘更多价值。尽管检索过程和搜索算法变得更快、更高效,但在处理复杂任务(如多步逻辑推导)或回答需要将分散信息点连接起来的复杂问题时,它们仍然存在局限性。
让我们通过一个真实的例子来进一步探讨这个主题:“1492 年圣诞节沉没的哥伦布船叫什么名字?”
一个标准的 RAG 系统通常会遵循以下步骤:
识别事件:查找有关哥伦布船只及其沉船的信息。
确认日期:验证圣诞节当天发生事件的船只。
确定名称:提取特定船只的名称。
然而,第一个步骤往往会成为挑战,因为基础 RAG 系统主要依赖语义相似性进行文本检索。它们擅长找到相似的内容,但在连接多个事实以回答复杂问题时表现不足。当关键信息分散在不同文档中时,这些系统难以将其拼凑起来。传统解决方案(如为常见问题手动创建问答对)不仅成本高昂,而且不切实际。
为了解决这些局限性,微软研究院提出了一种创新性解决方案——GraphRAG。这种方法通过将知识图谱融入检索和生成过程,将 RAG 提升到了一个全新的高度。知识图谱通过将实体和关系以节点和边的形式保留下来,为数据创建了更丰富的表示。这就像将一团混乱的信息网转化为一张整齐有序的地图。看看下面的知识图谱,您会立刻明白,通过简单的图谱遍历,回答复杂问题变得多么轻松。是不是很神奇?
作者提供的图片
在 RAG 系统中,选择向量数据库还是图数据库完全取决于您正在解决的问题、系统架构需求和性能目标。以下是一些帮助您决策的见解:
FalkorDB 是一款为 GraphRAG 应用高度优化的低延迟数据库解决方案。其基于 Redis 的架构提供了高性能的图数据库,利用内存处理技术和高效的内存使用,与基于磁盘存储的图数据库相比,显著加快了查询执行速度并降低了延迟。因此,它能够高效存储和查询数据点之间的复杂关系。此外,它支持各种 AI 框架(如 LangChain 和 LlamaIndex),增强了其在构建 AI 应用方面的功能。
在本文中,我将向您展示如何为 BFSI 行业定制 GraphRAG 驱动的聊天机器人。通过一个假设的银行作为例子,我将演示该技术如何高效管理复杂的金融数据并解决客户查询。
本教程已使用以下 Python 库进行了测试。请在操作时验证版本:
代码
确保为您的 API 密钥设置环境变量:
代码
您可以通过云端或本地 Docker 设置连接 FalkorDB。
若要在本地设置 FalkorDB,请确保系统已安装 Docker。运行以下命令启动 FalkorDB:
代码
或者,您可以通过 Docker Desktop 控制台启动容器。
作者提供的图片
要连接到云端,请创建一个账户并登录 FalkorDB 控制台。在仪表盘中,您可以创建一个 AWS 或 Google Cloud 实例并获取凭据。
作者提供的图片
一旦 FalkorDB 启动,请定义并连接图数据库客户端。
代码
由于我们正在构建一个客户支持聊天机器人,我将使用一份银行手册,其中包含有关假设银行的全面信息。该数据集将演示聊天机器人如何处理有关银行产品和服务的复杂客户查询。当然,您也可以使用自己的数据集。
首先,从数据目录加载 PDF 文件。
代码
本教程中,我将使用 OpenAI 的 LLM。以下是定义它的方法:
代码
您可以手动创建知识图谱,也可以利用 LangChain 模块。
手动方法需要将文档拆分为块、识别节点和关系,并使用 Cypher 查询填充图谱。尽管有效,但它繁琐且耗时。以下是用于创建节点和关系的 Cypher 查询示例。
代码
在微软的 GraphRAG 版本中,提供给 LLM 的图谱提取提示如下所示:
代码
为了简化,您可以将所需的 LLM 提供给 LangChain,让它完成剩下的工作。LLM 图谱转换器模块将负责为您创建知识图谱。让我解释一下背后的工作原理。
LLM 图谱转换器使用两种不同的方法来创建图谱:
代码
您可以指定自定义节点类型以限制图谱结构。如果不指定,LLM 将根据内容自动确定适当的节点类型。例如:
代码
创建图谱后,您可以检查其模式以验证结构。请注意,输出可能很长,因此不包括在此。
代码
为了帮助您更好地理解我创建的知识图谱,以下是一个可视化表示:
作者提供的图片
尽管创建图数据库相对简单,但提取有意义的信息需要掌握像 Cypher 这样的查询语言。Cypher 是一种专为图数据库设计的声明式查询语言,使用模式匹配语法高效遍历节点和关系。FalkorDB 遵循 OpenCypher 格式。
以下是基于我们刚刚创建的知识图谱的 Cypher 查询示例:
代码
查询返回银行提供的所有金融产品。
代码
不同的图数据库以各种方式处理此类查询,可以通过直接实现或与 LangChain 等框架集成。例如,在 LangChain 中,可以通过以下方式执行查询:
代码
为了让您更清楚地了解背后的工作原理,我将实现一个自定义查询来演示底层机制。这将帮助您更直观地理解这些系统的后端运行逻辑。
作者提供的图片
我们需要结合一些提示工程以生成高质量的 Cypher 查询。目前,我们的实现使用精心设计的提示,将数据库模式(包括节点和关系)与用户查询结合起来。然而,总有改进的空间。您可以通过将工具调用与 OpenAI 集成或利用微调的语言模型来进一步优化查询生成。
以下是定义一个函数以优化模式提示的方法:
代码
格式化后的模式现在可以包含在提示模板中。
代码
完成 Cypher 查询后,需要将结果传递给另一个 LLM。这种双 LLM 方法确保用户在聊天交互中收到清晰、上下文相关的信息,而不是原始数据库结果。
代码
分析提示可以结构化如下:
代码
现在,使用辅助函数并将其集成到主函数中。
代码
看起来不错!让我们测试一下这个函数。
代码
恭喜您完成了所有步骤!现在,让我们将所有内容整合到一个 Gradio 界面中。以下是您的 GraphRAG 驱动虚拟助手,随时为您服务。
作者提供的图片
在本文中,我们了解了 GraphRAG 如何为企业提供客户支持聊天机器人。我已涵盖以下关键组件:构建知识图谱、为 Cypher 查询生成构建 LLM 驱动的管道,以及利用 FalkorDB 的功能创建高效、低延迟的 GraphRAG 系统。此方法展示了现代图数据库如何有效支持智能客户服务解决方案。
我还比较了 RAG 系统中图数据库与向量数据库的优劣,并演示了如何根据业务需求选择更适合的解决方案。为了进一步探索,建议您尝试创建更详细的知识图谱,以表示复杂的数据关系。您还可以试用 FalkorDB 的 graph-sdk,它能让这个过程更加简单。
完整代码请访问 GitHub。
[1] FalkorDB Documentation (2024). Documentation
[2] LangChain Documentaion (2024). Documentation
[3] OpenCypher (2024).Resources
[4] Microsoft Research., Darren Edge., Ha Trinh., Newman., Joshua B., Alex C., Steven T., Apurva Mody. (2024). From Local to Global: A Graph RAG Approach to Query-Focused Summarization. arXiv:2404.16130
[5] Tomaz Bratanic.Building Knowledge Graphs with LLM Graph Transformer (2024).Towards Data Science