효과적인 AI 에이전트 구축하기
요약: 이 기사는 Anthropic이 다양한 팀들과 협력하며 얻은 에이전트 구축에 대한 실질적인 가이드를 제공합니다. 가장 성공적인 구현은 복잡한 프레임워크가 아닌 간단하고 조합 가능한 패턴을 사용한다는 것을 강조합니다. 워크플로우와 에이전트의 차이, 다양한 워크플로우 패턴(체이닝, 라우팅, 병렬화, 오케스트레이터-워커, 평가자-최적화자), 그리고 자율 에이전트 사용 시기에 대해 상세히 설명합니다.
에이전트란 무엇인가요?
“에이전트”는 여러 가지 방식으로 정의될 수 있습니다. 어떤 고객들은 에이전트를 복잡한 작업을 완료하기 위해 다양한 도구를 사용하며 장기간 독립적으로 작동하는 완전 자율 시스템으로 정의합니다. 다른 고객들은 미리 정의된 워크플로우를 따르는 더 규범적인 구현을 설명하는 데 이 용어를 사용합니다. Anthropic에서는 이러한 모든 변형을 에이전틱 시스템으로 분류하지만, 워크플로우와 에이전트 사이에는 중요한 아키텍처적 차이를 둡니다.
- 워크플로우는 LLM과 도구가 미리 정의된 코드 경로를 통해 오케스트레이션되는 시스템입니다.
- 에이전트는 반면 LLM이 자신의 프로세스와 도구 사용을 동적으로 제어하며, 작업을 완료하는 방식에 대한 제어권을 유지하는 시스템입니다.
아래에서는 두 가지 유형의 에이전틱 시스템을 자세히 살펴보겠습니다. 부록 1(“실제 에이전트”)에서는 고객이 이러한 종류의 시스템 사용에서 특히 가치를 발견한 두 가지 도메인에 대해 설명합니다.
에이전트를 사용할 때와 사용하지 않을 때
LLM으로 애플리케이션을 구축할 때, 가능한 가장 간단한 솔루션을 찾고 필요할 때만 복잡성을 높이는 것을 권장합니다. 이는 에이전틱 시스템을 전혀 구축하지 않는다는 것을 의미할 수 있습니다. 에이전틱 시스템은 종종 더 나은 작업 성능을 위해 지연 시간과 비용을 교환하며, 이 교환이 언제 타당한지 고려해야 합니다.
더 많은 복잡성이 필요한 경우, 워크플로우는 잘 정의된 작업에 대한 예측 가능성과 일관성을 제공하는 반면, 에이전트는 대규모로 유연성과 모델 기반 의사결정이 필요할 때 더 나은 옵션입니다. 그러나 많은 애플리케이션의 경우, 검색 및 문맥 내 예제로 단일 LLM 호출을 최적화하는 것으로 보통 충분합니다.
프레임워크를 사용할 때와 방법
에이전틱 시스템 구현을 더 쉽게 만드는 많은 프레임워크가 있습니다.
이러한 프레임워크는 LLM 호출, 도구 정의 및 파싱, 호출 연결과 같은 표준 저수준 작업을 단순화하여 쉽게 시작할 수 있게 합니다. 그러나 그들은 종종 기본 프롬프트와 응답을 모호하게 만드는 추가 추상화 계층을 만들어 디버깅을 더 어렵게 만듭니다. 또한 더 간단한 설정으로 충분한 상황에서 복잡성을 추가하고 싶게 만들 수도 있습니다.
우리는 개발자가 LLM API를 직접 사용하여 시작하는 것을 제안합니다. 많은 패턴은 몇 줄의 코드로 구현할 수 있습니다. 프레임워크를 사용하는 경우, 기본 코드를 이해하는지 확인하세요. 내부 작동에 대한 잘못된 가정은 고객 오류의 일반적인 원인입니다.
샘플 구현은 우리의 쿡북을 참조하세요.
빌딩 블록, 워크플로우 및 에이전트
이 섹션에서는 우리가 프로덕션에서 본 에이전틱 시스템의 일반적인 패턴을 살펴보겠습니다. 우리의 기본 빌딩 블록인 확장된 LLM부터 시작하여 간단한 조합 워크플로우에서 자율 에이전트까지 복잡성을 점진적으로 높이겠습니다.
빌딩 블록: 확장된 LLM
에이전틱 시스템의 기본 빌딩 블록은 검색, 도구, 메모리와 같은 확장 기능으로 향상된 LLM입니다. 우리의 현재 모델은 이러한 기능을 적극적으로 사용할 수 있습니다 — 자신의 검색 쿼리를 생성하고, 적절한 도구를 선택하며, 유지할 정보를 결정합니다.
구현의 두 가지 핵심 측면에 집중하는 것을 권장합니다. 이러한 기능을 특정 사용 사례에 맞게 조정하고, LLM을 위해 쉽고 잘 문서화된 인터페이스를 제공하는 것입니다. 이러한 확장을 구현하는 방법은 많지만, 한 가지 접근 방식은 최근에 출시된 모델 컨텍스트 프로토콜을 통한 것입니다. 이 프로토콜을 통해 개발자는 간단한 클라이언트 구현으로 성장하는 타사 도구 생태계와 통합할 수 있습니다.
이 게시물의 나머지 부분에서는 각 LLM 호출이 이러한 확장 기능에 액세스할 수 있다고 가정합니다.
워크플로우: 프롬프트 체이닝
프롬프트 체이닝은 작업을 일련의 단계로 분해하며, 각 LLM 호출은 이전 단계의 출력을 처리합니다. 프로세스가 올바른 트랙에 있는지 확인하기 위해 모든 중간 단계에 프로그래밍 방식 검사(아래 다이어그램의 “게이트” 참조)를 추가할 수 있습니다.
이 워크플로우를 사용할 때: 이 워크플로우는 작업이 고정된 하위 작업으로 쉽고 깔끔하게 분해될 수 있는 상황에 이상적입니다. 주요 목표는 각 LLM 호출을 더 쉬운 작업으로 만들어 지연 시간을 더 높은 정확도로 교환하는 것입니다.
프롬프트 체이닝이 유용한 예시:
- 마케팅 카피를 생성한 다음 다른 언어로 번역합니다.
- 문서의 개요를 작성하고, 개요가 특정 기준을 충족하는지 확인한 다음, 개요를 기반으로 문서를 작성합니다.
워크플로우: 라우팅
라우팅은 입력을 분류하고 특화된 후속 작업으로 안내합니다. 이 워크플로우는 관심사의 분리를 가능하게 하고 더 특화된 프롬프트를 구축할 수 있습니다. 이 워크플로우가 없으면 한 종류의 입력에 최적화하면 다른 입력의 성능이 저하될 수 있습니다.
이 워크플로우를 사용할 때: 라우팅은 개별적으로 처리하는 것이 더 나은 고유한 범주가 있는 복잡한 작업과 LLM 또는 더 전통적인 분류 모델/알고리즘으로 분류를 정확하게 처리할 수 있는 작업에 잘 작동합니다.
라우팅이 유용한 예시:
- 다른 유형의 고객 서비스 쿼리(일반 질문, 환불 요청, 기술 지원)를 다른 다운스트림 프로세스, 프롬프트 및 도구로 안내합니다.
- 쉬운/일반적인 질문은 Claude Haiku 4.5와 같은 더 작고 비용 효율적인 모델로, 어려운/비일반적인 질문은 Claude Sonnet 4.5와 같은 더 capable한 모델로 라우팅하여 최적의 성능을 최적화합니다.
워크플로우: 병렬화
LLM은 때때로 동시에 작업을 수행하고 출력을 프로그래밍 방식으로 집계할 수 있습니다. 병렬화라는 이 워크플로우는 두 가지 주요 변형으로 나타납니다.
- 섹셔닝: 병렬로 실행되는 독립적인 하위 작업으로 작업을 분해합니다.
- 투표: 다양한 출력을 얻기 위해 동일한 작업을 여러 번 실행합니다.
이 워크플로우를 사용할 때: 병렬화는 분할된 하위 작업이 속도를 위해 병렬화될 수 있거나 더 높은 신뢰도 결과를 위해 여러 관점이나 시도가 필요할 때 효과적입니다. 여러 고려 사항이 있는 복잡한 작업의 경우, LLM은 일반적으로 각 고려 사항이 개별 LLM 호출로 처리될 때 더 잘 수행하며, 각 특정 측면에 집중할 수 있습니다.
병렬화가 유용한 예시:
- 섹셔닝:
- 한 모델 인스턴스는 사용자 쿼리를 처리하는 동안 다른 인스턴스는 부적절한 콘텐츠 또는 요청에 대해 검색하는 가드레일을 구현합니다. 이는 동일한 LLM 호출이 가드레일과 핵심 응답을 모두 처리하는 것보다 더 잘 수행하는 경향이 있습니다.
- 각 LLM 호출이 주어진 프롬프트에 대한 모델 성능의 다른 측면을 평가하는 LLM 성능 평가를 자동화합니다.
- 투표:
- 여러 다른 프롬프트가 코드를 검토하고 문제를 찾으면 플래그를 지정하는 코드의 취약점을 검토합니다.
- 여러 프롬프트가 다른 측면을 평가하거나 오탐 및 위음의 균형을 맞추기 위해 다른 투표 임계값을 요구하는 주어진 콘텐츠가 부적절한지 평가합니다.
워크플로우: 오케스트레이터-워커
오케스트레이터-워커 워크플로우에서 중앙 LLM은 작업을 동적으로 분해하고, 워커 LLM에 위임하며, 그 결과를 종합합니다.
이 워크플로우를 사용할 때: 이 워크플로우는 필요한 하위 작업을 예측할 수 없는 복잡한 작업에 적합합니다(예: 코딩에서, 변경해야 하는 파일 수와 각 파일에서 변경의 성격은 작업에 따라 달라질 수 있습니다). 위상적으로 유사하지만 병렬화와의 핵심 차이점은 유연성입니다 — 하위 작업은 미리 정의되지 않고 오케스트레이터가 특정 입력을 기반으로 결정합니다.
오케스트레이터-워커가 유용한 예시:
- 매번 여러 파일에 복잡한 변경을 수행하는 코딩 제품.
- 가능한 관련 정보에 대해 여러 소스에서 정보를 수집하고 분석하는 검색 작업.
워크플로우: 평가자-최적화자
평가자-최적화자 워크플로우에서 한 LLM 호출은 응답을 생성하고 다른 하나는 루프에서 평가와 피드백을 제공합니다.
이 워크플로우를 사용할 때: 이 워크플로우는 명확한 평가 기준이 있고 반복적 개선이 측정 가능한 가치를 제공할 때 특히 효과적입니다. 적합한 두 가지 징후는, 첫째, 인간이 피드백을 표현할 때 LLM 응답이 실질적으로 향상될 수 있다는 것이고, 둘째, LLM이 그러한 피드백을 제공할 수 있다는 것입니다. 이는 인간 작성자가 세련된 문서를 생성할 때 거치는 반복적인 쓰기 프로세스와 유사합니다.
평가자-최적화자가 유용한 예시:
- 번역자 LLM이 처음에는 포착하지 못할 수 있지만 평가자 LLM이 유용한 비판을 제공할 수 있는 뉘앙스가 있는 문학 번역.
- 평가자가 추가 검색이 필요한지 결정하는 포괄적인 정보를 수집하기 위해 여러 라운드의 검색과 분석이 필요한 복잡한 검색 작업.
에이전트
에이전트는 LLM이 복잡한 입력 이해, 추론 및 계획 수립, 도구 신뢰성 있는 사용, 오류 복구와 같은 핵심 기능에서 성숙함에 따라 프로덕션에서 등장하고 있습니다. 에이전트는 인간 사용자의 명령이나 대화를 통해 작업을 시작합니다. 작업이 명확해지면 에이전트는 독립적으로 계획하고 작동하며, 추가 정보나 판단을 위해 인간에게 돌아갈 수 있습니다. 실행 중 에이전트는 진행 상황을 평가하기 위해 각 단계에서 환경에서 “기본 진실”(도구 호출 결과 또는 코드 실행 등)을 얻는 것이 중요합니다. 에이전트는 체크포인트나 차단을 만났을 때 인간 피드백을 위해 일시 중지할 수 있습니다. 작업은 완료 시 종종 종료되지만, 제어를 유지하기 위해 중지 조건(최대 반복 횟수 등)을 포함하는 것도 일반적입니다.
에이전트는 정교한 작업을 처리할 수 있지만 구현은 종종 간단합니다. 그들은 일반적으로 환경 피드백을 기반으로 루프에서 도구를 사용하는 LLM입니다. 따라서 도구 세트와 문서를 명확하고 신중하게 설계하는 것이 중요합니다. 부록 2(“도구 프롬프트 엔지니어링”)에서 도구 개발에 대한 모범 사례를 확장합니다.
에이전트를 사용할 때: 에이전트는 필요한 단계 수를 예측하기 어렵거나 불가능하고 고정된 경로를 하드코딩할 수 없는 열린 문제에 사용할 수 있습니다. LLM은 여러 턴 동안 작동할 수 있으며 의사결정에 대해 어느 정도 신뢰가 있어야 합니다. 에이전트의 자율성은 신뢰할 수 있는 환경에서 작업을 확장하기에 이상적입니다.
에이전트의 자율적 특성은 더 높은 비용과 오류가 누적될 가능성을 의미합니다. 샌드박스 환경에서 광범위한 테스트와 적절한 가드레일을 권장합니다.
에이전트가 유용한 예시:
다음 예시는 우리 자체 구현에서 가져온 것입니다.
- 작업 설명에 따라 여러 파일을 편집하는 SWE-bench 작업을 해결하는 코딩 에이전트.
- Claude가 컴퓨터를 사용하여 작업을 완료하는 “컴퓨터 사용” 참조 구현.
이 패턴 결합 및 사용자 정의
이 빌딩 블록은 규범적이지 않습니다. 그들은 개발자가 다른 사용 사례에 맞게 형성하고 결합할 수 있는 일반적인 패턴입니다. 성공의 핵심은 모든 LLM 기능과 마찬가지로 성능을 측정하고 구현을 반복하는 것입니다. 반복합니다: 단순한 솔루션이 부족할 때만 복잡성을 추가하는 것을 고려해야 합니다.
요약
LLM 공간에서의 성공은 가장 정교한 시스템을 구축하는 것이 아닙니다. 사용자의 요구에 맞는 올바른 시스템을 구축하는 것입니다. 간단한 프롬프트로 시작하고, 포괄적인 평가로 최적화하며, 더 간단한 솔루션이 부족할 때만 다단계 에이전틱 시스템을 추가하세요.
에이전트를 구현할 때 우리는 세 가지 핵심 원칙을 따르려고 합니다.
- 에이전트 설계의 단순성을 유지하세요.
- 에이전트의 계획 단계를 명시적으로 표시하여 투명성을 우선시하세요.
- 철저한 도구 문서화 및 테스트를 통해 에이전트-컴퓨터 인터페이스(ACI)를 신중하게 만드세요.
프레임워크는 빠르게 시작하는 데 도움이 되지만, 프로덕션으로 이동할 때 추상화 계층을 줄이고 기본 구성 요소로 구축하는 데 주저하지 마세요. 이러한 원칙을 따르면 강력할 뿐만 아니라 신뢰할 수 있고 유지 관리 가능하며 사용자에게 신뢰받는 에이전트를 만들 수 있습니다.
감사의 말씀
Erik Schluntz와 Barry Zhang이 작성했습니다. 이 작업은 Anthropic에서 에이전트를 구축하는 우리의 경험과 고객이 공유한 귀중한 통찰력을 바탕으로 하며, 이에 깊이 감사드립니다.
부록 1: 실제 에이전트
고객과의 작업에서 위에서 논의한 패턴의 실제 가치를 입증하는 AI 에이전트를 위한 두 가지 특히 유망한 애플리케이션을 발견했습니다. 두 애플리케이션 모두 대화와 작업이 모두 필요하고, 명확한 성공 기준이 있으며, 피드백 루프를 가능하게 하고, 의미 있는 인간 감독을 통합하는 작업에서 에이전트가 가장 많은 가치를 추가하는 방법을 보여줍니다.
A. 고객 지원
고객 지원은 도구 통합을 통해 향상된 기능과 익숙한 챗봇 인터페이스를 결합합니다. 이는 다음과 같은 이유로 더 개방적인 에이전트에 자연스럽게 맞습니다.
- 지원 상호작용은 외부 정보 및 작업에 대한 액세스가 필요하면서 자연스럽게 대화 흐름을 따릅니다.
- 도구를 통합하여 고객 데이터, 주문 내역 및 지식 베이스 문서를 가져올 수 있습니다.
- 환불 발행 또는 티켓 업데이트와 같은 작업을 프로그래밍 방식으로 처리할 수 있습니다.
- 성공은 사용자 정의 해결을 통해 명확하게 측정할 수 있습니다.
여러 회사가 성공적인 해결에 대해서만 요금을 청구하는 사용량 기반 가격 모델을 통해 이 접근 방식의 타당성을 입증했으며, 에이전트의 효과에 대한 자신감을 보여줍니다.
B. 코딩 에이전트
소프트웨어 개발 공간은 코드 완성에서 자율 문제 해결로 능력이 발전하면서 LLM 기능에 대한 놀라운 잠재력을 보여주었습니다. 에이전트는 다음과 같은 이유로 특히 효과적입니다.
- 코드 솔루션은 자동화된 테스트를 통해 검증할 수 있습니다.
- 에이전트는 테스트 결과를 피드백으로 사용하여 솔루션을 반복할 수 있습니다.
- 문제 공간은 잘 정의되고 구조화되어 있습니다.
- 출력 품질을 객관적으로 측정할 수 있습니다.
우리 자체 구현에서 에이전트는 이제 PR 설명만을 기반으로 SWE-bench Verified 벤치마크에서 실제 GitHub 이슈를 해결할 수 있습니다. 그러나 자동화된 테스트는 기능을 확인하는 데 도움이 되지만, 솔루션이 더 광범위한 시스템 요구 사항과 일치하는지 확인하기 위해 인간 검토는 여전히 중요합니다.
부록 2: 도구 프롬프트 엔지니어링
어떤 에이전틱 시스템을 구축하든 도구는 에이전트의 중요한 부분이 될 것입니다. 도구는 Claude가 API에서 정확한 구조와 정의를 지정하여 외부 서비스 및 API와 상호 작용할 수 있게 합니다. Claude가 응답할 때 도구를 호출할 계획이 있으면 API 응답에 도구 사용 블록이 포함됩니다. 도구 정의 및 사양은 전체 프롬프트만큼 많은 프롬프트 엔지니어링 주의를 기울여야 합니다. 이 짧은 부록에서는 도구를 프롬프트 엔지니어링하는 방법에 대해 설명합니다.
동일한 작업을 지정하는 방법은 종종 여러 가지가 있습니다. 예를 들어, diff를 작성하거나 전체 파일을 다시 작성하여 파일 편집을 지정할 수 있습니다. 구조화된 출력의 경우 마크다운이나 JSON 내에 코드를 반환할 수 있습니다. 소프트웨어 엔지니어링에서 이러한 차이는 미용적이며 한 형식에서 다른 형식으로 무손실로 변환할 수 있습니다. 그러나 일부 형식은 다른 형식보다 LLM이 작성하기가 훨씬 더 어렵습니다. diff를 작성하려면 새 코드를 작성하기 전에 청크 헤더에서 변경되는 줄 수를 알아야 합니다. JSON(마크다운과 비교) 내에 코드를 작성하려면 줄 바꿈과 따옴표를 추가로 이스케이프해야 합니다.
도구 형식을 결정하기 위한 제안은 다음과 같습니다.
- 모델이 코너에 들어가기 전에 “생각”할 수 있는 충분한 토큰을 제공하세요.
- 형식을 모델이 인터넷의 텍스트에서 자연스럽게 발생하는 것에 가깝게 유지하세요.
- 수천 줄의 코드를 정확하게 계산하거나 작성하는 모든 코드를 문자열 이스케이프해야 하는 것과 같은 형식 “오버헤드”가 없는지 확인하세요.
한 가지 경험 법칙은 인간-컴퓨터 인터페이스(HCI)에 들어가는 노력을 생각하고, 좋은 에이전트-컴퓨터 인터페이스(ACI)를 만드는 것에 동등한 노력을 투자하는 계획을 세우는 것입니다. 이를 위한 몇 가지 생각은 다음과 같습니다.
- 모델의 입장이 되어보세요. 설명과 매개변수를 기반으로 이 도구를 사용하는 것이 명확한가요, 아니면 신중하게 생각해야 하나요? 그렇다면 모델에게도 마찬가지일 것입니다. 좋은 도구 정의는 종종 예제 사용, 경계 케이스, 입력 형식 요구 사항 및 다른 도구와의 명확한 경계를 포함합니다.
- 매개변수 이름이나 설명을 변경하여 명확하게 만들 수 있나요? 팀의 주니어 개발자를 위한 훌륭한 docstring을 작성하는 것으로 생각하세요. 이는 특히 많은 유사한 도구를 사용할 때 중요합니다.
- 모델이 도구를 사용하는 방법을 테스트하세요. 워크벤치에서 많은 예제 입력을 실행하여 모델이 어떤 실수를 하는지 확인하고 반복하세요.
- 도구를 포카요ke(poka-yoke)하세요. 인수를 변경하여 실수를하기 어렵게 만드세요.
SWE-bench에 대한 에이전트를 구축하는 동안 우리는 실제로 전체 프롬프트보다 도구를 최적화하는 데 더 많은 시간을 보냈습니다. 예를 들어, 에이전트가 루트 디렉토리에서 벗어난 후 상대 파일 경로를 사용하는 도구로 실수를 한다는 것을 발견했습니다. 이를 해결하기 위해 도구를 항상 절대 파일 경로를 요구하도록 변경했으며, 모델이 이 방법을 완벽하게 사용한다는 것을 발견했습니다.
핵심 포인트
- 가장 성공적인 에이전트 구현은 복잡한 프레임워크가 아닌 간단하고 조합 가능한 패턴을 사용한다
- 워크플로우(미리 정의된 경로)와 에이전트(동적으로 스스로 제어)를 명확히 구분해야 한다
- 필요할 때만 복잡성을 추가하고, 가능한 가장 간단한 솔루션을 우선적으로 찾아야 한다
- 5가지 주요 워크플로우 패턴: 체이닝, 라우팅, 병렬화, 오케스트레이터-워커, 평가자-최적화자
- 에이전트 구현 시 단순성, 투명성, 철저한 도구 문서화/테스트의 3가지 원칙을 따라야 한다