新闻详情
基于贝叶斯校准与自增强反馈的LLM关系数据生成框架RDDG实践
基于贝叶斯校准与自增强反馈的LLM关系数据生成框架RDDG实践
1. 项目概述与核心痛点最近在折腾一个数据相关的项目需要大量结构化的关系型数据来做模型训练和系统测试。一开始我尝试用传统方法比如写脚本爬取、手动构造或者用一些规则模板来生成。结果要么是数据量不够要么是数据质量太差——字段之间逻辑矛盾、数据分布不真实、多样性不足根本没法用。相信不少做数据分析、算法开发或者系统测试的朋友都遇到过类似的困境高质量、高保真、大规模的关系数据实在太难搞了。就在我焦头烂额的时候我把目光投向了当下最火的LLM大语言模型。理论上LLM拥有强大的理解和生成能力让它根据一个数据库表结构Schema来生成对应的数据行听起来是个完美的解决方案。我兴致勃勃地试了试直接给ChatGPT或者一些开源LLM发指令“请根据以下用户表结构生成10条模拟数据。” 结果呢生成的数据乍一看还行但仔细一检查问题一大堆年龄字段出现负数、邮箱格式乱七八糟、用户ID和订单ID对不上、城市和省份的对应关系错乱……更头疼的是生成的数据分布极其不均匀比如所有用户的注册日期都挤在最近几天这完全不符合真实业务场景。LLM生成的数据随机性太强缺乏可控性和一致性直接拿来用就是给自己挖坑。所以问题的核心不是LLM能不能生成数据而是如何让它生成高质量、符合业务逻辑、分布合理的关系数据。这就是RDDG这个框架要解决的核心问题。RDDG全称是Relational Data Generation with LLMs我把它理解为一套“驯服”LLM让它从“天马行空的诗人”变成“严谨可靠的数据库管理员”的工程框架。它不满足于LLM的一次性输出而是通过贝叶斯校准和自增强反馈这两大核心机制对生成过程进行持续地评估、纠正和优化。简单来说你可以把RDDG想象成一个拥有“质检员”和“教练”的智能数据工厂。LLM是生产线上的“工人”负责生产数据样本。“贝叶斯校准”就是那位经验丰富的质检员它手里有一套基于历史经验先验和当前样本证据似然形成的动态质检标准后验能快速判断每个数据样本的质量并给出修正方向。而“自增强反馈”则是那位教练它把质检员发现的问题——比如“城市字段经常填错”——总结成更明确的指令或示例反馈给LLM工人帮助它在下一轮生产中避免同样的错误。如此循环迭代数据的质量就像滚雪球一样越滚越高。2. 核心设计思路与架构拆解为什么是“贝叶斯校准”和“自增强反馈”这背后是对LLM数据生成痛点的深度思考。LLM生成数据的不确定性主要来自两方面一是其本身固有的随机性采样温度、top-p等参数导致二是它对复杂约束和联合分布的理解不足。传统方法要么是事后用规则去清洗费时费力且规则难以穷尽要么是试图设计极其复杂的提示词Prompt Engineering把所有的约束都写进去结果提示词长得像一篇论文LLM看了也头疼效果还不稳定。RDDG的设计思路跳出了这个框框它承认LLM第一次生成的数据可能不完美但通过一个系统性的、闭环的优化流程可以引导LLM的输出无限逼近我们的要求。这个流程的核心是一个迭代优化循环。2.1 整体工作流程整个框架的运作可以分解为四个核心阶段形成一个闭环初始化与提示构建首先你需要定义目标。这包括你的数据库表结构Schema以及你对数据质量的要求。这些要求会被编码进一个初始的“系统提示词”中告诉LLM要扮演什么角色、生成什么格式的数据。同时框架会初始化一个“校准器”它的内部是一组关于数据质量的先验信念比如“用户年龄应该在18-70岁之间”、“城市和省份必须匹配”等。LLM数据生成与采样框架调用LLM API根据当前的提示词生成一批候选数据。这里通常不是只生成一条而是生成一个批次Batch比如20条或50条以提供多样性。贝叶斯校准与质量评估这是质量控制的核心。生成的这批数据不会直接被采纳。它们会被送入“贝叶斯校准器”。校准器就像一个多维度质检仪对每条数据的各个字段进行扫描。它不仅仅做“是/否”的检查而是计算一个综合质量得分。这个得分的计算就运用了贝叶斯思想校准器根据每条数据在各个约束上的符合程度似然来更新它对“这条数据是否属于高质量数据分布”的信念后验。例如一条数据在10个约束条件上全部符合它的似然就很高后验概率即质量得分也就很高如果它在“城市-省份”匹配上出错那么在这个维度上的似然就很低会拉低整体得分。自增强反馈与提示迭代基于校准器的评估结果框架进入学习阶段。它会分析本批次数据中出现的共性错误模式。比如发现30%的数据在“金额”字段上出现了非数字字符。那么“自增强反馈”模块就会行动它可能采取两种策略一是反思式提示增强生成一段针对性的错误分析和修正建议附加到下一轮的提示词中如“注意金额字段必须为纯数字请严格检查”二是示例式提示增强从本批次中挑选出几条质量最高的数据作为“正例”以及一两条典型错误数据作为“反例”一起提供给LLM让它从对比中学习。更新后的、更“聪明”的提示词会被用于下一轮的数据生成。这个过程会循环进行直到生成的数据整体质量达到预设的阈值或者达到设定的循环轮数。最终你会得到一个经过多轮优化后、由LLM生成的高质量数据集以及一套针对你这个特定数据生成任务“调教”好的提示词。2.2 两大核心机制深度解析贝叶斯校准从模糊感觉到精确度量传统的数据质量检查往往是硬规则必须满足条件A、B、C。但真实世界的数据有时存在灰色地带或者某些约束的重要性不同。贝叶斯校准提供了一种柔性的、可量化的评估方式。先验Prior在开始前我们根据业务常识或历史数据为各种数据约束设置一个初始的“置信度”。例如我们“相信”90%的用户年龄应在18-60岁之间。这个先验可以设置得相对宽松它是一个起点。似然Likelihood当我们观察到一条新生成的数据时我们计算它符合每个约束的可能性。比如一条数据的年龄是25岁那么它符合“年龄在18-60岁”这个约束的似然就很高接近1如果是70岁似然就低一些如果是-5岁似然就几乎为0。后验Posterior这是贝叶斯定理的核心。我们将先验信念和当前观察到的证据似然结合起来得到更新后的、更准确的信念——即这条数据的综合质量得分。公式概念上可以简化为后验质量 ∝ 先验信念 × 观测似然。在实际实现中我们可能会为每个字段或每个约束如外键关联、数值范围、格式正则定义一个概率分布模型。校准器通过计算生成数据在这些模型下的“拟合度”来得到似然再与先验结合得到后验概率。这个后验概率就是该条数据的质量分数。通过设置一个阈值如0.8我们可以自动筛选出高质量数据。实操心得先验的设置非常关键。一开始如果对数据分布不了解可以设置成均匀分布或较弱的先验让数据本身来“说话”。随着循环的进行后验分布会越来越准这时甚至可以用上一轮高质量数据的统计特征如均值、方差来更新下一轮的先验让校准器越来越“懂”你的业务数据。自增强反馈让LLM在错误中成长这是让整个系统拥有“学习”能力的关键。如果只有校准而没有反馈那只是一个过滤器无法从根本上提升LLM的生成能力。自增强反馈的核心是从失败中提取知识并转化为LLM能理解的指令。错误模式挖掘校准器不仅给出分数还能输出详细的错误报告比如“字段‘email’格式错误率25%”“违反外键约束‘user_id’15%”。系统会聚合这些错误找出最突出、最普遍的问题。反馈内容生成指令精炼将错误模式翻译成更清晰、更强调的指令。例如初始提示是“生成合理的邮箱”优化后可能是“邮箱必须符合标准格式‘local-partdomain’且domain部分需包含‘.’请严格校验”。正反例生成这是更强大的方式。系统自动从高质量数据中采样几条作为“示范”从低质量数据中采样几条典型错误作为“警示”在下一轮提示中以“Few-shot Learning”的方式提供给LLM。LLM对于示例的学习能力通常强于对纯文本指令的理解。链式思考CoT注入对于特别复杂的逻辑约束反馈模块可以生成一个“思考链”示例展示如何一步步推导出正确的数据。例如“要生成一个订单首先需确定一个存在的用户ID然后根据该用户所在地区匹配运费规则最后计算总价…”通过这种方式每一轮迭代后的LLM都相当于接受了一次针对当前任务的“微调”虽然我们没有改动它的模型权重但它的“上下文表现”被极大地优化了。3. 核心模块实现与实操要点理解了设计思路我们来看看如何动手实现一个简化版的RDDG框架。这里我以生成一个简单的“用户-订单”关系数据为例用Python进行示意性实现。我们会用到LangChain来方便地调用LLM如OpenAI GPT或开源Qwen以及PyMC或NumPy来实现简单的贝叶斯校准逻辑。3.1 环境准备与依赖安装首先你需要一个Python环境3.8以上并安装必要的库。这里我们选择OpenAI API作为LLM服务你也可以替换为任何兼容OpenAI接口的本地模型如Qwen。pip install openai langchain pymc numpy pandas如果你使用本地模型可能还需要安装对应的模型库例如pip install transformers等。3.2 定义数据模式与约束这是所有工作的基础。你需要用结构化的方式定义你要生成的数据表。# schema_definition.py user_schema { table_name: users, fields: [ {name: user_id, type: int, constraints: [primary_key, positive]}, {name: username, type: str, constraints: [length:5-20, alphanumeric]}, {name: age, type: int, constraints: [range:18-70]}, {name: email, type: str, constraints: [email_format]}, {name: city, type: str, constraints: []}, # 城市与省份关联约束在逻辑层 {name: province, type: str, constraints: []}, ], inter_table_constraints: [ {type: city_province_mapping, fields: [city, province], ref: static_mapping.csv} # 城市-省份映射表 ] } order_schema { table_name: orders, fields: [ {name: order_id, type: int, constraints: [primary_key, positive]}, {name: user_id, type: int, constraints: [foreign_key:users.user_id]}, {name: amount, type: float, constraints: [range:10.0-10000.0, positive]}, {name: status, type: str, constraints: [in:[pending,paid,shipped,cancelled]]}, {name: created_at, type: datetime, constraints: [date_range:2023-01-01,2024-12-31]}, ] }这里我们把约束分成了字段级如范围、格式和表间级如外键、城市-省份映射。static_mapping.csv是一个预先准备好的文件存储了正确的城市-省份对应关系。3.3 构建贝叶斯校准器校准器是框架中最“硬核”的部分。我们实现一个简化版本针对数值范围约束使用正态分布先验针对分类约束使用类别分布。# calibrator.py import numpy as np from scipy import stats import re class BayesianCalibrator: def __init__(self, schema): self.schema schema # 初始化先验参数这里以年龄字段为例假设我们预先认为年龄大致服从均值为35标准差为15的正态分布 self.priors { age: {dist: normal, params: {mu: 35, sigma: 15}}, status: {dist: categorical, params: {probs: [0.2, 0.5, 0.2, 0.1]}} # pending, paid, shipped, cancelled } def compute_likelihood(self, field_name, field_value, field_constraints): 计算单个字段值在给定约束下的似然概率 likelihood 1.0 for constraint in field_constraints: if constraint.startswith(range:): # 处理数值范围约束如 range:18-70 low, high map(float, constraint.split(:)[1].split(-)) if low field_value high: # 假设在范围内均匀分布似然为1/(范围长度)或使用更平滑的分布 # 这里简化处理在范围内给予高似然如0.9边缘给予低似然 likelihood * 0.9 if (field_value low2 and field_value high-2) else 0.6 else: likelihood * 0.01 # 严重超出范围似然极低 elif constraint email_format: # 简单邮箱格式校验 pattern r^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$ if re.match(pattern, field_value): likelihood * 0.95 else: likelihood * 0.1 # ... 其他约束类型的似然计算 return likelihood def compute_posterior_score(self, record): 计算一条记录的综合后验质量得分 total_score 1.0 for field_info in self.schema[fields]: field_name field_info[name] field_value record.get(field_name) if field_value is None: total_score * 0.01 # 字段缺失严重扣分 continue # 1. 计算基于硬约束的似然 constraint_likelihood self.compute_likelihood(field_name, field_value, field_info.get(constraints, [])) # 2. 计算基于先验分布的似然 (如果存在先验) prior_likelihood 1.0 if field_name in self.priors: prior_config self.priors[field_name] if prior_config[dist] normal: mu prior_config[params][mu] sigma prior_config[params][sigma] # 计算在该正态分布下的概率密度需归一化处理此处简化 prior_likelihood stats.norm.pdf(field_value, mu, sigma) # 为避免数值过小可以取对数或进行缩放 prior_likelihood max(prior_likelihood, 1e-5) # 设置下限 elif prior_config[dist] categorical: idx [pending,paid,shipped,cancelled].index(field_value) # 示例 prior_likelihood prior_config[params][probs][idx] # 3. 结合硬约束似然和先验似然这里简单相乘实际可加权 field_score constraint_likelihood * prior_likelihood total_score * field_score # 4. 处理表间约束如外键、映射 for constraint in self.schema.get(inter_table_constraints, []): if constraint[type] city_province_mapping: city record.get(city) province record.get(province) # 检查映射表如果匹配得分不变不匹配则扣分 if not self._check_city_province_mapping(city, province): total_score * 0.2 # 映射错误严重扣分 # 对总得分进行归一化或开方处理防止连乘导致数值下溢 final_score total_score ** (1.0 / max(len(self.schema[fields]), 1)) return final_score def _check_city_province_mapping(self, city, province): # 这里应加载映射文件进行检查返回布尔值 # 示例假设我们有一个内存中的字典 mapping {北京: 北京, 上海: 上海, 广州: 广东, 深圳: 广东} return mapping.get(city) province这个校准器为每条数据计算一个0到1之间的分数。我们可以设定一个阈值如0.7高于此分数的视为高质量数据。3.4 实现自增强反馈引擎反馈引擎负责分析低分数据的错误并生成下一轮的提示词。# feedback_engine.py from collections import defaultdict class SelfEnhancingFeedbackEngine: def __init__(self): self.error_patterns defaultdict(int) # 记录各类错误出现的频率 self.high_quality_examples [] # 存储高质量样本作为正例 self.low_quality_examples [] # 存储典型低质量样本作为反例 def analyze_batch(self, data_batch, scores): 分析一个批次的数据更新错误模式和示例库 high_quality [] low_quality [] for data, score in zip(data_batch, scores): if score 0.8: # 高质量 high_quality.append(data) elif score 0.4: # 低质量用于分析错误 low_quality.append(data) # 这里可以调用一个简单的规则检查函数来归类错误类型 # 例如检查邮箱格式、年龄越界等并累加到error_patterns if not self._is_valid_email(data.get(email, )): self.error_patterns[invalid_email_format] 1 if not (18 data.get(age, 0) 70): self.error_patterns[age_out_of_range] 1 # 更新示例库保留最近N个 self.high_quality_examples (self.high_quality_examples high_quality)[-5:] # 保留最近5个正例 self.low_quality_examples (self.low_quality_examples low_quality)[-3:] # 保留最近3个反例 return self._generate_feedback_prompt() def _generate_feedback_prompt(self): 根据错误模式和示例生成反馈提示文本 feedback_lines [] # 1. 基于错误模式的指令强化 if self.error_patterns: feedback_lines.append(**请特别注意并严格避免以下常见错误**) for error_type, count in self.error_patterns.items(): if error_type invalid_email_format: feedback_lines.append(f- 邮箱格式必须严格符合 namedomain.com 的格式且域名部分需包含点号。已出现{count}次错误。) elif error_type age_out_of_range: feedback_lines.append(f- 用户年龄必须在18至70岁之间包含。已出现{count}次错误。) # 2. 基于示例的Few-shot提示 if self.high_quality_examples: feedback_lines.append(\n**请参考以下高质量数据示例的格式和逻辑**) for i, example in enumerate(self.high_quality_examples[-2:], 1): # 取最后2个正例 feedback_lines.append(f示例{i}: {example}) if self.low_quality_examples: feedback_lines.append(\n**请避免以下错误数据示例中的问题**) for i, example in enumerate(self.low_quality_examples[-1:], 1): # 取最后1个反例 feedback_lines.append(f反例{i}: {example}) # 可以附加简短错误分析 feedback_lines.append(f 问题分析该数据中年龄字段{example.get(age)}超出合理范围。) return \n.join(feedback_lines) if feedback_lines else 请继续生成数据。 def _is_valid_email(self, email): import re pattern r^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$ return bool(re.match(pattern, email))3.5 组装主循环与调用LLM最后我们将所有模块组装起来形成完整的数据生成流水线。# main_rddg.py from langchain.chat_models import ChatOpenAI from langchain.schema import HumanMessage, SystemMessage import json class RDDGPipeline: def __init__(self, schema, openai_api_key, model_namegpt-3.5-turbo): self.schema schema self.calibrator BayesianCalibrator(schema) self.feedback_engine SelfEnhancingFeedbackEngine() self.llm ChatOpenAI(openai_api_keyopenai_api_key, model_namemodel_name, temperature0.7) # temperature可调 self.system_prompt self._build_initial_system_prompt(schema) self.conversation_history [] # 可选存储对话历史以维持上下文 def _build_initial_system_prompt(self, schema): 构建初始系统提示词 prompt f你是一个专业的数据生成助手。你的任务是根据给定的数据库表结构生成逼真、多样且完全符合约束的模拟数据。 表结构如下JSON格式 {json.dumps(schema, indent2)} 请严格按照以下要求生成数据 1. 输出必须是纯JSON格式的列表列表中的每个元素是一条记录。 2. 每条记录必须包含上述所有字段且值必须符合字段类型和约束描述。 3. 数据应尽可能逼真反映现实世界的分布和逻辑关系例如城市和省份要对应。 4. 每次生成5条记录。 return prompt def generate_one_batch(self, feedback): 生成一批数据 user_prompt 请生成5条符合要求的模拟数据。 if feedback: user_prompt f\n\n此外请根据以下反馈进行改进\n{feedback} messages [ SystemMessage(contentself.system_prompt), HumanMessage(contentuser_prompt) ] # 添加上下文历史如果需要多轮对话保持一致性 if self.conversation_history: messages self.conversation_history[-4:] messages # 保留最近几轮历史 response self.llm(messages) self.conversation_history.append(HumanMessage(contentuser_prompt)) self.conversation_history.append(response) # 解析LLM的回复这里假设LLM返回的是纯JSON字符串 try: data_batch json.loads(response.content) if not isinstance(data_batch, list): data_batch [data_batch] return data_batch except json.JSONDecodeError: print(fLLM返回无法解析为JSON: {response.content[:200]}...) # 可以尝试用正则提取JSON或者返回空列表触发重试 return [] def run(self, iterations5, quality_threshold0.75): 运行主迭代循环 all_high_quality_data [] for i in range(iterations): print(f\n 第 {i1} 轮迭代 ) # 1. 获取反馈第一轮为空 feedback self.feedback_engine.generate_feedback_prompt() if i 0 else # 2. 生成数据 print(正在生成数据...) data_batch self.generate_one_batch(feedback) if not data_batch: print(生成失败跳过本轮。) continue print(f生成了 {len(data_batch)} 条候选数据。) # 3. 校准与评分 print(正在进行质量校准与评分...) scores [] qualified_data [] for record in data_batch: score self.calibrator.compute_posterior_score(record) scores.append(score) if score quality_threshold: qualified_data.append(record) avg_score sum(scores) / len(scores) print(f本批次平均质量得分: {avg_score:.3f}, 合格数据: {len(qualified_data)}/{len(data_batch)}) # 4. 收集高质量数据 all_high_quality_data.extend(qualified_data) # 5. 分析批次为下一轮生成反馈 print(分析错误模式生成反馈...) _ self.feedback_engine.analyze_batch(data_batch, scores) # 更新内部状态 # 可选提前终止条件 if avg_score 0.85 and len(qualified_data) len(data_batch): print(f数据质量已稳定在较高水平提前终止迭代。) break print(f\n 迭代结束 ) print(f总共收集到 {len(all_high_quality_data)} 条高质量数据。) return all_high_quality_data # 使用示例 if __name__ __main__: # 假设已定义 user_schema from schema_definition import user_schema import os api_key os.getenv(OPENAI_API_KEY) pipeline RDDGPipeline(user_schema, api_key) high_quality_users pipeline.run(iterations5) # 保存数据 import pandas as pd df pd.DataFrame(high_quality_users) df.to_csv(generated_high_quality_users.csv, indexFalse) print(数据已保存至 generated_high_quality_users.csv)4. 常见问题、优化策略与避坑指南在实际搭建和运行RDDG框架的过程中你肯定会遇到各种各样的问题。下面我结合自己的踩坑经验总结了一些典型问题及其解决方案。4.1 LLM相关的问题与调优问题1LLM不遵循JSON格式输出。这是最常见的问题。LLM可能会在JSON前后添加解释性文字或者使用Markdown代码块包裹。解决方案强化系统提示在系统提示词中明确强调“输出必须是纯JSON不要有任何额外的解释、标记或代码块”。后处理清洗在代码中增加健壮的解析逻辑。使用json.loads()尝试解析如果失败则用正则表达式如r\[.*\]或r\{.*\}在非贪婪模式下尝试提取最像JSON的部分。使用函数调用Function Calling如果使用的LLM API支持如GPT-4可以定义JSON Schema作为函数调用参数强制LLM以结构化格式输出。问题2生成的数据多样性不足。LLM容易陷入某种模式生成的数据看起来都差不多。解决方案调整温度参数适当提高temperature参数如从0.7调到0.9增加随机性。但要注意太高会导致更多不符合约束的数据。在提示词中强调多样性明确要求“请确保生成的数据在合理范围内具有多样性例如年龄均匀分布、城市来自不同地区、状态覆盖所有枚举值等”。引入随机种子或示例在每轮提示中随机提供少量不同的“示例片段”引导LLM向不同方向思考。问题3生成速度慢或成本高。调用商用LLM API按token收费迭代多次成本不菲。解决方案使用小型或本地模型对于逻辑相对简单的数据生成任务可以尝试使用较小的开源模型如Qwen-7B-Chat, Llama-3-8B。虽然单次生成质量可能略低但通过RDDG的迭代校准最终也能收敛到不错的结果且成本极低。减少每轮生成数量将每轮生成的条数batch size从10条减到5条或3条减少单次调用token数。并行生成如果条件允许可以同时发起多个生成请求注意API速率限制然后统一进行校准和反馈。4.2 校准器设计与调参问题4校准器打分不准误杀高质量数据或放过低质量数据。解决方案精细化似然函数不要简单用0/1判断。对于数值范围可以使用“软边界”。例如年龄在18-70之间得高分在15-18或70-75之间得中等分之外得低分。这可以通过定义分段函数或使用概率分布如截断正态分布来实现。引入字段权重不是所有字段都同等重要。主键、外键的权重应该最高描述性字段权重可以稍低。在计算综合得分时使用加权乘法或加权平均。动态调整先验在迭代初期先验可以设置得比较宽泛。随着高质量数据的积累可以用这些数据的统计特征均值、方差、分布直方图来更新下一轮校准的先验参数让校准器越来越“聪明”。问题5复杂逻辑约束如跨表关联、业务规则难以编码到校准器中。解决方案规则引擎集成对于极其复杂的业务规则可以集成一个轻量级规则引擎如Drools的基本逻辑或自定义函数。校准器调用这些规则来检查数据并将结果转化为概率分数。LLM辅助校准对于难以用代码描述的“常识性”逻辑或非常复杂的约束可以引入一个“裁判LLM”。让这个裁判LLM对生成的数据进行自然语言评估例如“请判断这条订单数据是否合理并给出0-1的分数”然后将这个分数作为校准器的一个输入维度。不过这又会增加成本和延迟。4.3 反馈循环的稳定性问题6反馈循环震荡或不收敛。有时加入反馈后LLM可能会过度纠正或者陷入另一种错误模式。解决方案反馈内容稀释不要每一轮都把所有的错误模式和正反例都塞进提示词。这样会导致提示词过长且可能让LLM困惑。只加入最突出的1-2个错误模式和1-2组最典型的示例。使用滑动窗口像示例代码中那样只保留最近几轮的高质量示例和错误示例让反馈关注近期问题避免被历史旧问题干扰。设置收敛条件监控平均质量得分和合格率。当连续N轮如3轮得分都在一个高阈值以上且波动很小时可以判定系统已收敛自动停止迭代。4.4 扩展性与高级技巧从单表到多表关联生成 上面的例子主要是单表。生成多表关联数据如先用户后订单的关键在于顺序生成和上下文传递。首先运行RDDG生成用户表数据。生成订单时将已生成的高质量用户表或其中的用户ID列表作为“已知数据”提供给系统提示词。例如“以下是已存在的用户ID列表[...]。请为这些用户生成订单确保order.user_id存在于该列表中。”校准器中需要加入强大的外键约束检查。利用Few-shot Learning提升起点 如果你手头已经有少量真实数据或高质量模拟数据不要浪费。在初始系统提示词中直接提供3-5条这样的数据作为“示例”可以极大地提升LLM第一轮生成的质量减少迭代轮数。混合生成策略 对于某些枚举值少、规则明确的字段如“订单状态”完全可以采用随机抽样来生成这比LLM生成更可靠、更高效。RDDG框架可以设计成“混合模式”部分字段由LLM生成部分字段由规则引擎填充最后由校准器进行统一校验。搭建RDDG框架的过程是一个与LLM“协作”而非“命令”的过程。它承认LLM的强大也正视它的不足通过工程化的闭环系统将LLM的创造力引导到我们需要的严谨数据生成任务上。一开始可能需要一些调试但一旦流程跑通你会发现它就像一台越用越聪明的数据生成机器能持续不断地为你产出符合要求的高质量燃料。