- Anthropic의 현장 경험상 성공적인 LLM 에이전트는 복잡한 프레임워크보다 단순하고 조합 가능한 패턴에서 출발하는 경우가 많음
- 에이전트형 시스템은 정해진 코드 경로를 따르는 워크플로우와, LLM이 절차와 도구 사용을 동적으로 결정하는 에이전트로 나뉨
- 많은 LLM 애플리케이션은 단일 LLM 호출에 검색과 인컨텍스트 예시를 더하는 수준으로 충분하며, 복잡도는 평가로 효과가 확인될 때만 늘려야 함
- 프레임워크는 시작을 빠르게 해주지만 프롬프트와 응답을 가리는 추상화 계층 때문에 디버깅을 어렵게 만들 수 있음
- 자율 에이전트는 개방형 문제에 강하지만 비용 증가와 오류 누적 위험이 있어 샌드박스 테스트, 가드레일, 명확한 도구 설계가 필요함
에이전트형 시스템의 기본 구분
- 에이전트형 시스템은 장기간 독립적으로 동작하는 완전 자율 시스템부터, 미리 정의된 워크플로우를 따르는 구현까지 넓게 쓰이는 용어임
- Anthropic은 이 변형들을 모두 에이전트형 시스템으로 보되, 아키텍처상 두 가지로 나눔
- 워크플로우: LLM과 도구가 미리 정의된 코드 경로를 따라 오케스트레이션됨
- 에이전트: LLM이 작업 수행 방식, 절차, 도구 사용을 동적으로 지시하고 통제함
언제 에이전트를 쓸지 판단하는 기준
- LLM 애플리케이션은 가능한 가장 단순한 해법에서 시작하고, 필요할 때만 복잡도를 높이는 방식이 권장됨
- 에이전트형 시스템은 더 나은 작업 성능을 얻는 대신 지연 시간과 비용을 감수하는 구조이므로, 이 절충이 실제로 필요한지 먼저 확인해야 함
- 복잡도가 필요한 경우에도 선택 기준은 다름
- 잘 정의된 작업에는 워크플로우가 예측 가능성과 일관성을 제공함
- 대규모 유연성과 모델 주도 의사결정이 필요한 작업에는 에이전트가 더 적합함
- 많은 애플리케이션은 검색과 인컨텍스트 예시로 단일 LLM 호출을 최적화하는 것만으로 충분함
프레임워크 사용 기준
- 에이전트형 시스템 구현 도구로 Claude Agent SDK, Strands Agents SDK by AWS, Rivet, Vellum이 소개됨
- 이런 프레임워크는 LLM 호출, 도구 정의와 파싱, 호출 연결 같은 낮은 수준의 표준 작업을 단순화해 시작을 빠르게 만듦
- 다만 추가 추상화 계층은 실제 프롬프트와 응답을 가려 디버깅을 어렵게 할 수 있음
- 단순한 구성으로 충분한 상황에서도 불필요한 복잡도를 더하도록 유도할 수 있음
- 개발자는 우선 LLM API를 직접 사용하는 방식에서 시작하는 편이 좋음
- 많은 패턴은 몇 줄의 코드로 구현 가능함
- 프레임워크를 쓰더라도 내부 코드의 동작을 이해해야 함
- 내부 동작에 대한 잘못된 가정은 고객 오류의 흔한 원인임
- 샘플 구현은 cookbook에서 볼 수 있음
기본 빌딩 블록: 증강된 LLM
- 에이전트형 시스템의 기본 빌딩 블록은 검색, 도구, 메모리 같은 기능으로 강화된 증강 LLM임
- 현재 모델은 검색 쿼리를 직접 만들고, 적절한 도구를 선택하며, 어떤 정보를 유지할지 결정하는 방식으로 이런 기능을 능동적으로 사용할 수 있음
- 구현할 때는 두 가지에 집중해야 함
- 사용 사례에 맞게 기능을 조정함
- LLM이 쓰기 쉬운 문서화된 인터페이스를 제공함
- 한 구현 방식으로 Model Context Protocol이 소개됨
- 개발자는 간단한 client implementation을 통해 서드파티 도구 생태계와 통합할 수 있음
워크플로우 패턴
-
프롬프트 체이닝
- 프롬프트 체이닝은 작업을 순차 단계로 나누고, 각 LLM 호출이 이전 호출의 출력을 처리하는 방식임
- 중간 단계마다 프로그램적 검사를 넣어 프로세스가 정상 경로에 있는지 확인할 수 있음
- 작업이 고정된 하위 작업으로 깔끔하게 분해될 때 적합함
- 주요 절충은 지연 시간을 감수하는 대신 각 LLM 호출의 난도를 낮춰 정확도를 높이는 것임
- 예시
- 마케팅 문구 생성 후 다른 언어로 번역
- 문서 개요 작성, 기준 충족 여부 검사, 개요 기반 문서 작성
-
라우팅
- 라우팅은 입력을 분류한 뒤 전문화된 후속 작업으로 보내는 방식임
- 관심사를 분리하고 더 전문화된 프롬프트를 만들 수 있음
- 이 구조가 없으면 한 종류의 입력에 대한 최적화가 다른 입력의 성능을 해칠 수 있음
- 서로 다른 범주가 별도 처리에 적합하고, LLM 또는 전통적 분류 모델/알고리듬이 정확히 분류할 수 있을 때 잘 맞음
- 예시
- 일반 질문, 환불 요청, 기술 지원 같은 고객 서비스 쿼리를 서로 다른 프로세스, 프롬프트, 도구로 전달
- 쉬운·일반 질문은 Claude Haiku 4.5 같은 더 작고 비용 효율적인 모델로, 어렵거나 특이한 질문은 Claude Sonnet 4.5 같은 더 강력한 모델로 라우팅
-
병렬화
- 병렬화는 LLM이 한 작업을 동시에 처리하고 출력을 프로그램적으로 집계하는 방식임
- 두 가지 주요 변형이 있음
- 섹셔닝: 작업을 독립적인 하위 작업으로 나눠 병렬 실행
- 투표: 같은 작업을 여러 번 실행해 다양한 출력을 얻음
- 하위 작업을 나눠 속도를 높일 수 있거나, 더 높은 신뢰도를 위해 여러 관점이나 시도가 필요할 때 효과적임
- 복잡한 작업에서 각 고려 사항을 별도 LLM 호출이 담당하면 특정 측면에 더 집중할 수 있음
- 예시
- 한 모델 인스턴스가 사용자 쿼리를 처리하고 다른 인스턴스가 부적절한 콘텐츠나 요청을 검사하는 가드레일
- LLM 성능 평가에서 각 호출이 모델 성능의 서로 다른 측면을 평가
- 여러 프롬프트가 코드 취약점을 검토하고 문제가 발견되면 플래그 처리
- 콘텐츠 부적절성 평가에서 여러 프롬프트와 투표 임계값을 활용해 거짓 양성과 거짓 음성의 균형 조정
-
오케스트레이터-워커
- 오케스트레이터-워커는 중앙 LLM이 작업을 동적으로 분해하고, 워커 LLM에 위임한 뒤 결과를 종합하는 방식임
- 필요한 하위 작업을 사전에 예측할 수 없는 복잡한 작업에 적합함
- 병렬화와 비슷해 보이지만 핵심 차이는 유연성임
- 병렬화는 하위 작업이 미리 정의됨
- 오케스트레이터-워커는 입력에 따라 오케스트레이터가 하위 작업을 결정함
- 예시
- 매번 여러 파일에 복잡한 변경을 수행하는 코딩 제품
- 여러 출처에서 관련 가능성이 있는 정보를 수집하고 분석하는 검색 작업
-
평가자-최적화기
- 평가자-최적화기는 한 LLM 호출이 응답을 만들고, 다른 LLM 호출이 평가와 피드백을 제공하는 루프 구조임
- 명확한 평가 기준이 있고 반복 개선이 측정 가능한 가치를 제공할 때 특히 효과적임
- 잘 맞는 신호는 두 가지임
- 사람이 피드백을 명확히 표현하면 LLM 응답이 실제로 개선됨
- LLM이 그런 피드백을 제공할 수 있음
- 인간 작가가 다듬어진 문서를 만들 때 거치는 반복적 글쓰기 과정과 유사함
- 예시
- 번역 LLM이 처음에는 놓칠 수 있는 뉘앙스를 평가자 LLM이 비평하는 문학 번역
- 평가자가 추가 검색 필요 여부를 판단하는 복잡한 검색 작업
자율 에이전트
- 에이전트는 LLM이 복잡한 입력 이해, 추론과 계획, 안정적인 도구 사용, 오류 복구 능력을 갖추면서 프로덕션에서 쓰이기 시작함
- 작업은 사람의 명령이나 대화로 시작됨
- 작업이 명확해지면 에이전트가 계획을 세우고 독립적으로 동작함
- 추가 정보나 판단이 필요하면 사람에게 다시 돌아올 수 있음
- 실행 중에는 각 단계에서 환경으로부터 실제 검증 신호를 얻는 것이 중요함
- 예: 도구 호출 결과, 코드 실행 결과
- 이를 통해 진행 상황을 평가함
- 에이전트는 체크포인트나 막힘 상황에서 사람의 피드백을 위해 멈출 수 있음
- 작업은 완료 시 종료되는 경우가 많지만, 통제를 유지하기 위해 최대 반복 횟수 같은 정지 조건을 두는 것도 일반적임
- 구현 자체는 종종 단순함
- 에이전트는 대개 환경 피드백을 기반으로 루프 안에서 도구를 사용하는 LLM임
- 따라서 도구 세트와 문서를 명확하고 신중하게 설계해야 함
- 사용 조건
- 필요한 단계 수를 예측하기 어렵거나 불가능한 개방형 문제
- 고정 경로를 하드코딩할 수 없는 작업
- LLM이 여러 턴 동안 동작할 수 있고, 의사결정에 일정 수준의 신뢰가 필요한 상황
- 제약
- 자율성은 더 높은 비용과 오류 누적 가능성을 동반함
- 샌드박스 환경의 광범위한 테스트와 적절한 가드레일이 권장됨
- 예시
- 여러 파일 편집이 필요한 SWE-bench tasks를 해결하는 코딩 에이전트
- Claude가 컴퓨터를 사용해 작업을 수행하는 “computer use” reference implementation
패턴 조합과 커스터마이징
- 제시된 빌딩 블록은 고정된 처방이 아니라 개발자가 사용 사례에 맞게 조정하고 결합할 수 있는 공통 패턴임
- 성공의 핵심은 LLM 기능 전반과 마찬가지로 성능을 측정하고 구현을 반복 개선하는 데 있음
- 복잡도는 결과가 실제로 개선될 때만 추가해야 함
구현 원칙
- LLM 영역의 성공은 가장 정교한 시스템을 만드는 것이 아니라 필요에 맞는 올바른 시스템을 만드는 데 있음
- 권장 순서는 다음과 같음
- 단순한 프롬프트에서 시작
- 포괄적 평가로 프롬프트 최적화
- 단순한 해법이 부족할 때만 다단계 에이전트형 시스템 추가
- 에이전트 구현 시 세 가지 원칙이 중요함
- 설계의 단순성 유지
- 에이전트의 계획 단계를 명시적으로 보여 투명성 우선
- 철저한 도구 문서화와 테스트로 agent-computer interface, 즉 ACI를 신중하게 설계
- 프레임워크는 빠른 시작에 도움이 되지만, 프로덕션으로 이동하면서 추상화 계층을 줄이고 기본 구성요소로 구축하는 방식도 필요함
실제 적용 영역
-
고객 지원
- 고객 지원은 익숙한 챗봇 인터페이스에 도구 통합을 통한 기능 확장을 결합함
- 더 개방형 에이전트에 자연스럽게 맞는 이유가 있음
- 지원 상호작용은 대화 흐름을 따르면서 외부 정보와 작업 접근이 필요함
- 도구는 고객 데이터, 주문 이력, 지식 베이스 문서를 가져오도록 통합될 수 있음
- 환불 처리나 티켓 업데이트 같은 작업을 프로그램적으로 처리할 수 있음
- 성공 여부를 사용자가 정의한 해결로 명확히 측정할 수 있음
- 여러 회사는 성공한 해결 건에 대해서만 요금을 부과하는 사용량 기반 가격 모델로 이 접근의 실현 가능성을 보였음
-
코딩 에이전트
- 소프트웨어 개발 영역은 코드 완성에서 자율 문제 해결까지 LLM 기능이 진화하며 큰 잠재력을 보였음
- 에이전트가 효과적인 이유가 있음
- 코드 해법은 자동화 테스트로 검증 가능함
- 에이전트는 테스트 결과를 피드백으로 삼아 해법을 반복 개선할 수 있음
- 문제 공간이 잘 정의되고 구조화되어 있음
- 출력 품질을 객관적으로 측정할 수 있음
- Anthropic 구현에서는 에이전트가 pull request 설명만으로 SWE-bench Verified 벤치마크의 실제 GitHub 이슈를 해결할 수 있음
- 자동화 테스트가 기능 검증에 도움이 되더라도, 해법이 더 넓은 시스템 요구사항에 맞는지 확인하려면 사람의 리뷰가 여전히 중요함
도구 프롬프트 엔지니어링
- 어떤 에이전트형 시스템이든 도구는 중요한 구성요소가 될 가능성이 높음
- Tools는 Claude가 외부 서비스와 API와 상호작용할 수 있게 함
- API에서 정확한 구조와 정의를 지정함
- Claude가 도구 호출을 계획하면 API 응답에 tool use block이 포함됨
- 도구 정의와 명세는 전체 프롬프트만큼 프롬프트 엔지니어링의 주의를 받아야 함
-
도구 형식 선택
- 같은 작업도 여러 방식으로 지정할 수 있음
- 파일 편집은 diff로 쓸 수도 있고 전체 파일 재작성으로 지정할 수도 있음
- 구조화 출력은 Markdown 안의 코드나 JSON 안의 코드로 반환할 수 있음
- 소프트웨어 엔지니어링 관점에서는 손실 없이 변환 가능한 형식 차이일 수 있지만, LLM에는 어떤 형식이 훨씬 더 쓰기 어려움
- diff 작성은 새 코드를 쓰기 전에 청크 헤더에서 몇 줄이 바뀌는지 알아야 함
- JSON 안에 코드를 쓰면 줄바꿈과 따옴표 이스케이프가 추가로 필요함
- 도구 형식을 고를 때는 모델이 불필요한 형식 부담에 갇히지 않게 해야 함
- 막다른 형식에 들어가기 전에 충분히 생각할 토큰을 제공
- 모델이 인터넷 텍스트에서 자연스럽게 본 형식에 가깝게 유지
- 수천 줄 코드의 정확한 줄 수를 세거나 코드 문자열을 이스케이프하는 같은 형식상 오버헤드를 제거
- 같은 작업도 여러 방식으로 지정할 수 있음
-
ACI 설계
- 인간-컴퓨터 인터페이스(HCI)에 투입하는 노력만큼 agent-computer interface(ACI) 설계에도 투자해야 함
- 좋은 도구 정의에는 예시 사용법, 엣지 케이스, 입력 형식 요구사항, 다른 도구와의 명확한 경계가 포함되는 경우가 많음
- 매개변수 이름과 설명은 모델이 더 쉽게 이해하도록 조정해야 함
- 팀의 주니어 개발자를 위한 훌륭한 docstring을 작성하는 것과 비슷함
- 비슷한 도구가 많을 때 특히 중요함
- 모델의 도구 사용을 테스트해야 함
- SWE-bench용 에이전트를 만들 때 전체 프롬프트보다 도구 최적화에 더 많은 시간을 썼음
- 에이전트가 루트 디렉터리 밖으로 이동한 뒤 상대 파일 경로를 쓰는 도구에서 실수하는 문제가 있었음
- 도구가 항상 절대 파일 경로를 요구하도록 바꾸자 모델이 이 방식을 오류 없이 사용했음