🎧 이 글을 오디오북으로 듣기
AI 로컬 합성 오디오북 (Qwen3-TTS)

에이전트 하네스에서 수백에서 수천 개의 스킬이나 도구를 검색으로 라우팅하고 있고, 그 검색기의 하이퍼파라미터를 사람이 주기적으로 손으로 재튜닝하는 데 지쳐본 엔지니어라면 이 글이 도움이 될 것입니다. 온라인 밴딧으로 검색 파라미터를 자동 보정하면 그 재튜닝 루프를 없앨 수 있지 않을까 하는 질문에, 이번 연구는 실제 프로덕션 검색기 위에서 직접 답을 구했습니다. 결론은 단순한 승패가 아니라 훨씬 더 실용적인 경고에 가깝습니다.

매번 손으로 다시 맞추던 두 개의 숫자

ThakiCloud의 에이전트 하네스는 사용자 요청을 약 천 개에 이르는 스킬 정의 중 하나로 연결합니다. 이 라우팅을 맡는 retrieve.py는 하이브리드 검색기로, 스킬 이름과 설명에 대한 BM25 어휘 점수와 512차원 EmbeddingGemma 임베딩의 코사인 유사도를 함께 계산한 뒤 reciprocal rank fusion으로 순위를 합칩니다. 이 융합을 지배하는 숫자가 둘 있습니다. 임베딩 유사도 임계값 τ(현재 0.60)와 어휘 신호에 주는 융합 가중치 w(현재 0.50)입니다.

문제는 이 두 값이 엔지니어가 오프라인 벤치마크를 돌려 손으로 고른 값이고, 스킬 코퍼스가 바뀔 때마다 같은 방식으로 다시 고른다는 점입니다. 그리고 코퍼스는 실제로 계속 바뀝니다. 스킬은 새로 추가되고, 버전이 올라가며 -v2처럼 이름이 바뀌고, 다른 스킬에 흡수되며 폐기됩니다. 이름이 바뀌면 어휘 신호는 즉시 흔들리는데 캐시된 임베딩은 그대로 남아 지연되고, 스킬이 폐기되면 라우팅 대상 하나가 조용히 사라집니다. 최근 연구들은 이 현상을 자기진화형 스킬 생태계의 독자적인 실패 유형으로 “라이브러리 드리프트”라 부르고 있고, 이번 연구가 정면으로 겨냥한 것이 바로 이 유지보수 비용입니다.

이 연구는 같은 팀의 이전 두 연구를 잇습니다. 앞선 연구는 이 시스템에서 복합 질의 라우팅의 진짜 병목이 질의 분해가 아니라 검색기 자체라는 점을 밝혔고, 완벽하게 분해해도 오라클 상한이 63.6%에 그친다는 것을 보였습니다. 그다음 연구는 검색기 어휘 드리프트를 탐지해 수정을 제안하는 결정론적 야간 리페어 루프를 만들었는데, 그 연구는 스스로 “밴딧도, 실시간 보상도, 지속적인 온라인 적응도 없는 단일 레버짜리 개념 증명”이라 못 박았고, 여전히 엔지니어가 오프라인 벤치마크 재실행을 승인해야 하는 구조였습니다. 이번 연구는 그 다음 단계로, 사람의 트리거 없이도 실시간 결과 피드백만으로 τ와 w를 계속 재보정하는 밴딧이 이 정적 기본값을 이길 수 있는지를 직접 실측합니다.

LinUCB로 검색 파라미터를 실시간으로 골라보기

실험은 τ ∈ {0.50, 0.60, 0.70}과 w ∈ {0.30, 0.50, 0.70}을 교차한 3×3, 총 아홉 개의 팔(arm)로 구성됩니다. 이 중 하나가 현재 프로덕션 기본값인 (0.60, 0.50)입니다. 표준 LinUCB 알고리즘이 매 질의마다 다섯 차원짜리 문맥 벡터(편향 항, 질의 토큰 수, 질의에서 한글이 차지하는 비율, 지금까지 누적된 이름 변경 비율과 폐기 비율)를 보고 팔 하나를 선택하고, 실제 프로덕션 검색기 코드로 그 팔의 τ와 w를 그대로 적용해 검색을 수행합니다.

