검색 환경에 맞춰 인덱스가 스스로 진화하는 SELF-INDEX
Self-Evolving Search Index
무엇인가
LLM 에이전트가 여러 출처를 오가며 정보를 찾고 추론하는 복잡한 작업을 맡으면서 검색의 중요성이 커졌다. 검색은 인덱스에 의존하고, 인덱스는 각 문서를 index key라는 표현으로 요약해 retriever가 질의와 문서를 매칭·정렬할 수 있게 한다. 따라서 검색 품질은 이 키가 문서 안의 지식을 얼마나 잘 드러내는지에 크게 좌우된다. 문제는 어떤 인덱스 표현이 효과적인지가 검색 환경마다 다르다는 점이다. 자연어, 코드, 수학, 표처럼 코퍼스 종류가 다르고 BM25 같은 sparse retriever와 BGE-Large, Qwen3-Embedding-8B 같은 dense retriever가 다르면 유리한 표현도 달라진다. 그래서 하나의 고정된 최적화 전략이 모든 환경에서 일관되게 잘 하기를 기대하기 어렵다. 그런데 인덱스를 환경에 맞게 진화시키는 일은 여전히 사람이 한다. 사람이 검색 실패를 진단하고, 최적화 전략을 손보고, 인덱스를 다시 처리해야 한다. 전략을 고치려면 수동으로 수정하거나 주석이 달린 학습 데이터를 더 모아 재학습해야 하고, 수정된 전략을 적용하려면 모든 인덱스 키를 재처리해야 한다. 새 실패가 나올 때마다 이 과정이 반복되므로 인적 비용과 계산 비용이 병목이 된다.
어떻게 동작하나
이 논문이 제안하는 SELF-INDEX는 사람 개입 없이 인덱스가 스스로 진화하도록 만드는 프레임워크다. 핵심 구성 요소는 retriever를 호출하고 인덱스 키를 수정할 수 있는 Optimizer와, 아직 다뤄지지 않은 검색 수요를 만들어내는 Query Simulator다. Optimizer는 세 단계 루프를 돈다. Self-Diagnosis가 현재 인덱스의 결함을 검색 결과로부터 찾아내고, Self-Revision이 문제가 있는 키를 미리 정해진 전략 없이 선택적으로 고치고, Self-Validation이 제안된 수정을 검증해 통과한 것만 인덱스에 반영한다. 이 루프가 쿼리들에 대해 반복되면서 검증된 수정이 누적되고 인덱스가 점진적으로 진화한다.
무엇과 다른가
형식화는 이렇다. 코퍼스 D = {d1, ..., dN} 위에 인덱스를 만들고, 각 문서 d에 검색 가능한 정보를 나타내는 키 집합 K(d)를 붙인다. 인덱스 전체는 K = ∪ K(d)다. 검색 시 문서 d의 점수는 s(q, d) = max_{k ∈ K(d)} rel(q, k)로, 키 k와 질의 q의 관련도(예: 코사인 유사도) 중 최댓값을 쓴다. SELF-INDEX는 코퍼스는 그대로 두고 키만 고친다. Self-Diagnosis는 pseudo-relevance feedback에서 착안해 정답 라벨 없이 검색 결과 자체를 피드백으로 쓴다. 각 질의에 대해 retriever를 현재 인덱스 위에서 호출해 결과를 모으고, 검색된 각 키 k에 대해 co-retrieval profile C_k를 만든다. 이는 다른 문서의 어떤 키가 k와 함께 검색되는지, 얼마나 자주 함께 검색되는지를 기록한 것이다. 이런 동시 검색 패턴은 질의를 가로지르는 키 간 관계를 반영하므로, k가 자기 문서 d를 다른 문서와 구별하는 정보를 충분히 드러내는지 살펴보는 맥락이 된다. Self-Revision은 진단된 결함이 있는 문서 키 집합을 대상으로 삼는다. K(d) 안의 키들은 d를 공동으로 표현하므로, 진단된 키를 개별적으로 고치면 같은 집합 안의 다른 키가 이미 표현한 정보가 중복될 수 있다. 그래서 Optimizer는 대상 K(d)를 한 iteration에 한 번, 집합 전체로 고치면서 그 안의 키들에 대한 진단을 함께 고려하고 수정안 K'(d)를 만든다. Self-Validation은 수정안이 실제로 쓸 만한 키를 만드는지 검증한다. 원문 텍스트 키는 고정하고, K'(d)에서 원문 키를 뺀 나머지 생성 키(유지된 키 포함)를 세 기준으로 본다. Faithfulness는 생성 키가 문서 d에 의해 뒷받침되고 정보가 왜곡되지 않았는지, Specificity는 코퍼스 전반에 공유된 내용이 아니라 d 특유의 지식을 강조하는지, Separation은 생성 키가 관찰된 경쟁 키들에 대해 갖는 최대 관련도가 현재 키 집합보다 낮은지(즉 다른 키들과 잘 구별되는지)를 본다. 기준을 통과하지 못한 키는 제안에서 빠진다. 새로 제안된 키가 세 기준을 모두 통과하면 K(d)는 고정된 원문 키에 통과한 생성 키들을 더한 형태가 되고, 그렇지 않으면 그대로 둔다.
어떻게 쓰나
Optimizer만으로도 인덱스는 자율적으로 진화하지만, 받은 질의에만 반응하므로 진화가 수동적(reactive)이다. 그래서 SELF-INDEX는 Query Simulator를 추가로 쓴다. Query Simulator는 Self-Exploration을 수행해, 최적화에 쓰인 질의가 아직 다루지 못한 그럴듯한 검색 수요를 탐색한다. 코퍼스 D에서 문서를 샘플링하고, 그 문서에 근거한 검색 수요를 반영하는 질의를 생성한다. 이어 Jaccard 유사도에 기반한 Dissimilarity filter로, 이미 최적화에 쓰인 질의 및 현재 시뮬레이션 단계에서 이미 채택된 질의와의 어휘 중복을 제한한다. 남은 질의가 Optimizer에 공급되어 추가적인 인덱스 진화를 이끈다.
전제와 한계
실험은 자연어, 코드, 수학, 표를 아우르는 BRIGHT 벤치마크와 표 검색 데이터셋 Spider 2.0, FIBEN, BEAVER에서 검색 성능을 본다. 검색 에이전트의 하위 작업 성능은 BrowseComp-Plus로, 에이전트 메모리 활용은 LongMemEval-V2로 평가한다. 지표는 nDCG@10이고, BrowseComp-Plus와 LongMemEval-V2는 공식 평가 프로토콜을 따른다. 비교 대상은 Doc2Query, SPIKE, RL-Index이고 표 검색에서는 EnrichIndex를 추가한다. retriever는 BM25, BGE-Large, Qwen3-Embedding-8B 세 가지다. 검색 에이전트 실험에는 GPT-OSS-120B, GPT-5.4-nano, Gemini-3.7-Flash, Kimi-K2.5 네 백본을 쓰고, 메모리 실험은 Qwen3.5-9B를 메모리 컨트롤러와 리더에 쓴다. Optimizer와 Query Simulator는 Qwen3.6-35B-A3B로 구축했다. 주요 실험에서 SELF-INDEX는 Query Simulator가 만든 질의만으로 인덱스를 진화시키고, 평가 질의는 최적화 중에 보지 않는다. 공정한 비교를 위해 모든 베이스라인을 공식 구현과 같은 백본 LLM으로 재현했다.
결과는 BRIGHT와 표 검색 벤치마크에서 SELF-INDEX가 모든 retriever에 대해 최고 평균 nDCG@10을 기록했다고 보고한다. 모든 코퍼스 유형에서 모든 retriever 아래 최고 평균 점수를 일관되게 냈다는 것이 저자들의 주장이다. 반면 Doc2Query는 BM25에서 표 검색을 크게 개선하지만 코드 코퍼스에서는 성능을 떨어뜨리고, SPIKE와 RL-Index는 일부 검색 설정에서 base 인덱스 대비 미미한 개선에 그친다. 구체적인 표의 수치는 제공된 본문에 제시되지 않았고 표 1, 2에 담겨 있다. BrowseComp-Plus에서는 모든 에이전트 백본과 retriever에서 답변 정확도와 evidence recall이 가장 높았고 calibration error도 대체로 줄었다. SPIKE가 일부 경우 정확도나 evidence recall을 떨어뜨리는 반면 SELF-INDEX는 두 지표를 모두 일관되게 개선했고, 검색 호출 수도 base 인덱스보다 줄였다(SPIKE는 일부 경우 호출 수를 늘렸다). 온라인 비용 추정에서도 SELF-INDEX는 정확도를 올리면서 비용을 낮췄고, GPT-5.4-nano + BM25 에이전트가 SELF-INDEX를 쓸 때 같은 백본의 DCI와 비슷한 정확도를 더 낮은 비용에 달성했다. 코퍼스를 100K, 200K, 400K 문서로 확장했을 때 SELF-INDEX는 정확도를 안정적으로 유지하고 질의당 비용을 100K 기준보다 약간 줄였지만, SPIKE는 자기 baseline보다 낮은 정확도에 비용은 늘었고 DCI는 정확도가 급감하고 비용이 크게 올랐다. 에이전트 메모리에서는 LongMemEval-V2에서 모든 메모리 시스템의 정확도를 개선했고, static, dynamic, workflow 능력 전반에서 일관된 향상을 보였다. 과거 상호작용을 raw trajectory slice로 저장하든, 통합 노트로 보강하든, AgentRunbook-R 같은 전용 시스템을 쓰든 이득이 유지됐다. gotchas 능력은 메모리 시스템이 과거 상호작용을 어떻게 처리하는지에 더 의존하기 때문에 상대적으로 다르게 나타난다.
분석 실험도 본문에 담겨 있다. BRIGHT에서 세 retriever 평균 nDCG@10으로 본 ablation에서 Self-Diagnosis의 co-retrieval profile C_k를 제거하면 모든 코퍼스 유형에서 평균이 떨어졌다. 이는 대상 문서와 현재 키만 보는 것이 아니라 그 키가 인덱스의 다른 키들과 함께 어떻게 검색되는지도 고려해야 한다는 뜻이다. Self-Validation에서 Faithfulness, Specificity, Separation 중 하나만 제거해도 세 코퍼스 유형 모두에서 평균이 하락했고, 검증 단계를 통째로 없애 모든 수정안을 수용하면 평균 nDCG@10이 모든 코퍼스 유형에서 base 인덱스보다 낮아졌다. Query Simulator 쪽에서는 질의 수를 고정한 채 Dissimilarity filter를 제거하면 세 코퍼스 유형 모두에서 평균이 떨어졌다. 질의 출처를 바꿔 BRIGHT 코퍼스에서 생성된 ReasonIR HQ 질의를 쓰면 base 인덱스보다는 개선되지만, Query Simulator 질의가 모든 코퍼스 유형에서 더 큰 이득을 냈다. 진화 동역학을 보면 BGE-Large에서 각 코퍼스 유형 대표 데이터셋의 nDCG@10이 반복이 진행되며 초반에 SPIKE를 앞지른 뒤에도 추가 이득을 냈다. 한 문서의 키 변화를 추적한 사례에서는 정답 문서가 질의의 정보 요구를 충족하는 내용을 담고 있지만 더 넓은 내용 속에 묻혀 있어서, 전체 문서 텍스트를 키로 쓴 초기에는 순위가 낮았다. 반복이 진행되며 넓은 내용이 서로 다른 측면을 강조하는 별도 키로 나뉘고 순위가 base보다 올라갔으며, 이후 질의의 정보 요구에 더 명시적으로 대응하는 키가 만들어지면서 순위가 최상위 근처로 올라갔다.
개발자 입장에서 이 논문은 코퍼스나 retriever가 바뀔 때마다 인덱스 키를 손으로 튜닝하고 전체를 재처리하는 비용이 큰 RAG·검색 에이전트 시스템에 직접적인 대안을 제시한다. 특히 인덱스 키만 고치고 코퍼스나 메모리 내용은 건드리지 않는다는 점 때문에 기존 메모리 구성 방식과 직교적으로 적용할 수 있다. 다만 도입 전에 확인할 것이 있다. Optimizer와 Query Simulator가 Qwen3.6-35B-A3B 같은 LLM 위에서 돌기 때문에 진화 자체의 비용과 지연이 발생하고, Self-Validation의 세 기준 판정도 LLM 판단에 의존한다. 또 주요 실험은 평가 질의를 보지 않고 Query Simulator 질의만으로 최적화했다는 전제 위에 서 있으므로, 실제 서비스에서 사용자 질의 로그를 함께 쓸 때의 효과는 별도로 검증해야 한다. 제공된 본문에는 별도의 한계 절이 없고, 저자들이 명시한 전제는 Optimizer의 진화가 받은 질의에만 반응하는 reactive라는 점과 이를 Query Simulator의 Self-Exploration으로 보완한다는 점, 그리고 인덱스 키만 수정한다는 점이다. 표와 그림에 담긴 구체적 수치는 본문 텍스트에 제시되지 않았으므로 실제 개선폭은 원문의 표 1~5와 그림 2~6을 확인해야 한다.