| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- DP
- ๊ทธ๋ํ
- ์ํ
- ๊ตฌํ
- ๋์ ๊ณํ๋ฒ
- skala
- ๋ณํฉ์ ๋ ฌ
- ๊น์ด์ฐ์ ํ์
- db
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์ ๋ ฌ
- LIS
- ๋ฐฑ์ค
- ๊ทธ๋ํํ์
- SQL
- ํ๋ก๊ทธ๋๋จธ์ค
- ์์ํ์
- ํ์ด์ฌ
- ๋ค์ด๋๋ฏนํ๋ก๊ทธ๋๋ฐ
- SK
- ์ค๋ธ์
- skala1๊ธฐ
- BFS
- ์๊ณ ๋ฆฌ์ฆ
- ๋จธ์ง์ํธ
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- DFS
- LLM
- ๋๋น์ฐ์ ํ์
- ๊ทธ๋ฆฌ๋
- Today
- Total
๐๐ญ๐ฐ๐ธ ๐ฃ๐ถ๐ต ๐ด๐ต๐ฆ๐ข๐ฅ๐บ
[LLM] LangGraph๋ฅผ ์จ์ ๊ฐ๋จํ multi AI Agent ์์คํ ์ ๋ง๋ค์ด๋ณด์ ๋ณธ๋ฌธ
[LLM] LangGraph๋ฅผ ์จ์ ๊ฐ๋จํ multi AI Agent ์์คํ ์ ๋ง๋ค์ด๋ณด์
.23 2025. 7. 1. 11:07๐ฆ๐ธ๏ธ LangGraph?
๋ญ๊ทธ๋ํ(LangGraph)๋ LangChain ์ํ๊ณ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ฐ๋ ฅํ ํ๋ ์์ํฌ๋ก, ๋ฉํฐ ์์ด์ ํธ ์์คํ ๊ณผ AI ์ํฌํ๋ก์ฐ ๊ฐ๋ฐ์ ํนํ๋์ด ์๋ค. LangChain์ ๊ธฐ๋ฅ์ ํ์ฅํ์ฌ LLM์ ์ฌ์ฉํ ์ํ ์ ์ง์ ์ฌ๋ฌ ์์ด์ ํธ ๊ฐ์ ํ์ ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋๋ก ์ค๊ณ๋์๋ค. ์ฆ, LangGraph๋ ๋จ๋ฐฉํฅ ์ฒด์ธ ํํ์ LangChain์ ํ์ฅํ์ฌ ๋ค์์ ์์ด์ ํธ๋ฅผ ์ํ ๊ธฐ๋ฐ(Stateful)์ผ๋ก ์ฐ๊ฒฐํ๊ณ , ์กฐ๊ฑด ๋ถ๊ธฐ, ๋ฃจํ, ๋ณ๋ ฌ ์ฒ๋ฆฌ ๋ฑ์ ํฌํจํ๋ ๋ณต์กํ AI ์ํฌํ๋ก์ฐ๋ฅผ ๊ตฌ์ถํ ์ ์๋ ํ๋ ์์ํฌ์ด๋ค.
๐ ๋ญ์ฒด์ธ(LangChain)์ด ๋ญ์์? : https://miiinnn23.tistory.com/117
LangChain์ด A → B → C ์์ผ๋ก ์์ฐจ ์ํ๋๋ค๋ฉด,
LangGraph๋ '์กฐ๊ฑด ๋ถ๊ธฐ'์ '๋ฐ๋ณต'์ ๊ฐ๋ ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ A ↔ B ↔ C ์ ๊ฐ์ด ์ํ๋ ์ ์๋ค.
์ด๋ฌํ ๋ญ๊ทธ๋ํ๋ ๊ฐ ๋
ธ๋๊ฐ LLM ์์ด์ ํธ๋ฅผ ๋ํ๋ด๊ณ , ์ฃ์ง๊ฐ ์์ด์ ํธ ๊ฐ์ ์ํธ์์ฉ์ ๋ํ๋ด๋ ๊ทธ๋ํ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ฅผ ํตํด ๋ณต์กํ ์ํฌํ๋ก์ฐ๋ฅผ ์๊ฐ์ ์ผ๋ก ํํํ๊ณ ๊ด๋ฆฌํ ์ ์๋ค. ํนํ ์ํ(cycle) ๊ตฌ์กฐ๋ฅผ ์ง์ํ์ฌ ํ๋ก์ธ์ค๋ฅผ ์ง์์ ์ผ๋ก ๋ฐ๋ณตํ๋ฉฐ, ๋ณํํ๋ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋์ ์ผ๋ก ์์
์ ๊ฒฐ์ ํ ์ ์๋ค.
๋ํ ๋ญ๊ทธ๋ํ๋ ์ํ ๊ด๋ฆฌ ์์คํ
์ ํตํด ์ฌ๋ฌ ์์ด์ ํธ๊ฐ ์ ๋ณด๋ฅผ ๊ณต์ ํ๊ณ , ์ ์ฒด ์์คํ
์ ์ผ๊ด์ฑ๊ณผ ํจ์จ์ฑ์ ์ ์งํ ์ ์๋ค. ๊ฐ ๋
ธ๋๊ฐ ๊ธ๋ก๋ฒ ์ํ(STATE)๋ฅผ ์ฐธ์กฐํ๋ฉด์ ๋์ํ์ฌ, LLM์ ์ฌ์ฉํ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ ์งํ ์ ์๋ค๋ ์ฅ์ ์ด ์กด์ฌํ๋ค.
์ฉ์ด ์ ๋ฆฌ
โ๏ธ AI ์์ด์ ํธ: ์ฃผ์ด์ง ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ์ ๋ ฅ์ ๋ฐ์ reasoning๊ณผ ํ๋์ ์ํํ๋ ๋ ๋ฆฝ์ ์ธ ์คํ ๋จ์
โ๏ธ ์ํ(STATE): ์์ด์ ํธ ์คํ ๊ณผ์ ์์ ๊ณต์ ๋๋ฉฐ, ํ๋ฆ ์ ์ด๋ ์์ฌ๊ฒฐ์ ์ ํ์ฉ๋๋ ๋ฐ์ดํฐ์ ์งํฉ
AI ์์ด์ ํธ๋ ๊ฐ๊ฐ์ ๋ก์ง/์๋น์ค ๋จ์์ด๊ณ , ์ํ๋ ๋ก์ง๋ค์ด ๊ณต์ ํ๋ ๋ฐ์ดํฐ์ด๋ค.
'ํ๋กฌํํธ build' โก๏ธ '์์ฑ' โก๏ธ 'ํ์ผ ์์ฑ' ์ ๋ก์ง์ผ๋ก ๊ตฌ์ฑ๋ ๋ ํฌํธ ์์ฑ application์ ์๋ก ๋ค์์ ๋, ๊ฐ ๋จ๊ณ ๋ณ ๋ก์ง๋ค์ด AI ์์ด์ ํธ์ด์ ๋ ธ๋๊ฐ ๋๊ณ ,
ํ๋กฌํํธ build์์ ์์ฑ ๋ก์ง์ผ๋ก ์ด์ด์ง ๋ '์์ฑ๋ ํ๋กฌํํธ'์ ๊ฐ์ด AI ์์ด์ ํธ๋ค์ด ์์ฑํ์ฌ ๋ค์ ์์ด์ ํธ๋ก ์ ํด์ค์ผ ํ๋ ๋ฐ์ดํฐ๋ ๊ณง ์ํ๊ฐ ๋๋ค.
์ฌ์ฉ ํ๊ฒฝ
โ๏ธ ํ์ด์ฌ: 3.11.9
โ๏ธ LangChain: 0.3.25
โ๏ธ LangGraph: 0.4.8
AI agent๋ฅผ ์ค๊ณํด๋ณด์
์น e2e ์๋ํ ํ ์คํธ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์, ํ ์คํธ ์๋๋ฆฌ์ค์ API ์ ๋ณด๋ฅผ ์ข ํฉํ์ฌ ๊ฐ API๋ณ๋ก ์ ํฉํ ํ ์คํธ ์ผ์ด์ค ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด์ฃผ๋ 'TC Generator System'์ ์ค๊ณํ๊ฒ ๋์๋ค. ๋จ์ํ ๋ญ์ฒด์ธ์ ํตํด ํ๋กฌํํธ๋ก TC๋ฅผ ์์ฑํ ์ ์์์ง๋ง, ๋ช ๊ฐ์ง ๊ณ ๋ ค์ฌํญ์ด ์์๊ธฐ ๋๋ฌธ์ ๊ต์ก์์ ๋ค์๋ LangGraph๋ฅผ ์ฌ์ฉํ ์์ด์ ํธ ์์คํ ์ ๊ตฌํํ๊ธฐ๋ก ํ๋ค. ํด๋น ์์ฑ ๋ก์ง์ ๊ตฌํํ ๋ ๊ฐ์ฅ ํฌ๊ฒ ๊ณ ๋ คํด์ผ ํ ์ ์
- ์์ฑ๋ TC๊ฐ ์๋๋ฆฌ์ค ๋ด์์ ์ฌ์ฉํ๋ API์ ์ผ์ ๋น์จ ์ด์์ ์ปค๋ฒํ ์ ์์ด์ผ ํจ
- LLM์ hallucination์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฐ๋์ ์๊ฐ ๊ฒ์ฆ ๋ก์ง์ด ์์ด์ผ ํจ
์ด๋ ๊ฒ ๋ ๊ฐ์ง๊ฐ ์์๋ค. ๋ฐ๋ผ์ ํฌ๊ฒ API coverage ๊ณผ ์๊ฐ ๊ฒ์ฆ ๋ก์ง์ ๋ถ๊ธฐ์ ์ผ๋ก ์ก๊ณ agent 5๊ฐ๋ฅผ ๊ฐ์ง ์์ ์์ฑ ์์คํ ์ ์ค๊ณํ๊ฒ ๋์๋ค.
๊ทธ๋ํ ์ ์

