LLM 진화 탐색으로 생성형 검색의 시맨틱 인덱스를 자동 개선한다
Evolving Semantic Indexes for Generative Retrieval
무엇인가
생성형 검색(GR)은 검색을 문서 식별자를 자기회귀적으로 생성하는 문제로 바꾼다. 문서는 임베딩에서 뽑아낸 짧은 이산 토큰열, 즉 시맨틱 식별자(SID)로 표현되고, 생성기는 질의를 받아 그 SID를 토큰 단위로 만들어낸다. 문제는 SID 설계가 검색 품질을 크게 좌우한다는 점이다. 인덱스 구축, 충돌 처리, 학습 목적함수, 디코딩이라는 네 절차가 서로 얽혀 있고, 모두 이산적이라 다운스트림 검색 성능으로부터 그래디언트를 흘려 end-to-end로 최적화할 수 없다. SID 구조를 바꾸면 생성기가 학습해야 할 예측 대상이 달라지고, 충돌을 해소하면 SID 시퀀스가 길어져 학습 부담이 커진다. 결국 대부분 손으로 설계되어 왔다.
어떻게 동작하나
이 논문은 그 설계 공간을 LLM 기반 진화적 프로그램 탐색으로 넘긴다. 생성형 검색에 이 접근을 적용한 첫 사례라고 저자들은 밝힌다. 후보 프로그램은 고정된 코퍼스 문서 임베딩, 학습 질의 임베딩, 학습 관련도 쌍을 입력받아 문서별 정수 SID 배열을 반환한다. 입출력 인터페이스는 고정이고 그 매핑을 구현하는 절차만 변이 대상이다. 변이를 제안하는 모델은 단일 H200에서 vLLM으로 로컬 서빙되는 오픈웨이트 31B 모델 gemma-4-31b-it이며, 상용 LLM API는 전혀 쓰지 않는다. AdaEvolve 알고리즘을 기반으로 3개 아일랜드로 프로그램 군집을 유지하고, 부모 프로그램의 표시된 변이 영역에 SEARCH/REPLACE 편집을 제안하는 방식이다. 변이 모델은 SID 생성 코드와 성능 피드백만 볼 수 있고 테스트 데이터에는 접근할 수 없다.
무엇과 다른가
핵심 병목은 평가 비용이다. 후보마다 1B 목표 생성기를 학습해 검색 성능을 재면 H200에서 한 번에 5시간이 걸린다. 그래서 약 100만 개 비임베딩 파라미터(토큰 임베딩 포함 700만)의 2층 GPT-2 프록시 디코더를 대신 학습시킨다. 프록시 실행은 약 20분으로 평가 시간을 15배 줄이며, 후보 100개를 평가할 때 500시간 대신 33시간이 든다. 학습 관련도 쌍을 3분의 2(프록시 학습용)와 3분의 1(피드백용)로 나누고, 후보의 적합도는 피드백 분할에서의 Recall@100으로 정의한다. 충돌률 자체는 목표 Recall@100과 상관이 꽤 강했지만(스피어만 ρ = −0.855) 무작위 배정으로도 쉽게 조작할 수 있어 적합도 함수로 쓰지 않는다. SID만 진화할 때는 충돌률 50% 게이트, SID와 충돌 처리를 함께 진화할 때는 5% 게이트를 통과해야 하며, 후보 실행은 2시간으로 제한하고 최대 20회 재시도를 허용한다.
어떻게 쓰나
결과는 석연하다. NQ320K에서 SID 구축과 충돌 처리를 함께 진화시킨 프로그램이 목표 생성기(gemma-3-1b-pt) 기준 Recall@1을 55.8%에서 59.3%로, Recall@100을 85.8%에서 90.6%로 올렸다. MSMARCO300K에서는 Recall@100이 79.70%에서 82.55%로, 다국어 이커머스 데이터셋에서는 BM25 대비 Recall@100 이득이 +49.01포인트에서 +50.66포인트로 늘었다. 세 데이터셋 모두 Recall@1과 MRR@10도 개선됐는데, 진화 탐색이 Recall@100만 최적화했음에도 초기 순위 품질로 이득이 번진 것이다. 다만 이커머스에서의 초기 순위 이득은 표준편차 1 이내다. 컴포넌트별로 보면 SID만 진화했을 때 87.40%, 충돌 처리만 진화했을 때 85.72%(시드 85.82%), 진화된 SID 구축기를 고정한 뒤 충돌 처리를 순차 진화했을 때 87.25%로, 둘을 동시에 진화한 90.57%가 가장 크다. 저자들은 SID 구축이 어떤 문서가 같은 식별자를 공유하는지를 정하고 충돌 처리는 그 그룹 안에서 문서를 구분하므로 두 절차가 서로 의존한다고 해석한다.
전제와 한계
프록시의 신뢰성은 무엇을 진화시키느냐에 달려 있다. NQ320K에서 무작위로 뽑은 후보 20개와 시드, 총 21개 프로그램에 대해 프록시와 목표 생성기의 Recall@100 순위 상관은 스피어만 ρ = 0.90으로 강했다. 그러나 생성기의 학습 목적함수가 변이 가능해지는 순간 프록시는 정보를 주는 대신 오도한다. 목적함수 진화는 프록시 Recall@100을 52.10%에서 53.80%로 올렸지만 목표 Recall@100은 84.46%로 떨어졌고, 전체 파이프라인 진화는 프록시 62.85%를 찍고도 목표는 76.12%로 주저앉았다. 목적함수만 진화한 3개, 전체 파이프라인을 진화한 2개 등 5개 프로그램 모두 프록시 적합도는 개선하면서 시드 대비 목표 Recall은 후퇴했고, 두 지표의 순위는 역방향이었다(ρ = −0.80, n = 5로 유의성 주장에는 부족). 저자들의 구분은 이렇다. 시맨틱 인덱스 진화는 두 생성기가 공유하는 SID 구조를 바꾸지만, 목적함수 진화는 모델 아키텍처·사전학습·학습 레시피에 의존하는 최적화 신호를 바꾼다. 100만 파라미터 프록시에 과최적화된 손실이 10억 파라미터 목표 모델에 그대로 통하지 않는다는 것이다.
실제로 진화된 NQ 프로그램을 뜯어보면 발상이 구체적이다. 잔차 양자화에서 제곱 유클리드 거리 대신 현재 잔차와 코사인 유사도가 최대인 코드를 고르고, 코드북을 256개에서 512개로 늘렸다. 문서 재구성만 쓰던 인덱스 학습에 질의 정보를 더한다. 각 문서에 연결된 학습 질의 임베딩을 평균 내 L2 정규화한 목표 벡터를 만들고, 재구성된 문서 임베딩이 그 방향을 향하도록 정렬 손실(가중치 0.8)을 추가한다. 충돌 처리도 바뀌었다. 시드는 문서 ID 순서로 구분 토큰을 붙였지만, 진화된 프로그램은 충돌하지 않는 문서에 고정 접미사 0을 주고, 충돌 그룹 안에서는 정규화된 문서 임베딩 평균(중심)과 코사인 유사도가 큰 순서로 1, 2, … 를 부여한다. 접미사 값이 작을수록 그룹의 중심에 가까운 문서라는 공유된 해석이 생기는 셈이다. 다른 데이터셋에서는 관련도 쌍으로 문서·질의 투영을 학습한 뒤 문서 인코더를 고정하고 잔차 K-평균을 돌리는 프로그램, 신경 인덱스 학습을 아예 없애고 정규화 문서 임베딩과 관련 질의 임베딩 평균을 0.7 대 0.3으로 섞는 프로그램 등이 나왔다.
개발자 입장에서 이 논문의 쓸모는 두 가지다. 첫째, 비용이 큰 다운스트림 학습을 매 후보마다 돌리는 대신 작은 프록시로 후보를 걸러내는 패턴은 검색·추천 파이프라인 튜닝 전반에 이식 가능하다. 둘째, 프록시를 도입할 때 반드시 확인해야 할 것이 있다. 저자들은 프록시 순위가 목표 시스템과 상관이 있는지를 선택한 탐색 공간에 대해 먼저 실측하라고 요구한다. 이 논문에서는 인덱스 구축이라는 공유 구조를 건드릴 때는 전이가 안정적이었고, 학습 목적함수처럼 모델 규모에 민감한 요소를 건드릴 때는 전이가 깨졌다. 프록시를 만능 대리 지표로 쓰면 안 된다는 실증이다.
한계는 저자들이 직접 명시한다. 이 논문은 최고 성능(state-of-the-art)을 주장하지 않고, 생성형 검색이 어휘 기반이나 밀집 검색을 압도한다고도 주장하지 않는다. MSMARCO에서는 진화된 GR이 1위 순위에서 BM25를 앞서지만 큰 리콜 컷오프와 MRR@10에서는 BM25가 여전히 강하다. 31B 변이 모델이 일반적인 프로그램 탐색에 충분하다고 주장하지도 않으며, 단지 이 GR 파이프라인을 시드보다 개선하기에는 충분했다고 말한다. 다중 컴포넌트 진화에서 컴포넌트별 기여도를 분리하는 일은 향후 과제로 남겨두었고, 여러 컴포넌트를 동시에 진화시킨 결과의 이득을 '조정' 덕분이라고 단정하지도 않는다.