본문으로 건너뛰기

가이드

시뮬레이션 사용자

스크립트로 된 대화는 결코 반응하지 않는 사용자를 상대로 어시스턴트를 테스트합니다. 시뮬레이션 사용자는 반응합니다. 모델이 각 케이스가 기술하는 사람을 연기하고, 어시스턴트가 방금 한 말을 보고 다음 메시지를 하나씩 쓰며, 목표를 이루거나 포기하면 멈춥니다. Oloproof는 둘 사이에 오간 내용을 기록하고, 다른 대화처럼 측정하며, 사람들이 그 시뮬레이션 사용자를 현실적이라고 판단한 뒤에야 게이트가 그것에 대해 결정하게 합니다. 튜토리얼은 시뮬레이션 고객과 대화하는 고객 지원 창구를 따라가 봅니다.

페르소나

각 케이스의 입력은 페르소나를 담습니다. 사용자가 누구인지, 무엇을 원하는지, 무엇을 알고 있는지입니다.

{"id": "c25", "input": {"persona": {
  "description": "A retired teacher who ordered a cookbook last week. Writes short, polite messages.",
  "goal": "Have the order of a cookbook delivered to my new address.",
  "facts": {"order": "B-35", "postcode": "10275"}
}}}
  • description과 goal은 필수입니다. 읽는 사람이 대화만 보고 확인할 수 있는 목표를 쓰십시오. "가게가 환불을 시작하게 하기"는 어시스턴트가 하는 말로 판단할 수 있지만, "환불받기"는 그럴 수 없습니다. 돈은 나중에 도착하기 때문입니다.
  • facts는 사용자가 알고 있고 대화에 필요할 때만 알려 주는 것들로, 예를 들어 주문 번호입니다. 어시스턴트는 페르소나를 결코 보지 않습니다.
  • opening은 사용자의 첫 메시지를 글자 그대로 적은 것으로, 모든 시스템이 똑같이 인사를 받아야 할 때 씁니다.
  • max_turns는 이 사용자의 메시지 수 상한으로, 프로젝트의 값보다 우선합니다.

페르소나는 데이터셋 콘텐츠입니다. 스위트 다이제스트에 포함되며, 그것을 상대로 측정되는 모든 시스템에 똑같습니다.

시뮬레이션 사용자 선언하기

모든 페르소나를 연기하는 모델은 심사 모델처럼 시스템에 선언합니다:

system:
  name: support-desk
  callable: desk:talk
  simulated_user:
    provider: openai_compatible
    base_url: http://localhost:11434/v1
    model: qwen2.5vl
    max_turns: 6

모든 필드는 구성 참조에 있습니다. 로컬 모델은 비용이 들지 않습니다. 호스팅된 모델은 그것이 쓰는 메시지마다 청구하며, 그 토큰은 대화 옆에 기록되고 결코 여러분 시스템의 비용으로 계산되지 않습니다.

시스템이 자신의 루프를 유지합니다

Oloproof는 대화를 이끌지 않습니다. 여러분의 시스템이 사용자의 첫 메시지를 요청하고, 평소 사용자에게 답하는 방식대로 답한 다음, 다음 메시지를 받기 위해 각 답변을 돌려줍니다:

from oloproof import current_case

def talk(case):
    user = current_case().simulated_user()
    message = user.opening()
    while message is not None:
        message = user.reply(my_assistant.answer(message))
    return {}

사용자가 멈추면 reply는 None을 반환합니다. 사람에게 넘기는 경우처럼, 시스템이 user.end(answer)로 스스로 대화를 끝낼 수도 있습니다. async def 시스템은 aopening(), areply(answer), aend(answer)를 await합니다. Oloproof는 핸들을 거쳐 간 내용을 conversation/v1로, 대화가 어떻게 끝났는지를 simulated_user/v1로 기록하며, 둘 중 어느 것도 여러분의 시스템으로부터는 받지 않습니다(SDK 레퍼런스).

대화가 끝나는 방식

시스템이 답할 때마다, 시뮬레이션 사용자의 모델에게 그 답변이 목표를 이루었는지를, 온도 0에서 역할극을 뺀 별도의 질문으로 묻습니다. 이루었다면 대화는 goal_reached로 끝납니다. 그렇지 않으면 사용자는 다음 메시지를 쓰거나 떠나며(user_left), max_turns개의 메시지를 보낼 때까지 이어집니다(turn_limit). 마지막 메시지에 답하지 않고 멈추는 시스템은 대화를 unanswered로, 잘린 채로 남깁니다.

따로 묻기 때문에 작은 로컬 모델을 쓸 수 있습니다. 페르소나를 연기하는 일과 목표를 이루었는지 판단하는 일은 서로 다른 작업이며, 한 번의 응답으로 둘 다 하라는 요청을 받은 모델은 목표를 이룬 뒤에도 계속 대화하거나, 만족했는데도 떠나겠다고 말하는 경향이 있습니다.

