토니의 연습장

RAG 중복문장 제거 본문

언어 AI (NLP)/LLM & RAG

RAG 중복문장 제거

bellmake 2025. 2. 15. 14:00

vectorDB에 넣기 위해 중복문장을 제거할때,
unique 문장을 뽑아내면서
리스트를 순회하지 않고 딕셔너리를 순회하며 키를 True로 넣는 이유

unique_texts = {}
docs_processed_unique = []

for doc in docs_processed:
    if doc.page_content not in unique_texts:
        unique_texts[doc.page_content] = True
        docs_processed_unique.append(doc)


이 코드에서 리스트 대신 딕셔너리를 사용하여 중복 여부를 확인하고, 키를 True로 넣는 이유를 설명해 드리겠습니다.


🛠️ 1. 리스트와 딕셔너리의 성능 차이

리스트 조회 (O(n))

  • 리스트에서 중복 여부를 확인할 때 if value in list와 같은 코드를 사용하면 리스트의 크기에 비례하여 시간이 증가합니다.
  • 리스트는 **in 연산자가 O(n)**의 시간 복잡도를 가지기 때문에, 리스트가 길어질수록 성능이 급격히 저하됩니다.

딕셔너리 조회 (O(1))

  • 딕셔너리해시 테이블(Hash Table) 구조를 사용하므로 **키를 조회할 때 평균적으로 O(1)**의 성능을 발휘합니다.
  • 즉, 리스트와 달리 데이터 크기가 커져도 성능 저하가 거의 없습니다.

🆚 리스트 vs 딕셔너리 성능 비교

방식시간 복잡도성능

리스트 기반 중복 제거 O(n²) 데이터가 많을수록 급격히 느려짐
딕셔너리 기반 중복 제거 O(n) 데이터가 커져도 성능 유지 가능

💡 결론:

  • 리스트의 경우 모든 요소를 매번 비교하므로 데이터가 많아질수록 시간이 급격히 늘어납니다.
  • 반면, 딕셔너리는 해시 테이블을 기반으로 하기에 데이터 크기와 관계없이 일정한 속도로 중복 여부를 확인할 수 있습니다.

🎯 2. 딕셔너리에 True를 넣는 이유

아래 코드에서 True를 넣는 이유에 대해 궁금하실 수 있습니다.

python
복사편집
unique_texts[doc.page_content] = True

이유: 존재 여부 플래그(Flag)

  • 딕셔너리의 **키(key)**만으로도 중복 여부를 확인할 수 있습니다.
  • 그러나 **값(value)**으로 True를 지정하는 이유는 **"이 키는 이미 처리되었다"**라는 의미를 명확히 하기 위함입니다.

🧠 최종 정리

  1. 딕셔너리를 사용하는 이유:
    • 리스트의 **in 연산자는 O(n)**이지만, 딕셔너리는 해시 테이블을 사용하므로 **O(1)**로 중복 여부를 확인할 수 있습니다.
    • 데이터가 많아질수록 성능 차이가 극명하게 드러납니다.
  2. 딕셔너리에 True를 값으로 설정하는 이유:
    • **"존재 여부"**를 나타내는 **플래그(Flag)**로 사용됩니다.
    • None을 사용해도 되지만, True를 사용하면 가독성이 좋아지고 의미가 명확해집니다.
  3. 성능 차이:
    • 리스트 기반 중복 제거는 O(n²), 딕셔너리 기반 중복 제거는 **O(n)**으로 대규모 데이터 처리 성능이 훨씬 뛰어남을 확인했습니다.

💡 따라서, 파이썬에서 중복 여부를 확인할 때는 set 또는 dict를 사용하는 것이 훨씬 효율적입니다! 🚀💡

'언어 AI (NLP) > LLM & RAG' 카테고리의 다른 글

RAGAS 를 이용한 RAG 평가  (0) 2025.02.27
RAG - AI Agent 예시  (0) 2025.02.18
gguf/safetensor 로 ollama 모델 만들기  (0) 2025.02.11
db.add_documents() 특징  (0) 2025.02.06
RAG 단계 요약  (0) 2025.02.06