12장. 멀티모달 RAG 와 데이터셋 자동 생성
미세조정 데이터셋 자동 생성
선생님은 교과서를 읽고 문제집을 만듭니다. 문제 수백 개를 손으로 쓰려면 오래 걸리지만, 교과서의 쪽마다 "이 쪽에서 문제 네 개"를 내 달라고 맡기면 금방 모입니다. 데이터셋 자동 생성은 LLM 에게 문서를 절마다 주고 질문과 답을 만들게 하는 일입니다.
1번에서 고객 안내서를 절 12개로 나눕니다. 2번에서 절마다 "이 글로 질문과 답을 4쌍 만드세요"라는 지시에 예시 한 쌍을 붙여 보냅니다. 3번에서 JSON 모드로 답을 받아 읽고, 4번에서 쌍마다 어느 절에서 나왔는지 출처를 붙여 모읍니다. 여기서 교과서의 쪽이 문서의 절, 문제집이 생성한 데이터셋입니다.
생성 지시를 다듬은 기록
교안을 만들며 처음 쓴 지시와 고친 지시를 견줍니다. 처음 지시에서는 답 자리에 "[안내문]"이라는 낱말만 적거나, 우산 절에서 휴대폰 충전 질문을 지어내는 일이 많았습니다.
| 고친 것 | 처음 | 고친 뒤 |
|---|---|---|
| 글의 이름표 | "[안내문]" 이라는 이름표를 붙였다 | 이름표 없이 "글: 제목: 본문" |
| 예시 | 없음 | 다른 주제(주차)의 질문-답 2쌍을 user, assistant 차례로 보여 준다 |
| 온도 | 0.7 | 0.3 |
| 결과(교안을 만든 PC) | 48쌍 가운데 쓸 만한 것이 절반이 안 됐다 | 29쌍, 대부분 글에 맞는 답 |
생성 지시의 꼴
example_in = "주차: 매장 주차장은 2시간까지 무료입니다. 그 뒤로는 30분에 1,000원입니다."
example_out = '{"쌍": [{"질문": "주차는 몇 시간까지 무료예요?", "답": "매장 주차장은 2시간까지 무료입니다."}]}'
section = "선물 포장: 선물 포장은 1,500원입니다."
# 예시를 user/assistant 차례로 보여 주고(퓨샷), 마지막에 진짜 글을 준다
messages = [{"role": "system", "content": "주어진 글에 있는 사실로만 고객 질문과 상담원 답을 JSON 으로 만듭니다."},
{"role": "user", "content": "글: " + example_in}, {"role": "assistant", "content": example_out},
{"role": "user", "content": "글: " + section + "\n질문과 답을 4쌍 만드세요."}]
print([m["role"] for m in messages])코드에 나오는 함수
| 코드 | 쉬운 뜻 |
|---|---|
example_in, example_out | 보여 줄 예시의 글과 답이다. 답은 JSON 꼴의 글로 적었다 |
{"role": "assistant", "content": example_out} | 모델이 이미 이렇게 답한 것처럼 끼워 넣은 예시 답이다. 예시 몇 개를 보여 주는 이 방법을 퓨샷(few-shot, 몇 번 보여 주기)이라고 한다 |
"글: " + section + "\n..." | 진짜 글 뒤에 줄을 바꿔 할 일을 붙인다 |
[m["role"] for m in messages] | 메시지마다 role 만 뽑아 차례를 본다 |
이 코드가 뜻하는 것
식당에 새 직원이 오면 지배인이 먼저 규칙을 일러 주고, 손님 역과 직원 역으로 주문 받기를 한 번 시연한 뒤, 진짜 손님을 맡깁니다. 여기서 지배인의 규칙이 system, 시연이 예시 user 와 assistant 한 쌍, 진짜 손님이 마지막 user 입니다.
| 줄 | 하는 일 | 쉽게 말하면 |
|---|---|---|
example_in, example_out | 다른 주제(주차)의 글과 답 예시 | 시연용 손님과 시연용 답 |
section = ... | 진짜로 질문과 답을 만들 글 | 진짜 손님 |
messages = [...] | 규칙, 시연, 진짜 글을 차례로 놓는다 | 교육 순서 |
print([m["role"] ...]) | 메시지의 차례만 보인다 | 순서표를 본다 |
실행하면 ['system', 'user', 'assistant', 'user'] 가 나옵니다. 마지막이 user 이므로 모델은 그다음 assistant 차례로, 예시 답과 같은 JSON 꼴의 답을 쓰게 됩니다. 예시의 주제를 진짜 글과 다르게 고른 것은 예시의 내용을 베껴 쓰지 않게 하려는 것입니다.
주의할 점
- 생성 데이터의 질은 지시와 모델에 크게 달려 있습니다. 작은 모델(3B)로 만든 데이터는 반드시 걸러서 씁니다(다음 절).
- 다른 회사의 LLM API 로 데이터를 만들면 그 서비스의 약관(생성물로 경쟁 모델을 학습하지 말라는 조항 등)을 확인합니다. 이 장은 이 PC 의 Ollama 로 만듭니다.