본문 바로가기
C.W.K.
Stream
Lesson 03 of 06 · published

챗봇과 대화 평가

~18 min · systems, chatbot, multi-turn

Level 0추측자
0 XP0/55 lessons0/10 achievements
0/150 XP to next level150 XP to go0% complete

다중 턴에서는 모든 것이 달라져

단일 턴 평가에서는 "이 질문에 대한 답이 좋은가?"를 묻고, 대화 평가에서는 "이 대화가 잘 진행되고 있는가?"를 물어. 두 번째가 훨씬 어려워. 품질이 맥락, 기억, 일관성, 대화의 진행 경로에 따라 달라지기 때문이야.

대화 전용 지표

  • 턴별 품질 — 각 응답을 독립적으로 평가해. 다중 턴에서도 여전히 유용해.
  • 맥락 유지 — 봇이 대화 초반에 나온 내용을 기억해?
  • 주제 일관성 — 뒤의 턴이 앞선 턴의 내용을 논리적으로 이어 가?
  • 반복 — 봇이 같은 말을 반복해?
  • 대화 완료율 — 다중 턴 대화 가운데 성공적인 종료 상태에 도달한 비율은 얼마야?
  • 사용자 노력 신호 — 해결까지 걸린 턴 수, 상담원 전환율, 이탈률을 측정해.

두 가지 평가 패턴

  1. 고정 대화 평가 — 미리 기록한 대화를 새 시스템에서 다시 실행해. 빠르고 저렴하며 결정론적이지만, 봇의 실제 응답에 따라 달라지는 행동은 놓칠 수 있어.
  2. 실시간 시뮬레이션 평가 — 다른 LLM을 "사용자 시뮬레이터"로 삼아 봇과 대화하게 해. 예상치 못한 행동을 포착할 수 있고 더 현실적이지만, 속도가 느리고 비용도 더 들어.
원칙: 고정 대화 평가와 모의 대화 평가를 모두 실행해. 고정 평가는 적은 비용으로 회귀를 잡고, 모의 평가는 고정 평가가 보지 못하는 문제를 찾아내.

운영 환경의 대화 관측 자료

해결까지 걸린 턴 수, 이탈률, 상담원 전환율을 실시간 지표로 추적해. 모두 사용자 노력을 간접적으로 보여 주는 지표야. 이런 지표가 악화되면 턴별 품질 점수에 변화가 없어 보여도 실제 대화 경험은 나빠진 거야.

Code

고정 대화 재생 평가·python
def replay_conversation(conversation, bot):
    """Replay a recorded conversation, scoring each new bot response."""
    history = []
    scores = []
    for turn in conversation:
        if turn["role"] == "user":
            history.append(turn)
        else:  # role = assistant
            new_response = bot.complete(history)
            score = judge(turn, new_response, history=history)  # compare to recorded
            scores.append(score)
            history.append({"role": "assistant", "content": new_response})
    return scores
실시간 다중 턴 평가용 사용자 시뮬레이터·python
USER_SIMULATOR_PROMPT = """
You are role-playing a user trying to accomplish this goal: {goal}
Be realistic — sometimes ask follow-up questions, sometimes get confused.
End the conversation when you are satisfied or give up.

Keep messages short (1-2 sentences). Reply ONLY with what the user would say.
"""

def simulate_conversation(goal, bot, simulator, max_turns=10):
    history = []
    for turn in range(max_turns):
        sim_msg = simulator.complete(USER_SIMULATOR_PROMPT.format(goal=goal), history=history)
        if sim_msg.strip().lower() in ("thanks", "goodbye", "that's enough"):
            break
        history.append({"role": "user", "content": sim_msg})
        bot_msg = bot.complete(history)
        history.append({"role": "assistant", "content": bot_msg})
    return history

External links

Exercise

운영 로그에서 익명화한 다중 턴 대화 10개를 골라 고정 평가 자료로 만들어. 현재 봇과 프롬프트 변경 후보를 각각 적용해 다시 실행하고, 턴별 품질과 대화 완료율을 독립적으로 평가해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.