โ๏ธ GENERATE_TC: ์ ๋ ฅ ๋ฐ์ดํฐ๋ค๋ก๋ถํฐ ํ๋กฌํํธ๋ฅผ buildํ๊ณ , ์ด๋ก๋ถํฐ LLM ๊ธฐ๋ฐ TC ์์ฑ.
โ๏ธ CHECK_COVERAGE: API๊ฐ ์๊ณ๊ฐ ์ด์ ์ปค๋ฒ ๋์๋์ง ๋ฃฐ ๊ธฐ๋ฐ ๊ฒ์ฆ.
โ๏ธ CLEAR_TC: ์์ฑ ์ค๋ฅ๋ ์ค๋จ๋์ด ์๊ณ๊ฐ ์ดํ์ API๋ฅผ ์ปค๋ฒํ์ ์ ์ฌ์์ฑ ๋ก์ง ๋์ ํ๊ธฐ ์ํด ์ง๊ธ๊น์ง ์์ฑ๋ TC ์ ๋ณด ์ญ์ .
โ๏ธ VALIDATE_TC: ์์ฑ๋ TC๊ฐ ์๋๋ฆฌ์ค์ ๊ฒ์ฆ ํฌ์ธํธ์ ๋ง๊ฒ ์ค๊ณ๋์๋์ง, ๊ฐ์ ์ค๋ฅ๋ ์๋์ง LLM์ ํตํ ์๊ฐ ๊ฒ์ฆ.
โ๏ธ REGENERATE_TC: ๊ฒ์ฆ ๋ก์ง์์ ์ค๋ฅ๊ฐ ์๋ค๊ณ ํ๋จ๋ TC์ ํ์ ํ์ฌ TC ์ฌ์์ฑ. ๊ณผ๋ค ์์ฑ์ ๋ฐฉ์งํ๊ธฐ ์ํด 3๋ฒ ์ด์ ๊ฒ์ฆ ๋ก์ง์ด ๋ฐ๋ณต๋ ์ ์์ฑ ์ข ๋ฃ.
STATE ์ ์
TC ์์ฑ์ ์ํ ์ ๋ณด์ ๊ฒ์ฆ ๋ก์ง์ ํ์ํ ์ ์ญ ๋ฐ์ดํฐ๋ฅผ ๊ณ ๋ คํ์ฌ STATE๋ฅผ ์ ์ํ์๋ค. STATE๋ ์ผ์ข ์ payload ๊ฐ๋ ์ผ๋ก, ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ํ์๋ ์์ง๋ง ๊ฐ ์์ด์ ํธ๊ฐ ์ฐธ์กฐํ ์ ์๋ ๊ณตํต์ ์ปจํ ์คํธ๋ก์, ํ์ํ ๊ฐ์ ์ ์ ํ ์ ์ํด์ฃผ๋ ๊ฒ์ด ์ค์ํ๋ค.
class FlowState(BaseModel):
"""
TC ์์ฑ STATE ์ ์
- ์๋๋ฆฌ์ค ID
- ์์ฑ์ ํ์ํ request ๊ฐ์ฒด
- ์์ฑ๋ TC ๋ชฉ๋ก
- TC์ ๋ํ coverage ๊ฐ(๊ฒ์ฆ๋ฅ )
- regenerated ํ์ํ tc id ๋ฐ ์ฌ์
- ์ฌ์๋ ํ์
"""
scenario_id: str
request: TestcaseGenerationRequest
tc_list: List[TestcaseData] = []
coverage: Optional[float] = None
revalidation_targets: List[Tuple[str, str]] = [] # (tc_list index, reason)
retry_count: int = 0
๊ทธ๋ํ ์ค๊ณ
๋ ธ๋์ STATE ์ ์๊ฐ ๋๋ฌ๋ค๋ฉด, ์ด์ ๋ถํฐ๋ ์ค์ ๋ก์ง์ ์ค๊ณํด์ค๋ค. LangGraph์ ์คํ ํ๋ฆ์ ๊ทธ๋ํ ๋น๋ → ์ปดํ์ผ → ์คํ(invoke) ์์๋ก ์งํ๋๋ฉฐ, ์ด ๊ณผ์ ์ ๋ง์น ํจ์๋ฅผ ์ ์ํ๋ฏ ๋ ธ๋๋ฅผ ๋ฐฐ์นํ๊ณ ํ๋ฆ์ ๊ตฌ์ฑํ๋ ๊ณผ์ ์ ๊ฐ๊น๋ค. ๋ณ๋์ ๊ทธ๋ํ ์ค๊ณ ํจ์์์ compile๊น์ง ์๋ฃ๋ ์ํ์ ๊ทธ๋ํ๋ฅผ ๋ฐํํ๋๋ก ์ ์ํด์ฃผ์๋ค.
๋จผ์ ์ด๋ค STATE๋ฅผ ๊ฐ์ง ๊ทธ๋ํ๋ฅผ ์ค๊ณํ ๊ฒ์ธ์ง StateGraph์ builder๋ฅผ ์ ์ํด์ค๋ค.
builder = StateGraph(state_schema=FlowState)
์ดํ ์ฐจ๋ก๋๋ก ๋ ธ๋๋ฅผ ์ถ๊ฐํ๋ค.
# 1. ๊ฐ API ๋งคํ์ ๋ํด TC ์์ฑ → ์์ฑ๋ TC๋ ์ํ์ ์ถ๊ฐ
builder.add_node("generate_tc", generate_tc_node)
# 2. coverage ํ๋จ ํ ๋ถ๊ธฐ
builder.add_node("check_coverage", coverage_check_node)
# 2-1. coverage ๋ฏธ๋ฌ ์ ์ฌ์์ฑ ๋ก์ง ์ํ ์ TC ๋ฆฌ์คํธ ์ด๊ธฐํ
builder.add_node("clear_tc", clear_tc_node)
# 3. ๊ฒ์ฆ ์งํ
builder.add_node("validate_tc", validate_tc_node)
# 4. ๊ฒ์ฆ ํ ์คํจ TC์ ๋ํ ์ฌ์์ฑ ์ํ
builder.add_node("regenerate_tc", regenerate_tc_node)
๋ ธ๋๋ฅผ ์ถ๊ฐํ ํ ์ด๋์ ์์ํ๋์ง entry point๋ฅผ ์ค์ ํ๊ณ , ๊ฐ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํด์ค๋ค.
# ํ๋ฆ ์ ์
builder.set_entry_point("generate_tc")
builder.add_edge("generate_tc", "check_coverage")
# coverage ํ๋จ์ ๋ฐ๋ผ ๋ถ๊ธฐ
builder.add_conditional_edges(
source="check_coverage",
path=coverage_decision_fn,
path_map={
"pass": "validate_tc", # coverage ์ถฉ๋ถํ ๊ฒฝ์ฐ
"fail": "clear_tc" # ์๋์ ์์ฑ tc ์ด๊ธฐํ
}
)
builder.add_edge("clear_tc", "generate_tc")
# ๊ฒ์ฆ ์คํจ TC ์กด์ฌ ์ฌ๋ถ์ ๋ํด ๋ถ๊ธฐ
builder.add_conditional_edges(
source="validate_tc",
path=regenerate_decision_fn,
path_map={
"pass": END,
"fail": "regenerate_tc", # validation ์คํจ ์ ์ฌ์์ฑ ๋ก์ง ๋์
"giveup": END # validation - regenerate 3๋ฒ ๋ฐ๋ณต ์ ๋ฃจํ ํ์ถ
}
)
builder.add_edge("regenerate_tc", "validate_tc") # ๋ฃจํ ์ถ๊ฐ
์ด ๋ ๋ถ๊ธฐ์ ์ add_conditional_edges๋ฅผ ํตํด ์ด๋ค ์ด๋ฆ์ ๋ ธ๋(source)๋ก๋ถํฐ ์ด๋ค ํจ์๋ฅผ ๊ธฐ์ค(path)์ผ๋ก ํด๋น ํจ์๊ฐ ์ด๋ค ๊ฐ์ ๋ฐํํ๋๋์ ๋ฐ๋ผ ์ด๋ ๋ ธ๋๋ก ๊ฐ์ง(path_map)๋ฅผ ๊ฒฐ์ ํด์ค๋ค.
def regenerate_decision_fn(state: FlowState) -> str:
"""
revalidation_targets์ ์ฌ์์ฑ ๋์์ด ์๋์ง ํ๋จํ์ฌ ๋ถ๊ธฐ
- ์์ผ๋ฉด: "pass"
- ์์ผ๋ฉด: "fail"
- ์ฌ๊ฒ์ฆ 3๋ฒ ์ด์: "giveup"
"""
if not state.revalidation_targets:
return "pass"
if state.retry_count >= 3:
return "giveup" # 3ํ ์คํจ ์
return "fail"
์ด ๋์ path์ ๋ค์ด๊ฐ ํจ์๋ ์์ ๊ฐ์ด ์ด๋ค ์กฐ๊ฑด์ ๋ฐ๋ผ ํน์ ๊ฐ์ ๋ฐํํ๊ฒ ์ ์ธํด์ฃผ๋ฉด ๋๋ค. ํด๋น ๋จ๊ณ์์ ์์ ๊ฐ์ด loop ์กฐ๊ฑด์ ์ค์ ํด์ค ์๋ ์๊ณ , ๋จ์ํ ์ด๋ ๋ ธ๋๋ก ๊ฐ์ง ๋ถ๊ธฐ์ ๋ง ์ฐ๊ฒฐํด์ฃผ์ด๋ ๋๋ค.
์ดํ builder๋ฅผ compile๊น์ง ํ์ฌ returnํด์ฃผ๋ฉด ๋ฐ๋ก invokeํ์ฌ ์ฌ์ฉํ ์ ์๋ ๊ทธ๋ํ ๋น๋ ํจ์ ๋!!
return builder.compile()
๊ทธ๋ํ ์คํ
๊ทธ๋ํ๋ controller๋ ๋ค๋ฅธ ๋จ์์ ์ ๋ ฅ๋ฐ์ request ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก state๋ฅผ ์ ์ํด์ฃผ๊ณ , ๋น๋๋ ๊ทธ๋ํ์ state๋ฅผ ๋ฃ์ด invoke๋ง ํด์ฃผ๋ฉด ๋๋๋ค. ์ ๋ง ๊ฐ๋จํ์ฃ ?
์ดํ ์ ์๋ state๋ฅผ ์๋ต ๊ฐ์ฒด์ ๋ง๊ฒ ๋ค์ ์ง๋ ฌํํ์ฌ ๋ฐํ๋ง ํด์ฃผ๋ฉด TC ์์ฑ์ ๋์ด๋ค. ์ํธ๐
state = FlowState(scenario_id=scenario_id, request=request)
# ๊ทธ๋ํ ๋น๋
graph = build_testcase_flow()
# ๊ทธ๋ํ ์คํ
result: dict = await graph.ainvoke(state)
# ์๋ต ์กฐํฉ
response = build_tc_response_from_state(result)
์คํ ๊ฒฐ๊ณผ
LangChain API KEY๋ฅผ ๋ฐ๊ธ๋ฐ์ ์คํํ ๋ env์ ๋ฃ์ด์ฃผ๋ฉด ํธ๋ํนํ ์ ์๋ค. ์ด ๋ ๊ทธ๋ํ์ ์ด๋ค ๋ก์ง์ ํ๋์ง, ๊ทธ ๋์ ๊ฒฐ๊ณผ๊ฐ์ด ์ด๋ป๊ฒ ๋์๋์ง, ์๊ฐ์ด ์ผ๋ง๋ ์์๋์๋์ง, ์ผ๋ง์ ํ ํฐ์ด ์๋ชจ๋๋์ง, ์ฌ์ง์ด๋ ์ด๋ค ์๋ฌ๊ฐ ๋ฐ์ํ๋์ง ๊น์ง๋ ๊ฐํธํ๊ฒ ํ์ธํ ์ ์๊ธฐ ๋๋ฌธ์ ํธ๋ํน ํ๋ ๊ฒ์ ์ถ์ฒํ๋ค.(๊ฐ์ธ ์ฌ์ฉ ์ Tracing์ ๋ฌด๋ฃ!)


