한컴AI 2기

[스나이퍼팩토리] 한컴AI 2기 - 알랭 RAG 로컬 도커에서의 구동기 (w FAISS 샤딩)

싱커 2025. 11. 10. 17:28

샤딩 (Sharding)

FAISS의 특성상, (성능 개선을 기대할 수 없는) 사후필터링만이 가능해서, 초기의 업로드부터 권한별로 분산해서 저장하면 어떨까? 하는 아이디어로 샤딩을 시도했다. (샤딩은 DB 트래픽을 분산할 수 있는 중요한 수단이다.)

시도와 성공

경로 통일 이전의 스크린샷이라, 벡터스토어는 app/data/uploads에 들어가있고, 문서파일은 data/uploads에 들어가있다 ㅎㅎ.. 나중에 다시 app/data/uploads로 통합했다.


hwpx RAG 구현 in 도커

metadata 내에 dept_id, project_id, user_id 임의로 넣어봤다. 구조 확장엔 큰 문제가 없어보인다.

hwp 파싱 테스트

hwp를 파싱했는데, 왜인지 text_content가 하나의 통문자열 리스트로 왔다.

hwpx의 파싱, 청킹, 임베딩

hwpx파일은 hwp와 달리 파싱-청킹-임베딩의 과정이 모두 잘 이뤄졌다.

도커 환경에서의 RAG 수행

리스폰스를 받았지만, 데이터가 없었다. 검색권한쪽 컨트롤이 필요한건지, 성능이슈인지 원인을 찾지 못했다.


hwp RAG 구현 in 도커

hwp 파일은 청킹-임베딩-저장이 되지 않던 문제가 있었다. (jar, jpype, JAVA_HOME으로 고통받던 지난 주가 생각났다...)

이전 응답에서 text_content가 분할되지 않은 것에 주목했다.

hwp는 단락(para)생성이 안되던 문제가 있었는데, 이를 해결하기위해 문단 보정을 해주기로 했다.  _iter_paragraph_texts라는 유틸 함수를 app/services/rag/rag_service.py에다 넣어 구현했다.

RAG 디버그

 

샤딩 검색이 제대로 안되어서, 디버그를 추가해보았다. 문제는 config 안에 있었다. 컨피그에 샤딩검색을 False로 두었던 것을, True로 바꾸었다. 이제 req.body에 user_id를 포함해 전달하면, 해당 폴더의 FAISS 벡터 스토어로부터 검색이 이뤄지고, LLM이 응답을 생성한다.


본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 2기 (B-log) 리뷰로 작성 되었습니다.