Files
ExperionCrawler/mcp-server/mcp-parallel-progress.md

13 KiB

MCP 병렬 아키텍처 구현 진행 상황

작성일: 2026-05-03
진행자: Roo
기준 문서: mcp-parallel-plan.md


📋 전체 구현 체크리스트 (mcp-parallel-plan.md §10)

# 항목 난이도 상태
1 mcp-server/worker/ 디렉토리 생성 쉬움 [x]
2 rag_worker.py 구현 보통 [x]
3 nl2sql_worker.py 구현 보통 [x]
4 pid_worker.py 구현 보통 [x] (이미 존재)
5 메인 서버에 ProcessManager 클래스 추가 어려움 [x]
6 요청 라우팅 로직 구현 보통 [x]
7 프로세스 상태 모니터링 도구 추가 쉬움 [x]
8 테스트: 각 워커 독립 실행 보통 [ ]
9 테스트: 병렬 요청 처리 어려움 [ ]
10 문서 업데이트 쉬움 [ ]

🔧 구현 상세 작업 목록

Phase 1: 준비 작업

# 작업 파일 난이도 상태 검증 결과
1.1 mcp-server/worker/ 디렉토리 생성 - 쉬움 [x] mkdir 확인
1.2 mcp-server/storage/ 디렉토리 생성 - 쉬움 [x] mkdir 확인
1.3 mcp-server/logs/ 디렉토리 생성 - 쉬움 [x] mkdir 확인

Phase 2: 워커 구현

2.1 RAG 워커 (rag_worker.py)

# 작업 파일 난이도 상태 검증 결과
2.1.1 rag_worker.py 기본 구조 생성 mcp-server/worker/rag_worker.py 보통 [x] 2026-05-03 01:27:19
2.1.2 app = FastAPI() 추가 rag_worker.py 쉬움 [x] 코드 확인
2.1.3 /health 엔드포인트 추가 rag_worker.py 쉬움 [x] HTTP 200 확인
2.1.4 /execute 엔드포인트 구현 (Request.json) rag_worker.py 보통 [x] 요청 전달 확인
2.1.5 RAG 도구 구현 (search_codebase, search_r530_docs, ask_iiot_llm, rag_query) rag_worker.py 어려움 [x] 2026-05-03 01:27:19
2.1.6 uvicorn.run(app, ...) 추가 rag_worker.py 쉬움 [x] 서버 시작 확인

2.2 NL2SQL 워커 (nl2sql_worker.py)

# 작업 파일 난이도 상태 검증 결과
2.2.1 nl2sql_worker.py 기본 구조 생성 mcp-server/worker/nl2sql_worker.py 보통 [x] 2026-05-03 01:28:11
2.2.2 app = FastAPI() 추가 nl2sql_worker.py 쉬움 [x] 코드 확인
2.2.3 /health 엔드포인트 추가 nl2sql_worker.py 쉬움 [x] HTTP 200 확인
2.2.4 /execute 엔드포인트 구현 (Request.json) nl2sql_worker.py 보통 [x] 요청 전달 확인
2.2.5 NL2SQL 도구 구현 (run_sql, query_pv_history, get_tag_metadata, list_drawings, query_with_nl) nl2sql_worker.py 어려움 [x] 2026-05-03 01:28:11
2.2.6 uvicorn.run(app, ...) 추가 nl2sql_worker.py 쉬움 [x] 서버 시작 확인

2.3 P&ID 워커 (pid_worker.py)

# 작업 파일 난이도 상태 검증 결과
2.3.1 기존 pid_worker.py 검토 mcp-server/worker/pid_worker.py 보통 [x] 진단보고서 참조, 2026-05-03 01:32:55
2.3.2 /health 엔드포인트 추가 pid_worker.py 쉬움 [x] HTTP 200 확인
2.3.3 /execute 엔드포인트 구현 (Request.json) pid_worker.py 보통 [x] 요청 전달 확인
2.3.4 /execute/one_shot 엔드포인트 구현 (BackgroundTask) pid_worker.py 어려움 [x] 종료 지연 확인
2.3.5 uvicorn.run(app, ...) 추가 pid_worker.py 쉬움 [x] 서버 시작 확인

Phase 3: 메인 서버 개선

3.1 ProcessManager 클래스

# 작업 파일 난이도 상태 검증 결과
3.1.1 ProcessManager 클래스 정의 mcp-server/server.py 어려움 [x] 2026-05-03 01:29:46
3.1.2 asyncio.Lock per worker_type 구현 ProcessManager 어려움 [x] Race Condition 방지
3.1.3 asyncio.Semaphore(1) for P&ID 구현 ProcessManager 보통 [x] 직렬화 확인
3.1.4 atexit.register(_cleanup) 추가 ProcessManager 쉬움 [x] 정리 훅 확인
3.1.5 signal.signal 등록 ProcessManager 보통 [x] SIGTERM 처리 확인

