콘텐츠로 이동

훈련 (Training)

크루가 맡은 일이 반복적이라면, 매번 똑같은 지적을 받는 건 꽤 답답하죠. crewAI의 훈련(training) 기능은 이 흐름을 줄여줘요. 사람이 피드백을 주는 동안 에이전트가 그 지적을 학습하고, 다음 실행부터는 별도 설정을 바꾸지 않아도 같은 실수를 덜 하도록 만들어줍니다. 명령줄(CLI)로 시작해서, 코드 안에서도 같은 기능을 쓸 수 있어요.

CLI로 크루 훈련하기

기본 사용법은 크루 프로젝트가 있는 디렉터리에서 crewai train 명령을 실행하는 거예요.

crewai train -n <n_iterations> -f <filename.pkl>
  • <n_iterations>: 훈련 반복 횟수
  • <filename>: 결과를 저장할 파일 이름(.pkl로 끝나야 해요)

-f를 생략하면 현재 작업 디렉터리(CWD)에 trained_agents_data.pkl 로 저장돼요. 파일 위치를 직접 지정하고 싶다면 절대 경로도 넣을 수 있어요.

코드로 크루 훈련하기

CLI 대신 파이썬 코드 안에서 훈련을 돌리려면, train(...) 메서드를 호출하는 흐름을 쓰면 돼요. 반복 횟수와 입력값을 정하고, 오류가 나도 잡을 수 있도록 try-except로 감싸는 게 기본 패턴이에요.

n_iterations = 2
inputs = {"topic": "CrewAI Training"}
filename = "your_model.pkl"

try:
    YourCrewName_Crew().crew().train(
        n_iterations=n_iterations,
        inputs=inputs,
        filename=filename
    )
except Exception as e:
    raise Exception(f"An error occurred while training the crew: {e}")

이 시점에서 잠깐 짚고 넘어갈 부분이 있어요. 훈련은 프롬프트 입력을 받는 대화형(interactive) 방식이라서, 훈련을 돌리는 환경에서 사용자가 입력을 줄 수 없으면 실행이 멈춰요. 예를 들어 완전 자동화된 서버에서는 진행이 막힐 수 있으니, 훈련은 사람이 직접 피드백을 줄 수 있는 환경에서 돌리는 게 맞아요.

훈련 데이터가 에이전트에 어떻게 쓰이나요

훈련으로 만들어진 산출물은 두 단계에서 사용돼요. 훈련 중에는 사람 피드백을 에이전트에 반영하고, 훈련 후에는 정리된 제안을 다음 실행에 적용해요.

훈련 중에는

반복이 진행될 때마다 시스템이 각 에이전트에 대해 세 가지를 기록해요.

  • initial_output: 에이전트가 처음에 낸 답
  • human_feedback: 프롬프트로 요청했을 때 준 인라인 피드백
  • improved_output: 피드백을 받고 에이전트가 다시 낸 답

이 데이터는 training_data.pkl이라는 작업 파일에, 에이전트 내부 ID와 반복 횟수를 키로 저장돼요. 훈련이 활성화된 동안에는 에이전트가 이전 피드백을 자동으로 프롬프트에 붙여서, 세션 안에서는 그 지시를 계속 따르도록 강제합니다.

훈련이 끝나면

train(...)이 끝나면 훈련 중 모은 데이터를 에이전트별로 평가해서, 하나로 합쳐진 결과를 만들어요.

  • suggestions: 피드백과 개선 전·후 출력의 차이에서 추려 낸 명확한 실행 지침
  • quality: 개선 정도를 나타내는 0~10 점수
  • final_summary: 이후 작업을 위한 단계별 액션 아이템

이 결과는 train(...)에 넘긴 파일 이름으로 저장돼요(CLI 기본값은 trained_agents_data.pkl). 항목은 에이전트의 role을 키로 하기 때문에, 세션이 달라져도 그 역할에는 동일한 교훈이 적용돼요.

