过去一年,GraphRAG技术发展如火如荼,尤其是基于关键词、向量驱动的知识检索方法不胜枚举。然而通过子图召回的检索方式,对用户真实查询意图的定位仍缺乏足够的准确度。我们需要更直接的方式,将自然语言查询直接翻译为图查询语句,即Text2GQL。在文章
《ChatTuGraph:通过大模型“与图对话”》中我曾阐述,由于图查询语言的标准普及仍在起步阶段,图查询微调语料的收集和获取仍是困难重重,为此我们提出了基于“语法制导的图查询语料生成”的方法,以自动化的方式合成图查询微调语料数据集。
来自中国科学技术大学的TuGraph社区开源贡献者庞红玉同学,在OSPP(开源之夏)项目中,基于Awesome-Text2GQL开源项目完成了Text2GQL微调语料自动生成框架的搭建与优化,并获得了“开源之夏2024最佳质量奖”。语料生成框架的代码当下已全部开源,欢迎业内同仁共建图查询语料数据集。
同时,TuGraph团队也基于DB-GPT-Hub项目构建了Text2GQL的整体微调链路与效果评估(准确率92%以上),并开放了微调数据集和微调模型,欢迎大家体验使用。
接下来,向大家介绍庞同学在Awesome-Text2GQL中完成的具体工作。
1. 引言
通过智能体Agent与DBMS交互完成数据查询和系统运维调优等工作是未来的技术趋势,其中重要的一环是Text2SQL/Text2GQL(GQL,Graph Query Language)类的任务。在面向图数据库的Text2GQL任务中,我们需要解决训练数据少、数据标注成本高的问题,由于图查询语言标准ISO GQL刚刚发布,行业内多种查询语法并存,标准语料数据匮乏的问题格外严峻。
2. Text2GQL
Text2GQL任务与Text2SQL任务类似,每条语料主要由两部分组成:
l Question:人类可阅读的自然语言,表明数据库操作人员的操作意图。
l Query:查询语句GQL (Graph Query Language)Query,图数据库可理解的查询语言。
不同于Text2SQL,在Text2GQL领域,由于图查询语言尚未统一,各类图查询语言的训练语料严重缺乏,当务之急是基于少量的人工标注语料,找到一种低成本的方法快速生成各类图查询语言对应的训练语料。
TuGraph在《ChatTuGraph:通过大模型“与图对话”》中创新性的提出了基于语法制导的语料生成策略,并在TuGraph-Analytics上进行了测试。这种策略将表达式模板(Query模板)与提示词模板(Question模板)作为输入,通过表达式实例(Query)生成器与提示词实例(Question)生成器,结合实际的schema批量生成出大量的表达式实例和对应的提示词实例。生成的提示词实例也可以借助LLM进一步泛化生成多样的自然语言提示词文本,来确保大模型能够识别同一个查询问题的多样化自然语言表达方式。
Awesome-Text2GQL项目基于这一策略在TuGraph-DB上构建了基于Cypher语言的语料生成,证明了TuGraph提出的这一策略可以快速的在不同图查询语言间迁移,同时在上述策略的基础上进行了进一步的升级,增加了表达式实例生成的随机性,并优化了提示词实例的可读性。
3. Awesome-Text2GQL
Awesome-Text2GQL旨在实现一个用于生成面向Text2GQL任务的大语言模型微调(Large Language Models Fine-tune)语料数据集的语料生成框架。Awesome-Text2GQL使用基于语法制导的语料生成策略构建了一条端到端的语料生成->语料泛化->语料测试->构造数据集->大语言模型微调->应用的端到端的语料生成-LLM微调-应用全链路。
本篇文章将为读者简要介绍Awesome-Text2GQL语料生成框架的整体架构,并将在后续推文中带领大家深入语料生成框架实现细节与使用方法,通过Awesome-Text2GQL+DB-GPT+TuGraph-DB实现与图数据库对话。
3.1 框架设计
Awesome-Text2GQL语料生成框架架构图
语料生成框架由基于Antlr4的语料生成模块(Corpus Generation Module based on Antlr4)和基于LLMs的语料泛化模块(Corpus Generalization Module based on LLMs)两部分组成:
语料生成模块:TuGraph-DB中的查询语言的词法和语法基于Antlr4在.g4语法文件中进行描述,因此我们基于Antlr4生成语法文件对应的词法分析器和语法分析器,输入的Query模板在经过词法分析、语法分析后将得到AST,访问其中的节点进行语义分析,获取查询的模式后结合schema与实际数据集就可以对Query模板进行替换,生成丰富的Query实例和Question实例。
基于大语言模型的语料泛化模块:通过借助大语言模型的能力,对现有的语料进一步泛化得到多样的自然语言样本Question实例,也可以借助大语言模型自身的翻译能力对输入的Query实例进行翻译生成对应的Qusetion实例。
Awesome-Text2GQL语料生成框架具有乘法增加能力,框架可生成语料数为:
n_template、n_schema、n_match_pattern分别为Query模板数量、schema数量和每个schema中能够匹配Query模板查询模式的实例数。k则指的是手动设定的语料泛化模块中对一个Query实例对应的Question实例的泛化倍数。
整体来看,语料生成框架包含Query实例生成(框架图中橙色星号1)、Question实例生成(框架图中橙色星号2)、Question实例泛化(框架图中橙色星号3)三大功能,并使用了多种方式来实现语料的Question生成和Question泛化两个功能来满足不同场景下的功能需求。
模板中缺少Query对应的Question,此时我们可以直接利用大语言模型的能力来快速生成对应的Question,再通过少量的人工清洗和标注来构造符合条件的语料模板(对应语料泛化模块的功能一)。
设计了语料模板辅助大模型生成的方法,以提取Query的高层语义信息(对应语料泛化模块的功能四)。
基于解析的翻译式Question生成方法也可以作为可行方案(对应语料生成模块的翻译器Translator)。
直接泛化Question实例(对应语料泛化模块的功能二)。
在泛化Question实例时将Query实例提供给大模型,确保大模型在泛化Question实例时不会损失关键信息(对应语料泛化模块的功能三)。
3.2 基于Antlr4的语料生成
在解析Query得到抽象语法树(AST)后,通过对AST实例化来生成多样的Query。简单的AST分支如OPTIONAL、SKIP、LIMIT可以一个小概率扩展到生成的Query中,生成的Query必须语法正确,且必须是在当前数据库实例中可实际执行的。
解析得到抽象语法树(AST)后,通过对AST进一步进行语义分析,逐项翻译生成相应的Question。
3.3 基于LLMs的语料泛化模块
Step1:设置本模块的执行任务并读取相应需要被处理的语料。
Step2:根据给定的执行任务生成具体的提示词prompt。
Step3:调用大模型的api获得执行后的结果,Awesome-Text2GQL目前已经支持。
Step4:经过后处理对大模型产生的结果进行格式转换,如删除多余的空行、多余的编号、不需要的符号如加粗符**等等。
基于LLMs的语料泛化模块主要可用于实现以下四个功能:
简单的Query语句可以直接借助大语言模型的能力,获得相应的训练语料的Question部分。本功能也可以用于当有一批未标注的Query语句时,直接通过大模型对这些Query进行预标注,来辅助人工标注数据,这样仅需少量的人工清洗成本,而无需高昂的人工标注成本。
在泛化时,大语言模型直接对输入的Question进行泛化。
根据输入的Query和Question进一步泛化得到相同语义的Question。此功能在功能二的基础上,在泛化Question时,可以通过补充Query的信息,帮助大模型进一步理解需要泛化的Question文本的含义,使得泛化的结果更贴近Query的操作执行意图。
根据输入成对的Query和Question语料组成的模板,理解相同句式的Query的含义,并生成Query对应的Question。此功能在功能一的基础上,通过给大模型提供相同句式的模板,来帮助大模型理解某类Query句子更高层次的语义含义,而不是仅仅依靠预训练基座模型以前学习过的图数据库查询的相关信息。
3.4 工作流程
整个语料生成框架可以通过排列组合来满足不同场景下的语料生成需求,这里介绍一个典型的应用Awesome-Text2GQL语料生成框架来生成语料的工作流程:
Step1:输入多条语料模板,使用语料生成框架中的实例化生成器Instantiator来逐模板、逐Schema地生成符合模板匹配模式的多条Query。
Step2:之后将上一步生成的Query通过语料模板辅助大模型生成Question的生成方式,来得到Query-Question语料对。
Step3:对Query-Question语料对的自然语言部分进一步进行泛化,得到多样的语料。
Step4:对上述生成的语料进行语法检查、生成Schema信息的自然语言表达、语料格式转换以及数据集划分,得到可直接用于大语言模型微调的数据集。
4. 总结与展望
Text2GQL是构建图数据库AI Agent的第一步,既可以运用大模型技术来降低图数据库的学习和应用成本,也可以随着未来Graph RAG(Retrieval Augmented Generation,检索增强生成)技术的应用,缓解大模型推理的幻觉问题。在这里,我们也提出对Awesome-Text2GQL未来的改进方向:
图查询语言在表达相同查询意图时,查询语句往往具有多种写法,而查询引擎中针对不同写法的优化程度时不同的,两种表达相同语义的查询语句的实际性能可能会有很大的差距。如何使得生成的图查询语句更加适应查询引擎的能力是未来工作的一个方向。
当前图查询语言百花齐放,而Awesome-Text2GQL作为开源的Text2GQL语料生成框架,未来也将支持更多的图查询语言,并进一步降低新的查询语言的迁移成本,为图数据库迈向AI时代打下坚实的基础。
- gradle下mybatis自动生成框架的使用
自动生成框架的意义 主要为了解决人为添加mapper,模型等工作,减少错误,提交效率! 添加引用build.gradle configurations { mybatisGenerator } myb ...
- Go 语言,开源服务端代码自动生成 框架 - EasyGoServer
EasyGoServer 作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblog ...
- 优于 swagger 的 java markdown 文档自动生成框架-01-入门使用
设计初衷 节约时间 Java 文档一直是一个大问题. 很多项目不写文档,即使写文档,对于开发人员来说也是非常痛苦的. 不写文档的缺点自不用多少,手动写文档的缺点也显而易见: 非常浪费时间,而且会出错. ...
- swagger:API在线文档自动生成框架
传统的API从开发测试开始我们经常借用类似Postman.fiddle等等去做接口测试等等工具:Swagger 为API的在线测试.在线文档提供了一个新的简便的解决方案: NET 使用Swagger ...
- android studio 插件开发(自动生成框架代码插件)
android studio 插件开发 起因 去年公司开始上新项目,正好android在架构这方面的讨论也开始多了起来,于是mvp架构模型就进入我们技术选择方案里面,mvp有很多好处,但是有一个非常麻 ...
- 设计数据库 ER 图太麻烦?不妨试试这两款工具,自动生成数据库 ER 图!!!
忙,真忙 点赞再看,养成习惯,微信搜索『程序通事』,关注就完事了! 点击查看更多精彩的文章 这两个星期真是巨忙,年前有个项目因为各种莫名原因,一直拖到这个月才开始真正测试.然后上周又接到新需求,马不停 ...
- C# 自动生成代码API文档
暂时没学会正规的转载style临时记录一下 NET中的规范标准注释(一) -- XML注释标签讲解 http://www.cnblogs.com/mq0036/p/3544264.html NET中的 ...
- 基于数据库的自动化生成工具,自动生成JavaBean、数据库文档、框架代码等(v5.8.8版)
TableGo v5.8.8版震撼发布,此次版本更新如下: 1.新增两个扩展字段,用于生成自定义模板时使用. 2.自定义模板新增模板目录,可以选择不同分类目录下的模 ...
- 基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.0.0版)
TableGo v6.0.0 版震撼发布,此次版本更新如下: 1.UI界面大改版,组件大调整,提升界面功能的可扩展性. 2.新增BeautyEye主题,界面更加清新美观,也可以通过配置切换到原生Jav ...
- 9.1.2 asp.net core 自动生成组合查询
在做系统的时候,经常遇到前台录入一大堆的查询条件,然后点击查询提交后台,在Controller里面生成对应的查询SQL或者表达式,数据库执行再将结果返回客户端. 例如如下页面,输入三个条件,日志类型. ...
随机推荐
- 写代码被大语言模型坑之使用LocalDateTime比较两个时间差了几天
自从去年ChatGPT3.5发布后使用了几次,现在写代码基本上离不开它和它的衍生产品们了.一方面查资料很方便,快速提炼要点总结:另一方面想写什么样的代码一问就能生成出来,功能大差不差,稍微改改就能用, ...
- 一文彻底搞透Redis的数据类型及具体的应用场景
Redis 提供了丰富的数据类型,每种数据类型都有其独特的存储结构和操作方法,可以满足不同的业务场景需求.下面详细介绍 Redis 支持的主要数据类型及其底层实现,并结合具体的应用场景说明其使用. 1 ...
- SpringMvc请求注解@ResponseBody
1.概念 注解 @ResponseBody,使用在控制层(controller)的方法上. 2.作用 作用:将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端. ...
- 使用sklearn中的Adaboost分类器来实现ORL人脸分类
使用sklearn中的Adaboost分类器来实现ORL人脸分类 前言:博主上网浏览使用Adaboost实现人脸分类时,发现并没有分类,大部分全都是关于人脸识别检测的,并没有实现对某个人的精准分类(例 ...
- C++ 函数模板与类模板
目录 16.1.1 函数模板 16.1.2 类模板 定义类模板 实例化模板 在类外定义成员函数 类模板成员函数的实例化 类模板和友元 模板类型别名 类模板参数的static成员 16.1.3 模板参数 ...
- 基于Java+SpringBoot+Mysql实现的古诗词平台功能设计与实现四
一.前言介绍: 1.1 项目摘要 随着信息技术的迅猛发展和数字化时代的到来,传统文化与现代科技的融合已成为一种趋势.古诗词作为中华民族的文化瑰宝,具有深厚的历史底蕴和独特的艺术魅力.然而,在现代社会中 ...
- java 死锁问题排查
排查过程 1.识别死锁现象 通常,死锁会表现为应用程序挂起,不响应用户请求或 cpu 使用率下降. 2.收集线程转储 当应用出现不响应时,可以使用以下方法收集线程转储: jstack -l 进程ID ...
- Python版本与Jupyter记录
最近使用Python的时候,遇到一个版本问题.我本地安装的Python版本是3.8.0,在使用match...case...语法时,提示如下报错: 查询之后,才知晓3.8.0还没有match语法,ma ...
- 使用 SemanticKernel 对接 Ollma
前面的 2 篇文章已经介绍了 ollama 的基本情况.我们也已经能在本地跟 LLM 进行聊天了.但是如何使用代码跟 LLM 进行交互呢?如果是 C# 选手那自然是使用 SK (SemanticKer ...
- 调用xlst执行转换
try { //Create a new XslTransform object. XslCompiledTransform xslt = new XslCompiledTransform(); // ...