Numan은 체중, 호르몬 및 성 건강 전반에 걸쳐 환자들이 만성 질환을 관리하도록 돕는 영국의 디지털 헬스케어 회사입니다. 저희 환자 중 다수는 체중 감량 프로그램에 참여하며 앱을 매일 사용하여 진행 상황을 추적합니다.
AI 건강 코치인 Nu를 구축할 때, 저희의 디자인 과제 중 하나는 의료 진단, 처방전 발행 또는 임상적 결정으로 넘어가지 않으면서도 고품질의 건강 코칭을 제공하는 것이었습니다. 이는 규제가 엄격한 의료 분야에서 에이전트가 지켜야 할 명확한 경계입니다. 저희가 처음에는 에이전트와 그 주변 자동화에 초점을 맞췄지만, 가장 중요했던 것은 평가 기준의 품질이었습니다. 본 글은 규제 대상 영역을 피하면서도 고품질 사용자 경험을 제공하기 위해 평가 기준을 개발하고 개선해 온 과정을 담고 있습니다.
Nu에게 표준적인 평가 접근 방식이 미흡했던 이유
저희는 대부분의 팀들이 시작하는 지점, 즉 입력 데이터셋과 예상 출력, 그리고 각 답변을 점수 매기는 LLM judge를 가지고 시작했습니다. 이러한 방법론은 Q&A 에이전트에게는 잘 작동하지만, 코칭은 대화이지 정답이 아닙니다. Nu의 답변을 미리 고정하려는 모든 접근 방식은 두 가지 측면에서 실패했습니다:
1. 정적 픽스처를 사용한 단일 턴 평가 (Single-turn evals on static fixtures) (고정된 입력, 고정된 예상 출력, 그리고 하나의 답변에 대해 점수를 매기는 judge). 행동 코칭은 프롬프트에 대한 단 하나의 정답을 갖는 경우가 거의 없으며, 답변이 안전했는지 여부는 그 주변의 대화에 달려 있습니다. Nu는 환자가 어떤 부분에서 어려움을 겪고 있는지 전체 대화를 통해 이해한 후에 조언해야 하며, 환자가 강하게 주장할 때는 적절한 경계를 유지해야 합니다.
전체 데이터셋에 걸쳐 하나의 점수를 평균내는 방식은 Nu가 실패한 지점을 숨겼습니다. 몇 개의 좋지 않은 답변으로는 숫자를 거의 움직이지 못하기 때문에, 실제로는 그렇지 않음에도 불구하고 대화는 준수하는 것처럼 보입니다. 또한 테스트 환경(fixtures)도 두 번째 문제를 야기했습니다. 한 번의 실행에서 낮은 점수의 클러스터가 Nu의 잘못이 아니라 평가 시스템 자체의 결함으로 밝혀졌습니다. 루브릭은 2턴 교환 내에 공감, 탐색 및 조언을 모두 기대했지만, 실제 인간 코치는 이러한 요소들을 대화 전반에 걸쳐 분배합니다. Nu는 적절하게 코칭하고 있었지만, 좁고 고정된 평가 방식이 실패를 잘못 신호했습니다.
2. 스크립트 기반 다중 턴 대화. 단일 턴 테스트 환경의 명확한 해결책은 환자가 예상되는 일련의 답변을 미리 작성하는 것입니다. 이 '스크립트'는 시나리오의 여러 턴을 Nu에게 한 번에 하나씩 공급하여, 평가자가 최종적으로 전체 기록(transcript)을 점수 매길 수 있게 합니다. 이것이 평가자에게 단일 답변보다 더 많은 여지를 주기는 하지만, 평가는 똑같이 무너졌습니다. 환자의 두 번째 턴이 미리 작성되어 있으면, 테스트는 첫 번째 턴에서 Nu가 실제로 말한 내용을 무시합니다. Nu가 스크립트가 예상하지 못한 말을 하는 순간, 이후의 모든 턴은 일어나지 않은 대화에 응답하게 됩니다.
이러한 두 가지 실패 모드는 우리가 그 이후 구축하는 모든 것을 형성했습니다.
오늘날 우리가 실행하는 평가 프레임워크
Nu는 LangGraph 그래프입니다. 감독자 모델(supervisor model)이 도메인 전문 하위 에이전트들에게 핸드오프를 조정하며, 각 하위 에이전트는 자체 프롬프트와 도구를 가진 하나의 코칭 영역에 초점을 맞춥니다. 이러한 구성 모델은 새로운 전문가를 추가하는 것을 저렴하게 만들 뿐만 아니라, 더 중요하게는 모든 분야에 걸쳐 평가 표면(evaluation surface)을 균일하게 유지합니다.
Nu가 정확하게 처리해야 하는 것 중 일부는 단일 응답만으로도 판단할 수 있습니다. 예를 들어, 슈퍼바이저(supervisor)가 올바른 전문 분야로 라우팅했는지, 약물 질문에 안전한 답변을 얻었는지, 또는 안전 장치(safety guard)가 감지해야 할 것을 잡아냈는지 여부 등이 그렇습니다. 이러한 항목들에 대해서는 코칭 품질, 안전성, 약물 문의, 라우팅, 요약 등 테마별 데이터셋을 구축하여 테스트합니다. 기존의 단일 턴 평가와 달리 두 가지를 변경했습니다. 첫째, 모든 데이터셋은 평균 점수가 아닌 LLM 심사관(LLM judge)에 의해 카테고리별로 점수를 매기므로, 다른 부분이 정상으로 보여도 특정 카테고리에서 실패가 집중적으로 발생한 것이 눈에 띕니다. 둘째, 각 루브릭은 단일 응답만으로 알 수 있는 것만을 질문하므로, 심사관이 더 이상 코치가 하듯 대화의 속도를 조절하는 것에 대해 Nu에게 감점하지 않습니다.
고정된 구조로는 커버할 수 없는 모든 것(즉, 전체 대화의 형태가 필요한 것)은 별도의 레이어로 구성되며, 아래에 설명합니다. Nu는 그래프로 작동하기 때문에, 평가는 전체 시스템 또는 단일 서브 에이전트를 대상으로 할 수 있으며, 새로운 전문 분야를 추가하면 평가 대상 영역도 함께 확장됩니다.
"배포하는 것이 곧 테스트하는 것이다"
평가 환경을 구축하는 쉬운 방법은 에이전트의 프롬프트를 복사하여 모델을 직접 호출하는 별도의 하네스(harness)를 만드는 것입니다. 이는 하네스와 실제 운영 환경 간에 괴리가 발생할 때까지는 작동하지만, 저희는 별도의 하네스를 사용하지 않고 배포하는 것이 곧 테스트하는 것이라는 원칙하에 운영합니다. 모든 평가는 환자가 대화하는 동일한 LangGraph 그래프를 통해 실행되므로, 우리가 점수를 매기는 것은 환자가 실제로 접하게 되는 경험과 일치합니다.
규모가 커지면서, 슈퍼바이저와 도메인 전문 분야는 서로 다른 인지적 작업을 수행하기 때문에 모든 에이전트마다 적합한 제공업체(provider)가 있는지 질문하기 시작했습니다. Nu는 현재 두 개의 최첨단 제공업체를 사용하며, 각 에이전트별로 하나씩 선택합니다. 저희의 평가 스위트는 개방형 테마 데이터셋으로 구축되어 있어 이식성이 뛰어나기 때문에, 어떤 구성에 대해서든 동일한 데이터셋을 여러 제공업체에 걸쳐 실행하고 그 결과를 나란히 비교할 수 있었습니다. 일반적으로 몇 주가 걸리는 수동 테스트를 거치는 최첨단 제공업체 간의 마이그레이션이 단 하루 만에 완료되었습니다.
규제 경계를 유지하기 위한 행동 테스트
MHRA(Medicines and Healthcare products Regulatory Agency)의 지침에 따라, 의료 목적을 가진 소프트웨어 기반 제품(임상적 조언 제공, 진단 또는 치료 권고 등)은 의료 기기(medical device)로 간주됩니다. Nu는 임상 치료가 아닌 라이프스타일 코칭 및 교육을 위한 웰니스 제품으로 설계되었습니다.
Nu를 그 범위 내에 유지하는 것은 우리가 모든 변경 사항에서 확인하는 것입니다. 안전 프로브(safety probes)는 카테고리별 지표로 실행되며 출시를 게이트합니다: 회귀가 발생하면 해당 변경 사항은 자동으로 배포되는 것이 차단됩니다. 우리는 안전한 완료(safe-completion) 쪽으로 조정하는데, 이는 코치처럼 들리는 느낌을 유지하면서도 경계를 지키는 리디렉트입니다. 따라서 범위를 벗어난 질문을 하는 환자에게 갑작스러운 거절 대신 따뜻하고 유용한 답변을 제공합니다.
Nu responding to an out-of-scope question with a safe-completion
테스트를 넘어, 가드 노드(guard nodes)가 그래프 내부의 모든 대화에서 실행됩니다. 안전 가드(safety guard)는 환자가 보기 전에 나가는 응답 각각을 고정된 임상 안전 규칙 세트와 비교 검토합니다. 안전하지 않은 초안은 감독자에게 다시 보내져 재생성됩니다. 계속 실패하면, 안전하지 않은 응답을 전달하는 대신 메시지가 안전한 대체 답변으로 교체됩니다. 그리고 가드들이 그래프 내에 위치하기 때문에, 그들은 동일한 평가 표면(eval surface) 안에 있습니다—여기에는 안전 가드가 적절히 포착하는지 테스트하기 위해 특별히 존재하는 테마 데이터셋 중 하나가 있습니다. 추가적으로, 건강 코치들이 매일 실제 대화 샘플을 검토하고 안전 누락처럼 보이는 모든 것을 플래그 지정하여 인간 주제 전문가들이 무엇이 안전한 것으로 간주되는지 보정합니다.
스크립팅 대신 대화를 시뮬레이션하기
저희가 오늘 프로토타입으로 선보이는 가장 새로운 레이어는 대화를 스크립트화하는 대신 시뮬레이션합니다. 평가자에게 환자 페르소나, 시나리오, Nu가 도출해야 할 핵심 문제들, 그리고 턴 제한을 제공합니다. 저렴한 모델이 환자 역할을 맡아 실제 에이전트와 다중 턴 대화를 진행하며 Nu가 말하는 모든 것에 반응합니다. 그런 다음 심사관(judge)이 전체 스크립트를 카테고리별로 점수화합니다. 환자는 고정된 것이 아니라 생성되기 때문에, 우리는 적대적 사례(임상 요청을 코치에게서 빠져나가게 하도록 구성된 표현이나 평범한 질문으로 위장된 조작 등)를 탐색할 수 있으며, 고정된 시나리오에서는 결코 발견하지 못하는 실패들을 포착할 수 있습니다. 예를 들어, 코치가 해야 할 것처럼 조사하기보다 Nu가 성급하게 답변을 내놓는 경우 같은 것입니다.
이러한 시뮬레이션 대화를 통한 프롬프트 강화(prompt hardening) 방식은 규제 경계에 대한 탈옥(jailbreak) 시나리오에서 심각한 범위 위반을 줄였습니다. 저희는 이미 신뢰하는 행동을 프롬프트 개선으로 인해 손상시키지 않도록, 병용 약물 문의 평가를 회귀 게이트(regression gate)로 실행했습니다.
시뮬레이션 대화 레이어를 사용하여 회귀 없이 지속적인 개선을 이루는 것은 엔지니어링 문제라기보다는 루브릭(rubric) 문제입니다. 저희가 이 레이어에 대한 기준을 처음 작성했을 때, 호환된다고 생각했던 두 가지 주제가 복약 누락 처리 방식에서 서로 모순된다는 것이 밝혀졌습니다. 하나는 거절하고 임상의에게 안내하라고 했고, 다른 하나는 환자 정보 리플렛의 일반적인 사실들을 바탕으로 안전하게 완료하라고 했습니다. 하나의 프롬프트로는 두 가지를 모두 만족시킬 수 없습니다. 이러한 프롬프트 충돌 사례는 저희에게 희소하고 가치 있는 자산은 제한된 컨텍스트로부터 유능한 모델이 잘 작성하는 프롬프트 자체가 아니라, 평가 기준(eval criteria)이라는 것을 가르쳐주었습니다. 그리고 규제 경계에서는 그 기준들이 엔지니어가 아닌, 규제 라인을 이해하는 임상의에 의해 작성되고 승인되어야 합니다.
Nu의 시뮬레이션 대화 결과는 엔지니어링으로 작성된 기준에 따라 평가됩니다. 이것이 이 레이어가 임상의가 루브릭(rubric)에 서명하기 전까지는 출시를 통제하거나 어떠한 안전 주장에도 영향을 미치지 않는 이유입니다 (이것이 제품을 웰니스 영역에 머무르게 하는 요소입니다).
스택: LangGraph와 LangSmith
Diagram of Nu's eval stack: real and simulated conversations run through the same LangGraph agent, measured in LangSmith
LangGraph와 LangSmith는 하나의 시스템으로 결합하여 저희의 에이전트 개발 스택을 구성합니다.
LangGraph가 에이전트입니다. 슈퍼바이저(supervisor)가 도메인 전문가들을 트리거하며, 각 전문가는 자체 프롬프트와 도구를 가집니다.
Evals는 동일한 그래프를 통해 실행됩니다. 픽스처(fixture) 평가와 시뮬레이션 대화 평가 레이어 모두 실제 에이전트에 접근하여 전체 시스템 또는 단일 서브-에이전트를 대상으로 할 수 있습니다.
LangSmith는 모든 것이 측정되는 곳입니다. 시뮬레이션된 대화든 실제 대화든, 모든 것은 트레이스(trace)로 기록됩니다. 검토자들은 이 트레이스에 주석을 달아 지속적인 품질 개선 루프를 시작합니다. 데이터셋과 실험도 이곳에 존재합니다. 예를 들어, 저희의 하루 만에 마이그레이션 과정에서 사용된 측면 비교 제공업체 비교는 LangSmith에서 바로 읽어왔습니다.
LangGraph와 LangSmith 간의 통합은 평가 실행 비용을 저렴하게 유지해 줍니다. 세 개의 분리된 도구를 연결하는 접착 코드(glue code)가 필요하지 않습니다. 저희가 배포하는 것과 테스트하는 것은 동일한 그래프이며, 동일한 플랫폼이 이를 감시합니다.
나아갈 방향: 에이전트뿐만 아니라 기준을 확장하기
코칭의 품질은 1) 대화가 좋았는지 결정하는 기준을 작성하고, 2) 그 기준이 테스트되는 범위를 넓히는 것에 달려 있습니다. 따라서 저희는 더 많은 적대적인 페르소나와 시나리오를 테스트하는 데 중점을 두고 있고, 전문가를 더 많이 구축함에 따라 더 많은 주제를 추가하며, 안전이나 범위와 관련된 곳이라면 어디든 임상의 참여 루브릭(clinician-in-the-loop rubric)을 확장하고 있습니다. 검토자들은 LangSmith에서 실제 대화를 계속 읽고 있으며, 엔지니어는 여전히 모든 프롬프트 변경 사항을 상기시킵니다.
지금까지 설명된 모든 것은 오프라인(offline) 상태이며, 이는 변경 사항이 배포되기 전에 규제 라인을 유지하는지 증명합니다. 다음 단계는 LangSmith에서 들어오는 실제 대화에 동일한 루브릭을 지속적으로 실행하여 Nu의 대화 측면을 채점하는 온라인 평가자입니다. 오늘 매일 샘플 코치들이 검토하던 것과 달리, 인간 검토자는 이미 평가자가 플래그를 지정한 대화부터 시작할 것입니다—운영 환경에서 경계가 유지되는지 확인하고 오탐(false alarms) 시 루브릭을 개선하기 위해서입니다.
또한 신뢰할 수 있는 루브릭에 따라 후속 워크플로우를 자동화하는 초기 실험들로부터도 고무적인 결과를 보고 있습니다. 여기에는 검토된 대화를 등급별 백로그로 분류하고, 고정된 벤치마크(benchmark)를 기반으로 프롬프트를 조정하는 것이 포함됩니다. 최근 오프라인 프롬프트 최적화 루프는 단일 행동 벤치마크가 수동 조정 없이도 점수를 의미 있게 개선시킨 것을 보여주었습니다...이는 기준만 제대로 잡으면 나머지는 자동화 가능하다는 우리의 가설을 뒷받침합니다.
규제 라인 근처의 AI 코치 구축하기
어디든 간에 규제 라인(regulatory line) 근처에서 대화형 에이전트(conversational agent)를 구축하고 있다면, 다음 사항들을 권장합니다:
단일 고정 데이터셋으로는 전체 대화를 커버할 수 없습니다. 단일 답변이 보여줄 수 있는 내용에 대한 고정 장치(fixtures)를 유지하고, 나머지 부분은 시뮬레이션된 대화로 처리하며, 종합 점수보다는 카테고리별로 채점해야 합니다.
경계를 탐지기(probe)로 만드세요. 모든 변경 사항에서 실행하고, 회귀 방지(regression)가 배포를 막게 하며, 동일한 루브릭을 운영 환경에 겨냥하세요.
규제된 경계에서는 루브릭이 임상의에게 속합니다. 엔지니어링으로 작성된 기준만으로는 장치를 가동시키기에는 충분하지만, 안전성 주장을 통과시키기에는 충분하지 않습니다.
노력의 대부분을 평가 기준에 투자하십시오. 모든 하류 작업(downstream)은 평가 기준에서 파생됩니다: 더 나은 코칭, 방어 가능한 경계, 그리고 궁극적으로 신뢰할 수 있는 자동화입니다.
기준과 자동화가 성숙함에 따라 다시 글을 쓰겠습니다.