one-shot learning์ผ๋ก ๊ฐ๋ ฅํ๊ฒ ํ๋กฌํํธ๋ฅผ ์์ฑํ๋๋ JsonOutputParser๋ฅผ ํ์๋ ๋ฌธ์ ์๋ ์๋ต์ด ๋ฐํ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
coverage ๋ฒ์๋ 60%์ผ๋ก ์ก์๊ธฐ ๋๋ฌธ์, TC ๋ฐ์ดํฐ ์์ฑ ๋์ค ๋ฌธ์ ๊ฐ ์๊ธฐ์ง ์๋๋ค๋ฉด ์ฌ๋งํด์ ๊ฒ์ฆ๋ก์ง์ผ๋ก ์ ๋์ด๊ฐ๋ค.


๊ทผ๋ฐ ๊ฐ๋ LLM์ ๋ฐ๋์ด ์ผ์ด๋๋ฉด ์ ๋ ๊ฒ๋๋ค๐
๊ทธ์น๋ง ์ค๊ณ ์๋๋๋ก ๊ทธ๋ํ๋ฅผ ์ ํ๋ ๊ฒ์ ์กฐ๊ธ์ด๋๋ง ์์์..
ใ ใ
์ฒ์์ ์ค๊ณํด์ค์ผ ํ๋ ๋ก์ง์ด๋ STATE ๊ฐ๋ ์ด ์ด๋ ค์์ LangGraph์ ๋ฏ๊ฐ๋ ธ๋๋ฐ, (๋ฒ์ ๋ง๋ค ์ฝ๋๋ ์ฒ์ฐจ๋ง๋ณ์ด๋ผ GPT ํ์์ ์ฝ๋ ๋ง๋ค์ด๋ฌ๋ผํ๊ธฐ๋ ์ด๋ ค์ ์ ใ ใ ) ๋์ ์๋ฆฌ๋ฅผ ์ด๋์ ๋ ์ดํดํ๊ณ ๋๋ ์ด๊ฑฐ๋งํผ ๊ฐ๋ ฅํ ํ๋ ์์ํฌ๋ ์๋๊ฑฐ๊ฐ๋ค. ์ ๊ธฐ์ ์ ์ด๋ฆฐ ๋ง์ธ๋๋ก ๋ฐฐ์ฐ์.