두 코드는 AI 에이전트(Agent)를 생성한다는 공통점이 있지만, 어떤 프레임워크를 사용하고 얼마나 추상화되어 있는지에서 근본적인 차이가 있습니다.
간단히 말해, 첫 번째 코드는 OpenAI의 Assistants API와 같이 모든 것이 준비된 고수준의 서비스를 사용하는 방식이고, 두 번째 코드는 LangChain과 같이 개발자가 직접 제어하며 조립하는 방식입니다.
agent = Agent(...)
이 코드는 OpenAI Assistants API 또는 그와 유사한 고수준(High-level) 프레임워크일 가능성이 매우 높습니다.
- 특징:
- 높은 추상화: 에이전트의 복잡한 내부 동작(메모리 관리, 도구 사용 결정 등)이 프레임워크(예: OpenAI 서버)에 의해 자동으로 처리됩니다.
- 상태 유지(Stateful): 대화의 맥락이나 이전 작업 기록을 서버가 자체적으로 관리합니다 (
Thread
개념 사용). 개발자가 직접 메모리를 구현할 필요가 없습니다. - 쉬운 사용: 간단한 설정(이름, 지시사항, 모델)만으로 강력한 에이전트를 만들 수 있습니다.
- 파라미터 설명:
name
: 에이전트의 이름instructions
: 에이전트의 역할과 행동 방식을 정의하는 시스템 프롬프트model
: 사용할 LLM 모델 (예:gpt-4-turbo
)mcp_servers
: 이것은 표준 OpenAI 파라미터가 아니며, 해당 코드가 사용되는 특정 시스템이나 회사 내부 프레임워크에서 사용하는 커스텀 파라미터일 가능성이 높습니다. 자체 도구나 서버에 연결하기 위한 용도로 보입니다.
- 비유: 잘 훈련된 비서를 고용하는 것과 같습니다. 비서에게 이름, 역할, 사용할 도구(내장된 Code Interpreter 등)를 알려주면, 비서가 알아서 대화를 기억하고 작업을 수행합니다.
agent = create_react_agent(...)
이 코드는 LangChain 프레임워크에서 사용되는 일반적인 방식입니다.
- 특징:
- 명시적인 제어: 에이전트가 어떻게 생각하고 행동할지를 **ReAct (Reason + Act)**라는 특정 프레임워크를 사용해 개발자가 직접 구성합니다.
- 유연성과 커스터마이징: 개발자가 에이전트의 모든 구성 요소(LLM, Tools, Prompt)를 직접 제어하고 조합할 수 있어 유연성이 매우 높습니다.
- 상태 관리 직접 구현: 대화 기록과 같은 메모리 관리를 개발자가 코드 내에서 직접 처리해야 합니다.
- 파라미터 설명:
llm
: 사용할 언어 모델 객체 (예:ChatOpenAI
)tools
: 에이전트가 사용할 수 있는 도구(함수)들의 리스트. 이 도구들은 개발자가 직접 코드에 정의합니다.
- 비유: 유능한 전문가에게 특정 문제와 도구 상자를 주는 것과 같습니다. 전문가는 “생각 -> 행동(도구 사용) -> 관찰”의 과정을 반복하며 문제를 해결하고, 우리는 그 과정을 모두 지켜보고 제어할 수 있습니다.
핵심적인 차이점 요약
구분 | Agent(...) (OpenAI Assistants 방식) | create_react_agent(...) (LangChain 방식) |
추상화 수준 | 높음 (많은 부분이 자동화) | 중간 (개발자가 직접 조립 및 제어) |
프레임워크 | OpenAI Assistants API 또는 유사 프레임워크 | LangChain |
작동 방식 | 서버 측에서 관리 (Black Box에 가까움) | ReAct 프레임워크 (코드에서 명시적으로 제어) |
상태/메모리 | 자동 관리 (서버의 Thread 가 담당) | 수동 관리 (개발자가 직접 구현) |
도구 통합 | 내장 도구(Code Interpreter 등) 또는 지정된 방식 | 개발자가 코드에 정의한 모든 함수 |
유연성/제어 | 낮음 | 높음 |
어떤 것을 사용해야 할까? 🤔
Agent(...)
(OpenAI Assistants 방식)를 선택하는 경우:- 빠르게 챗봇이나 어시스턴트를 만들고 싶을 때
- 에이전트의 내부 동작을 세밀하게 제어할 필요가 없을 때
- OpenAI가 제공하는 강력한 내장 도구와 상태 관리 기능을 활용하고 싶을 때
create_react_agent(...)
(LangChain 방식)를 선택하는 경우:- 에이전트의 프롬프트와 논리 흐름을 완벽하게 제어하고 싶을 때
- 자신만의 커스텀 도구나 복잡한 로직을 자유롭게 통합하고 싶을 때
- 다양한 LLM, 벡터 스토어 등을 조합하는 복잡한 애플리케이션을 만들 때
답글 남기기