LLM 엔지니어링8장 · Project 01. 내 데이터로 답하는 LLM 서비스3 / 11← 이전목차다음 →MetaContents

8장. Project 01. 내 데이터로 답하는 LLM 서비스

팀 프로젝트 진행 방법

김장을 여럿이 할 때는 배추 절이기, 양념 만들기, 버무리기를 나눠 맡고, 중간중간 간을 봅니다. 모두가 한꺼번에 버무리기부터 하면 일이 꼬입니다. LLM 서비스도 일을 나누고, 순서대로, 자주 맛을 보며 만듭니다.

질문 묶음 만들기, 기준선 세우기, 하나씩 고치기, 발표하기의 네 걸음 흐름도

1번에서 서비스가 받을 질문과 정답을 먼저 모읍니다. 2번에서 가장 단순한 RAG(6장 수준)로 첫 성적을 냅니다. 3번에서 검색, 조각, 프롬프트, 모델 가운데 하나만 바꾸고 다시 잽니다. 한 번에 여러 가지를 바꾸면 무엇 덕분에 나아졌는지 알 수 없습니다. 4번에서 성적표와 시연으로 발표합니다. 여기서 간 보기가 질문 묶음으로 재는 일입니다.

역할 나누기

역할하는 일쓰는 장
데이터 담당문서를 모으고 정리해 조각으로 나눈다. 질문 묶음을 만든다6장, 7장
검색 담당임베딩, 하이브리드, 재정렬을 골라 hit@k 를 잰다7장
생성 담당프롬프트와 모델을 고르고 정답, 출처, 모름을 센다6장, 7장
발표 담당바꾼 것과 성적을 기록하고 발표 자료와 시연을 준비한다이 장

세 명이면 검색과 생성을 한 사람이 맡고, 혼자라면 위의 순서대로 혼자 합니다.

바꾼 것 기록하기

무엇을 바꿨고 성적이 어떻게 달라졌는지 표로 남깁니다. 발표 자료가 이 표에서 나옵니다.

Python
import pandas as pd

# 시도할 때마다 한 줄씩 더한다. 아래 숫자는 꼴을 보이려고 적은 설명용 숫자다
log = pd.DataFrame([
    {"번호": 1, "바꾼 것": "기준선(TF-IDF, 조각 3개)", "hit@3": 0.85, "정답": 14, "모름 맞음": 2},
    {"번호": 2, "바꾼 것": "의미 검색으로 바꿈", "hit@3": 0.95, "정답": 16, "모름 맞음": 2},
    {"번호": 3, "바꾼 것": "모를 때의 문구를 다듬음", "hit@3": 0.95, "정답": 17, "모름 맞음": 4},
])
print(log.to_string(index=False))

한 줄에 바꾼 것이 하나씩 들어가 있어, 2번에서 검색이, 3번에서 프롬프트가 성적을 올렸다는 것을 읽을 수 있습니다.

코드에 나오는 함수

코드쉬운 뜻
pd.DataFrame([{...}, {...}])사전 하나가 표의 한 줄이 되는 표를 만든다. 사전의 열쇠(번호, 바꾼 것, hit@3 …)가 열 이름이 된다
"hit@3"7장에서 배운 검색 성적이다. 정답 조각이 검색 결과 위 3개 안에 든 질문의 비율로, 0.85 는 질문 100개 가운데 85개꼴이라는 뜻이다
"정답", "모름 맞음"정답 열쇠 낱말이 든 답의 수, 답이 없는 질문에 모른다고 바르게 말한 수다
log.to_string(index=False)표 전체를 글자로 바꿔 찍는다. index=False 는 왼쪽의 줄 번호(0, 1, 2)를 빼라는 뜻이다

이 코드가 뜻하는 것

요리 노트에 "간장 한 숟가락 더, 맛이 짜졌다"처럼 바꾼 것과 맛을 한 줄씩 적어 두는 것과 같습니다. 한 줄에 하나만 바꿔 적어야, 나중에 노트만 보고도 무엇 때문에 맛이 달라졌는지 압니다. 여기서 노트의 한 줄이 표의 한 줄이고, 맛이 성적 칸입니다.

줄하는 일쉽게 말하면
{"번호": 1, "바꾼 것": "기준선(TF-IDF, 조각 3개)", ...}가장 단순한 첫 버전의 성적을 적는다처음 끓인 맛을 적어 둔다
{"번호": 2, "바꾼 것": "의미 검색으로 바꿈", ...}검색 하나만 바꾼 뒤의 성적을 적는다재료 하나만 바꾸고 다시 맛본다
{"번호": 3, "바꾼 것": "모를 때의 문구를 다듬음", ...}프롬프트 하나만 바꾼 뒤의 성적을 적는다양념 하나만 바꾸고 다시 맛본다
print(log.to_string(index=False))세 줄을 표로 찍는다노트를 펼쳐 한눈에 본다

2번 줄에서는 hit@3 가 0.85 에서 0.95 로, 정답이 14 에서 16 으로 올랐습니다. 3번 줄에서는 hit@3 는 그대로인데 모름 맞음이 2 에서 4 로 올랐습니다. 검색을 바꾸면 검색 성적이, 프롬프트를 바꾸면 답의 태도가 달라진다는 것을 표에서 바로 읽을 수 있습니다.

작게 줄여서 눈으로 보기

줄이 많아지면 숫자를 눈으로 빼 보기가 번거롭습니다. pandas 의 diff()(difference, 차이)로 바로 윗줄과의 차이를 칸으로 더해 봅니다. 숫자는 위 표와 같은 설명용 숫자입니다.

Python
import pandas as pd

# 위의 기록 표와 같은 세 줄(설명용 숫자)
log = pd.DataFrame([
    {"번호": 1, "바꾼 것": "기준선", "정답": 14, "모름 맞음": 2},
    {"번호": 2, "바꾼 것": "의미 검색", "정답": 16, "모름 맞음": 2},
    {"번호": 3, "바꾼 것": "모를 때 문구", "정답": 17, "모름 맞음": 4},
])
# diff(): 바로 윗줄과의 차이. 첫 줄은 윗줄이 없어 빈칸(NaN)이 된다
log["정답 변화"] = log["정답"].diff()
log["모름 변화"] = log["모름 맞음"].diff()
print(log.to_string(index=False))
출력
 번호    바꾼 것  정답  모름 맞음  정답 변화  모름 변화
  1     기준선  14      2    NaN    NaN
  2   의미 검색  16      2    2.0    0.0
  3 모를 때 문구  17      4    1.0    2.0
결과읽는 법
1번 줄의 NaNNaN 은 Not a Number(숫자가 아님)의 머리글자로, 빈칸이라는 뜻이다. 기준선은 견줄 윗줄이 없다
2번 줄의 2.0, 0.0의미 검색으로 바꾸자 정답이 2개 늘고, 모름 맞음은 그대로였다
3번 줄의 1.0, 2.0모를 때의 문구를 다듬자 정답이 1개, 모름 맞음이 2개 늘었다

주의할 점

  • 질문 묶음을 만든 사람과 서비스를 고치는 사람이 같으면 질문이 쉬워지기 쉽습니다. 서로 다른 사람이 만들거나, 실제 사용자의 말투를 흉내 냅니다.
  • 시간이 모자라면 기능을 줄이고 측정은 남깁니다. 재지 않은 개선은 발표할 수 없습니다.
← 이전 절8장 · 용어 짚고 가기다음 절 →8장 · 세 프로젝트 한눈에