작성자: HolySheep AI 기술팀 | 2026년 4월 30일 | 읽기 시간: 12분
실제 고객 사례: 서울의 AI 스타트업이 선택한 마이그레이션 이야기
서울 성수동에 위치한 한 AI 스타트업(가칭: 넥스트젠 AI)은 고객 지원 자동화와 데이터 분석을 동시에 처리하는 다중 Agent 시스템을 구축 중이었습니다. 이들은 약 6개월간 CrewAI를 기반으로 한 시스템을 운영하며 겪은 페인포인트를 해결하기 위해 HolySheep AI로의 마이그레이션을 결정했습니다.
비즈니스 맥락
- 사업 영역: 이커머스 고객 지원 + 내부 데이터 분석 자동화
- 일일 API 호출: 약 45,000회
- 사용 모델: GPT-4o, Claude 3.5 Sonnet, Gemini 1.5 Pro 혼합 사용
- 팀 규모: 엔지니어 8명, AI 리서처 3명
기존 공급사의 페인포인트
기존 시스템에서는 여러 AI 공급사를 각각 별도로 연동해야 했고, 이로 인해 다음과 같은 문제가 발생했습니다:
- 지연 시간: 평균 420ms (모델 전환 시 최대 800ms까지 발생)
- 월 청구 비용: $4,200 (여러 공급사 통합 비용)
- 키 관리: 3개 공급사의 API 키를 각각 관리해야 하는 복잡성
- failover: 단일 공급사 장애 시 전체 시스템 영향
HolySheep 선택 이유
넥스트젠 AI팀이 HolySheep AI를 선택한 핵심 이유는 다음과 같습니다:
- 단일 API 키: 모든 모델을 하나의 HolySheep API 키로 통합 관리
- 비용 최적화: 모델별 최적화된 라우팅으로 비용 80% 절감
- 저지연:智能路由으로 평균 지연 시간 57% 개선
- 로컬 결제: 해외 신용카드 없이 원화 결제 지원
구체적인 마이그레이션 단계
Step 1: base_url 교체
기존 각 공급사별 base_url을 HolySheep의 통합 엔드포인트로 교체합니다:
# 기존 코드 (개별 공급사 연동)
import openai
from anthropic import Anthropic
OpenAI 직접 호출
openai.api_key = "sk-openai-xxxx"
openai.api_base = "https://api.openai.com/v1"
Anthropic 직접 호출
anthropic = Anthropic(api_key="sk-ant-api03-xxxx")
AutoGen 환경설정
os.environ["OPENAI_API_KEY"] = "sk-openai-xxxx"
===== 마이그레이션 후 (HolySheep 통합) =====
import openai
from anthropic import Anthropic
HolySheep 통합 설정 (모든 모델 통일)
openai.api_key = "YOUR_HOLYSHEEP_API_KEY"
openai.api_base = "https://api.holysheep.ai/v1"
anthropic = Anthropic(api_key="YOUR_HOLYSHEEP_API_KEY")
환경변수 설정
os.environ["OPENAI_API_KEY"] = "YOUR_HOLYSHEEP_API_KEY"
os.environ["ANTHROPIC_API_KEY"] = "YOUR_HOLYSHEEP_API_KEY"
Step 2: API 키 로테이션
# HolySheep AI 키 로테이션 및 검증 스크립트
import requests
import time
HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY"
HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1"
def verify_api_key(api_key):
"""API 키 유효성 검증 및 모델 목록 확인"""
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
# 모델 목록 확인
response = requests.get(
f"{HOLYSHEEP_BASE_URL}/models",
headers=headers
)
if response.status_code == 200:
models = response.json()
print(f"✅ API 키 유효 확인")
print(f"📋 사용 가능 모델: {len(models.get('data', []))}개")
return True
else:
print(f"❌ API 키 오류: {response.status_code}")
return False
def test_model_routing(model_name, prompt="안녕하세요"):
"""모델별 라우팅 테스트"""
headers = {
"Authorization": f"Bearer {HOLYSHEEP_API_KEY}",
"Content-Type": "application/json"
}
start_time = time.time()
response = requests.post(
f"{HOLYSHEEP_BASE_URL}/chat/completions",
headers=headers,
json={
"model": model_name,
"messages": [{"role": "user", "content": prompt}],
"max_tokens": 100
}
)
elapsed = (time.time() - start_time) * 1000 # ms 변환
if response.status_code == 200:
print(f"✅ {model_name}: {elapsed:.0f}ms")
return elapsed
else:
print(f"❌ {model_name}: 오류 {response.status_code}")
return None
실행
verify_api_key(HOLYSHEEP_API_KEY)
test_model_routing("gpt-4.1")
test_model_routing("claude-sonnet-4-5")
test_model_routing("gemini-2.5-flash")
test_model_routing("deepseek-v3.2")
Step 3: 카나리아 배포
# 카나리아 배포: 기존 시스템과 HolySheep를 병렬로 운영
import random
from typing import Dict, List
import logging
class CanaryRouter:
"""카나리아 배포 라우터 - 트래픽 비율 조절"""
def __init__(self, holysheep_key: str, legacy_ratio: float = 0.1):
self.holysheep_key = holysheep_key
self.legacy_ratio = legacy_ratio
self.metrics = {"holysheep": [], "legacy": []}
def route(self, task: Dict) -> str:
"""카나리아 비율에 따라 라우팅 결정"""
if random.random() < self.legacy_ratio:
return "legacy"
return "holysheep"
def execute(self, task: Dict, task_func):
"""카나리아 실행 및 메트릭 수집"""
route = self.route(task)
start = time.time()
try:
if route == "holysheep":
result = task_func(task, provider="holysheep")
self.metrics["holysheep"].append({
"latency": (time.time() - start) * 1000,
"success": True
})
else:
result = task_func(task, provider="legacy")
self.metrics["legacy"].append({
"latency": (time.time() - start) * 1000,
"success": True
})
return result
except Exception as e:
self.metrics[route].append({
"latency": (time.time() - start) * 1000,
"success": False,
"error": str(e)
})
raise
def get_report(self) -> Dict:
"""카나리아 배포 리포트 생성"""
report = {}
for provider in ["holysheep", "legacy"]:
metrics = self.metrics[provider]
if metrics:
report[provider] = {
"count": len(metrics),
"avg_latency": sum(m["latency"] for m in metrics) / len(metrics),
"success_rate": sum(1 for m in metrics if m["success"]) / len(metrics) * 100
}
return report
사용 예시
router = CanaryRouter(
holysheep_key="YOUR_HOLYSHEEP_API_KEY",
legacy_ratio=0.1 # 10%만 레거시에서 테스트
)
1시간 후 리포트 확인
print(router.get_report())
마이그레이션 후 30일 실측치
| 지표 | 마이그레이션 전 | 마이그레이션 후 | 개선율 |
|---|---|---|---|
| 평균 지연 시간 | 420ms | 180ms | ▼ 57% |
| 월 청구 비용 | $4,200 | $680 | ▼ 84% |
| API 키 관리 | 3개 공급사 별도 관리 | 1개 HolySheep 키 | 통합 |
| 가용성 | 99.5% | 99.9% | ▼ 장애율 80% |
| 최대 동시 처리 | 1,200 req/min | 3,500 req/min | ▲ 192% |
CrewAI vs AutoGen 2026:多 Agent 프레임워크 심층 비교
개요: 왜 다중 Agent 시스템인가?
2026년 현재, 다중 Agent 시스템은 복잡한 워크플로우를 자동화하는 핵심 기술로 자리 잡았습니다. CrewAI와 AutoGen은 각각 다른 철학을 가진 대표적인 프레임워크로, 프로젝트 요구사항에 따라 적합한 선택이 달라집니다.
CrewAI vs AutoGen 핵심 비교
| 비교 항목 | CrewAI | AutoGen | 우위 |
|---|---|---|---|
| 개발사 | CrewAI Inc. | Microsoft Research | 동점 |
| 주요 특징 | Role-based Agent, Pipeline 직관적 | 대화형 Agent, 유연한 협업 | 용도에 따라 다름 |
| 학습 곡선 | 완만 (초보자 친화) | 가파름 (고급 사용자) | CrewAI |
| 커스터마이징 | 제한적 (opinionated) | 무한 (highly flexible) | AutoGen |
| 프롬프트 엔지니어링 | 내장된 구조화 제공 | 직접 구현 필요 | CrewAI |
| 멀티모달 지원 | 기본 지원 | 우수 ( native) | AutoGen |
| 기업 지원 | 스타트업 | Microsoft | AutoGen |
| GitHub Star | ~45K | ~35K | CrewAI |
| 라이선스 | Apache 2.0 | MIT | 동점 |
모델 라우팅 관점에서의 비교
| 항목 | CrewAI | AutoGen |
|---|---|---|
| 추천 시나리오 | 순차적 워크플로우, 정형화된 태스크 | 반복적 대화, 동적 협업 |
| HolySheep 연동 난이도 | ⭐⭐ (쉬움) | ⭐⭐⭐ (중간) |
| 모델 전환 유연성 | 설정 파일 기반 | 코드 레벨 제어 |
| 비용 최적화 용이성 | 높음 (내장 라우팅) | 중간 (커스텀 구현) |
CrewAI와 HolySheep AI 연동 예시
# CrewAI + HolySheep AI 통합 설정
requirements: crewai>=0.80, openai>=1.0
import os
from crewai import Agent, Task, Crew
from langchain_openai import ChatOpenAI
HolySheep API 키 설정
os.environ["OPENAI_API_KEY"] = "YOUR_HOLYSHEEP_API_KEY"
HolySheep ChatOpenAI LLM 설정
llm = ChatOpenAI(
model="gpt-4.1",
openai_api_base="https://api.holysheep.ai/v1",
temperature=0.7
)
여러 모델 동시 사용 예시
llm_sonnet = ChatOpenAI(
model="claude-sonnet-4-5",
openai_api_base="https://api.holysheep.ai/v1",
temperature=0.7
)
llm_flash = ChatOpenAI(
model="gemini-2.5-flash",
openai_api_base="https://api.holysheep.ai/v1",
temperature=0.5
)
분석가 Agent (Claude Sonnet 사용 - 복잡한 분석)
analyst = Agent(
role="데이터 분석가",
goal="사용자 행동 데이터를 분석하여 인사이트 도출",
backstory="10년 경력의 데이터 사이언티스트",
llm=llm_sonnet, # Claude로 분석
verbose=True
)
작성자 Agent (GPT-4.1 사용 - 빠른 응답)
writer = Agent(
role="콘텐츠 작가",
goal="분석 결과를 명확한 보고서로 작성",
backstory="마케팅 전문가 겸 작가",
llm=llm, # GPT-4.1로 작성
verbose=True
)
리뷰어 Agent (Gemini Flash 사용 - 비용 효율적)
reviewer = Agent(
role="품질 리뷰어",
goal="보고서의 정확성과 가독성 검증",
backstory="편집 전문가",
llm=llm_flash, # Gemini로 리뷰
verbose=True
)
태스크 정의
analysis_task = Task(
description="최근 30일간의 사용자 행동 데이터 분석",
agent=analyst,
expected_output="인사이트 5개 이상 포함된 분석 요약"
)
writing_task = Task(
description="분석 결과를 경영진 보고서로 작성",
agent=writer,
expected_output=" executivo 서머리 형식의 보고서",
context=[analysis_task]
)
review_task = Task(
description="보고서의 오류와 개선점 검토",
agent=reviewer,
expected_output="개선 권고사항 3개 이상"
)
크루 실행
crew = Crew(
agents=[analyst, writer, reviewer],
tasks=[analysis_task, writing_task, review_task],
process="sequential" # 순차 실행
)
result = crew.kickoff()
print(f"최종 결과: {result}")
AutoGen과 HolySheep AI 연동 예시
# AutoGen + HolySheep AI 통합 설정
requirements: autogen>=0.4, pydantic>=2.0
import autogen
from autogen import ConversableAgent, UserProxyAgent
import os
HolySheep API 키 설정
os.environ["OPENAI_API_KEY"] = "YOUR_HOLYSHEEP_API_KEY"
os.environ["ANTHROPIC_API_KEY"] = "YOUR_HOLYSHEEP_API_KEY"
HolySheep 기반 LLM 설정
llm_config_gpt = {
"model": "gpt-4.1",
"api_key": os.environ["OPENAI_API_KEY"],
"base_url": "https://api.holysheep.ai/v1",
"temperature": 0.7,
"max_tokens": 2000
}
llm_config_claude = {
"model": "claude-sonnet-4-5",
"api_key": os.environ["OPENAI_API_KEY"],
"base_url": "https://api.holysheep.ai/v1",
"api_type": "anthropic",
"temperature": 0.7,
"max_tokens": 2000
}
코딩 Agent (GPT-4.1)
coder = ConversableAgent(
name="코딩어시스턴트",
system_message="Python 전문가로서 코드를 작성하고 개선합니다.",
llm_config=llm_config_gpt,
human_input_mode="NEVER"
)
리뷰 Agent (Claude Sonnet)
reviewer = ConversableAgent(
name="코드리뷰어",
system_message="소프트웨어 엔지니어로서 코드 품질과 보안을 검토합니다.",
llm_config=llm_config_claude,
human_input_mode="NEVER"
)
사용자 프록시
user_proxy = UserProxyAgent(
name="사용자",
human_input_mode="ALWAYS",
max_consecutive_auto_reply=10,
code_execution_config={
"work_dir": "coding",
"use_docker": False
}
)
그룹 채팅 설정 (다중 Agent 협업)
from autogen import GroupChat, GroupChatManager
group_chat = GroupChat(
agents=[user_proxy, coder, reviewer],
messages=[],
max_round=10
)
manager = GroupChatManager(
groupchat=group_chat,
llm_config=llm_config_gpt
)
협업 시작
user_proxy.initiate_chat(
manager,
message="Python으로 REST API 서버를 만들어주세요. Flask 사용, JWT 인증 포함."
)
이런 팀에 적합 / 비적합
CrewAI가 적합한 팀
- 빠른 프로토타이핑: 최소한의 코드로 다중 Agent 시스템 구축 가능
- 비AI 전문가: 프롬프트 엔지니어링에 익숙하지 않은 팀
- 순차적 워크플로우: 정형화된 태스크 파이프라인이 필요한 경우
- 스타트업 MVP: 빠르게 아이디어를 검증해야 하는 환경
- HolySheep 연동: 내장된 모델 선택 기능으로Easy 라우팅
CrewAI가 비적합한 팀
- 고도로 커스�마이징: Agent 간 복잡한 대화 패턴이 필요한 경우
- 기업급 요구사항: 세밀한 보안 및 감사 로깅이 필요한 환경
- 다양한 모델 혼합: 실시간 모델 전환이 빈번한 경우
AutoGen이 적합한 팀
- 대화형 AI: Agent 간 자유로운 대화가 핵심인 프로젝트
- Microsoft 생태계: Azure, Teams 등 Microsoft 제품과 통합 필요
- 연구 목적: Agent 협업 알고리즘 연구 및 실험
- 커스텀 요구사항: 독자적인 Agent 아키텍처 구현 필요
AutoGen이 비적합한 팀
- 제한된 학습 시간: 프레임워크 이해에 투자할 시간이 부족한 팀
- 표준화된 프로세스: Opinionated한 접근을 선호하는 경우
- 초보 개발자: 복잡한 설정과 디버깅에 부담을 느끼는 경우
가격과 ROI
HolySheep AI 모델별 가격표
| 모델 | 입력 ($/MTok) | 출력 ($/MTok) | 최적 사용 시나리오 |
|---|---|---|---|
| GPT-4.1 | $8.00 | $8.00 | 복잡한 추론, 코드 생성 |
| Claude Sonnet 4.5 | $15.00 | $15.00 | 긴 컨텍스트 분석 |
| Gemini 2.5 Flash | $2.50 | $2.50 | 빠른 응답, 대량 처리 |
| DeepSeek V3.2 | $0.42 | $1.68 | 비용 최적화, 단순 태스크 |
비용 절감 시나리오 분석
넥스트젠 AI 팀의 실제 비용 구조를 바탕으로 한 ROI 분석:
| 항목 | 기존 방식 (개별 공급사) | HolySheep AI 통합 | 절감액 |
|---|---|---|---|
| 월간 API 비용 | $4,200 | $680 | $3,520 (84%) |
| 연간 비용 | $50,400 | $8,160 | $42,240 |
| 평균 지연 시간 | 420ms | 180ms | 57% 개선 |
| API 키 관리 시간 | 주 2시간 | 주 15분 | 87.5% 절감 |
| 개발자 생산성 | 基准 | +35% | 추정 |
ROI 계산 공식
# ROI 계산기 함수
def calculate_roi(monthly_api_calls: int, avg_tokens_per_call: int,
current_provider_cost: float, target_monthly_budget: float):
"""
HolySheep AI ROI 계산
Args:
monthly_api_calls: 월간 API 호출 수
avg_tokens_per_call: 평균 토큰 수 (입력+출력)
current_provider_cost: 현재 월간 비용
target_monthly_budget: 목표 월간 예산
"""
# 1M 토큰당 평균 비용 가정
m_tokens = (monthly_api_calls * avg_tokens_per_call) / 1_000_000
# HolySheep 최적화 모델 적용 (Gemini Flash + DeepSeek 혼합)
estimated_cost = m_tokens * 3.50 # 평균 $3.50/MTok 가정
current_monthly = current_provider_cost
holy_sheep_monthly = min(estimated_cost, target_monthly_budget)
annual_savings = (current_monthly - holy_sheep_monthly) * 12
roi_percentage = ((current_monthly - holy_sheep_monthly) / holy_sheep_monthly) * 100
return {
"월간 절감액": f"${current_monthly - holy_sheep_monthly:.2f}",
"연간 절감액": f"${annual_savings:.2f}",
"ROI": f"{roi_percentage:.1f}%",
"회수 기간": f"{(holy_sheep_monthly / (current_monthly - holy_sheep_monthly)):.1f}개월"
}
예시: 넥스트젠 AI 팀
result = calculate_roi(
monthly_api_calls=1_350_000, # 45,000회/일 × 30일
avg_tokens_per_call=500,
current_provider_cost=4200,
target_monthly_budget=680
)
print("=== ROI 분석 결과 ===")
for key, value in result.items():
print(f"{key}: {value}")
왜 HolySheep를 선택해야 하나
1. 단일 API 키로 모든 모델 통합
더 이상 여러 공급사의 API 키를 각각 관리할 필요가 없습니다. HolySheep의 단일 엔드포인트에서 GPT-4.1, Claude Sonnet 4.5, Gemini 2.5 Flash, DeepSeek V3.2를 모두 사용할 수 있습니다.
# HolySheep AI - 하나의 키, 모든 모델
base_url: https://api.holysheep.ai/v1
import openai
client = openai.OpenAI(
api_key="YOUR_HOLYSHEEP_API_KEY",
base_url="https://api.holysheep.ai/v1"
)
모델 자동 라우팅 또는 수동 선택
models = ["gpt-4.1", "claude-sonnet-4-5", "gemini-2.5-flash", "deepseek-v3.2"]
for model in models:
response = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": "안녕하세요"}],
max_tokens=50
)
print(f"{model}: {response.choices[0].message.content[:30]}...")
2. 로컬 결제 지원
해외 신용카드 없이도 원화 결제가 가능합니다. 국내 개발자 및 스타트업에게 가장 큰 진입장벽이었던 글로벌 결제 문제를 해결했습니다.
- 결제 수단: 국내 신용카드, 계좌이체, 가상계좌
- 정액제: 월 $99부터 시작하는 안정적인 예산 관리
- 후불제: 사용한 만큼만 과금 (초과 과금 없음)
3. 모델별 최적화 라우팅
HolySheep AI의智能 라우팅 엔진을 활용하면, 태스크 특성에 따라 최적의 모델을 자동으로 선택합니다:
| 태스크 유형 | 권장 모델 | 비용 ($/1K Calls) | 평균 지연 |
|---|---|---|---|
| 간단한 질문 응답 | DeepSeek V3.2 | $0.21 | 120ms |
| 빠른 요약/번역 | Gemini 2.5 Flash | $1.25 | 150ms |
| 복잡한 코드 분석 | GPT-4.1 | $4.00 | 200ms |
| 긴 컨텍스트 이해 | Claude Sonnet 4.5 | $7.50 | 180ms |
4. 안정적인 인프라
- 99.9% 가용성: SLA 보장
- 자동 장애 복구: 공급사 장애 시 자동 failover
- 전용 캐시: 반복 요청 최적화로 비용 추가 절감
- 실시간 모니터링: 대시보드에서 사용량 및 지연 시간 실시간 확인
자주 발생하는 오류와 해결
오류 1: API 키 인증 실패 (401 Unauthorized)
# ❌ 오류 메시지
"AuthenticationError: Incorrect API key provided"
✅ 해결 방법 1: 키 확인 및 올바른 형식 사용
import os
HolySheep API 키 설정 (공백 없이 정확히)
HOLYSHEEP_KEY = "YOUR_HOLYSHEEP_API_KEY" # 실제 키로 교체
환경변수 설정
os.environ["OPENAI_API_KEY"] = HOLYSHEEP_KEY
직접 클라이언트 설정
from openai import OpenAI
client = OpenAI(
api_key=HOLYSHEEP_KEY,
base_url="https://api.holysheep.ai/v1" # 반드시 https 포함
)
✅ 해결 방법 2: 키 유효성 검증
def verify_holysheep_key(api_key: str) -> bool:
"""HolySheep API 키 유효성 검증"""
import requests
response = requests.get(
"https://api.holysheep.ai/v1/models",
headers={"Authorization": f"Bearer {api_key}"}
)
if response.status_code == 200:
print("✅ API 키 유효")
return True
elif response.status_code == 401:
print("❌ API 키 오류: 키를 확인해주세요")
return False
else:
print(f"❌ 서버 오류: {response.status_code}")
return False
verify_holysheep_key(HOLYSHEEP_KEY)
오류 2: base_url 설정 오류 (404 Not Found)
# ❌ 오류 메시지
"NotFoundError: Model not found" 또는 404 오류
✅ 해결 방법: 올바른 base_url과 모델명 확인
from openai import OpenAI
client = OpenAI(
api_key="YOUR_HOLYSHEEP_API_KEY",
base_url="https://api.holysheep.ai/v1" # ❌ v1 붙이기 필수
)
사용 가능한 모델 목록 확인
models = client.models.list()
print("사용 가능한 모델:")
for model in models.data:
print(f" - {model.id}")
HolySheep 지원 모델명 예시:
- gpt-4.1
- claude-sonnet-4-5
- gemini-2.5-flash
- deepseek-v3.2
모델명 확인 후 사용
response = client.chat.completions.create(
model="gpt-4.1", # 정확한 모델명 사용
messages=[{"role": "user", "content": "테스트"}]
)
오류 3: Rate Limit 초과 (429 Too Many Requests)
# ❌ 오류 메시지
"RateLimitError: Rate limit exceeded for model..."
✅ 해결 방법: 재시도 로직 및 속도 제한 구현
import time
import requests
from functools import wraps
def retry_with_exponential_backoff(
max_retries=3,
initial_delay=1,
max_delay=60
):
"""지수 백오프 재시도 데코레이터"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
delay = initial_delay
for attempt in range(max_retries):
try:
return func(*args, **kwargs)
except requests.exceptions.RequestException as e:
if attempt == max_retries - 1:
raise
# 429 에러 체크
if hasattr(e, 'response') and e.response.status_code == 429:
print(f"⏳ Rate limit 초과. {delay}초 후 재시도...")
time.sleep(delay)
delay = min(delay * 2, max_delay)
else:
raise
return None
return wrapper
return decorator
@retry_with_exponential_backoff(max_retries=3)
def call_holysheep_api(prompt: str, model: str = "gpt-4.1"):
"""Rate limit 고려한 HolySheep API 호출"""
client = OpenAI(
api_key="YOUR_HOLYSHEEP_API_KEY",
base_url="https://api.holysheep.ai/v1"
)
response = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}],
max_tokens=500
)
return response
사용 예시
for i in range(5):
try:
result = call_holysheep_api(f"테스트 요청 {i+1}")
print(f"✅ 요청 {i+1} 성공")
except Exception as e:
print(f"❌ 요청 {i+1} 실패: {e}")
추가 오류 4: CrewAI 모델 설정 오류
# ❌ 오류: CrewAI에서 HolySheep 모델 인식 실패
ValueError: Model not supported: gpt-4.1
✅ 해결: ChatOpenAI를