AI가 내 의견에 점수를 매기려면?
이달의 우수사원에서 승패를 정하는 심판은 LLM입니다. 매번 다른 답을 내고 가끔 틀린 모양의 답을 내는 부품 위에 게임 규칙을 세우기 위해 무엇을 했는지 정리했습니다.
이달의 우수사원에서 AI는 연출용 장식이 아니라 게임 규칙의 일부입니다. 플레이어가 자유롭게 쓴 한 문장을 평가해 승패를 결정하는 심판이 LLM이고, 매 라운드 경쟁 상대가 되는 참모 3인의 대사도 LLM이 만듭니다. 정해진 선택지가 없기 때문에 성립하는 게임이고, 그만큼 출력의 품질과 다양성과 일관성을 코드가 어디까지 보장하느냐가 설계의 핵심이었습니다.
LLM은 매번 다른 답을 내고, 가끔 틀린 모양의 답을 냅니다. 게임 규칙이 그 출력에 걸려 있으므로 장치가 필요했습니다.
4개의 역할
오늘의 우수사원에서 AI의 역할은 크게 4개입니다.
| 참모 발언 | 그 라운드 참모 3인의 대사를 한 번의 호출로 한꺼번에 생성합니다. 뒤 참모가 앞 참모를 받아치는 릴레이를 프롬프트가 유지합니다. |
| 심판 | 모든 발언을 보스의 채점축 3개로 0~10점씩 채점하고, 채택자와 채택 사유, 발언자별 한 줄 인물평을 생성합니다. 게임의 승패를 정하는 호출입니다. |
| 에필로그 | 채택된 간언을 실행했을 때 벌어진 "그 후 이야기"를 짧은 코미디로 서술합니다. |
| 보스 생성 | 유저가 적은 몇 줄의 컨셉으로 보스 페르소나 팩 한 벌(채점축·직함·참모 4인·상황 10개)을 통째로 집필합니다. 기성 팩과 같은 스키마라 그대로 플레이에 투입됩니다. |
비용을 절약하기 위해 참모 3인의 대사를 호출 하나로 묶었고, 심판과 에필로그 생성 각각 한 번씩 라운드당 LLM 호출은 3회로 고정됩니다.
승패를 LLM에게 다 맡기지 않는다
심판 호출이 게임의 승패를 정하지만, 있는 그대로 입력하면 출력을 그대로 믿기 어렵습니다.
채점 직전에 발언자 실명을 발언자1·발언자2로 마스킹하고, 결과를 받은 뒤 서버가 실명으로 복원합니다. 조조가 곽가라는 이름값에 점수를 주는 배경지식 편향을 데이터 레벨에서 차단하기 위해서입니다. 오직 발언 내용만 채점됩니다.
모델이 고른 채택자도 그대로 쓰지 않습니다. 축 점수를 코드가 다시 합산해 최고 점수를 채택으로 확정합니다. 승패는 결국 결정적 로직이 정합니다.
판정 기준에는 사후 지식 페널티도 명시했습니다. 그 시점의 인물이 알 수 없는 정보에 기대는 발언은 감점입니다. 역사의 결말을 아는 플레이어가 결과론으로 이기는 것을 막는 장치입니다.
출력이 쏠리고 반복되는 문제
모델에게 맡기면 같은 상황에서 늘 비슷한 해법으로 쏠립니다. 그래서 해법 축 7종(고치기·빼기·포장·미루기·남탓·정면돌파·역이용)을 매 라운드 섞어 참모별로 강제 배정하고, 모델이 다른 축을 적어 와도 배정값으로 덮어씁니다.
참모마다 러닝개그 6개를 갖는데, 라운드마다 코드가 하나를 뽑아 넘깁니다. 30%는 "버릇 없음"으로 비우고, 직전 라운드에 쓴 버릇은 제외해 같은 개그의 연속 반복을 막습니다.
참모 대사는 50~120자로 지시하되, 초과분은 문장 경계에서 잘라 말이 중간에 끊기지 않게 합니다.
틀린 모양의 답
호출마다 응답 스키마를 지정하고, 받은 JSON을 다시 검증합니다. 발언자 누락이나 키 불일치가 나면 1회 자동 재시도합니다.
그래도 실패하면, 그러니까 공급자 체인이 전부 실패하거나 API 키가 아예 없으면, 게임 고유의 대사 생성기가 페르소나에 맞는 대사·판정·에필로그를 만들어 판을 계속 굴립니다. 게임이 멈추지 않습니다. 폴백이 발동한 이유는 로그로 남깁니다.
프롬프트는 코드 밖에
4종 프롬프트의 본문은 전부 콘텐츠 파일에 문자열로 들어 있고, 코드는 토큰 치환과 응답 스키마 조립만 맡습니다. 대사 톤을 고치는 데 코드 수정이나 재배포가 필요 없습니다.