我会把它设计成一个 Text-to-SQL Agent。用户输入自然语言问题后,Agent 首先会理解用户的查询意图,例如要查什么指标、时间范围、筛选条件以及按什么维度统计。如果用户的问题不够明确,比如只说"查一下最近的销售情况",Agent 会先追问用户,确认"最近"是多久、"销售情况"指销售额还是订单数,避免直接生成错误的 SQL。
当查询条件明确后,Agent 会根据用户的问题,从数据平台的元数据中找到相关的数据表、字段、表之间的关联关系以及业务口径。例如统计销售额时,需要知道应该使用哪个金额字段、是否只统计已支付订单、退款订单是否需要排除。然后将这些信息和用户问题一起交给大模型,让大模型生成对应的 SQL。
SQL 生成后不会马上执行,而是先进行检查。首先检查 SQL 语法以及表名、字段名是否正确;其次进行安全和权限检查,只允许执行 SELECT 查询,禁止 DELETE、UPDATE、DROP 等操作;同时限制查询超时时间、最大返回行数和扫描数据量。数据库连接也会使用只读账号,防止 Agent 修改业务数据。
检查通过后,系统执行 SQL。如果执行时出现字段不存在、类型不匹配等错误,可以将错误信息和正确的表结构重新提供给大模型,让它在限定次数内自动修复 SQL。执行成功后,Agent 会把数据库返回的数据整理成用户容易理解的自然语言、表格或者图表,同时展示实际执行的 SQL,方便用户核对。
在实现上,我不会一开始就拆成很多 Agent,而是先使用一个 Agent 配合多个工具,例如元数据检索工具、SQL 生成工具、SQL 校验工具和只读查询工具。Agent 负责判断下一步应该追问用户、生成 SQL、修复 SQL,还是返回结果。整套 Text-to-SQL 的操作流程和业务规则也可以封装成一个 Skill,供 Agent 按照统一规范执行。
最后,我会重点评估三个方面:第一是查询结果是否正确,而不仅是 SQL 能不能运行;第二是业务指标口径是否准确;第三是权限和数据安全是否得到保证。这样做出来的才是一个可以真正接入数据平台使用的自然语言查询 Agent。