멀티턴 온라인 평가자 설정하기

멀티턴 온라인 평가자 설정하기

멀티턴 온라인 평가자를 사용하면 인간과 에이전트 사이의 전체 대화를 평가할 수 있어요. 개별 교환만이 아니라, 스레드 내 모든 턴에 걸친 end-to-end 상호작용 품질을 측정해요.

팁: 모델·API 키·프롬프트를 구성하지 않아도 되는 LangChain 관리형 스레드 레벨 심판을 사용하려면 LangChain Tuned Evaluators를 참조하세요.

멀티턴 평가로 다음을 측정할 수 있어요:

  1. 의미적 의도(Semantic Intent): 사용자가 무엇을 하려 했는지.
  2. 의미적 결과(Semantic Outcome): 실제로 무엇이 일어났는지, 과제가 성공했는지.
  3. 궤적(Trajectory): 대화가 어떻게 전개되었는지, 도구 호출의 궤적을 포함.

참고: 멀티턴 온라인 평가자는 기본적으로 트레이스 보존을 연장할 수 있어요. 평가자 구성 시 옵트아웃해서 트레이스가 프로젝트의 구성된 보존 등급을 유지하도록 할 수 있어요. 다른 작업이 명시적으로 보존을 연장하거나 프로젝트가 이미 확장 보존을 사용 중이라면 트레이스는 여전히 업그레이드돼요. 단계별 옵트아웃 방법은 평가자 트레이스 보존 관리를 참조하세요. 자세한 내용은 데이터 보존 자동 업그레이드를 참조하세요.

출처: 문서

본문

작동 방식

멀티턴 온라인 평가자는 다음 평가 수명주기를 따르며:

  1. 트레이스 수집: 대화의 각 턴은 별도의 런으로 트레이싱되고, 공유 스레드 ID를 사용해 스레드에 연결돼요.
  2. 유휴 시간 감지: 스레드의 마지막 트레이스가 수집된 후, LangSmith는 구성된 유휴 시간이 경과할 때까지 기다려요. 이 유휴 기간은 대화가 완료되어 평가할 준비가 되었음을 나타내요.
  3. 메시지 조립: LangSmith는 스레드의 각 트레이스에서 messages를 수집해 단일 대화 기록으로 조립해요. 각 트레이스가 최신 메시지만 포함한다면 LangSmith는 턴을 넘나들며 메시지를 이어 붙여요. 각 트레이스가 전체 기록을 포함한다면 LangSmith는 그대로 사용해요. 스레드의 연속된 트레이스가 이전 기록을 재전송하는 경우가 많으므로, LangSmith는 겹치는 메시지를 중복 제거해 각 메시지가 한 번만 나타나도록 해요. 결과는 OpenAI 채팅 형식({"role": ..., "content": ...})의 단일 메시지 목록이며, 이것이 프롬프트의 all_messages 변수로 해석되는 값이에요.
  4. LLM-as-a-judge 평가: 조립된 대화가 구성한 LLM-as-a-judge 프롬프트에 전달돼요. 평가자는 의미적 의도·결과·궤적 같은 기준에 따라 전체 스레드를 채점해요.
  5. 피드백 기록: 평가자는 구성한 피드백 키를 사용해 스레드에 연결된 피드백을 LangSmith에 기록해요.

이 수명주기는 멀티턴 평가자가 트레이스마다가 아니라 완료된 스레드마다 한 번씩 실행됨을 의미해요. 트레이스별 평가가 필요하다면 런 레벨 온라인 평가자를 사용하세요.

사전 준비 사항

  • 트레이싱 프로젝트가 스레드를 사용 중이어야 해요.
  • 스레드 내 각 트레이스의 최상위 입력과 출력에는 메시지 목록을 담은 messages 키가 있어야 해요. LangChain, OpenAI Chat Completions, Anthropic Messages 형식의 메시지를 지원해요.
    • 각 트레이스의 최상위 입력과 출력이 대화의 최신 메시지만 담고 있다면, LangSmith가 턴을 넘나들며 메시지를 자동으로 스레드로 결합해요.
    • 각 트레이스의 최상위 입력과 출력이 전체 대화 기록을 담고 있다면, LangSmith가 그대로 사용해요.

참고: 트레이스가 위 형식을 따르지 않으면 스레드 레벨 평가자가 동작하지 않아요. 각 트레이스의 최상위 입력과 출력에 messages 목록이 포함되도록 LangSmith로의 트레이싱 방식을 업데이트해야 해요.

자세한 내용은 문제 해결 섹션을 참조하세요.