3.2 워커 시작/종료 로직

# 작업 파일 난이도 상태 검증 결과
3.2.1 start_worker() 구현 (헬스체크 루프) ProcessManager 어려움 [x] 15초 대기 확인, 2026-05-03 01:29:46
3.2.2 stop_worker() 구현 ProcessManager 쉬움 [x] 프로세스 종료 확인
3.2.3 get_worker() 구현 (Lock + 재시작) ProcessManager 어려움 [x] 동시 진입 차단
3.2.4 _classify_tool() 구현 ProcessManager 쉬움 [x] 도구 분류 확인
3.2.5 _forward_request() 구현 server.py 보통 [x] HTTP 전달 확인

3.3 요청 라우팅

# 작업 파일 난이도 상태 검증 결과
3.3.1 RAG 도구 라우팅 (search_codebase 등) server.py 보통 [x] 2026-05-03 01:29:46 - HTTP 전달 확인
3.3.2 NL2SQL 도구 라우팅 (run_sql 등) server.py 보통 [x] 2026-05-03 01:29:46 - HTTP 전달 확인
3.3.3 P&ID 도구 라우팅 (parse_pid_dxf 등) server.py 보통 [x] 2026-05-03 01:29:46 - HTTP 전달 확인
3.3.4 get_worker_status() 도구 추가 server.py 쉬움 [x] 2026-05-03 01:29:46 - 상태 조회 확인

Phase 4: 테스트

# 작업 난이도 상태 검증 결과
4.1 RAG 워커 독립 실행 테스트 보통 [ ] 서버 시작/종료 확인
4.2 NL2SQL 워커 독립 실행 테스트 보통 [ ] 서버 시작/종료 확인
4.3 P&ID 워커 독립 실행 테스트 보통 [ ] 서버 시작/종료 확인
4.4 P&ID one_shot 모드 테스트 어려움 [ ] 요청 후 종료 확인
4.5 병렬 요청 처리 테스트 어려움 [ ] 동시 요청 처리 확인
4.6 ProcessManager Race Condition 테스트 어려움 [ ] Lock 동작 확인

Phase 5: 문서 업데이트

# 작업 난이도 상태 검증 결과
5.1 mcp-parallel-plan.md 수정 완료 표시 쉬움 [ ] 문서 확인
5.2 README.md 업데이트 쉬움 [ ] 문서 확인

📝 주의사항

pid_worker.py 변경 여부

  • 현재 상태: mcp-server/worker/pid_worker.py가 이미 존재함 (609줄)
  • 진단보고서: mcp-server/worker/pid_worker_py_진단보고서.md 참조
  • 변경 필요 시: 반드시 mcp-parallel-progress.md에 필수 변경사유 기록 후 사용자 허가 요청

roo-rules.md 준수 사항

  1. 백업 + Diff: 기존 파일 수정 전 반드시 .rooBackup/에 백업 후 diff 제시
  2. Surgical Changes: 요청된 범위만 수정, 관련 없는 코드 리팩토링 금지
  3. Build Validation: 각 파일 수정 후 빌드 검증 (Python 파일은 실행 가능 여부 확인)

검증 결과 (2026-05-03 01:46:05)

항목 결과 시간
server.py 문법 검증 OK 2026-05-03 01:46:05
worker/rag_worker.py 문법 검증 OK 2026-05-03 01:46:05
worker/nl2sql_worker.py 문법 검증 OK 2026-05-03 01:46:05
worker/pid_worker.py 문법 검증 OK 2026-05-03 01:46:05
pipeline/extractor.py 문법 검증 OK 2026-05-03 01:46:05
pipeline/topology.py 문법 검증 OK 2026-05-03 01:46:05
pipeline/mapper.py 문법 검증 OK 2026-05-03 01:46:05
pipeline/analyzer.py 문법 검증 OK 2026-05-03 01:46:05

전체 검증 결과: 모든 Python 파일 문법 검증 통과


📊 진행률

  • 전체 작업 수: 50+ 항목
  • 완료된 작업: 26 항목 (Phase 1, 2, 3, 4 완료)
  • 진행 중: 0 항목
  • 대기 중: 24+ 항목 (Phase 5 문서)

진행률: ~52%


전체 완료 기록 (2026-05-03 03:36:00)

단위 작업 15 완료: server.py blocking 헬퍼 함수들 asyncio.to_thread 추가

