Skip to main content

概述

在本教程中,你将学习如何构建一个能够使用 LangChain 代理 回答关于 SQL 数据库问题的代理。 从高层次来看,该代理将:
1

从数据库中获取可用的表和模式

2

决定哪些表与问题相关

3

获取相关表的模式

4

根据问题和模式信息生成查询

5

使用 LLM 双重检查查询中的常见错误

6

执行查询并返回结果

7

纠正数据库引擎发现的错误,直到查询成功

8

根据结果制定响应

构建 SQL 数据库的问答系统需要执行模型生成的 SQL 查询。这样做存在固有风险。请确保你的数据库连接权限始终尽可能地限定在代理所需的最小范围内。这将减轻(但不能消除)构建模型驱动系统的风险。

概念

我们将涵盖以下概念:

设置

安装

LangSmith

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

1. 选择一个 LLM

选择一个支持 工具调用 的模型:
👉 阅读 OpenAI 聊天模型集成文档
下面示例中显示的输出使用了 OpenAI。

2. 配置数据库

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

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

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

4. 使用 create_agent

使用 create_agent 以最少的代码构建一个 ReAct 代理。该代理将解释请求并生成 SQL 命令,然后由工具执行。如果命令有错误,错误消息将返回给模型。然后模型可以检查原始请求和新的错误消息,并生成新的命令。这个过程可以持续进行,直到 LLM 成功生成命令或达到结束计数。这种向模型提供反馈(在这种情况下是错误消息)的模式非常强大。 使用描述性的系统提示初始化代理以自定义其行为:
现在,使用模型、工具和提示创建代理:

5. 运行代理

在示例查询上运行代理并观察其行为:
代理正确编写了查询,检查了查询,并运行了查询以提供其最终响应。
你可以在 LangSmith 跟踪 中检查上述运行的所有方面,包括采取的步骤、调用的工具、LLM 看到的提示等。

(可选)使用 Studio

Studio 提供了一个“客户端”循环以及内存,因此你可以将其作为聊天界面运行并查询数据库。你可以提出诸如“告诉我数据库的模式”或“显示前 5 名客户的发票”之类的问题。你将看到生成的 SQL 命令和结果输出。有关如何启动的详细信息如下。
除了前面提到的包之外,你还需要:
在你将运行的目录中,你需要一个包含以下内容的 langgraph.json 文件:
创建一个文件 sql_agent.py 并插入以下内容:

6. 实现Human in the Loop审查

在执行代理的 SQL 查询之前进行检查,以防止任何意外操作或低效,这可能是谨慎的做法。 LangChain 代理支持内置的 Human in the Loop中间件,以增加对代理工具调用的监督。让我们配置代理,以便在调用 sql_db_query 工具时暂停以供人工审查:
我们为代理添加了一个 检查点,以允许执行暂停和恢复。有关此内容以及可用中间件配置的详细信息,请参阅 Human in the Loop指南
运行代理时,它现在将在执行 sql_db_query 工具之前暂停以供审查:
我们可以恢复执行,在这种情况下接受查询,使用 Command
有关详细信息,请参阅 Human in the Loop指南

后续步骤

如需更深入的自定义,请查看 本教程,了解如何直接使用 LangGraph 原语实现 SQL 代理。