CI CHEESU IN / portfolio
online v2026.05 00:00:00 KST
Works 목록
P-05 · 의료영상 · AI · 데스크탑

DICOM Electron + RAG 챗봇

DICOM 의료 이미지 태그를 일괄 편집하고, Qdrant 하이브리드 검색 기반 개인 메모 RAG 챗봇을 결합한 Electron 데스크탑 앱.

SHOWCASE Electron · React · Qdrant cheesu/work-supporter
/ 01Stack
ElectronReactQdrantLangChainLangGraphPythonGemini EmbeddingLiteLLM
/ 02 아키텍처
HYBRID RAG 검색 파이프라인 질문 입력 사용자 메시지 Dense · Gemini 3072d Sparse · mecab TF-IDF Qdrant RRF 융합 top-10 컨텍스트 주입 LangGraph · LiteLLM 6개 초과 시 요약 응답 스트리밍 DICOM 편집 · IPC 경로 DICOM Tag Editor IPC · child_process pydicom · modify LO>64 truncate → 저장 '저장:' 명령으로 적재한 메모가 같은 Qdrant 컬렉션에서 검색 컨텍스트로 재사용됩니다.
  1. 01
    질문 입력사용자 메시지
  2. 02
    임베딩 (병렬)Dense Gemini 3072d + Sparse mecab TF-IDF
  3. 03
    Qdrant RRF 융합top-10 재랭킹
  4. 04
    컨텍스트 주입검색 결과 → 프롬프트
  5. 05
    LangGraph · LiteLLM6개 초과 시 자동 요약
  6. 06
    응답 스트리밍IPC로 렌더러 전달
↺ '저장:' 메모가 같은 Qdrant 컬렉션에서 검색 컨텍스트로 재사용
  1. D1
    DICOM Tag EditorUI
  2. D2
    IPC · child_processspawn
  3. D3
    pydicom · modifymodify_dicom.py
  4. D4
    LO>64 truncate → 저장DICOM 표준 64자
/ 03문제 / 배경

DICOM 파일의 태그를 수정하거나 확인하려면 전문 의료 소프트웨어가 필요했습니다. 또한 업무 중 축적한 개인 지식을 빠르게 검색할 수 있는 AI 챗봇도 필요했습니다. 두 기능을 별도 도구로 사용하는 것이 불편했습니다.

/ 04구현 방식

Electron 33 + React 19 기반 데스크탑 앱으로 두 기능을 통합했습니다. pydicom Python 런타임을 앱에 직접 번들해 플랫폼별 설치 없이 DICOM 처리가 가능합니다. Qdrant 벡터 DB와 LangChain/LangGraph로 사용자 메모 기반 하이브리드 RAG 챗봇을 구현했습니다.

/ 05설계 결정 & 트레이드오프

왜 Dense 단독이 아니라 Dense + Sparse 하이브리드인가

선택

의미 검색(Dense)만으로는 태그명·코드 같은 정확한 키워드를 놓치고, 키워드 검색(Sparse)만으로는 표현이 다른 동의어를 놓칩니다. 두 결과를 RRF로 결합해 양쪽의 약점을 서로 보완했습니다.

트레이드오프

임베딩 + 형태소 분석 + RRF로 인덱싱·질의 파이프라인이 복잡해지고, 10분 캐시 갱신 등 운영 포인트가 늘어납니다. 검색 정확도를 위해 이 복잡도를 감수했습니다.

왜 Python을 외부 의존이 아니라 앱에 번들했나

선택

DICOM 처리의 사실상 표준인 pydicom을 쓰려면 Python이 필요한데, 사용자에게 별도 설치를 요구하면 배포가 그 자리에서 깨집니다. 런타임을 앱에 내장해 설치 0단계로 만들었습니다.

트레이드오프

앱 용량이 커지고 Mac/Windows 플랫폼별 빌드를 따로 관리해야 합니다. Node ↔ Python IPC 계층도 추가로 유지보수 대상이 됩니다.

왜 대화 전체를 보내지 않고 자동 요약을 넣었나

선택

긴 대화의 전체 히스토리를 매 요청마다 보내면 토큰이 선형으로 증가합니다. 메시지가 6개를 넘으면 LangGraph가 이전 대화를 요약·압축하고 최근 2개만 남겨, 맥락은 유지하면서 비용을 억제합니다.

트레이드오프

요약 과정에서 세부 맥락 일부가 손실될 수 있습니다. 임계치를 보수적으로 잡고 최근 메시지는 원문으로 남겨 손실을 최소화했습니다.

/ 06기술 하이라이트
/ A

Dense + Sparse 하이브리드 검색

Gemini 임베딩(3072차원, 의미 기반)과 mecab-ya TF-IDF(키워드 기반)를 Qdrant 네이티브 RRF(Reciprocal Rank Fusion)로 융합·재랭킹합니다. 사용자가 `저장:` 명령으로 축적한 개인 메모를 대상으로 의미 유사도와 키워드 정확도를 동시에 활용합니다.

/ B

한국어 형태소 분석 최적화

mecab-ya로 명사·동사·형용사·고유명사만 추출하고 불용어를 제거합니다. IDF 계산 시 신규 문서와 기존 문서를 함께 처리해 정확도를 높이고, 10분 간격 캐시 갱신으로 성능을 최적화합니다.

/ C

번들된 Python 런타임 + IPC

Python 런타임을 앱에 내장하고, Electron Node와 Python을 IPC(child_process spawn)로 연결해 pydicom으로 DICOM을 처리합니다. 사용자가 Python을 따로 설치하지 않아도 동작합니다.

/ D

LangGraph 자동 대화 요약

대화 메시지가 6개를 넘으면 LangGraph StateGraph가 이전 대화를 요약하고 최근 2개만 남깁니다(MemorySaver 체크포인트). 토큰 비용을 절감하면서 대화 맥락은 유지합니다.

/ E

3,600+ DICOM 태그 내장 사전

정적 JSON으로 내장된 태그 사전으로 자동완성을 제공합니다. LO VR 타입은 DICOM 표준(64자 제한)에 따라 자동 truncate합니다.