Skip to main content
在本教程中,我们将使用 LangGraph 构建一个能够回答 SQL 数据库相关问题的自定义智能体。 LangChain 提供了内置的智能体实现,基于 LangGraph 原语实现。如果需要更深度的自定义,可以直接在 LangGraph 中实现智能体。本指南演示了一个 SQL 智能体的示例实现。如需实用入门指南,请参阅使用高级 LangChain 抽象构建 SQL 智能体
构建 SQL 数据库的问答系统需要执行模型生成的 SQL 查询。这样做存在固有风险。请确保你的数据库连接权限始终尽可能地限制在智能体所需的最小范围内。这将减轻(但不能消除)构建模型驱动系统的风险。
预构建智能体让我们可以快速上手,但我们依赖系统提示来约束其行为——例如,我们指示智能体始终从”列出表”工具开始,并始终在执行查询前运行查询检查工具。 在 LangGraph 中,我们可以通过自定义智能体来实施更高程度的控制。在这里,我们实现了一个简单的 ReAct 智能体设置,为特定的工具调用配置了专用节点。我们将使用与预构建智能体相同的[状态]。

概念

我们将涵盖以下概念:
  • 用于从 SQL 数据库读取数据的工具
  • LangGraph 图 API,包括状态、节点、边和条件边。
  • 人机协作流程

设置

安装

LangSmith

设置 LangSmith 来检查链或智能体的内部运行情况。然后设置以下环境变量:

1. 选择 LLM

选择一个支持工具调用的模型:
👉 Read the OpenAI chat model integration docs
示例中显示的输出使用了 OpenAI。

2. 配置数据库

你将为本教程创建一个 SQLite 数据库。SQLite 是一个轻量级数据库,易于设置和使用。我们将加载 chinook 数据库,这是一个代表数字媒体商店的示例数据库。 为方便起见,我们已将数据库(Chinook.db)托管在公共 GCS 存储桶中。
我们将使用 langchain_community 包中提供的便捷 SQL 数据库包装器与数据库交互。该包装器提供了一个简单的接口来执行 SQL 查询并获取结果:

3. 添加数据库交互工具

使用 langchain_community 包中的 SQLDatabase 包装器与数据库交互。该包装器提供了一个简单的接口来执行 SQL 查询并获取结果:

4. 定义应用步骤

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

5. 实现智能体

现在我们可以使用图 API将这些步骤组装成工作流。我们在查询生成步骤定义了一个条件边,如果生成了查询则路由到查询检查器,如果没有工具调用则结束(即 LLM 已对查询作出响应)。
下面我们可视化应用:
SQL 智能体图 现在我们可以调用图:
查看上述运行的 LangSmith 追踪

6. 实现人机协作审核

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

后续步骤

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