|
import json |
|
import os |
|
|
|
|
|
BASE_INPUT_DIR = "../data/" |
|
BASE_OUTPUT_DIR = "../data/" |
|
TEST_FILE = "korean_culture_qa_V1.0_test+.json" |
|
OUTPUT_TEST = "test.jsonl" |
|
|
|
|
|
INSTRUCTION_TEMPLATES = { |
|
"선다형": """당신은 한국의 전통 문화, 역사, 사회, 과학기술 등 다양한 주제에 대한 객관식 문제에 정확하게 답하는 AI입니다. |
|
|
|
[문제 유형: 선다형] |
|
- 질문과 보기를 읽고 가장 적절한 정답을 고르십시오. |
|
- 정답은 보기 번호에 해당하는 숫자 하나만 출력하십시오. |
|
- 질문이나 보기 내용을 다시 출력하지 말고, 숫자만 단독으로 출력하십시오. |
|
|
|
[예시] |
|
질문: 1896년에 창간된 한국 최초의 민간 신문은? |
|
1\t황성신문 2\t한성순보 3\t제국신문 4\t독립신문 5\t대한매일신보 |
|
답변: 4""", |
|
|
|
"단답형-단어": """당신은 한국의 전통 문화, 역사, 사회, 과학기술 등 다양한 주제에 대한 짧은 단답형 질문에 정확하게 답하는 AI입니다. |
|
|
|
[문제 유형: 단답형-단어] |
|
- 질문에 대해 1~2단어 또는 5어절 이내의 짧은 구로 정답을 출력하십시오. |
|
- 동일 의미의 복수 정답이 존재할 수 있으나, 그중 하나만 정확하게 출력하십시오. |
|
- 설명, 반복, 형식 문구 없이 정답만 단독으로 출력하십시오. |
|
|
|
[예시] |
|
질문: 2005년에 개관하였으며, 교육 및 문화적 목적으로 영화를 상영하는 서울의 유일한 비영리 민간 시네마테크 전용관은 어디인가요? |
|
답변: 서울아트시네마""", |
|
|
|
"단답형-순서": """당신은 한국의 전통 문화, 역사, 사회, 과학기술 등 다양한 주제에 대한 순서 배열 문제에 정확하게 답하는 AI입니다. |
|
|
|
[문제 유형: 단답형-순서] |
|
- 보기의 기호(예: ㄱ, ㄴ, ㄷ, ㄹ)를 순서대로 하이픈(-)으로 연결하여 출력하십시오. |
|
- 설명이나 추가 텍스트 없이 순서만 출력하십시오. |
|
|
|
[예시] |
|
질문: 서울 지하철 신림선을 서원역에서 샛강 방향으로 탔을 때 지나가는 역을 순서대로 나열하세요. 배열 시 각 기호는 '-'로 연결합니다. |
|
ㄱ. 당곡역 ㄴ. 서울지방병무청역 ㄷ. 대방역 ㄹ. 보라매역 |
|
답변: ㄱ-ㄹ-ㄴ-ㄷ""", |
|
|
|
"서술형": """당신은 한국의 전통 문화, 역사, 사회, 과학기술 등 다양한 주제에 대해 명확하고 논리적인 설명문을 작성하는 AI입니다. |
|
|
|
[문제 유형: 서술형] |
|
- 질문에 대해 300자에서 500자 사이의 하나의 문단으로 구성된 설명문을 작성하십시오. |
|
- 배경, 절차, 원인, 예시 등을 바탕으로 독자가 쉽게 이해할 수 있도록 구체적으로 서술하십시오. |
|
- 모든 문장은 문어체 "~이다" 형식으로 종결하고, 동일 문장의 반복이나 불필요한 수식어는 피하십시오. |
|
|
|
[예시 1] |
|
질문: 2024년 기준 한국의 일반 가정에서 태양광 발전기를 설치하고 싶으면 어떻게 해야 하나요? |
|
답변: 일반 가정에서 태양광 발전기를 설치하기 위해서는 한국에너지공단 '그린홈'에서 시공업체를 선택한 뒤 업체가 가정을 방문하여 설치 가능 여부 및 적절성을 평가하는 과정이 먼저 이루어져야 한다. 적절성 평가에 통과되면 업체가 사업신청서를 그린홈에 제출하고 공단의 검토를 받게 된다. 공단의 승인이 난 후 신청자가 예치금을 납부하게 되며 그 후 설비를 시작한다. 설비는 선정한 업체에 의해 이루어진다. 설치가 완료되면 설치 확인 절차를 거쳐 신청자에게 보조금이 지급된다. 초기 설치 비용이 부담되는 경우 대여 사업자를 통해 태양광 발전기를 대여하는 방법도 있다. |
|
|
|
[예시 2] |
|
질문: 한국에서 고등학교 교육과정을 마치지 않고도 고등학교를 졸업한 것과 같이 학력 인정을 받을 수 있는 방법은 무엇인가요? |
|
답변: 고등학교 교육 과정을 마치지 않더라도 고등학교를 졸업한 사람들과 같은 수준의 학력으로 인정을 받기 위해서는 고등학교 졸업 학력 검정고시에 합격해야 한다. 검정고시는 지식, 학력, 기술의 유무를 검정하기 위하여 입학 자격 또는 특정한 자격 취득 과정에서 실시하는 시험이다. 따라서 고등학교 졸업 학력 검정고시에 합격하면 고등학교를 졸업한 자와 동등한 자격을 인정받게 된다. 검정고시는 각 과목을 100점 만점으로 하여 전 과목 평균 60점 이상 취득한 자를 합격자로 결정하고 있다. 다만 평균이 60점 이상이더라도 결시 과목이 있는 경우에는 불합격 처리된다. |
|
|
|
[예시 3] |
|
질문: 누리호에 대한 정보와 그 의의에 관해 설명해 보세요. |
|
답변: 누리호는 한국항공우주연구원에서 개발한 국내 최초의 실용위성급 위성발사체로서, 이는 우리나라가 독자적으로 개발한 첫 번째 실용급 위성발사체라는 점에서 큰 의미를 가진다. 누리호는 단순히 외국 기술에 의존하지 않고, 우리나라 기술진의 힘으로 설계부터 시작하여 제작, 시험, 그리고 최종 발사 운용에 이르기까지 모든 과정을 독자적으로 수행한 발사체이다. 특히, 누리호의 개발과 발사는 단발성이 아닌 단계적으로 진행되었으며, 1호기는 2021년도에 성공적으로 발사되었고, 이후 2호기는 2022년도에, 마지막으로 3호기는 2023년도에 각각 발사되었다. 이로써 한국은 실용급 위성 발사체를 자국 기술로 운영할 수 있는 국가로 자리매김하게 되었다. |
|
|
|
[예시 4] |
|
질문: 김대중 대통령이 2000년 노벨평화상을 받게 되었던 이유는? |
|
답변: 김대중 전 대통령이 노벨평화상을 받은 이유는 한반도의 평화와 남북 화해를 위한 탁월한 노력 때문이다. 그는 대한민국 최초의 평화적 여야 정권 교체를 이루며 제15대 대통령에 취임하였다. 재임 중에는 외환위기 극복과 사회개혁에도 힘썼다. 특히 2000년에는 분단 이후 최초로 남북정상회담을 성사시켜 6·15 남북공동선언을 이끌어냈다. 이는 분단 55년 만의 첫 남북정상회담에서 나온 선언문이었다. 선언을 통해 이산가족 상봉, 경의선·동해선 복원, 경제협력 확대 등 실질적인 평화 조치가 이루어졌으며, 이러한 공로로 김대중 대통령은 한국 최초의 노벨평화상 수상자가 되었다. |
|
|
|
=====""" |
|
} |
|
|
|
|
|
info_map = { |
|
"category": "분야", |
|
"domain": "세부 분야", |
|
"topic_keyword": "주제" |
|
} |
|
|
|
def convert_items(data, remove_hash=True, is_test=False): |
|
converted = [] |
|
for item in data: |
|
input_info = item.get("input", {}) |
|
output_info = item.get("output", {}) |
|
|
|
question_type = input_info.get("question_type") |
|
question = input_info.get("question", "").strip() |
|
raw_answer = output_info.get("answer", "").strip() if not is_test else "" |
|
|
|
|
|
if question_type == "단답형": |
|
if "순서" in question or "차례" in question: |
|
instruction = INSTRUCTION_TEMPLATES["단답형-순서"] |
|
else: |
|
instruction = INSTRUCTION_TEMPLATES["단답형-단어"] |
|
else: |
|
if question_type not in INSTRUCTION_TEMPLATES: |
|
continue |
|
instruction = INSTRUCTION_TEMPLATES[question_type] |
|
|
|
|
|
answer = raw_answer |
|
if remove_hash and "#" in answer: |
|
answer = answer.split("#")[0].strip() |
|
|
|
|
|
extras = [] |
|
for key, label in info_map.items(): |
|
if input_info.get(key): |
|
extras.append(f"- {label}: {input_info[key]}") |
|
|
|
input_text = "" |
|
if extras: |
|
input_text += "[기타 정보]\n" + "\n".join(extras) + "\n\n" |
|
input_text += f"질문: {question}\n답변:" |
|
|
|
converted.append({ |
|
"instruction": instruction, |
|
"input": input_text, |
|
"output": answer |
|
}) |
|
return converted |
|
|
|
def convert_test(test_file, output_file): |
|
with open(test_file, "r", encoding="utf-8") as f: |
|
test_data = json.load(f) |
|
|
|
test_converted = convert_items(test_data, remove_hash=False, is_test=True) |
|
os.makedirs(os.path.dirname(output_file), exist_ok=True) |
|
with open(output_file, "w", encoding="utf-8") as f: |
|
for item in test_converted: |
|
f.write(json.dumps(item, ensure_ascii=False) + "\n") |
|
|
|
print(f"✅ test 변환 완료: {output_file} (총 {len(test_converted)} 샘플)") |
|
|
|
if __name__ == "__main__": |
|
convert_test( |
|
os.path.join(BASE_INPUT_DIR, TEST_FILE), |
|
os.path.join(BASE_OUTPUT_DIR, OUTPUT_TEST) |
|
) |
|
|