훈련: 정책
하네스: 파이선 전처리 중간처리 프로세스
[정책 = 훈련되는 20B LLM]
↓ 행동(action) 출력
[하네스 = 규칙 기반 코드]
├─ 대부분: 순수 알고리즘/코드 (정렬, 정규식, 해시, 문자열 조합...)
└─ 일부 도구 호출 시: 고정된(훈련 안 하는) 보조 모델 사용
├─ verify → LLM 검증기 (고정)
└─ 검색 결과 재정렬 → Qwen3-Reranker-8B (고정)
↓ 다음 관찰(observation) 렌더링
[정책이 다시 관찰을 보고 행동 결정]
Takeaway:
- Loss function
- S3논문
- Golden Dataset Curation: How? KG <--> BFS from A to FL lcoation // count number of common set of files (crashstack & BFS candidates)
0. Abstract
- 검색 에이전트: 계속 늘어나는 대화 기록(transcript) 및 정책(policy)으로 훈련된다.
- 모델은 어떻게 검색할지를 결정해야 할 뿐만 아니라, 지금까지 무엇을 봤는지, 어떤 증거가 유용한지, 어떤 제약 조건이 아직 해소되지 않았는지, 그리고 어떤 주장이 실제로 검증되었는지까지 기억해야 한다.
- --> 정책 내부에 너무 많은 일상적인 상태 관리(routine state management)해야한다고 주장. 이러한 강화학습은 의미론적인 검색 결정과, 환경이 더 안정적으로 유지할 수 있는 복구 역량 작업을 동시에 최적화하도록 강요받고 있는 셈.
- 상태를 유지하는(stateful) 검색 하니스: 강화학습으로 훈련된 20B검색 에이전트(검색 서브에이전트)인 Harness-1을 소개
- Harness-1: 환경 쪽 작업 기억(working memory)을 유지
- candidate pool
- 중요도가 태그된 큐레이션 세트(importance-tagged curated set)
- compact evidence link
- 검증 기록
- 압축,중복제거된 관찰(observation)
- 예산을 고려한 컨텍스트 렌더링
- Harness-1: 환경 쪽 작업 기억(working memory)을 유지
- 정책 모델은: 무엇을 검색할지, 어떤 문서를 유지하거나 버릴지, 무엇을 검증할지, 언제 멈출지 결정 함.
1. Introduction
1.1 문제제기
- 검색 에이전트의 일반적 정의: 검색 도구를 호출하는 언어 모델.
- 질문 --> 쿼리 --> 증거 읽기 --> 부족한 부분 판단 --> 문서 반환.
- 이 관점은 ReAct 스타일 에이전트, 반복적 검색, 능동적 검색, 도구 훈련, 연구 흐름을 따름.
- 하지만 한계가 있음: 에이전트의 "눈에 보이는 행동"만 포착하고, 그 과정에서 필수적으로 구축되는 "검색 상태(search state)"는 놓친다.
- 성공적인 멀티턴 검색 에피소드가 기억해야 하는 것: (검색 상태)
- 어떤 문서를 봤는지
- 어떤 후보가 유지할 만한지
- 어떤 제약 조건이 아직 안 풀렸는지
- 어떤 엔티티가 서로 다른 증거 조각들을 연결하는지
- 어떤 주장이 원문과 대조하여 실제로 검증되었는지
- 성공적인 멀티턴 검색 에피소드가 기억해야 하는 것: (검색 상태)
1.2 강화학습에서 더 악화
- 최근 연구들이 보여준 것: LLM이 검색과 상호작용하도록 RL로 훈련되어 쿼리 생성, 멀티턴 검색, 하위 검색 효용을 향상시킬 수 있음.
- --> 그러나 대부분의 검색-에이전트 훈련은 모델에게 두 가지 다른 것을 동시에 학습시킴:
- 의미론적 검색 행동 (이해 판단): 지금 이 질문에 답하려면 다음에 뭘 검색해야 하는가, 이 문서가 답에 정말 도움이 되는가, 버려야 하는가, 이 주장이 맞는지 검증해야 하는가, 이제 증거가 충분하니 검색을 멈춰야 하는가
- 일상적인 상태 관리 (기록 관리): 지금까지 어떤 문서를 읽었는지 목록으로 남기기, 중복된 검색 결과를 걸러내기, 검증했던 주장들을 어딘가에 기록해두기,
- --> 그러나 대부분의 검색-에이전트 훈련은 모델에게 두 가지 다른 것을 동시에 학습시킴:
- 대화 기록이 길어질 때 생기는 구체적 문제들:
- 정책이 관찰(raw observation)로부터 유용한 검색 상태를 매번 재구성해야 함 --> 비효율적, 학습에서 비효율적
- 비효율적인 이유: raw observation을 보고, 어떤 trajectory가 유용한지, (예, 중복된 정보가 (A,C)이니까 하나 무시한다), 하는것을 매번 policy모델이 판단해야함.
- 학습에서 비효율적: 행동 A를 했더니 보상이 좋았다/나빴다 --> 이러한 신호로 학습. 허나, 원본 텍스트에서 상태를 재구성하는 과정 자체가 매번 조금씩 다르게 진행될 수 있다(같은 정보라도 표현이 다르거나, 일부를 놓치거나).
- 같은 상황인데도 모델이 매번 다른 방식으로 상태를 "복원"하게 되어, 입력이 불안정해짐
- 그 결과 "이 행동이 좋은 결과로 이어졌다"는 인과관계를 학습 신호가 명확하게 잡아내기 어려워짐
- 즉, 모델이 배워야 할 것(검색 판단)과 별개로, 상태를 재구성하는 잡음까지 학습 신호에 섞여 들어가서 학습이 불안정하고 비효율적으로 됨
- 어려운 쿼리는 롤아웃마다 거의 동일한 빈 집합(empty-set) 보상만 받음 --> 모든 롤아웃이 같은 결과 (다 실패)
- 도구가 많아지면 반복적인 검색 호출로 붕괴 가능: 학습이 잘 안될 경우 같은 tool calling만 하게 됨 (이건 reward를 수정할 필요가 있겠음). 검색을 계속하면 최소한 보상이 0보다는 나을 확률이 있으니, 모델이 "안전한 선택"으로만 몰림
- 문서 간 구조(cross-document structure)가 대화 기록에 존재해도 너무 여기저기 분산되어 활용 불가: n-hop이 필요한 복잡한 과정이 있는 것은, trajectory가 길어지면 linking을 잘 못 함.
- 최종 큐레이션 세트가 비었거나 잘못됐을 때, 보상이 실패 원인을 구분 못함 (잘못된 검색 vs 잊혀진 증거 vs 빠진 검증 vs 부실한 큐레이션): 대부분의 보상은 최종 답변으로 1/0으로 주어짐. 그래서 검색을 잘 하여 증거를 잘 찾았으나, 다음 에피소드에서 검색 역량이 업데이트 될 수 있음.
- 정책이 관찰(raw observation)로부터 유용한 검색 상태를 매번 재구성해야 함 --> 비효율적, 학습에서 비효율적