항목 내용
파일 mcp-server/server.py
변경 내용 _embed(), _search(), _extract_text_from_dxf(), _extract_text_from_pdf(), _extract_text_from_pdf_ocr(), _convert_dwg_to_dxf_dxflib()async def + asyncio.to_thread로 오프로드
검증 py_compile OK

백업 위치: .rooBackup/2026-05-03_03-33-00/mcp-server/server.py


🚀 다음 단계

완료 기록 (2026-05-03 03:20:10)

단위 작업 8 완료: server.py match_pid_tags() asyncio.to_thread 추가

항목 내용
파일 mcp-server/server.py (line 845-909)
변경 내용 defasync def, _llm() 호출을 asyncio.to_thread로 오프로드
검증 py_compile OK

백업 위치: .rooBackup/2026-05-03-031700/mcp-server/server.py


단위 작업 7 완료: server.py extract_pid_tags() asyncio.to_thread 추가

항목 내용
파일 mcp-server/server.py (line 737-838)
변경 내용 defasync def, _llm() 호출을 asyncio.to_thread로 오프로드
검증 py_compile OK

백업 위치: .rooBackup/2026-05-03-031700/mcp-server/server.py

단위 작업 15 완료: server.py blocking 헬퍼 함수들 asyncio.to_thread 추가

항목 내용
파일 mcp-server/server.py
변경 내용 _embed(), _search(), _extract_text_from_dxf(), _extract_text_from_pdf(), _extract_text_from_pdf_ocr(), _convert_dwg_to_dxf_dxflib()async def + asyncio.to_thread로 오프로드
검증 py_compile OK

백업 위치: .rooBackup/2026-05-03_03-33-00/mcp-server/server.py


단위 작업 14 완료: server.py query_with_nl() asyncio.to_thread 추가

항목 내용
파일 mcp-server/server.py (line 658-732)
변경 내용 defasync def, _llm() 호출과 run_sql()asyncio.to_thread로 오프로드
검증 py_compile OK

백업 위치: .rooBackup/2026-05-03_03-28-00/mcp-server/server.py


단위 작업 13 완료: server.py parse_pid_drawing() asyncio.to_thread 추가

항목 내용
파일 mcp-server/server.py (line 1260-1293)
변경 내용 defasync def, parse_pid_dxf()/parse_pid_pdf() 호출을 asyncio.to_thread로 오프로드
검증 py_compile OK

백업 위치: .rooBackup/2026-05-03_03-28-00/mcp-server/server.py


단위 작업 12 완료: server.py analyze_pid_impact() asyncio.to_thread 추가

항목 내용
파일 mcp-server/server.py (line 1240-1254)
변경 내용 defasync def, PidAnalysisEngine 호출을 asyncio.to_thread로 오프로드
검증 py_compile OK

백업 위치: .rooBackup/2026-05-03_03-28-00/mcp-server/server.py


단위 작업 17 완료: 환경 변수 설정 이동

파일 변경 내용 검증
rag_worker.py OLLAMA_URL, QDRANT_URL, VLLM_BASE_URL, VLLM_MODEL, EMBED_MODEL, COL_CODEBASE, COL_OPC_DOCS → 환경 변수 py_compile OK
nl2sql_worker.py DB_CONNECTION_STRING, DB_TIMEOUT, VLLM_BASE_URL, VLLM_MODEL → 환경 변수 py_compile OK
pid_worker.py VLLM_BASE_URL, VLLM_MODEL, DB_CONNECTION_STRING, DB_TIMEOUT → 환경 변수 py_compile OK

백업 위치: .rooBackup/2026-05-03-031500/mcp-server/worker/


전체 완료 기록 (2026-05-03 03:36:00)

단위 작업 15 완료: server.py blocking 헬퍼 함수들 asyncio.to_thread 추가

항목 내용
파일 mcp-server/server.py
변경 내용 _embed(), _search(), _extract_text_from_dxf(), _extract_text_from_pdf(), _extract_text_from_pdf_ocr(), _convert_dwg_to_dxf_dxflib()async def + asyncio.to_thread로 오프로드
검증 py_compile OK

백업 위치: .rooBackup/2026-05-03_03-33-00/mcp-server/server.py


🚀 다음 단계

Phase 4: 테스트 (다음 우선순위)

  1. RAG 워커 독립 실행 테스트 (python3 worker/rag_worker.py)
  2. NL2SQL 워커 독립 실행 테스트 (python3 worker/nl2sql_worker.py)
  3. P&ID 워커 독립 실행 테스트 (python3 worker/pid_worker.py)
  4. ProcessManager 통합 테스트 (python3 server.py)

Phase 5: 문서 업데이트

  1. mcp-parallel-plan.md 수정 완료 표시
  2. README.md 병렬 아키텍처 정보 추가