设计思路
任务定义:根据业务需求写 SQL——**"依据什么,生成什么"**: - 依据 = 表结构(字段、类型、业务描述;多表时再加关联字段关系) - 生成 = 可执行的 SQL 两步法(也是 prompt 的骨架): ```text 第一步:理解问题,从表字段中找出相关字段(语义检索) 第二步:结合 SQL 语法生成语句(受限生成) ``` 原则:**AI 只是技术/手段,目的是解决问题**——先想清楚验收标准(执行结果对不对),再动手。
表结构导出要点: - 每个字段给"名称 + 类型 + 中文业务描述"三元组,描述比名字更重要 - 多表场景显式给出关联关系(`A.user_id = B.cust_id`) - 大宽表给业务维度分组说明,避免模型在几百个字段里迷路 - 可先用 LLM 做"问题→相关字段"的筛选(一次调用),再做"字段+问题→SQL"(二次调用)——分治比一步到位稳
模型要求: - 强语义理解/检索能力:能从上百字段中锁定相关字段 - 理解准确不胡扯:列名、关联、过滤条件不能编造 实践结论: - 在线模型(deepseek/gpt 系)均可用 - 本地 DeepSeek 至少 70B 才堪用;第一版用在线 API,跑通后再试 32B/14B 降成本
tpf nl2sql 实战:SqlJiaoYi 提示工厂
`tpf.llm.prompt.SqlJiaoYi`(银行反洗钱交易域的 nl2sql 提示工厂,模块级实例 `yj`): ```python from tpf.llm.prompt import yj # SqlJiaoYi 实例 from tpf.cn import Think thk = Think() prompt = yj.prompt1(query="查上个月跨境取现超过50万的客户", col_name=..., df_table_jiaoyi=..., df_table_kehu=..., tiaojian=yj.tiaojian()) res = thk.thinking(prompt, return_json=True) # -> {"desc":..., "sql1":..., "sql2":...} ``` 工厂提供:`prompt1`(主提示)、`tiaojian()`(业务话术字典)、`col_desc/jiaoyi_desc`(列名与业务维度)、`output_format()`、`examples()`、`alg_table_name()`、`prompt_bsn_fenlei()`。
`prompt1` 的五步思维链(表结构嵌入 + 业务约束 + 输出契约): ```text 1. 读懂问题与给定的表结构(交易表/客户表字段与含义) 2. 把业务话术翻译成 SQL 条件(对照"业务条件字典") 3. 确定涉及的表与关联关系 4. 生成 SQL(先原始逻辑,再 case when 展示版) 5. 自检:字段存在性、语法、过滤条件完整性 ``` 输出三字段 JSON:`desc`(思路说明)、`sql1`(原始 SQL)、`sql2`(case when 可读版)——sql2 直接供报表使用。
**业务话术→SQL 条件字典**(nl2sql 质量的命门): ```python yj.tiaojian() 返回(节选): { "跨境": "t.OVERAREA_IND='1'", "取现": "t.CASH_IND='1'", "大额": "t.AMT >= 500000", ... } ``` 配套 `examples()` 提供 20+ 个 few-shot(每个含问题与 sql1/sql2 对)。经验:**字典+示例的覆盖度直接决定准确率**——badcase 归因后先补字典/示例,再考虑换模型。 `prompt_bsn_fenlei()` 先把问题分类(币种/现金转账/收付)返回判断条件;`alg_table_name()` 由问题生成算法特征表名——都是"分治"思想的落地。
参考
     CHESS: 多智能体Text2SQL