8️⃣LangChain: Multi-agent Bid for K-Pop Debate

Multi-agent: Bid for K-Pop Debate

누가 언제 말할지 정해진 일정 없이 Multi-agent 시뮬레이션을 구현하는 방법을 보여줍니다. 대신 Agent 스스로 말할 사람을 결정합니다. 각 Agent의 발언권을 입찰(Bidding)하도록 하여 입찰가가 가장 높은 상담원이 발언권을 얻게 됩니다.

K-Pop을 화두로 K-Pop의 미래는 어떠한지 3명의 서로 다른 페르소나 Agent가 Autonmous 하게 발언을 하며 토론을 진행하게 됩니다.

Setup Environments

import os
from dotenv import load_dotenv

# 토큰 정보로드
api_key = os.getenv("OPENAI_API_KEY")
load_dotenv()
from typing import Callable, List

import tenacity
from langchain.output_parsers import RegexParser
from langchain.prompts import PromptTemplate
from langchain.schema import (
    HumanMessage,
    SystemMessage,
)
from langchain_openai import ChatOpenAI

DialogueAgent & DialogueSimulator classes

멀티플레이어 던전 앤 드래곤에 정의된 것과 동일한 DialogueAgent 및 DialogueSimulator 클래스를 사용하겠습니다.

BiddingDialogueAgent class

메시지 내역과 가장 최근 메시지가 주어지면 입찰가를 생성하는 bid() 메서드가 있는 DialogueAgent의 서브클래스를 정의합니다.

Participants & Debate Topic

Generate system messages

Output parser for bids

에이전트에게 말하기 입찰을 출력하도록 요청합니다. 하지만 에이전트는 문자열을 출력하는 LLM이므로 다음을 수행해야 합니다.

  1. 출력을 생성할 형식을 정의하고

  2. 출력을 파싱합니다.

RegexParser를 서브클래싱하여 입찰가에 대한 자체 사용자 지정 출력 구문 분석기를 구현할 수 있습니다.

Generate bidding system message

이는 제너레이티브 에이전트에서 메모리 중요도를 결정하기 위해 LLM을 사용할 때 사용하는 프롬프트에서 영감을 얻었습니다. 여기에는 BidOutputParser의 서식 지정 지침이 사용됩니다.

{{message_history}}

{{recent_message}}

Use an LLM to create an elaborate on debate topic

Define the speaker selection function

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

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

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

Main Loop

Last updated