실무에서 RAG를 구축하다 보면 반드시 마주치는 케이스가 있다. 쿼리에 특정 요소를 제외해야 하는 상황이다.
일반적인 접근은 index를 분리하거나 metadata 필터링을 거는 것이다. 예를 들어 연도별로 index를 나누거나, 문서에 태그를 붙여 특정 조건을 만족하는 문서만 검색 pool에 포함시키는 식이다. 그러나 이 방식에는 명확한 한계가 있다. 같은 도메인 안에서는 index를 무한정 분리할 수 없다. 세분화할수록 index가 파편화되고, 각 shard의 문서 수가 줄어들면서 recall이 떨어지는 트레이드오프가 발생한다. 결국 "2024 결과를 제외한 최신 실적 전망"처럼 동일 도메인 내에서 특정 조건만 배제하는 쿼리는 index 분리로는 근본적으로 해결이 어렵다.
dense retrieval은 이 문제에서 특히 취약하다. Sparse retrieval은 키워드 매칭 기반이라 "제외" 조건을 어느 정도 반영할 수 있지만, dense retrieval은 쿼리 전체를 하나의 embedding vector로 압축하는 과정에서 부정(negation)과 exclusion 의도가 희석된다. 대부분의 retriever는 exclusion 의도를 무시하고 2024 관련 문서를 상위에 올린다.
기존 대안으로는 embedding 모델을 fine-tuning하거나 negation-aware한 데이터셋으로 재학습하는 방법이 있다. 효과는 있지만 대규모 GPU 자원과 학습 데이터가 필요하고, 배포 복잡성도 증가한다. DEO(Direct Embedding Optimization) 는 다른 방향을 택한다. Fine-tuning 없이, 추론 시점에서 query embedding 자체를 직접 최적화한다.
아이디어

