728x90

RRF 2

[RAG] 하이브리드 검색 BM25 벡터 RRF 순위 결합

부제: 키워드 검색과 벡터 검색을 점수 대신 순위로 합친 이유한국어 문서 검색에 두 방식을 같이 썼다.하나는 키워드 검색이다. 형태소로 자른 단어가 문서에 있는지를 본다.다른 하나는 의미 검색이다. 문장을 벡터로 바꿔 뜻이 비슷한 문서를 찾는다.각각 장단이 있어 둘 다 쓰기로 했다. 각 방식에서 상위 50개씩 뽑는다.그다음이 문제였다.두 결과를 어떻게 합치나처음 떠오른 건 점수를 더하는 거였다.키워드 점수와 벡터 점수를 합쳐서 다시 정렬하면 되지 않을까.안 됐다.두 점수는 스케일이 다르다.벡터 유사도는 0에서 1 사이로 얌전한데, 키워드 점수(BM25)는 위로 열려 있고문서·쿼리마다 분포가 제각각이다.그냥 더하면 한쪽이 다른 쪽을 압도해 버린다. 합치는 의미가 없어진다.가중치 튜닝은 답이 아니었다그럼 가..

AI 2026.07.12

[RAG] PostgreSQL 한국어 전문검색 MeCab 형태소 분석

부제: "약"을 검색하면 "약을"이 안 걸리던 문제한국어 문서 검색을 붙이는데, 기본 전문검색이 영 엉뚱하게 걸렸다.결국 언어 특성에 맞는 토크나이저를 고르는 게 일의 절반이었다.문제PostgreSQL 기본 전문검색(tsvector, simple 토크나이저)은 공백으로 단어를 나눈다.영어는 단어 사이가 공백이라 이게 통하는데, 한국어는 다르다."오늘 약을 먹었어요"공백 토큰화 → ["오늘", "약을", "먹었어요"]사용자가 "약"을 검색하면 약을이라는 덩어리와는 안 맞는다.한국어는 어근에 조사·어미가 달라붙는 구조라 공백으로 자르면 "약 + 을"이 통째로 하나가 돼버린다.영어식 어근 추출(stemming)도 답이 아니다. 그건 접사가 떨어지는 영어 형태에나 맞는 방식이라 결합형인 한국어엔 형태소 분석이 ..

AI 2026.07.08
728x90