以下文章来源于DataSpeed ,作者张文慧
[
DataSpeed .
慢慢积累,稳稳前行,用数据说话,为成长助力
](#)
导读:
大模型浪潮下,如何让其在专业领域 “大显身手”?本文聚焦大数据方向,带来用 DeepSeek 训练 SQL 专家模型的实操指南。 文章细致呈现从环境设置到模型训练、测试、保存的全流程。 无论你是大数据从业者、AI 爱好者,还是想借大模型提效的职场人,都能从中获取实用技巧,动手打造专属 SQL 专家模型,挖掘大模型在专业领域的无限潜力。参考本文,配合有效的数据集,理论上你可以训练任何领域的AI专家。
关注公众号DataSpeed,回复 训练大模型 可以获得本次训练的所有代码,可复用。
1. 背景介绍
最近都在聊大模型做本地知识库的事情,这只是应用的一种,很多人都在想大模型如何做更专业的事情。作为数据人自然也在想大模型如何在大数据方面发光发热。
比如,大模型如何做SQL类型的专家呢?这种情况下,仅仅是知识库已经无法满足了,然而deepseek这样的大模型也不够用,因为他是通用性大模型,需要训练之后才能更好用。
今天就来聊聊如何训练你的大模型。
2. 整体流程
- 如果您是技术人员,并且对具体技术感兴趣,欢迎阅读全文。
- 如果您不是技术人员,或者对具体实现不那么感兴趣,可以跳过第六章,阅读其他章节,相信也会给您带来收获。
为了方便阅读,先来梳理一下整体的流程。
重点在于准备数据集,比如我们要训练SQL专家就要找到有效的数据集。
至于微调工具是很好做的,接下来会详细讲。
本次微调全部基于谷歌的Colab工具,因此不依赖本地的资源,不过请准备一个稳定的梯子哦。
3. 准备微调工具
这里微调工具使用unsloth 和 wandb 。
3.1微调工具unsloth
unsloth微调Llama 3, Mistral和Gemma速度快2-5倍,内存减少80% !unsloth是一个开源项目,它可以比HuggingFace快2-5倍地微调Llama 3、Mistral和Gemma语言模型,同时内存消耗减少80%。
它的使用也十分简单。
pip install unsloth pip install "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git
别急着执行命令,第五章 会详细说的。
3.2 微调工具wandb
wandb是Weights & Biases的缩写,这款工具能够帮助跟踪你的机器学习项目。它能够自动记录模型训练过程中的超参数和输出指标,然后可视化和比较结果,并快速与同事共享结果。
通过wandb,能够给你的机器学习项目带来强大的交互式可视化调试体验,能够自动化记录Python脚本中的图表,并且实时在网页仪表盘展示它的结果,例如,损失函数、准确率、召回率,它能够让你在最短的时间内完成机器学习项目可视化图片的制作。
总结而言,wandb有4项核心功能:
看板:跟踪训练过程,给出可视化结果 报告:保存和共享训练过程中一些细节、有价值的信息 调优:使用超参数调优来优化你训练的模型 工具:数据集和模型版本化
3.2.1 准备wandb key
wandb在使用是需要注册api key,推荐你使用谷歌邮箱登录。官网地址[1]见文末引用。
邮箱登录后选择免费版本即可。如下图,其他内容随意填写。
登录后,会获得你的API KEY,记得做好记录,后面会用到。
如果已经创建项目,可以在项目设置里找到api key。
4. 数据集准备
数据是AI的粮食,经过大数据的投喂之后,AI才能更懂你。常用的数据集平台GitHub、Hugging Face、arXiv,国内有魔搭、阿里云天池。本次案例使用的hugging face上的数据集[2]。
在企业中,你可以使用公司的sql数据集打造更适合企业内部的SQL模型,只要具备sql\_prompt 作为输入 、 sql\_context 、 sql 作为输出,就可以做适合你们业务的大模型了。
4.1 huging face api key
在训练中,需要准备是个hugging face的api key 。邮箱登录后点击个人头像,找到Access Tokens,可以创建key, 如下图
需要创建一个Write类型的api key,否则在使用时可能会出现权限问题,如下图
保存好你的key,下面训练模型时会用到哦。
4.2 数据集介绍
登录hugging face,搜索 synthetic\_text\_to\_sql 可以看到数据集的详细内容,如下图
截至2024年4月,Gretelai/Synthetic\_text\_to\_sql数据集是最大,最多样化的合成文本到SQL数据集,可尽可能尽快。
数据集预览如下:
{ "id": 39325, "domain": "public health", "domain_description": "Community health statistics, infectious disease tracking data, healthcare access metrics, and public health policy analysis.", "sql_complexity": "aggregation", "sql_complexity_description": "aggregation functions (COUNT, SUM, AVG, MIN, MAX, etc.), and HAVING clause", "sql_task_type": "analytics and reporting", "sql_task_type_description": "generating reports, dashboards, and analytical insights", "sql_prompt": "What is the total number of hospital beds in each state?", "sql_context": "CREATE TABLE Beds (State VARCHAR(50), Beds INT); INSERT INTO Beds (State, Beds) VALUES ('California', 100000), ('Texas', 85000), ('New York', 70000);", "sql": "SELECT State, SUM(Beds) FROM Beds GROUP BY State;", "sql_explanation": "This query calculates the total number of hospital beds in each state in the Beds table. It does this by using the SUM function on the Beds column and grouping the results by the State column." }
重点关注sql\_prompt 、 sql\_context 、 sql 。
- sql\_prompt 是sql的自然语言,作为大模型的input
- sql\_context 是数据的解释,可以作为大模型的think
- sql 是最终的sql语句,作为大模型的ouput
5. 训练平台colab
colab全称Colaboratory,是google出版的,官方介绍: 它是一个免费的 Jupyter笔记本环境,不需要进行任何设置就可以使用,并且完全在云端运行。借助 Colaboratory,可以编写和执行代码、保存和共享分析结果,以及利用强大的计算资源,所有这些都可通过浏览器免费使用。简单理解,它就是一个云Jupyter Notebook,不消耗本地资源。
由于他是谷歌产品,因此你需要有一个谷歌账号,然后登录colab官网[3] 即可。
本地案例将借用colab免费的GPU来完成,再也不用虐待我可怜的笔记本了😂 。
6. 开始训练
关注公众号dataspeed,回复 训练大模型 可以获得本次训练的所有代码。
以下是对代码重点讲解。
6.1 api key引入
上文提到过,需要用到unsloth和hugging face的api key,在工程里,点击钥匙图标,添加两个秘钥:
- HF\_TOKEN 是上文注册的hugging face,他的api key
- WB\_TOKEN 是上文注册的wandb ,他的api key
如下图:
6.2 colab设置
前文提到,使用colab免费的GPU,这需要简单的设置一下。【代码执行程序】-> 【更改运行时类型】 -> 【选择T4 GPU】如下图:
使用colab时需要注意几点
- 长时间不在colab页面中,会停止运行
- colab不会长时间保存运行结果,所以最好赶紧运行整个工程
看到这一步,你可以直接看整个工程的代码,也有详细的注释
关注公众号DataSpeed,回复 训练大模型 可以获得本次训练的所有代码。
6.3 install unsloth
安装前面提到的unsloth,需要注意的是 这里运行会比较慢,需要耐心等等。
%%capture !pip install unsloth !pip install --force-reinstall --no-cache-dir --no-deps git+https://github.com/unslothai/unsloth.git
6.4 使用hugging face与unsloth
使用 api key 登录 Hugging face
from huggingface_hub import login from google.colab import userdata hf_token = userdata.get('HF_TOKEN') login(hf_token)
导入wandb库
import wandb wb_token = userdata.get('WB_TOKEN') wandb.login(key=wb_token) run = wandb.init( project='Fine-tune-DeepSeek-R1-Distill-Llama-8B sql to text', # 设置项目名称 - 这里是用于SQL分析的DeepSeek模型微调项目 job_type="training", anonymous="allow"# 允许匿名访问 # "allow"表示即使没有wandb账号的用户也能查看这个项目 )
本次是用的模型 是unsloth提供的: unsloth/DeepSeek-R1-Distill-Llama-8B
模型的加载需要一点时间,请耐心等待 。
6.5 下载与转换数据集
使用hugging face的数据集,上文已经介绍过这个数据集,不再赘述。
!pip install datasets from datasets import load_dataset dataset = load_dataset("gretelai/synthetic_text_to_sql") # 查看数据集结构 print(dataset) # 查看一个样本 print(dataset['train'][0])
接下来对对数据集做转换
EOS_TOKEN = tokenizer.eos_token # Must add EOS_TOKEN # 长时间会话会过期,重头执行一遍即可 # 数据集 重点分为 sql_prompt 作为输入 、 sql_context 、 sql 作为输出 和上一行三种对应 def switch_and_format_prompt(examples): inputs = examples["sql_prompt"] context = examples["sql_context"] outputs = examples["sql"] texts = [] for input, context, output in zip(inputs, context, outputs): text = train_prompt_style.format(input, context, output) + EOS_TOKEN texts.append(text) return { "text": texts, } # 应用转换 dataset = dataset.map(switch_and_format_prompt, batched = True)
6.6 模型设置
训练前需要对模型做一些简单的设置,代码中有详细的注释
模型设置:
model = FastLanguageModel.get_peft_model( model, r=16, # LoRA的秩(rank)值,决定了低秩矩阵的维度,较大的r值(如16)可以提供更强的模型表达能力,但会增加参数量和计算开销,较小的r值(如4或8)则会减少参数量,但可能影响模型性能,通常在4-16之间选择,需要在性能和效率之间权衡 target_modules=[ #指定需要应用LoRA微调的模块列表,q_proj, k_proj, v_proj: 注意力机制中的查询、键、值投影层 "q_proj", "k_proj", "v_proj", "o_proj", #注意力输出投影层 "gate_proj", "up_proj", "down_proj", ], lora_alpha=16, #缩放参数,用于控制LoRA更新的强度,通常设置为与r相同的值,较大的alpha会增加LoRA的影响力,较小的alpha则会减弱LoRA的影响 lora_dropout=0, #LoRA层的dropout率,0表示不使用dropout,增加dropout可以帮助防止过拟合,但可能影响训练稳定性,在微调时通常设为0或很小的值 bias="none", #是否微调偏置项,"none"表示不微调偏置参数,也可以设置为"all"或"lora_only"来微调不同范围的偏置 use_gradient_checkpointing="unsloth", # 梯度检查点策略,"unsloth"是一种优化的检查点策略,适用于长上下文可以显著减少显存使用,但会略微增加计算时间对处理长文本特别有用 random_state=3407, #随机数种子,控制初始化的随机性,固定种子可以确保实验可重复性 use_rslora=False, #是否使用RSLoRA(Rank-Stabilized LoRA) False表示使用标准LoRARSLoRA是一种改进的LoRA变体,可以提供更稳定的训练 loftq_config=None, #LoftQ配置None表示不使用LoftQ量化LoftQ是一种用于模型量化的技术,可以减少模型大小 )
6.7 数据加载
对训练作一些简单的设置,执行后执行数据,会把训练数据下载进来。
因为本数据集区分train 与 test数据集,所以需要执行数据集。
6.8 开始训练
执行好上述内容之后,关键来了,终于要开始训练了。
令人激动的时刻
仔细看,观察右侧,CPU GPU的资源使用开始上升,一共执行了8min。
观察左边的 Step Trainging Loss ,标准的收敛,符合训练的预期。
6.9 模型的定义与使用
模型终于在数据集的训练下完成了,下面要试用了。
# 定义提示模板 # 这个模板包含了指导模型如何理解和解释SQL查询的结构化提示 prompt_style = """Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request. Before answering, think carefully about the question and create a step-by-step chain of thoughts to ensure a logical and accurate response. ### Instruction: You are an expert in SQL queries with advanced understanding. You are able to understand database schema from queries. Thinks in terms of a SQL expert and generates a summary of the query, explaining the use case scenario for the query. In other words, convert natural speech into SQL. ### Query: {} ### Response: <think>{}""" # 定义测试用的SQL查询 # 这是一个复杂的客户分析查询,用于测试模型的理解能力 # 修改: 使用训练数据 的prompt ,自然语言-》 sql query1 = """ Find the energy efficiency upgrades with the highest cost and their types. """ # 将模型设置为推理模式 FastLanguageModel.for_inference(model) # 准备输入数据 # 使用提示模板格式化查询,并转换为模型可处理的张量格式 inputs = tokenizer([prompt_style.format(query1, "")], return_tensors="pt").to("cuda") # 生成响应 outputs = model.generate( input_ids=inputs.input_ids, # 输入的标记ID attention_mask=inputs.attention_mask, # 注意力掩码,用于处理填充 max_new_tokens=1200, # 最大生成的新标记数 use_cache=True, # 使用缓存以提高生成速度 ) # 解码模型输出 # 使用分词器将输出转换回文本,并提取Response部分 response = tokenizer.batch_decode(outputs) print(response[0].split("### Response:")[1])
最终来看一下运行结果,
think标签是大模型的思考过程,熟悉deepseek的朋友应该经常看到。
end\_of\_sentence是代表大模型输出完成了。
6.10 保存模型
模型训练完之后自然要保存下来,不然就白干了。在colab中,可以通过下面代码,会保存到谷歌云盘,你可以把他下载到其他地方继续使用。
local_path="deepseek_sql_model" model.save_pretrained(local_path) tokenizer.save_pretrained(local_path)
7. 总结与思考
通过本次基于DeepSeek的SQL专家模型训练实践,我们验证了大模型在垂直领域专业化落地的可行性。以下是核心总结与未来思考:
核心成果
- 流程高效性
- 借助
unsloth
工具,模型微调速度提升2-5倍,显存占用减少80%,解决了传统微调资源消耗大的痛点。 wandb
的实时监控与可视化功能,显著提升了训练过程的可控性和可解释性。
- 数据驱动专业化
- 使用Hugging Face的
text-to-SQL
合成数据集,验证了高质量垂直数据对模型能力的关键作用。通过自然语言与SQL的精准对齐,模型能够理解复杂查询逻辑并生成准确结果。
- 低成本实践路径
- 依托Colab免费GPU资源,实现了零本地硬件依赖的训练方案,为个人开发者和小团队提供了可行的技术落地路径。
实践启示
- 数据决定上限:当前模型效果高度依赖数据质量与多样性。未来需引入更多真实业务场景数据(如跨行业表结构、复杂嵌套查询),以增强模型的泛化能力。
- 数据集决定模型:本次使用的是text-to-SQL 数据集,如果有其他数据集,就可以打造相应的模型,如果有病例和解决手段,可以打造医疗专家;如果有法律文书与案例,可以打造专业律师 等等。
- 工具链整合:
unsloth
+wandb
+Colab
的组合展现了开源工具链的潜力,但工程化部署时仍需优化模型压缩、推理加速等环节。 - 应用场景延伸:训练后的模型可快速集成至低代码平台、智能BI工具中,实现自然语言查询自动化,降低数据分析门槛。
挑战与展望
- 局限性
- 当前模型对数据分布外的查询(如多表关联、窗口函数)响应能力有限,需通过数据增强和算法优化改进。
- 提示词(Prompt)设计对输出质量影响显著,需结合人类反馈强化(RHLF)进一步调优。
- 未来方向
- 混合微调策略:结合LoRA与全参数微调,平衡模型性能与训练成本。
- 动态知识库:将实时数据库Schema注入上下文,解决静态数据导致的时效性问题。
- 交互式学习:构建“错误SQL-反馈-修正”闭环,提升模型纠错与逻辑推理能力。
引用链接
[1]
官网地址: https://wandb.ai/
[2]
数据集: https://huggingface.co/datase...\_text\_to\_sql/tree/main
[3]
colab官网: https://colab.research.google...
关于作者
作者重视实战与理论的结合,文章干货满满,有较为丰富的平台、数开经验,欢迎和作者一起交流,共同进步。
DataSpeed聚焦"大数据+AI"实战与资讯,技术干货和行业消息一网打尽。期待与你同行,欢迎扫码添加作者微信。
关于社区
PowerData社区是由一群数据从业人员,因为热爱凝聚在一起,以开源精神为基础,组成的数据开源社区。
社区群内会定期组织模拟面试、线上分享、行业研讨(涉及金融、医疗、能源、工业、互联网等)、线下Meet UP、城市聚会、求职内推等。同时,在社区群内您可以进行技术讨论、问题请教,届时更多志同道合的数据朋友。
社区整理了一份每日一题汇总及社区分享PPT,内容涵盖大数据组件、编程语言、数据结构与算法、企业真实面试题等各个领域,帮助您自我提升,成功上岸。可以添加作者微信(zwhuihuiz),进入PowerData官方社区群。
往期推荐
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。