여기서 이 연구가 특히 신뢰를 준 지점이 있습니다. 애초 연구 질문은 보상을 skill_retro의 성공/실패 스트릭이나 verify_fanout의 적대적 표결 같은 실시간 신호로 주겠다고 설계돼 있었는데, 실제로 실행한 실험은 그 신호를 연결하지 않았습니다. 대신 사전에 라벨링된 63개 벤치마크 사례를 재생하며, 선택한 팔의 검색 1위 결과가 해당 질의의 정답 스킬과 일치하고 게이트를 통과하면 1점을 주는 결정론적 오프라인 대리 보상을 썼습니다. 저자들은 이 차이를 서론과 방법론 두 곳에서 명시적으로 정정하며, 이 논문의 모든 결과가 “실시간 프로덕션 배포”가 아니라 “벤치마크 재생 위의 조작화”임을 반복해 못 박습니다. 이런 정정을 감추지 않고 앞세우는 태도 자체가, 이 실험의 나머지 결과를 얼마나 믿어도 되는지를 가늠하는 데 중요한 참고점이 됩니다.

드리프트는 여덟 라운드에 걸쳐 미리 정해진 일정대로 주입됩니다. 2라운드에서 스킬 두 개 이름 변경, 4라운드에서 폐기 하나와 이름 변경 둘, 6라운드에서 폐기 하나가 추가로 발생해 총 네 번의 이름 변경과 두 번의 폐기가 쌓입니다. 63개 벤치마크 사례 중 정답 스킬이 있는 45개 긍정 질의만 온라인 보상 루프에 들어가고, 아무 스킬도 뜨면 안 되는 10개 네이티브 질의와 적대적으로 헷갈리는 8개 부정 질의는 온라인 루프에서 완전히 배제된 채 마지막에 딱 한 번만 평가에 쓰입니다. 이 구분이 왜 중요한지는 뒤의 결과에서 그대로 드러납니다.

Per-Round Top-1 Hits: Bandit vs Static Default vs Per-Round Oracle 여덟 라운드 동안 밴딧, 정적 기본값, 라운드별 오라클의 1위 적중 횟수를 비교한 그래프입니다. 로컬 벤치 하네스 위에서 측정했습니다.

352번 관측한 결과, 정확히 192 대 192

여덟 라운드, 352번의 긍정 질의 관측을 모두 합산한 결과 밴딧과 정적 기본값은 정확히 같은 192번씩 1위 적중을 기록했습니다. 사전에 등록해둔 “밴딧이 정적 기본값을 이긴다”는 판정 변수는 거짓으로 확정됐습니다. 그 시점에서 아홉 팔 중 사후적으로 가장 좋았던 고정 팔은 (τ=0.50, w=0.50)으로 208번 적중해, 두 정책 모두 라운드별 오라클 대비 정확히 16번(7.7%)의 누적 후회를 안고 있었습니다.

더 눈에 띄는 것은 이 16이라는 숫자가 밴딧만의 결함이 아니었다는 사실입니다. 정적 기본값도 매 라운드 정확히 24번 적중했고 오라클은 정확히 26번 적중했습니다. 라운드가 진행되며 적중률처럼 보이는 수치가 조금씩 오르는 이유는 검색 품질이 좋아져서가 아니라, 폐기된 스킬을 정답으로 갖던 질의가 빠지며 분모(질의 풀 크기)가 45에서 43으로 줄었기 때문입니다. 즉 이번에 주입한 드리프트 일정은 정적 기본값이나 오라클의 실제 적중 횟수를 단 한 번도 흔들지 못했습니다. 저자들은 이를 스스로 “조작 점검 실패”라 부르며, 이 실험만으로는 드리프트에 대한 적응력을 검증도 반증도 할 수 없다고 정직하게 선을 긋습니다.

라운드별로 보면 밴딧이 뭔가를 배우기는 합니다. 1라운드에는 탐색 과정에서 24대22로 정적 기본값에 뒤졌다가 2라운드는 동률, 3·4·6라운드에서는 한 번씩 앞섭니다. 하지만 그 학습이 수렴으로 이어지지는 않습니다. 선호하는 팔은 4라운드까지 (0.5, 0.7)에 대한 선택 비중이 51.1%에서 88.6%까지 단조롭게 올라가다가, 드리프트가 전혀 새로 주입되지 않은 5라운드에서 갑자기 (0.6, 0.3)으로 무너지고 23대24로 역전당합니다. 이후 6라운드는 (0.5, 0.3), 7·8라운드는 다시 (0.5, 0.7)로 돌아오지만 4라운드의 정점을 다시는 회복하지 못합니다. 저자들은 이 진동을 드리프트 때문이 아니라, 라운드당 43에서 45개뿐인 질의 수에서 한 번의 적중이 약 2.2%포인트를 좌우하는 상황에서 α를 1.0으로 고정해 두고 감쇠시키지 않은 LinUCB의 탐색 잡음으로 설명합니다.

