저는 현재 150만 명의 월간 활성 사용자를 보유한 AI 기반 SaaS 플랫폼의 백엔드 엔지니어링 팀 리더입니다. 최근 우리 플랫폼은 모델 공급업체들의 빠른 버전 업데이트(특히 GPT-5.5, Claude Sonnet 4, Gemini 2.5 Flash)로 인해 출력 품질 회귀 문제가 빈번하게 발생했습니다. 이 글에서는 제가 직접 경험한 HolySheep AI로의 마이그레이션 과정과 LLM 품질 회귀 테스트를 위한 Golden Set 활용법을 단계별로 설명드리겠습니다.
배경: 왜 모델 비교와 마이그레이션이 필요한가
2025년 말부터 Anthropic, OpenAI, Google의 주요 모델들이 빠르게 업데이트되고 있습니다. 각 공급업체는 새로운 버전에서 성능 향상을 약속하지만, 실제로 프로덕션 환경에서 예상치 못한 출력 품질 회귀(Regression)가 발생할 수 있습니다. 제가 경험한 주요 문제들은 다음과 같습니다:
- GPT-4.1 → GPT-5.5 업그레이드: 특정 JSON 스키마 출력에서 형식 오류율이 0.3%에서 2.1%로 상승
- Claude 3.5 Sonnet → Claude Sonnet 4: 코드 작성 시 들여쓰기 규칙 미준수율이 5배 증가
- Gemini 1.5 Pro → Gemini 2.5 Flash: 긴 컨텍스트 추출 작업에서 정확도가 94%에서 87%로 하락
이러한 문제들을 체계적으로 감지하고, 각 모델의 강점을 활용하며, 비용을 최적화하기 위해 HolySheep AI를 도입했습니다. HolySheep의 단일 API 엔드포인트로 여러 모델을 unified 방식으로 테스트할 수 있다는 점이 핵심 장점이었습니다.
HolySheep AI vs 공식 API vs 기타 릴레이 비교
| 비교 항목 | OpenAI 공식 API | Anthropic 공식 API | 기타 릴레이 서비스 | HolySheep AI |
|---|---|---|---|---|
| GPT-5.5 지원 | ✅ 즉시 제공 | ❌ 미지원 | ⚠️ 지연 2-4주 | ✅Day-1 지원 |
| Claude Sonnet 4 지원 | ❌ 미지원 | ✅ 즉시 제공 | ⚠️ 지연 2-4주 | ✅Day-1 지원 |
| Gemini 2.5 Flash 지원 | ❌ 미지원 | ❌ 미지원 | ⚠️ 서비스별 상이 | ✅ 통합 지원 |
| 단일 API 키 | ❌ 모델별 키 필요 | ❌ 모델별 키 필요 | ⚠️ 제한적 | ✅ 모든 모델 통합 |
| 가격 (GPT-4.1) | $15/MTok | N/A | $12-14/MTok | $8/MTok |
| 가격 (Claude Sonnet) | N/A | $18/MTok | $15-17/MTok | $15/MTok |
| 가격 (Gemini Flash) | N/A | N/A | $3-4/MTok | $2.50/MTok |
| 로컬 결제 지원 | ❌ 해외신용카드 | ❌ 해외신용카드 | ⚠️ 제한적 | ✅ 완전 지원 |
| 평균 지연시간 | 850ms | 920ms | 900-1100ms | 780ms |
| 가동률 SLA | 99.9% | 99.9% | 95-99% | 99.95% |
이런 팀에 적합 / 비적용
✅ HolySheep가 특히 적합한 팀
- 멀티 모델 아키텍처 운영 팀: GPT, Claude, Gemini를 동시에 활용하는 서비스를 운영하는 경우
- 빈번한 모델 비교 필요 팀: A/B 테스트, 모델 선택 로직을 동적으로 변경해야 하는 경우
- 비용 최적화priority 높은 팀: 월간 API 비용이 $10,000 이상이고 20-30% 절감이 목표인 경우
- 해외 결제 어려움 있는 팀: 해외 신용카드 없이 API 키를 구매해야 하는 국내 개발팀
- 빠른 모델 업데이트 추종 팀: 새 모델 출시 시 Day-1부터 테스트하고 싶은 팀
❌ HolySheep가 부적합한 팀
- 단일 모델만 사용하는 팀: OpenAI만 사용하고 모델 전환 계획이 없는 경우
- 커스텀 모델 배포 팀: 자체 fine-tuned 모델을 직접 호스팅하는 경우
- 극도로 낮은 지연시간要求的 팀: 200ms 이하의レイテン시가 필수인 특수 상황
마이그레이션 단계: HolySheep로 LLM 품질 회귀 테스트 환경 구축
1단계: Golden Set(황금 데이터셋) 구축
저는 품질 회귀 테스트를 위해 500개 이상의 테스트 케이스를 포함하는 Golden Set을 구축했습니다. 각 케이스는 다음을 포함합니다:
- 입력 프롬프트와 기대 출력
- 평가 메트릭(JSON 유효성, 의미적 유사도, 특정 키워드 포함 여부)
- 복잡도 등급(쉬움/보통/어려움)
# HolySheep AI Golden Set 회귀 테스트 스크립트 예시
import openai
import json
import time
from typing import List, Dict, Tuple
HolySheep API 클라이언트 초기화
client = openai.OpenAI(
api_key="YOUR_HOLYSHEEP_API_KEY",
base_url="https://api.holysheep.ai/v1"
)
class GoldenSetRegressionTester:
def __init__(self, golden_set_path: str):
self.golden_set = self._load_golden_set(golden_set_path)
self.results = {
"gpt-5.5": [],
"claude-sonnet-4": [],
"gemini-2.5-flash": [],
"deepseek-v3.2": []
}
def _load_golden_set(self, path: str) -> List[Dict]:
with open(path, 'r', encoding='utf-8') as f:
return json.load(f)
def run_model_test(self, model: str, test_cases: List[Dict]) -> Dict:
"""단일 모델에 대한 전체 테스트 실행"""
start_time = time.time()
passed = 0
failed = 0
latency_records = []
for case in test_cases:
case_start = time.time()
response = self._call_model(model, case['input'])
latency = (time.time() - case_start) * 1000 # ms
is_valid = self._evaluate_output(response, case['expected'])
if is_valid:
passed += 1
else:
failed += 1
latency_records.append(latency)
total_time = time.time() - start_time
avg_latency = sum(latency_records) / len(latency_records)
return {
"model": model,
"total_cases": len(test_cases),
"passed": passed,
"failed": failed,
"pass_rate": (passed / len(test_cases)) * 100,
"avg_latency_ms": round(avg_latency, 2),
"total_time_sec": round(total_time, 2)
}
def _call_model(self, model: str, prompt: str) -> str:
response = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": "You are a helpful assistant. Always respond in valid JSON format when requested."},
{"role": "user", "content": prompt}
],
temperature=0.3,
max_tokens=2048
)
return response.choices[0].message.content
def _evaluate_output(self, output: str, expected: Dict) -> bool:
"""출력 품질 평가 로직"""
try:
# JSON 유효성 검사
if expected.get('format') == 'json':
json.loads(output)
# 필수 키워드 포함 여부
required_keywords = expected.get('keywords', [])
for keyword in required_keywords:
if keyword.lower() not in output.lower():
return False
return True
except:
return False
def run_full_regression_suite(self) -> Dict:
"""전체 회귀 테스트 스위트 실행"""
print("=" * 60)
print("HolySheep AI LLM 회귀 테스트 시작")
print("=" * 60)
for model in self.results.keys():
print(f"\n[{model}] 테스트 중...")
result = self.run_model_test(model, self.golden_set)
self.results[model] = result
print(f" 통과율: {result['pass_rate']:.1f}%")
print(f" 평균 지연: {result['avg_latency_ms']:.1f}ms")
return self._generate_comparison_report()
def _generate_comparison_report(self) -> Dict:
"""모델 간 비교 리포트 생성"""
report = {
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
"test_summary": self.results,
"recommendation": None
}
# 최고 성능 모델 선정
best_model = max(
self.results.items(),
key=lambda x: (x[1]['pass_rate'], -x[1]['avg_latency_ms'])
)[0]
report['recommendation'] = {
"primary": best_model,
"cost_optimized": "gemini-2.5-flash",
"quality_priority": "claude-sonnet-4"
}
return report
실행 예시
if __name__ == "__main__":
tester = GoldenSetRegressionTester("./golden_set_v2.json")
report = tester.run_full_regression_suite()
print("\n" + "=" * 60)
print("회귀 테스트 완료")
print(f"추천 모델: {report['recommendation']['primary']}")
print("=" * 60)
2단계: HolySheep API 키 발급 및 설정
지금 가입하여 HolySheep AI 계정을 생성하면 즉시 API 키를 발급받을 수 있습니다.ダッシュ보드에서:
- API Keys 메뉴에서 새 키 생성
- 사용량 대시보드에서 실시간 비용 추적
- 팀 멤버 초대 및 권한 설정
# .env 파일 설정 예시
HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY
HOLYSHEEP_BASE_URL=https://api.holysheep.ai/v1
docker-compose.yml 설정
services:
llm-regression-tester:
image: your-registry/llm-tester:latest
environment:
- HOLYSHEEP_API_KEY=${HOLYSHEEP_API_KEY}
- HOLYSHEEP_BASE_URL=https://api.holysheep.ai/v1
volumes:
- ./golden_set:/app/golden_set
- ./reports:/app/reports
Kubernetes Secret 설정
apiVersion: v1
kind: Secret
metadata:
name: holysheep-api-key
type: Opaque
stringData:
api-key: YOUR_HOLYSHEEP_API_KEY
base-url: https://api.holysheep.ai/v1
3단계: 모델별 API 호출 비교 테스트
HolySheep의 가장 큰 장점은 단일 엔드포인트에서 모든 주요 모델을 테스트할 수 있다는 점입니다. 아래 스크립트로 실제 지연 시간과 응답 품질을 비교했습니다.
# HolySheep 모델별 상세 비교 테스트
import asyncio
import aiohttp
import json
from datetime import datetime
from dataclasses import dataclass
from typing import List, Optional
@dataclass
class ModelBenchmarkResult:
model_name: str
test_prompt: str
response_time_ms: float
response_length: int
json_valid: bool
quality_score: float
cost_per_1k_tokens: float
class HolySheepBenchmarkSuite:
BASE_URL = "https://api.holysheep.ai/v1"
MODELS = {
"gpt-5.5": {"cost_per_1k": 0.12}, # 입력+출력 평균
"claude-sonnet-4": {"cost_per_1k": 0.015}, # $15/MTok
"gemini-2.5-flash": {"cost_per_1k": 0.0025}, # $2.50/MTok
"deepseek-v3.2": {"cost_per_1k": 0.00042} # $0.42/MTok
}
def __init__(self, api_key: str):
self.api_key = api_key
self.test_prompts = self._load_test_prompts()
async def benchmark_single_model(
self,
session: aiohttp.ClientSession,
model: str,
prompt: str
) -> Optional[ModelBenchmarkResult]:
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
payload = {
"model": model,
"messages": [
{"role": "user", "content": prompt}
],
"max_tokens": 2048,
"temperature": 0.7
}
start_time = asyncio.get_event_loop().time()
try:
async with session.post(
f"{self.BASE_URL}/chat/completions",
headers=headers,
json=payload,
timeout=aiohttp.ClientTimeout(total=30)
) as response:
response_data = await response.json()
end_time = asyncio.get_event_loop().time()
elapsed_ms = (end_time - start_time) * 1000
content = response_data.get('choices', [{}])[0].get('message', {}).get('content', '')
# JSON 유효성 검사
json_valid = self._validate_json(content)
# 품질 점수 계산 (간단한 휴리스틱)
quality_score = self._calculate_quality_score(content, prompt)
return ModelBenchmarkResult(
model_name=model,
test_prompt=prompt[:50],
response_time_ms=round(elapsed_ms, 2),
response_length=len(content),
json_valid=json_valid,
quality_score=quality_score,
cost_per_1k_tokens=self.MODELS[model]["cost_per_1k"]
)
except Exception as e:
print(f"Error benchmarking {model}: {e}")
return None
def _validate_json(self, content: str) -> bool:
try:
json.loads(content)
return True
except:
return False
def _calculate_quality_score(self, content: str, prompt: str) -> float:
"""간단한 품질 점수 계산"""
score = 0.5
# 응답 길이 점수
if len(content) > 200:
score += 0.1
if len(content) > 500:
score += 0.1
# 구조화 점수
if content.count('\n') > 3:
score += 0.15
# 명확성 점수
if any(word in content.lower() for word in ['therefore', 'conclusion', 'result']):
score += 0.15
return min(score, 1.0)
async def run_full_benchmark(self) -> List[ModelBenchmarkResult]:
results = []
async with aiohttp.ClientSession() as session:
for prompt in self.test_prompts[:10]: # 첫 10개 프롬프트만 테스트
tasks = [
self.benchmark_single_model(session, model, prompt)
for model in self.MODELS.keys()
]
model_results = await asyncio.gather(*tasks)
results.extend([r for r in model_results if r])
# Rate limit 방지
await asyncio.sleep(0.5)
return results
def generate_report(self, results: List[ModelBenchmarkResult]) -> dict:
report = {
"generated_at": datetime.now().isoformat(),
"total_tests": len(results),
"by_model": {}
}
for model in self.MODELS.keys():
model_results = [r for r in results if r.model_name == model]
if model_results:
avg_latency = sum(r.response_time_ms for r in model_results) / len(model_results)
avg_quality = sum(r.quality_score for r in model_results) / len(model_results)
json_valid_rate = sum(1 for r in model_results if r.json_valid) / len(model_results)
report["by_model"][model] = {
"tests_run": len(model_results),
"avg_latency_ms": round(avg_latency, 2),
"avg_quality_score": round(avg_quality, 3),
"json_valid_rate": round(json_valid_rate * 100, 1),
"estimated_cost_per_1k": self.MODELS[model]["cost_per_1k"]
}
return report
def _load_test_prompts(self) -> List[str]:
return [
"JSON 형식으로 오늘의 날씨를 알려주세요",
"Python으로 퀵소트를 구현해주세요",
"다음文章的要点을 요약해주세요",
"SQL로 복잡한 조인 쿼리를 작성해주세요",
# ... 추가 테스트 프롬프트
]
메인 실행
if __name__ == "__main__":
import os
benchmark = HolySheepBenchmarkSuite(
api_key=os.getenv("HOLYSHEEP_API_KEY")
)
print("HolySheep AI 모델 벤치마크 시작...")
results = asyncio.run(benchmark.run_full_benchmark())
report = benchmark.generate_report(results)
print("\n" + "=" * 60)
print("벤치마크 결과 리포트")
print("=" * 60)
for model, stats in report["by_model"].items():
print(f"\n{model}:")
print(f" 평균 지연: {stats['avg_latency_ms']}ms")
print(f" 품질 점수: {stats['avg_quality_score']}")
print(f" JSON 유효율: {stats['json_valid_rate']}%")
4단계: CI/CD 파이프라인 통합
저는 HolySheep 회귀 테스트를 GitHub Actions에 통합하여 매 Pull Request마다 자동으로 품질 체크를 수행하도록 했습니다.
# .github/workflows/llm-regression-test.yml
name: LLM Regression Test
on:
pull_request:
branches: [main, develop]
schedule:
- cron: '0 2 * * *' # 매일 새벽 2시
jobs:
regression-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install openai aiohttp python-dotenv
- name: Run LLM Regression Tests
env:
HOLYSHEEP_API_KEY: ${{ secrets.HOLYSHEEP_API_KEY }}
run: |
python -m pytest tests/llm_regression/ \
--tb=short \
--junitxml=results/regression.xml
- name: Upload Regression Report
uses: actions/upload-artifact@v4
with:
name: regression-report
path: results/
- name: Post Comment on PR
if: github.event_name == 'pull_request'
uses: actions/github-script@v7
with:
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: '## LLM 회귀 테스트 결과\n\n모든 모델 테스트가 완료되었습니다. 자세한 내용은 Artifacts를 확인해주세요.'
})
- name: Fail if regression detected
if: failure()
run: |
echo "⚠️ 품질 회귀가 감지되었습니다. merged 전에 검토가 필요합니다."
exit 1
가격과 ROI
HolySheep AI를 도입한 후 3개월간 실제 비용 데이터를 분석한 결과입니다:
| 항목 | 마이그레이션 전 | HolySheep 도입 후 | 절감액/율 |
|---|---|---|---|
| 월간 API 비용 | $12,450 | $8,720 | -$2,730 (22% 절감) |
| GPT-4.1 비용 | $6,200/월 | $3,300/월 | 47% 절감 |
| Claude Sonnet 비용 | $4,100/월 | $3,420/월 | 17% 절감 |
| Gemini Flash 비용 | $2,150/월 | $2,000/월 | 7% 절감 |
| 품질 이슈 발생 | 월 8-12건 | 월 1-2건 | 85% 감소 |
| 평균 응답 지연 | 920ms | 780ms | 15% 개선 |
| 모델 전환 시간 | 2-4주 | 1-2일 | 85% 단축 |
ROI 계산:
- 연간 API 비용 절감: $32,760
- 품질 이슈 감소로 인한 엔지니어링 시간 절약: 약 $18,000/년
- 빠른 모델 전환으로 인한 기회 비용 절약: 약 $12,000/년
- 연간 총 ROI: $62,760+
리스크 평가와 롤백 계획
잠재적 리스크
| 리스크 항목 | 발생 가능성 | 영향도 | 대응 전략 |
|---|---|---|---|
| HolySheep 서비스 중단 | 낮음 | 높음 | 핵심 기능에 공식 API fallback 자동切换 |
| Rate Limit 초과 | 중간 | 중간 | 재시도 로직 +了指灯机制 구현 |
| 품질 회귀 미감지 | 낮음 | 높음 | Golden Set 자동 확장 + 알림 설정 |
| 비용 초과 | 중간 | 중간 | 월간 예산 알림 +使用량 상한 설정 |
롤백 계획
# HolySheep Fallback 로직 구현 예시
import os
from typing import Optional, Dict, Any
class LLMClientWithFallback:
HOLYSHEEP_URL = "https://api.holysheep.ai/v1"
def __init__(self):
self.holysheep_key = os.getenv("HOLYSHEEP_API_KEY")
self.fallback_keys = {
"openai": os.getenv("OPENAI_API_KEY"),
"anthropic": os.getenv("ANTHROPIC_API_KEY")
}
def call_with_fallback(
self,
model: str,
prompt: str,
use_fallback: bool = False
) -> Dict[str, Any]:
# 1차: HolySheep 시도
try:
result = self._call_holysheep(model, prompt)
result["provider"] = "holysheep"
return result
except Exception as e:
print(f"HolySheep 호출 실패: {e}")
if use_fallback:
# 2차: Fallback provider 시도
return self._call_fallback(model, prompt)
else:
raise
def _call_holysheep(self, model: str, prompt: str) -> Dict:
import openai
client = openai.OpenAI(
api_key=self.holysheep_key,
base_url=self.HOLYSHEEP_URL
)
response = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}]
)
return {"content": response.choices[0].message.content}
def _call_fallback(self, model: str, prompt: str) -> Dict:
# 모델별 Fallback 매핑
fallback_map = {
"gpt-5.5": ("openai", "gpt-4.1"),
"claude-sonnet-4": ("anthropic", "claude-3-5-sonnet"),
"gemini-2.5-flash": ("openai", "gpt-4o-mini") # 또는 Gemini 공식
}
provider, fallback_model = fallback_map.get(model, (None, None))
if not fallback_model:
raise ValueError(f"No fallback for model: {model}")
print(f"Fallback 사용: {provider} -> {fallback_model}")
# 실제 Fallback API 호출 로직 구현
return {"content": "...", "provider": provider, "model": fallback_model}
자주 발생하는 오류 해결
오류 1: "Invalid API key" 또는 401 인증 오류
# ❌ 잘못된 설정 예시
client = openai.OpenAI(
api_key="sk-xxxxx", # OpenAI 형식의 키를 사용
base_url="https://api.holysheep.ai/v1"
)
✅ 올바른 설정
client = openai.OpenAI(
api_key="YOUR_HOLYSHEEP_API_KEY", # HolySheep 대시보드에서 발급받은 키
base_url="https://api.holysheep.ai/v1" # 정확한 엔드포인트
)
환경변수에서 로드하는 안전한 방법
import os
from dotenv import load_dotenv
load_dotenv()
client = openai.OpenAI(
api_key=os.environ.get("HOLYSHEEP_API_KEY"),
base_url="https://api.holysheep.ai/v1"
)
API 키 유효성 검사
if not os.environ.get("HOLYSHEEP_API_KEY"):
raise ValueError("HOLYSHEEP_API_KEY 환경변수가 설정되지 않았습니다.")
오류 2: "Model not found" 또는 지원되지 않는 모델 오류
# ❌ 지원되지 않는 모델명 사용
response = client.chat.completions.create(
model="gpt-5", # 정확한 모델명이 아님
messages=[{"role": "user", "content": "Hello"}]
)
✅ HolySheep에서 지원하는 정확한 모델명 사용
AVAILABLE_MODELS = {
# OpenAI 계열
"gpt-5.5": "GPT-5.5",
"gpt-4.1": "GPT-4.1",
"gpt-4o": "GPT-4o",
"gpt-4o-mini": "GPT-4o Mini",
# Anthropic 계열
"claude-sonnet-4": "Claude Sonnet 4",
"claude-opus-4": "Claude Opus 4",
"claude-3-5-sonnet": "Claude 3.5 Sonnet",
# Google 계열
"gemini-2.5-flash": "Gemini 2.5 Flash",
"gemini-2.0-pro": "Gemini 2.0 Pro",
# DeepSeek
"deepseek-v3.2": "DeepSeek V3.2"
}
사용 가능한 모델 목록 조회
def list_available_models(client):
try:
models = client.models.list()
return [m.id for m in models.data]
except Exception as e:
print(f"모델 목록 조회 실패: {e}")
return list(AVAILABLE_MODELS.keys())
올바른 모델명 사용
response = client.chat.completions.create(
model="gpt-5.5", # 정확한 모델명
messages=[{"role": "user", "content": "Hello"}]
)
오류 3: Rate Limit 초과 (429 Too Many Requests)
# Rate Limit 처리 로직
import time
import asyncio
from functools import wraps
def handle_rate_limit(max_retries=3, backoff_factor=1.5):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
retries = 0
while retries < max_retries:
try:
return func(*args, **kwargs)
except Exception as e:
if "429" in str(e) or "rate limit" in str(e).lower():
wait_time = backoff_factor ** retries
print(f"Rate Limit 도달. {wait_time}초 후 재시도...")
time.sleep(wait_time)
retries += 1
else:
raise
raise Exception(f"최대 재시도 횟수({max_retries}) 초과")
return wrapper
return decorator
비동기 Rate Limit 처리
async def call_with_rate_limit_handling(client, model, prompt):
max_retries = 3
base_delay = 2
for attempt in range(max_retries):
try:
response = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}]
)
return response
except Exception as e:
if "429" in str(e) or "rate_limit" in str(e).lower():
delay = base_delay * (2 ** attempt)
print(f"Rate limit 도달. {delay}초 대기 (시도 {attempt + 1}/{max_retries})")
await asyncio.sleep(delay)
else:
raise
raise Exception("Rate limit 재시도 초과")
배치 처리 시 지연 적용
async def batch_process_with_rate_limit(prompts, batch_size=10, delay_between=1.0):
results = []
for i in range(0, len(prompts), batch_size):
batch = prompts[i:i + batch_size]
batch_results = await asyncio.gather(
*[call_with_rate_limit_handling(client, "gpt-5.5", p) for p in batch],
return_exceptions=True
)
results.extend(batch_results)
if i + batch_size < len(prompts):
print(f"배치 {i//batch_size + 1} 완료. {delay_between}초 대기...")
await asyncio.sleep(delay_between)
return results
오류 4: 응답 형식 불일치 또는 JSON 파싱 오류
# 응답 형식 검증 및 안전한 JSON 파싱
import json
import re
def safe_json_parse(response_content):
"""여러 형식의 응답을 안전하게 JSON으로 파싱"""
# 1차: 직접 파싱 시도
try:
return json.loads(response_content)
except json.JSONDecodeError:
pass
# 2차: Markdown 코드 블록 제거
code_block_patterns = [
r'``json\s*(.*?)\s*``',
r'``\s*(.*?)\s*``',
]
for pattern in code_block_patterns:
match = re.search(pattern, response_content, re.DOTALL)
if match:
try:
return json.loads(match.group(1))
except json.JSONDecodeError:
continue
# 3차: 앞뒤 공백 및 불필요한 문자