DEO의 직관은 단순하다. Negation이 포함된 쿼리를 그대로 embedding하면 모델이 exclusion 의도를 포착하지 못하므로, 쿼리를 positive sub-query와 negative sub-query로 분해한 뒤, 이를 기준으로 원본 query embedding을 직접 이동시킨다.
예를 들어 "Bayreuth의 문화적 특성 (Bayreuth 정체성 제외)"라는 쿼리가 주어지면:
- Positive: "Bayreuth의 문화적 허브로서의 역할", "Bayreuth가 지역 문화에 미친 영향"
- Negative: "Bayreuth의 정체성에 대한 언급"
이 분해를 통해 retrieval이 원하는 것(positive)과 피해야 할 것(negative)이 명시적으로 분리된다.
방법론
Stage 1: Query Decomposition
LLM을 prompt-based로 활용해 입력 쿼리를 positive sub-query 집합 $P$와 negative sub-query 집합 $N$으로 분해한다.
$$P = {p_1, p_2, \ldots, p_K}, \quad N = {n_1, n_2, \ldots, n_M}$$
예를 들어 다음과 같은 쿼리가 주어졌다고 하자.
"What are the characteristics and influences of the cultural center Bayreuth (excluding its identity as Bayreuth) and the art form Photomontage (excluding examples of photomontage)?"
LLM은 이를 다음과 같이 분해한다.
Positive (P):
- "cultural significance and role of Bayreuth as a cultural hub"
- "historical and social influences of Bayreuth on regional culture"
- "architectural and infrastructural features of Bayreuth's cultural institutions"
Negative (N):
- "specific examples of photomontage artworks"
- "biographical details of artists involved in photomontage"
- "specific events or exhibitions featuring photomontage"
- "any mention of Bayreuth's identity or geographic location"
Positive는 사용자가 원하는 정보를 더 풍부하게 표현한 것이고, Negative는 명시적으로 배제해야 할 개념을 포착한 것이다. 이 분리가 이후 embedding 최적화의 방향을 결정한다. 논문의 실험에서는 GPT-4.1-nano를 사용했으며, 더 작은 모델(Qwen2.5-1.5B-Instruct)로도 baseline 대비 유의미한 성능 향상을 보인다.
Stage 2: Direct Embedding Optimization
Encoder $E(\cdot)$는 frozen 상태로 유지한다. 원본 쿼리 $q$와 각 sub-query의 embedding을 구한다.
$$e_o = E(q), \quad e_{p_i} = E(p_i), \quad e_{n_j} = E(n_j)$$
학습 가능한 query embedding $e_u$를 원본 embedding으로 초기화한다.
$$e_u \leftarrow e_o$$
최적화 목적 함수는 세 항으로 구성된다.
$$\mathcal{L}(e_u) = \lambda_p \cdot \frac{1}{K} \sum_{i=1}^{K} |e_u - e_{p_i}|^2 - \lambda_n \cdot \frac{1}{M} \sum_{j=1}^{M} |e_u - e_{n_j}|^2 + \lambda_o \cdot |e_u - e_o|^2$$
각 항의 역할은 다음과 같다.
- Attraction term ($\lambda_p$): $e_u$를 positive sub-query embedding 쪽으로 당긴다.
- Repulsion term ($\lambda_n$): negative term 전체에 마이너스 부호가 붙어 있어, loss를 최소화하는 방향이 곧 $e_u$와 $e_{n_j}$ 사이의 거리를 최대화하는 방향이 된다. 즉, $e_u$를 negative sub-query embedding으로부터 밀어내는 효과를 낸다.
- Consistency term ($\lambda_o$): 원본 쿼리의 의미를 과도하게 벗어나지 않도록 정규화한다.
이 loss를 Adam optimizer로 고정된 스텝 수(기본값 20) 동안 최소화하면, 최적화된 $e_u$가 retrieval에 사용할 최종 query representation이 된다.
설계상 주목할 점
Encoder는 건드리지 않는다. 최적화 대상은 query embedding $e_u$ 하나뿐이다. Encoder 파라미터는 전혀 업데이트되지 않으므로 어떤 embedding 모델에도 붙일 수 있다. 텍스트 retriever(BGE 계열)는 물론 CLIP 같은 멀티모달 encoder에도 동일하게 적용된다.
Consistency term의 역할. $\lambda_o \cdot |e_u - e_o|^2$ 항이 없으면 $e_u$가 원본 쿼리 의미와 무관하게 positive 방향으로만 이동할 수 있다. 특히 CLIP 같은 vision-language 공간에서는 original semantic context 보존이 중요해서, COCO-Neg 실험에서는 $\lambda_o = 1.0$으로 텍스트 전용 설정($\lambda_o = 0.2$)보다 높게 설정했다.
Decomposition vs Optimization. Ablation 결과에 따르면 query decomposition만으로는 성능 향상이 제한적이다. decomposed sub-query들의 embedding을 평균내어 retrieval하는 AVG 방식은 MAP 0.6374 → 0.6451에 그쳤고, sub-query별로 따로 retrieval해서 Reciprocal Rank Fusion(RRF)으로 합치는 방식도 0.6641에 불과했다. 대부분의 성능 향상은 embedding optimization 단계에서 발생한다(0.7379). 즉 DEO의 핵심은 분해 자체가 아니라 분해 결과를 embedding 공간에서 직접 반영하는 최적화에 있다.
실험 결과
NegConstraint 벤치마크에서 DEO는 BGE-small, BGE-large, BGE-M3 모든 변형에서 일관된 성능 향상을 보인다.
| 모델 | MAP | nDCG@10 |
| BGE-small-en-v1.5 | 0.6702 | 0.7372 |
| BGE-small-en-v1.5 w/ DEO | 0.7302 | 0.7795 |
| BGE-large-en-v1.5 | 0.6299 | 0.7139 |
| BGE-large-en-v1.5 w/ DEO | 0.7327 | 0.7877 |
| BGE-M3 | 0.6374 | 0.7250 |
| BGE-M3 w/ DEO | 0.7379 | 0.7946 |
멀티모달 retrieval(COCO-Neg)에서도 OpenAI CLIP 기준 Recall@5가 0.4792 → 0.5392로 향상된다. NegCLIP처럼 compositional understanding을 위해 명시적으로 fine-tuning된 모델 위에서도 추가 성능 향상이 확인된다는 점이 흥미롭다.
계산 비용은 CPU(AMD Ryzen 7 5800X) 기준 20 스텝에 0.016초, GPU(RTX 3060) 기준 0.033초다. GPU가 CPU보다 오히려 느린 반직관적인 결과인데, embedding 하나를 최적화하는 정도의 연산량이 GPU dispatch overhead보다 작기 때문으로 보인다. 어느 환경이든 실시간 서비스에 부담이 없는 수준이다.
한계
DEO의 성능은 query decomposition 품질에 직접 의존한다. LLM이 exclusion 의도를 잘못 분해하면 최적화 방향 자체가 틀어진다. 또한 최적화 스텝 수가 과도하게 많아지면(100스텝 이상) 오히려 성능이 하락하는 경향이 관찰되어, 적절한 early stopping이 필요하다.
마치며
DEO는 "embedding 모델을 바꾸지 말고, query를 바꿔라"는 접근을 추론 시점 최적화로 구현한 방법이다. Fine-tuning이 필요 없고, 어떤 encoder에도 적용 가능하며, 계산 비용도 낮다. Negation이 포함된 쿼리가 많은 실제 서비스 환경에서 특히 실용적인 선택지가 될 수 있다.
'논문 리뷰' 카테고리의 다른 글
| TriAttention: Efficient Long Reasoning with Trigonometric KV Compression (0) | 2026.06.28 |
|---|---|
| 프롬프트 설계가 LLM 준수도와 정확도에 미치는 영향 (5) | 2025.08.17 |
| 3. Causality가 LLM이 직면한 문제를 해결하는 데 어떻게 도움이 될 수 있을까? (0) | 2025.02.04 |
| 2. LLM이 인과적 메커니즘을 밝히는 데 어떻게 도움을 줄 수 있을까? (1) | 2025.01.30 |
| 1. LLM은 인과 관계를 이해하고 추론할 수 있을까? (4) | 2024.11.05 |