Qwen for Tugraph:自然语言至图查询语言翻译大模型微调最佳实践
在图数据库的应用场景中,自然语言至图查询语言的高效转换一直是行业中的重要挑战。本次实践基于阿里云 Qwen 大模型,围绕 TuGraph 图数据库的需求,探索并验证了一套高效的大模型微调方案,显著提升了模型生成 Cypher 查询语句的能力。通过数据清洗、两阶段微调方法以及两模型推理框架等一系列创新策略,我们成功解决了图查询语言翻译任务中的核心问题。本方案在 2024 CCF 大数据与计算智能大赛 “AI for Tugraph 小样本条件下自然语言至图查询语言翻译大模型微调” 赛道中脱颖而出,荣获一等奖,并且在全国总决赛中斩获最佳商业价值奖,充分展现了其技术有效性与商业化潜力。本文将详细分享本次微调任务的技术框架、最佳实践与关键经验,希望为 Qwen 大模型在图数据库行业中的应用提供有价值的参考。
1. 背景与目标
1.1 背景介绍
随着图数据库在知识图谱、金融风控、推荐系统等领域的广泛应用,其灵活的关系建模和高效的复杂查询能力逐渐成为数据管理的重要工具。近年来,随着大语言模型(LLM)和Text2SQL技术的快速发展,传统数据库的自然语言查询已经取得了突破性进展。然而,对于图数据库,由于查询语言复杂性更高,且缺乏大规模标注数据,相关研究仍处于探索阶段。
本次实践基于阿里Qwen2.5-32B-Coder-Instruct、Qwen2.5-14B-Instruct大模型,聚焦于如何通过微调将大模型的自然语言理解能力和上下文推理能力迁移至图数据库场景。我们面向TuGraph数据库,研究了如何将自然语言翻译为TuGraph支持的Cypher查询语句,探索从数据准备到模型优化的全流程解决方案,为图数据库的智能化查询提供了一种可行路径。
1.2 任务目标
- 利用Qwen模型,设计并且实现一套高效的微调方法,微调出一个能够将自然语言准确翻译为可在TuGraph正确执行的Cypher语句的模型。
- 追求生成cypher语句的实际可执行性和准确性,最终实现一个具备商业化和实际应用潜力的智能化查询方案,降低用户使用图数据库的技术门槛。
2. 数据准备与清洗
以下是模型微调训练数据生成过程的概览。首先是数据收集阶段,我们利用TuGraph官方提供的数据和官网示例样本作为种子知识,基于这些数据通过调用Qwen模型扩充训练样本,并从网络上收集了超过8000条相关数据。接下来进入数据清洗阶段,我们对之前收集的所有训练样本进行详尽的数据筛选和处理工作,以确保数据的质量和适用性。下面将详细描述数据构建及清洗过程。
2.1 数据来源与构建
训练数据主要来源于以下几个方面:
- 官方数据:基于官方提供的200条训练样本,进一步从TuGraph Cypher官网收集了100余条示例数据,确保覆盖几乎所有TuGraph支持的语法点。
- 数据扩充:通过清洗和筛选上一步获得的官方数据,得到约200条种子样本,通过调用Qwen模型接口并结合不同schema(如movie、yago、finbench、the_three_body和common)生成10条逻辑、提问方式等方面相似的新样本,最终扩充至1000余条样本。
- 网络收集:从网络上收集了7000余条openCypher样本数据,涵盖简单和复杂的schema以及从简单到复杂逻辑的各种查询,提升了模型的泛化能力和处理复杂任务的能力。
2.2 数据清洗策略
为确保数据集的高质量,我们对初步构建的数据集进行了严格清洗,步骤如下:
- 语法检查:使用官方语法检查工具,剔除所有语法错误的样本。
- 执行验证:将语法正确的样本在TuGraph实例中逐条执行,筛除无法实际运行的Cypher语句。
- 人工筛查:对样本进行人工检查,确保执行结果符合预期,进一步提升数据质量。
通过以上步骤,我们构建了一个包含8000余条样本的高质量数据集。
清洗后的数据集具有以下特点:
- 准确性高:所有样本均通过语法检查、执行验证和人工筛查。
- 噪声小:剔除错误样本和无法执行的样本。
- 覆盖广泛:涵盖全面的语法点和多样化的查询需求。
清洗后的数据划分为三部分:
- 第一阶段微调训练集(train_data1):约6800条样本,用于模型初步训练。这部分样本更多,但存在噪音,并且大部分为相对简单的查询样本。
- 第二阶段微调训练集(train_data2):约950条样本,用于精细化训练。这部分样本经过人工的严格筛查,数据质量得到绝对保证,并且这部分数据包含相对复杂的查询样本。
- 测试集(test_data):包含训练集中未出现的schema样本,用于评估模型泛化能力。
3. 微调框架设计
3.1 微调技术栈
在本次任务中,我们采用了高效的技术框架和工具链来实现对大模型的微调,以满足自然语言到图查询语言翻译任务的需求。以下是具体的技术栈介绍:
1. 大模型选择
- Qwen2.5-32B-Coder-Instruct:用于一次推理阶段的核心大模型,具备卓越的自然语言理解与代码生成能力,适合处理复杂的图查询语言翻译任务。
- Qwen2.5-14B-Instruct:用于二次纠错推理阶段的模型,结合语法检查结果进一步优化输出质量,确保生成的Cypher语句能够正确执行。
2. 微调框架
我们采用轻量级、高效的微调框架ms-wift(官网https://swift.readthedocs.io/zh-cn/latest/index.html),便于对大模型进行任务适配。ms-swift是魔搭社区提供的大模型与多模态大模型微调部署框架,现已支持450+大模型与150+多模态大模型的训练(预训练、微调、人类对齐)、推理、评测、量化与部署。除此之外,ms-swift汇集了最新的训练技术,包括LoRA、QLoRA、Llama-Pro、LongLoRA、GaLore、Q-GaLore、LoRA+、LISA、DoRA、FourierFt、ReFT、UnSloth、和Liger等。在微调中,我们采用LoRA微调方式,大幅降低显存需求和计算成本。
3. 环境配置
为了满足大模型微调对硬件资源的高要求,我们采用了以下配置:
- CUDA版本:支持CUDA 11.6及以上版本,确保与深度学习框架的兼容性。
- GPU配置:微调Qwen2.5-32B-Coder-Instruct模型时,使用 4块4090显卡(每块24GB显存) 或 8块3090显卡(每块10GB显存),通过分布式训练方式实现任务处理。微调Qwen2.5-14B-Instruct时,使用 2块4090显卡(每块24GB显存) 或 4块3090显卡(每块10GB显存)
- 硬件获取:为降低成本,可以选择通过云服务平台或GPU服务器租赁服务完成微调。当前市场上主流云服务商(如Autodl)都提供支持大规模深度学习的GPU租赁服务,也不算太贵。
3.2 两阶段微调方法
为提升大模型在自然语言到图查询语言翻译任务中的表现,我们设计并采用了两阶段微调策略,以兼顾任务适配性与结果质量的需求,整个微调框架如下图所示。
以下是具体的方法及其优势介绍。
1. 第一阶段微调:构建任务理解能力
- 数据特点:在第一阶段,我们使用了大规模数据集,数据中可能存在一定程度的噪声,但覆盖范围广,能够为模型提供丰富的上下文和任务理解信号。
- 微调策略:仅进行一个epoch的微调,主要目的是通过大规模数据的泛化能力,帮助模型快速掌握图查询语言翻译任务的基本模式与核心逻辑,为后续优化打下良好的基础。
- 目标效果:在保证训练时间与资源消耗可控的情况下,使模型形成对自然语言查询需求的初步适配能力。
2. 第二阶段微调:精细优化模型性能
- 数据特点:第二阶段采用高质量小规模数据集,经过严格的数据清洗和标注,确保所有样本无噪声且高度准确。
- 训练策略:在小数据量的基础上进行3个epoch的训练。多轮训练能够细化模型参数调整,提升其在任务中的准确性与精度。
- 目标效果:通过深度训练,让模型在理解用户输入和生成Cypher语句时更贴合实际需求,显著降低语法错误和语义误差的发生率。
3. 两阶段策略的优势
- 全面适配任务需求:第一阶段微调通过引入大规模数据,为模型提供了多样化的训练样本,快速适配任务基础,使得模型能够广泛覆盖不同形式的自然语言查询描述。
- 保障输出质量:第二阶段微调则依托高质量数据集,对模型生成的Cypher语句进行精细化调整,从而在结果准确性和执行效果上实现进一步提升。
- 资源效率与性能优化兼顾:这种分阶段的策略有效平衡了训练资源的开销与模型性能的提升,使得我们在有限硬件资源条件下完成了高质量的微调任务。
通过两阶段微调方法,模型不仅能适应多样化的用户自然语言输入,还能够生成能够在TuGraph中正确执行的高精度Cypher语句,为大模型在图数据库领域的实际应用奠定了基础。
3.3 微调实现
1.ms-swift框架安装
在微调过程中,我们需要使用到ms-swift,SWIFT安装 — swift 3.1.0.dev0 文档 为官方的安装教程,下面我结合自己的安装经历详细描述一下安装的办法。
安装分为如下三步:
- 设置为阿里云的镜像源加快安装速度
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
- 安装ms-swift库
pip install 'ms-swift[all]' -U
- 处理transformer版本
pip install transformers==4.45.2 sentence-transformers==3.1.1
这一步非常重要,这个是教程里面没讲的,如果不执行,很有可能会在微调的时候提示版本问题。
到目前为止,我们就安装好了ms-swift库,然后就可以通过直接调用ms-swift库的函数或者使用推理脚本的方式来微调或者推理大模型。下面我们会讲一下Qwen大模型的下载。
2. Qwen模型下载
有两种方式下载模型,一种是通过脚本,另外一种是通过函数调用。下面是函数调用的方式:
- 安装modelscope:=
pip install modelscope
- 通过代码下载模型:
from modelscope.hub.snapshot_download import snapshot_download model_dir = snapshot_download("qwen/Qwen-7B-Chat", revision = 'v1.1.4')
"qwen/Qwen-7B-Chat"这个是你想要下载的模型的Model ID,支持的模型和数据集 — swift 3.1.0.dev0 文档 可以在这里面看支持下载的模型。一般这里会把模型下载到modelscope默认的保存路径。
下面是通过脚本的方式下载。其实这种方式相当于是,你直接写脚本微调或者推理指定的大模型时,ms-swift首先会在默认路径下检查是否有该模型,如果没有该模型就会自动下载该模型,并且也是保存到默认路径。具体的脚本后面会介绍。
如果你希望修改下载模型时保存的默认路径,可以使用export MODELSCOPE_CACHE="指定路径",这时模型就会下载到指定的路径下。
我们使用ms-swift提供的脚本参考,设计自己的微调脚本,微调时的脚本如下:
nproc_per_node=5 CUDA_VISIBLE_DEVICES=0,1,2,3,4\ NPROC_PER_NODE=$nproc_per_node \ swift sft \ --model_type qwen2_5-14b \ --sft_type lora \ --tuner_backend peft \ --dtype AUTO \ --output_dir /output \ --dataset /data.json \ --num_train_epochs 3 \ --max_length 2048 \ --eval_steps 20 \ --check_dataset_strategy warning \ --lora_rank 8 \ --lora_alpha 32 \ --lora_dropout_p 0.05 \ --lora_target_modules ALL \ --gradient_checkpointing true \ --batch_size 1 \ --weight_decay 0.1 \ --learning_rate 1e-4 \ --gradient_accumulation_steps $(expr 16 / $nproc_per_node) \ --max_grad_norm 0.5 \ --warmup_ratio 0.03 \ --dataset_test_ratio 0.2\ # --use_flash_attn true \ # --deepspeed default-zero3
重点关注的参数:
- CUDA_VISIBLE_DEVICES:是指定gpu卡
- model_type:是指定的模型,指定该模型以后ms-swift首先会在默认路径下检查是否有该模型,如果没有该模型就会自动下载该模型,并且也是保存到默认路径。如果你修改了下载模型时的保存路径,你需要指定--model_id_or_path "./model/Qwen/Qwen2___5-Coder-32B-Instruct" \,把./model/Qwen/Qwen2___5-Coder-32B-Instruct替换成你的实际路径。
- sft_type:微调方式,一般为lora
- output_dir:模型微调权重文件以及微调参数曲线、文件的保存路径
- dataset :你使用的微调数据集的路径
至于其余参数,可以在命令行参数 — swift 3.1.0.dev0 文档这里面参考,里面详细说明了每个参数的作用。另外,当你自己构建数据集来做微调时,需要注意数据集的格式,自定义数据集 — swift 3.1.0.dev0 文档这里面有详细的介绍。
对于前面提到的两阶段微调,都是基于这个脚本进行修改的,主要是修改dataset以及epoch参数。因为我们一二阶段的微调数据集和微调的epoch数不同。
4. Prompt设计与优化
4.1 Prompt设计思路
prompt设计过程中,我们考虑了以下关键部分:
- 角色说明:模型作为TuGraph数据库专家,负责根据自然语言描述生成精确的Cypher查询语句。
- 任务描述:根据用户提供的自然语言需求,生成对应的Cypher查询语句。查询内容应包括顶点类型、边类型、边的属性及其连接的顶点。
- Schema描述:Schema描述应包括:
- 顶点类型及其属性(如电影、用户等)。
- 边类型及其属性(如“好友关系”边及其“since”属性)。
- 边连接的顶点(如电影与演员之间的关系)。
- 任务步骤说明:
- 步骤1:分析自然语言需求,明确查询类型(查询、创建、更新、删除等)及主要实体(顶点、边、属性等)。
- 步骤2:提取关键信息,明确涉及的节点类型、属性、关系类型及查询条件。
- 步骤3:构建条件和属性表达式,并转换为Cypher语法。
- 步骤4:生成对应的Cypher查询语句,确保其格式和逻辑正确。
- 步骤5:进行语法检查,确保生成的Cypher语句无拼写错误和结构问题。
- 注意事项:
- 使用准确的实体命名,确保语句清晰。
- 只返回必要的字段,避免冗余。
- 生成后检查Cypher语句的语法和逻辑正确性。
4.2 Prompt优化实践
我们在小数据集上进行多轮实验,并且根据实验结果优化了我们的prompt设计。优化的时候主要是从如下4个方面来进行:
- 修改不清晰的任务描述
- 调整Schema的描述方式
- 增强任务步骤说明的逻辑性
- 针对生成错误更新注意事项
我们通过实验调整任务描述,确保任务描述清晰明确。在初期,任务描述可能过于模糊,导致模型无法准确理解查询需求。通过实验和反馈,可以优化描述,使目标更加明确,减少歧义,确保模型生成的Cypher语句符合预期。
同时我们更新schema描述方式,在优化Schema描述时,我们明确列出顶点、边的类型及属性,并指出它们之间的关系。这样,模型可以更好地理解数据结构,生成正确的查询语句。
对于任务步骤描述,我们是受推理链的启发,通过输入一个自然语言描述让gpt-4o生成对应的cypher语句,并且给出自己的思考过程,如下图所示。然后我们把这个思考过程进行人工修改和润色,然后放到prompt中作为任务描述,使得模型可以更好的理解任务并且分步执行。
另外,我们针对生成结果中常见的错误(如拼写、语法)优化注意事项。Cypher语句的常见错误包括拼写错误、括号配对不当、语法结构错误等。因此,在Prompt中加入明确的语法检查要求,提醒模型注意这些细节,可以减少错误的发生,提升生成结果的质量。
优化后的Prompt更加清晰、精确,能够有效引导模型生成符合要求的查询语句。通过对任务描述、Schema描述和语法注意事项的优化,模型能够生成更加精确且符合语法规范的Cypher查询语句,下面是我们经过优化以后选出来的最佳prompt:
5.模型推理
我们分别对Qwen2.5-14B-Instruct,Qwen2.5-32B-Coder-Instruct模型都进行了前面介绍的两阶段微调,然后使用它们执行两模型推理任务。两模型推理的具体过程:
- 第一次推理:使用Qwen2.5-32B-Coder-Instruct生成初步Cypher语句。
- 语法检测:通过语法检测工具,筛选出语法正确的语句。
- 纠错推理:对于语法检测不通过的语句,使用Qwen2.5-14B-Instruct模型进行纠错推理,重新生成语句。
合并两次推理结果,构成最终输出。
6. 最佳实践效果
在本次“Qwen for TuGraph: 自然语言至图查询语言翻译大模型微调”实践中,我们探索并验证了一系列高效的方法和策略,为大模型的微调和应用提供了宝贵经验。我们的微调方案最终大大提升了模型生成cypher语句的能力。本次微调方案在2024 CCF大数据与计算智能大赛中,取得了“AI for Tugraph 小样本条件下自然语言至图查询语言翻译大模型微调”赛道一等奖。同时本方案经过专家的线下评审,在总决赛中暂获最佳商业价值奖,不仅体现了我们的微调方案的有效性,更彰显了我们成果的商业化潜力,故希望能作为Qwen大模型在图数据库行业中自然语言至图查询语言的最佳微调实践。
7. 前景展望
本微调方案在商业化应用中具有广阔的前景。在诸如金融反欺诈、知识图谱构建、社交网络分析等对图数据库需求旺盛的行业场景中,这种智能化自然语言查询能力可以极大提升工作效率,降低技术使用门槛,同时助力企业快速响应复杂查询需求。此外,随着大模型技术的不断迭代,我们的方案可以平滑迁移并适配更广泛的场景需求,成为行业中通用的解决方案,推动图数据库的普及与商业价值实现。