메인 콘텐츠로 건너뛰기
이 문서는 대화형 노트북입니다. 로컬에서 실행하거나 아래 링크를 사용하세요:

멀티 에이전트 시스템을 위한 구조화된 출력

OpenAI는 강한 제약을 거는 프롬프트 없이도 사용자가 제공한 JSON Schema를 모델이 항상 준수하는 응답을 생성하도록 보장할 수 있게 해주는 구조화된 출력을 발표했습니다. 구조화된 출력을 사용하면 형식이 올바르지 않은 응답을 검증하거나 재시도할 필요가 없습니다. 새 파라미터 strict: true를 사용하면 응답이 지정된 스키마를 따르도록 보장할 수 있습니다. 멀티 에이전트 시스템에서 구조화된 출력을 사용하면 에이전트 간에 일관되고 쉽게 처리할 수 있는 데이터를 주고받을 수 있어 커뮤니케이션이 향상됩니다. 또한 명시적인 거부 응답을 허용해 안전성을 높이고, 재시도나 검증이 필요 없게 되어 성능도 개선됩니다. 그 결과 상호작용이 단순해지고 시스템 전체의 효율성이 높아집니다. 이 튜토리얼에서는 멀티 에이전트 시스템에서 구조화된 출력을 활용하고 이를 Weave로 트레이스하는 방법을 보여줍니다.
출처: 이 cookbook은 OpenAI의 구조화된 출력 샘플 코드를 바탕으로 했으며, Weave를 사용해 시각화를 개선하기 위한 몇 가지 수정이 추가되었습니다.

의존성 설치

이 튜토리얼에는 다음 라이브러리가 필요합니다:
  • 멀티 에이전트 시스템을 구축하기 위한 OpenAI
  • LLM 워크플로를 추적하고 프롬프팅 전략을 평가하기 위한 Weave
wandb.login()으로 쉽게 로그인할 수 있도록 환경 변수에 WANDB_API_KEY를 설정합니다(이 값은 colab에 secret으로도 제공해야 합니다). 로그를 기록할 W&B 프로젝트를 name_of_wandb_project에 설정합니다. 참고: name_of_wandb_project는 트레이스를 기록할 팀을 지정하기 위해 {team_name}/{project_name} 형식으로도 지정할 수 있습니다. 그런 다음 weave.init()을 호출해 Weave 클라이언트를 가져옵니다. OpenAI API를 사용할 예정이므로 OpenAI API 키도 필요합니다. OpenAI 플랫폼에서 가입하여 자신의 API 키를 받을 수 있습니다. (이 값도 colab에 secret으로 제공해야 합니다.)

에이전트 설정

이번에 다룰 사용 사례는 데이터 분석 작업입니다. 먼저 4-에이전트 시스템을 설정해 보겠습니다:
  • Triaging 에이전트: 어떤 에이전트를 call할지 결정합니다
  • Data pre-processing Agent: 분석을 위해 데이터를 준비합니다. 예를 들어 데이터를 정리합니다
  • Data Analysis Agent: 데이터를 분석합니다
  • Data Visualization Agent: 분석 결과를 시각화해 인사이트를 도출합니다 먼저 이러한 각 에이전트의 system prompt를 정의하겠습니다.
그런 다음 각 에이전트의 도구를 정의합니다. 트리아지 에이전트를 제외하면, 각 에이전트에는 역할별로 특화된 도구가 제공됩니다: 데이터 전처리 에이전트 : 1. 데이터 정제, 2. 데이터 변환, 3. 데이터 집계 데이터 분석 에이전트 : 1. 통계 분석, 2. 상관관계 분석, 3. 회귀 분석 Data Visualization 에이전트 : 1. 막대 차트 생성, 2. 선 차트 생성, 3. 원형 차트 생성

Weave를 사용해 멀티 에이전트 추적 활성화

다음을 수행하는 코드 로직을 작성해야 합니다:
  • 사용자 쿼리를 멀티 에이전트 시스템에 전달
  • 멀티 에이전트 시스템의 내부 동작 처리
  • 도구 calls 실행
사용자 쿼리를 보면 호출해야 하는 도구가 clean_data, start_analysis, use_line_chart임을 추론할 수 있습니다. 먼저 도구 호출을 실행하는 실행 함수를 정의하겠습니다. Python 함수에 @weave.op() 데코레이터를 붙이면 언어 모델의 입력, 출력, 트레이스를 기록하고 디버깅할 수 있습니다. 멀티 에이전트 시스템을 만들면 함수가 많아지지만, 각 함수 위에 @weave.op()만 추가하면 충분합니다.
다음으로, 각 하위 에이전트용 도구 핸들러를 만듭니다. 각 핸들러에는 모델에 전달되는 고유한 프롬프트와 도구 세트가 있습니다. 그런 다음 출력은 tool calls를 실행하는 실행 함수로 전달됩니다.
마지막으로, 사용자 쿼리 처리를 총괄하는 상위 도구를 만듭니다. 이 함수는 사용자 쿼리를 받아 모델의 응답을 얻고, 실행을 위해 이를 다른 에이전트에 전달하는 역할을 합니다.

Weave에서 멀티 에이전트 시스템 실행 및 시각화

마지막으로, 사용자 입력으로 기본 handle_user_message 함수를 실행하고 결과를 확인합니다.
Weave의 URL을 클릭하면 실행 과정이 다음과 같이 트레이스되는 것을 확인할 수 있습니다. Traces 페이지에서는 입력과 출력을 확인할 수 있습니다. 이해를 돕기 위해 각 출력을 클릭했을 때 표시되는 결과의 스크린샷도 다이어그램에 추가했습니다. Weave는 OpenAI API와 인테그레이션되므로 비용이 자동으로 계산됩니다. 따라서 맨 오른쪽에 비용과 지연 시간도 표시되는 것을 확인할 수 있습니다. 1-1.png 선을 클릭하면 멀티 에이전트 시스템 내에서 실행된 중간 과정을 확인할 수 있습니다. 예를 들어 analysis_agent의 입력과 출력을 보면 구조화된 출력 형식임을 알 수 있습니다. OpenAI의 구조화된 출력은 에이전트 간 협업을 용이하게 하지만, 시스템이 더 복잡해질수록 이러한 상호작용이 어떤 형식으로 이루어지는지 파악하기가 더 어려워집니다. Weave를 사용하면 이러한 중간 과정과 그 입력 및 출력을 손에 잡히듯 파악할 수 있습니다.
3.png
Weave에서 트레이싱이 어떻게 처리되는지 좀 더 자세히 살펴보겠습니다!

결론

이 튜토리얼에서는 OpenAI가 제공하는 구조화된 출력과 Weave를 사용해 입력, 최종 출력, 중간 출력 형식을 추적하면서 멀티 에이전트 시스템을 손쉽게 개발하는 방법을 알아보았습니다.