在 VM0 中配置结合外部数据库的动态查询工作流,首要任务不是写 SQL,而是先确认数据库在当前网络环境下能否被 VM0 直接访问。通常需要验证网络连通性、数据库账号权限、以及 VM0 提供的连接方式。下文按配置顺序给出可直接执行的步骤。
VM0 连接外部数据库的可行路径有三种:直连、内部代理、API 网关。先确认平台支持哪一项,再创建只读账号并配置连接参数;Agent 通过自然语言生成 SQL 后,在查询节点中绑定参数、缓存和超时。验证方式是用固定测试问题比对 SQL 结果与人工查询结果;风险在于网络隔离和错误授权,配置前需结合环境确认。
选定 VM0 支持的数据库连接方式
在创建连接前,先到 VM0 的「集成」或「数据源」导航中查看可用的数据库连接器。常见的 MySQL 和 PostgreSQL 通常有原生连接入口,连接参数包括主机、端口、数据库名、用户名、密码和 SSL 选项。若 VM0 运行在托管环境中,可能不允许数据库端口对外暴露,这时需要确认是否支持通过 API 网关或自定义连接器转发查询请求。
判断方法:在 VM0 所在服务器上执行 telnet host port 或 nc -vz host port 测试端口连通性;如果不通,查看平台是否提供代理连接配置项。避免选择需要额外安装客户端的方案,优先使用平台内置的数据库插件。
配置只读账号与连接参数
为降低 Agent 误操作风险,建议为工作流单独创建只读账号。以 PostgreSQL 为例:
CREATE USER vm0_reader WITH PASSWORD 'strong_password';
GRANT CONNECT ON DATABASE appdb TO vm0_reader;
GRANT USAGE ON SCHEMA public TO vm0_reader;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO vm0_reader;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO vm0_reader;MySQL 可执行:
CREATE USER 'vm0_reader'@'%' IDENTIFIED BY 'strong_password';
GRANT SELECT ON appdb.* TO 'vm0_reader'@'%';
FLUSH PRIVILEGES;然后在 VM0 连接配置中填写连接字符串模板,如:postgres://vm0_reader:strong_password@db.example.com:5432/appdb。保存后先测试连接,再进入下一步。
在自然语言工作流中嵌入 SQL 查询节点
在 VM0 的 Agent 工作流编排页面,添加一个「数据库查询」节点,并将前一个用户输入节点的输出作为查询参数。写好输入提示词是关键,提示词应明确限定数据表、字段、时间范围和只读语义。示例提示词:
你是数据查询助手。只允许生成 SELECT 查询。
表 orders 包含字段:id, customer_name, amount, created_at。
用户问题:{question}
要求:只返回 SQL,不解释。对应示例问题:“查询最近 7 天订单金额超过 1000 的客户”,生成 SQL 可能为:
SELECT customer_name, amount, created_at
FROM orders
WHERE amount > 1000
AND created_at >= CURRENT_DATE - INTERVAL '7 days'
ORDER BY created_at DESC;在查询节点中设置输出字段映射:将 customer_name 映射为回答中的客户名,amount 映射为订单金额,created_at 映射为下单时间。这样 Agent 拿到结果后能直接组成自然语言答复。
设置查询结果缓存与超时控制
避免高频查询拖垮数据库,也防止长时间占用连接。VM0 中通常在查询节点的「高级设置」里开启结果缓存,并设置缓存过期时间(如 300 秒)。同时设置连接超时和查询超时,建议查询超时不超过 10 秒,连接超时不超过 5 秒。等效配置片段:
query:
cache:
enabled: true
ttl: 300
timeout:
connect: 5s
read: 10s
write: 10s如果 VM0 的界面没有缓存开关,可以在数据库侧通过连接池或代理层处理,确保查询使用只读副本。先确认平台配置项位置,再调整参数。
用典型问题验证查询结果正确性
配置完成后,至少准备 3 个典型问题进行对比验证。示例问题及期望 SQL 结果:
- “昨天订单总量是多少?”期望 SQL 返回
COUNT(*),结果为一个数字。 - “上个月金额排名前 5 的客户有哪些?”期望 SQL 使用
GROUP BY和ORDER BY,返回 5 行客户名和总额。 - “查询 ID 为 1024 的订单是否存在?”期望 SQL 返回一行或零行,Agent 回答应明确指出存在或不存在,而不是空回复。
执行后比较 Agent 输出与直接运行 SQL 的结果。常见差异是时间范围边界和 NULL 值处理。微调提示词时,明确日期字段的格式和空值显示规则,例如“若查询结果为空,直接回复未找到”。