医療現場におけるAI活用は、診断精度の向上と医師の作業負荷軽減の両面で重要な役割を果たしています。本稿では、私が複数の本番環境で実装してきた画像分析と病歴要約を統合した医療AI輔助診断システムの設計指針、パフォーマンス最適化、そしてコスト管理について詳細に解説します。

システムアーキテクチャ概要

本システムは3層構造を採用し、医療データの特性に基づいた処理フローを実現しています。

コア実装:画像分析システム

医用画像解析では、まずDICOM形式の画像をモデル入力互換形式に変換する必要があります。私はHolySheep AIAPIを使用して、Visionモデルの画像分析能力を活用した診断支援を実装しています。

import base64
import json
import httpx
from PIL import Image
from io import BytesIO
import numpy as np

class MedicalImageAnalyzer:
    """医用画像分析クライアント - HolySheep AI API v1"""
    
    BASE_URL = "https://api.holysheep.ai/v1"
    
    def __init__(self, api_key: str, timeout: float = 30.0):
        self.api_key = api_key
        self.timeout = timeout
        self.client = httpx.Client(
            timeout=httpx.Timeout(timeout),
            limits=httpx.Limits(max_keepalive_connections=20, max_connections=100)
        )
    
    def _preprocess_dicom(self, dicom_bytes: bytes) -> str:
        """DICOM画像をJPEG Base64に変換"""
        # 実際のDICOM解析ではpydicomを使用
        # ここでは簡略化のためPIL直接読込を想定
        image = Image.open(BytesIO(dicom_bytes))
        image = image.convert("RGB")
        image = image.resize((1024, 1024))  # コスト最適化のため統一サイズ
        
        buffer = BytesIO()
        image.save(buffer, format="JPEG", quality=85)
        return base64.b64encode(buffer.getvalue()).decode("utf-8")
    
    def analyze_medical_image(
        self, 
        image_bytes: bytes,
        modality: str = "CT",  # CT, MRI, X-Ray, Ultrasound
        clinical_context: str = ""
    ) -> dict:
        """
        医用画像を分析し、異常候補を検出
        
        Args:
            image_bytes: 画像バイナリ
            modality: 画像モダリティ
            clinical_context: 臨床コンテキスト(患者症状など)
        
        Returns:
            分析結果辞書(異常候補、信頼度、根拠)
        """
        # HolySheep AI Vision API呼び出し
        # レート: ¥1=$1(公式比85%節約)、<50msレイテンシ
        image_b64 = self._preprocess_dicom(image_bytes)
        
        payload = {
            "model": "gpt-4o",
            "messages": [
                {
                    "role": "system",
                    "content": f"""あなたは医用画像分析的専門家です。
                    モダリティ: {modality}
                    以下の点に注意して画像を分析してください:
                    1. 異常所見の有無と位置
                    2. 異常の種類(結節、浸潤、骨折など)
                    3. 緊急度の評価
                    4. 追加検査の推奨
                    必ず日本語で詳細な分析結果を返してください。"""
                },
                {
                    "role": "user",
                    "content": [
                        {
                            "type": "image_url",
                            "image_url": {
                                "url": f"data:image/jpeg;base64,{image_b64}"
                            }
                        },
                        {
                            "type": "text",
                            "text": f"臨床コンテキスト: {clinical_context}\n画像を分析してください。"
                        }
                    ]
                }
            ],
            "max_tokens": 2048,
            "temperature": 0.1
        }
        
        response = self.client.post(
            f"{self.BASE_URL}/chat/completions",
            headers={
                "Authorization": f"Bearer {self.api_key}",
                "Content-Type": "application/json"
            },
            json=payload
        )
        
        if response.status_code != 200:
            raise MedicalAIError(
                f"API Error: {response.status_code} - {response.text}"
            )
        
        result = response.json()
        return {
            "analysis": result["choices"][0]["message"]["content"],
            "model": result["model"],
            "usage": result.get("usage", {}),
            "latency_ms": response.elapsed.total_seconds() * 1000
        }

カスタム例外クラス

class MedicalAIError(Exception): """医療AI処理エラー""" pass

使用例

analyzer = MedicalImageAnalyzer(api_key="YOUR_HOLYSHEEP_API_KEY") with open("chest_xray.dcm", "rb") as f: result = analyzer.analyze_medical_image( image_bytes=f.read(), modality="X-Ray", clinical_context="60歳男性、咳嗽と微熱あり" ) print(f"分析完了: {result['latency_ms']:.1f}ms") print(f"使用トークン: {result['usage']}")

病歴要約生成システム

構造化・非構造化混在の病歴データから、診断有用的情報を抽出し統合要約を生成します。DeepSeek V3.2($0.42/MTok)のコスト効率を活かした実装を示します。

import asyncio
import httpx
from dataclasses import dataclass
from typing import List, Optional
import json
import hashlib

@dataclass
class MedicalNote:
    """医療記録データクラス"""
    note_type: str  # 初診、経過記録、检查報告、処方履歴
    content: str
    timestamp: str
    author: str

@dataclass
class PatientSummary:
    """患者要約データクラス"""
    patient_id: str
    chief_complaint: str
    medical_history: List[str]
    current_medications: List[str]
    diagnostic_impressions: List[str]
    pending_exams: List[str]
    recommendations: List[str]

class MedicalRecordSummarizer:
    """病歴要約生成クライアント - 非同期処理対応"""
    
    BASE_URL = "https://api.holysheep.ai/v1"
    
    def __init__(self, api_key: str, max_concurrent: int = 10):
        self.api_key = api_key
        self.semaphore = asyncio.Semaphore(max_concurrent)
        self._cache = {}  # 簡易LRUキャッシュ
    
    def _get_cache_key(self, notes: List[MedicalNote]) -> str:
        """キャッシュキー生成(高速化)"""
        content_hash = hashlib.md5(
            "".join(n.content for n in notes).encode()
        ).hexdigest()
        return content_hash[:16]
    
    async def _call_api_async(
        self, 
        payload: dict,
        cache_key: Optional[str] = None
    ) -> dict:
        """非同期API呼び