1.3 해결 방안: 상태 인지 오프로딩
역할 분담 제안:
- 정책: 명시적 검색 상태에 대해 의미론적 결정만 담당 (무엇을 검색할지/유지할지/검증할지/언제 멈출지)
- 하니스: 그 결정을 둘러싼 복구 가능한 상태를 유지 (후보 풀, 큐레이션된 증거, 문서 간 링크, 검증 기록, 컨텍스트 예산)
--> RL에게 검색 행동을 개선할 안정적인 인터페이스를 제공하며, 모델이 추가 전용(append-only) trajectory에서 증거를 매번 재발견하도록 요구하지 않음.
1.4 관련 연구
- 선행 연구(에이전트-컴퓨터 인터페이스, 소프트웨어 엔지니어링 에이전트): 언어 모델을 둘러싼 인터페이스가 행동과 성능에 영향을 끼침을 보임
- 최근 검색 시스템들: 컨텍스트 관리를 검색 과정의 일부로 다루기 시작 (컨텍스트 프루닝, 자기 편집 검색 등)
- Harness-1의 차별점: 이 인터페이스 자체가 방법론의 일부. 에이전트는 환경이 유지하는 지속적인 검색 상태 위에서 행동하고, 매 관찰마다 그 상태가 정책에게 다시 렌더링됨.
1.5 풍부한 하니스만으로 부족 --> 3가지 훈련 요건 필요
문제점:
- 모든 롤아웃이 빈 큐레이션 세트로 시작 --> 초기 보상들이 서로 구별 안 됨
- 파생 상태가 너무 장황 --> 증거, 컨텍스트 공간을 두고 경쟁
- 보상이 오직 발견(discovery)만 중시 --> 정책이 큐레이션, 검증 무시하고 반복적인 검색 툴링에 수렴함
해결을 위한 3가지 요구사항:
- 웜스타트 큐레이션(warm-started curation): 성공적 검색으로부터 임시 큐레이션 세트 자동 시딩 (SEC 데이터셋)
- 압축된 파생 상태 렌더링(compact derived-state rendering): 중요도 태그, 증거 그래프 요약, 검증 기록으로 구현
- 다양성 보존 인센티브(diversity-preserving incentives): 검색,큐레이션,리뷰,검증의 다양성 장려
2. Take) Harness-1
- Harness-1은 필요한 문서를 모으는 검색 에이전트다. 이 에이전트는 에피소드별 WORKINGMEMORY를 중심으로 state-machine 하니스 안에서 동작.
- 매 턴마다 하니스는 압축된 검색 상태를 최근 행동,관찰과 함께 렌더링하고, 모델은 하나의 구조화된 Harmony 행동을 내놓으며, 하니스는 그 행동을 실행하고 상태를 갱신한 뒤 다음 관찰을 렌더링한다
- Harmony는 OpenAI가 gpt-oss 모델 계열을 위해 만든 대화/도구 호출 포맷(형식)
- 매 턴마다 하니스는 압축된 검색 상태를 최근 행동,관찰과 함께 렌더링하고, 모델은 하나의 구조화된 Harmony 행동을 내놓으며, 하니스는 그 행동을 실행하고 상태를 갱신한 뒤 다음 관찰을 렌더링한다
- 다른 에이전트: 단순히 trajectory를 append -- 정리되어 있지 않음. 따라서 policy가 정보를 소비하는데 어려움이 있음.
- Harness-1: 정보를 한번 가공해서, policy모델이 크게 생각을 안해도 소비할 수 있게 만들어 놓음.
- WorkingMemory: 두개 계층으로 구성 -- 안쪽 층(프롬프트에 바로 보이는 부분), 바깥 층(필요할 떄 꺼내 씀)
- Policy모델이 볼 안쪽 계층: 압축된 정보인 $P_t$, $$
- P: 후보 문서 풀
- C: 큐레이션셋, 최종 출력
- I: 중요도 태크
- D: 전체 원문 저장소
- G: 증거 그래프
- V: 검증 기록
- H: 검색 이력
- 바깥 층: $D_t$
- 따라서 프롬프트에는 전체 문장이 들어가는게 아니라, 압축된 정보들이 들어가고 필요에 의하여 원문을 저장하는 $D_t$에서 필요 정보를 불러올 수 있음.
- Policy모델이 볼 안쪽 계층: 압축된 정보인 $P_t$, $$
- WorkingMemory: 두개 계층으로 구성 -- 안쪽 층(프롬프트에 바로 보이는 부분), 바깥 층(필요할 떄 꺼내 씀)

