LangChain을 활용한 AI 에이전트 생성 가이드: 개념부터 코드 구현까지

GoGoComputer·2024년 11월 12일
1

LangChain Basics

목록 보기
36/40
post-thumbnail

안녕하세요! 에이전트를 생성하는 방법에 대해 쉽게, 자세히, 그리고 길게 설명해 드리겠습니다. 마지막에는 실제로 실행 가능한 전체 코드를 제공해 드릴게요. 여기서는 OPENAI_API_KEY.env 파일에 저장하고 불러오는 것으로 가정하겠습니다.


1. 에이전트란 무엇인가요?

에이전트(Agent)는 인공지능 시스템에서 사용자로부터 입력을 받아 작업을 수행하고 결과를 반환하는 프로그램이나 모듈을 의미합니다. LangChain에서는 이러한 에이전트를 생성하고 관리할 수 있는 다양한 도구와 모듈을 제공합니다.

에이전트는 대형 언어 모델(LLM)도구(Tool)를 결합하여 복잡한 작업을 수행합니다. 예를 들어, 사용자가 복잡한 수학 문제를 입력하면 에이전트는 이를 이해하고 적절한 도구(예: 계산기)를 사용하여 결과를 계산하고 반환합니다.


2. 에이전트의 기본 동작 원리

에이전트는 다음과 같은 순서로 동작합니다:

  1. 사용자 입력 수신: 에이전트는 사용자로부터 질문이나 명령을 입력받습니다.
  2. 행동 결정: 입력된 내용을 이해하고 어떤 도구를 사용할지 결정합니다.
  3. 도구 실행: 선택된 도구를 호출하여 작업을 수행합니다.
  4. 관찰 결과 획득: 도구 실행 결과를 받아옵니다.
  5. 추가 행동 결정: 결과를 바탕으로 추가로 도구를 사용할지, 아니면 답변을 생성할지 결정합니다.
  6. 최종 답변 반환: 최종 결과를 사용자에게 제공합니다.

이러한 과정을 통해 에이전트는 복잡한 문제를 단계적으로 해결합니다.


3. 에이전트의 종류

LangChain에서는 여러 종류의 에이전트를 제공합니다. 각각의 에이전트는 특수한 목적이나 동작 방식을 가지고 있습니다.

  • Zero Shot React Description: 별도의 예시 없이 바로 작업을 수행하는 에이전트입니다.
  • Conversational React Description: 대화형으로 사용자와 상호작용하는 에이전트입니다.
  • OpenAI Functions: OpenAI의 함수를 활용하여 작업을 수행하는 에이전트입니다.
  • React Re-Plan: 계획을 재수립하며 작업을 수행하는 에이전트입니다.
  • Self Ask with Search: 자체적으로 질문을 생성하고 검색을 통해 답을 찾는 에이전트입니다.

이번에는 Zero Shot React Description 에이전트를 사용하여 예제를 진행하겠습니다.


4. 에이전트 생성 단계

1단계: 필요한 라이브러리 가져오기

먼저 필요한 패키지와 모듈을 가져옵니다.

from langchain.agents import initialize_agent, load_tools, AgentType
from langchain.chat_models import ChatOpenAI
import os
from dotenv import load_dotenv
  • initialize_agent: 에이전트를 초기화하는 함수입니다.
  • load_tools: 에이전트가 사용할 도구를 로드하는 함수입니다.
  • AgentType: 에이전트의 유형을 지정하는 클래스입니다.
  • ChatOpenAI: OpenAI의 채팅 모델을 사용하기 위한 클래스입니다.
  • osdotenv: 환경 변수를 관리하기 위한 모듈입니다.

2단계: 환경 변수 로드

.env 파일에서 OPENAI_API_KEY를 불러옵니다.

load_dotenv()
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')

3단계: 언어 모델 설정

OpenAI의 GPT-4 모델을 사용하며, 결과의 일관성을 위해 온도(temperature)를 0으로 설정합니다.

llm = ChatOpenAI(openai_api_key=OPENAI_API_KEY, temperature=0)
  • temperature: 값이 낮을수록 모델의 출력이 더 결정적이고 일관적입니다.

4단계: 도구 로드

에이전트가 사용할 도구를 로드합니다. 여기서는 llm-math 도구를 사용합니다.

tools = load_tools(["llm-math"], llm=llm)
  • llm-math: 복잡한 수학 계산을 수행할 수 있는 도구입니다.

5단계: 에이전트 초기화

에이전트를 초기화하고, 사용할 도구와 언어 모델, 에이전트 유형을 지정합니다.

agent = initialize_agent(
    tools, 
    llm, 
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, 
    verbose=True
)
  • agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION: Zero Shot React Description 타입의 에이전트를 사용합니다.
  • verbose=True: 에이전트의 내부 동작 과정을 상세히 출력합니다.

