안녕하세요, 저는 HolySheep AI의 기술 문서 엔지니어입니다. 이번 튜토리얼에서는 Jinja2 템플릿 엔진LLM API를 결합하여 재사용 가능하고 유연한 프롬프트 템플릿 시스템을 만드는 방법을 단계별로 알려드리겠습니다.

왜 Prompt 템플릿이 필요한가?

여러분이 AI API를 사용할 때, 같은 구조의 프롬프트를 반복 작성해야 하는 경우가 많습니다. 예를 들어:

템플릿 엔진을 사용하면 이런 반복 작업을 자동화하고, 비즈니스 로직과 프롬프트 구조를 분리할 수 있습니다.

1. 개발 환경 준비

먼저 필요한 도구를 설치합니다. 터미널에서 다음 명령어를 실행하세요:

# Python 프로젝트 생성 및 의존성 설치
mkdir prompt-template-engine
cd prompt-template-engine
python -m venv venv

Windows의 경우

venv\Scripts\activate

macOS/Linux의 경우

source venv/bin/activate

필수 패키지 설치

pip install jinja2 openai python-dotenv

설치 확인

pip list | grep -E "jinja2|openai"

💡 팁: requirements.txt 파일을 만들어 팀원들과 의존성을 공유하세요.

# requirements.txt
jinja2==3.1.3
openai==1.12.0
python-dotenv==1.0.1

2. HolySheep AI API 연결 설정

이제 HolySheep AI와 연결을 설정합니다. HolySheep AI는 지금 가입하면 무료 크레딧을 제공하며, 海外 신용카드 없이 로컬 결제가 가능합니다.

# config.py - HolySheep AI 설정
import os
from dotenv import load_dotenv

load_dotenv()

HolySheep AI API 설정

HOLYSHEEP_API_KEY = os.getenv("HOLYSHEEP_API_KEY") HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1"

모델별 가격 (2024년 기준, USD per Million Tokens)

MODEL_PRICING = { "gpt-4.1": {"input": 8.00, "output": 32.00}, # $8/MTok 입력, $32/MTok 출력 "claude-sonnet-4-5": {"input": 15.00, "output": 75.00}, # $15/MTok 입력 "gemini-2.5-flash": {"input": 2.50, "output": 10.00}, # $2.50/MTok 입력 "deepseek-v3.2": {"input": 0.42, "output": 1.65}, # $0.42/MTok 입력 } print(f"✅ HolySheep AI 연결 완료: {HOLYSHEEP_BASE_URL}") print(f"📊 사용 가능 모델: {list(MODEL_PRICING.keys())}")
# .env 파일 (절대 GitHub에 업로드하지 마세요!)
HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY
DEFAULT_MODEL=gemini-2.5-flash  # 비용 최적화를 위한 기본 모델

3. Jinja2 템플릿 기초

Jinja2는 Python에서 가장 인기 있는 템플릿 엔진입니다. 중괄호 {{ }}로 변수를, {% %}로 로직을 표현합니다.

# templates/email_template.j2
안녕하세요 {{ recipient_name }}님,

{{ greeting }}

{{ main_content }}

{% if include_closing %}
감사합니다.
{{ sender_name }}
{{ sender_position }}
{% endif %}

---
📧 자동 생성된 메시지입니다.
# template_engine.py - 템플릿 엔진 핵심 클래스
from jinja2 import Environment, FileSystemLoader, select_autoescape
from pathlib import Path
from typing import Dict, Any, Optional
import hashlib
import json

class PromptTemplateEngine:
    """LLM 프롬프트 템플릿 관리 엔진"""
    
    def __init__(self, template_dir: str = "templates"):
        self.template_dir = Path(template_dir)
        self.env = Environment(
            loader=FileSystemLoader(str(self.template_dir)),
            autoescape=select_autoescape(['html', 'xml']),
            trim_blocks=True,      # 블록 끝 줄바꿈 제거
            lstrip_blocks=True      # 블록 앞 공백 제거
        )
        self._cache = {}  # 템플릿 캐시
        
    def render(self, template_name: str, context: Dict[str, Any]) -> str:
        """템플릿 렌더링 (캐시 지원)"""
        template = self.env.get_template(template_name)
        return template.render(**context)
    
    def render_string(self, template_str: str, context: Dict[str, Any]) -> str:
        """문자열 템플릿 직접 렌더링"""
        template = self.env.from_string(template_str)
        return template.render(**context)

사용 예시

engine = PromptTemplateEngine()

방법 1: 파일에서 템플릿 로드

result = engine.render("email_template.j2", { "recipient_name": "홍길동", "greeting": "새로운 기능 업데이트 소식을 전해드립니다.", "main_content": "이번 업데이트에는 AI 자동완성 기능이 추가되었습니다.", "include_closing": True, "sender_name": "개발팀", "sender_position": "매니저" }) print(result)

4. LLM 동적 생성 시스템 구축

이제 HolySheep AI의 LLM API와 연결하여 동적 콘텐츠를 생성하는 시스템을 만들겠습니다.

# llm_client.py - HolySheep AI LLM 클라이언트
from openai import OpenAI
from typing import Optional, Dict, List
import time

class HolySheepLLM:
    """HolySheep AI API 래퍼 클래스"""
    
    def __init__(self, api_key: str, base_url: str = "https://api.holysheep.ai/v1"):
        self.client = OpenAI(api_key=api_key, base_url=base_url)
        self.last_request_time = 0
        self.request_count = 0
        
    def generate(
        self,
        prompt: str,
        model: str = "gemini-2.5-flash",
        temperature: float = 0.7,
        max_tokens: int = 1000
    ) -> Dict[str, any]:
        """LLM 응답 생성"""
        start_time = time.time()
        
        response = self.client.chat.completions.create(
            model=model,
            messages=[
                {"role": "system", "content": "당신은 도움이 되는 AI 어시스턴트입니다."},
                {"role": "user", "content": prompt}
            ],
            temperature=temperature,
            max_tokens=max_tokens
        )
        
        latency_ms = int((time.time() - start_time) * 1000)
        
        self.request_count +=