τ³-bench · SOPBench · τ²-bench

2026년 10월 · 프로젝트 페이지

Policy Harness

LLM 에이전트가 제안한 도구 호출을 실행 직전에 검사하는 결정론적 정책 층입니다. 모델은 학습하지 않고, 도메인이 바뀌면 선언 파일 하나만 바꿉니다.

LLM 에이전트 → 정책 층(닫힌 조건 검사) → 통과하면 도구 실행, 어기면 사실과 정책 문장을 돌려주고 모델이 다시 제안

학습하지 않은 공개 27B 모델이 τ³-bench banking_knowledge에서 pass^1 49.5에서 57.2로 오릅니다. 공개 리더보드 1위(55.2)보다 높습니다. 모델 가중치, 도구, 벤치마크의 정책 문서는 그대로 두고 층 하나만 더했습니다.

그림 1 · τ³-BENCH BANKING층 하나로 같은 모델이 공개 1위를 넘는다
회색은 층 없는 모델, 남색은 층을 더한 같은 모델, 빈 원은 공개 1위입니다. 97과제 × 4회 · 사용자 시뮬레이터 gpt-5.2 · 모든 팔 같은 하네스. pass^k는 k번 시도에서 모두 성공한 과제의 비율입니다. 층 없는 pass^4는 시뮬레이션 1건의 인프라 오류로 정의되지 않습니다. 개발 공개: banking 규칙은 이 과제들을 보며 만들었고, 참조 해에서 온 규칙은 이 실행 전에 뺐습니다(측정 방법).
+7.7
성능. 층만으로 오른 banking pass^1. 네 번 모두 실패하던 과제는 35개에서 25개로 줄었습니다.
파일 1개
이동 비용. 새 도메인에는 선언 파일 하나만 씁니다. 엔진에는 도메인 단어가 없고, 바꾸지 않습니다.
0건
신뢰도. 올바른 행동을 잘못 막은 횟수(처음 보는 airline 20과제). 모든 판정은 결정론적이고 기록됩니다.

문제

알면서 어기는 실수

고객 상담 에이전트는 정책을 읽고, 도구를 부르고, 데이터베이스에 씁니다. 실패의 대부분은 지식이 모자라서 생기지 않습니다. 필요한 조회 없이 쓰기, 머릿속 암산, 아무도 말하지 않은 값처럼 확인할 수 있는 작은 실수에서 생깁니다. 기록에 한 번 쓰면 되돌릴 수 없으니, 실수 하나로 과제가 끝납니다.

그림 2 · 같은 취소 요청고객의 말을 믿을까, 기록을 믿을까
고객
모델
정책 층
도구 · 기록
1예약을 취소하고 싶어요. 10시간 전쯤 예약했어요.
2get_reservation_details
3기록 created_at 2024-05-02 · 정책 시각 05-15
4cancel_reservation(…) 고객 말만 믿음
실행됨
예약 취소

거부 · 실행 안 함

✕ 24시간 이내 예약인가?
기록 05-02 · 정책 시각 05-15

① 실행 안 한 호출 cancel_reservation

② 기록의 사실 created_at 2024-05-02

③ 정책의 취소 조건 원문

실행 안 됨
기록 그대로
5거부문 (값·다음 행동 없음)
6기록상 5월 2일 예약이라 24시간이 지나 그 사유로는 취소할 수 없어요. 다른 조건에 해당하는지 볼게요.
과제 실패. 모델은 "10시간 전"이라는 말을 믿었습니다. 기록은 5월 2일, 정책의 현재 시각은 5월 15일로 24시간을 한참 넘깁니다.
거부문에는 실행하지 않은 호출, 기록에서 읽은 사실, 정책 문장만 들어 있습니다. 넣을 값이나 다음 행동은 제안하지 않습니다. 답장은 모델이 직접 씁니다.

실제 거부문 · 같은 규칙이 τ² airline 과제 43 에서 낸 것 (일부)

…The reservation record read in this conversation shows created_at 2024-05-04T07:38:29 (current time stated in the policy: 2024-05-15 15:00:00), cabin basic_economy, insurance no; flight status reads in this conversation showing a segment of it cancelled: 0. …