대화 측정하기

단위는 대화입니다. 각 평가기는 대화 하나당 판정 하나를 내리므로, 모든 구간, 비교, 게이트가 그대로 적용됩니다.

유형통과 조건
conversation_completed시스템이 모든 메시지에 답했다
goal_reached목표 검사가 목표를 이루었다고 판단했다
turns_to_goal그것이 사용자의 메시지 max_turns개 안에 일어났다
every_turn모든 답변이 선언된 조건을 충족한다: 반드시 포함하거나 포함하지 말아야 할 단어, 패턴, 길이
conversation_judge대화 기록 전체를 보는 모델 심사 모델이 통과시킨다. 사람의 레이블과 대조해 검증된 뒤에

반복(replicates:)은 서로 다른 시드의 사용자를 만나므로, 페르소나 하나가 여러 대화가 됩니다. 시뮬레이션 사용자의 버전(그 모델, 프롬프트, 온도, 예산)은 각 실행의 캐시 키에 들어가므로, 다른 시뮬레이션 사용자는 여러분의 시스템을 다시 측정합니다.

시뮬레이션 사용자 검증하기

시뮬레이션 사용자에 대한 결과는 시뮬레이션 사용자가 실제 사용자와 닮은 만큼만 실제 사용자에게 적용됩니다. 그래서 사용자가 시뮬레이션된 실행에 대한 모든 규칙은 사람들이 그 대화를 현실적이라고 판단할 때까지 simulated_user_not_validated와 함께 INSUFFICIENT_EVIDENCE가 됩니다:

oloproof labels export RUN_ID --criterion simulated_user_realistic --sample 30 --local --out realism.csv
oloproof labels import realism.csv
oloproof simulated-users RUN_ID

시트는 추출된 각 대화를 페르소나, 그리고 대화가 어떻게 끝났는지와 함께 보여 줍니다. 실제 고객이 사용자 쪽을 쓰고 바로 그 지점에서, 그런 식으로 대화를 끝냈을 수 있다면, 사람은 passed를 yes로 표시합니다. 이것은 목표 검사도 포괄합니다. 목표를 이루지 못했는데 goal_reached로 끝난 대화는 현실적이지 않습니다. 현실적인 비율의 정확한 하한이 release.yaml의 minimum_simulated_user_realism을 넘으면 시뮬레이션 사용자는 그 스위트에서 검증됩니다. 추출된 대화 중 레이블이 붙지 않은 것은 비현실적인 것으로 세며, 대화는 그것에 레이블을 붙인 모든 사람이 현실적이라고 할 때만 현실적입니다.

검증 하나는 스위트 하나에서 시뮬레이션 사용자의 버전 하나를, 그것이 어느 시스템과 대화했든 다룹니다. 그래서 같은 페르소나를 상대로 측정된 후보는 기준선의 레이블로 결정됩니다. 새 모델, 프롬프트 설정, 페르소나 집합에는 새 레이블이 필요합니다. require_validated_evaluators: false로 설정하면 레이블 없이, 이를 알고서 시뮬레이션 사용자에 대해 결정합니다.

시뮬레이션과 실제를 나란히

oloproof simulated-users RUN_ID --real REAL_RUN_ID는 시뮬레이션된 대화의 형태를 실제 대화의 실행(conversation/v1로 재생한 로그 속 채팅)과 나란히 보여 줍니다. 사용자가 보낸 메시지 수, 그 길이, 답변의 길이, 대화가 도중에 끊긴 빈도, 그리고 시뮬레이션된 대화가 어떻게 끝났는지입니다. 이는 서술적일 뿐 결코 결정하지 않습니다. 대응되지 않는 두 표본을 비교하려면 Oloproof가 아직 인정하지 않은 방법이 필요합니다. 현실성 레이블이 놓치는 것을 보려고 읽으십시오. 예를 들어 실제 사용자가 세 번에 나눠 쓰는 내용을 깔끔한 한 문장으로 쓰는 시뮬레이션 사용자입니다.

지원되지 않는 것

  • 호스팅된 워크스페이스에서 시뮬레이션 사용자에 대해 결정하는 것: 그 리뷰 대기열가 현실성 레이블을 스스로 추출하고 봉인할 수 있을 때까지 그 결정은 보류됩니다.
  • 시뮬레이션된 대화가 실제 대화와 어떻게 비교되는지에 대한 게이트.
  • 대화 안의 턴 단위 비율, 그리고 어떤 턴부터 대화를 재생하는 것.
  • HTTP 시스템을 위한 시뮬레이션 사용자: 루프를 실행하는 것은 여러분 시스템 자신의 코드이므로, 시스템은 호출 가능해야 합니다.