Aurora PostgreSQL에서 한국어 하이브리드 검색 구현: pg_bigm과 pgvector로 만드는 한국어 특화 RAG
Aurora PostgreSQL에서 pg_bigm과 pgvector를 RRF로 결합한 한국어 하이브리드 검색법을 소개했다.
한국어는 교착어라서 의미 검색만으로는 고유명사와 조사 변형을 놓치기 쉽고, 키워드 검색만으로는 자연어 질문을 처리하기 어렵다. 그래서 pg_bigm의 바이그램 키워드 검색과 pgvector의 시맨틱 검색을 RRF로 결합해 서로의 약점을 보완한다.
데이터는 S3/Lambda/ECS에서 청킹한 뒤 Amazon Bedrock Titan Embeddings V2로 1024차원 임베딩을 만들고, Aurora PostgreSQL 16.6에 원문과 벡터를 함께 저장한다. pg_bigm은 Aurora PostgreSQL 12.9+에서, pgvector는 15.3+ (14.8/13.11+)에서 쓸 수 있다. 테이블은 vector(1024) 컬럼을 쓰고, 텍스트에는 GIN(pg_bigm), 벡터에는 HNSW(pgvector) 인덱스를 건다. 정규화된 임베딩이라면 vector_ip_ops로 바꿔 효율을 높일 수 있으며, hnsw.ef_search=100, m=16, ef_construction=128 같은 값으로 품질과 속도를 조정한다.
pg_bigm은 tsvector가 놓치는 “대한민국은/의/에서” 같은 조사 변형을 잘 잡아낸다. 한국어 위키백과 100,000건 테스트에서는 tsvector보다 평균 304% 더 많은 문서를 찾았고, LIKE 대신 =%와 pg_bigm.similarity_limit를 쓰면 유사도 기반 필터링도 가능하다. 다만 인덱스가 커지기 쉬워 500~1,000자 단위 청킹과 maintenance_work_mem 상향이 중요하다.
pgvector는 “한국 전쟁은 언제 시작되었나” 같은 자연어 질문과 “6.25 전쟁” 같은 의미 매칭에 강하다. 쿼리 유형별 역할은 이렇게 나뉜다.
- 단일 키워드: 두 방식 모두 잘 맞는다.
- 2단어 조합: 한쪽이 놓친 결과를 다른 쪽이 보완한다.
- 자연어 질문: pgvector가 주도한다.
“한국 전쟁”이나 “제주 화산”처럼 키워드와 의미가 엇갈리는 검색에서는 RRF가 rank 기반으로 두 결과를 공정하게 합쳐 Top-K를 다시 정렬한다. hybrid_search_ko()는 query_text, query_embedding, keyword_weight=0.4, semantic_weight=0.6, rrf_k=60으로 동작하며, query_text에는 자연어 전체가 아니라 LLM이나 형태소 분석으로 추린 핵심 키워드를 넣어야 한다. 최종 답변은 결합된 문서 컨텍스트를 바탕으로 Amazon Bedrock Claude가 생성한다.
이 요약은 원문 이해를 돕기 위한 큐레이션입니다. 저작권은 원저작자에게 있으며, 정확한 내용과 맥락은 원문을 확인하세요.
요약 오류, 출처 표기 문제, 삭제 요청은 문의 · 건의로 알려주세요.