배경
- 임베딩 방식의 검색기를 사용했는데, 검색기의 성능이 좋지 않았다. 질문 14개 중에 6개만 정답이었고, 오답의 대부분이 검색기 문제로 오답이었다.
# 검색기 설정
retriever = vectorstore.as_retriever(
search_type="similarity_score_threshold",
search_kwargs={'k': 20, "score_threshold": 0.30}
)
원인을 파악해보니, 자주 쓰이는 단어 때문이었다.
- 이유 : '여자' 라는 단어가 본문에 너무 자주 쓰여서, 검색기가 이걸 찾기가 힘듦.
- 해결방안 : '여자'라는 단어의 중요도를 낮추고 '패션'이라는 단어에 집중해 검색 해야한다.
이 문제를 해결하기 위해 만들어진게 BM25 알고리즘이다. 따라서 BM25 기능을 검색기에 추가해 성능을 높이고자 한다.
해결과정
- 검색기 코드
# 검색기 설정
retriever = vectorstore.as_retriever(
search_type="similarity_score_threshold",
search_kwargs={'k': 20, "score_threshold": 0.30}
)
# bm25 retriever와 faiss retriever를 초기화합니다.
bm25_retriever = BM25Retriever.from_documents(
documents
)
bm25_retriever.k = 20 # BM25Retriever의 검색 결과 개수를 5로 설정합니다.
sparse_docs = bm25_retriever.get_relevant_documents(query)
# 질문과 관련된 문서 추출
dense_docs = retriever.get_relevant_documents(query)
retrieved_docs=sparse_docs+dense_docs
- 실제 정답률 증가 과정
결론
- BM25를 추가한 방식으로 검색기를 개선해서 정답률 42% -> 78% 로 상승했다.
- 이후 질문의 오류가 발견되 그것을 수정하니 78% -> 92% 로 상승했다.
- 나머지 실패한 하나는 검색기 문제가 아니였다. 관련 내용이 걸려 context에 있는것을 확인함
- 따라서 임베딩 방식에 BM25를 추가한 검색기(retriever)는 신뢰도가 높은 검색기로 이번 프로젝트에 적용하기로 했다.