随着人工智能技术的迅猛发展,语言模型在自然语言处理领域的表现日益出色。作为数据库操作的核心语言,SQL 的生成与理解能力已成为评估语言模型实用价值的重要标准之一。不同参数量的语言模型在处理 SQL 任务时表现出显著差异。
本文旨在探讨模型参数量如何影响其 SQL 处理能力,并通过具体案例分析揭示这一现象背后的原因。
语言模型的参数量通常与其理解和生成能力密切相关。小规模模型(参数量在百万至千万级)受限于计算资源和训练数据,在复杂任务中的表现往往较为有限。而大规模模型(参数量达数十亿甚至千亿级)凭借卓越的语言建模和上下文理解能力,能够更高效地处理逻辑严密、结构化程度高的任务。
简言之,参数量越大,模型越能精准捕捉复杂的语法规则和语义关联。
了解更多《大模型 SQL 能力测评》
小规模模型在 SQL 任务中通常表现较弱。 一个几百万参数的模型可能能够处理简单的 SELECT 查询,但面对嵌套查询(如子查询)或多表连接时,往往会出错。这是因为其有限的参数量限制了它对复杂语法的建模能力。
亿级参数的模型(如拥有 10 亿参数的模型)在 SQL 任务中表现有了显著提升。 这类模型可以较好地处理单表查询甚至简单的多表连接。然而,在更复杂的场景(如涉及 GROUP BY 或 HAVING 的查询)中,它仍可能出现逻辑错误。
参数量达到百亿甚至千亿的模型(如 GPT-4 或其类似模型)在 SQL 任务中展现出惊艳的能力。 它们不仅能生成复杂的查询,还能理解上下文并优化 SQL 语句。这种能力得益于其强大的语言建模和推理能力。
我们让模型模拟一个数据库,尝试执行一条复杂的查询语句,让模型给出对应的查询结果和执行过程。
我们挑选了三个不同参数的蒸馏模型。
Temperature:0.3
模拟 MySQL 8.0 执行复杂的 SQL 查询并提供执行过程和结果。
建表语句
CREATE TABLE departments (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(50)
);
CREATETABLE employees (
idINT PRIMARY KEY,
nameVARCHAR(50),
department_id INT,
salary DECIMAL(10, 2),
hire_date DATE
);
插入数据
INSERT INTO departments (dept_id, dept_name) VALUES
(10, 'Engineering'),
(20, 'Sales'),
(30, 'Marketing'),
(40, 'HR'),
(50, 'Finance'),
(60, 'IT'),
(70, 'Operations'),
(80, 'Research'),
(90, 'Support'),
(100, 'Design');
INSERTINTO employees (id, name, department_id, salary, hire_date) VALUES
(1, 'Alice', 10, 62000.00, '2023-02-10'),
(2, 'Bob', 20, 78000.00, '2022-07-15'),
(3, 'Charlie', 30, 45000.00, '2023-09-05'),
(4, 'David', 40, 55000.00, '2021-12-20'),
(5, 'Eve', 50, 67000.00, '2022-03-18'),
(6, 'Frank', 60, 72000.00, '2023-06-25'),
(7, 'Grace', 70, 49000.00, '2022-11-30'),
(8, 'Hank', 80, 83000.00, '2023-04-12'),
(9, 'Ivy', NULL, 59000.00, '2022-08-22'),
(10, 'Jack', 90, 64000.00, '2023-01-08');
查询语句
SELECT d.dept_name, COUNT(e.id) AS emp_count, AVG(e.salary) AS avg_salary
FROM departments d
LEFTJOIN (
SELECTid, name, department_id, salary, hire_date
FROM employees
WHERE salary > (SELECTAVG(salary) FROM employees WHERE hire_date >= '2022-01-01')
) e ON d.dept_id = e.department_id
WHERE e.hire_date >= '2022-01-01'
GROUPBY d.dept_name
HAVINGCOUNT(e.id) > 0
ORDERBY avg_salary DESC;
期望答案
| dept_name | emp_count | avg_salary |
| --------- | --------- | ---------- |
| Research | 1 | 83000.00 |
| Sales | 1 | 78000.00 |
| IT | 1 | 72000.00 |
| Finance | 1 | 67000.00 |
查询结果
dept_name | emp_count | avg_salary
-------------|-----------|-----------
Research | 1 | 83000.00
Sales | 1 | 78000.00
IT | 1 | 72000.00
Finance | 1 | 67000.00
执行过程
hire_date >= '2022-01-01'
的员工,共 9 人。employees
表中选择工资高于 64,333.33 的员工,得到员工 2、5、6、8。department_id
连接,得到各部门的员工信息。hire_date >= '2022-01-01'
的员工(已由子查询确保)。最终结果
部门 Research
、Sales
、IT
和 Finance
各有一名员工,平均工资分别为 83,000.00、78,000.00、72,000.00 和 67,000.00,按降序排列。
32B 大模型可以得到正确的结果,也清晰列出了执行过程和中间结果。说明该模型可以正确的理解任务并进行推理。
查询结果
+----------------+--------+-------------+
| dept_name | emp_count | avg_salary |
+----------------+--------+-------------+
| Research | 1 | 83000.00 |
| Sales | 1 | 78000.00 |
| IT | 1 | 72000.00 |
| Finance | 1 | 67000.00 |
| Support | 1 | 64000.00 |
+----------------+--------+-------------+
执行过程
employees
表中所有员工的平均工资为 63400.00。departments
表,部门 ID 分别为 20、50、60、80、90。结果解释
结果按平均工资降序排列。
相比 32B,执行步骤相对比较简洁,不过步骤是正确的。 虽然步骤正确,但查询结果比预期多了一条数据(Support,1,64000)。
原因:计算员工平均工资步骤计算有问题,这步骤应该是先根据 WHERE 条件筛选出 hire_date >= '2022-01-01'
的员工,再计算平均工资。 7B 模型没有筛选,直接计算的是全表的员工平均工资。
该模型可以理解该任务,但在推理过程中比较容易犯错。
最终结果
执行过程
departments
表和 employees
表,确保数据正确。SELECT FROM employees WHERE salary > (SELECT AVG(salary) FROM employees WHERE hire_date >= '2022-01-01')
来计算平均工资。departments
表和 employees
表,使用 LEFT JOIN,确保 departments
表中的 dept_id
与 employees
表中的 部门_id
匹配。e.hire_date >= '2022-01-01'
d.dept_id = e.department_id
emp_count
和 avg_salary
进行分组,然后排序 avg_salary
从高到低。给出的执行步骤是正确的。但是模型没能给出中间结果,最终输出的结果也是毫无意义的乱数据。
显然,1.5B 模型只能理解这个任务但无法进行推理。
模型 | 1.5B | 7B | 32B |
---|---|---|---|
SQL 执行步骤 | 正确 | 正确 | 正确 |
中间结果 | 无 | 有,但错误 | 有 |
最终结果 | 错误 | 错误 | 正确 |
可以看出,随着参数量的增加,模型对 SQL 语句在准确性、完整性和推理性上都有显著提升。
1.5B 模型 不能完成任务,但能给出正确的执行步骤,说明它可以理解 SQL 结构,在一些简易场景下往往可以胜任,比如 根据文字生成查询语句。
7B 模型 具备了一定的推理能力,但他在细节上犯错了,导致答案错了。用它来做一些简单推理的任务还是可以的。
32B 模型 给出了正确的答案。它可以胜任更多的场景,除了复杂的 SQL 任务外,还能提供一些诊断错误或优化查询等功能。
模型参数量对 SQL 能力的提升起着关键作用。 小规模模型适合简单任务,中规模模型能应对中等复杂度的需求,而大规模模型则在复杂 SQL 任务中表现出色。但即使是大规模模型,在处理递归查询和特别复杂的 SQL 也可能出错,尤其是在缺乏领域知识的情况下,对此,我们可以进行微调来提高正确率。
除此之外,更大的模型意味着更高的延迟和消耗更多的资源,上文中的 1.5B 模型的令牌生成速度通常是 32B 模型的五倍以上,我们需根据具体任务需求权衡性能与成本来选择合适的模型。
想要了解当下大模型在 SQL 能力上的差异,可以通过 SCALE,7 月榜单已更新,欢迎查看!
SCALE:为专业 SQL 任务,选专业 AI 模型。
✨ Github:https://github.com/actiontech/sql-llm-benchmark
💻 官网:https://sql-llm-leaderboard.com/