구성

  1. Tracing 페이지로 이동해 트레이싱 프로젝트를 선택하세요.

  2. Evaluators 탭을 클릭한 다음 + Evaluator를 클릭하세요. Create from scratch 아래에서 LLM-as-a-Judge Evaluator를 선택하세요. Source에서 Threads를 선택하세요.

  3. 평가자 이름을 지정하세요.

  4. 필터 또는 샘플링 비율을 적용하세요.

    평가자 비용을 통제하려면 필터나 샘플링을 사용하세요. 예를 들어 N 턴 미만의 스레드만 평가하거나 전체 스레드의 10%를 샘플링하세요.

  5. 유휴 시간을 구성하세요.

    스레드 레벨 평가자를 처음 구성할 때 유휴 시간(스레드의 마지막 트레이스 이후 평가할 준비가 된 것으로 간주되기까지의 시간)을 정의할 수 있어요. 이 값은 앱에서 예상되는 사용자 상호작용 길이를 반영해야 해요. 유휴 시간은 기본값이 10분이며 2분 미만으로는 설정할 수 없어요.

    참고: 유휴 시간은 프로젝트 레벨 설정이에요. 프로젝트의 모든 스레드 레벨 평가자와 아이템 유형이 Threads인 모든 자동화 규칙에 적용돼요.

    팁: 평가자를 처음 테스트할 때는 결과를 빨리 볼 수 있도록 짧은 유휴 시간을 사용하세요(2분 최소값 적용). 검증이 끝나면 예상 사용자 상호작용 길이에 맞게 늘리세요.

  6. 모델을 구성하세요.

    평가자에 사용할 공급자와 모델을 선택하세요. 스레드는 길어지는 경향이 있으므로 한도에 부딪히지 않도록 더 높은 컨텍스트 윈도우를 가진 모델을 사용해야 해요. 예를 들어 OpenAI의 GPT-5.4 mini나 Gemini 2.5 Flash는 둘 다 1M+ 토큰 컨텍스트 윈도우를 가지므로 좋은 선택이에요.

  7. LLM-as-a-judge 프롬프트를 구성하세요.

    무엇을 평가할지 정의하세요. 이 프롬프트가 스레드를 평가하는 데 사용돼요. 또한 all_messages 변수를 통해 조립된 대화의 어떤 부분을 평가자에게 전달할지 구성해서 평가자가 받는 콘텐츠를 제어할 수 있어요:

    • 모든 메시지: 전체 대화를 OpenAI 채팅 형식({"role": ..., "content": ...})의 JSON 메시지 객체 목록으로 보내며, 각 메시지는 들여쓰기된 JSON으로 렌더링되고 빈 줄로 구분돼요.
    • 인간과 AI 쌍: 사용자와 어시스턴트 메시지만 보내며 <user>...</user><assistant>...</assistant> 형식으로, 시스템 메시지·도구 호출·기타 역할은 제외해요.
    • 첫 인간과 마지막 AI: 첫 사용자 메시지와 마지막 어시스턴트 응답만 보내요.
  8. 피드백 구성을 설정하세요.

    피드백 키의 이름, 수집할 피드백 형식을 구성하고 선택적으로 피드백에 대한 추론을 활성화하세요.

    ⚠️ 스레드 레벨 평가자와 런 레벨 평가자에 동일한 피드백 키를 사용하는 것은 권장하지 않아요. 둘을 구분하기 어려울 수 있기 때문이에요.

  9. 평가자를 저장하세요.

    저장 후 평가자는 Evaluators 탭에 나타나요. 저장 후 생성된 새 스레드의 유휴 시간이 경과하면 테스트할 수 있어요.

제한 사항

다음은 스레드 레벨 처리의 현재 제한 사항(변경될 수 있음)이에요. 멀티턴 온라인 평가자와 아이템 유형이 Threads자동화 규칙에 적용돼요. 이러한 제한에 부딪히면 문의하세요.

  • 런은 1주 미만이어야 함: 스레드가 유휴 상태가 되면 최근 7일 이내의 런만 평가 대상이 돼요.
  • 한 번에 최대 500개 스레드 처리: 단일 실행은 최근 활동 순으로 최대 500개의 일치하는 스레드를 처리해요.
  • 워크스페이스당 최대 10개의 멀티턴 온라인 평가자

문제 해결

평가자 상태 확인

트레이싱 프로젝트 내의 Evaluators 탭으로 이동해 만든 평가자의 Logs 버튼을 클릭하면 평가자가 마지막으로 실행된 시점을 확인할 수 있어요.

평가자에게 전송된 데이터 검사

트레이싱 프로젝트 내의 Evaluators 탭으로 이동해 만든 평가자를 클릭하고 Evaluator traces 탭을 클릭하면 평가자에게 전송된 데이터를 검사할 수 있어요.

이 탭에서는 LLM-as-a-judge 평가자에 전달된 입력을 볼 수 있어요. 메시지가 올바르게 전달되지 않으면 입력에 빈 값이 보일 거예요. 메시지가 예상 형식 중 하나로 포맷되지 않았을 때 이런 일이 발생할 수 있어요.

더 알아보기 (Learn more)