2025. 12. 2. 10:10ㆍAI 개발
들어가며 사용자의 상황에 딱 맞는 '관계 심리 훈련' 콘텐츠를 매번 사람이 직접 기획하고 그릴 수 있을까요? 불가능합니다. 저희 '마음봄' 팀은 LLM(거대언어모델)을 단순한 챗봇이 아닌, '콘텐츠 생성 엔진'으로 활용하여 사용자 맞춤형 4컷 만화 시나리오를 실시간으로 찍어내는 파이프라인을 구축했습니다. 그 구체적인 설계 과정과 프롬프트 엔지니어링 노하우를 공유합니다.
1. 딥 에이전트 작업 순서도 (The Pipeline)
저희는 이 과정을 Brain(기획) → Hands(제작) → Delivery(배송)의 3단계로 정의했습니다. 이 모든 과정은 Python(FastAPI) 백엔드에서 비동기로 수행됩니다.
Phase 1. 기획 단계 (The Brain 🧠)
가장 중요한 단계입니다. 텍스트 LLM이 기획자 역할을 수행합니다.
- 니즈 분석: 사용자의 하소연(Input)에서 핵심 변수(Target, Topic)를 추출합니다.
- Input: "남편이 퇴직하더니 사사건건 잔소리야."
- Variable: Target="남편", Topic="은퇴 후 집안일 간섭"
- 프롬프트 로딩: 개발자가 미리 설계한 구조화된 설계도(.md)를 불러옵니다.
- 시나리오 생성: 변수가 주입된 프롬프트를 통해 LLM이 거대한 JSON 데이터를 생성합니다. 이 안에는 15개의 스토리 노드와 16개의 결말이 모두 포함됩니다.
Phase 2. 제작 단계 (The Hands 🎨)
텍스트가 준비되면, 이제 시각화 단계로 넘어갑니다.
- 오케스트레이션: Python 코드가 생성된 JSON을 순회하며 이미지 묘사(Description) 부분을 찾습니다.
- 병렬 생성: 16개 결말 × 4컷 = 총 64장의 이미지가 필요할 수도 있습니다. 이를 비동기 루프(Async Loop)로 돌며 DALL-E나 Stable Diffusion에게 그리기 명령을 내립니다.
- 업데이트: 생성된 이미지 URL을 다시 JSON 데이터에 업데이트합니다.
Phase 3. 배송 단계 (Delivery 🚚)
- 사용자에게는 로딩 없이 완성된 결과물만 보여집니다. 프론트엔드(React)는 복잡한 로직 없이 도착한 JSON을 렌더링하기만 하면 됩니다.
2. 개발 팁: 프롬프트를 코드로 관리하는 법 (.md)
프롬프트를 Python 코드 안에 하드코딩하는 것은 유지보수에 최악입니다. 저희는 프롬프트를 .md 파일로 분리하고, 템플릿 엔진처럼 변수를 주입하는 방식을 사용했습니다.
# 1. 기획자(LLM)에게 줄 설계도 읽기
with open("prompts/scenario_architect.md", "r", encoding="utf-8") as f:
template = f.read()
# 2. 사용자 상황 변수 주입 (f-string 또는 replace 활용)
# LangChain의 PromptTemplate을 쓰면 더욱 체계적인 관리가 가능합니다.
final_prompt = template.replace("[Target]", user_target) \
.replace("[Topic]", user_topic)
# 3. LLM 호출 및 JSON 생성
response = llm.invoke(final_prompt)
3. 핵심 전략: '페르소나'와 'JSON 스키마' 강제
LLM이 아무 말이나 하지 못하도록 시스템 프롬프트(System Prompt)를 매우 강력하게 설계했습니다. (아래는 실제 프롬프트의 축약 버전입니다.)
A. 역할(Role) 부여
단순한 AI가 아닙니다. 두 가지 인격을 부여했습니다.
- 시니어 관계 심리 전문가: 5060 여성의 심리를 이해하고 공감하는 말투 구현.
- Senior Backend Engineer: JSON 문법 오류를 절대 용납하지 않는 엄격함.
B. 데이터 구조 강제 (Strict Compliance)
출력 데이터는 반드시 15개의 Node와 16개의 Result를 가진 이진 트리(Binary Tree) 구조여야 합니다.
- Nodes: 상황 발단(Level 1)부터 최종 상황(Level 4)까지의 묘사.
- Options: 사용자의 선택지. 하나는 습관적 반응(화내기/회피), 다른 하나는 대안적 반응(관계 기술)으로 나누어 훈련 효과를 유도합니다.
- Results: 선택에 따른 결과 점수(0~100점)와 날씨 메타포(STORM, SUNNY 등)를 포함.
// LLM이 생성해내는 결과물 예시
{
"scenario": {
"category": "TRAINING",
"title": "은퇴한 남편과의 점심 전쟁"
},
"nodes": [
{ "id": "node_1", "text": "남편이 점심 먹고 나서 설거지통을 보며 한마디 하네요. '세제 너무 많이 쓰는 거 아냐?'" }
],
"options": [
{ "text": "아유, 당신이 좀 하든가!", "option_code": "A", "result_code": null },
{ "text": "환경 생각해서 그러는거죠? 알겠어요~", "option_code": "B", "result_code": null }
]
// ... (16가지 엔딩까지 계속됨)
}
마치며
이 파이프라인의 가장 큰 장점은 '확장성'입니다. 개발자가 코드를 수정할 필요 없이, .md 파일의 프롬프트만 튜닝하면 시나리오의 퀄리티가 올라가고, 게임의 규칙이 바뀝니다.
'마음봄' 프로젝트는 이렇게 AI를 단순한 채팅 상대를 넘어, 사용자를 위한 맞춤형 콘텐츠 크리에이터로 활용하고 있습니다.
작성 팁 (User를 위한 제안)
- 다이어그램 활용: Phase 1, 2, 3를 설명하는 부분에 `` 같은 간단한 흐름도 이미지를 넣으시면 이해도가 훨씬 높아집니다.
- 코드 하이라이팅: Velog나 Tistory 에디터에서 Python과 JSON 코드 블록에 문법 강조(Syntax Highlighting) 기능을 꼭 켜주세요.
- 태그 추천: #PromptEngineering #GenAI #Python #FastAPI #LLMService #자동화
'AI 개발' 카테고리의 다른 글
| 사용자 패턴 분석 엔진 고찰 (0) | 2025.12.08 |
|---|---|
| GPT-4o-mini가 복잡한 JSON 시나리오 생성에 실패했던 이유와 해결 방법 (실전 트러블슈팅) (0) | 2025.12.03 |
| 마음봄 프로젝트 - 감정 분석 RAG 모델 (1) | 2025.12.02 |
| [Tech Log] 단순 챗봇을 넘어 'AI 에이전트'로: 멘탈케어 서비스 '마음봄' 아키텍처 설계기 (0) | 2025.12.02 |
| 딥 에이전트 (0) | 2025.12.02 |