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

概念

我们将涵盖以下概念:

设置

安装

LangSmith

设置 LangSmith 以检查您的链或智能体内部发生了什么。然后设置以下环境变量:

1. 选择大语言模型(LLM)

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

2. 配置数据库

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

3. 添加数据库交互工具

我们将创建自定义工具来与数据库交互:

4. 定义应用步骤

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

5. 实现智能体

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

6. 实现人机协作审查

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

下一步

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