여기 들어간 값은 이 대화에서 읽은 기록의 사실뿐입니다. 정책 원문은 이 발췌에서 생략했습니다.

τ²-bench airline 과제 48을 옮긴 예시(ID 생략, 기록과 거부문은 줄임, 모델의 답은 예시). 실제 거부문은 ①②③을 한 문단으로 쓰고 정책 문장을 원문 그대로 인용합니다. 이 규칙이 없던 GPT-4o-mini 실행에서는 취소가 실행되어 과제가 실패했습니다. 그 궤적에 규칙을 재생하면 바로 그 호출에서 발동합니다. 출처: VOCAB_EXT.md §5-2.

아이디어

프로그램이 판정할 수 있는 것만 강제

어떤 정책 조건은 보기만 하면 답이 정해집니다. 조회를 했는지, 가져온 기록의 필드 값이 무엇인지, 어떤 값이 도구 출력에 있는지. 다른 조건은 해석이 필요합니다. 이 요청이 합당한지, 고객이 무슨 뜻으로 말했는지. 정책 층은 앞의 것만 강제하고 뒤의 것은 모델에 맡깁니다.

그림 3 · 닫힌 조건과 열린 조건답이 기록에 있으면 층이, 해석이 필요하면 모델이

닫힘층이 강제

사건, 기록의 필드, 대화 속 문자열만으로 답이 정해집니다.

  • 사건cancel 전에 예약을 조회했는가?
  • 기록created_at이 정책 시각 기준 24시간 이내인가?
  • 문자열쓰려는 우편번호가 도구 출력이나 고객 말에 나오는가?
  • 계산환불액이 가져온 기록으로 계산한 값과 같은가?

열림모델이 판단

해석이 필요합니다. 층은 규칙 문장을 보여 줄 수는 있어도, 이 조건으로 막지는 않습니다.

  • 의도고객이 정말 계좌를 닫고 싶은가?
  • 어조상위 담당자에게 넘길 불만인가?
  • 적합성세 상품 중 고객 설명에 맞는 것은?
  • 의미"며칠 전"은 기간 안인가?
왜 이렇게 나누나. 해석이 필요한 검사를 하려면 또 다른 모델이 필요하고, 그 모델도 실수합니다. 닫힌 조건만 강제하면 층이 요청을 잘못 읽을 일이 없습니다. 모든 거부는 에이전트가 직접 볼 수 있는 사실로 설명됩니다.

작동 방식

한 턴의 흐름

스크롤하면 단계마다 그림에서 해당 부분이 밝아지고, 점이 정보가 흐르는 길을 따라 움직입니다.

1 · 제안

모델이 대화를 읽고 다음 턴을 제안합니다. 도구 호출일 수도, 고객에게 보낼 메시지일 수도 있습니다. 아직 아무것도 실행되지 않았습니다.

2 · 읽기

엔진이 도메인의 선언 파일과 지금까지의 대화 기록을 읽습니다. 어떤 도구가 돌았고, 무엇을 돌려줬고, 고객이 무엇을 말했는지 봅니다.

3 · 검사

일곱 레버가 제안된 호출의 닫힌 조건을 검사합니다. 각 레버는 조용히 넘어가거나, 어긴 사실 하나를 보고합니다. 레버 하나하나는 아래 「일곱 레버」에서 설명합니다.

4a · 통과

어긴 것이 없으면 호출은 그대로 실제 도구로 갑니다. 층은 인자를 고치지 않습니다.

4b · 거부

어긴 것이 있으면 호출은 실행되지 않습니다. 모델은 그 호출, 확인되지 않은 사실, 정책 문장을 받고 다시 제안합니다. 재시도는 작은 고정 예산 안에서만 하므로 대화가 멈추지 않습니다.

5 · 기록

통과, 거부, 계산 주입, 재시도를 모두 근거가 된 도구 출력과 함께 감사 로그에 씁니다. 같은 입력이면 같은 판정이 나옵니다.

