[ 샘플1, 샘플2, 샘플3, ... ] ← 최상위는 리스트(배열)
JSON 파일 자체가 샘플들을 쭉 담은 리스트임. 샘플 하나가 "이미지 1장 + 그 이미지에 대한 대화 1세트"임.
샘플 = {
id: 식별자,
image: 이미지 파일명,
conversations: [ 대화턴1, 대화턴2, ... ]
}
세 개 필드가 있고, 그 중 conversations가 또 리스트임. 즉 한 샘플 안에 "대화"가 또 통째로 들어있는 중첩 구조임.
대화턴 = {
from: "human" 또는 "gpt",
value: 텍스트
}
대화턴 하나는 "누가 말했는지(from)" + "뭐라고 말했는지(value)" 딱 두 개로만 구성됨. 보통 human 한 턴, gpt 한 턴이 쌍으로 묶여서 등장함.
JSON 파일
└─ 샘플 리스트
├─ 샘플
│ ├─ id
│ ├─ image
│ └─ conversations
│ ├─ {from: human, value: ...}
│ └─ {from: gpt, value: ...}
├─ 샘플
│ └─ ...
└─ ...
리스트로 감싼 이유 — 학습 데이터가 수백, 수천 개 샘플이니까 하나씩 따로 파일 만들 수 없어서 통째로 배열에 담음.
id, image, conversations 분리한 이유 — id는 그냥 이름표, image는 시각 정보, conversations는 언어 정보. 이렇게 셋을 나눠놔야 나중에 "이미지는 어디 있고 텍스트는 뭐였는지"를 쉽게 찾아 쓸 수 있음.
conversations를 리스트로 만든 이유 — 질문-답변이 한 번만 오갈 수도 있고(싱글턴), 여러 번 오갈 수도 있음(멀티턴). 리스트 구조라서 턴 개수가 늘어나도 형식이 깨지지 않음.
from / value로만 구성한 이유 — "누가" + "뭐라고"만 있으면 대화를 표현하는 데 충분함. 더 복잡한 정보(시간, 감정 등) 없이 최소한의 구조로 단순하게 만든 거임.