2.1 Policy actions as edits over working memory

- Harness-1은 5가지 액션을 한다
- 검색
- 메모리 검사: 찾은 문서를 재검색 없이 다시 살펴보기
- 큐레이션: 최종 문서 목록에 추가/제거, 중요도 태그 붙이기
- 검증: AI가 만든 주장이 실제 문서 내용과 맞는지 확인
- 종료: 최종 문서 목록 제출 및 끝내기
- Retrieval: 출력은 단순히 프롬프트에 덧붙여지지 않고, 압축과 중복제거를 거친 후, 후보 풀 $P_t$와 저장소 $D_t$를 갱신한다.
- fan out search: 최대 5개의 다양한 쿼리를 병렬로 실행
- search corpus: 쿼리 하나로 목표를 좁혀서 검색
- grep corpus: 정규식으로 정확한 문자 매칭
- read document: 알고있는 문서 ID 전체 원문 가져오기
Curation: 상태 직접 편집
- 최종 문서 목록에 추가할 문서, 제거할 문서, 중요도 태그를 한 번에 지정
- 중요도는 4단계: 매우 높음 / 높음 / 보통 / 낮음
- 최종 목록은 최대 30개까지만 담김 → 꽉 차면 가장 낮은 중요도 문서부터 자동으로 밀려남
- AI는 "확신도 표현"만 하면 되고, 용량 제한 같은 번거로운 관리는 시스템이 알아서 처리
Auto-Seeding:
- 문제 상황: 목록이 텅 빈 채로 시작하면, 어려운 질문에서는 초반 시도 대부분이 "빈 결과"로 끝나서 AI가 배울 게 없음
- 해결: 에피소드가 시작되고 AI가 처음으로 검색을 실행 --> 그리고 그 검색이 성공할 경우
- search_corpus, fan_out_search --> 검색 결과가 나오면 (검색 결과가 없는 경우가 많음.)
- 상위 8개가 문서로 등록, AI가 아무것도 하지 않아도 등록됨. fair등급으로 넣어줌.
- 이후에 AI가 스스로 판단해서, 좋은건 냅두고 나쁜건 뺌.
- 해결: 에피소드가 시작되고 AI가 처음으로 검색을 실행 --> 그리고 그 검색이 성공할 경우
- 효과: AI가 풀어야 할 문제가 "0부터 목록 만들기"에서 "이미 있는 초안을 다듬기"로 바뀜
- 주의할 점: 이게 AI 대신 "이 문서가 관련 있다"고 판단해주는 건 아님 — 그냥 시작점을 잡아줄 뿐, 강한 문서를 승급시키고 약한 문서를 빼는 건 여전히 AI의 몫
Verify and memory review
- verify: AI가 "이런 주장이 맞다"라고 문장을 쓰면, 하네스가 저장된 문서 원문과 대조해서 참/거짓 판정과 근거를 자동으로 기록
→ "뭘 검증할지"는 AI가 정하고, "실제로 맞는지 대조하는 기계적 작업"은 하네스가 함 - review_docs: 이미 본 문서를 새로 검색하지 않고 다시 꺼내서 보여줌 → 승급/강등/제거/검증하기 전에 재확인하는 용도
2.2 Derived-state rendering: evidence graph, compression, and deduplication
하네스는 단순히 텍스트를 저장하는게 아니라, 검색 기록에서 압축된 정보를 뽑아내서 LLM에게 보여줌
- 목적: 도구가 얻은 날것의 정보를 보여주는게 아니라 한번 가공된 상태를 보게 하는게 목적임.
Evidence Graph:
새롭게 들어오는 문서마다 정규식으로 3가지 정보를 자동으로 추출함.
- 여러 단어로 된 고유명사
- 4자리 연도/연대
- 숫자로 된 날짜
이것으로 어떤 엔티티가 어떤 문서들에서 등장하는지 지도를 만들고, 다음 표시함
- 빈출 엔티티: 여러 문서에 걸쳐 자주 등장하는 것
- 브릿지 문서: 빈출 엔티티를 2개 이상 포함한 문서 --> 검증하거나 중요도를 올릴 유력 후보
- 단독 엔티티: 딱 하나의 문서에만 등장 --> 다음 검색 단어로 활용 가능
효과: append하면, 그 사이에서 추론을 해야하는데, think token을 소비하면 가능 할 수 있겠으나 쉽지는 않음. 전체 기록을 처음부터 다시 읽는 일에서 작업 기억을 한 번 훑어보는 일로 바뀜
- 이 그래프는 문서 하나당 정규식 한 번, 렌더링할 때 상위권만 훑는 정도로 가볍게 만들어짐 — 어떤 브릿지를 검증할지, 어떤 단독 엔티티를 파고들지는 여전히 Agent가 결정
예시)

