|
任务定义:根据业务需求写 SQL——**"依据什么,生成什么"**:
- 依据 = 表结构(字段、类型、业务描述;多表时再加关联字段关系)
- 生成 = 可执行的 SQL
两步法(也是 prompt 的骨架):
```text
第一步:理解问题,从表字段中找出相关字段(语义检索)
第二步:结合 SQL 语法生成语句(受限生成)
```
原则:**AI 只是技术/手段,目的是解决问题**——先想清楚验收标准(执行结果对不对),再动手。
|
|
表结构导出要点:
- 每个字段给"名称 + 类型 + 中文业务描述"三元组,描述比名字更重要
- 多表场景显式给出关联关系(`A.user_id = B.cust_id`)
- 大宽表给业务维度分组说明,避免模型在几百个字段里迷路
- 可先用 LLM 做"问题→相关字段"的筛选(一次调用),再做"字段+问题→SQL"(二次调用)——分治比一步到位稳
|
|
模型要求:
- 强语义理解/检索能力:能从上百字段中锁定相关字段
- 理解准确不胡扯:列名、关联、过滤条件不能编造
实践结论:
- 在线模型(deepseek/gpt 系)均可用
- 本地 DeepSeek 至少 70B 才堪用;第一版用在线 API,跑通后再试 32B/14B 降成本
|
|
`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