거부문에 값을 넣지 않는 이유

층이 고칠 값을 적어 주면(예: "환불 0으로 취소하라") 규칙의 실수가 곧 행동의 실수가 됩니다. 어긴 사실과 정책 문장만 돌려주면 다음 행동의 책임은 모델에 남고, 층이 두 번째 에이전트처럼 움직이지 않습니다.

일곱 레버

실수 유형별 레버

레버는 실패한 궤적을 읽으며 되풀이되는 실수에 이름을 붙여 만들었습니다. 하나를 골라 무엇을 읽고, 무엇을 판정하고, 끄면 점수가 어떻게 되는지 확인해 보세요.

그림 4 · 레버 탐색기읽기 → 판정 → 하는 일, 그리고 끄면 생기는 일
예시는 이 페이지를 위해 쓴 것이며 선언 파일의 규칙 원문이 아닙니다. 끄기 실험: 층 전체가 발동한 과제에서 레버를 하나씩 끔. 붉은 띠는 층 없는 점수 이하 구간입니다. 출처: ABLATION*.md.

도메인 이동

엔진은 그대로, 선언 파일만 교체

엔진 코드에는 "카드", "항공편", "수수료" 같은 도메인 단어가 없습니다. 도메인에 딸린 것은 모두 선언 파일 하나에 있습니다. 어떤 쓰기에 어떤 조회가 먼저 필요한지, 어떤 값에 출처가 있어야 하는지, 어떤 계산을 쓸 수 있는지, 어떤 도구에 어떤 정책 문장이 붙는지.

그림 5 · 같은 엔진, 바뀌는 선언파일을 바꾸면 같은 엔진이 다른 도메인에서 돈다
τ² airline으로 옮길 때 엔진에 연산자 4개(hours_between · count_of · prefix · eq)와 피연산자 1개(now)를 더했습니다(+74줄). 그 뒤에도 기록된 banking 6,197턴의 판정은 바이트 단위로 같았습니다. 출처: VOCAB_EXT.md.

수치

닫힌 규칙을 어기는 곳에서 이득

선언 파일만 바꿔 같은 층을 벤치마크 두 개와 모델 설정 열 개에서 돌렸습니다. 모델이 닫힌 규칙을 자주 어기는 곳에서는 이득이 크고, 그렇지 않은 곳에서는 사라집니다.

그림 6 · 전이, pass^1같은 층, 다른 도메인과 모델
채점

모델별 점수: 회색 점은 층 없음, 남색 점은 층 있음. 기준 점수 대비 이득: 가로는 층 없는 점수, 세로는 층이 더한 점수. 채운 점은 airline, 빈 점은 SOPBench library, 회색 점은 retail입니다. 점에 마우스를 올리면 값이 보입니다. airline에서는 기준 점수가 높을수록 이득이 줄고, 이미 정책을 지키는 27B 모델에서는 층이 한 과제에서만 발동했습니다. retail은 어느 모델에서도 이득이 없습니다. 실패 대부분이 해석이 필요한 판단이나 시뮬레이터 행동에서 나오기 때문입니다. SOPBench hotel(그림에 없음)은 공식 채점기로 +11.0, 채점기 결함을 고치면 −0.4라서 주장하지 않습니다.
그림 7 · 레버 하나씩 끄기근거(LB3)를 끄면 세 설정 모두 붉은 띠로 떨어진다
근거(LB3)가 층 전체를 떠받칩니다. LB3을 끄면 다른 레버가 넣는 계산값과 정책 문장을 모델이 자기 추측과 섞어, 세 설정 모두 층 없는 수준 이하로 떨어집니다. LB1의 기여는 모델이 순서를 얼마나 자주 어기는지를 따라갑니다. GPT-4o-mini는 순서 거부가 40건이었고 LB1을 끄면 9.2 떨어집니다. Qwen3-8B는 10건이었고 떨어지지 않습니다. LB4는 약간 음수라 주장에서 뺐습니다.
그림 8 · 신뢰도처음 보는 과제에서도, 다른 방법과 나란히 놓아도

