첫 AI 에이전트 워크플로우 구축: 실용 가이드 (프레임워크 없이)
Source: Dev.to
Everyone’s talking about AI agents. LangChain, CrewAI, AutoGen — the frameworks keep multiplying. But here’s something I’ve learned after months of building with them:
You don’t need a framework to build useful AI agent workflows.
In fact, starting with a framework before understanding the core pattern is why most people’s agents are just expensive, slow wrappers around a single API call.
Let me show you how to build a genuinely useful multi‑step AI workflow using nothing but structured prompts and basic scripting.
우리가 만들고 있는 것
- 원시 노트/불릿 포인트를 입력으로 받음
- 구조화된 요약을 생성함
- 행동 항목을 추출함
- 후속 이메일 초안을 작성함
- 콘텐츠에서 소셜 미디어 게시물을 생성함
이것은 제가 매주 사용하는 실제 워크플로우이며, 매번 약 3시간을 절약해 줍니다.
핵심 패턴: 프롬프트 체이닝
모두가 과대평가하는 “에이전트” 패턴은 실제로 간단합니다:
Input → Prompt A → Output A → Prompt B → Output B → …
각 단계는 이전 출력값을 받아 변환합니다. 그게 전부입니다. 이것이 모든 에이전트 프레임워크 뒤에 있는 패턴이며, 이들은 단지 오류 처리, 메모리, 도구 사용을 추가할 뿐입니다.
구현해 봅시다.
Step 1: 요약기
import openai
def summarize(raw_notes: str) -> str:
response = openai.chat.completions.create(
model="gpt-4o-mini",
messages=[
{
"role": "system",
"content": """You are a concise business writer.
Take raw notes and produce a structured summary with:
- Key points (bullet list)
- Decisions made
- Open questions
Keep it under 200 words."""
},
{
"role": "user",
"content": f"Summarize these notes:\n\n{raw_notes}"
}
]
)
return response.choices[0].message.content
출력 형식을 제한하는 집중된 시스템 프롬프트.
Step 2: 작업 항목 추출기
def extract_actions(summary: str) -> str:
response = openai.chat.completions.create(
model="gpt-4o-mini",
messages=[
{
"role": "system",
"content": """Extract action items from this summary.
Format each as:
- [ ] [ACTION] — Owner: [person] — Due: [date if mentioned]
Only include concrete, actionable tasks.
Ignore vague items like 'think about X'."""
},
{
"role": "user",
"content": summary
}
]
)
return response.choices[0].message.content
시스템 프롬프트가 출력 형식에 대해 매우 구체적이라는 점에 주목하세요. 이는 매우 중요합니다 — 모호한 프롬프트는 모호한 결과를 초래합니다.
단계 3: 이메일 초안 작성기
def draft_email(summary: str, actions: str) -> str:
response = openai.chat.completions.create(
model="gpt-4o-mini",
messages=[
{
"role": "system",
"content": """Draft a follow‑up email based on the meeting
summary and action items. Tone: professional but not stiff.
Structure: brief recap, action items with owners, next steps.
Keep under 150 words."""
},
{
"role": "user",
"content": f"Summary:\n{summary}\n\nAction Items:\n{actions}"
}
]
)
return response.choices[0].message.content
4단계: 연결하기
def process_notes(raw_notes: str) -> dict:
# Step 1: Summarize
summary = summarize(raw_notes)
# Step 2: Extract actions
actions = extract_actions(summary)
# Step 3: Draft follow‑up
email = draft_email(summary, actions)
return {
"summary": summary,
"actions": actions,
"email": email
}
그것이 당신의 “agent.” 네 개의 함수, 프레임워크는 전혀 없으며, 완전히 이해하기 쉽습니다.
왜 이것이 프레임워크보다 나은가 (당분간)
- Debuggable – 무언가가 깨지면 정확히 어느 단계에서 실패했는지 알 수 있고 중간 출력물을 검사할 수 있습니다.
- Cheap – 대부분의 단계에
gpt-4o-mini를 사용하면 실행당 비용이 몇 센트의 일부에 불과합니다. 프레임워크는 종종 모든 작업에 비싼 모델을 기본으로 사용합니다. - Fast – 프레임워크 오버헤드가 없고, 벡터‑데이터베이스 조회도 없으며, 불필요한 복잡성도 없습니다. 이 과정은 몇 초 안에 실행됩니다.
- Modifiable – 단계를 추가하고 싶나요? 다른 함수를 작성하면 됩니다. 이메일 톤을 바꾸고 싶나요? 시스템 프롬프트 하나만 수정하면 됩니다. 문서 찾이에 시간을 낭비할 필요가 없습니다.
Production‑Ready 로 만들기
시간이 지나면서 추가한 몇 가지 사항:
import json
import logging
def safe_step(func, input_data, step_name):
"""Wrapper with logging and error handling."""
try:
logging.info(f"Starting: {step_name}")
result = func(input_data)
logging.info(f"Completed: {step_name} ({len(result)} chars)")
return result
except Exception as e:
logging.error(f"Failed: {step_name} — {e}")
return None
재시도 로직과 출력 검증을 추가하면 대부분의 “agent” 데모보다 더 견고한 것을 얻을 수 있습니다.
프롬프트 엔지니어링 요점
The real skill here isn’t Python. It’s writing good system prompts. Each prompt in this pipeline:
- Has a clear role (“You are a concise business writer”)
- Specifies output format explicitly
- Sets constraints (word limits, what to include/exclude)
- Is testable in isolation
Good prompts are like good function signatures — they define inputs, outputs, and constraints clearly. Most people fail because they write “summarize this” and wonder why the output is inconsistent.
확장하기
기본 체인에 익숙해지면 다음을 할 수 있습니다:
- 병렬 브랜치 추가 (예: 이메일 초안을 작성하면서 동시에 소셜 미디어 게시물을 생성).
- 메모리 도입 – 가벼운 JSON 스토어에 요약을 지속적으로 저장.
- 단계별 모델 교체 – 요약에는 저렴한 모델을, 창의적 글쓰기에는 더 강력한 모델을 사용.
- 전체를 간단한 CLI 또는 웹 UI로 래핑 –
argparse혹은FastAPI사용.
핵심은: 최소한으로 시작하고 각 요소를 이해한 뒤 반복해서 개선하는 것입니다. 도구 사용 오케스트레이션, 장기 메모리, 다중 에이전트 협업과 같은 기능이 진짜 필요해질 때까지는 무거운 프레임워크가 필요하지 않을 것입니다. 그때까지는 잘 다듬은 프롬프트 몇 개와 몇 개의 함수만으로도 충분합니다.
- 조건 분기 — 콘텐츠 유형에 따라 다른 프롬프트 적용
- 도구 사용 — LLM이 함수 호출 (웹 검색, 데이터베이스 쿼리) 가능하게 함
- 메모리 — 실행 간 컨텍스트를 지속적으로 저장
그때 프레임워크가 의미를 갖기 시작합니다. 하지만 프롬프트 체이닝을 이해하지 못하고 바로 LangChain으로 뛰어들면, 모래 위에 집을 짓는 셈입니다.
마무리
AI 에이전트에 대한 과대광고 때문에 사람들은 LLM을 활용하려면 복잡한 오케스트레이션 프레임워크가 필요하다고 생각합니다. 실제로는 그렇지 않습니다. 구조화된 프롬프트부터 시작하고, 이를 연결해 나가며 필요할 때만 복잡성을 추가하세요.
가장 어려운 부분은 코드가 아니라, 일관되게 유용한 출력을 만들어내는 프롬프트를 만드는 일입니다. 저는 시행착오를 거치며 프롬프트를 다듬는 데 너무 많은 시간을 보냈습니다.
시작을 돕고 싶다면, 제가 검증한 프롬프트 컬렉션을 비즈니스 워크플로우와 AI 이미지 생성용으로 공개했습니다 — 여기서 설명한 접근 방식을 그대로 적용했으며, 수백 개의 실제 시나리오를 다루어 처음부터 모든 것을 만들 필요가 없도록 했습니다.
행복한 빌딩 되세요. 🛠️
이 내용이 도움이 되었나요? 더 실용적인 AI/자동화 가이드를 원한다면 @anonimousdev_를 팔로우하세요.