본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 12. 26. · 2 Views
Plan-and-Execute 패턴 완벽 가이드
LLM 에이전트가 복잡한 작업을 해결하는 Plan-and-Execute 패턴을 배웁니다. 계획 수립, 실행, 재조정의 3단계 프로세스를 실무 예제로 익히고, 멀티 스텝 자동화를 구현합니다.
목차
1. 계획 수립 단계
어느 날 김개발 씨가 LLM 에이전트 프로젝트를 맡게 되었습니다. "사용자 질문에 답하려면 여러 단계의 작업이 필요한데, 어떻게 처리하죠?" 선배 박시니어 씨가 웃으며 말합니다.
"Plan-and-Execute 패턴을 알아야 할 때네요."
Plan-and-Execute 패턴은 복잡한 작업을 먼저 계획하고, 그 계획을 순서대로 실행하는 에이전트 설계 방식입니다. 마치 건축가가 설계도를 그린 후 시공하는 것처럼, LLM이 먼저 작업 계획을 세우고 단계별로 실행합니다.
이를 통해 복잡한 질문도 체계적으로 해결할 수 있습니다.
다음 코드를 살펴봅시다.
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
# 계획 수립 프롬프트
planning_prompt = ChatPromptTemplate.from_messages([
("system", "당신은 작업을 단계별로 분해하는 플래너입니다."),
("user", "다음 질문에 답하기 위한 단계별 계획을 세우세요: {question}")
])
llm = ChatOpenAI(model="gpt-4", temperature=0)
# 계획 생성
def create_plan(question: str) -> list[str]:
response = llm.invoke(planning_prompt.format(question=question))
# 응답을 단계별로 파싱
steps = response.content.split("\n")
return [step.strip() for step in steps if step.strip()]
김개발 씨는 입사 6개월 차 AI 개발자입니다. 오늘 받은 요구사항은 "우리 회사의 지난 분기 매출과 올해 목표를 비교하고, 달성률을 분석해줘"라는 복잡한 질문에 답하는 에이전트를 만드는 것입니다.
단순히 LLM에게 던지기엔 너무 복잡해 보입니다. 박시니어 씨가 화이트보드를 가리키며 설명합니다.
"이런 문제는 한 번에 풀 수 없어요. 먼저 어떤 순서로 해결할지 계획을 세워야 합니다." 그렇다면 Plan-and-Execute 패턴이란 정확히 무엇일까요?
쉽게 비유하자면, 이 패턴은 마치 요리사가 레시피를 먼저 읽어보고 재료를 준비한 후 순서대로 조리하는 것과 같습니다. 복잡한 요리를 만들 때 무작정 시작하는 대신, 먼저 "양파 썰기 → 고기 볶기 → 소스 만들기 → 완성"처럼 단계를 나눕니다.
LLM 에이전트도 똑같이 복잡한 질문을 작은 단계로 쪼개서 해결합니다. Plan-and-Execute 패턴이 없던 시절에는 어땠을까요?
개발자들은 LLM에게 복잡한 질문을 던지고 운에 맡겼습니다. 때로는 답을 얻었지만, 종종 중요한 단계를 건너뛰거나 순서가 뒤죽박죽이 되었습니다.
더 큰 문제는 작업이 실패했을 때 어느 부분에서 잘못되었는지 파악하기 어려웠다는 점입니다. 디버깅이 거의 불가능했습니다.
바로 이런 문제를 해결하기 위해 Plan-and-Execute 패턴이 등장했습니다. 이 패턴을 사용하면 복잡한 작업을 명확한 단계로 분해할 수 있습니다.
또한 각 단계의 진행 상황을 추적할 수도 있습니다. 무엇보다 작업이 실패했을 때 어느 단계에서 문제가 생겼는지 정확히 알 수 있다는 큰 이점이 있습니다.
위의 코드를 한 줄씩 살펴보겠습니다. 먼저 4번째 줄을 보면 계획 수립 전용 프롬프트를 만드는 것을 알 수 있습니다.
시스템 메시지에서 LLM의 역할을 "플래너"로 명확히 정의합니다. 이 부분이 핵심입니다.
다음으로 12번째 줄의 create_plan 함수에서는 질문을 받아 단계별 계획을 생성합니다. LLM이 응답한 내용을 줄 단위로 파싱해서 리스트로 반환합니다.
실제 현업에서는 어떻게 활용할까요? 예를 들어 고객 지원 시스템을 개발한다고 가정해봅시다.
고객이 "내 주문이 언제 도착하고, 배송비는 얼마고, 반품은 어떻게 하나요?"라고 물으면, 에이전트는 이를 "1단계: 주문 조회, 2단계: 배송 정보 확인, 3단계: 반품 정책 검색"으로 분해합니다. 각 단계를 차례로 실행하며 정확한 답변을 제공할 수 있습니다.
많은 AI 스타트업에서 이런 패턴을 적극적으로 사용하고 있습니다. 하지만 주의할 점도 있습니다.
초보 개발자들이 흔히 하는 실수 중 하나는 계획을 너무 세밀하게 나누는 것입니다. "데이터베이스 연결 → 쿼리 작성 → 쿼리 실행 → 결과 파싱"처럼 지나치게 쪼개면 오히려 오버헤드가 커집니다.
따라서 의미 있는 단위로 적절히 묶어서 계획을 세워야 합니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.
박시니어 씨의 설명을 들은 김개발 씨는 고개를 끄덕였습니다. "아, 복잡한 작업도 단계별로 나누면 훨씬 관리하기 쉽겠네요!" 계획 수립 단계를 제대로 이해하면 LLM 에이전트가 어떤 복잡한 작업도 체계적으로 처리할 수 있습니다.
여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - 계획은 3-7단계 정도가 적당합니다. 너무 많으면 복잡해집니다.
- 각 단계는 독립적으로 실행 가능해야 합니다.
- 계획 프롬프트에 "구체적이고 실행 가능한 단계로 나누세요"라고 명시하세요.
2. 실행 단계
계획을 세우는 법을 배운 김개발 씨가 박시니어 씨에게 물었습니다. "계획은 세웠는데, 이제 어떻게 실행하나요?" 박시니어 씨가 키보드를 두드리며 답합니다.
"각 단계를 순서대로 실행하는 Executor를 만들어야죠."
실행 단계는 계획 단계에서 만든 작업 목록을 순서대로 수행하는 과정입니다. 마치 체크리스트를 하나씩 완료하는 것처럼, 각 단계를 LLM이나 도구를 사용해 실행하고 결과를 수집합니다.
실행 결과는 다음 단계의 입력으로 사용됩니다.
다음 코드를 살펴봅시다.
from langchain.agents import Tool
from langchain.tools import DuckDuckGoSearchRun
# 도구 정의
search_tool = Tool(
name="Search",
func=DuckDuckGoSearchRun().run,
description="인터넷에서 정보를 검색합니다."
)
# 실행 함수
def execute_step(step: str, context: dict, tools: list[Tool]) -> str:
# LLM에게 단계를 실행하도록 요청
execution_prompt = f"""
다음 단계를 실행하세요: {step}
이전 단계 결과: {context.get('previous_results', [])}
사용 가능한 도구: {[t.name for t in tools]}
"""
# 도구를 사용하거나 LLM이 직접 처리
result = llm.invoke(execution_prompt)
return result.content
김개발 씨는 이제 계획을 실행에 옮길 차례입니다. 화면에는 "1단계: 지난 분기 매출 조회, 2단계: 올해 목표 확인, 3단계: 달성률 계산"이라는 계획이 떠 있습니다.
하지만 이걸 어떻게 코드로 구현할까요? 박시니어 씨가 설명을 시작합니다.
"계획은 그림에 불과해요. 실제로 움직이게 만들려면 실행기가 필요합니다." 실행 단계란 무엇일까요?
쉽게 비유하자면, 실행 단계는 마치 공장의 생산 라인과 같습니다. 설계도(계획)대로 원자재를 넣고, 각 공정을 거치며, 최종 제품을 만들어냅니다.
중간 공정의 결과물이 다음 공정의 재료가 되는 것처럼, 각 단계의 실행 결과가 다음 단계의 입력이 됩니다. 실행 단계가 체계적이지 않으면 어떤 일이 벌어질까요?
과거에는 각 단계를 독립적으로 실행했습니다. 1단계가 끝나면 그 결과를 개발자가 수동으로 확인하고, 2단계 입력으로 복사 붙여넣기 했습니다.
비효율적일 뿐만 아니라 실수하기도 쉬웠습니다. 더 큰 문제는 단계가 10개, 20개로 늘어나면 사람이 감당할 수 없다는 점이었습니다.
실행 단계 자동화가 이 문제를 해결합니다. 이 방식을 사용하면 단계 간 데이터가 자동으로 연결됩니다.
또한 각 단계에서 필요한 도구를 자동으로 선택할 수도 있습니다. 무엇보다 전체 실행 과정을 로깅하고 추적할 수 있다는 장점이 있습니다.
위의 코드를 살펴봅시다. 5번째 줄에서 검색 도구를 정의합니다.
LLM이 외부 정보가 필요할 때 사용할 수 있는 도구입니다. 12번째 줄의 execute_step 함수가 핵심입니다.
이 함수는 현재 실행할 단계와 이전 단계의 결과를 받아서, LLM에게 실행을 요청합니다. 18번째 줄을 보면 이전 단계 결과를 컨텍스트로 전달하는 것을 알 수 있습니다.
실무에서는 어떻게 쓰일까요? 예를 들어 여행 계획 에이전트를 만든다고 가정해봅시다.
사용자가 "도쿄 3박 4일 여행 계획 짜줘"라고 하면, 1단계에서 항공편을 검색하고, 2단계에서 그 항공편 시간에 맞춰 호텔을 예약하며, 3단계에서 호텔 위치 근처 관광지를 추천합니다. 각 단계의 결과가 자연스럽게 다음 단계의 입력이 되어 일관성 있는 여행 계획이 완성됩니다.
하지만 주의할 점이 있습니다. 초보 개발자들이 자주 하는 실수는 모든 단계를 병렬로 실행하려는 것입니다.
하지만 많은 경우 단계 간 의존성이 있습니다. 2단계가 1단계의 결과를 필요로 한다면, 반드시 순차적으로 실행해야 합니다.
따라서 의존성 그래프를 그려보고, 병렬 가능한 부분만 병렬화하는 것이 좋습니다. 김개발 씨가 코드를 실행해봅니다.
각 단계가 순서대로 실행되고, 결과가 쌓여갑니다. "와, 자동으로 다 처리되네요!" 실행 단계를 제대로 구현하면 복잡한 워크플로우도 자동으로 돌아갑니다.
여러분의 에이전트가 스스로 작업을 완수하는 모습을 지켜보세요.
실전 팁
💡 - 각 단계의 결과를 구조화된 형태로 저장하세요(딕셔너리 권장).
- 실행 중 에러가 발생하면 로그를 남기고 다음 단계로 넘어가지 마세요.
- 타임아웃을 설정해서 무한 실행을 방지하세요.
3. 계획 재조정
김개발 씨의 에이전트가 실행 중 예상치 못한 에러를 만났습니다. "계획대로 안 되는데, 어떻게 하죠?" 박시니어 씨가 미소 지으며 말합니다.
"좋은 에이전트는 계획을 수정할 줄 알아야 해요."
계획 재조정은 실행 중 문제가 발생하거나 예상과 다른 결과가 나왔을 때, 원래 계획을 수정하는 과정입니다. 마치 내비게이션이 막힌 길을 만나면 우회 경로를 제안하듯, 에이전트도 동적으로 계획을 업데이트합니다.
이를 통해 변화하는 상황에 적응할 수 있습니다.
다음 코드를 살펴봅시다.
def replan(original_plan: list[str],
completed_steps: list[str],
last_result: str,
error: str = None) -> list[str]:
# 재계획 프롬프트
replan_prompt = f"""
원래 계획: {original_plan}
완료된 단계: {completed_steps}
마지막 결과: {last_result}
발생한 문제: {error if error else "없음"}
위 상황을 고려해 남은 단계를 재조정하세요.
"""
response = llm.invoke(replan_prompt)
# 새로운 계획 파싱
new_steps = response.content.split("\n")
return [step.strip() for step in new_steps if step.strip()]
김개발 씨의 에이전트가 3단계까지 잘 진행되다가 갑자기 멈췄습니다. 로그를 확인해보니 "데이터베이스 연결 실패"라는 에러가 떠 있습니다.
처음 세운 계획에는 데이터베이스 접근이 필수였는데, 지금 서버가 점검 중입니다. 박시니어 씨가 화면을 들여다보며 말합니다.
"이럴 때 필요한 게 재계획 기능이에요. 상황이 바뀌면 계획도 바꿔야죠." 계획 재조정이란 무엇일까요?
비유하자면, 계획 재조정은 마치 등산할 때 원래 루트가 폐쇄되어 있으면 다른 코스를 찾는 것과 같습니다. A 코스로 정상에 오르려 했는데 낙석으로 막혔다면, B 코스나 C 코스를 검토합니다.
목적지는 같지만 경로는 유연하게 바뀝니다. 에이전트도 똑같이 최종 목표는 유지하되, 그 과정을 상황에 맞춰 조정합니다.
계획 재조정이 없으면 어떻게 될까요? 전통적인 하드코딩된 워크플로우는 한 단계가 실패하면 전체가 멈췄습니다.
개발자가 직접 개입해서 코드를 수정하고 다시 실행해야 했습니다. 실시간 서비스에서는 치명적이었습니다.
사용자는 에러 메시지만 보고 기다려야 했고, 고객 만족도가 떨어졌습니다. 동적 재계획이 이 문제를 해결합니다.
이 방식을 사용하면 에이전트가 스스로 대안을 찾습니다. 또한 이미 완료된 작업은 재사용할 수도 있습니다.
무엇보다 사용자 개입 없이 자동으로 복구된다는 큰 이점이 있습니다. 코드를 분석해봅시다.
1번째 줄의 replan 함수는 네 가지 정보를 받습니다. 원래 계획, 지금까지 완료한 단계, 마지막 실행 결과, 그리고 에러 정보입니다.
6번째 줄의 프롬프트를 보면 LLM에게 현재 상황을 설명하고, 남은 계획을 재조정하라고 요청합니다. 15번째 줄에서 LLM의 응답을 새로운 단계 목록으로 파싱해서 반환합니다.
실무 사례를 볼까요? 예를 들어 뉴스 요약 에이전트를 만든다고 합시다.
원래 계획은 "1. RSS 피드 가져오기 → 2.
본문 파싱 → 3. 요약 생성"이었습니다.
그런데 RSS 서버가 다운되었습니다. 에이전트는 재계획을 통해 "1.
웹 스크래핑으로 뉴스 수집 → 2. 본문 추출 → 3.
요약 생성"으로 전략을 바꿉니다. 목표는 동일하지만 방법이 달라진 것입니다.
주의할 점도 있습니다. 초보자들은 종종 무한 재계획 루프에 빠집니다.
계획 A가 실패해서 계획 B로 바꿨는데, B도 실패해서 다시 A로 돌아가는 식입니다. 이를 방지하려면 재계획 횟수에 제한을 두고, 시도했던 방법을 기록해야 합니다.
보통 3번 정도 재시도 후에는 사용자에게 알리는 것이 좋습니다. 김개발 씨가 재계획 기능을 추가하고 다시 실행합니다.
이번에는 데이터베이스 대신 캐시를 사용하도록 계획이 수정되고, 작업이 성공적으로 완료됩니다. "똑똑하네요!" 계획 재조정을 구현하면 에이전트가 예상치 못한 상황에도 유연하게 대처합니다.
여러분의 에이전트를 더 견고하게 만들어보세요.
실전 팁
💡 - 재계획 횟수를 3-5회로 제한하세요.
- 같은 에러가 반복되면 근본 원인을 파악하도록 프롬프트를 작성하세요.
- 재계획 로그를 남겨서 나중에 패턴을 분석하세요.
4. 실습: 멀티 스텝 플래너
이제 김개발 씨가 직접 멀티 스텝 플래너를 만들어볼 차례입니다. "전체 파이프라인을 어떻게 연결하죠?" 박시니어 씨가 샘플 코드를 보여줍니다.
"계획, 실행, 재조정을 하나로 묶으면 됩니다."
멀티 스텝 플래너는 계획 수립, 단계별 실행, 오류 시 재조정을 모두 통합한 완전한 에이전트 시스템입니다. 사용자 질문을 받아 자동으로 계획을 세우고, 각 단계를 실행하며, 문제가 생기면 계획을 수정해 최종 답변을 생성합니다.
다음 코드를 살펴봅시다.
class MultiStepPlanner:
def __init__(self, llm, tools):
self.llm = llm
self.tools = tools
self.max_replans = 3
def run(self, question: str) -> str:
# 1. 계획 수립
plan = create_plan(question)
context = {"question": question, "previous_results": []}
replan_count = 0
# 2. 단계별 실행
for i, step in enumerate(plan):
try:
result = execute_step(step, context, self.tools)
context["previous_results"].append(result)
except Exception as e:
# 3. 재조정
if replan_count < self.max_replans:
plan = replan(plan, plan[:i], context["previous_results"][-1] if context["previous_results"] else "", str(e))
replan_count += 1
else:
raise Exception("재계획 한도 초과")
# 최종 답변 생성
return self.generate_final_answer(context)
김개발 씨는 지금까지 배운 세 가지 개념을 모두 이해했습니다. 하지만 실제로 동작하는 에이전트를 만들려면 이것들을 어떻게 엮어야 할까요?
각 부품은 있는데 조립 방법을 모르는 상황입니다. 박시니어 씨가 화이트보드에 플로우차트를 그립니다.
"보세요. 질문이 들어오면 계획을 세우고, 계획을 실행하고, 에러가 나면 재계획하는 거예요.
이걸 하나의 클래스로 묶으면 됩니다." 멀티 스텝 플래너란 무엇일까요? 쉽게 비유하자면, 이것은 마치 자율주행 자동차의 제어 시스템과 같습니다.
목적지를 입력하면 경로를 계획하고(Planning), 그 경로를 따라 운전하며(Execution), 도로 공사를 만나면 우회로를 찾습니다(Replanning). 운전자가 일일이 지시하지 않아도 스스로 판단하고 움직입니다.
멀티 스텝 플래너도 똑같이 사용자 질문 하나로 모든 과정을 자동화합니다. 이런 통합 시스템이 없으면 어떻게 될까요?
과거에는 계획, 실행, 재조정을 개발자가 수동으로 연결했습니다. 계획을 만들고, 그걸 복사해서 실행 함수에 넣고, 에러가 나면 다시 계획 함수를 호출하는 식이었습니다.
코드가 스파게티처럼 얽히고, 유지보수가 불가능했습니다. 새로운 기능을 추가하려면 여러 곳을 수정해야 했습니다.
멀티 스텝 플래너 클래스가 이 문제를 깔끔하게 해결합니다. 이 방식을 사용하면 모든 로직이 한 곳에 집중됩니다.
또한 재사용 가능한 컴포넌트로 만들 수 있습니다. 무엇보다 새로운 도구나 기능을 쉽게 추가할 수 있다는 장점이 있습니다.
코드를 자세히 봅시다. 1번째 줄의 MultiStepPlanner 클래스가 핵심입니다.
2번째 줄 __init__ 메서드에서 LLM과 도구들, 그리고 재계획 최대 횟수를 초기화합니다. 7번째 줄의 run 메서드가 전체 파이프라인을 구현합니다.
9번째 줄에서 계획을 세우고, 14번째 줄에서 각 단계를 순회하며 실행합니다. 18번째 줄을 보면 예외가 발생했을 때 재계획 로직이 작동합니다.
20번째 줄에서 재계획 횟수를 체크하고, 초과하면 24번째 줄에서 예외를 발생시킵니다. 실무에서 어떻게 활용될까요?
예를 들어 고객 문의 처리 시스템을 만든다고 합시다. 고객이 "내 주문 취소하고 환불받고 싶어요"라고 하면, 플래너는 "1.
주문 번호 확인 → 2. 취소 가능 여부 검증 → 3.
취소 처리 → 4. 환불 신청"이라는 계획을 세웁니다.
만약 이미 배송이 시작되어 취소가 불가능하면, "2. 반품 절차 안내 → 3.
반품 접수 → 4. 환불 신청"으로 계획을 수정합니다.
고객은 기다리기만 하면 모든 과정이 자동으로 처리됩니다. 주의할 점이 있습니다.
초보자들은 종종 너무 많은 기능을 한 클래스에 넣으려는 경향이 있습니다. 멀티 스텝 플래너는 조율자 역할만 해야 합니다.
실제 검색, 계산, 데이터베이스 접근 같은 기능은 별도의 도구로 분리하세요. 단일 책임 원칙을 지키면 코드가 훨씬 깔끔해집니다.
김개발 씨가 코드를 완성하고 테스트해봅니다. "회사 지난 분기 매출과 목표 비교해줘"라고 입력하자, 에이전트가 알아서 계획을 세우고, 데이터를 조회하고, 계산해서 답을 내놓습니다.
"완전 자동이네요!" 멀티 스텝 플래너를 구현하면 복잡한 업무 자동화가 가능해집니다. 여러분만의 똑똑한 에이전트를 만들어보세요.
실전 팁
💡 - 클래스를 상속받아 커스터마이징하기 쉽게 설계하세요.
- 로깅을 충분히 남겨서 각 단계를 추적 가능하게 하세요.
- 단위 테스트를 작성해서 각 메서드가 독립적으로 잘 동작하는지 확인하세요.
5. 실습: 복잡한 태스크 자동화
마지막으로 박시니어 씨가 실전 예제를 보여줍니다. "이제 진짜 복잡한 작업을 자동화해볼까요?" 김개발 씨의 눈이 반짝입니다.
"시장 조사 리포트 자동 생성 같은 걸로요?"
복잡한 태스크 자동화는 멀티 스텝 플래너에 다양한 도구를 연결해 실제 업무를 자동화하는 것입니다. 웹 검색, 데이터 분석, 문서 생성 등 여러 작업을 조합해 사람이 몇 시간 걸릴 일을 몇 분 만에 처리합니다.
다음 코드를 살펴봅시다.
from langchain.tools import WikipediaQueryRun, DuckDuckGoSearchRun
from langchain.utilities import WikipediaAPIWrapper
# 도구 모음 구성
tools = [
Tool(name="Search", func=DuckDuckGoSearchRun().run, description="실시간 정보 검색"),
Tool(name="Wikipedia", func=WikipediaQueryRun(api_wrapper=WikipediaAPIWrapper()).run, description="백과사전 정보"),
]
# 복잡한 태스크 실행
planner = MultiStepPlanner(llm, tools)
question = """
경쟁사 3곳의 최신 제품 동향을 조사하고,
우리 회사 제품과 비교 분석한 리포트를 작성해주세요.
"""
# 자동 실행
result = planner.run(question)
print(result)
김개발 씨는 이제 멀티 스텝 플래너를 실전에 투입할 준비가 되었습니다. 마케팅 팀에서 요청이 들어왔습니다.
"경쟁사 분석 리포트를 매주 만들어야 하는데, 너무 시간이 오래 걸려요. 자동화할 수 있나요?" 박시니어 씨가 고개를 끄덕입니다.
"완벽한 유스케이스네요. 검색, 분석, 문서 작성을 모두 자동화해봅시다." 복잡한 태스크 자동화란 무엇일까요?
비유하자면, 이것은 마치 개인 비서를 고용하는 것과 같습니다. 당신이 "다음 주 회의 자료 준비해줘"라고 하면, 비서가 알아서 관련 자료를 수집하고, 정리하고, 프레젠테이션을 만듭니다.
당신은 최종 결과물만 검토하면 됩니다. 에이전트도 똑같이 복잡한 지시사항을 받아 여러 단계를 거쳐 최종 결과를 산출합니다.
이런 자동화가 없으면 어땠을까요? 마케터는 매주 금요일 오후를 경쟁사 분석에 써야 했습니다.
구글에서 뉴스를 검색하고, 엑셀에 정리하고, 워드로 리포트를 작성했습니다. 단순 반복 작업에 창의적인 시간이 소모되었습니다.
더 큰 문제는 사람이 하다 보니 깜빡하고 중요한 뉴스를 놓치기도 했다는 점입니다. 자동화 에이전트가 이 모든 것을 바꿉니다.
이 방식을 사용하면 사람은 전략적인 일에 집중할 수 있습니다. 또한 일관된 품질의 결과물을 얻습니다.
무엇보다 24시간 언제든 실행 가능하다는 장점이 있습니다. 코드를 살펴봅시다.
5번째 줄에서 도구 목록을 만듭니다. 웹 검색 도구와 위키피디아 도구를 추가했습니다.
실무에서는 데이터베이스 조회, API 호출, 파일 읽기 등 더 많은 도구를 추가할 수 있습니다. 12번째 줄에서 플래너를 초기화하고, 13번째 줄의 복잡한 질문을 봅시다.
이것은 사실 여러 단계를 포함합니다. "경쟁사 조사 + 우리 제품 정보 수집 + 비교 분석 + 리포트 작성"입니다.
19번째 줄에서 run 메서드 하나로 모든 과정이 실행됩니다. 실제 동작을 상상해봅시다.
에이전트는 먼저 "경쟁사 3곳 제품 동향 조사"라는 계획을 세웁니다. 1단계로 경쟁사 A를 검색 도구로 조사하고, 2단계로 경쟁사 B를 조사합니다.
3단계에서 우리 회사 제품 정보를 데이터베이스에서 가져옵니다. 4단계에서 비교 분석을 수행하고, 5단계에서 마크다운 형식의 리포트를 생성합니다.
만약 중간에 검색 결과가 없으면, 위키피디아로 전환하는 재계획도 자동으로 일어납니다. 주의할 점도 있습니다.
복잡한 태스크일수록 중간 결과를 검증하는 로직이 필요합니다. 예를 들어 검색 결과가 관련 없는 내용이면, 다시 검색하도록 해야 합니다.
또한 최종 결과물의 품질을 평가하는 단계를 추가하는 것도 좋습니다. LLM에게 "이 리포트가 요구사항을 만족하는가?"라고 물어보고, 부족하면 보완하도록 할 수 있습니다.
김개발 씨가 코드를 실행합니다. 몇 분 후, 경쟁사 3곳의 최신 제품 정보와 우리 제품 비교가 담긴 깔끔한 리포트가 생성됩니다.
마케팅 팀이 환호합니다. "이제 금요일 오후를 전략 회의에 쓸 수 있겠어요!" 복잡한 태스크 자동화를 마스터하면 반복적인 업무에서 해방됩니다.
여러분의 조직을 더 생산적으로 만들어보세요.
실전 팁
💡 - 처음에는 간단한 태스크로 시작해서 점진적으로 복잡도를 높이세요.
- 각 도구의 실행 시간을 측정해서 병목 지점을 파악하세요.
- 사용자 피드백을 받아 계획 템플릿을 개선하세요.
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
Tool-Augmented Agents 완벽 가이드
LLM에 도구를 연결하여 검색, API 호출, 계산 등 실제 작업을 수행하는 에이전트를 만드는 방법을 초급 개발자도 쉽게 이해할 수 있도록 설명합니다. 실무에서 바로 활용할 수 있는 멀티 툴 에이전트와 API 통합 예제를 포함합니다.
Tree of Thoughts 에이전트 완벽 가이드
AI 에이전트가 복잡한 문제를 해결할 때 여러 사고 경로를 탐색하고 평가하는 Tree of Thoughts 기법을 배웁니다. BFS/DFS 탐색 전략부터 가지치기, 백트래킹까지 실전 예제와 함께 쉽게 설명합니다.
Reflection과 Self-Correction 완벽 가이드
AI 에이전트가 스스로 생각하고 개선하는 방법을 배웁니다. Reflection 패턴을 통해 실패로부터 학습하고, 자기 평가를 통해 더 나은 결과를 만들어내는 실전 기법을 익혀봅니다.
ReAct 패턴 마스터 완벽 가이드
LLM이 생각하고 행동하는 ReAct 패턴을 처음부터 끝까지 배웁니다. Thought-Action-Observation 루프로 똑똑한 에이전트를 만들고, 실전 예제로 웹 검색과 계산을 결합한 강력한 AI 시스템을 구축합니다.
AI 에이전트의 모든 것 - 개념부터 실습까지
AI 에이전트란 무엇일까요? 단순한 LLM 호출과 어떻게 다를까요? 초급 개발자를 위해 에이전트의 핵심 개념부터 실제 구현까지 이북처럼 술술 읽히는 스타일로 설명합니다.