- Python
- FastAPI
- LangGraph
- LangChain
- React 19
- Vite
- PostgreSQL
- SQLAlchemy
- Milvus
- Docker
- GATK
- DeepVariant
- VEP
주요 기여
- 약 53GB의 paired-end WGS를 QC부터 후보 순위화까지 재현 가능하게 연결한 분석 파이프라인 구축
- 질환 무관 탐색과 임상 정보 기반 탐색을 함께 유지하고, 여섯 가지 근거 계열로 후보 순위 설계
- LangGraph supervisor 기반으로 파이프라인 제어·분석 과정·후보 근거 질의를 분리한 해석 어시스턴트 구현
프로젝트 개요
이어드림스쿨 6기에서 바이오 기업과 함께 진행한 산업 연계 프로젝트다. 반려견의 전장유전체(WGS) 데이터에서 희귀 혈액질환과 관련된 후보 변이를 찾고, 분석 결과와 판단 근거를 사람이 확인할 수 있는 시스템을 만드는 것이 목표였다. 기획과 설계부터 분석 파이프라인, 백엔드 API, 에이전트와 분석 화면까지 단독으로 개발했다.
분석 파이프라인
약 53GB의 paired-end WGS 데이터를 입력으로 받아 품질 확인부터 후보 순위화까지 이어지는 과정을 자동화했다.
품질 확인 → 참조 게놈 정렬 → 중복 마킹 → 변이 검출 → 정규화·필터
→ 기능 주석 → 집단 빈도·인공물 검사 → 근거 결합 → 후보 순위화 → 리포트
- FastQC와 fastp로 원시 데이터의 품질을 확인하고 전처리
- 정렬 도구 7종을 같은 조건에서 비교한 뒤 분석 환경에 맞는 도구를 선정
- DeepVariant와 GATK를 이용해 변이를 검출하고 VEP로 기능 정보 주석
- Dog10K·OMIA·구조 정보와 문헌 근거를 결합해 후보별 판단 자료 구성
- 단계별 산출물과 실행 상태를 기록해 중단된 작업을 이어서 실행할 수 있도록 설계
전체 데이터 정렬률은 99.8%였고, 중복 마킹 이후 유효 커버리지는 약 41x였다. 전장 변이 검출에서는 약 766만 건이 나왔으며, 이후 단계에서 품질과 기능, 집단 빈도, 질환 관련 근거를 순서대로 확인했다.
후보를 좁히는 기준
초기에는 질환과 관련된 유전자에 가중치를 주는 방식을 검토했지만, 이미 알고 있는 후보만 다시 찾게 될 가능성이 있었다. 반대로 질환 정보를 완전히 제외하면 실제 임상 정보도 활용하지 못한다. 그래서 질환과 무관하게 후보를 살피는 탐색 경로와, 문진으로 받은 질환 정보를 반영하는 경로를 함께 유지했다.
근거도 단순히 개수를 더하지 않았다. 같은 성격의 신호가 여러 번 반영되지 않도록 호출 신뢰도, 유전자 모델 신뢰도, 집단 빈도, 기능 영향, 질환 연관성, 유전 양식으로 나눴다. 각 후보가 어떤 자료를 근거로 순위에 올랐는지 리포트와 화면에서 다시 확인할 수 있도록 출처와 판정 과정을 함께 남겼다.
분석 과정에서는 품질 수치가 좋은 후보가 참조 게놈의 유전자 모델이 맞지 않는 구간에 있어 판정을 되돌린 사례도 있었다. 이 경험을 통해 검출 결과만으로 결론을 내리지 않고 참조 유전체, 전사체와 단백질 수준의 근거를 다시 확인하는 단계를 보강했다.
파이프라인 운영과 분석 화면
FastAPI 백엔드에서 각 분석 단계를 작업 단위로 관리한다. 단계별 의존성과 실행 상태를 기록하고, 장시간 작업이 중단되더라도 완료된 산출물부터 이어서 실행할 수 있도록 구성했다. React 기반 화면에서는 시료별 진행 상태와 품질 지표, 필터링 과정, 후보 목록과 근거를 확인할 수 있다.
분석 수치의 단위가 서로 다르다는 점도 화면에 반영했다. 리드 수, 변이 수, 전사체별 행 수를 하나의 숫자처럼 연결하지 않고, 각 단계에서 무엇을 세고 어떤 기준으로 제외했는지를 구분해 보여주도록 했다.
LangGraph 해석 어시스턴트
분석 결과를 대화로 확인할 수 있도록 LangGraph supervisor 기반 어시스턴트를 구현했다. 사용자 요청을 다음 흐름으로 나눠 필요한 데이터와 도구만 조회한다.
- 파이프라인 제어: 분석 실행·중지와 현재 상태 확인
- 분석 과정 질의: 품질, 정렬률, 깊이, 변이 수와 필터 기준 설명
- 후보 근거 질의: 후보 변이와 유전자, 구조·문헌 근거 조회
- 안내와 예외 처리: 사용 범위를 벗어난 요청과 시스템 오류를 구분해 응답
각 작업 노드는 조회한 결과만 상태에 남기고, 사용자에게 전달할 문장은 마지막 응답 노드에서 만든다. 근거와 불확실성 안내를 한곳에서 일관되게 적용하기 위한 구조다. 시스템 오류가 발생했을 때는 모델이 상황을 추측해 답하지 않도록 정해진 오류 응답으로 분리했다.