처음 보는 airline 과제

학습용 30과제만 보고 규칙을 만든 뒤, 보지 않은 20과제로 채점했습니다. GPT-4o-mini 31.2 → 52.5, 막힌 올바른 행동은 0건입니다.

공개된 게이트와 같은 조건 비교

Reason Less, Verify More(2607.07405)는 airline 전용 게이트 4개를 공개했습니다. 우리 시뮬레이터와 과제로 다시 돌렸습니다. 발동 과제에서 잃은 시뮬레이션: 이 층 1건, 게이트 5건.

한계

효과가 없던 세 곳

≈0
τ² retail, 4개 모델 모두. 실패 대부분이 어느 상품, 어느 옵션 같은 판단이 필요하거나, 사용자 시뮬레이터가 대화를 일찍 끝내서 생깁니다. 닫힌 규칙 위반은 적습니다.
≈0
τ² airline, Qwen3.8-27B. 모델이 이미 정책을 지킵니다. 층은 한 과제에서 발동했고 순효과는 0입니다. 강한 모델에는 잡을 실수가 적습니다.
−0.4
SOPBench hotel. 공식 채점기로는 +11.0이지만, 56과제의 OR→AND 채점 결함을 고치면 −0.4입니다. 공식 이득은 채점기가 만든 착시입니다.

효과가 없는 곳에서 손해도 없었습니다. 수백 번의 시뮬레이션 가운데 잃은 것은 0~3건이고, 잘못된 거부 때문에 잃은 경우는 없었습니다.

측정 방법

우리 이득으로 잘못 셀 수 있는 것들

두 팔은 같은 엔진 인스턴스에서

vLLM 인스턴스를 바꾸기만 해도 SOPBench 66과제 중 30과제에서 첫 응답이 달라졌고, 층이 발동하지 않은 결과의 8.9%가 뒤집혔습니다. 실제 효과만큼 큰 크기입니다. 여기 있는 모든 A/B는 두 팔을 한 인스턴스에서 돌렸습니다.

이득은 발동한 과제에서만 셈

층이 실제로 거부하거나 값을 넣은 과제에서만 이득을 층 덕분으로 셉니다. 층이 조용했던 과제는 잡음 범위를 보여 줍니다(SOPBench library: 실행당 −0.25과제).

SOPBench 채점기 결함

공식 채점기는 기록된 호출을 eval()로 다시 읽어서 JSON 불리언이 실패하고 날짜가 산술식으로 계산됩니다. 값을 돌려주는 목표 행동은 항상 실패로 채점됩니다. hotel에서는 참조 그래프의 OR가 195과제 중 56과제에서 AND로 접힙니다. 우리 수정을 끄면 공식 function-calling 모델 21개의 공개 점수가 그대로 재현됩니다. 공식 수치를 먼저 적습니다.

사용자 시뮬레이터의 조기 종료 (τ²)

감사한 실패 80건 중 32건에서 시뮬레이터가 "Yes"와 종료 신호를 한 메시지에 보냅니다. 정책을 지키는 에이전트는 실행할 차례를 얻지 못합니다. 이 천장은 같은 시뮬레이터를 쓰는 모든 제출에 똑같이 걸립니다.

개발 공개 (banking)

banking 규칙은 평가용 97과제를 보며, 보상과 참조 해를 살펴 만들었습니다. 규칙마다 출처를 감사했습니다. (A) 에이전트가 받는 정책 원문 인용, (B) 전문가라면 과제와 무관하게 말할 일반 관행, (C) 참조 해에 맞아서 고른 형태. C 항목은 제출 실행 전에 모두 뺐습니다. 이 결과는 테스트를 보지 않은 결과가 아니고, 처음 보는 과제로 확인한 것은 airline 보류 시험입니다.

실행 중 층이 보는 정보

실행 중에 층은 제안된 턴, 에이전트가 받은 도구 출력, 에이전트가 받는 정책 문서, 선언 파일만 읽습니다. 과제 목표, 참조 행동, 채점기 상태에는 접근하지 않습니다.