토니의 연습장
RAG 중복문장 제거 본문
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를 지정하는 이유는 **"이 키는 이미 처리되었다"**라는 의미를 명확히 하기 위함입니다.
🧠 최종 정리
- 딕셔너리를 사용하는 이유:
- 리스트의 **in 연산자는 O(n)**이지만, 딕셔너리는 해시 테이블을 사용하므로 **O(1)**로 중복 여부를 확인할 수 있습니다.
- 데이터가 많아질수록 성능 차이가 극명하게 드러납니다.
- 딕셔너리에 True를 값으로 설정하는 이유:
- **"존재 여부"**를 나타내는 **플래그(Flag)**로 사용됩니다.
- None을 사용해도 되지만, True를 사용하면 가독성이 좋아지고 의미가 명확해집니다.
- 성능 차이:
- 리스트 기반 중복 제거는 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 |