6단계: 에이전트 실행

에이전트에 질문을 입력하고 결과를 받아옵니다.

question = "아인슈타인이 태어난 해에 123456789 * 987654321을 계산하면 얼마인가요?"
result = agent.run(question)
print("결과:", result)

5. 전체 코드

위의 모든 단계를 포함한 전체 코드는 다음과 같습니다.

# 필요한 라이브러리 가져오기
from langchain.agents import initialize_agent, load_tools, AgentType
from langchain.chat_models import ChatOpenAI
import os
from dotenv import load_dotenv

# .env 파일에서 API 키 로드
load_dotenv()
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')

# 언어 모델 설정
llm = ChatOpenAI(openai_api_key=OPENAI_API_KEY, temperature=0)

# 도구 로드
tools = load_tools(["llm-math"], llm=llm)

# 에이전트 초기화
agent = initialize_agent(
    tools, 
    llm, 
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, 
    verbose=True
)

# 에이전트 실행
question = "아인슈타인이 태어난 해에 123456789 * 987654321을 계산하면 얼마인가요?"
result = agent.run(question)
print("결과:", result)

6. 코드 실행 및 결과 분석

1. 질문 이해

에이전트는 질문을 받아들입니다:

"아인슈타인이 태어난 해에 123456789 * 987654321을 계산하면 얼마인가요?"

2. 행동 결정

  • 아인슈타인의 출생 연도를 알아야 합니다.
  • 곱셈 계산을 수행해야 합니다.

하지만 현재 로드된 도구는 llm-math뿐이며, 이는 수학 계산에만 사용됩니다. 따라서 에이전트는 언어 모델의 지식에 의존하여 아인슈타인의 출생 연도를 알아냅니다.

3. 도구 실행

  • 아인슈타인의 출생 연도: 일반적으로 1879년입니다.
  • 곱셈 계산: (123456789 * 987654321) + 1879를 계산합니다.

에이전트는 llm-math 도구를 사용하여 이 복잡한 계산을 수행합니다.

4. 결과 반환

최종 결과를 사용자에게 제공합니다.


7. 실행 결과 예시

실제로 코드를 실행하면 다음과 같은 과정을 볼 수 있습니다(여기서는 verbose=True로 설정하여 상세한 로그를 출력합니다):

> Entering new AgentExecutor chain...
I need to calculate 123456789 multiplied by 987654321 and add Einstein's birth year (1879).
Thought: 먼저 123456789 * 987654321을 계산하고 그 결과에 1879를 더하자.
Action: Calculator
Action Input: 123456789 * 987654321 + 1879

Observation: 121932631112635269 + 1879 = 121932631112637148
Thought: 이제 최종 답을 말해주자.
Final Answer: 121932631112637148

> Finished chain.
결과: 121932631112637148

8. 추가 설명

에이전트의 사고 과정

  • Thought: 에이전트가 무엇을 해야 할지 생각합니다.
  • Action: 어떤 도구를 사용할지 결정하고 실행합니다.
  • Observation: 도구 실행 결과를 받아옵니다.
  • Final Answer: 최종 답변을 생성합니다.

온도 설정의 중요성

  • 온도(temperature)를 0으로 설정하여 모델의 출력이 일관되게 합니다.
  • 높은 온도 값은 더 창의적인 답변을 생성하지만, 계산과 같은 정확한 작업에는 부적합합니다.

도구 확장

  • 필요에 따라 더 많은 도구를 로드하여 에이전트의 기능을 확장할 수 있습니다.
  • 예를 들어, 웹 검색 도구를 추가하여 실시간 정보를 가져올 수 있습니다(이 경우 추가 설정과 API 키가 필요할 수 있습니다).

9. 결론

이렇게 LangChain을 사용하여 에이전트를 생성하고 도구를 활용하여 복잡한 작업을 수행할 수 있습니다. 에이전트는 언어 모델의 이해력과 도구의 기능을 결합하여 사용자에게 정확하고 유용한 답변을 제공합니다.


10. 요약

  • 에이전트는 사용자 입력에 따라 적절한 도구를 사용하여 작업을 수행하는 프로그램입니다.
  • LangChain은 이러한 에이전트를 쉽게 생성하고 관리할 수 있는 프레임워크를 제공합니다.
  • Zero Shot React Description 에이전트는 별도의 예시 없이도 작업을 수행할 수 있습니다.
  • 도구를 활용하여 에이전트의 기능을 확장할 수 있습니다.
  • 온도 설정은 모델의 출력 일관성에 큰 영향을 미칩니다.

이상으로 에이전트 생성 방법에 대한 자세한 설명을 마치겠습니다. 궁금한 점이나 추가로 알고 싶은 내용이 있으시면 언제든지 질문해 주세요!

profile
IT를 좋아합니다.

0개의 댓글