在本教程中,我们将使用 LangGraph 构建一个自定义智能体,它可以回答有关 SQL 数据库的问题。 LangChain 提供了内置的 智能体 实现,这些实现使用 LangGraph 原语构建。如果需要更深入的自定义,也可以直接在 LangGraph 中实现智能体。本指南演示了一个 SQL 智能体的示例实现。如需实践入门,请参阅使用更高层级的 LangChain 抽象构建 SQL 智能体。
构建 SQL 数据库问答系统需要执行模型生成的 SQL 查询。这样做存在固有风险。请确保数据库连接权限始终尽可能严格地限制在智能体所需范围内。这可以降低构建模型驱动系统的风险,但无法完全消除风险。
预构建智能体 可以让我们快速开始,但我们依赖系统提示来约束其行为——例如,我们指示智能体始终从 “list tables” 工具开始,并且在执行查询之前始终运行查询检查工具。 通过自定义智能体,我们可以在 LangGraph 中实现更高程度的控制。在这里,我们实现一个简单的 ReAct 智能体设置,并为特定工具调用设置专用节点。我们将使用与预构建智能体相同的 [state]。

概念

我们将介绍以下概念:
  • 用于从 SQL 数据库读取数据的 Tools
  • LangGraph Graph API,包括 state、节点、边和条件边。
  • 人在环路 流程

设置

安装

LangSmith

设置 LangSmith,以便检查你的链或智能体内部正在发生什么。然后设置以下环境变量:

1. 选择一个 LLM

选择一个支持 tool-calling 的模型:
👉 阅读 OpenAI 聊天模型集成文档
下面示例中展示的输出使用的是 OpenAI。

2. 配置数据库

在本教程中,你将创建一个 SQLite 数据库。SQLite 是一个轻量级数据库,易于设置和使用。我们将加载 chinook 数据库,这是一个表示数字媒体商店的示例数据库。 为方便起见,我们已将数据库(Chinook.db)托管在一个公开的 GCS 存储桶中。
我们将使用 Python 内置的 sqlite3 模块与数据库交互:

3. 添加用于数据库交互的工具

以下数据库工具只是用于演示的最小封装。它们并不用于保障安全,也不适合在生产环境中使用。请使用范围尽可能小的数据库权限,并在执行模型生成的 SQL 之前添加应用特定的验证。
我们可以使用来自 langchain.tools 的 @tool 装饰器,将数据库 tools 实现为轻量封装:

4. 定义应用步骤

我们为以下步骤构建专用节点:
  • 列出数据库表
  • 调用 “get schema” 工具
  • 生成查询
  • 检查查询
将这些步骤放在专用节点中,可以让我们(1)在需要时强制进行工具调用,(2)自定义每个步骤关联的提示。

5. 实现智能体

现在我们可以使用 Graph API 将这些步骤组装成一个工作流。我们在查询生成步骤定义一个 条件边:如果生成了查询,则路由到查询检查器;如果不存在工具调用,则结束,这表示 LLM 已经对查询给出了响应。
我们在下面可视化该应用:
SQL agent graph 现在我们可以调用该图:
请参阅上述运行的 LangSmith trace。

6. 实现人在环路审核

在执行智能体的 SQL 查询之前,先检查是否存在任何非预期操作或低效之处,是一种谨慎的做法。 这里我们利用 LangGraph 的 人在环路 功能,在执行 SQL 查询之前暂停运行,并等待人工审核。使用 LangGraph 的 持久化层,我们可以无限期暂停运行(或者至少在持久化层存活期间暂停)。 让我们将 sql_db_query 工具封装到一个接收人工输入的节点中。我们可以使用 interrupt 函数来实现这一点。下面,我们允许输入来批准工具调用、编辑其参数,或提供用户反馈。
上述实现遵循更完整的 人在环路 指南中的 tool interrupt example。请参阅该指南了解详细信息和替代方案。
现在让我们重新组装图。我们将用人工审核替换程序化检查。请注意,我们现在包含了一个 checkpointer;这是暂停和恢复运行所必需的。
我们可以像之前一样调用该图。这一次,执行会被中断:
我们可以使用 Command 接受或编辑工具调用:
请参阅 人在环路指南 了解详细信息。

后续步骤

查看 Evaluate a graph 指南,了解如何使用 LangSmith 评估 LangGraph 应用,包括像这样的 SQL 智能体。