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

概念

我们将涵盖以下概念:

设置

安装

LangSmith

设置 LangSmith 以检查链或代理内部发生的情况。然后设置以下环境变量:

1. 选择一个 LLM

选择一个支持工具调用的模型:
👉 阅读 OpenAI 聊天模型集成文档
下面示例中显示的输出使用了 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. 实现Human in the Loop审查

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

后续步骤

查看评估图指南,了解如何使用 LangSmith 评估 LangGraph 应用程序,包括像这样的 SQL 代理。