오류 해결 과정

BM25를 추가한 리트리버(retriver)로 성능 올리기

필만이 2024. 10. 13. 23:01

배경

  1. 임베딩 방식의 검색기를 사용했는데, 검색기의 성능이 좋지 않았다. 질문 14개 중에 6개만 정답이었고, 오답의 대부분이 검색기 문제로 오답이었다.
    # 검색기 설정
    retriever = vectorstore.as_retriever(
        search_type="similarity_score_threshold",
        search_kwargs={'k': 20, "score_threshold": 0.30}
    )
  1. 원인을 파악해보니, 자주 쓰이는 단어 때문이었다.

    • 이유 : '여자' 라는 단어가 본문에 너무 자주 쓰여서, 검색기가 이걸 찾기가 힘듦.
    • 해결방안 : '여자'라는 단어의 중요도를 낮추고 '패션'이라는 단어에 집중해 검색 해야한다.
  2. 이 문제를 해결하기 위해 만들어진게 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)는 신뢰도가 높은 검색기로 이번 프로젝트에 적용하기로 했다.