Claude를 사용하여 FTIR 분석 플랫폼을 구축한 방법 (그리고 AI 보조 개발에 대해 배운 점)
요약
재료 과학 전공자가 Claude를 코딩 파트너로 활용하여 135,000개의 스펙트럼을 처리하는 FTIR 분석 플랫폼을 구축한 사례를 다룹니다. AI가 코드의 70%를 작성하며 알고리즘, Django 구조, 바이너리 파서 구현을 도왔으나, 도메인 지식을 통한 검증의 중요성을 강조합니다.
핵심 포인트
- AI는 코드 작성 속도를 높여주지만 도메인 전문 지식은 필수임
- Claude는 복잡한 바이너리 파일 파싱 및 스키마 설계에 탁월함
- AI가 생성한 코드의 미묘한 데이터 오류는 인간의 검증이 필요함
- MCP를 활용한 AI 에이전트의 도구 호출 및 확장 가능성
DEV.to 기사: Claude를 사용하여 FTIR 분석 플랫폼을 구축한 방법
제목: Claude를 사용하여 FTIR 분석 플랫폼을 구축한 방법 (그리고 AI 보조 개발에 대해 배운 점)
태그: python, chemistry, opensource, ai
게시 여부: true (DEV에 즉시 게시 가능)
배경 이야기
저는 소프트웨어 개발자가 아닌 재료 과학 전공자입니다. 저는 FTIR 분광법(FTIR spectroscopy) — 폴리머 식별, 작용기 피크(functional group peaks) 해석, 미지 시료를 참조 라이브러리와 대조하는 작업 — 을 알고 있습니다. 하지만 프로그래밍 방식으로 FTIR 스펙트럼을 검색해야 했을 때, 저는 벽에 부딪혔습니다. 기존 도구들은 비싼 기업용 패키지이거나 2000년대 초반의 Excel 매크로뿐이었습니다.
그래서 저는 직접 만들기로 결심했습니다. 그리고 Claude (Anthropic의 AI 어시스턴트)를 저의 코딩 파트너로 활용했습니다.
이것은 기본적인 Python 기술을 가진 도메인 전문가가 AI가 코드의 약 70%를 작성하게 하여 — 135,000개의 스펙트럼, MCP 서버, API, 커뮤니티 기능 포함 — 어떻게 실제 서비스 가능한 FTIR 검색 플랫폼을 구축했는지에 대한 이야기입니다.
1단계: 핵심 알고리즘
FTIR 스펙트럼 매칭은 복잡하게 들리지만, 핵심은 단순한 기하학입니다. 미지 시료의 피크 위치 세트가 주어졌을 때, 허용 오차 범위(tolerance window, 일반적으로 ±5 ~ ±15 cm⁻¹) 내에서 가장 많은 피크가 일치하는 라이브러리 스펙트럼을 찾는 것입니다.
Claude가 도와준 부분:
- 초기 피크 매칭 루프(peak-matching loop) 작성
- Django 프로젝트 구조 설정
- 스펙트럼 라이브러리를 위한 데이터베이스 스키마(database schema) 설계
내가 처리한 부분:
- 어떤 허용 오차 값이 실제로 작동하는지 이해하기 (파수 영역(wavenumber regions)에 따라 서로 다른 허용 오차가 필요함)
- 알려진 물질과 매칭 결과 검증
- 서류상으로는 맞지만 실제 데이터에서는 실패한 초기 세 가지 알고리즘 설계안 거부
교훈: AI는 당신보다 코드를 더 빨리 작성할 수 있지만, 화학적으로 맞는지 여부는 알려줄 수 없습니다. 병목 현상은 코드가 아니라 도메인 전문성(Domain expertise)입니다.
2단계: FTIR 장비 파일 파싱
이것이 가장 어려운 기술적 과제였습니다. FTIR 장비는 최소 6가지 이상의 서로 다른 형식으로 데이터를 출력합니다:
| 형식 | 출처 | 난이도 |
|---|---|---|
| SPA | Thermo Nicolet | 중간 — 바이너리 (binary), 독점 형식 |
| ... |
Claude가 도와준 부분:
- 형식 문서(format documentation)를 바탕으로 바이너리 파일 파서 (binary file parsers) 작성
- 원시 장비 데이터에서 피크 테이블 (peak tables) 추출
- 예외 케이스 처리 (누락된 메타데이터, 비표준 헤더)
내가 처리한 부분:
- 대학 실험실의 실제 장비 파일로 테스트 수행
- 실제 현장에서 어떤 형식의 변형(variants)이 나타나는지 식별
- 파싱 불가능한 파일에 대한 에러 처리 (error handling) 설정
교훈: Claude는 바이너리 파일 파싱에 놀라울 정도로 능숙합니다. Thermo와 Bruker의 문서에서 형식 사양(format specs)을 복사하여 붙여넣었더니, 실제로 작동하는 파서를 생성해냈습니다. 하지만 데이터가 조용히 손상될 수 있는 미묘한 세 가지 바이트 오프셋 (byte-offset) 오류를 제가 직접 잡아내야 했습니다.
3단계: MCP 서버
MCP (Model Context Protocol)를 사용하면 AI 에이전트가 사용자의 도구를 직접 호출할 수 있습니다. 사람이 웹 양식에 피크 값을 직접 입력하는 대신, AI 에이전트가 구조화된 요청을 보내고 구조화된 결과를 받을 수 있습니다.
fastapi_server/mcp_server.py에 위치한 MCP 서버는 하나의 주요 도구를 노출합니다:
analyze_ftir_spectrum(file_content, filename, peaks)
장비 파일 또는 피크 리스트를 모두 수용합니다. 유사도 점수(similarity scores)와 함께 순위가 매겨진 매칭 결과를 반환합니다.
Claude가 생성한 것: Pydantic 출력 스키마 (output schemas), 에러 처리, 기능 문서화를 포함하여 MCP 서버 코드의 약 90%를 생성했습니다.
4단계: 운영 환경에서 발생한 문제
문제 1: 메모리
모든 요청마다 135K개의 스펙트럼 라이브러리 전체를 메모리에 로드하는 것은 로컬 환경에서는 괜찮았습니다. 하지만 다른 서비스가 실행 중인 2GB VPS에서는 몇 시간 내에 OOM (Out Of Memory) 킬이 발생했습니다.
- 해결책: 빈번한 검색을 위한 Redis 캐싱 추가, 라이브러리에 대한 지연 로딩 (lazy loading), 그리고 배치 쿼리 (batch query) 크기 제한을 적용했습니다.
문제 2: Cloudflare 타임아웃
MCP의 streamable-http 전송 방식은 지속적인 연결이 필요합니다. Cloudflare의 기본 100초 타임아웃 설정이 긴 검색 작업을 중단시켰습니다.
- 해결책 (Fix): 진행 상황 보고를 위한 Server-sent events (SSE) 도입 및 Cloudflare 타임아웃 조정.
문제 3: 환각(Hallucination)과 유사한 거짓 양성 (False Positives)
매칭 알고리즘이 매우 짧은 피크 리스트(2~3개 피크)에 대해 화학적으로 불가능한 후보를 반환했습니다.
- 해결책 (Fix): 최소 피크 개수 임계값(threshold)을 추가하고, 피크 수가 적은 쿼리에 대해 신뢰도 페널티(confidence penalty)를 부여했습니다.
결과
FTIR.fun은 현재 다음과 같은 상태입니다:
- 라이브 사이트: https://ftir.fun
- MCP 엔드포인트 (endpoint):
https://ftir.fun/mcp— Claude, Cursor, Copilot 또는 모든 MCP 클라이언트에서 연결 가능 - OpenAPI 명세 (spec):
https://ftir.fun/openapi.platform.yaml - GitHub: github.com/jxbaoxiaodong/ftirfun-mcp
- 약 135,000개의 스펙트럼 (spectra) 인덱싱 및 검색 가능
- **코드의 약 70%**를 Claude와 공동 작성
- **코드의 약 30%**를 Claude가 작성한 버전이 프로덕션(production)에서 실패한 후 재작성
AI 보조 개발을 고려하는 다른 도메인 전문가들에게 해주고 싶은 말
1. 화려한 프레임워크가 아니라, 지저분한 데이터부터 시작하세요.
저는 Claude가 완벽한 Docker Compose 설정을 생성하도록 만드는 데 2주를 보냈습니다. 그 후 실제 FTIR 장비 파일을 처리하는 데 2개월을 보냈습니다. 인프라는 쉬운 부분이었고, 데이터가 어려운 부분이었습니다.
2. AI는 맞아이 보이지만 틀린 코드를 작성할 것입니다.
Claude는 단위 테스트(unit tests)는 통과하지만 실제 스펙트럼(spectra)에서는 실패하는 아름다운 피크 매칭 코드를 생성했습니다. 피크 위치가 수학적으로는 "일치"했지만, 기본적인 FTIR 화학 원리를 위반했습니다. 이를 잡아내기 위해서는 도메인 지식 (domain knowledge)이 필요합니다.
3. 프로덕션(Production)은 AI가 생성한 코드가 가장 먼저 깨지는 곳입니다.
노트북(notebook) 환경에서 깔끔해 보이는 코드는 실제 부하, 실제 데이터의 다양성, 그리고 실제 타임아웃 제한 상황에서 가장 먼저 무너집니다. 핵심 경로 (hot paths)를 재작성할 준비를 하세요.
4. 하지만 프레임워크 코드는 AI에게 완벽합니다.
설정(Settings), 스키마 (schemas), API 라우팅 (routing), 테스트 스캐폴딩 (test scaffolding), README 파일, 배포 스크립트(deployment scripts) 등은 Claude가 결점 없이 작성했습니다. 당신이 도메인 로직 (domain logic)에 집중하는 동안, AI가 이를 연결하는 접착제 (glue) 역할을 수행하게 하세요.
다음 단계
- 신뢰도 교정 (Confidence calibration) (0.85의 유사도 점수는 얼마나 신뢰할 수 있는가?)
- 확장된 파일 형식 지원
- 사용 티어(usage tiers)가 포함된 공개 API
- 에이전트 워크플로우 (agent workflows)를 위한 더 많은 MCP 도구
FTIR.fun은 이를 구축하며 Python을 배운 한 재료 과학자가 진행하는 오픈 스펙트럴 검색 (open-spectral-search) 프로젝트입니다. 질문, 피드백 또는 기여할 FTIR 데이터셋이 있으신가요? ftir.fun@outlook.com
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기