※ 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다. ※

오늘은 ReAct(Reasoning + Acting) 에이전트의 개념을 배우고, LangChain으로 실습을 진행해봤습니다 :)
ReAct 전략은 프린스턴 대학교 학자들이 구글 연구원들과 협력하여 개발한 프롬프트 엔지니어링 전략이라고 하는데요.
"다수의 외부도구를 사용할 수 있음"을 전제하며, 외부 도구의 결과로부터 생각하고 행동하고, 다시 생각, 행동...을 수행하며 인간과 유사한 방식으로 작업을 완료할 수 있도록하는 것에 목표를 둔다고 합니다.
- "생각 > 행동 > 행동 입력 > 검색 결과"의 과정을 반복하며, 문제를 해결
- 문제 해결을 위한 결과가 모두 취합될 때, 최종 답을 작성
- 생각: 현 시점에 어떤 도구에 어떤 검색어를 넣을지 고민하는 단계 (고민 과정을 작성하므로, CoT 전략)
- 행동: 실제로 어떤 도구를 사용할지 결정
- 행동 입력: 검색어를 결정
- 검색 결과: 도구로 부터 검색 결과 획득 및 이를 바탕으로 다음 생각 전개
1️⃣ 데이터 준비: PDF 다운로드 및 전처리
실습에 사용한 데이터는 2024년 일본, 미국 ICT 정책 보고서 PDF였습니다.
requests 라이브러리로 Github raw 링크에서 PDF를 다운로드했습니다.
urls = [".../ict_japan_2024.pdf", ".../ict_usa_2024.pdf"]
for url in urls:
filename = url.split("/")[-1]
response = requests.get(url)
with open(filename, "wb") as f:
f.write(response.content)
2️⃣ 청킹(Chunking) 및 벡터 DB 구축
create_pdf_retriever 함수를 작성했습니다.
PDF 문서를 벡터 DB로 변환하고 이를 검색할 수 있는 retriever를 생성하는 것에 목적이 있는 함수입니다.
먼저, 페이지별 문서의 길이는 모두 다르기 때문에, RecursiveCharacterTextSplitter를 활용하여 각 512자의 청크로 분할했습니다.
text_splitter = RecursiveCharacterTextSplitter(chunk_size=512)
doc_splits = text_splitter.split_documents(data)
그다음 OpenAIEmbeddings를 활용하여 임베딩을 진행했고, Chroma 벡터 DB에 저장했습니다.
이렇게 생성된 벡터 데이터베이스는 retriever 검색 객체로 반환합니다.
# 벡터 DB에 적재
vectorstore = Chroma.from_documents(
persist_directory="db_ict_policy_japan_2024",
documents=doc_splits,
embedding=OpenAIEmbeddings()
)
# 벡터 DB를 retriever 객체로 반환
return vectorstore.as_retriever()
3️⃣ ReAct용 검색 도구 생성
위 과정에서 생성한 retriever 객체는 create_retriever_tool을 활용해 ReAct 에이전트가 사용할 수 있는 검색 도구로 변환합니다.
이때 description을 자세히 작성해야 LLM이 질문 의도에 맞게 도구를 선택할 수 있다고 하니 신경써서 작성할 필요가 있겠습니다!
jp_engine = create_retriever_tool(
retriever=retriever_japan,
name="japan_ict",
description="일본의 ICT 시장동향 정보를 제공합니다. 일본 ICT와 관련된 질문은 해당 도구를 사용하세요.",
)
usa_engine = create_retriever_tool(
retriever=retriever_usa,
name="usa_ict",
description="미국의 ICT 시장동향 정보를 제공합니다. 미국 ICT와 관련된 질문은 해당 도구를 사용하세요.",
)
4️⃣ ReAct 에이전트 구성
llm 변수에 gpt-4o 모델을 초기화 설정 한 후, 앞서 만든 검색 도구들(tools)를 결합해 react_agent를 생성합니다.
prompt 매개변수를 통해, 사전에 작성해둔 한글 프롬프트를 넣어줍니다.
llm = ChatOpenAI(model="gpt-4o-2024-08-06", temperature=0)
react_agent = create_react_agent(llm, tools=tools, prompt=prompt)
react_agent_executor = AgentExecutor(
agent=react_agent, tools=tools, verbose=True, handle_parsing_errors=True
)
5️⃣ 질의 및 실행
result = react_agent_executor.invoke({"input": "한국과 미국의 ICT 기관 협력 사례"})
print('최종 답변:', result['output'])

에이전트는 질문의 의도에 따라 적절한 도구를 선택하기 위해 생각(Thought)하고, 이를 바탕으로 행동(Action)에서 도구를 선택했습니다.
그리고, 입력값을 바탕으로 검색어를 입력(Action Input)하며, 관찰 결과(Observation)를 확인한 후에 다시 생각하며 최종 답변 여부를 판단하게 됩니다.
💡 배운 점과 고민 포인트
- ReAct 에이전트는 하나의 질문에서 여러 검색 도구를 순차적으로 사용하여 멀티스텝 문제 해결이 가능합니다.
- description(도구 설명)이 부실하면, LLM이 잘못된 도구를 선택할 수 있으니 주의해야 합니다.
- Thought → Action → Observation 과정을 LLM이 잘못 작성하거나, 반복하거나, 불필요한 탐색을 하지 않도록 프롬프트 설계에서 세심한 지침을 주는 것이 필요합니다.
① 오늘자 날짜, 공부 시작, 종료 시각 포함 사진 각 1장


② 1개 클립 수강 인증 사진 1장 / 학습 인증 사진 1장


③ 챌린지 대상 강의 완강률 캡쳐 사진 1장

https://fastcampus.info/4n8ztzq
(~6/20) 50일의 기적 AI 환급반💫 | 패스트캠퍼스
초간단 미션! 하루 20분 공부하고 수강료 전액 환급에 AI 스킬 장착까지!
fastcampus.co.kr
'패스트캠퍼스환급챌린지' 카테고리의 다른 글
| 패스트캠퍼스 환급챌린지 16일차 : 파인튜닝과 RAG로 완성하는 맞춤형 LLM 서비스 개발 강의 후기 (3) | 2025.07.16 |
|---|---|
| 패스트캠퍼스 환급챌린지 15일차 : 파인튜닝과 RAG로 완성하는 맞춤형 LLM 서비스 개발 강의 후기 (2) | 2025.07.15 |
| 패스트캠퍼스 환급챌린지 13일차 : 파인튜닝과 RAG로 완성하는 맞춤형 LLM 서비스 개발 강의 후기 (2) | 2025.07.13 |
| 패스트캠퍼스 환급챌린지 12일차 : 파인튜닝과 RAG로 완성하는 맞춤형 LLM 서비스 개발 강의 후기 (0) | 2025.07.12 |
| 패스트캠퍼스 환급챌린지 11일차 : 파인튜닝과 RAG로 완성하는 맞춤형 LLM 서비스 개발 강의 후기 (1) | 2025.07.11 |