Cumulative Regret of LinUCB Bandit Against Per-Round Oracle 여덟 라운드에 걸쳐 오라클 대비 누적 후회가 16회(상대치 7.7%)까지 쌓이는 과정을 보여줍니다. 초반 탐색과 중반의 진동이 원인입니다. 로컬 벤치 하네스 위에서 측정했습니다.

표면 아래에서 새고 있던 것: 보상이 보지 못한 안전성 비용

이 논문에서 가장 중요한 표는 최종 드리프트 상태에서 세 가지 고정 설정을 긍정, 네이티브, 부정 세 질의 집합 전체에 대해 한 번씩 평가한 결과입니다. 보상 함수가 실제로 볼 수 있었던 두 지표, 즉 긍정 질의 1위 적중률과 게이트를 통과한 상위 5개 재현율만 보면 밴딧이 최종적으로 가장 자주 선택한 팔 (τ=0.50, w=0.70)은 정적 기본값을 뚜렷하게 앞섭니다. 1위 적중률은 0.558에서 0.581로, 재현율은 0.814에서 0.860으로 올랐습니다.

그런데 나머지 두 지표를 함께 보면 그림이 뒤집힙니다. 같은 팔이 아무 스킬도 뜨지 않아야 하는 네이티브 질의에서 환각률을 0.0에서 0.4로 끌어올립니다. 열 개 중 네 개의 질의가, 원래는 아무것도 안 뜨는 게 맞는데 이제 뭔가를 억지로 골라 내보내는 셈입니다. 게다가 적대적으로 헷갈리는 부정 질의를 잘못 통과시키는 실패율은 세 설정 모두에서 정확히 0.375로 동일해, 이 축은 애초에 τ와 w 조정만으로는 건드릴 수 없는 문제라는 점도 드러났습니다.

원인을 더 정확히 짚으면, 이 환각 비용은 밴딧이라는 학습 과정 자체의 문제가 아니라 τ 값 자체에 달려 있었습니다. 사후적으로 가장 좋았던 고정 팔도 τ=0.50을 쓰기 때문에 밴딧의 선호 팔과 똑같이 0.4의 환각률을 냅니다. 표에서 유일하게 τ=0.60을 쓰는 설정, 즉 지금의 정적 기본값만 환각률이 0입니다. 다시 말해 긍정 질의만 보는 보상 함수를 극대화하는 어떤 절차든, 밴딧이든 오프라인 그리드 서치든 심지어 긍정 지표만 읽는 사람이든, 결국 낮은 τ로 수렴하고 같은 비용을 떠안게 됩니다. 사람이 오프라인 벤치마크 전체를 돌리면 환각률 열까지 보고 이 거래를 거절할 수 있지만, 긍정 지표만 보는 온라인 루프에는 애초에 그 선택지가 없습니다.

Final Three-Way Comparison: Positive Metrics vs Hallucination Rate 밴딧이 최종적으로 선호한 팔(τ=0.50, w=0.70)은 보상받은 지표에서는 정적 기본값을 이기지만, 네이티브 질의 환각률을 0.0에서 0.4로 끌어올립니다. 로컬 벤치 하네스 위에서 측정했습니다.

이 실험이 회사와 업계에 던지는 의미

ThakiCloud 입장에서 결론은 명확합니다. retrieve.py의 하이브리드 파라미터를 온라인 밴딧으로 넘겨 사람의 오프라인 재튜닝 루프를 없애려던 시도는 이번 형태로는 근거가 부족합니다. 오프라인 벤치마크는 실행 비용이 낮은데다, 지금 시스템에서 네이티브 질의 환각과 부정 질의 오탐을 측정하는 유일한 지점이기도 합니다. 이걸 긍정 지표만 보는 온라인 루프로 바꾸면 완전하지만 주기적인 평가를, 계속 돌지만 부분적인 평가로 맞바꾸는 셈이 됩니다.

