首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

训练 Vanna RAG-to-SQL 模型来适配企业级数据库

是不是还在困扰于大模型生成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、文档、问答的训练可以让企业快速应用,而没有很高的门槛。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/Ok3VD3mIJlSyKIGdrFa8Mm-A0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券