- Brussels는 5곳의 문서에 나옴 // 1878은 두곳에 등장. // Grande Synagogue도 두곳 등장
- 문서 91442는 그 중 Brussels, Grande Synagogue 를 연결
유용성:
- LLM은 이 표만 보고도 22816 ~ 91442가 서로 다른 단서를 이어주는 핵심 문서이구나를 바로 알 수 있음.
- 이 그래프를 만드는 비용도 매우 저렴함.
- 어떤 문서를 검증할지, 어떤 엔티티를 따라가 볼지, 어떤 관계가 이 질문에 중요한지 같은 최종 판단은 여전히 정책 모델이 진행함.
Result summaries and budget markers.
- 검색/조회 행동이 끝날 때마다: 어떤 도구를 썼는지, 몇 개 문서를 새로 찾았는지, 목록이 어떻게 바뀌었는지, 남은 컨텍스트 예산이 얼마인지 자동 기록
- LLM은 "지금 얼마나 진행됐고 얼마나 여유가 남았는지"를 명시적으로 확인 가능
- BM25: 검색 결과가 너무 길면 컨텍스트를 다 잡아먹어서, 쿼리와 관련있는 문장 4개만 골라서 원래 순서대로 보여줌. 단, read_document로 명시적 요청하면 원문 그대로 반환
- 2단계 중복 제거: 문서ID, 내용 유사도 기준 - 겹치는 문서 걸러냄.
예)
Turn0: 빈 상태에서 시작
- 에피소드가 시작되는 순간, 하네스는 8개의 변수를 전부 빈 값으로 초기화
- 아래 내용은 Policy가 직접 다루지 않아도 되는것, 환경이 자동으로 대신 기억해줌.
P (후보 문서 풀) = 빈 목록
C (큐레이션셋, 최종 출력) = 빈 목록
I (중요도 태그) = 빈 목록
D (전체 원문 저장소) = 빈 목록
G (증거 그래프) = 빈 그래프
V (검증 기록) = 빈 목록
H (검색 이력) = 빈 목록
AUTOSEEDED = False (아직 자동 시딩 안 함)
- 아래 내용은 Policy가 직접 다루지 않아도 되는것, 환경이 자동으로 대신 기억해줌.
- 정책이 첫 Turn에 보는 프롬프트
== Working Memory (turn 0) ==
Query: 경구 30kg 10세 금기 메스꺼움 반감기 10시간 미만 간 대사 2022 연구
Curated Set (0/30): (비어있음)
Document pool: (비어있음)
Search history: (비어있음) - 정책의 첫 행동 -- 검색
{"tool": "search_corpus", "params": {"query": "경구 30kg 10세 금기 메스꺼움 반감기 10시간 미만 간 대사 2022 연구"}} - 하네스가 검색 결과 처리: 검색 결과로 raw문서들이 여러개가 들어옴. 하네스가 이것을 처리함. 아래 순서대로 수행
- 문장 압축 (BM25): 원래 쿼리와 관련있는 상위 4개 문장만 남기고 나머지 버리고, 순서는 원문 그대로 유지함.
- 중복 제거: 같은 청크 ID가 이미 P에 있으면 스킵함. 청크 ID는 다르지만 내용이 거의 같으면, MinHash-LSH알고리즘으로 탐지해서 화면에 숨김. --> 왜이렇게 하냐면 이 문서를 봤었다는 점수 계산을 하기 위해서임.
- 새 문서를 P와 D에 저장: 전체원문은 D에 저장, P에는 짧은 요약본 저장 - 2단 계층 메모리가 이것을 의미함.
- 엔티티 추출 -- 새로 들어온 청크를 정규식으로 스캔 --> 대문자로 시작하는 고유 명사, 4자리 연도, 날짜 형식을 뽑아냄. 엔티티로 등록하고, 이 엔티티가 어느 문서에 등장했는지 업데이트
- 자동 시딩 (첫 검색에서만 발생): 모두 fair등급을 받음
Turn1: 정책이 큐레이션 행동을 함
- 자동 시딩된 8개 중에서 진짜 관련 있어 보이는 것을 골라 등급을 올림.
{"tool": "curate", "params": {
"add_ids": ["doc_17183", "doc_25814"],
"remove_ids": [],
"importance": {"doc_17183": "high", "doc_25814": "high"}
}} - 여기서 하네스가 하는 일:
- remove_ids에 있는 문서는 C에서 제거
- add_ids의 각문서에 대해서:
- C에 있으면 --> 등급만 재 태깅
- C가 아직 30개 미만 --> 그냥 추가
- C가 30개 찼으면 --> C안에서 가장 낮은 문서 찾아, 새 문서 등급이 높으면 교체
Turn2~5: 검색 반복하며 다른 단서를 좁혀감
Turn6~8: 검색(grep)이 실패하는 경우: 검색이력 H에 저장함. 이 패턴으로 grep시도 했는데 0건이 나왔다. 이 기록을 보고 다음 turn에 다른 접근을 시도함.
Turn9~10: 다른 각도로 검색
Turn12: 전체 원문 읽기 - read_document -- 지금까지는 압축된 문장4개만 봤음. 보고싶은 전체 문서를 봄.
Turn13: 최종 확정: end_search 호출시 큐레이션 셋 C가 최종 결과로 제출됨.
2.3 Training: SFT and RL
앞에서 봤든 하네스는 LLM은 판단, 시스템은 잡일을 함. 훈련도 같은 원칙을 따라감. SFT는 인터페이스 사용법을, RL은 검색 실력 자체를 가르침.
SFT for harness operation
원래 SFT라면 "검색을 잘하는 법" 전부를 가르쳐야 할 것 같지만, 여기선 그럴 필요가 없음
- 이유: 하네스가 이미 부가(기록 정리) 작업을 대신 해주고 있기 때문에, LLM에게 가르쳐야 할 건 딱 인터페이스 사용법 정도로 충분함
- 구체적으로 가르치는 것 4가지:
- 도구를 부르는 형식 (포맷)
- 검색 → 큐레이션을 번갈아 하는 리듬
- 중요도 태그를 성실하게 붙이는 습관
- 확신 있게 문서를 "매우 높음"으로 승급시키기 전에 반드시 검증하는 규범
Take) 데이터는 어떻게 만드는가?
- 강한 모델(GPT-5.4)을 Teacher로 사용
- GPT-5.4가 Harness-1라고 가정하고 동일한 일을함.
- 턴마다 힌트를 줘서 좋은 습관을 유도함: 검색했으면 큐레이션해라, 성과 없는 검색을 했으면 다른 방향으로 되돌아가라(백트래킹), 목록이 충분해지면 일찍 끝내라 등
- 이렇게 만들어진 궤적 중 형식이 맞고, 문서를 최소 1개 이상 반환했고, 최종 recall이 0.10 이상인 것만 남김 (성과가 너무 안 좋은 궤적은 버림)
- 턴마다 힌트를 줌: 사람이 실시간으로 개입하는 게 아니라, 정해진 규칙에 따라 자동으로 뜨는 시스템 메시지
- 예): Teacher가 검색을 하고나서 큐레이션(문서 채택)을 안 하고 또 검색만 하려고 한다면
- 하네스가 [ACTION REQUIRED]: 검색 후에는 먼저 큐레이션하세요 같은 메시지를 자동으로 보여줌
- 예): 최근 검색 3번이 새로운 문서를 거의 못 찾음 (효율이 안 나옴)
→ 하네스가 [WARN] 메시지로 "이 방향은 성과가 없으니 다른 각도로 시도해보라"고 알림
→ 이게 성과 없는 검색을 했으면 다른 방향으로 되돌아가라(백트래킹)는 힌트
→ 실제 사례에서 볼 수 있는 예: 처음엔 정답 게임을 잘못된 것으로 판단해서 버렸다가, 나중에 다른 문서를 읽고서야 "아, 그게 맞았구나" 하고 되돌아가는 경우가 있었음 - 예): 목록이 이미 충분히 채워졌고 정답이 될만한 문서들이 잘 갖춰짐
→ [TIP] 또는 [NEXT] 메시지로 "이제 그만해도 될 것 같다"는 뉘앙스의 알림
→ 이게 "목록이 충분해지면 일찍 끝내라"는 힌트
- 예): Teacher가 검색을 하고나서 큐레이션(문서 채택)을 안 하고 또 검색만 하려고 한다면
- 형식이 맞고, 문서 1개 이상, Recall 0.1 이상인 것 남김 -- 좋은 trajectory만 선별
- 형식이 유효함 -- 도구 호출 문법이 깨지지 않고 제대로 됨
- 최소 1개 이상 반환 -- 최종 목록이 완전히 빈 채로 끝나지 않음
- 최종 recall 0.1이상 -- 정답 문서 중 최소 10%는 찾아냄
- 데이터 수: 899개 Trajectory수집 --> 그리고 펼쳐서 SFT수행
- GPT-5.4가 Harness-1라고 가정하고 동일한 일을함.
RL over full search episodes
SFT끝난 체크포인트에서 시작
CISPO라는 on-policy 알고리즘 사용 - 같은 그룹 내 상대적 성과로 정규화 (그룹 advantage normalization)
- GRPO와 차이점
- GRPO: 각 토큰을 (지금 정책이 낼 확률) / (예전 정책이 이 단어를 낼 확률) 비율이 너무 크거나 작으면 0.8, 1.2로 클립핑을 했음. 근데 이 클립핑 범위를 벗어나면 그래디언트가 0이 되어버림. --> 학습에 무시됨. 근데 이 토큰이 하필 However, aha와 같은거라면..? 중요한것을 배우지 못함.
-E[ min( ~~, clip) ] - CISPO: 손실함수를 자르는 대신, 중요도로 계산하고 중요도 비율값인 상수로 취급함. 그레디언트는 cross-entropy와 같은 Term에서 발생함.
-E[ sg(min(r_t, e_high)) * A_t * cross-ent]- 여기서 min은 비율에 상한선을 씌우는것
- r_t = (지금 학습 중인 모델이 이 토큰을 낼 확률) / (이 데이터를 뽑을 때 썼던 예전 모델이 이 토큰을 낼 확률)
- e_high는 사람이 정해두는 상한값 하나 (예 5.0)
- sg: stop gradient
- GRPO: 각 토큰을 (지금 정책이 낼 확률) / (예전 정책이 이 단어를 낼 확률) 비율이 너무 크거나 작으면 0.8, 1.2로 클립핑을 했음. 근데 이 클립핑 범위를 벗어나면 그래디언트가 0이 되어버림. --> 학습에 무시됨. 근데 이 토큰이 하필 However, aha와 같은거라면..? 중요한것을 배우지 못함.
훈련 데이터는 SEC(증권 공시) 도메인의 쿼리들만 사용: 3,453개
- 특징:
- 전체 궤적을 다 굴려봄 (중간에 끊지 않음)
- 보상은 에피소드가 끝날 때 딱 한 번만 줌 (중간 턴마다 주지 않음)
- 최대 40턴까지 허용
- KL 페널티(원래 모델에서 너무 멀어지지 못하게 묶어두는 장치) 없음 → 자유롭게 행동을 바꿔나갈 수 있게 둠
- 왜 괜찮냐: 정책이 학습할게, 순수한 의미적 판단 뿐이고, 지저분한 작업은 하네스가 대신하여 정책이 이상한 방향으로 폭주할 위험 체가, 하네스 설계에서 억제되어 있음.
보상:

