프로덕션 RAG의 중요한 단계 하나는 사용자가 보낸 프롬프트를 정리하는 것이다. 사용자는 사람과 대화하듯 LLM에 말을 걸기 때문에, 사람이 쓴 프롬프트는 좋은 검색 쿼리가 되지 못한다. 그래서 프롬프트를 벡터 DB에 곧바로 넣는 대신, retriever가 프롬프트를 파싱(parse)해 의도를 파악하고 검색에 맞게 수정·재작성·변환한다.

 

 

1. 쿼리 재작성 (Query Rewriting)

가장 단순하고 널리 쓰이는 방법은, 검색 전에 LLM으로 쿼리를 다시 쓰는 것이다. 예를 들어 증상↔진단을 잇는 의료 문서 knowledge base라면, LLM을 query rewriter로 세팅하고 이런 지시를 준다 — 모호한 표현을 명확히, 해당되면 의학 용어 사용, 매칭 확률을 높이는 동의어 추가, 불필요·산만한 정보 제거.

그림 1. 정돈되지 않은 프롬프트를 LLM으로 다듬어 검색에 최적화한다.

 

재작성된 프롬프트는 불필요한 정보를 없애고 모호함을 줄이며, 매칭 확률을 높이는 의학 용어까지 담는다.

그림 2. LLM Query Rewriter — 강아지 이야기(원본)를 검색용 의학 질의(재작성)로 변환한다.

 

 

이 rewriter용 프롬프트는 반복적으로 개선할 수 있고 또 그래야 한다. 일반적으로 얻는 이점이 커서, 프롬프트 하나를 정리하는 데 드는 추가 LLM 호출 비용을 충분히 정당화한다.

그림 3. rewriter 프롬프트는 반복 개선하고, 그 이점이 LLM 호출 비용을 쉽게 정당화한다.

 

 

 

2. 개체명 인식 (NER)

더 고급 기법으로 개체명 인식(named entity recognition, NER)이 있다. 쿼리 안의 장소·사람·날짜·등장인물 같은 정보 category를 인식하는 기법이다. 이 정보는 이후 벡터 검색이나 metadata 필터링에 활용된다. 예로 범용 NER 모델 GLINER는, 텍스트와 "식별하고 싶은 entity 유형 목록(사람·날짜 등)"을 주면 그 category가 표시된 labeled query를 돌려준다. 매우 효율적이라 쿼리가 들어올 때마다 실행할 수 있고, 약간의 latency 대신 검색 품질을 크게 높일 수 있다.

그림 4. GLINER 같은 NER 모델이 쿼리에서 사람·책·위치·날짜 등을 라벨링해, 검색·필터링에 활용한다.

 

 

 

3. HyDE — 가상 문서 임베딩

HyDE(Hypothetical Document Embeddings)는 검색의 이상적인 결과가 될 가상 문서를 생성해 쿼리를 개선한다. 앞의 의료 질문이라면, LLM으로 "갑작스러운 당김에 의한 어깨·손 저림"에 관한 가상 문서를 만든 뒤, 그 가상 문서를 임베딩한 벡터로 실제 검색을 한다.

그림 5. HyDE — LLM이 "이상적인 답 문서"를 가상으로 만들고, 그 벡터로 검색한다.

 

핵심 아이디어는, retriever가 프롬프트의 의도뿐 아니라 좋은 결과가 어떤 모습인지를 이해하도록 돕는 것이다. 원래 retriever는 프롬프트↔문서라는 서로 다른 성격의 텍스트를 매칭한다("사과와 오렌지"). HyDE를 쓰면 가상 완벽 문서↔실제 문서라는 더 비슷한 텍스트끼리 비교하게 된다. 실제로 성능이 개선되지만, 약간의 latency와 가상 문서 생성용 LLM 자원이 든다.

그림 6. HyDE는 "프롬프트↔문서"(사과와 오렌지) 매칭을 "가상 문서↔실제 문서"의 더 비슷한 비교로 바꾼다.

 

다음 글에서는 검색된 문서를 더 정확히 재평가하는 데 쓰이는 모델 — 크로스 인코더(cross-encoder)와 ColBERT — 를 살펴본다.

'AI > RAG' 카테고리의 다른 글

Reranking  (0) 2026.07.03
Cross Encoder & ColBERT  (0) 2026.07.02
고급 청킹 기법  (0) 2026.07.02
Chunking  (0) 2026.07.02
Vector Database  (0) 2026.07.02

+ Recent posts