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

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

평가표와 발표

요리 대회의 심사위원은 맛만 보지 않고 모양, 위생, 시간도 봅니다. 서비스도 정답 수 하나로 평가하지 않고, 근거를 바르게 댔는지, 모를 때 모른다고 했는지, 얼마나 빨랐는지를 함께 봅니다.

검색, 정답, 출처, 모를 때, 속도의 다섯 가지 평가 항목을 카드로 놓은 그림

다섯 카드가 이 장의 평가 항목입니다. 검색은 hit@k, 정답은 정답 열쇠, 출처는 적은 조항·절이 맞는지, 모를 때는 없는 질문에 모른다고 했는지(또는 넘겼는지), 속도는 질문 하나에 걸린 시간입니다. 여기서 심사위원의 채점표가 평가표입니다.

평가 항목

항목재는 법어디서 배웠나
검색정답 조각이 위 k 개 안에 든 비율(hit@k)7장
정답답에 정답 열쇠 낱말이 들어 있나6장
출처답에 적은 조항, 절, 공지가 근거와 같은가6장 프로젝트
모를 때없는 질문에 모른다고 하거나 넘겼나, 있는 질문을 지나치게 거절하지 않았나6장
속도질문 묶음 전체에 걸린 시간 ÷ 질문 수6장

발표의 짜임

순서담을 것시간
1누가 무엇을 묻는 서비스인가, 데이터는 무엇인가1분
2기준선의 성적1분
3바꾼 것과 바뀐 성적(기록 표)3분
4시연: 잘 되는 질문 둘, 안 되는 질문 하나3분
5남은 문제와 실제 데이터로 옮길 때의 계획2분

안 되는 질문도 보여 주는 것이 좋습니다. 어디서 틀리는지 아는 팀이 고칠 곳도 압니다.

성적을 한 줄로 내기

Python
def report(name, hits, correct, sources, idk, n_in, n_out, seconds):
    """프로젝트 성적을 한 줄 사전으로. n_in: 답이 있는 질문 수, n_out: 없는 질문 수"""
    return {"버전": name, "hit@3": f"{hits}/{n_in}", "정답": f"{correct}/{n_in}", "출처": f"{sources}/{n_in}",
            "모름 맞음": f"{idk}/{n_out}", "질문당 초": round(seconds / (n_in + n_out), 1)}

print(report("기준선", 20, 17, 13, 3, 22, 3, 50.0))

{'버전': '기준선', 'hit@3': '20/22', '정답': '17/22', '출처': '13/22', '모름 맞음': '3/3', '질문당 초': 2.0} 이 나옵니다. 숫자는 꼴을 보이려고 넣은 설명용 숫자입니다.

코드에 나오는 함수

코드쉬운 뜻
report(name, hits, correct, sources, idk, n_in, n_out, seconds)성적 재료를 받아 한 줄 사전으로 돌려준다. hits 는 검색 성공 수, correct 는 정답 수, sources 는 출처가 맞은 수, idk 는 I don't know(모르겠다)를 줄인 이름으로 모름 맞음 수, seconds 는 걸린 시간(초)이다
n_in, n_out문서 안에 답이 있는 질문 수(in, 안), 답이 없는 질문 수(out, 밖)다
f"{hits}/{n_in}"숫자 둘을 "20/22" 꼴의 글자로 붙인다. 비율로 나누지 않고 몇 개 가운데 몇 개인지 그대로 보여 준다
round(seconds / (n_in + n_out), 1)전체 시간을 모든 질문 수로 나눠 질문 하나당 걸린 시간을 구하고 소수 첫째 자리까지 줄인다

이 코드가 뜻하는 것

학교 성적표에 과목마다 점수가 한 칸씩 있는 것과 같습니다. 국어 점수만 보고 그 학생을 다 안다고 할 수 없듯, 서비스도 정답 수 하나만 보지 않고 다섯 칸을 함께 봅니다. 여기서 과목이 평가 항목이고, report() 가 성적표 한 장을 찍어 주는 기계입니다.

줄하는 일쉽게 말하면
"hit@3": f"{hits}/{n_in}"답이 있는 질문 22개 가운데 검색이 성공한 수를 적는다검색 과목 점수
"정답": f"{correct}/{n_in}", "출처": f"{sources}/{n_in}"정답과 출처가 맞은 수를 같은 22개 기준으로 적는다답 과목, 근거 과목 점수
"모름 맞음": f"{idk}/{n_out}"답이 없는 질문 3개 가운데 모른다고 바르게 말한 수를 적는다모를 때 솔직했나
"질문당 초": round(seconds / (n_in + n_out), 1)50초를 질문 25개로 나눠 2.0 을 적는다얼마나 빨랐나

모름 맞음만 분모가 n_out 인 점을 눈여겨봅니다. 답이 없는 질문에서만 잴 수 있는 항목이라서, 다른 칸과 분모가 다릅니다.

작게 줄여서 눈으로 보기

report() 가 사전을 돌려주므로, 버전마다 부른 결과를 목록에 모으면 pandas 표 하나로 견줄 수 있습니다. 숫자는 설명용 숫자입니다.

Python
import pandas as pd

def report(name, hits, correct, sources, idk, n_in, n_out, seconds):
    return {"버전": name, "hit@3": f"{hits}/{n_in}", "정답": f"{correct}/{n_in}", "출처": f"{sources}/{n_in}",
            "모름 맞음": f"{idk}/{n_out}", "질문당 초": round(seconds / (n_in + n_out), 1)}

# 버전 둘의 성적을 한 표로 모은다(설명용 숫자)
rows = [report("기준선", 20, 17, 13, 3, 22, 3, 50.0),
        report("출처 다듬음", 20, 18, 19, 3, 22, 3, 55.0)]
print(pd.DataFrame(rows).to_string(index=False))
출력
    버전 hit@3    정답    출처 모름 맞음  질문당 초
   기준선 20/22 17/22 13/22   3/3    2.0
출처 다듬음 20/22 18/22 19/22   3/3    2.2
결과읽는 법
hit@3 20/22 두 줄검색은 바꾸지 않아 두 버전이 같다
출처 13/22 → 19/22출처를 다듬은 버전에서 근거가 맞은 답이 6개 늘었다
질문당 초 2.0 → 2.2대신 질문 하나에 0.2초 더 걸렸다. 나아진 점과 나빠진 점을 함께 발표한다

주의할 점

  • 정답 열쇠 채점은 낱말만 봅니다. 발표 전에 답을 몇 개 직접 읽어, 열쇠는 맞았지만 뜻이 틀린 답이 있는지 확인합니다.
  • 실제 사용자 정보가 든 데이터로 시연하지 않습니다. 시연은 가상 데이터나 공개 데이터로 합니다.
← 이전 절8장 · 서비스의 짜임다음 절 →8장 · 프로젝트 1 — 아파트 생활 안내 챗봇