21

실습: LangChain으로 ReAct Agent 만들기

Day 3: ReAct 에이전트

학습 목표
  • LangChain의 Agent 프레임워크로 도구 호출 루프를 만든다
  • @tool 데코레이터로 도구를 정의하고 Agent에 연결한다
  • AgentExecutor가 대신 돌려주는 루프와 직접 구현한 루프를 비교한다
  • 논문의 ReAct와 프레임워크 함수 이름의 ReAct를 구분한다

미션: 같은 Agent를 LangChain으로 다시 만들기

앞 실습에서 직접 짠 루프를 LangChain으로 옮기고, 코드가 얼마나 줄어드는지 비교하세요.

먼저: 버전 고정

이 실습은 LangChain 0.3 계열을 기준으로 씁니다.

pip install "langchain>=0.3,<1.0" "langchain-core>=0.3" "langchain-openai>=0.2"

LangChain 1.x에서는 AgentExecutorcreate_tool_calling_agentlangchain-classic 패키지로 옮겨졌고, 새 진입점은 langchain.agents.create_agent입니다. 버전을 고정하지 않고 pip install langchain만 하면 아래 import에서 ImportError가 납니다. 설치 후 python -c "import langchain; print(langchain.__version__)"로 확인하세요.

핵심 컴포넌트

  • @tool 데코레이터: 파이썬 함수를 도구로 만든다. docstring이 그대로 description이 된다
  • ChatOpenAI: LLM
  • create_tool_calling_agent: 모델의 네이티브 도구 호출로 도구를 고르는 Agent를 만든다
  • AgentExecutor: 도구를 실행하고 결과를 다시 모델에 넣는 루프

주의: "ReAct"라는 이름이 가리키는 것이 셋이다

이름실제 동작이 주차에서 만나는 곳
ReAct (논문, Yao et al. 2022)Thought/Action/Observation을 텍스트로 적게 하고 그 텍스트를 파싱한다D3 이론 자료
create_tool_calling_agent (LangChain)모델의 네이티브 tool_calls를 쓰는 루프. 사고 과정을 강제로 적게 하지 않는다이 실습
create_react_agent (LangGraph)이름은 ReAct지만 역시 네이티브 tool_calls 루프다D4 영상, Week 5

셋이 도는 모습은 비슷하지만 논문의 ReAct만 사고 과정을 텍스트로 남깁니다. 나머지 둘에서 Thought를 보고 싶으면 프롬프트로 "왜 그 도구를 고르는지 한 줄로 적어라"고 시켜야 합니다. 앞 실습(ReAct Agent 직접 구현)의 시스템 프롬프트가 정확히 그렇게 했습니다.

langchain.agents.create_react_agent는 프롬프트에 {tools} · {tool_names} · 문자열 {agent_scratchpad}를 요구합니다. 아래 코드가 쓰는 MessagesPlaceholder("agent_scratchpad")와 계약이 다르므로 두 방식을 섞으면 프롬프트 변수 불일치로 실패합니다.

agent_scratchpad가 무엇인가

직접 구현한 루프에서 회차마다 쌓던 messages(assistant의 tool_calls, role="tool" 결과)를 LangChain이 부르는 이름입니다. MessagesPlaceholder("agent_scratchpad") 자리에 그 기록이 들어갑니다. 즉 이름만 다를 뿐, 어제 손으로 관리하던 것과 같은 것입니다.

참고: LangChain은 AgentExecutor의 후속으로 LangGraph를 권장합니다. Week 5에서 LangGraph를 상세히 다룹니다.

어디서 돌리나

pip install 을 끝낸 내 컴퓨터의 파이썬에서 돌립니다. 사이트의 Python Console은 표준 라이브러리만 갖춘 브라우저 파이썬이라 from langchain_openai import ChatOpenAI 에서 ModuleNotFoundError 로 멈춥니다. LangChain 은 Pyodide 배포판에 들어 있지 않으므로 설치로 해결되지 않습니다.

에디터 로딩 중...
힌트 보기
  • @tool 데코레이터의 docstring이 그대로 description이 됩니다
  • create_tool_calling_agent는 모델의 네이티브 tool_calls를 쓰는 루프입니다. 논문의 ReAct와 달리 사고 과정을 텍스트로 남기지 않으므로, Thought가 필요하면 프롬프트로 요구하세요
  • agent_scratchpad는 직접 구현한 루프에서 쌓던 messages와 같은 것입니다. MessagesPlaceholder로 자리를 만들어야 합니다
  • AgentExecutor의 verbose=True로 도구 선택 과정을 출력하세요
  • return_intermediate_steps=True로 Tool 호출 이력을 확인하세요
정답 보기
에디터 로딩 중...
AI로 학습하기 — 꿀팁
LangChain 도구 연결 코드 생성AI 학습 팁

AI에게 @tool 데코레이터로 제조 도구를 정의하고 AgentExecutor에 연결하는 코드를 생성시켜 프레임워크 사용법을 빠르게 익히세요. 생성된 코드가 어느 버전을 전제하는지 반드시 확인하세요.

@tool 데코레이터로 제조 설비 점검 도구(설비상태조회·알람목록·정비이력검색) 3개를 정의하고, langchain 0.3 계열의 create_tool_calling_agent와 AgentExecutor로 연결하는 코드를 작성해줘. verbose=True로 도구 선택 과정이 출력되게 하고, LangChain 1.x에서는 같은 코드가 왜 ImportError를 내는지, 1.x에서는 무엇으로 바꿔 써야 하는지도 알려줘.
이 팁이 도움이 됐나요?
용어