โReason โ Act โ Observe โ Repeatโ
LLM์ด ์ค์ค๋ก ์๊ฐํ๊ณ ํ๋ํ๋ ์์จํ ๊ทธ๋ํ์ ํ์.
ReAct๋ โReasoning + Actingโ์ ํฉ์ฑ์ด๋ก, LLM์ด ์ฌ๊ณ (Reason) โ ํ๋(Act) โ ๊ด์ฐฐ(Observe) โ ์ฌ์ฌ๊ณ (Reflect) ์ ์ํ์ ๋ฐ๋ณตํ๋ฉฐ ์ค์ค๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ก ์ค๊ณ๋ ๊ตฌ์กฐ์
๋๋ค.
LangChain์ Agent๋ ์ด ํจํด์ ๊ธฐ๋ฐ์ผ๋ก ํ์ฃ .
LangGraph์์๋ ์ด ๊ณผ์ ์ ๋ช
์์ ๊ทธ๋ํ ํ๋ฆ์ผ๋ก ํํํ ์ ์์ต๋๋ค.
LLM์ ๋ฐ๋ณต ๋ฃจํ๋ฅผ ๊ทธ๋ํ๋ก ์๊ฐํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.

์ด ๊ตฌ์กฐ๋ฅผ LangGraph๋ก ๊ตฌํํ๋ฉด, LLM์ด Tool์ ์ฌ์ฉํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ค์ค๋ก ํ๊ฐํ์ฌ ๋ค์ ์๋ํ๋ ์์จํ ๊ทธ๋ํ๊ฐ ๋ง๋ค์ด์ง๋๋ค.
| ๊ตฌ์ฑ ์์ | ์ค๋ช | ์์ |
|---|---|---|
| ReasonNode | LLM์ด ๋ฌธ์ ๋ฅผ ๋ถ์ํ๊ณ , ์ด๋ค ๋๊ตฌ๋ฅผ ์ธ์ง ํ๋จ | โํ์ฌ ๋ ์จ๋ฅผ ์๋ ค๋ฉด get_weather๋ฅผ ์จ์ผ๊ฒ ๋ค.โ |
| ToolNode | LLM์ด ์ ํํ ๋๊ตฌ๋ฅผ ์คํ | get_weather("Seoul") |
| ObserveNode | Tool ๊ฒฐ๊ณผ๋ฅผ ๊ฒํ ํ๊ณ ํ๋จ | โ๊ฒฐ๊ณผ๊ฐ ์ด์ํ๋ฉด ๋ค์ ์๋.โ |
| MemorySaver | ์ํ ์ ์ฅ ๋ฐ ๋ฃจํ ์ถ์ | ์ด์ reasoning ๋ฐ tool ๊ฒฐ๊ณผ ๋์ |
์๋๋ โ์ง๋ฌธ โ ์ฌ๊ณ โ ํ๋ โ ๊ด์ฐฐ โ ๋ฐ๋ณตโ์ ๊ตฌํํ ์ต์ ์์์ ๋๋ค.
from langgraph.graph import StateGraph
from langchain_openai import ChatOpenAI
# ์ํ ์ ์
class AgentState:
question: str
action: str
observation: str
retry: int = 0
# Reason ๋
ธ๋
def reason(state: AgentState):
llm = ChatOpenAI(model="gpt-4o-mini")
prompt = f"Q: {state.question}\n์ด๋ค ํ๋์ ํด์ผ ๋ต์ ์ฐพ์ ์ ์์๊น?"
res = llm.invoke(prompt)
state.action = res.content.strip()
print(f"[Reason] ๊ฒฐ์ ๋ ํ๋: {state.action}")
return state
# Act ๋
ธ๋
def act(state: AgentState):
if "๋ ์จ" in state.action:
state.observation = "์์ธ์ ๋ ์จ๋ ๋ง์ โ๏ธ"
else:
state.observation = "์ ์ ํ ๋๊ตฌ๋ฅผ ์ฐพ์ง ๋ชปํจ"
print(f"[Act] ๊ด์ฐฐ ๊ฒฐ๊ณผ: {state.observation}")
return state
# Observe ๋
ธ๋
def observe(state: AgentState):
if "๋ง์" in state.observation or state.retry >= 1:
print("[Observe] ๊ฒฐ๊ณผ ๋ง์กฑ. ์ข
๋ฃํฉ๋๋ค.")
return "finish"
print("[Observe] ๊ฒฐ๊ณผ ๋ถ๋ง์กฑ. ๋ค์ Reason ๋จ๊ณ๋ก.")
state.retry += 1
return "reason"
# ๊ทธ๋ํ ๊ตฌ์ฑ
graph = StateGraph(AgentState)
graph.add_node("reason", reason)
graph.add_node("act", act)
graph.add_node("observe", observe)
graph.add_edge("reason", "act")
graph.add_edge("act", "observe")
graph.add_conditional_edges("observe", observe)
graph.set_entry_point("reason")
graph.set_finish_point("observe")
app = graph.compile()
app.invoke({"question": "์์ธ์ ๋ ์จ ์๋ ค์ค"})
๐ค ์คํ ์์:
[Reason] ๊ฒฐ์ ๋ ํ๋: ๋ ์จ API๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
[Act] ๊ด์ฐฐ ๊ฒฐ๊ณผ: ์์ธ์ ๋ ์จ๋ ๋ง์ โ๏ธ
[Observe] ๊ฒฐ๊ณผ ๋ง์กฑ. ์ข
๋ฃํฉ๋๋ค.
LLM์ด ์ค์ค๋ก โ๋ฌด์์ ํด์ผ ํ๋์งโ ํ๋จํ๊ณ , ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ด์ฐฐํ์ฌ ๋ค์ ๋จ๊ณ๋ฅผ ๊ฒฐ์ ํ๋ ReAct ๋ฃจํ๊ฐ ๋ง๋ค์ด์ก์ต๋๋ค.
MemorySaver๋ฅผ ์ถ๊ฐํ๋ฉด, ๋ฃจํ๊ฐ ๋์๋ ์ด์ Reason/Act/Observe ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ ๊ธฐ์ตํฉ๋๋ค.
from langgraph.checkpoint.memory import MemorySaver
memory = MemorySaver()
app = graph.compile(checkpointer=memory)
์ด์ ๊ฐ ๋ฃจํ๋ง๋ค ์ํ ๋ณํ๊ฐ ์ถ์ ๋์ด, โ์ ์ด๋ฐ ๊ฒฐ์ ์ ๋ด๋ ธ๋๊ฐโ๋ฅผ ๋์ค์ ์ถ์ ํ ์ ์์ต๋๋ค. (LLM์ reasoning trace ๋ถ์์๋ ๋งค์ฐ ์ ์ฉ)
| ๊ตฌ์ฑ ์์ | LangGraph ํํ | ์๋ฏธ |
|---|---|---|
| Reason | Node (LLM ํธ์ถ) | ์ฌ๊ณ ๋จ๊ณ |
| Act | ToolNode | ํ๋ ๋จ๊ณ |
| Observe | Conditional Edge | ํผ๋๋ฐฑ / ๋ฃจํ ์ ์ด |
| MemorySaver | Checkpoint | ์ํ ์ง์ |
| Loop | Edge ์ํ | ReAct ๋ฃจํ ๊ตฌํ |
LangChain์์๋ โ์๋โ์ผ๋ก ๋์๊ฐ๋ ๋ฃจํ๋ฅผ LangGraph์์๋ ๋ช ์์ ์ผ๋ก ์ฝ๋๋ก ์ ์ดํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, โ์์ธ์ ๋ ์จ์ ํ์ฌ ํ์จ์ ํจ๊ป ์๋ ค์คโ ๊ฐ์ ์์ฒญ์ ReAct ๊ทธ๋ํ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ํ์ฅํ ์ ์์ต๋๋ค.

๊ฐ ToolNode๋ ๋ณ๋ ฌ ์คํ ๊ฐ๋ฅํ๋ฉฐ, LLM์ ์ํฉ์ ๋ฐ๋ผ ์ด๋ค Tool์ ํธ์ถํ ์ง ๊ฒฐ์ ํ ์ ์์ต๋๋ค. (์ด๋ฅผ ์ํด โฃํธ์์ ๋ฐฐ์ด ToolCondition ๊ตฌ์กฐ๊ฐ ๊ทธ๋๋ก ์ฌ์ฉ๋ฉ๋๋ค.)
๐ 6ํธ: ๊ทธ๋ํ ๊ธฐ๋ฐ RAG (๊ฒ์+์์ฑ ์์คํ
)
ReAct ๊ตฌ์กฐ๋ฅผ ํ์ฅํ์ฌ โ์ง๋ฌธ โ ๊ฒ์ โ ์์ฑ โ ํ๊ฐ โ ์์ โ์ผ๋ก ์ด์ด์ง๋
Adaptive / Self / Corrective RAG ๊ทธ๋ํ๋ฅผ ์ค๊ณํฉ๋๋ค.
| ์ฃผ์ | ํ์ต ์ด์ | ์ถ์ฒ ํ์ต ๋ฐฉํฅ |
|---|---|---|
| Cognitive Architecture | ReAct์ ๊ทผ๋ณธ ์๋ฆฌ (ACT-R, Soar ๋ฑ) ์ดํด | ์ธ์ง ๋ชจ๋ธ ๊ธฐ๋ฐ LLM ๋ฃจํ ์ค๊ณ |
| LangGraph MemorySaver Internals | ์ํ ์ฒดํฌํฌ์ธํธ์ ๊ตฌ์กฐ์ ๋ก๊น ์ดํด | MemorySaver + graph.get_state() |
| LLM Reasoning Trace ๋ถ์ | ์ฌ๊ณ ๊ณผ์ ์๊ฐํ ๋ฐ ํ๊ฐ | Reasoning log / reflection system |
| Multi-Tool Planning | ์ฌ๋ฌ Tool ์ค ์ ํ์ ํธ์ถ ์ค๊ณ | PolicyNode / ToolCondition ๊ณ ๊ธ ํจํด |
| Self-Reflective Agent | LLM ์ค์ค๋ก reasoning ํ๊ฐ | Reflection node + critic model |
| LangGraph + LangServe | ReAct ์์ด์ ํธ๋ฅผ API ์๋น์คํ | REST + StreamLog ํตํฉ |
- ReAct๋ โReason โ Act โ Observeโ์ ๋ฃจํ ๊ตฌ์กฐ๋ก LLM์ ์์จ์ฑ์ ๊ตฌํํ๋ค.
- LangGraph์์๋ ์ด ๋ฃจํ๋ฅผ ๋ช ์์ ๊ทธ๋ํ๋ก ํํํ๊ณ ,
MemorySaver๋ก reasoning trace๋ฅผ ๊ด๋ฆฌํ๋ค.- ์ด ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก RAG, ํ๊ฐ ๋ฃจํ, ์์จํ ์์ด์ ํธ ๋ฑ์ผ๋ก ํ์ฅํ ์ ์๋ค.
๐ฌ ์ด์ ์ฐ๋ฆฌ๋ โ๋ช ๋ น๋ฐ๋ LLMโ์ด ์๋, โ์ค์ค๋ก ์ฌ๊ณ ํ๋ ์์คํ โ์ ๋ค๋ฃฐ ์ ์๋ค.