- set quality: 큐레이션 목록의 recall, precision의 중간 값인 F1 score라고 생각하면 될것 같음. 다만 beta를 2로 설정해서 Precision보다 Recall을 4배 중요하게 취급
- Trajectory cov: Recall 보상, 에피소드 중 정답 문서를 한번이라도 보면 점수를 줌
- Answer bonus: 큐레이션 최종 목록이 답문서 담았나? + 도중에 답문서 스치키라도 했나?
- Answer bonus: 최종 목록에 답문서 하나라도 있으면 보너스 지급 (Binary) 하나라도 찾으면 1점.
- 아예 못찾은것과 하나라도 찾은것의 갭은, 1개 찾은것과 2개 찾은것의 갭보다 훨씬 커서 그것을 강조하기 위해서임
- Tool div: 사용한 서로 다른 도구 종류 수
- Answer miss: (Trajectory Recall - 큐레이션 Recall)이 양수일 떄 벌점
- Turn penalty: 턴수가 20을 넘어가면 턴이 점점 늘어날수록 점점 감점이 커짐. 최대 0.02점까지 (효율성 유도)
특별 규칙:
- 목록이 텅 빈 채로 끝나면 → 나머지 계산 다 무시하고 바로 낮은 점수(-0.2)로 처리 (이건 "완전 실패"를 명확히 구분하기 위한 장치)
- 그 외의 경우엔 정상적으로 보상 공식을 적용하되, 너무 낮은 값으로 떨어지지 않게 최소값으로 한 번 잘라줌(clipping)
3. Experiment
3.1 Experiment Setup
Benchmark&Dataset:
- 총 8개 검색 벤치마크: 웹, 금융, 특허, 멀티홉 QA 등 다양한 도메인
- 소스 계열(훈련에 사용): BC+, Web, Patents, SEC → SFT는 이 4개 다 사용, RL은 SEC만 사용
- 전이/held-out 계열(훈련에 전혀 안 씀): LongSealQA, Seal0QA, FRAMES, HotpotQA
- SFT는 필터링 후 899개 궤적, RL은 SEC 쿼리 3,453개만 사용
Search-quality metrics.
- Recall: 최종 목록이 정답 문서를 얼마나 담았나
- Trajectory Recall: 최종 목록에는 없어도, 검색 도중 어디서든 정답을 스쳤나
- Final-Answer Recall: 정답이 직접 적힌 핵심 문서만 따로 봤을 때 얼마나 담았나
- Precision보다 Recall 중심으로 평가 (목록 크기는 인터페이스 설계의 일부라서 부차적으로만 봄)
비교 대상 (베이스라인)
- 오픈소스: gpt-oss-20b/120b, Qwen3-32B, Context-1, Search-R1(32B), Tongyi DeepResearch(30B)
- 프론티어(비공개) 모델: GPT-5.4, Sonnet-4.6, Opus-4.6, Kimi-K2.5 → 이들은 훈련 없이 Context-1 하네스를 씌워서 "제로샷 검색기"로만 사용
- 모두 동일한 검색 엔진, 재순위화 모델, 최대 30개 문서 반환 규칙을 공유 → 공정 비교
3.2 Results

