방명록
- [LLM] LangChain과 ChromaDB 사용 시 겪을 수 있는 두 가지 함정: 인코딩과 저장 문제 해결하기2025년 05월 06일 10시 39분 59초에 업로드 된 글입니다.작성자: DandyNow728x90반응형
LangChain과 ChromaDB 사용 시 겪을 수 있는 두 가지 함정: 인코딩과 저장 문제 해결하기
LangChain과 벡터 데이터베이스를 활용하여 RAG(Retrieval Augmented Generation) 시스템을 구축하는 것은 이제 익숙한 패턴이 되었다. 특히 ChromaDB는 사용하기 편리하여 많은 경우에 선택된다. 하지만 개발 과정에서 예상치 못한 문제에 직면할 때가 있다. 이번 글에서는 문서를 로드할 때 발생하는 한글 인코딩 문제와 ChromaDB가
persist_directory에 데이터를 저장하지 않는 문제를 다루고, 해결 방법을 공유한다.1. 문서 로드 시 한글 인코딩 깨짐 문제
- 문제 현상:
WebBaseLoader등으로 웹에서 한국어 문서를 로드했을 때, 문서 내용(page_content)이나 메타데이터(title)에 한글이질문,프롬프트 엔지니어ë§와 같이 알 수 없는 문자로 깨져 보이는 현상이 발생한다. - 원인 진단: 이는 문자 인코딩 문제이다. 웹 페이지 콘텐츠는 바이트 형태로 전송되는데, 이를 Python 문자열로 변환(디코딩)하는 과정에서 웹 페이지의 실제 인코딩(주로 UTF-8)과 다른 인코딩 방식으로 해석될 때 발생한다.
WebBaseLoader는 웹 표준에 따라 인코딩을 자동 감지하려 하지만, 때때로 실패할 수 있다.WebBaseLoader가 문서를 로드한 직후에 이미 깨진 상태로Document객체가 생성되었음을 확인하였다. - 해결 방안:
WebBaseLoader의 자동 감지에 의존하는 대신,requests라이브러리 등을 사용하여 웹 페이지의 바이트 데이터를 직접 가져온 후,response.content.decode('utf-8')와 같이 명시적으로 UTF-8로 디코딩하여 올바른 문자열을 얻어야 한다. 그 후 이 디코딩된 문자열로 LangChain의Document객체를 직접 생성하여 다음 단계로 넘겨주면 된다.
2. ChromaDB Persist Directory 미생성 문제
- 문제 현상:
Chroma.from_documents함수를 호출할 때persist_directory인자로 저장 경로를 명시적으로 지정했지만, 코드 실행 후 해당 경로에 벡터 스토어 관련 파일이나 디렉터리가 생성되지 않는 현상이 발생한다. 디스크 공간은 충분하고 Python 코드 실행 중 별다른 오류 메시지는 출력되지 않았다. - 원인 진단: 최신 버전의 ChromaDB(0.4.x 이상)에서는
Chroma.from_documents사용 시persist_directory가 지정되면 자동으로 디스크에 저장된다. 따라서 별도의.persist()메서드 호출은 필요 없으며, 오히려 호출 시에는 해당 메서드가 더 이상 지원되지 않는다는 경고 메시지가 출력된다. 문제는 저장 로직 자체가 아니라persist_directory에 지정된 경로 자체가 현재 코드가 실행되는 환경에서 유효하지 않거나 접근할 수 없는 경로이기 때문일 가능성이 높다. 특히 Windows 환경에서/chroma_db와 같이 Linux/Colab 스타일의 절대 경로를 사용했을 때 이러한 문제가 발생할 수 있다. Windows에서는 해당 경로가 존재하지 않거나, Linux에서는 루트 디렉터리 바로 아래에 일반 사용자가 쓰기 권한이 없는 경우가 많다. - 해결 방안:
persist_directory에 현재 코드를 실행하는 OS 환경에 맞는 유효한 경로를 지정해야 한다. 스크립트가 실행되는 현재 디렉터리를 기준으로 저장하고 싶다면./chroma_db와 같이 상대 경로를 사용하는 것이 가장 일반적이고 OS 독립적인 방법이다. Windows 절대 경로를 사용한다면C:\\Users\\사용자명\\문서\\chroma_db와 같이 해당 OS 형식에 맞는 정확한 경로를 지정해야 한다. 올바른 경로를 지정하면 ChromaDB가 자동으로 해당 위치에 벡터 스토어를 생성하고 문서를 저장한다.
결론
LangChain과 ChromaDB를 사용하여 RAG 시스템을 구축할 때, 데이터 로드 단계에서의 인코딩 처리와 벡터 스토어의 영구 저장을 위한 올바른 경로 설정은 중요하다. 문서 로드 시 깨진 문자가 보인다면 원본 데이터를 가져오는 단계에서 명시적인 UTF-8 디코딩을 고려하고, 벡터 DB가 저장되지 않는다면
persist_directory에 지정된 경로가 현재 실행 환경에서 유효하고 쓰기 가능한 경로인지 반드시 확인해야 한다. 이 두 가지 함정을 잘 이해하고 대처한다면 보다 안정적인 RAG 시스템을 구축할 수 있을 것이다.728x90반응형'AI > AI와 일하기' 카테고리의 다른 글
내 PC에서 나만의 AI를! Ollama 사용법 완벽 가이드 (3) 2025.06.09 [LLM] 대규모 임베딩 검색의 핵심, FAISS 알아보기 (1) 2025.05.15 [LLM] LangGraph에서 GraphRecursionError 해결하기: 올바른 상태 관리의 중요성 (0) 2025.05.05 [LLM] 에이전트 리즈닝(Agent Reasoning) (0) 2025.04.29 [LLM] 왜 LangChain 같은 프레임워크를 사용할까? (1) 2025.04.29 다음글이 없습니다.이전글이 없습니다.댓글 - 문제 현상: