1. 为什么需要自动化构建微调数据集做AI模型微调的朋友都知道准备训练数据是最头疼的环节。传统方式需要人工整理文档、设计问答对、格式化数据整个过程既耗时又容易出错。我去年做过一个客服知识库项目光是整理500组QA数据就花了整整两周时间期间还因为格式错误反复返工。dify的工作流功能正好能解决这个痛点。它把文档处理、文本转换、格式标准化这些重复劳动自动化让我们可以专注于数据质量本身。举个例子如果你有产品说明书、技术文档这类结构化内容用这个工作流能在10分钟内生成上百条标准化的微调数据。这个方案特别适合三类场景企业内部知识库转训练数据如产品文档、客服问答学术论文摘要生成问答对多来源资料整合如竞品分析报告合并2. 搭建基础工作流框架2.1 初始化工作流环境首先登录dify控制台在工作流标签页点击新建。建议命名时包含fine-tune关键词方便后续管理比如产品文档转微调数据集_v1。创建后会进入可视化编排界面这里可以看到默认的开始节点。关键配置技巧在开始节点添加两个输入参数attachments文件类型用于上传原始文档trigger_word字符串类型作为微调时的system prompt内容参数命名尽量语义化避免使用a1、temp这类无意义名称2.2 文档提取器配置从开始节点右侧的号添加文档提取器节点。这个模块支持txt/md/pdf/docx等常见格式实测中发现对中文pdf的解析效果最好。重要参数输入变量绑定到attachments输出变量命名为text数组类型高级设置里建议开启分段提取选项这样能保留文档原有结构遇到过的一个坑当上传多个文件时输出数组可能包含空元素。建议后续代码执行节点添加空值过滤逻辑类似这样def filter_empty(items: list) - list: return [item for item in items if item.strip()]3. 核心数据处理环节3.1 代码执行节点实战文档提取后的文本需要经过预处理才能喂给LLM。添加代码执行节点时我推荐用Python编写处理逻辑因为dify的沙箱环境对Python支持最完善。典型处理场景多文档内容合并文本清洗去除特殊字符、冗余空格长度截断避免超出模型限制这是我的常用代码模板def main(articleSections: list) - dict: # 合并并过滤空段落 clean_text [s for s in articleSections if s] combined \n[SECTION]\n.join(clean_text) # 保留前60000字符预留空间给prompt truncated combined[:60000] return { cleaned_text: truncated, section_count: len(clean_text) }3.2 LLM节点深度配置这是整个工作流最关键的环节。连接LLM节点时建议选择7B以上参数的模型太小的话生成质量会打折扣。最近我在用qwen-14b效果不错生成的问题更贴近实际场景。prompt设计要点系统提示词要明确数据格式要求用户提示词应包含原始文本内容变量{{input}}触发词变量{{trigger_word}}明确的生成规则这是我的系统提示词模板你是一位专业的数据标注员需要将技术文档转换为问答对。 要求 1. 每个问题必须基于文档实际内容 2. 答案必须直接引用文档片段 3. 生成10组问答格式为 { messages: [ {role: system, content: {{trigger_word}}}, {role: user, content: 问题文本}, {role: assistant, content: 答案文本} ] }4. 输出与质量验证4.1 结果标准化处理LLM输出的原始结果需要经过格式校验。在结束节点前可以再加一个代码执行节点做最终处理import json def validate_jsonl(raw_output: str) - dict: try: # 尝试解析为JSON data json.loads(raw_output) # 检查必需字段 for item in data: if not all(k in item for k in [messages]): raise ValueError(缺少messages字段) return {valid_data: data} except Exception as e: return {error: str(e)}4.2 常见问题排查在实际测试中可能会遇到这些问题格式错误检查LLM的prompt是否严格指定了json格式内容重复降低temperature参数到0.3左右答案不完整在用户提示词中增加回答需完整引用原文的要求建议的测试流程先用单篇短文测试500字以内检查生成的问题是否符合预期逐步增加文档长度和复杂度5. 进阶优化技巧5.1 多轮对话生成基础工作流生成的是单轮QA如果想生成多轮对话数据可以修改prompt为请基于以下内容生成连贯的多轮对话 1. 第一轮问题要宽泛 2. 后续问题针对前一个回答深入追问 3. 总共3轮对话 示例格式 { messages: [ {role: system, content: {{trigger_word}}}, {role: user, content: 问题1}, {role: assistant, content: 回答1}, {role: user, content: 问题2}, {role: assistant, content: 回答2} ] }5.2 批量处理优化当需要处理大量文档时建议使用dify的批量运行功能在代码节点添加处理进度日志设置自动重试机制针对API限流情况可以添加这样的进度追踪代码def batch_process(items: list) - dict: results [] for i, item in enumerate(items): try: processed process_item(item) results.append(processed) print(f已处理 {i1}/{len(items)}) # 日志输出 except Exception as e: print(f处理失败: {str(e)}) return {batch_results: results}最近在一个电商知识库项目中我用这个工作流自动生成了2300多条高质量问答数据。相比人工处理节省了约40小时工作量而且生成的数据在微调后的模型上达到了92%的准确率。关键是要根据实际效果反复调整prompt特别是对答案长度的控制和专业术语的处理。