说个比较直接的观点:用手写SQL的方式查询数据库,虽然精准,但效率确实不高——尤其是当业务人员或非技术同事也想拿到数据时。Grok搭配SQLAgent这条路,正好能在很大程度上解决这个痛点。你只需要用自然语言提问,比如“上个月销售额最高的三个产品是什么”,剩下的解析、生成SQL、执行查询、返回结果,Grok能一气呵成。

这篇文章主要梳理一下实现这个能力的关键步骤和注意事项,适合已经有一定Python和数据库基础的朋友参考。
准备数据库连接信息
开始前,先理清数据库的“家底”。需要确认几个核心参数:数据库类型(PostgreSQL、MySQL还是SQLite)、主机地址、端口、数据库名、用户名和密码。这些信息是构建SQLAlchemy连接字符串的基础材料。
以PostgreSQL为例,连接字符串的格式长这样:postgresql+psycopg2://【用户名】:【密码】@【主机】:【端口】/【数据库名】。有个小坑需要特别留意——如果密码里包含@、/这类特殊字符,必须提前做URL编码,否则连接会静默失败,排查起来还挺让人头疼的。
建议先做个快速验证:在Python环境里跑一下engine = create_engine(conn_str); engine.connect(),确认连接能正常建立,再进入下一步。
安装并配置SQLAgent依赖
依赖安装这块,直接执行对应的pip命令就好:
pip install langchain-community langchain-openai sqlalchemy psycopg2-binary(PostgreSQL环境)或mysql-connector-python(MySQL环境)。
关键模块导入也不复杂:
from langchain.agents import create_sql_agent
from langchain.sql_database import SQLDatabase
from langchain_openai import ChatOpenAI
这里有个容易踩坑的地方:SQLAgent已经从langchian旧版迁移到了langchain-community包里。如果直接pip install langchain,会发现查不到sql_toolkit模块,导致初始化失败。所以备注一下:务必安装langchain-community。
初始化SQLDatabase与LLM实例
连接字符串到位之后,开始做两个关键初始化。
第一步,用连接字符串初始化SQLDatabase对象。建议加一个include_tables参数,限定Agent可以“看见”哪些表。如果不做这个限制,Agent会扫描全部系统表,不仅拖慢响应速度,还可能引入不必要的噪声。
第二步,初始化ChatOpenAI模型。这里有两个参数值得关注:temperature建议设为0,保证SQL生成稳定性;model_name推荐gpt-4-turbo或gpt-3.5-turbo-16k,实测下来gpt-4o-mini对SQL关键词的识别准确率有明显的下降,如果不是预算特别紧张,尽量避开它。
最后一步,调用create_sql_agent函数,传入llm、db,并指定agent_type="openai-tools"。加一个verbose=True参数,方便在调试阶段看清Agent的思考和执行过程。走过这一步,内置的SQLQueryTool、SchemaRetrieverTool等工具会自动加载到位。
运行自然语言查询
配置完成后,查询就变得简单直接了。两种常用方式:
第一种,直接调agent.invoke()传字符串,比如agent.invoke("统计每个部门的员工人数"),返回的就是查询结果。
第二种,适合做Web页面交互的场景,用agent.stream()输出流式响应。示例写法长这样:
for chunk in agent.stream({"input": "过去7天订单量Top5的用户ID"}): print(chunk.get("output", ""), end="", flush=True)
用户可以逐段看到Agent的推理和结果返回,体验比一次性等待好很多。
需要提前知道的:首次运行时,Agent会先检索表结构来生成schema摘要,这一步耗时取决于表的数量。如果执行中遇到“no such table”的报错,排查方向通常是include_tables的拼写错误,或者表名大小写不匹配——PostgreSQL默认就是区分大小写的,这点别忘了。
