Python으로 프롬프트 엔지니어링 — 반복 작업 자동화

…

한줄 요약

프롬프트를 코드로 관리하면 복사-붙여넣기 없이 수십 명 환자를 한 번에 분석할 수 있다.


프롬프트를 코드로 관리하는 이유

ChatGPT에 매번 같은 형식으로 증상을 입력하고 있다면, 그 반복 작업은 코드로 대체할 수 있다. Python으로 프롬프트를 관리하면:

  • 동일한 형식이 보장된다
  • 여러 환자를 한 번에 처리할 수 있다
  • 결과를 자동으로 저장한다
  • 나중에 프롬프트를 수정하면 모든 케이스에 일괄 적용된다

프롬프트 템플릿 함수

def differential_diagnosis_prompt(age: int, sex: str,
                                   symptoms: str, vitals: str) -> str:
    return f"""당신은 가정의학과 전문의입니다.

환자: {age}세 {sex}
증상: {symptoms}
활력징후: {vitals}

감별진단 5가지를 가능성 순으로 제시해주세요.
각 진단에 대해 다음을 포함하세요:
1. 진단명
2. 이 진단을 지지하는 소견
3. 권장 추가 검사"""

단일 환자 분석

import anthropic
import os

client = anthropic.Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY"))

def analyze_patient(patient: dict) -> dict:
    prompt = differential_diagnosis_prompt(
        age=patient["age"],
        sex=patient["sex"],
        symptoms=patient["symptoms"],
        vitals=patient["vitals"]
    )
    message = client.messages.create(
        model="claude-sonnet-4-5",
        max_tokens=1024,
        messages=[{"role": "user", "content": prompt}]
    )
    return {
        **patient,
        "ai_analysis": message.content[0].text,
        "input_tokens": message.usage.input_tokens,
        "output_tokens": message.usage.output_tokens
    }

배치 처리 — 여러 환자 동시 분석

patients = [
    {
        "id": "PT001",
        "age": 37, "sex": "여성",
        "symptoms": "우하복부 통증 12시간, 오심, 식욕 저하",
        "vitals": "T 38.2, BP 118/74, HR 96"
    },
    {
        "id": "PT002",
        "age": 54, "sex": "남성",
        "symptoms": "흉통 30분, 좌측 어깨 방사통, 식은땀",
        "vitals": "T 36.8, BP 145/90, HR 88"
    },
    {
        "id": "PT003",
        "age": 28, "sex": "여성",
        "symptoms": "두통 3일, 목 뻣뻣함, 발열",
        "vitals": "T 39.1, BP 110/70, HR 102"
    }
]

results = []
for patient in patients:
    print(f"분석 중: {patient['id']}...")
    result = analyze_patient(patient)
    results.append(result)
    print(f"완료 — 토큰: {result['input_tokens']} / {result['output_tokens']}")

결과를 CSV로 저장

import pandas as pd

df = pd.DataFrame(results)[["id", "age", "sex", "symptoms", "ai_analysis"]]
df.to_csv("patient_analysis_results.csv",
          index=False, encoding="utf-8-sig")
print("결과 저장 완료: patient_analysis_results.csv")

결과를 JSON으로 저장

import json
from datetime import datetime

output = {
    "generated_at": datetime.now().isoformat(),
    "model": "claude-sonnet-4-5",
    "total_patients": len(results),
    "total_tokens": sum(r["input_tokens"] + r["output_tokens"] for r in results),
    "results": results
}

with open("analysis_results.json", "w", encoding="utf-8") as f:
    json.dump(output, f, ensure_ascii=False, indent=2)

비용 계산

# Sonnet 기준 (2025년 기준 참고)
INPUT_COST_PER_1K = 0.003   # $0.003 per 1K tokens
OUTPUT_COST_PER_1K = 0.015  # $0.015 per 1K tokens

total_input = sum(r["input_tokens"] for r in results)
total_output = sum(r["output_tokens"] for r in results)

cost_usd = (total_input / 1000 * INPUT_COST_PER_1K +
            total_output / 1000 * OUTPUT_COST_PER_1K)
cost_krw = cost_usd * 1350

print(f"총 입력 토큰: {total_input:,}")
print(f"총 출력 토큰: {total_output:,}")
print(f"예상 비용: ${cost_usd:.4f} (약 {cost_krw:.0f}원)")

프롬프트 버전 관리

PROMPTS = {
    "v1": "감별진단 5가지를 제시해주세요.",
    "v2": "감별진단 5가지를 가능성 순으로 제시하고 각 진단에 필요한 검사를 포함해주세요.",
    "v3_structured": """감별진단을 다음 JSON 형식으로 반환해주세요:
{"diagnoses": [{"rank": 1, "name": "...", "evidence": "...", "workup": "..."}]}"""
}

def analyze_with_version(patient: dict, version: str = "v2") -> str:
    base_prompt = differential_diagnosis_prompt(**patient)
    full_prompt = base_prompt + "\n\n" + PROMPTS[version]
    # ... API 호출

핵심 정리

  • 프롬프트를 함수로 만들면 일관성이 보장되고 수정이 쉬워진다
  • 배치 처리로 수십 명 환자를 한 번에 분석할 수 있다
  • 결과는 CSV(Excel 호환) 또는 JSON으로 저장해 재활용한다
  • 비용 계산을 사전에 추정하는 습관을 들여라
  • 프롬프트도 버전 관리를 하면 A/B 비교가 가능하다

관련 글