266 lines
8.7 KiB
Python
266 lines
8.7 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
# -*- coding: utf-8 -*-
|
|||
|
|
"""
|
|||
|
|
配置文件
|
|||
|
|
用于控制QA生成的各种参数
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
from typing import List, Dict
|
|||
|
|
|
|||
|
|
|
|||
|
|
class QAConfig:
|
|||
|
|
"""QA生成配置类"""
|
|||
|
|
|
|||
|
|
def __init__(self):
|
|||
|
|
# ========== 基础配置 ==========
|
|||
|
|
# 随机种子(确保结果可重现)
|
|||
|
|
self.RANDOM_SEED = 42
|
|||
|
|
|
|||
|
|
# 输入输出目录
|
|||
|
|
self.INPUT_DIR = "Data_Export_Json"
|
|||
|
|
self.OUTPUT_DIR = "Data_QA_Outputs"
|
|||
|
|
|
|||
|
|
# ========== 问题数量控制 ==========
|
|||
|
|
# 每个数据项生成的基本问题数量(简单模式下)
|
|||
|
|
self.BASIC_QUESTIONS_PER_ITEM = 1
|
|||
|
|
|
|||
|
|
# 每个数据项生成的最多问题数量(复杂模式下)
|
|||
|
|
self.MAX_QUESTIONS_PER_ITEM = 10
|
|||
|
|
|
|||
|
|
# 多列查询问题的占比(0.0-1.0)
|
|||
|
|
# 0.0 表示不生成多列问题,1.0 表示所有问题都是多列问题
|
|||
|
|
self.MULTI_COLUMN_RATIO = 0.3
|
|||
|
|
|
|||
|
|
# ========== 复杂程度控制 ==========
|
|||
|
|
# 复杂程度等级:1-5
|
|||
|
|
# 1: 最简单(只有基础问答)
|
|||
|
|
# 3: 中等(包含部分多列问答)
|
|||
|
|
# 5: 最复杂(包含所有类型问答)
|
|||
|
|
self.COMPLEXITY_LEVEL = 3
|
|||
|
|
|
|||
|
|
# ========== 问句模板配置 ==========
|
|||
|
|
# 问句前缀模板(可根据复杂程度调整使用数量)
|
|||
|
|
self.QUESTION_PREFIXES_SIMPLE = [
|
|||
|
|
"请告诉我",
|
|||
|
|
"查询",
|
|||
|
|
"请问"
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
self.QUESTION_PREFIXES_NORMAL = [
|
|||
|
|
"请告诉我",
|
|||
|
|
"查询",
|
|||
|
|
"请问",
|
|||
|
|
"在",
|
|||
|
|
"请解释",
|
|||
|
|
"请输出",
|
|||
|
|
"请列举",
|
|||
|
|
"请说明",
|
|||
|
|
"请查找",
|
|||
|
|
"请确认"
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
# ========== 答句模板配置 ==========
|
|||
|
|
# 答句前缀模板
|
|||
|
|
self.ANSWER_PREFIXES_SIMPLE = [
|
|||
|
|
"根据表记录,该字段的",
|
|||
|
|
"查询结果显示,",
|
|||
|
|
"经查询,该字段的"
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
self.ANSWER_PREFIXES_NORMAL = [
|
|||
|
|
"根据表记录,该字段的",
|
|||
|
|
"查询结果显示,",
|
|||
|
|
"经查询,该字段的",
|
|||
|
|
"根据数据库记录,",
|
|||
|
|
"在表中,此字段的",
|
|||
|
|
"查询结果:",
|
|||
|
|
"经系统查询,",
|
|||
|
|
"根据记录显示,",
|
|||
|
|
"在数据中,该字段的",
|
|||
|
|
"查询得知,该字段的"
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
# 答句后缀模板
|
|||
|
|
self.ANSWER_SUFFIXES_SIMPLE = [
|
|||
|
|
"。",
|
|||
|
|
"。"
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
self.ANSWER_SUFFIXES_NORMAL = [
|
|||
|
|
"。",
|
|||
|
|
",请参考。",
|
|||
|
|
",详情如上。",
|
|||
|
|
",以上信息为准。",
|
|||
|
|
",望知悉。",
|
|||
|
|
",如需更多信息请联系。",
|
|||
|
|
",希望能帮到您。",
|
|||
|
|
",祝您工作顺利。",
|
|||
|
|
",谢谢。",
|
|||
|
|
"。"
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
# ========== 连接词配置 ==========
|
|||
|
|
# 多列查询的连接词
|
|||
|
|
self.CONNECTORS_SIMPLE = ["和", "与"]
|
|||
|
|
|
|||
|
|
self.CONNECTORS_NORMAL = ["和", "与", "及", "、", ",还有", "以及"]
|
|||
|
|
|
|||
|
|
# ========== 数据文件配置 ==========
|
|||
|
|
# 要处理的数据文件列表
|
|||
|
|
self.DATA_FILES = [
|
|||
|
|
{
|
|||
|
|
"name": "元素治理模板",
|
|||
|
|
"file": "元素治理模板.json",
|
|||
|
|
"output": "元素治理模板_QA.json",
|
|||
|
|
"enabled": True
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"name": "物理模型",
|
|||
|
|
"file": "物理模型.json",
|
|||
|
|
"output": "物理模型_QA.json",
|
|||
|
|
"enabled": True
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"name": "逻辑模型",
|
|||
|
|
"file": "逻辑模型.json",
|
|||
|
|
"output": "逻辑模型_QA.json",
|
|||
|
|
"enabled": True
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
# ========== 单列问题模板配置 ==========
|
|||
|
|
# 根据复杂程度决定启用哪些模板
|
|||
|
|
self.SINGLE_COLUMN_TEMPLATES = {
|
|||
|
|
1: 3, # 简单模式:只启用前3个模板
|
|||
|
|
2: 6, # 简单+模式:启用前6个模板
|
|||
|
|
3: 9, # 中等模式:启用前9个模板
|
|||
|
|
4: 12, # 复杂模式:启用前12个模板(全部)
|
|||
|
|
5: 12 # 最复杂模式:启用全部模板
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# ========== 多列问题模板配置 ==========
|
|||
|
|
# 根据复杂程度决定启用哪些多列模板
|
|||
|
|
self.MULTI_COLUMN_TEMPLATES = {
|
|||
|
|
1: 0, # 简单模式:不生成多列问题
|
|||
|
|
2: 1, # 简单+模式:启用1个多列模板
|
|||
|
|
3: 3, # 中等模式:启用3个多列模板
|
|||
|
|
4: 4, # 复杂模式:启用4个多列模板
|
|||
|
|
5: 5 # 最复杂模式:启用全部多列模板
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# ========== 输出控制 ==========
|
|||
|
|
# 是否打乱问答对顺序
|
|||
|
|
self.SHUFFLE_OUTPUT = True
|
|||
|
|
|
|||
|
|
# 是否生成QA生成报告
|
|||
|
|
self.GENERATE_REPORT = True
|
|||
|
|
|
|||
|
|
# 是否显示详细日志
|
|||
|
|
self.VERBOSE_LOG = True
|
|||
|
|
|
|||
|
|
def get_complexity_settings(self) -> Dict:
|
|||
|
|
"""根据复杂程度等级获取相应设置"""
|
|||
|
|
level = self.COMPLEXITY_LEVEL
|
|||
|
|
|
|||
|
|
if level <= 2:
|
|||
|
|
return {
|
|||
|
|
"question_prefixes": self.QUESTION_PREFIXES_SIMPLE,
|
|||
|
|
"answer_prefixes": self.ANSWER_PREFIXES_SIMPLE,
|
|||
|
|
"answer_suffixes": self.ANSWER_SUFFIXES_SIMPLE,
|
|||
|
|
"connectors": self.CONNECTORS_SIMPLE,
|
|||
|
|
"single_templates": self.SINGLE_COLUMN_TEMPLATES.get(level, 3),
|
|||
|
|
"multi_templates": self.MULTI_COLUMN_TEMPLATES.get(level, 0),
|
|||
|
|
"multi_ratio": 0.0 if level == 1 else 0.1
|
|||
|
|
}
|
|||
|
|
else:
|
|||
|
|
return {
|
|||
|
|
"question_prefixes": self.QUESTION_PREFIXES_NORMAL,
|
|||
|
|
"answer_prefixes": self.ANSWER_PREFIXES_NORMAL,
|
|||
|
|
"answer_suffixes": self.ANSWER_SUFFIXES_NORMAL,
|
|||
|
|
"connectors": self.CONNECTORS_NORMAL,
|
|||
|
|
"single_templates": self.SINGLE_COLUMN_TEMPLATES.get(level, 9),
|
|||
|
|
"multi_templates": self.MULTI_COLUMN_TEMPLATES.get(level, 3),
|
|||
|
|
"multi_ratio": self.MULTI_COLUMN_RATIO
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
def update_config(self, **kwargs):
|
|||
|
|
"""更新配置参数"""
|
|||
|
|
for key, value in kwargs.items():
|
|||
|
|
if hasattr(self, key):
|
|||
|
|
setattr(self, key, value)
|
|||
|
|
print(f"[CONFIG] 已更新 {key} = {value}")
|
|||
|
|
else:
|
|||
|
|
print(f"[WARNING] 未找到配置项: {key}")
|
|||
|
|
|
|||
|
|
def print_config(self):
|
|||
|
|
"""打印当前配置"""
|
|||
|
|
print("\n" + "="*60)
|
|||
|
|
print("当前QA生成配置")
|
|||
|
|
print("="*60)
|
|||
|
|
print(f"随机种子: {self.RANDOM_SEED}")
|
|||
|
|
print(f"输入目录: {self.INPUT_DIR}")
|
|||
|
|
print(f"输出目录: {self.OUTPUT_DIR}")
|
|||
|
|
print(f"复杂程度等级: {self.COMPLEXITY_LEVEL}")
|
|||
|
|
print(f"基本问题数量: {self.BASIC_QUESTIONS_PER_ITEM}")
|
|||
|
|
print(f"最大问题数量: {self.MAX_QUESTIONS_PER_ITEM}")
|
|||
|
|
print(f"多列查询占比: {self.MULTI_COLUMN_RATIO}")
|
|||
|
|
print(f"打乱输出: {self.SHUFFLE_OUTPUT}")
|
|||
|
|
print(f"生成报告: {self.GENERATE_REPORT}")
|
|||
|
|
print(f"详细日志: {self.VERBOSE_LOG}")
|
|||
|
|
print("\n启用处理的文件:")
|
|||
|
|
for file_info in self.DATA_FILES:
|
|||
|
|
if file_info["enabled"]:
|
|||
|
|
print(f" ✓ {file_info['name']} ({file_info['file']})")
|
|||
|
|
print("="*60 + "\n")
|
|||
|
|
|
|||
|
|
|
|||
|
|
# 创建默认配置实例
|
|||
|
|
DEFAULT_CONFIG = QAConfig()
|
|||
|
|
|
|||
|
|
|
|||
|
|
def create_custom_config(**kwargs) -> QAConfig:
|
|||
|
|
"""创建自定义配置"""
|
|||
|
|
config = QAConfig()
|
|||
|
|
config.update_config(**kwargs)
|
|||
|
|
return config
|
|||
|
|
|
|||
|
|
|
|||
|
|
# 配置预设
|
|||
|
|
SIMPLE_CONFIG = create_custom_config(
|
|||
|
|
COMPLEXITY_LEVEL=1,
|
|||
|
|
MULTI_COLUMN_RATIO=0.0,
|
|||
|
|
BASIC_QUESTIONS_PER_ITEM=1,
|
|||
|
|
MAX_QUESTIONS_PER_ITEM=3,
|
|||
|
|
VERBOSE_LOG=False
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
NORMAL_CONFIG = create_custom_config(
|
|||
|
|
COMPLEXITY_LEVEL=3,
|
|||
|
|
MULTI_COLUMN_RATIO=0.3,
|
|||
|
|
BASIC_QUESTIONS_PER_ITEM=3,
|
|||
|
|
MAX_QUESTIONS_PER_ITEM=8
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
COMPLEX_CONFIG = create_custom_config(
|
|||
|
|
COMPLEXITY_LEVEL=5,
|
|||
|
|
MULTI_COLUMN_RATIO=0.5,
|
|||
|
|
BASIC_QUESTIONS_PER_ITEM=5,
|
|||
|
|
MAX_QUESTIONS_PER_ITEM=10
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
# 演示配置使用
|
|||
|
|
config = QAConfig()
|
|||
|
|
config.print_config()
|
|||
|
|
|
|||
|
|
settings = config.get_complexity_settings()
|
|||
|
|
print("\n根据当前复杂程度等级的设置:")
|
|||
|
|
print(f"问句前缀数量: {len(settings['question_prefixes'])}")
|
|||
|
|
print(f"答句前缀数量: {len(settings['answer_prefixes'])}")
|
|||
|
|
print(f"答句后缀数量: {len(settings['answer_suffixes'])}")
|
|||
|
|
print(f"连接词数量: {len(settings['connectors'])}")
|
|||
|
|
print(f"单列模板数: {settings['single_templates']}")
|
|||
|
|
print(f"多列模板数: {settings['multi_templates']}")
|
|||
|
|
print(f"多列占比: {settings['multi_ratio']}")
|