성능
- Harness-1(20B) 평균 curated recall = 0.730
- 오픈소스 중 2등(Tongyi DeepResearch 30B)보다 +11.4점 앞섬
- Opus-4.6 하나 빼고 GPT-5.4, Sonnet-4.6, Kimi-K2.5, GPT-OSS-120B보다도 평균이 높음
가장 중요한 발견: 전이(transfer) 패턴
- 훈련에 쓴 도메인(소스 계열)에서의 이득: 평균 +7.9점
- 훈련에 전혀 안 쓴 도메인(held-out)에서의 이득: 평균 +17.0점 → 오히려 2.2배 더 큼
- 일반적인 상식이라면 "훈련한 도메인에서 더 잘해야" 정상인데, 정반대 결과
- 해석: 정책이 배운 건 "이 도메인만의 특수 지식"이 아니라, "자동 시딩된 초안 다듬기, 증거그래프에서 브릿지 문서 찾기, 승급 전 검증하기" 같은 도메인 무관 범용 조작 스킬 → 그래서 낯선 도메인에서도 잘 통함
데이터 효율성
- Harness-1: 훈련 데이터 총 4,352개 항목(SFT 899 + RL 쿼리 3,453)
- Context-1: 약 9,159개 사용
- Search-R1: 221,328개 사용 (Harness-1의 50배 이상)
- → 훨씬 적은 데이터로 경쟁력 있는(혹은 더 나은) 성능 → "적은 데이터로 되는 이유는 상태 관리 부담을 하네스로 옮겼기 때문"이라는 논문의 핵심 주장을 뒷받침
요소 제거 (하나씩 꺼보기, 재훈련 없이) -- BM25, 정리 등등
- 7개 메커니즘 중 6개를 제거하면 FA recall이 -3.9%~-7.9%(상대적) 하락
- 공통 패턴: 제거하면 search_corpus(그냥 검색) 비중은 오르고, read_document/verify(꼼꼼히 읽고 검증하기) 비중은 뚝 떨어짐
→ "넓고 얕게 검색만 하는 모드"로 퇴행 - 가장 크게 떨어지는 4개: 중요도 태그, 문장 압축, 자동 시딩, 증거 그래프
- 예외: 중복 제거를 껐더니 오히려 recall이 살짝 올라감(+4.6%) → 이유: 정답 문서 중 서로 비슷한(근접 중복) 것들이 가끔 하나로 잘못 합쳐지는 부작용 때문. 다만 이건 "토큰 예산 절약용" 장치지 recall 향상용이 아니므로 의도된 트레이드오프
- 전부 다 껐을 때: Recall -12.2%, FA -6.4% → 단일 제거보다 더 크게 떨어짐 → "탐색 능력 자체는 살아있는데, 뭘 우선순위 매길지 판단할 기반이 통째로 사라진 것"
- 의견) 근데, 튜닝은 요소가 있는 형태로하고, 없애면 당연히 잘 작동안하지...? 일반인에게 갑자기 팔 한쪽이 없어지면 일상생활에 문제가 많아 지는 것과 같은 것 아닌가..?
발견 vs 선별
- Harness-1은 증거를 발견하는 건 잘함 (trajectory recall은 Opus-4.6과 비슷한 수준)
- 그런데 최종 답변 recall에서는 Opus-4.6보다 낮음 (0.658 vs 0.736)
- → 즉 문제는 "못 찾아서"가 아니라 "찾아놓고 최종 목록에 제대로 못 남겨서" (선별 단계의 격차)
- 의견) 그럼 최종 답변은 Trajectory모아서 Closed model로 하는게 좋지 않을까?
Take) 훈련 다이나믹스: 도구 다양성 보너스의 효과
- 도구 다양성 보너스가 없으면: 정책이 검색(fan_out_search)만 반복하는 쪽으로 붕괴 → 도구 다양성 지표가 6→3.5로 떨어지고, curated recall이 0.53에서 정체
- 도구 다양성 보너스가 있으면: 다양성이 4.30 부근에서 안정, 초반엔 느리지만 최종 curated recall이 0.60까지 상승
- 교훈: 하네스가 좋은 도구를 갖춰놔도, 보상 설계가 그 도구들을 쓸 만하게 만들어주지 않으면 RL이 제일 쉬운 길(검색만 반복)로 도망가버림
Take) 다운스트림 효과 (모듈형 RAG) -- 결국 S3논문처럼 Tool 훈련 잘해서 Closed모델과 섞어 쓴는것도 좋겠네
- Harness-1이 만든 최종 문서 목록을 프론티어 답변 생성기(고정)에 넘겼을 때도, 다른 오픈소스 검색기보다 더 높은 답변 정확도로 이어짐
- 즉 검색 품질 향상이 실제 "최종 답변의 질"까지 잘 이어진다는 걸 보여줌
Tool만 훈련한다면?? -- ideation
정말 날카로운 제안이에요. 사실 이건 논문이 부록 P에서 부분적으로 이미 검증한 방향이기도 해요. 정리해서 설명드릴게요.
💡 이 아이디어는 논문 데이터로 뒷받침됨
- 부록 P 실험을 보면: GPT-5.4를 하나도 훈련시키지 않고, 하네스만 바꿔가며(naive → Context-1 → Harness-1) 씌웠더니 curated recall이 0.511 → 0.807 → 0.849로 계속 올라감
- 즉 "모델은 그대로 두고, 상태 관리/큐레이션 로직만 좋아져도 성능이 크게 오른다"는 게 이미 증명돼 있음
- 제안하신 방향은 여기서 한 걸음 더 나아가는 것 — "하네스 로직을 규칙 기반으로 고정하지 말고, 큐레이션 판단 자체를 별도로 훈련시킨 작은 모델에게 맡기자"는 거죠
🏗️ 구체적으로 어떤 구조가 될까
[Opus/GPT-5.4 = 고정, 검색·읽기·추론 담당]
↓ 후보 문서, 검색 과정, 증거 그래프 등 원시 정보 생성
[작은 훈련된 큐레이터 모델 = 이것만 RL/SFT로 훈련]
↓ "이 문서를 넣을지 뺄지, 중요도는 얼마인지" 결정
[최종 큐레이션셋]
- 이건 사실 논문이 인용한 s3([16]번 참고문헌)의 아이디어와 거의 같아요 — s3는 "검색기(searcher)를 답변 생성기(generator)와 분리해서, 생성기는 고정한 채 검색 정책만 모듈적으로 최적화"함
- 여기서 제안하신 건 그 변형: "검색/추론은 프론티어 모델이 하고, 선별(curation)만 따로 훈련시키자"
✅ 왜 이게 매력적인가
- Opus의 강력한 검색·추론 능력은 그대로 유지 — 어떤 쿼리를 던질지, 애매한 단서를 어떻게 해석할지 같은 고난도 판단은 이미 잘하는 프론티어 모델에게 맡김
- 훈련 대상이 훨씬 좁아짐 — 논문의 ablation 결과(Table 3)를 보면 중요도 태그, 자동 시딩 같은 큐레이션 관련 메커니즘만 따로 떼어도 FA recall이 6~8%씩 떨어짐. 즉 "큐레이션"이라는 스킬 하나만 잘 훈련해도 상당한 개선 여지가 있다는 뜻
- 비용 절감 — 프론티어 모델을 RL로 직접 파인튜닝하는 건 폐쇄 API에서는 사실상 불가능하거나(가능해도 매우 제한적), 매 스텝마다 대형 모델을 굴려야 해서 훈련 비용이 막대함. 반면 작은 큐레이터 모델은 값싸게 반복 훈련 가능
- 모듈형 RAG 프로토콜과 궁합이 좋음 — 이 논문이 이미 "고정된 답변 생성기 + 서로 다른 검색기의 큐레이션셋"을 비교하는 실험(부록 O)을 했는데, 이 구조를 그대로 "고정된 검색기(Opus) + 훈련된 큐레이터" 쪽으로 뒤집으면 됨
⚠️ 그래도 남는 문제들
- 데이터 큐레이션 문제가 사라지는 게 아니라 좁아질 뿐
- 큐레이터를 훈련하려면 여전히 "정답 문서가 뭔지" 라벨이 있어야 보상을 계산할 수 있음
- 다만 전체 검색 행동을 배우는 것보다 **"이미 후보로 올라온 문서들 중 뭘 남길지"**만 배우면 되니, 필요한 라벨링 범위와 탐색 공간이 훨씬 좁아짐 (풀어야 할 문제가 작아진 건 확실히 이득)
- 선별과 검색이 완전히 분리되지 않을 수 있음
- 논문 ablation에서 중요도 태그를 없애면, 정책이 검색 자체도 "넓고 얕은 모드"로 퇴행함 (search_corpus 비중 급증, verify/read 급감)
- 즉 "이 문서를 왜 검색했는지, 어떤 맥락에서 나왔는지"를 큐레이터가 모르면 제대로 판단하기 어려울 수 있음 → 큐레이터에게 검색 맥락(어떤 쿼리로 나왔는지, 증거그래프상 위치 등)을 충분히 넘겨줘야 하고, 이러면 "가볍게 떼어놓기"가 생각보다 안 가벼워질 수 있음
- 인터페이스 설계 문제
- Opus가 큐레이터에게 후보를 어떻게 넘겨줄지(어떤 형식, 어떤 메타데이터 포함)를 프롬프트로 설계해야 하는데, 폐쇄 API는 내부 동작을 조정할 수 없어서 "Opus가 협조적으로 후보를 잘 넘겨주도록" 프롬프트 엔지니어링에 의존해야 함 → 완전한 제어권은 없음
- 비용/지연시간 트레이드오프
- 프론티어 모델 호출 + 별도 큐레이터 호출을 매 턴 반복하면, API 호출 수와 지연시간이 늘어날 수 있음 (다만 프론티어 모델을 재훈련하는 것보다는 훨씬 쌈)
🎯 결론적으로
말씀하신 방향은 **"프론티어 모델의 추론력은 사서 쓰고, 우리가 통제 가능한 부분(선별 로직)만 학습시킨다"**는 점에서 실용적으로 꽤 합리적이에요. 특히:
- s3 논문이 이미 이 방향(검색기/생성기 분리 학습)의 유효성을 보여줬고
- 이 논문의 부록 P가 "하네스만 바꿔도 고정 모델 성능이 오른다"는 걸 실증했으니
"고정 모델 + 훈련된 큐레이터" 조합은 다음 단계로 시도해볼 만한 자연스러운 실험이에요. 다만 "데이터 라벨링 문제 자체가 사라지는 건 아니고, 풀어야 할 문제의 크기가 줄어드는 것"이라는 점, 그리고 "선별이 검색 맥락과 얼마나 분리 가능한가"는 실제로 실험해봐야 아는 열린 질문이라는 점은 염두에 두시면 좋을 것 같아요.


