그리고 훈련이 끝나 일반 실행으로 돌아가면, 각 에이전트가 자동으로 저장된 suggestions를 불러와 작업 프롬프트에 '필수 지시사항'으로 붙입니다. 에이전트 정의(파이썬/YAML 설정)를 하나도 바꾸지 않아도 일관된 개선이 적용되는 게 포인트예요.

결과 파일 요약

  • training_data.pkl (임시, 세션별)
  • 구조: agent_id -> { iteration_number: { initial_output, human_feedback, improved_output } }
  • 용도: 훈련 중의 원시 데이터와 사람 피드백을 담음
  • 위치: 현재 작업 디렉터리(CWD)
  • trained_agents_data.pkl (또는 직접 지정한 파일명)
  • 구조: agent_role -> { suggestions: string[], quality: number, final_summary: string }
  • 용도: 이후 실행에 쓸 정리된 지침을 영속적으로 보관
  • 위치: 기본은 CWD, -f로 절대 경로 포함 원하는 위치 지정 가능

작은 언어 모델(SLM)에서의 주의점

훈련 데이터를 평가하는 모델로 7B 파라미터 이하의 작은 모델을 쓰면 몇 가지 한계가 생겨요. 구조화된 출력을 만들어내기 어려워 JSON 파싱 오류나 데이터 누락이 생기기 쉽고, 평가의 뉘앙스나 추론 깊이가 부족하며, 복잡한 평가 기준을 끝까지 따르지 못하거나 반복 간 일관성이 떨어질 수 있어요.

품질 좋은 훈련 결과를 원한다면 7B 이상의 모델을 권장해요.

from crewai import Agent, Crew, Task, LLM

# 훈련 평가의 권장 최소 모델
llm = LLM(model="mistral/open-mistral-7b")

# 더 안정적인 평가를 원한다면
llm = LLM(model="anthropic/claude-3-sonnet-20240229-v1:0")
llm = LLM(model="gpt-4o")

# 이 LLM을 에이전트에 연결
agent = Agent(
    role="Training Evaluator",
    goal="Provide accurate training feedback",
    llm=llm
)

강력한 모델일수록 더 깊은 추론으로 높은 품질의 피드백을 주고, 훈련 반복도 더 효과적으로 만들어요. 어쩔 수 없이 작은 모델을 써야 한다면 제약을 염두에 두세요.

# 작은 모델 사용 (어느 정도 한계가 있을 수 있어요)
llm = LLM(model="huggingface/microsoft/Phi-3-mini-4k-instruct")

crewAI가 작은 모델용 최적화를 일부 포함하긴 하지만, 평가 결과의 신뢰도와 정교함은 떨어질 수 있고 훈련 중 사람 개입이 더 필요할 수 있어요.

실무 관점

  • 훈련은 결국 '사람 피드백'이 핵심이에요. 반복 횟수마다 피드백을 줘야 하니, 자동화 환경에서는 실행이 멈출 수 있다는 점을 처음부터 알고 가는 게 중요해요.
  • SLM으로 훈련 평가를 돌리지 마세요. 7B 미만 모델은 구조화 출력과 일관된 평가가 약해서 결과가 들쭉날쭉해지기 쉬워요. 평가용 LLM은 llm 파라미터로 명시해서 강한 모델을 쓰는 걸 추천해요.
  • 지침은 프롬프트 시점에 적용돼요. 에이전트 정의 파일을 고치지 않아도 개선이 반영되지만, 그만큼 훈련 결과가 어디 저장됐는지(trained_agents_data.pkl 경로)를 정확히 관리해야 해요. 저장 파일명을 바꿨다면 Crew(trained_agents_file="my_custom_trained.pkl"), 환경변수 CREWAI_TRAINED_AGENTS_FILE, 또는 crewai run -f my_custom_trained.pkl로 다시 연결해야 해요.
  • 반드시 지켜야 할 입력 조건이 있어요. n_iterations는 양의 정수, 파일명은 .pkl로 끝나야 하며, 이 조건을 어기면 ValueError가 발생해요.
  • 재훈련 주기를 정해 두세요. 에이전트가 최신 정보와 발전을 따라가도록 정기적으로 다시 훈련하는 습관이 좋아요.

더 알아보기