是不是还在困扰于大模型生成SQL不确定,相近语义的提问大模型理解很随机,复杂业务的理解不让人满意, 分明调整一个条件就能正确的SQL屡试不好... 上面所有的问题,很大程度上都可以用训练来解决。
VannaAI
先从下图回顾下 VannaAI 能力:
• 适配任意数据库,生成和执行SQL语句,
• 可用任意向量库存储训练数据,
• 支持任意大模型执行推理,
• 多种前端适配,供用户使用。
训练
上篇文章讲了怎么用 VannaAI 的能力和局限,有一部分最重要的内容没讲,就是训练。
VannaAI 支持自己训练模型来优化、强化,和适配自己业务的SQL生成能力,是区别与其他 Chat2SQL 框架的最重要特性。
我们先看个架构图,了解下 VannaAI 的这个训练问答过程,再进行深入。
Vanna.AI训练问答过程训练数据
训练数据的示例可以是DDL 建表语句、SQL 查询或有关数据库、业务或行业的任何其他基于文本的文档。
这也基本上涵盖了我们SQL生成场景的方方面面。
训练函数
我们可以通过vn.train这个包装函数来进行训练。
训练系统,也就是位于 LLM 之上的检索增强层(RAG),是针对大型数据库和复杂业务场景生成的保证。下面展示如何使用。
DDL
首先是 DDL 建表语句,这些语句让系统了解有哪些表、列和数据类型可用。
比如最简单的:
vn.train(ddl="CREATE TABLE my_table (id INT, name TEXT)")文档
文档可以是关于您的数据库、业务或行业的任何重要文档,这些文档可能是 LLM 了解用户问题的背景所必需的,比如:
vn.train(documentation="Our business defines XYZ as ABC")SQL 语句
对系统最有帮助的事情之一当然是让系统了解组织中常用的 SQL 查询。这将帮助系统了解所提问题的背景。
vn.train(sql="SELECT col1, col2, col3 FROM my_table")问题-SQL 对
我们还可以使用问题-SQL对来训练系统。这是训练系统的最直接方法,并且最有助于系统理解所提问题的上下文。
这个类似于传统的大模型训练,是很有效的方法,能快速有效帮助Vanna组织出合适的提示语给大模型。
vn.train(
question="What is the average age of our customers?",
sql="SELECT AVG(age) FROM customers"
)
问题-SQL对包含大量嵌入信息,系统可以使用这些信息来理解问题的上下文。当用户倾向于提出具有很多歧义的问题时,尤其有效, 也就是说优秀的问题-SQL训练,能让系统处理复杂、有歧义的问答更加准确。。
查看训练数据
当然,Vanna.AI 也提供了探索训练数据的功能,使用get_training_data即可查看训练数据。
vn.get_training_data()删除无用的训练数据
训练数据的质量对于模型的训练效果至关重要,因此需要确保数据都是有效、有用的。
当我们不小心训练了一些无效和重复数据时,可以使用删除功能删除掉无用的数据点。
vn.remove_training_data( id = 'my-training-data-id' )
此外,不要在这些步骤中放入敏感或过时的信息,因为它可能会在某种程度上影响模型的表现。
高级功能
Vanna.AI 还支持训练计划和自动训练。
自动训练
最简单的方案就是用笔记本运行程序,然后你的问题都可以作为训练数据进行训练,还可以对结果进行判断是否正确,或者手动修正。
除了用户问题之外,连接数据库之后,Vanna.AI 会自动查询所有表结构,进行训练;如果你使用大数据工具或服务, 自动训练这个流程会更具生产力。
训练计划
训练计划基本上就是将数据库信息架构分解成可供 LLM 参考的小块。这是一种快速使用大量数据训练系统的好方法。
使用训练计划也非常简单:
df_information_schema = vn.run_sql("SELECT * FROM INFORMATION_SCHEMA.COLUMNS")
plan = vn.get_training_plan_generic(df_information_schema)
vn.train(plan=plan)演示DDL 训练
我这里还用上次的数据库,执行:
df_ddl = vn.run_sql("SELECT type, sql FROM sqlite_master WHERE sql is not null")
for ddl in df_ddl['sql'].to_list():
vn.train(ddl=ddl)
上面代码执行一次就够了,不然会添加更多的训练数据。
上面代码会执行 DDL 训练,比如如下的建表语句:
Adding ddl: CREATE TABLE [Album]
(
[AlbumId] INTEGER NOT NULL,
[Title] NVARCHAR(160) NOT NULL,
[ArtistId] INTEGER NOT NULL,
CONSTRAINT [PK_Album] PRIMARY KEY ([AlbumId]),
FOREIGN KEY ([ArtistId]) REFERENCES [Artist] ([ArtistId])
ON DELETE NO ACTION ON UPDATE NO ACTION
)
Adding ddl: CREATE TABLE [Artist]
(
[ArtistId] INTEGER NOT NULL,
[Name] NVARCHAR(120),
CONSTRAINT [PK_Artist] PRIMARY KEY ([ArtistId])
)查看训练数据
training_data = vn.get_training_data()
training_data
可以看到训练数据的id,类型,内容:
启动UI
我们来启动 Vanna 自带的 FlaskApp(注意替换自己的Key,也可以完全本地搭建哈):
可以看到如下界面:
可以直接提问,比如我问「有哪些艺术家受欢迎」,他给出了我专辑最多的艺术家:
我们也可以在界面上点击查看训练数据,
可以直接点击删除训练数据,或者手动添加训练数据:
总结
前面已经提到,支持RAG和训练是 Vanna.AI 在 SQL 生成领域的两个亮点, 有了这两个能力之后,可以帮助普通用户快速的构建一下能力:
• 大型数据库的支持,
• 受限于上下文大小等因素,传统的 SQL 生成很难满足大型数据库的需求;
• 使用业务来训练SQL生成,
• 传统的大模型训练,数据结构复杂、调优复杂、成本高,一般企业做起来比较困难,
• 基于SQL、文档、问答的训练可以让企业快速应用,而没有很高的门槛。
领取专属 10元无门槛券
私享最新 技术干货