9️⃣LangChain: Multi-agent Authoritarian Speaker Selection

About Multi-agent authoritarian speaker selection

Multi-agent authoritarian speaker selection은 권한이 있는 에이전트가 발언할 사람을 결정하는 다중 에이전트 시뮬레이션을 구현하는 방법입니다. 이는 다중 에이전트 분산형 화자 선택과 정반대의 선택 방식을 따릅니다.

이번 사례는 "인공지능은 인간에게 유토피아를 줄 것인가, 디스토피아를 줄 것인가?"라는 토픽으로 아래 AI 관련자들이 각각의 Agent로 참여하여 권한 있는 에이전트가 발언하는 사람을 결정하는 대화를 생성하도록 하겠습니다.

  • 샘 알트먼: CEO, worked for OpenAI

  • 제프리 힌튼: Professor, worked for Toronto University

  • 일론 머스크: CEO, worked for Teslar

  • 요슈아 벤지오: Professor, worked for Montreal University.

다음과 같은 순서로 에이전트를 구현하는 방법을 보여줍니다.

  1. Agent는 말하기 전에 생각하기

  2. 대화 종료

  3. (반복)

LangChain: Multi-agent authoritarian speaker selection

Setup Environments

import os
from dotenv import load_dotenv

# 토큰 정보로드
api_key = os.getenv("OPENAI_API_KEY")
load_dotenv()

DialogueAgent and DialogueSimulator classes

6️⃣ 7️⃣의 예제인 멀티플레이어 던전 앤 드래곤과 K-Pop 토론 선택에서 정의한 것과 동일한 DialogueAgentDialogueSimulator 클래스를 사용하겠습니다.

DirectorDialogueAgent class

DirectorDialogueAgent는 다른 Agent 중 다음에 대화할 Agent를 선택하는 권한이 있는 Agent입니다. 이 Agent는 다음을 담당합니다.

  1. 어떤 Agent가 언제 말할지 선택하여 대화를 조정하고

  2. 대화를 종료합니다.

이러한 에이전트를 구현하려면 몇 가지 문제를 해결해야 합니다.

첫째, 대화를 조정하려면 DirectorDialogueAgent가 (1) 말한 내용을 반영하고, (2) 다음 에이전트를 선택하고, (3) 다음 에이전트에게 말을 하라는 메시지를 모두 하나의 메시지로 보내야 합니다.

LLM이 동일한 통화에서 세 단계를 모두 수행하도록 프롬프트할 수도 있지만, 이렇게 하려면 출력된 메시지를 파싱하여 다음 에이전트가 어떤 말을 할 것인지 추출하는 사용자 지정 코드를 작성해야 합니다.

이렇게 하면 LLM이 다음 에이전트를 선택하는 방법을 다른 방식으로 표현할 수 있어 신뢰성이 떨어집니다.

대신 할 수 있는 방법은 단계(1-3)를 세 개의 개별 LLM 호출로 명시적으로 나누는 것입니다.

  1. 먼저 DirectorDialogueAgent에 지금까지의 대화를 반영하고 응답을 생성하도록 요청합니다.

  2. 그런 다음 쉽게 파싱할 수 있는 다음 에이전트의 인덱스를 출력하도록 DirectorDialogueAgent에 요청합니다.

  3. 마지막으로 선택한 다음 에이전트의 이름을 DirectorDialogueAgent에 다시 전달하여 다음 에이전트에게 말을 걸도록 요청합니다.

둘째, 단순히 대화를 종료할 시점을 결정하라는 메시지만 표시하면 DirectorDialogueAgent가 즉시 대화를 종료하는 경우가 많습니다.

이 문제를 해결하기 위해 베르누이 변수를 무작위로 샘플링하여 대화를 종료할지 여부를 결정합니다. 이 변수의 값에 따라 대화를 계속하거나 대화를 종료하라는 사용자 지정 프롬프트를 DirectorDialogueAgent에 삽입합니다.

Define participants and topic

Generate system messages

LLM to create an elaborate on debate topic

Define the speaker selection function

마지막으로 각 에이전트의 입찰가를 받아 가장 높은 입찰가를 낸 상담원을 선택하는(동점자가 있을 경우 무작위로 나눕니다) 스피커 선택 함수 select_next_speaker를 정의하겠습니다.

앞서 정의한 bid_parser를 사용하여 에이전트의 입찰가를 파싱하는 ask_for_bid 함수를 정의하겠습니다.

에이전트의 입찰가가 올바르게 구문 분석되지 않으면 여러 번 재시도하고 최대 시도 횟수 후에 기본 입찰가 0을 생성하도록 끈기를 사용하여 ask_for_bid를 꾸밀 것입니다.

Main Loop

Last updated