[랭체인] 간단한 ReAct 에이전트 구축하기steemCreated with Sketch.

in #kr-devlast month (edited)

안녕하세요, 여러분! 오늘은 간단한 ReAct(Reasoning and Acting) 에이전트를 처음부터 만들어보면서 AI 에이전트의 흥미진진한 세계로 빠져보겠습니다. 이 튜토리얼은 https://til.simonwillison.net/llms/python-react-pattern에서 찾을 수 있는 작업을 기반으로 합니다.

ReAct 에이전트란 무엇인가요?

코딩을 시작하기 전에, ReAct 에이전트가 무엇인지 이해해 봅시다. ReAct는 "Reasoning and Acting"의 약자입니다. 이는 대규모 언어 모델의 강점과 외부 도구나 API와 상호작용하는 능력을 결합한 AI 패러다임입니다. 에이전트는 과제를 해결하거나 질문에 답하기 위해 사고(Thought), 행동(Action), 관찰(Observation)의 순환을 따릅니다.

환경 설정하기

먼저, Python 환경을 설정해 봅시다. 몇 가지 라이브러리가 필요합니다:

import openai
import re
import httpx
import os
from dotenv import load_dotenv

_ = load_dotenv()
from openai import OpenAI

client = OpenAI()

이 라이브러리들이 설치되어 있고, OpenAI API 키가 환경 변수에 설정되어 있는지 확인하세요.

Agent 클래스 만들기

이제 Agent 클래스를 만들어 봅시다:

class Agent:
    def __init__(self, system=""):
        self.system = system
        self.messages = []
        if self.system:
            self.messages.append({"role": "system", "content": system})

    def __call__(self, message):
        self.messages.append({"role": "user", "content": message})
        result = self.execute()
        self.messages.append({"role": "assistant", "content": result})
        return result

    def execute(self):
        completion = client.chat.completions.create(
                        model="gpt-4o", 
                        temperature=0,
                        messages=self.messages)
        return completion.choices[0].message.content

이 클래스는 OpenAI API와의 상호작용을 처리하며, 대화 기록을 유지하고 쿼리를 실행합니다.

에이전트의 능력 정의하기

다음으로, 에이전트의 능력을 설명하는 프롬프트를 정의해 봅시다:

prompt = """
당신은 사고, 행동, 일시정지, 관찰의 순환으로 실행됩니다.
순환의 끝에는 답변을 출력합니다.
사고를 사용하여 당신에게 주어진 질문에 대한 생각을 설명하세요.
행동을 사용하여 당신이 사용할 수 있는 행동 중 하나를 실행하고 - 그 다음 일시정지를 반환하세요.
관찰은 그 행동들을 실행한 결과가 될 것입니다.

당신이 사용할 수 있는 행동들은:

계산:
예: 계산: 4 * 7 / 3
계산을 실행하고 숫자를 반환합니다 - Python을 사용하므로 필요한 경우 부동소수점 구문을 사용해야 합니다.

평균_개_무게:
예: 평균_개_무게: 콜리
주어진 품종의 개의 평균 무게를 반환합니다.

예시 세션:

질문: 불독의 무게는 얼마인가요?
사고: 평균_개_무게를 사용하여 개의 무게를 찾아봐야겠습니다.
행동: 평균_개_무게: 불독
일시정지

당신은 다음과 함께 다시 호출될 것입니다:

관찰: 불독의 무게는 51 파운드입니다.

그러면 당신은 다음을 출력합니다:

답변: 불독의 무게는 51 파운드입니다.
""".strip()

행동 구현하기

이제 에이전트가 수행할 수 있는 행동들을 구현해 봅시다:

def calculate(what):
    return eval(what)

def average_dog_weight(name):
    if name in "스코티시 테리어": 
        return("스코티시 테리어의 평균 무게는 20 파운드입니다")
    elif name in "보더 콜리":
        return("보더 콜리의 평균 무게는 37 파운드입니다")
    elif name in "토이 푸들":
        return("토이 푸들의 평균 무게는 7 파운드입니다")
    else:
        return("평균적인 개의 무게는 50 파운드입니다")

known_actions = {
    "계산": calculate,
    "평균_개_무게": average_dog_weight
}

에이전트 생성하기

에이전트의 인스턴스를 생성해 봅시다:

abot = Agent(prompt)

에이전트 테스트하기

이제 간단한 질문으로 에이전트를 테스트해 봅시다:

result = abot("토이 푸들의 무게는 얼마인가요?")
print(result)

이는 에이전트의 사고 과정과 그 다음에 취하고자 하는 행동을 보여줄 것입니다.

ReAct 순환 구현하기

ReAct 순환을 완전히 구현하기 위해, 에이전트의 응답을 해석하고 적절한 행동을 실행할 수 있는 함수를 만들어야 합니다:

action_re = re.compile('^행동: (\w+): (.*)$')

def query(question, max_turns=5):
    i = 0
    bot = Agent(prompt)
    next_prompt = question
    while i < max_turns:
        i += 1
        result = bot(next_prompt)
        print(result)
        actions = [
            action_re.match(a) 
            for a in result.split('\n') 
            if action_re.match(a)
        ]
        if actions:
            # 실행할 행동이 있습니다
            action, action_input = actions[0].groups()
            if action not in known_actions:
                raise Exception("알 수 없는 행동: {}: {}".format(action, action_input))
            print(" -- {} {} 실행 중".format(action, action_input))
            observation = known_actions[action](action_input)
            print("관찰:", observation)
            next_prompt = "관찰: {}".format(observation)
        else:
            return

ReAct 에이전트 사용하기

이제 완전히 구현된 ReAct 에이전트를 사용하여 더 복잡한 질문에 답할 수 있습니다:

question = """저는 보더 콜리와 스코티시 테리어, 두 마리의 개를 키우고 있습니다. 
이 두 개의 합산 무게는 얼마인가요?"""
query(question)

이는 ReAct 순환을 통해 실행되어, 두 개의 무게를 찾아보고 그들의 합산 무게를 계산할 것입니다.

결론

축하합니다! 여러분은 방금 처음부터 간단한 ReAct 에이전트를 만들었습니다. 이 에이전트는 기본적인 계산을 수행하고 개의 무게를 찾아볼 수 있어, 언어 모델과 외부 행동을 결합하는 힘을 보여줍니다.

이는 단지 시작점일 뿐입니다. 더 많은 행동을 추가하거나, 프롬프트를 개선하거나, 심지어 실제 세계의 API에 연결하여 이를 확장할 수 있습니다. 가능성은 무한합니다!

즐거운 코딩 되세요, 그리고 여러분의 AI 에이전트가 항상 현명하게 반응하기를 바랍니다!

#LangChain

Posted using Obsidian Steemit plugin

Sort:  

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Congratulations, your post has been upvoted by @upex with a 0.22% upvote. We invite you to continue producing quality content and join our Discord community here. Visit https://botsteem.com to utilize usefull and productive automations #bottosteem #upex

Coin Marketplace

STEEM 0.19
TRX 0.16
JST 0.034
BTC 64116.01
ETH 2758.41
USDT 1.00
SBD 2.65