主题
NL2SQL 工具
NL2SQLTool旨在将自然语言转换为 SQL 查询。
概述
该工具用于将自然语言转换为 SQL 查询。将其传递给智能体后,它会生成查询,然后使用这些查询与数据库交互。
这支持多种工作流,例如让智能体访问数据库,根据目标获取信息,然后使用这些信息生成响应、报告或任何其他输出。 此外,它还使智能体能够根据其目标更新数据库。
注意:默认情况下,该工具为只读(仅允许 SELECT/SHOW/DESCRIBE/EXPLAIN)。写操作需要 allow_dml=True 或环境变量 CREWAI_NL2SQL_ALLOW_DML=true。启用写访问时,请确保智能体尽可能使用限定范围的数据库用户或只读副本。
安全模型
NL2SQLTool 是一个具备执行能力的工具。它会直接针对已配置的数据库连接运行模型生成的 SQL。
这意味着风险取决于你的部署选择:
- 你在
db_uri中提供哪些凭证 - 不可信输入是否会影响提示词
- 是否在执行前添加工具调用护栏
如果你将不可信输入路由到使用此工具的智能体,请将其视为高风险集成。
加固建议
在生产环境中使用以下所有措施:
- 尽可能使用只读数据库用户
- 对于分析/检索工作负载,优先使用只读副本
- 授予最小权限(无超级用户/管理员角色,无文件/系统级能力)
- 应用数据库端资源限制(语句超时、锁超时、成本/行数限制)
- 添加
before_tool_call钩子以强制执行允许的查询模式 - 为破坏性语句启用查询日志记录和告警
只读模式与 DML 配置
NL2SQLTool 默认以只读模式运行。未经额外配置时,仅允许以下语句类型:
SELECTSHOWDESCRIBEEXPLAIN
除非显式启用 DML,否则任何执行写操作(INSERT、UPDATE、DELETE、DROP、CREATE、ALTER、TRUNCATE 等)的尝试都会引发错误。
包含分号的多语句查询(例如 SELECT 1; DROP TABLE users)在只读模式下同样会被阻止,以防止注入攻击。
启用写操作
你可以通过两种方式启用 DML(Data Manipulation Language,数据操作语言):
方式 1 — 构造函数参数:
python
from crewai_tools import NL2SQLTool
nl2sql = NL2SQLTool(
db_uri="postgresql://example@localhost:5432/test_db",
allow_dml=True,
)方式 2 — 环境变量:
bash
CREWAI_NL2SQL_ALLOW_DML=truepython
from crewai_tools import NL2SQLTool
# DML enabled via environment variable
nl2sql = NL2SQLTool(db_uri="postgresql://example@localhost:5432/test_db")用法示例
只读(默认)— 适用于分析和报表:
python
from crewai_tools import NL2SQLTool
# Only SELECT/SHOW/DESCRIBE/EXPLAIN are permitted
nl2sql = NL2SQLTool(db_uri="postgresql://example@localhost:5432/test_db")启用 DML — 写入类工作负载所必需:
python
from crewai_tools import NL2SQLTool
# INSERT, UPDATE, DELETE, DROP, etc. are permitted
nl2sql = NL2SQLTool(
db_uri="postgresql://example@localhost:5432/test_db",
allow_dml=True,
)WARNING
启用 DML 会让智能体具备修改或销毁数据的能力。仅当你的用例明确需要写入权限时才启用,并确保数据库凭据被限定在最小必要权限范围内。
要求
- SqlAlchemy
- 任何兼容的数据库库(例如 psycopg2、mysql-connector-python)
安装
安装 crewai_tools 包
shell
pip install 'crewai[tools]'用量
要使用 NL2SQLTool,你需要将数据库 URI 传给该工具。URI 的格式应为 dialect+driver://username:password@host:port/database。
python
from crewai_tools import NL2SQLTool
# psycopg2 was installed to run this example with PostgreSQL
nl2sql = NL2SQLTool(db_uri="postgresql://example@localhost:5432/test_db")
@agent
def researcher(self) -> Agent:
return Agent(
config=self.agents_config["researcher"],
allow_delegation=False,
tools=[nl2sql]
)示例
主要任务目标是:
"获取每个城市的平均、最高和最低月度收入,但只包含用户数超过一个的城市。同时,统计每个城市的用户数量, 并按平均月度收入降序排列结果"
于是智能体尝试从数据库中获取信息,第一次的结果是错误的,因此智能体再次尝试,获取到正确的信息并传递给下一个智能体。


第二个任务目标是:
"审阅数据并创建详细报告,然后根据所提供的数据在数据库中创建包含相应字段的表。 包含每个城市的平均、最高和最低月度收入信息,但只包含用户数超过一个的城市。同时,统计每个城市的用户数量,并按平均月度收入降序排列结果。"
现在事情开始变得有趣了,智能体会生成 SQL 查询,不仅创建表,还会将数据插入表中。最后,智能体仍然会返回最终报告,其内容与数据库中的内容完全一致。




这是一个简单的示例,展示如何使用 NL2SQLTool 与数据库交互,并基于数据库中的数据生成报告。
该工具为智能体的逻辑及其与数据库的交互方式提供了无限可能。
md
DB -> Agent -> ... -> Agent -> DB