8장. 최종 프로젝트
시연과 피드백
새 메뉴를 내기 전에 여는 시식회를 떠올려 보세요. 맛있는 것 두어 가지를 먼저 내고, 아직 손볼 것도 하나 솔직하게 내놓은 뒤, 손님의 의견을 쪽지에 받습니다. 다음 시식회에서는 "지난번에 짜다고 하셔서 간을 줄였습니다"라고 고친 것을 알립니다. 챗봇의 시연도 이렇게 합니다. 정해 둔 순서로 잘 되는 질문과 안 되는 질문을 보여 주고, 피드백을 기록하고, 고친 뒤 같은 평가를 다시 돌려 결과를 함께 적습니다.
네 상자가 시연 하나의 흐름입니다. 시연 점검표로 첫 화면과 키 노출을 확인하고(1), 정해 둔 질문 순서대로 시연하고(2), 피드백을 표에 받아 적고(3), 고친 뒤 평가와 점검표를 다시 돌립니다(4). 4번에서 다시 1번으로 돌아가는 고리가 회귀 시험입니다. 여기서 시식회의 메뉴 순서가 시연 질문의 순서, 손님의 쪽지가 피드백 기록 표입니다. 비유와 다른 점은, 음식의 간은 사람마다 좋아하는 정도가 달라도 되지만 챗봇의 답은 문서와 맞는지 아닌지로 갈린다는 것입니다.
시연의 순서
| 순서 | 보일 것 | 까닭 |
|---|---|---|
| 1 | 설계서 한 장: 누가, 무엇을, 어떤 문서로 | 듣는 사람이 무엇을 볼지 먼저 안다 |
| 2 | 평가 결과: hit@1, hit@3, 범위 밖 질문의 결과 | 숫자로 어디까지 되는지 보인다 |
| 3 | 잘 되는 질문 둘(근거 펼쳐 보이기) | 답과 근거가 맞는지 함께 본다 |
| 4 | 범위 밖 질문 하나("찾지 못했습니다") | 모를 때 지어내지 않는 것을 보인다 |
| 5 | 아직 안 되는 질문 하나와 고칠 계획 | 어디서 틀리는지 아는 것이 다음 고칠 곳이다 |
| 6 | 피드백 기록 표: 받은 피드백, 고친 것, 다시 잰 결과 | 지난 시연 뒤에 무엇이 나아졌는지 보인다 |
시연 전 점검표
짧은 예시
키 꼴의 글을 찾는 점검과 피드백 기록 표를 만들어 봅니다. 피드백은 프로젝트 1에서 받았다고 지어낸 것이고, 다시 잰 결과는 프로젝트 1의 실제 출력에서 옮겼습니다.
import re
import pandas as pd
# 키 꼴의 글: sk- 로 시작하고 영문·숫자·_·- 가 20글자 넘게 이어진다(7차시 프로젝트)
KEY = re.compile(r"sk-[A-Za-z0-9_-]{20,}")
files = {
"app.py": 'api_key = os.getenv("OPENAI_API_KEY")',
"old_app.py": 'api_key = "sk-proj-' + "0" * 24 + '" # 시험하다 남긴 줄(0 으로 채운 가짜 값)',
}
for name, code in files.items():
# 키 자체는 찍지 않고 결과만 찍는다
print(name, "→", "키 꼴의 글 있음" if KEY.search(code) else "통과")
# 피드백 기록 표: 받은 피드백 하나에 고친 것 하나, 다시 잰 결과 하나
log = pd.DataFrame([
{"받은 피드백": "집에서 일해도 되냐고 물으면 엉뚱한 조항이 나온다",
"고친 것": "별칭 사전(집에서 일 → 재택근무)", "다시 잰 결과": "1위 적중 6/10 → 9/10"},
{"받은 피드백": "규정에 없는 것을 물어도 아무 조항이나 보여 준다",
"고친 것": "거리 문턱 1.67", "다시 잰 결과": "규정 밖 질문 3/3 모름"},
])
print(log.to_string(index=False))app.py → 통과
old_app.py → 키 꼴의 글 있음
받은 피드백 고친 것 다시 잰 결과
집에서 일해도 되냐고 물으면 엉뚱한 조항이 나온다 별칭 사전(집에서 일 → 재택근무) 1위 적중 6/10 → 9/10
규정에 없는 것을 물어도 아무 조항이나 보여 준다 거리 문턱 1.67 규정 밖 질문 3/3 모름app.py 는 키를 환경 변수에서 읽기만 하므로 통과했고, old_app.py 는 시험하다 남긴 줄 때문에 걸렸습니다. 피드백 기록 표는 한 줄에 피드백 하나, 고친 것 하나를 적습니다. 한 번에 여러 가지를 고치면 무엇 덕분에 나아졌는지 알 수 없습니다.
코드가 의미하는 것
이 코드는 시식회 전에 주방을 둘러보는 점검과, 손님 쪽지를 받아 적는 기록장을 함께 흉내 냅니다. 정규식으로 키 꼴의 글을 찾고, 피드백 한 줄에 고친 것 하나를 짝지어 표로 만드는 두 동작입니다.
| 코드 | 하는 일 | 챗봇에서 뜻하는 것 |
|---|---|---|
re.compile(r"sk-[A-Za-z0-9_-]{20,}") | 키 꼴의 글을 찾는 무늬를 만든다 | 7장 프로젝트의 키 노출 점검입니다. 시연 전에 코드에 키가 남았는지를 사람 눈 대신 코드가 훑습니다 |
KEY.search(code) | 글 안에 무늬와 맞는 곳이 있는지 본다 | 찾았는지만 찍고 키 자체는 찍지 않습니다. 점검 결과가 화면이나 기록에 남아도 키가 퍼지지 않게 하려는 것입니다 |
"0" * 24 | 0 으로 채운 가짜 값을 만든다 | 진짜 키 없이 "걸리는 경우"를 시험합니다 |
pd.DataFrame([{"받은 피드백": …, "고친 것": …, "다시 잰 결과": …}]) | 피드백 기록 표를 만든다 | 시연 순서 6번에 보일 표입니다. 한 줄에 피드백, 고친 것, 다시 잰 결과를 묶어 무엇이 무엇을 낫게 했는지 따라가게 합니다 |
결과에서 읽을 것은 두 가지입니다.
- 두 파일, 두 결과입니다.
app.py는 "통과",old_app.py는 "키 꼴의 글 있음"입니다. 환경 변수에서 키를 읽는 줄은 무늬에 걸리지 않습니다. - 표의 숫자는 프로젝트 1에서 왔습니다. "1위 적중 6/10 → 9/10"과 "규정 밖 질문 3/3 모름"은 프로젝트 1 3단계의 실제 출력이고, 피드백 글은 지어낸 것입니다.
주의할 점
- 시연은 미리 정해 둔 질문으로 합니다. 그 자리에서 떠오른 질문을 받는 것도 좋지만, 그 결과는 "새로 들은 말투"로 평가 질문에 더해 다음에 잽니다.
- 진짜 키로 시연한 앱을 웹에 계속 열어 두면 주소를 아는 누구의 질문에도 요금이 붙습니다. 시연이 끝나면 7장 프로젝트의 안내대로 앱을 지우거나 Secrets 의 키를 뺍니다.