Skip to main content

title: 构建自定义 SQL 智能体 sidebarTitle: 自定义 SQL 智能体

在本教程中,我们将使用 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. 实现人在回路审查

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

下一步

查看 评估图 指南,了解如何使用 LangSmith 评估 LangGraph 应用程序,包括此类 SQL 智能体。