[Feat] 벡터 + 키워드 하이브리드 검색 구현#30
Conversation
There was a problem hiding this comment.
Code Review
This pull request implements a hybrid search mechanism and query expansion logic to enhance the RAG-based chat service. Key updates include new repository methods for combined vector and keyword searching, an LLM-driven query rewriting service, and a transition to structured JSON output for the answer generator to improve source tracking. The review feedback identifies potential runtime errors caused by premature database session closure, performance bottlenecks in the SQL-based keyword search, and opportunities to reduce redundant LLM API calls during query expansion.
| to_tsvector( | ||
| 'simple', | ||
| COALESCE(rc.chunk_text, '') || ' ' || | ||
| COALESCE(rd.content, '') || ' ' || | ||
| COALESCE(rc.keywords::text, '') | ||
| ), | ||
| websearch_to_tsquery('simple', :query_text) |
There was a problem hiding this comment.
There was a problem hiding this comment.
새 작업이 필요하다 생각해 새 이슈로 팠습니다! 이 브랜치 머지 후 작업하려구요
| expanded_query = expand_query_for_retrieval( | ||
| question=question, | ||
| dormitory=None, | ||
| ) |
There was a problem hiding this comment.
위의 단일 생활관 로직과 마찬가지로, 377행에서 이미 쿼리 확장이 일어났을 가능성이 있습니다. 중복된 LLM 호출을 방지하기 위해 rewritten_query 상태를 체크하십시오.
| expanded_query = expand_query_for_retrieval( | |
| question=question, | |
| dormitory=None, | |
| ) | |
| if _is_no_answer(answer_result.answer): | |
| expanded_query = rewritten_query if rewritten_query != question else expand_query_for_retrieval( | |
| question=question, | |
| dormitory=None, | |
| ) |
|
SQL 쿼리 내에서 to_tsvector를 검색 시마다 매번 호출하는 방식은 새 이슈로 따로 뺐습니다. |
|
사라님, 충돌이 있어서 머지가 안된다고 하는데 한 번 봐주실 수 있나요 |
유형
작업 내용
하이브리드 검색에서 벡터 검색과 키워드 검색을 더 안정적으로 결합하도록 개선했습니다.
키워드 점수가 없을 때 최종 유사도가 낮아지던 문제를 수정하고, fallback 판단은 하이브리드 점수가 아니라 벡터 점수 기준으로 동작하도록 변경했습니다.
또한 검색용으로 확장된
retrieval_query가 벡터 임베딩과 키워드 검색 양쪽에 동일하게 사용되도록 수정했습니다.변경 사항 (있다면)
similarity가vector_score그대로 유지되도록 수정vector_score + keyword_weight * keyword_score * (1 - vector_score)방식으로 가산vector_score를 추가하고 fallback threshold 판단 기준으로 사용similarity는 최종 하이브리드 점수로 저장retrieval_query를 벡터 임베딩과 키워드 검색 모두에 전달리뷰 포인트
similarity와vector_score의 역할이 명확히 분리되어 있는지vector_score기준으로 동작하는지retrieval_query가 벡터 검색과 키워드 검색에 동일하게 전달되는지테스트
/docs수동 확인pytest실행스크린샷