더 넓게 보면 이 결과는 검색 증강 생성이나 도구 라우팅을 쓰는 에이전트 시스템 전반에 시사하는 바가 있습니다. 실사용 피드백만으로 검색 하이퍼파라미터를 지속적으로 자동 보정하려는 시도는 엔지니어링 유지보수 부담을 줄이는 매력적인 방향이지만, 보상 신호의 범위가 좁으면 겉으로는 성능이 오르는 것처럼 보이면서 그 신호가 아예 보지 못하는 축에서 안전성 비용이 조용히 쌓일 수 있습니다. 이 연구는 그 위험을 추상적인 경고가 아니라 실제 숫자로 보여줬습니다.

학술적으로는, 하이브리드 어휘·임베딩 융합 가중치 보정에 밴딧을 적용한 연구는 있었지만 대부분 합성 보상이나 재구현된 검색기 위에서 이뤄졌습니다. 이 연구는 실제 프로덕션 검색기 코드를 그대로 가져와 이름 변경과 폐기가 프로그래밍적으로 주입되는 조건에서 실측했고, 그 결과가 널(null) 결과였다는 점, 그리고 왜 널이 나왔는지에 대한 구체적인 메커니즘(보상 오지정)까지 진단했다는 점에서 드문 사례로 자리매김합니다.

한계: 이 결과를 어디까지 믿을 수 있나

저자들이 스스로 밝힌 한계들이 결과 해석에 중요합니다. 먼저 보상은 애초에 등록했던 실시간 신호가 아니라 벤치마크 파생 대리 지표였기 때문에, skill_retroverify_fanout 같은 진짜 실시간 신호를 보상으로 썼을 때 어떤 결과가 나올지는 이 논문이 말해주지 않습니다. 또한 비교 기준이 된 정적 기본값은 순진한 디폴트가 아니라 애초에 이 온라인 실험이 재생한 것과 같은 벤치마크 계열로 오프라인에서 튜닝된, 사실상 테스트셋을 이미 본 강한 기준선입니다. 그런 상대를 콜드 스타트로 배운 밴딧이 무승부로 따라잡은 것 자체는 얕보기 어렵지만, 반대로 “온라인 적응이 불필요하다”는 일반 결론으로 확장할 수도 없습니다.

주입한 드리프트가 정적 기본값과 오라클의 집계 적중률을 전혀 움직이지 못했다는 점도 중요한 제약입니다. 이 실험은 결국 드리프트 적응력을 측정하지 못했고, 드리프트 적응 방법론에 대한 어떤 결론도 검증됐다기보다는 아직 시험되지 않은 채로 남습니다. 벤치마크 규모도 63개 사례, 352번의 관측으로 작아서 다섯 차원 문맥과 아홉 개 팔을 가진 LinUCB가 통계적으로 팔들을 구분하기엔 애초에 정보량이 부족했을 가능성이 큽니다. 실험도 α 고정값 하나, 드리프트 일정 하나로 단 한 번만 돌렸기 때문에 분산이나 신뢰구간을 낼 수 없고, 이번에 관측한 무승부가 운이 좋았거나 나빴던 결과일 가능성도 배제할 수 없습니다.

저자들이 제시하는 다음 단계는 명확합니다. 보상 범위를 네이티브·부정 질의까지 넓히고, 정적 기본값보다 나빠지지 않도록 보장하는 제약을 추가하며, 정적 기본값 자체를 움직일 만큼 강한 드리프트 일정을 먼저 설계한 뒤에야 드리프트 적응형 밴딧을 시험하고, 마지막으로 애초에 계획했던 skill_retroverify_fanout 같은 진짜 실시간 신호를 실제로 연결해보는 것입니다. 그때까지는 사람이 트리거하는 오프라인 벤치마크 루프가 안전망으로, 그리고 최소한 온라인 보정의 필수 보완재로 남아야 한다는 것이 이 논문의 결론입니다.

논문 상세 페이지는 Hugging Face에서 확인할 수 있습니다.

관련 슬라이드

본문 내용을 NotebookLM(prismatic_tech 스타일)으로 요약한 슬라이드입니다.

bandit-hybrid-retrieval-calibration 슬라이드 1

bandit-hybrid-retrieval-calibration 슬라이드 2

bandit-hybrid-retrieval-calibration 슬라이드 3

bandit-hybrid-retrieval-calibration 슬라이드 4

태그: 에이전트 하네스, contextual-bandit, hybrid-retrieval, linucb, online-calibration, reward-misspecification, self-evolving-systems, 스킬 라우팅

카테고리:

업데이트: