hyunsu blog

홈강좌LAYA 결정 모델 24편 중 4편째

LAYA 질문 설계 — 규칙을 설명에 적었더니 정확도가 떨어졌다

목차 · 4
  1. 01설명만 바꿔 묻는다
  2. 02그래서 이 시리즈는
  3. 03설명을 쓸 때 지킬 것
  4. 04실습 — 한국어를 영어 체크포인트에 보내면

같은 문의 200건에 선택지 설명만 바꿔 물었다. 팀 이름만 쓰면 0.690, 짧은 낱말은 0.695 인데, 우리 회사 규칙을 설명에 자세히 적으면 0.550 으로 오히려 떨어졌다. 학습하지 않은 모델에게는 설명의 낱말이 판단을 끌고 간다. 이 편은 그 실험과, 한국어는 다국어 체크포인트로 가야 한다는 것을 확인한다.

평가 데이터(tickets-eval.jsonl)는 5·6편에서 만드는 고객 문의 200건이다. 미리 가져와 쓴다.

01 설명만 바꿔 묻는다

python
"""같은 평가 문의 200건에 선택지 설명만 바꿔 묻는다 — 질문 설계가 정확도를 얼마나 바꾸나."""
import json

import laya

agent = laya.load("convaiinnovations/laya", subfolder="multilingual")
cases = [json.loads(line) for line in open("tickets-eval.jsonl", encoding="utf-8")]

designs = {
    "names only": {"billing": "billing", "delivery": "delivery", "account": "account", "technical": "technical"},
    "short words": {"billing": "결제", "delivery": "배송", "account": "계정", "technical": "오류"},
    "our rules": {
        "billing": "결제·환불·쿠폰·영수증",
        "delivery": "배송·교환·반품",
        "account": "로그인·비밀번호·회원·포인트",
        "technical": "앱·웹사이트 오류, 결제창 오류 포함",
    },
}
for name, criteria in designs.items():
    question = {"team": {"type": "choice", "instructions": "이 문의를 맡을 팀은?", "criteria": criteria}}
    hits = sum(agent.predict(c["state"], question)["answers"]["team"]["choice"] == c["expected"]["team"] for c in cases)
    print(f"{name:<12} accuracy {hits / len(cases):.3f} ({hits}/{len(cases)})")

세 가지 설명이다.

  • names only — 팀 이름(영어)만.
  • short words — 한국어 낱말 하나씩.
  • our rules — 우리 회사의 규칙을 자세히. "교환·반품은 배송팀", "포인트는 계정팀", "결제창 오류는 기술팀" 같은 것이다.
bash
python criteria.py
text
names only   accuracy 0.690 (138/200)
short words  accuracy 0.695 (139/200)
our rules    accuracy 0.550 (110/200)
그림 1.선택지 설명만 바꿨을 때 팀 정확도
0.00.20.40.60.81.0이름만짧은 낱말회사 규칙이름만: 0.690짧은 낱말: 0.695회사 규칙: 0.5500.6900.6950.5500.00.20.40.60.81.0이름만짧은 낱말회사 규칙이름만: 0.690짧은 낱말: 0.695회사 규칙: 0.5500.6900.6950.550

같은 문의 200건, 학습하지 않은 multilingual 체크포인트

숫자로 보기
항목정확도
이름만0.690
짧은 낱말0.695
회사 규칙0.550

규칙을 자세히 적은 설명이 가장 낮다. 5편에서 보겠지만 이 설명으로 물으면 거의 모든 문의가 기술팀으로 간다. 기술팀 설명에 들어간 "결제창" 이 결제 문의를, "오류" 가 "안 돼요"·"안 들어왔어요" 같은 불편 표현을 끌어당긴다. 학습하지 않은 모델은 규칙을 이해한다기보다 문장과 설명에 겹치는 낱말에 끌린다.

그렇다고 짧게만 쓰면 되는 것도 아니다. 이름만으로 0.69 인 것은 "환불"·"택배" 처럼 흔한 낱말이 들어간 쉬운 문의를 맞힌 덕이고, "포인트가 안 들어왔어요(계정)"·"쿠폰 칸이 안 눌려요(기술)" 같은 회사 규칙은 어떤 설명으로도 가르치기 어렵다.

02 그래서 이 시리즈는

  • 질문 설명은 사람이 읽는 규칙 문서로 생각하고 그대로 둔다. 학습 데이터·서비스 요청에서 똑같은 문장을 쓴다(6편).
  • 규칙은 설명이 아니라 **예시(학습 데이터)**로 가르친다. 5편의 기본 점수 0.55 는 이 규칙 설명으로 잰 것이고, 8편에서 학습 뒤 같은 설명으로 다시 잰다.

설명을 바꿀 때마다 이 편처럼 숫자로 비교한다. "더 자세히 쓰면 낫겠지" 라는 짐작은 이번처럼 틀릴 수 있다.

03 설명을 쓸 때 지킬 것

공식 모델 카드의 한계와 실험에서 얻은 것을 합치면 이렇다.

  1. 선택지는 20개를 넘기지 않는다. 선택지 설명이 한정된 토큰 자리를 나눠 쓰기 때문에, 많아질수록 정확도가 떨어진다고 모델 카드가 적고 있다. 많으면 두 단계(대분류 → 소분류)로 나눈다.
  2. 선택지끼리 낱말이 겹치지 않게 쓴다. 이번처럼 기술팀 설명에 "결제" 가 들어가면 결제 문의가 끌려간다.
  3. score 는 가장 약한 질문 종류다(모델 카드). 급한 정도처럼 꼭 단계가 필요할 때만 쓰고, 예/아니오로 충분하면 noul 을 쓴다.
  4. 학습한 뒤에는 질문 문장을 바꾸지 않는다. 모델이 그 문장과 함께 배웠다.

04 실습 — 한국어를 영어 체크포인트에 보내면

라우터가 언어를 보고 체크포인트를 고르지만, 억지로 고를 수도 있다. 같은 한국어 문장을 셋에 보내 봤다.

python
"""한국어 문장을 영어 체크포인트에 억지로 보내면 어떻게 되나."""
from laya import Router

router = Router()
question = {
    "team": {
        "type": "choice",
        "instructions": "이 문의를 맡을 팀은?",
        "criteria": {"billing": "결제·환불", "delivery": "배송·교환", "technical": "앱 오류"},
    },
}
text = "택배가 일주일째 안 와요."
for model in ["auto", "english", "multilingual"]:
    result = router.predict(text, question) if model == "auto" else router.predict(text, question, model=model)
    answer = result["answers"]["team"]
    probs = ", ".join(f"{k} {v:.2f}" for k, v in answer["probabilities"].items())
    print(f"{model:<12} -> {result['routing']['model']:<12} {answer['choice']:<9} ({probs})")
bash
python wrong_model.py
text
auto         -> multilingual delivery  (billing 0.00, delivery 1.00, technical 0.00)
.venv/lib/python3.12/site-packages/laya/router.py:1109: RuntimeWarning: laya: this checkpoint ships invalid temperatures or values outside [0.5, 5]; using choice:11+=0.10058280825614929 -> 0.5. Treat confidence from the affected entries as uncalibrated.
  return Agent(repo, **kwargs)
english      -> english      billing   (billing 0.43, delivery 0.32, technical 0.25)
multilingual -> multilingual delivery  (billing 0.00, delivery 1.00, technical 0.00)
  • auto 와 multilingual 은 배송팀을 1.00 으로 맞혔다.
  • english 는 billing 0.43·delivery 0.32·technical 0.25 로 거의 고르게 퍼졌다. 영어 체크포인트는 한글을 읽지 못해 아무거나 고른 것이다. 중간의 경고(배포된 온도 값이 범위를 벗어나 보정하지 않은 확신으로 취급하라는 것)도 이 체크포인트에서 나왔다.

한국어 서비스는 다국어 체크포인트(multilingual)를 쓴다. 학습할 때도 --base multilingual 로 시작한다(7편). 다음 편에서 학습 전 기본 모델의 점수를 정식으로 잰다.