DICOM 의료 이미지 태그를 일괄 편집하고, Qdrant 하이브리드 검색 기반 개인 메모 RAG 챗봇을 결합한 Electron 데스크탑 앱.
DICOM 파일의 태그를 수정하거나 확인하려면 전문 의료 소프트웨어가 필요했습니다. 또한 업무 중 축적한 개인 지식을 빠르게 검색할 수 있는 AI 챗봇도 필요했습니다. 두 기능을 별도 도구로 사용하는 것이 불편했습니다.
Electron 33 + React 19 기반 데스크탑 앱으로 두 기능을 통합했습니다. pydicom Python 런타임을 앱에 직접 번들해 플랫폼별 설치 없이 DICOM 처리가 가능합니다. Qdrant 벡터 DB와 LangChain/LangGraph로 사용자 메모 기반 하이브리드 RAG 챗봇을 구현했습니다.
의미 검색(Dense)만으로는 태그명·코드 같은 정확한 키워드를 놓치고, 키워드 검색(Sparse)만으로는 표현이 다른 동의어를 놓칩니다. 두 결과를 RRF로 결합해 양쪽의 약점을 서로 보완했습니다.
임베딩 + 형태소 분석 + RRF로 인덱싱·질의 파이프라인이 복잡해지고, 10분 캐시 갱신 등 운영 포인트가 늘어납니다. 검색 정확도를 위해 이 복잡도를 감수했습니다.
DICOM 처리의 사실상 표준인 pydicom을 쓰려면 Python이 필요한데, 사용자에게 별도 설치를 요구하면 배포가 그 자리에서 깨집니다. 런타임을 앱에 내장해 설치 0단계로 만들었습니다.
앱 용량이 커지고 Mac/Windows 플랫폼별 빌드를 따로 관리해야 합니다. Node ↔ Python IPC 계층도 추가로 유지보수 대상이 됩니다.
긴 대화의 전체 히스토리를 매 요청마다 보내면 토큰이 선형으로 증가합니다. 메시지가 6개를 넘으면 LangGraph가 이전 대화를 요약·압축하고 최근 2개만 남겨, 맥락은 유지하면서 비용을 억제합니다.
요약 과정에서 세부 맥락 일부가 손실될 수 있습니다. 임계치를 보수적으로 잡고 최근 메시지는 원문으로 남겨 손실을 최소화했습니다.
Gemini 임베딩(3072차원, 의미 기반)과 mecab-ya TF-IDF(키워드 기반)를 Qdrant 네이티브 RRF(Reciprocal Rank Fusion)로 융합·재랭킹합니다. 사용자가 `저장:` 명령으로 축적한 개인 메모를 대상으로 의미 유사도와 키워드 정확도를 동시에 활용합니다.
mecab-ya로 명사·동사·형용사·고유명사만 추출하고 불용어를 제거합니다. IDF 계산 시 신규 문서와 기존 문서를 함께 처리해 정확도를 높이고, 10분 간격 캐시 갱신으로 성능을 최적화합니다.
Python 런타임을 앱에 내장하고, Electron Node와 Python을 IPC(child_process spawn)로 연결해 pydicom으로 DICOM을 처리합니다. 사용자가 Python을 따로 설치하지 않아도 동작합니다.
대화 메시지가 6개를 넘으면 LangGraph StateGraph가 이전 대화를 요약하고 최근 2개만 남깁니다(MemorySaver 체크포인트). 토큰 비용을 절감하면서 대화 맥락은 유지합니다.
정적 JSON으로 내장된 태그 사전으로 자동완성을 제공합니다. LO VR 타입은 DICOM 표준(64자 제한)에 따라 자동 truncate합니다.