diff --git a/units/en/unit2/langgraph/when_to_use_langgraph.mdx b/units/en/unit2/langgraph/when_to_use_langgraph.mdx
index 28e1d850..2123e849 100644
--- a/units/en/unit2/langgraph/when_to_use_langgraph.mdx
+++ b/units/en/unit2/langgraph/when_to_use_langgraph.mdx
@@ -1,4 +1,4 @@
-# What is `LangGraph`?
+# What is `LangGraph`? [[what-is-langgraph]]
`LangGraph` is a framework developed by [LangChain](https://www.langchain.com/) **to manage the control flow of applications that integrate an LLM**.
diff --git a/units/ko/_toctree.yml b/units/ko/_toctree.yml
index 124595ce..7a7e6da3 100644
--- a/units/ko/_toctree.yml
+++ b/units/ko/_toctree.yml
@@ -1,40 +1,106 @@
- title: Unit 0. Welcome to the course
sections:
- local: unit0/introduction
- title: Welcome to the course ๐ค
+ title: AI ์์ด์ ํธ ์ฝ์ค์ ์ค์ ๊ฑธ ํ์ํฉ๋๋ค ๐ค
- local: unit0/onboarding
- title: Onboarding
+ title: ์จ๋ณด๋ฉ(Onboarding), ์ฒซ ๊ฑธ์ ๋ด๋๊ธฐ โต
- local: unit0/discord101
- title: (Optional) Discord 101
+ title: (์ ํ) Discord 101
- title: Unit 1. Introduction to Agents
sections:
- local: unit1/introduction
- title: Introduction
+ title: ์์ด์ ํธ ์๊ฐ
- local: unit1/what-are-agents
- title: What is an Agent?
+ title: ์์ด์ ํธ๋?
- local: unit1/quiz1
title: Quick Quiz 1
- local: unit1/what-are-llms
- title: What are LLMs?
+ title: LLM์ด๋?
- local: unit1/messages-and-special-tokens
- title: Messages and Special Tokens
+ title: ๋ฉ์ธ์ง์ ํน์ ํ ํฐ
- local: unit1/tools
- title: What are Tools?
+ title: ๋๊ตฌ๋?
- local: unit1/quiz2
title: Quick Quiz 2
- local: unit1/agent-steps-and-structure
- title: Understanding AI Agents through the Thought-Action-Observation Cycle
+ title: ์ฌ๊ณ -ํ๋-๊ด์ฐฐ ์ฃผ๊ธฐ๋ฅผ ํตํด AI ์์ด์ ํธ ์ดํดํ๊ธฐ
- local: unit1/thoughts
- title: Thought, Internal Reasoning and the Re-Act Approach
+ title: ์ฌ๊ณ , AI ์์ด์ ํธ์ ๋ด๋ถ ์ถ๋ก ๊ณผ Re-Act ๋ฐฉ์
- local: unit1/actions
- title: Actions, Enabling the Agent to Engage with Its Environment
+ title: ์ก์
, ์์ด์ ํธ๊ฐ ํ๊ฒฝ๊ณผ ์ํธ์์ฉํ ์ ์๊ฒ ํ๊ธฐ
- local: unit1/observations
- title: Observe, Integrating Feedback to Reflect and Adapt
+ title: ๊ด์ฐฐ, ํผ๋๋ฐฑ์ ํตํฉํ์ฌ ์ฑ์ฐฐํ๊ณ ์ ์ํ๊ธฐ
- local: unit1/dummy-agent-library
- title: Dummy Agent Library
+ title: ๋๋ฏธ ์์ด์ ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- local: unit1/tutorial
- title: Letโs Create Our First Agent Using smolagents
+ title: smolagents๋ก ์ฒซ ๋ฒ์งธ ์์ด์ ํธ ๋ง๋ค๊ธฐ
- local: unit1/final-quiz
title: Unit 1 Final Quiz
- local: unit1/conclusion
title: Conclusion
+- title: Unit 2. Frameworks for AI Agents
+ sections:
+ - local: unit2/introduction
+ title: AI Agent ํ๋ ์์ํฌ ์๊ฐ
+- title: Unit 2.1 The smolagents framework
+ sections:
+ - local: unit2/smolagents/introduction
+ title: smolagents ์๊ฐ
+ - local: unit2/smolagents/why_use_smolagents
+ title: smolagents๋ฅผ ์ ์ฌ์ฉํ ๊น?
+ - local: unit2/smolagents/quiz1
+ title: Quick Quiz 1
+ - local: unit2/smolagents/code_agents
+ title: ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ์์ด์ ํธ ๋ง๋ค๊ธฐ
+ - local: unit2/smolagents/tool_calling_agents
+ title: ์ก์
์ ์ฝ๋ ์กฐ๊ฐ(์ฝ๋ ์ค๋ํซ)์ด๋ JSON ๋ธ๋กญ์ผ๋ก ์์ฑํ๊ธฐ
+ - local: unit2/smolagents/tools
+ title: Tool ๋๊ตฌ ์๊ฐ
+ - local: unit2/smolagents/retrieval_agents
+ title: ๊ฒ์ ์์ด์ ํธ
+ - local: unit2/smolagents/quiz2
+ title: Quick Quiz 2
+ - local: unit2/smolagents/multi_agent_systems
+ title: ๋ฉํฐ ์์ด์ ํธ ์์คํ
+ - local: unit2/smolagents/vision_agents
+ title: ๋น์ ๊ณผ ๋ธ๋ผ์ฐ์ ์์ด์ ํธ
+ - local: unit2/smolagents/final_quiz
+ title: ์ต์ข
Quiz
+ - local: unit2/smolagents/conclusion
+ title: ๊ฒฐ๋ก
+- title: Unit 2.2 The LlamaIndex framework
+ sections:
+ - local: unit2/llama-index/introduction
+ title: LLamaIndex ์๊ฐ
+ - local: unit2/llama-index/llama-hub
+ title: LlamaHub ์๊ฐ
+ - local: unit2/llama-index/components
+ title: LlamaIndex์ ๊ตฌ์ฑ ์์
+ - local: unit2/llama-index/tools
+ title: LlamaIndex์์ ๋๊ตฌ ์ฌ์ฉํ๊ธฐ
+ - local: unit2/llama-index/quiz1
+ title: Quick Quiz 1
+ - local: unit2/llama-index/agents
+ title: LlamaIndex์์ ์์ด์ ํธ ์ฌ์ฉํ๊ธฐ
+ - local: unit2/llama-index/workflows
+ title: LlamaIndex์์ ์์ด์ ํธ ์ํฌํ๋ก์ฐ ๋ง๋ค๊ธฐ
+ - local: unit2/llama-index/quiz2
+ title: Quick Quiz 2
+ - local: unit2/llama-index/conclusion
+ title: ๊ฒฐ๋ก
+- title: Unit 2.3 The LangGraph framework
+ sections:
+ - local: unit2/langgraph/introduction
+ title: LangGraph ์๊ฐ
+ - local: unit2/langgraph/when_to_use_langgraph
+ title: LangGraph๋?
+ - local: unit2/langgraph/building_blocks
+ title: LangGraph์ ๊ตฌ์ฑ ์์
+ - local: unit2/langgraph/first_graph
+ title: ์ฒซ ๋ฒ์งธ LangGraph ๋ง๋ค๊ธฐ
+ - local: unit2/langgraph/document_analysis_agent
+ title: Document Analysis Graph
+ - local: unit2/langgraph/quiz1
+ title: Quick Quiz 1
+ - local: unit2/langgraph/conclusion
+ title: Conclusion
diff --git a/units/ko/unit2/introduction.mdx b/units/ko/unit2/introduction.mdx
new file mode 100644
index 00000000..e19d397c
--- /dev/null
+++ b/units/ko/unit2/introduction.mdx
@@ -0,0 +1,40 @@
+# ์์ด์ ํฑ ํ๋ ์์ํฌ ์๊ฐ
+
+
+
+Unit 2์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค! **์ด๋ฒ ์ ๋์์๋ ๋ค์ํ ์์ด์ ํฑ ํ๋ ์์ํฌ**๋ฅผ ์ดํด๋ณด๊ณ , ์ด๋ฅผ ํ์ฉํด ๊ฐ๋ ฅํ ์์ด์ ํธ ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋๋ค.
+
+์ด๋ฒ ์ ๋์์ ๋ค๋ฃฐ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
+
+- 2.1: [smolagents](https://huggingface.co/docs/smolagents/en/index)
+- 2.2: [LlamaIndex](https://www.llamaindex.ai/)
+- 2.3: [LangGraph](https://www.langchain.com/langgraph)
+
+ํจ๊ป ์์ํด๋ด
์๋ค! ๐ต
+
+## ์์ด์ ํฑ ํ๋ ์์ํฌ๋ ์ธ์ ํ์ํ ๊น?
+
+์์ด์ ํฑ ํ๋ ์์ํฌ๋ **LLM ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค ๋ ํญ์ ํ์ํ ๊ฒ์ ์๋๋๋ค.** ํ๋ ์์ํฌ๋ ํน์ ์์
์ ํจ์จ์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋๋ก ์ํฌํ๋ก์ฐ์ ์ ์ฐ์ฑ์ ์ ๊ณตํ์ง๋ง, ํญ์ ํ์์ ์ธ ๊ฒ์ ์๋๋๋ค.
+
+๋๋ก๋ **๋ฏธ๋ฆฌ ์ ์๋ ์ํฌํ๋ก์ฐ๋ง์ผ๋ก๋** ์ฌ์ฉ์ ์์ฒญ์ ์ถฉ๋ถํ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, ๊ตณ์ด ์์ด์ ํฑ ํ๋ ์์ํฌ๊ฐ ํ์ํ์ง ์์ ์ ์์ต๋๋ค. ์์ด์ ํธ ๊ตฌ์กฐ๊ฐ ๋จ์ํ๋ค๋ฉด, ํ๋กฌํํธ ์ฒด์ด๋ ๋ฑ ์ผ๋ฐ ์ฝ๋๋ง์ผ๋ก๋ ์ถฉ๋ถํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ๊ฐ๋ฐ์๋ **์ถ์ํ ์์ด ์์คํ
์ ์์ ํ ์ดํดํ๊ณ ์ ์ด**ํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
+
+ํ์ง๋ง ์ํฌํ๋ก์ฐ๊ฐ ๋ณต์กํด์ ธ LLM์ด ํจ์๋ฅผ ํธ์ถํ๊ฑฐ๋, ์ฌ๋ฌ ์์ด์ ํธ๋ฅผ ํ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ์ด๋ฌํ ์ถ์ํ๊ฐ ๋์์ด ๋๊ธฐ ์์ํฉ๋๋ค.
+
+์ด๋ฌํ ์ ์ ๊ณ ๋ คํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ด ํ์ํจ์ ์ ์ ์์ต๋๋ค:
+
+* ์์คํ
์ ๊ตฌ๋ํ *LLM ์์ง*
+* ์์ด์ ํธ๊ฐ ์ ๊ทผํ ์ ์๋ *๋๊ตฌ ๋ชฉ๋ก*
+* LLM ์ถ๋ ฅ์์ ๋๊ตฌ ํธ์ถ์ ์ถ์ถํ๋ *ํ์*
+* ํ์์ ๋๊ธฐํ๋ *์์คํ
ํ๋กฌํํธ*
+* *๋ฉ๋ชจ๋ฆฌ ์์คํ
*
+* LLM์ ์ค์๋ฅผ ์ ์ดํ *์๋ฌ ๋ก๊น
๋ฐ ์ฌ์๋ ๋ฉ์ปค๋์ฆ*
+
+์ด๋ฌํ ์ฃผ์ ๋ค์ด ๊ฐ ํ๋ ์์ํฌ์์ ์ด๋ป๊ฒ ํด๊ฒฐ๋๋์ง, `smolagents`, `LlamaIndex`, `LangGraph`๋ฅผ ํตํด ์ดํด๋ณผ ์์ ์
๋๋ค.
+
+## ์์ด์ ํฑ ํ๋ ์์ํฌ๋ณ ์ ๋ ์๋ด
+
+| ํ๋ ์์ํฌ | ์ค๋ช
| ์ ๋ ์ ์ |
+|------------|----------------|----------------|
+| [smolagents](./smolagents/introduction) | Hugging Face์์ ๊ฐ๋ฐํ ์์ด์ ํธ ํ๋ ์์ํฌ | Sergio Paniego - [HF](https://huggingface.co/sergiopaniego) - [X](https://x.com/sergiopaniego) - [Linkedin](https://www.linkedin.com/in/sergio-paniego-blanco) |
+| [Llama-Index](./llama-index/introduction) | ์ปจํ
์คํธ ์ฆ๊ฐ AI ์์ด์ ํธ๋ฅผ ํ๋ก๋์
์ ๋ฐฐํฌํ ์ ์๋ ์๋-ํฌ-์๋ ํด๋ง | David Berenstein - [HF](https://huggingface.co/davidberenstein1957) - [X](https://x.com/davidberenstei) - [Linkedin](https://www.linkedin.com/in/davidberenstein) |
+| [LangGraph](./langgraph/introduction) | ์ํ ๊ธฐ๋ฐ ์์ด์ ํธ ์ค์ผ์คํธ๋ ์ด์
์ ์ง์ํ๋ ํ๋ ์์ํฌ | Joffrey THOMAS - [HF](https://huggingface.co/Jofthomas) - [X](https://x.com/Jthmas404) - [Linkedin](https://www.linkedin.com/in/joffrey-thomas) |
diff --git a/units/ko/unit2/langgraph/building_blocks.mdx b/units/ko/unit2/langgraph/building_blocks.mdx
new file mode 100644
index 00000000..f3331332
--- /dev/null
+++ b/units/ko/unit2/langgraph/building_blocks.mdx
@@ -0,0 +1,127 @@
+# LangGraph์ ๊ตฌ์ฑ ์์[[building-blocks-of-langgraph]]
+
+LangGraph๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๋ ค๋ฉด ํต์ฌ ๊ตฌ์ฑ ์์๋ฅผ ์ดํดํด์ผ ํฉ๋๋ค. LangGraph ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ฑํ๋ ๊ธฐ๋ณธ ๋น๋ฉ ๋ธ๋ก์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
+
+
+
+LangGraph ์ ํ๋ฆฌ์ผ์ด์
์ **์ง์
์ (entrypoint)**์์ ์์ํ๋ฉฐ, ์คํ ํ๋ฆ์ ๋ฐ๋ผ ํ ํจ์์์ ๋ค๋ฅธ ํจ์๋ก ์ด๋ํ๋ค๊ฐ END์ ๋๋ฌํฉ๋๋ค.
+
+
+
+## 1. ์ํ[[state]]
+
+**์ํ(State)**๋ LangGraph์ ์ค์ฌ ๊ฐ๋
์
๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ ํตํด ํ๋ฅด๋ ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ํ๋
๋๋ค.
+
+```python
+from typing_extensions import TypedDict
+
+class State(TypedDict):
+ graph_state: str
+```
+
+์ํ๋ **์ฌ์ฉ์ ์ ์**์ด๋ฏ๋ก, ์์ฌ๊ฒฐ์ ๊ณผ์ ์ ํ์ํ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋๋ก ์ ์คํ๊ฒ ์ค๊ณํด์ผ ํฉ๋๋ค!
+
+> ๐ก **ํ:** ์ ํ๋ฆฌ์ผ์ด์
์ด ๋จ๊ณ ๊ฐ์ ์ถ์ ํด์ผ ํ ์ ๋ณด๊ฐ ๋ฌด์์ธ์ง ์ ์คํ๊ฒ ๊ณ ๋ฏผํ์ธ์.
+
+## 2. ๋
ธ๋[[nodes]]
+
+**๋
ธ๋(Node)**๋ ํ์ด์ฌ ํจ์์
๋๋ค. ๊ฐ ๋
ธ๋๋:
+- ์ํ๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์ต๋๋ค
+- ์์
์ ์ํํฉ๋๋ค
+- ์ํ ์
๋ฐ์ดํธ๋ฅผ ๋ฐํํฉ๋๋ค
+
+```python
+def node_1(state):
+ print("---Node 1---")
+ return {"graph_state": state['graph_state'] +" I am"}
+
+def node_2(state):
+ print("---Node 2---")
+ return {"graph_state": state['graph_state'] +" happy!"}
+
+def node_3(state):
+ print("---Node 3---")
+ return {"graph_state": state['graph_state'] +" sad!"}
+```
+
+์๋ฅผ ๋ค์ด, ๋
ธ๋๋ ๋ค์๊ณผ ๊ฐ์ ์ญํ ์ ํ ์ ์์ต๋๋ค:
+- **LLM ํธ์ถ**: ํ
์คํธ ์์ฑ ๋๋ ์์ฌ๊ฒฐ์
+- **ํด ํธ์ถ**: ์ธ๋ถ ์์คํ
๊ณผ ์ํธ์์ฉ
+- **์กฐ๊ฑด๋ถ ๋ก์ง**: ๋ค์ ๋จ๊ณ ๊ฒฐ์
+- **์ฌ๋ ๊ฐ์
**: ์ฌ์ฉ์ ์
๋ ฅ ๋ฐ๊ธฐ
+
+> ๐ก **์ ๋ณด:** START์ END์ฒ๋ผ ์ ์ฒด ์ํฌํ๋ก์ฐ์ ํ์์ ์ธ ์ผ๋ถ ๋
ธ๋๋ langGraph์์ ์ง์ ์ ๊ณตํฉ๋๋ค.
+
+
+## 3. ์ฃ์ง[[edges]]
+
+**์ฃ์ง(Edge)**๋ ๋
ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ฉฐ, ๊ทธ๋ํ ๋ด์์ ๊ฐ๋ฅํ ๊ฒฝ๋ก๋ฅผ ์ ์ํฉ๋๋ค:
+
+```python
+import random
+from typing import Literal
+
+def decide_mood(state) -> Literal["node_2", "node_3"]:
+
+ # ์ข
์ข
์ํ๋ฅผ ์ฌ์ฉํด ๋ค์์ ๋ฐฉ๋ฌธํ ๋
ธ๋๋ฅผ ๊ฒฐ์ ํฉ๋๋ค
+ user_input = state['graph_state']
+
+ # ์ฌ๊ธฐ์๋ ๋
ธ๋ 2, 3 ์ฌ์ด๋ฅผ 50:50์ผ๋ก ๋ถ๊ธฐํฉ๋๋ค
+ if random.random() < 0.5:
+
+ # 50% ํ๋ฅ ๋ก Node 2 ๋ฐํ
+ return "node_2"
+
+ # 50% ํ๋ฅ ๋ก Node 3 ๋ฐํ
+ return "node_3"
+```
+
+์ฃ์ง๋ ๋ค์๊ณผ ๊ฐ์ด ๋๋ฉ๋๋ค:
+- **์ง์ (Direct)**: ํญ์ ๋
ธ๋ A์์ ๋
ธ๋ B๋ก ์ด๋
+- **์กฐ๊ฑด๋ถ(Conditional)**: ํ์ฌ ์ํ์ ๋ฐ๋ผ ๋ค์ ๋
ธ๋๋ฅผ ์ ํ
+
+## 4. StateGraph[[stategraph]]
+
+**StateGraph**๋ ์ ์ฒด ์์ด์ ํธ ์ํฌํ๋ก์ฐ๋ฅผ ๋ด๋ ์ปจํ
์ด๋์
๋๋ค:
+
+```python
+from IPython.display import Image, display
+from langgraph.graph import StateGraph, START, END
+
+# ๊ทธ๋ํ ์์ฑ
+builder = StateGraph(State)
+builder.add_node("node_1", node_1)
+builder.add_node("node_2", node_2)
+builder.add_node("node_3", node_3)
+
+# ๋ก์ง ์ ์
+builder.add_edge(START, "node_1")
+builder.add_conditional_edges("node_1", decide_mood)
+builder.add_edge("node_2", END)
+builder.add_edge("node_3", END)
+
+# ๊ทธ๋ํ ์ปดํ์ผ
+graph = builder.compile()
+```
+
+์ด์ ์๊ฐํํ ์ ์์ต๋๋ค!
+```python
+# ์๊ฐํ
+display(Image(graph.get_graph().draw_mermaid_png()))
+```
+
+
+ํ์ง๋ง ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ค์ ๋ก ํธ์ถํ๋ ๊ฒ์
๋๋ค:
+```python
+graph.invoke({"graph_state" : "Hi, this is Lance."})
+```
+์ถ๋ ฅ :
+```
+---Node 1---
+---Node 3---
+{'graph_state': 'Hi, this is Lance. I am sad!'}
+```
+
+## ๋ค์ ๋จ๊ณ[[what's-next]]
+
+๋ค์ ์น์
์์๋ ์ด๋ฌํ ๊ฐ๋
์ ์ค์ ๋ก ์ ์ฉํ์ฌ ์ฒซ ๋ฒ์งธ ๊ทธ๋ํ๋ฅผ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค. ์ด ๊ทธ๋ํ๋ Alfred๊ฐ ์ด๋ฉ์ผ์ ๋ฐ์ ๋ถ๋ฅํ๊ณ , ์ ์ ๋ฉ์ผ์ด๋ผ๋ฉด ์์ ๋ต์ฅ์ ์์ฑํ ์ ์๋๋ก ํฉ๋๋ค.
diff --git a/units/ko/unit2/langgraph/conclusion.mdx b/units/ko/unit2/langgraph/conclusion.mdx
new file mode 100644
index 00000000..8bc1b483
--- /dev/null
+++ b/units/ko/unit2/langgraph/conclusion.mdx
@@ -0,0 +1,20 @@
+# ๊ฒฐ๋ก [[conclusion]]
+
+2๋จ์์ LangGraph ๋ชจ๋์ ์๋ฃํ์ ๊ฒ์ ์ถํํฉ๋๋ค! ๐ฅณ
+
+์ด์ LangGraph๋ก ๊ตฌ์กฐํ๋ ์ํฌํ๋ก์ฐ๋ฅผ ๊ตฌ์ถํ๋ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ๋ง์คํฐํ์
จ์ผ๋ฉฐ, ์ด๋ฅผ ์ค์ ํ๋ก๋์
ํ๊ฒฝ์ ์ ์ฉํ ์ ์์ต๋๋ค.
+
+์ด ๋ชจ๋์ LangGraph ์ฌ์ ์ ์์์ ๋ถ๊ณผํฉ๋๋ค. ์ฌํ ์ฃผ์ ๋ฅผ ์ํ์๋ ๋ถ๋ค์ ์ํด ์ถ์ฒ๋๋ฆฝ๋๋ค:
+
+- [๊ณต์ LangGraph ๋ฌธ์](https://github.com/langchain-ai/langgraph) ํ์
+- LangChain ์์นด๋ฐ๋ฏธ์ ์ข
ํฉ์ ์ธ [LangGraph ์๊ฐ](https://academy.langchain.com/courses/intro-to-langgraph) ๊ฐ์ ์๊ฐ
+- ์ง์ ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋ค์ด๋ณด์ธ์!
+
+๋ค์ ๋จ์์์๋ ์ค์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํ๊ตฌํฉ๋๋ค. ์ด์ ์ด๋ก ์ ๋์ด ์ค์ ์ผ๋ก ๋์๊ฐ ์๊ฐ์
๋๋ค!
+
+**์ฌ๋ฌ๋ถ์ ๊ฐ์์ ๋ํ ์๊ฐ๊ณผ ์ ์ ์ฌํญ๋ค์ ๋งค์ฐ ํ์ํฉ๋๋ค**. ํผ๋๋ฐฑ์ด ์์ผ์๋ฉด ๐ [์ด ์์](https://docs.google.com/forms/d/e/1FAIpQLSe9VaONn0eglax0uTwi29rIn4tM7H2sYmmybmG5jJNlE5v0xA/viewform?usp=dialog)์ ์์ฑํด์ฃผ์ธ์!
+
+### ์กด๊ฒฝํ๋ ์ฌ๋ฌ๋ถ! ๐ฉ๐ฆ
+๋ฐฐ์์ ๋ฉ์ถ์ง ๋ง์ธ์ ๐ค
+
+-์ํ๋ ๋-
\ No newline at end of file
diff --git a/units/ko/unit2/langgraph/document_analysis_agent.mdx b/units/ko/unit2/langgraph/document_analysis_agent.mdx
new file mode 100644
index 00000000..5a7a8b39
--- /dev/null
+++ b/units/ko/unit2/langgraph/document_analysis_agent.mdx
@@ -0,0 +1,267 @@
+# ๋ฌธ์ ๋ถ์ ๊ทธ๋ํ[[document-analysis-graph]]
+
+์ ์ํ๋ ๋๋ Mr.์จ์ธ๋์ ์ ๋ขฐ๋ฐ๋ ์ง์ฌ๋ก์, ๊ทธ๋ถ์ ๋ค์ํ ๋ฌธ์ ์
๋ฌด๋ฅผ ์ด๋ป๊ฒ ์ง์ํ ์ง ๊ธฐ๋กํด๋์์ต๋๋ค. ๊ทธ๊ฐ ๋ฐค ํ๋์ ํ๋ฌ ๋๊ฐ ๋์, ์ ๋ ๋ชจ๋ ์๋ฅ, ํ๋ จ ์ผ์ , ์์ ๊ณํ์ ๋ถ์ํ๊ณ ์ ๋ฆฌํฉ๋๋ค.
+
+๊ทธ๋ถ์ด ์ธ์ถํ๊ธฐ ์ , ์ด๋ฒ ์ฃผ ํ๋ จ ํ๋ก๊ทธ๋จ์ด ์ ํ ์ชฝ์ง๋ฅผ ๋จ๊ธฐ์
จ์ต๋๋ค. ๊ทธ ์ชฝ์ง๋ฅผ ๋ณด๊ณ ์ ๋ ๋ด์ผ ์์ฌ๋ฅผ ์ํ **๋ฉ๋ด**๋ฅผ ์ง์ ์ง๊ธฐ๋ก ํ์ฃ .
+
+์์ผ๋ก๋ ์ด๋ฐ ์ผ์ด ์์ ๋๋ฅผ ๋๋นํด, LangGraph๋ฅผ ํ์ฉํด ์จ์ธ๋์ ์ํ ๋ฌธ์ ๋ถ์ ์์คํ
์ ๋ง๋ค์ด๋ด
์๋ค. ์ด ์์คํ
์ ๋ค์์ ์ํ ํ ์ ์์ต๋๋ค:
+
+1. ์ด๋ฏธ์ง ๋ฌธ์ ์ฒ๋ฆฌ
+2. ๋น์ ๋ชจ๋ธ(๋น์ ์ธ์ด ๋ชจ๋ธ)๋ก ํ
์คํธ ์ถ์ถ
+3. ํ์์ ๊ณ์ฐ ์ํ(์ผ๋ฐ ํด ์์ฐ)
+4. ๋ด์ฉ ๋ถ์ ๋ฐ ์์ฝ ์ ๊ณต
+5. ๋ฌธ์ ๊ด๋ จ ํน์ ์ง์ ์คํ
+
+## ์ง์ฌ์ ์ํฌํ๋ก์ฐ[[the-butler's-workflow]]
+
+๋ง๋ค ์ํฌํ๋ก์ฐ์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
+
+
+
+
+์ด ๋
ธํธ๋ถ์ ๋ฐ๋ผ๊ฐ๋ฉฐ Google Colab์์ ์ฝ๋๋ฅผ ์คํํด๋ณผ ์ ์์ต๋๋ค.
+
+
+## ํ๊ฒฝ ์ค์ [[setting-up-the-environment]]
+
+```python
+%pip install langgraph langchain_openai langchain_core
+```
+์ํฌํธ :
+```python
+import base64
+from typing import List, TypedDict, Annotated, Optional
+from langchain_openai import ChatOpenAI
+from langchain_core.messages import AnyMessage, SystemMessage, HumanMessage
+from langgraph.graph.message import add_messages
+from langgraph.graph import START, StateGraph
+from langgraph.prebuilt import ToolNode, tools_condition
+from IPython.display import Image, display
+```
+
+## ์์ด์ ํธ ์ํ ์ ์[[defining-agent's-state]]
+
+์ด ์ํ๋ ์์ ๋ณธ ๊ฒ๋ณด๋ค ์กฐ๊ธ ๋ ๋ณต์กํฉ๋๋ค.
+`AnyMessage`๋ Langchain์ ๋ฉ์์ง ํด๋์ค์ด๊ณ , `add_messages`๋ ์ต์ ๋ฉ์์ง๋ฅผ ๋์ ํ๋ ์ฐ์ฐ์์
๋๋ค.
+
+LangGraph์์๋ ์ํ์ ์ฐ์ฐ์๋ฅผ ์ถ๊ฐํด ์ํธ์์ฉ ๋ฐฉ์์ ์ ์ํ ์ ์์ต๋๋ค.
+
+```python
+class AgentState(TypedDict):
+ # ์ ๊ณต๋ ๋ฌธ์
+ input_file: Optional[str] # ํ์ผ ๊ฒฝ๋ก(PDF/PNG)
+ messages: Annotated[list[AnyMessage], add_messages]
+```
+
+## ํด ์ค๋นํ๊ธฐ[[preparing-tools]]
+
+```python
+vision_llm = ChatOpenAI(model="gpt-4o")
+
+def extract_text(img_path: str) -> str:
+ """
+ ๋ฉํฐ๋ชจ๋ฌ ๋ชจ๋ธ๋ก ์ด๋ฏธ์ง ํ์ผ์์ ํ
์คํธ ์ถ์ถ
+
+ Wayne ์ฃผ์ธ๋์ ์ข
์ข
ํ๋ จ ์ผ์ ์ด๋ ์๋จ์ด ์ ํ ์ชฝ์ง๋ฅผ ๋จ๊น๋๋ค.
+ ์ด ๊ธฐ๋ฅ์ผ๋ก ๋ด์ฉ์ ์ ๋๋ก ๋ถ์ํ ์ ์์ต๋๋ค.
+ """
+ all_text = ""
+ try:
+ # ์ด๋ฏธ์ง๋ฅผ ์ฝ๊ณ base64๋ก ์ธ์ฝ๋ฉ
+ with open(img_path, "rb") as image_file:
+ image_bytes = image_file.read()
+
+ image_base64 = base64.b64encode(image_bytes).decode("utf-8")
+
+ # base64 ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ํ๋กฌํํธ ์ค๋น
+ message = [
+ HumanMessage(
+ content=[
+ {
+ "type": "text",
+ "text": (
+ "์ด ์ด๋ฏธ์ง์์ ๋ชจ๋ ํ
์คํธ๋ฅผ ์ถ์ถํ์ธ์. ์ค๋ช
์์ด ์ถ์ถ๋ ํ
์คํธ๋ง ๋ฐํํ์ธ์."
+ ),
+ },
+ {
+ "type": "image_url",
+ "image_url": {
+ "url": f"data:image/png;base64,{image_base64}"
+ },
+ },
+ ]
+ )
+ ]
+
+ # ๋น์ ๋ชจ๋ธ ํธ์ถ
+ response = vision_llm.invoke(message)
+
+ # ์ถ์ถ๋ ํ
์คํธ ์ถ๊ฐ
+ all_text += response.content + "\n\n"
+
+ return all_text.strip()
+ except Exception as e:
+ # ์ง์ฌ๋ ์ค๋ฅ๋ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค
+ error_msg = f"ํ
์คํธ ์ถ์ถ ์ค๋ฅ: {str(e)}"
+ print(error_msg)
+ return ""
+
+def divide(a: int, b: int) -> float:
+ """์ฃผ์ธ๋์ ๊ณ์ฐ ์์ฒญ์ ์ํ ๋๋์
ํจ์"""
+ return a / b
+
+# ์ง์ฌ, ๋๊ตฌ(tool) ์ฅ์ฐฉ
+tools = [
+ divide,
+ extract_text
+]
+
+llm = ChatOpenAI(model="gpt-4o")
+llm_with_tools = llm.bind_tools(tools, parallel_tool_calls=False)
+```
+
+## ๋
ธ๋[[the-nodes]]
+
+```python
+def assistant(state: AgentState):
+ # ์์คํ
๋ฉ์์ง
+ textual_description_of_tool="""
+extract_text(img_path: str) -> str:
+ ๋ฉํฐ๋ชจ๋ฌ ๋ชจ๋ธ๋ก ์ด๋ฏธ์ง ํ์ผ์์ ํ
์คํธ ์ถ์ถ
+
+ Args:
+ img_path: ๋ก์ปฌ ์ด๋ฏธ์ง ํ์ผ ๊ฒฝ๋ก(๋ฌธ์์ด)
+
+ Returns:
+ ๊ฐ ์ด๋ฏธ์ง์์ ์ถ์ถ๋ ํ
์คํธ๋ฅผ ํฉ์น ๋ฌธ์์ด
+divide(a: int, b: int) -> float:
+ a๋ฅผ b๋ก ๋๋
+"""
+ image=state["input_file"]
+ sys_msg = SystemMessage(content=f"๋น์ ์ Mr. Wayne๊ณผ ๋ฐฐํธ๋งจ์ ์ฌ๊ธฐ๋ ์น์ ํ ์ง์ฌ ์ํ๋ ๋์
๋๋ค. ์๋ ํด๋ก ๋ฌธ์๋ฅผ ๋ถ์ํ๊ณ ๊ณ์ฐ์ ์ํํ ์ ์์ต๋๋ค:\n{textual_description_of_tool} \n ํ์ฌ ๋ก๋๋ ์ด๋ฏธ์ง๋: {image}")
+
+ return {
+ "messages": [llm_with_tools.invoke([sys_msg] + state["messages"])],
+ "input_file": state["input_file"]
+ }
+```
+
+## ReAct ํจํด: ์ง์ฌ์ ์ง์ ๋ฐฉ์[[the-react-pattern-how-i-assist-mr.-wayne]]
+
+์ด ์์ด์ ํธ๋ ReAct ํจํด(Reason-Act-Observe)์ ๋ฐ๋ฆ
๋๋ค.
+
+1. ๋ฌธ์์ ์์ฒญ์ **์ดํด(Reason)**
+2. ์ ์ ํ ํด์ **์คํ(Act)**
+3. ๊ฒฐ๊ณผ๋ฅผ **๊ด์ฐฐ(Observe)**
+4. ํ์์ ๋ฐ๋ณต
+
+์์ฃผ ๊ฐ๋จํ LangGraph ์์ด์ ํธ ๊ตฌํ ์์์
๋๋ค.
+
+```python
+# ๊ทธ๋ํ ์์ฑ
+builder = StateGraph(AgentState)
+
+# ๋
ธ๋ ์ ์: ์ค์ ์์
์ ์ํ
+builder.add_node("assistant", assistant)
+builder.add_node("tools", ToolNode(tools))
+
+# ์ฃ์ง ์ ์: ์ ์ด ํ๋ฆ ๊ฒฐ์
+builder.add_edge(START, "assistant")
+builder.add_conditional_edges(
+ "assistant",
+ # ์ต์ ๋ฉ์์ง๊ฐ ํด์ ํ์๋ก ํ๋ฉด tools๋ก ๋ผ์ฐํ
+ # ์๋๋ฉด ์ง์ ์๋ต
+ tools_condition,
+)
+builder.add_edge("tools", "assistant")
+react_graph = builder.compile()
+
+# ์ง์ฌ์ ์ฌ๊ณ ๊ณผ์ ์ ์๊ฐํ
+display(Image(react_graph.get_graph(xray=True).draw_mermaid_png()))
+```
+
+`tools` ๋
ธ๋๋ ํด ๋ฆฌ์คํธ๋ฅผ, `assistant` ๋
ธ๋๋ ํด์ด ๋ฐ์ธ๋ฉ๋ ๋ชจ๋ธ์ ์๋ฏธํฉ๋๋ค.
+๊ทธ๋ํ์๋ `assistant`์ `tools` ๋
ธ๋๊ฐ ์์ต๋๋ค.
+
+`tools_condition` ์ฃ์ง๋ ๋ชจ๋ธ์ด ํด์ ํธ์ถํ๋ฉด tools๋ก, ์๋๋ฉด End๋ก ํ๋ฆ์ ๋ณด๋
๋๋ค.
+
+์ด์ ํ ๋จ๊ณ ๋ ์ถ๊ฐํฉ๋๋ค:
+
+`tools` ๋
ธ๋๋ฅผ ๋ค์ `assistant`๋ก ์ฐ๊ฒฐํด ๋ฃจํ๋ฅผ ๋ง๋ญ๋๋ค.
+
+- `assistant` ๋
ธ๋ ์คํ ํ, `tools_condition`์ด ๋ชจ๋ธ ์ถ๋ ฅ์ด ํด ํธ์ถ์ธ์ง ํ์ธํฉ๋๋ค.
+- ํด ํธ์ถ์ด๋ฉด ํ๋ฆ์ด `tools` ๋
ธ๋๋ก ์ด๋ํฉ๋๋ค.
+- `tools` ๋
ธ๋๋ ๋ค์ `assistant`๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค.
+- ์ด ๋ฃจํ๋ ๋ชจ๋ธ์ด ํด ํธ์ถ์ ๊ฒฐ์ ํ๋ ํ ๊ณ์๋ฉ๋๋ค.
+- ๋ชจ๋ธ ์๋ต์ด ํด ํธ์ถ์ด ์๋๋ฉด ํ๋ฆ์ด END๋ก ์ด๋ํด ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋ฉ๋๋ค.
+
+
+
+## ์ง์ฌ์ ์ค์ ํ์ฉ ์์[[the-butler-in-action]]
+
+### ์์ 1: ๊ฐ๋จํ ๊ณ์ฐ[[example-1-simple-calculations]]
+
+์๋๋ LangGraph์์ ํด์ ์ฌ์ฉํ๋ ๊ฐ๋จํ ์์์
๋๋ค.
+
+```python
+messages = [HumanMessage(content="6790์ 5๋ก ๋๋ ์ค")]
+messages = react_graph.invoke({"messages": messages, "input_file": None})
+
+# ๋ฉ์์ง ์ถ๋ ฅ
+for m in messages['messages']:
+ m.pretty_print()
+```
+
+๋ํ ์์:
+
+```
+Human: 6790์ 5๋ก ๋๋ ์ค
+
+AI Tool Call: divide(a=6790, b=5)
+
+Tool Response: 1358.0
+
+Alfred: 6790์ 5๋ก ๋๋๋ฉด 1358.0์
๋๋ค.
+```
+
+### ์์ 2: Wayne ์ฃผ์ธ๋์ ํ๋ จ ๋ฌธ์ ๋ถ์[[example-2-analyzing-master-wayne's-training-documents]]
+
+์ฃผ์ธ๋์ด ํ๋ จ ๋ฐ ์๋จ ์ชฝ์ง๋ฅผ ๋จ๊ฒผ์ ๋:
+
+```python
+messages = [HumanMessage(content="์ ๊ณต๋ ์ด๋ฏธ์ง์ ์๋ Wayne ์ฃผ์ธ๋์ ์ชฝ์ง์ ๋ฐ๋ผ ์ ๋
๋ฉ๋ด์ ํ์ํ ์ฌ๋ฃ ๋ชฉ๋ก์ ์๋ ค์ค.")]
+messages = react_graph.invoke({"messages": messages, "input_file": "Batman_training_and_meals.png"})
+```
+
+๋ํ ์์:
+
+```
+Human: ์ ๊ณต๋ ์ด๋ฏธ์ง์ ์๋ Wayne ์ฃผ์ธ๋์ ์ชฝ์ง์ ๋ฐ๋ผ ์ ๋
๋ฉ๋ด์ ํ์ํ ์ฌ๋ฃ ๋ชฉ๋ก์ ์๋ ค์ค.
+
+AI Tool Call: extract_text(img_path="Batman_training_and_meals.png")
+
+Tool Response: [ํ๋ จ ์ผ์ ๋ฐ ๋ฉ๋ด ์ธ๋ถ ์ ๋ณด๊ฐ ์ถ์ถ๋จ]
+
+Alfred: ์ ๋
๋ฉ๋ด๋ฅผ ์ํด ๋ค์ ์ฌ๋ฃ๋ฅผ ๊ตฌ์
ํ์ธ์:
+
+1. ๋ชฉ์ด ์ฌ์ก ์๊ณ ๊ธฐ ๋ฑ์ฌ ์คํ
์ดํฌ
+2. ์ ๊ธฐ๋ ์๊ธ์น
+3. ํผํค์ ๊ณ ์ถ
+4. ๊ฐ์(์ค๋ธ์ ๊ตฌ์ธ ํ๋ธ ๊ฐ์์ฉ)
+5. ํผ์ฌ ์ค์ผ(2๊ทธ๋จ)
+
+์คํ
์ดํฌ๋ ๋ชฉ์ด ์ฌ์ก, ์๊ธ์น์ ๊ณ ์ถ๋ ์ ๊ธฐ๋์ผ๋ก ์ค๋นํ๋ฉด ์ต๊ณ ์ ์์ฌ๊ฐ ๋ฉ๋๋ค.
+```
+
+## ํต์ฌ ์์ฝ[[key-takeaways]]
+
+๋๋ง์ ๋ฌธ์ ๋ถ์ ์ง์ฌ๋ฅผ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด ๋ค์์ ๊ณ ๋ คํ์ธ์:
+
+1. **๋ฌธ์ ๊ด๋ จ ์์
๋ณ๋ก ๋ช
ํํ ํด ์ ์**
+2. **ํด ํธ์ถ ๊ฐ ๋งฅ๋ฝ ์ ์ง๋ฅผ ์ํ ๊ฒฌ๊ณ ํ ์ํ ์ถ์ ๊ธฐ**
+3. **ํด ์คํจ ์ ์ค๋ฅ ์ฒ๋ฆฌ ๊ณ ๋ ค**
+4. **์ด์ ์ํธ์์ฉ ๋งฅ๋ฝ ์ ์ง(add_messages ์ฐ์ฐ์ ํ์ฉ)**
+
+์ด ์์น์ ๋ฐ๋ฅด๋ฉด Wayne ์ ํ์ ์ด์ธ๋ฆฌ๋ ๋ฌธ์ ๋ถ์ ์๋น์ค๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
+
+*์ด ์ค๋ช
์ด ๋์์ด ๋์๊ธธ ๋ฐ๋๋๋ค. ์ด์ ์ฃผ์ธ๋์ ๋งํ ๋ฅผ ๋ค๋ฆผ์งํ๋ฌ ๊ฐ๋ณด๊ฒ ์ต๋๋ค.*
diff --git a/units/ko/unit2/langgraph/first_graph.mdx b/units/ko/unit2/langgraph/first_graph.mdx
new file mode 100644
index 00000000..e51d0f43
--- /dev/null
+++ b/units/ko/unit2/langgraph/first_graph.mdx
@@ -0,0 +1,343 @@
+# ๋๋ง์ ์ฒซ LangGraph ๋ง๋ค๊ธฐ[[building-your-first-langgraph]]
+
+์ด์ LangGraph์ ๊ตฌ์ฑ ์์๋ฅผ ์ดํดํ์ผ๋, ์ค์ ๋ก ์ ์ฉํด๋ณด๋ฉฐ ์ฒซ ๋ฒ์งธ ๊ธฐ๋ฅ์ ๊ทธ๋ํ๋ฅผ ๋ง๋ค์ด๋ด
์๋ค. ์ฌ๊ธฐ์๋ ์ํ๋ ๋์ ์ด๋ฉ์ผ ์ฒ๋ฆฌ ์์คํ
์ ๊ตฌํํ ๊ฒ์
๋๋ค. ์ํ๋ ๋๋ ๋ค์๊ณผ ๊ฐ์ ์์
์ ์ํํด์ผ ํฉ๋๋ค:
+
+1. ๋ค์ด์ค๋ ์ด๋ฉ์ผ ์ฝ๊ธฐ
+2. ์คํธ ๋๋ ์ ์ ๋ฉ์ผ๋ก ๋ถ๋ฅํ๊ธฐ
+3. ์ ์ ๋ฉ์ผ์ ๋ํ ์์ ๋ต์ฅ ์์ฑํ๊ธฐ
+4. ์ ์ ๋ฉ์ผ์ผ ๊ฒฝ์ฐ Mr. Wayne์๊ฒ ์ ๋ณด ์ ๋ฌ(์ถ๋ ฅ๋ง)
+
+์ด ์์ ๋ LLM ๊ธฐ๋ฐ ์์ฌ๊ฒฐ์ ์ด ํฌํจ๋ LangGraph ์ํฌํ๋ก์ฐ ๊ตฌ์กฐํ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. (์ฌ๊ธฐ์๋ ๋ณ๋์ ํด์ด ์ฌ์ฉ๋์ง ์์ผ๋ฏ๋ก Agent๋ผ๊ณ ๋ถ๋ฅด์ง ์์ง๋ง, LangGraph ํ๋ ์์ํฌ ํ์ต์ ์ด์ ์ ๋ก๋๋ค.)
+
+
+์ด ๋
ธํธ๋ถ์ ๋ฐ๋ผ๊ฐ๋ฉฐ Google Colab์์ ์ฝ๋๋ฅผ ์คํํด๋ณผ ์ ์์ต๋๋ค.
+
+
+## ์ฐ๋ฆฌ๊ฐ ๋ง๋ค ์ํฌํ๋ก์ฐ[[our-workflow]]
+
+์๋์ ๊ฐ์ ์ํฌํ๋ก์ฐ๋ฅผ ๊ตฌํํฉ๋๋ค:
+
+
+## ํ๊ฒฝ ์ค์ [[setting-up-our-environment]]
+
+๋จผ์ ํ์ํ ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค:
+
+```python
+%pip install langgraph langchain_openai
+```
+
+ํ์ํ ๋ชจ๋์ ์ํฌํธํฉ๋๋ค:
+
+```python
+import os
+from typing import TypedDict, List, Dict, Any, Optional
+from langgraph.graph import StateGraph, START, END
+from langchain_openai import ChatOpenAI
+from langchain_core.messages import HumanMessage
+```
+
+## 1๋จ๊ณ: ์ํ(State) ์ ์ํ๊ธฐ[[step-1-define-our-state]]
+
+์ด๋ฉ์ผ ์ฒ๋ฆฌ ์ํฌํ๋ก์ฐ์์ ์ํ๋ ๋๊ฐ ์ถ์ ํด์ผ ํ ์ ๋ณด๋ฅผ ์ ์ํฉ๋๋ค:
+
+```python
+class EmailState(TypedDict):
+ # ์ฒ๋ฆฌ ์ค์ธ ์ด๋ฉ์ผ
+ email: Dict[str, Any] # ์ ๋ชฉ, ๋ฐ์ ์, ๋ณธ๋ฌธ ๋ฑ ํฌํจ
+
+ # ์ด๋ฉ์ผ ๋ถ๋ฅ(๋ฌธ์, ๋ถ๋ง ๋ฑ)
+ email_category: Optional[str]
+
+ # ์คํธ์ผ๋ก ๋ถ๋ฅ๋ ์ด์
+ spam_reason: Optional[str]
+
+ # ๋ถ์ ๋ฐ ๊ฒฐ์
+ is_spam: Optional[bool]
+
+ # ๋ต์ฅ ์์ฑ
+ email_draft: Optional[str]
+
+ # ์ฒ๋ฆฌ ๋ฉํ๋ฐ์ดํฐ
+ messages: List[Dict[str, Any]] # LLM๊ณผ์ ๋ํ ์ถ์
+```
+
+> ๐ก **ํ:** ์ํ๋ ์ค์ํ ์ ๋ณด๋ฅผ ๋ชจ๋ ๋ด๋, ๋ถํ์ํ๊ฒ ๋น๋ํด์ง์ง ์๋๋ก ํ์ธ์.
+
+## 2๋จ๊ณ: ๋
ธ๋ ์ ์ํ๊ธฐ[[step-2-define-our-nodes]]
+
+์ด์ ๊ฐ ์ฒ๋ฆฌ ๋จ๊ณ๋ฅผ ๋ด๋นํ ํจ์๋ฅผ ๋ง๋ญ๋๋ค:
+
+```python
+# LLM ์ด๊ธฐํ
+model = ChatOpenAI(temperature=0)
+
+def read_email(state: EmailState):
+ """์ํ๋ ๋๊ฐ ๋ค์ด์จ ์ด๋ฉ์ผ์ ์ฝ๊ณ ๊ธฐ๋กํฉ๋๋ค."""
+ email = state["email"]
+ print(f"์ํ๋ ๋๊ฐ {email['sender']}๋ก๋ถํฐ ์จ ๋ฉ์ผ(์ ๋ชฉ: {email['subject']})์ ์ฒ๋ฆฌ ์ค์
๋๋ค.")
+ return {}
+
+def classify_email(state: EmailState):
+ """์ํ๋ ๋๊ฐ LLM์ ์ฌ์ฉํด ์ด๋ฉ์ผ์ ์คํธ/์ ์์ผ๋ก ๋ถ๋ฅํฉ๋๋ค."""
+ email = state["email"]
+ prompt = f"""
+ ์ง์ฌ ์ํ๋ ๋๋ก์, ์ด ์ด๋ฉ์ผ์ ๋ถ์ํด ์คํธ์ธ์ง ์ ์์ธ์ง ํ๋จํ์ธ์.
+
+ ์ด๋ฉ์ผ:
+ From: {email['sender']}
+ Subject: {email['subject']}
+ Body: {email['body']}
+
+ ๋จผ์ ์ด ์ด๋ฉ์ผ์ด ์คํธ์ธ์ง ํ๋จํ๊ณ , ์คํธ์ด๋ผ๋ฉด ๊ทธ ์ด์ ๋ฅผ ์ค๋ช
ํ์ธ์.
+ ์ ์ ๋ฉ์ผ์ด๋ผ๋ฉด (๋ฌธ์, ๋ถ๋ง, ๊ฐ์ฌ, ์์ฒญ ๋ฑ) ์นดํ
๊ณ ๋ฆฌ๋ ๋ถ๋ฅํ์ธ์.
+ """
+ messages = [HumanMessage(content=prompt)]
+ response = model.invoke(messages)
+ response_text = response.content.lower()
+ is_spam = "spam" in response_text and "not spam" not in response_text
+ spam_reason = None
+ if is_spam and "reason:" in response_text:
+ spam_reason = response_text.split("reason:")[1].strip()
+ email_category = None
+ if not is_spam:
+ categories = ["inquiry", "complaint", "thank you", "request", "information"]
+ for category in categories:
+ if category in response_text:
+ email_category = category
+ break
+ new_messages = state.get("messages", []) + [
+ {"role": "user", "content": prompt},
+ {"role": "assistant", "content": response.content}
+ ]
+ return {
+ "is_spam": is_spam,
+ "spam_reason": spam_reason,
+ "email_category": email_category,
+ "messages": new_messages
+ }
+
+def handle_spam(state: EmailState):
+ """์ํ๋ ๋๊ฐ ์คํธ ๋ฉ์ผ์ ์ฒ๋ฆฌํฉ๋๋ค."""
+ print(f"์ํ๋ ๋๋ ์ด ๋ฉ์ผ์ ์คํธ์ผ๋ก ๋ถ๋ฅํ์ต๋๋ค. ์ด์ : {state['spam_reason']}")
+ print("์ด ๋ฉ์ผ์ ์คํธ ํด๋๋ก ์ด๋๋์์ต๋๋ค.")
+ return {}
+
+def draft_response(state: EmailState):
+ """์ํ๋ ๋๊ฐ ์ ์ ๋ฉ์ผ์ ์์ ๋ต์ฅ์ ์์ฑํฉ๋๋ค."""
+ email = state["email"]
+ category = state["email_category"] or "์ผ๋ฐ"
+ prompt = f"""
+ ์ง์ฌ ์ํ๋ ๋๋ก์, ์ด ์ด๋ฉ์ผ์ ์ ์คํ ์์ ๋ต์ฅ์ ์์ฑํ์ธ์.
+
+ ์ด๋ฉ์ผ:
+ From: {email['sender']}
+ Subject: {email['subject']}
+ Body: {email['body']}
+
+ ์ด ์ด๋ฉ์ผ์ ์นดํ
๊ณ ๋ฆฌ: {category}
+
+ Mr. Hugg๊ฐ ๊ฒํ ํ ๊ฐ์ธํํ ์ ์๋๋ก ๊ฐ๋จํ๊ณ ์ ๋ฌธ์ ์ธ ๋ต์ฅ์ ์์ฑํ์ธ์.
+ """
+ messages = [HumanMessage(content=prompt)]
+ response = model.invoke(messages)
+ new_messages = state.get("messages", []) + [
+ {"role": "user", "content": prompt},
+ {"role": "assistant", "content": response.content}
+ ]
+ return {
+ "email_draft": response.content,
+ "messages": new_messages
+ }
+
+def notify_mr_hugg(state: EmailState):
+ """์ํ๋ ๋๊ฐ Mr. Hugg์๊ฒ ๋ฉ์ผ๊ณผ ์์ ๋ต์ฅ์ ์ ๋ฌํฉ๋๋ค."""
+ email = state["email"]
+ print("\n" + "="*50)
+ print(f"์ฃผ์ธ๋, {email['sender']}๋ก๋ถํฐ ๋ฉ์ผ์ด ๋์ฐฉํ์ต๋๋ค.")
+ print(f"์ ๋ชฉ: {email['subject']}")
+ print(f"์นดํ
๊ณ ๋ฆฌ: {state['email_category']}")
+ print("\n๊ฒํ ํ์ค ์์ ๋ต์ฅ์ ์ค๋นํ์ต๋๋ค:")
+ print("-"*50)
+ print(state["email_draft"])
+ print("="*50 + "\n")
+ return {}
+```
+
+## 3๋จ๊ณ: ๋ถ๊ธฐ ๋ก์ง ์ ์ํ๊ธฐ[[step-3-define-our-routing-logic]]
+
+๋ถ๋ฅ ํ ์ด๋ค ๊ฒฝ๋ก๋ก ๊ฐ์ง ๊ฒฐ์ ํ๋ ํจ์๋ฅผ ๋ง๋ญ๋๋ค:
+
+```python
+def route_email(state: EmailState) -> str:
+ """์คํธ ๋ถ๋ฅ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋ค์ ๋จ๊ณ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค."""
+ if state["is_spam"]:
+ return "spam"
+ else:
+ return "legitimate"
+```
+
+> ๐ก **์ฐธ๊ณ :** ์ด ๋ผ์ฐํ
ํจ์๋ LangGraph๊ฐ ๋ถ๋ฅ ๋
ธ๋ ์ดํ ์ด๋ค ์ฃ์ง๋ฅผ ๋ฐ๋ผ๊ฐ์ง ๊ฒฐ์ ํ ๋ ํธ์ถ๋ฉ๋๋ค. ๋ฐํ๊ฐ์ ์กฐ๊ฑด๋ถ ์ฃ์ง ๋งคํ์ ํค์ ์ผ์นํด์ผ ํฉ๋๋ค.
+
+## 4๋จ๊ณ: StateGraph ์์ฑ ๋ฐ ์ฃ์ง ์ ์[[step-4-create-the-stategraph-and-define-edges]]
+
+์ด์ ๋ชจ๋ ๊ฒ์ ์ฐ๊ฒฐํฉ๋๋ค:
+
+```python
+# ๊ทธ๋ํ ์์ฑ
+email_graph = StateGraph(EmailState)
+
+# ๋
ธ๋ ์ถ๊ฐ
+email_graph.add_node("read_email", read_email)
+email_graph.add_node("classify_email", classify_email)
+email_graph.add_node("handle_spam", handle_spam)
+email_graph.add_node("draft_response", draft_response)
+email_graph.add_node("notify_mr_hugg", notify_mr_hugg)
+
+# ์ฃ์ง ์์
+email_graph.add_edge(START, "read_email")
+# ํ๋ฆ ์ ์
+email_graph.add_edge("read_email", "classify_email")
+
+# ๋ถ๊ธฐ ์ถ๊ฐ
+email_graph.add_conditional_edges(
+ "classify_email",
+ route_email,
+ {
+ "spam": "handle_spam",
+ "legitimate": "draft_response"
+ }
+)
+
+# ๋ง์ง๋ง ์ฃ์ง
+email_graph.add_edge("handle_spam", END)
+email_graph.add_edge("draft_response", "notify_mr_hugg")
+email_graph.add_edge("notify_mr_hugg", END)
+
+# ๊ทธ๋ํ ์ปดํ์ผ
+compiled_graph = email_graph.compile()
+```
+
+LangGraph์์ ์ ๊ณตํ๋ ํน์ํ `END` ๋
ธ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ์ํฌํ๋ก์ฐ๊ฐ ์๋ฃ๋๋ ์ง์ ์ ๋ํ๋
๋๋ค.
+
+## 5๋จ๊ณ: ์ดํ๋ฆฌ์ผ์ด์
์คํํ๊ธฐ[[step-5-run-the-application]]
+
+์ ์ ๋ฉ์ผ๊ณผ ์คํธ ๋ฉ์ผ๋ก ๊ทธ๋ํ๋ฅผ ํ
์คํธํด๋ด
๋๋ค:
+
+```python
+# ์ ์ ๋ฉ์ผ ์์
+legitimate_email = {
+ "sender": "john.smith@example.com",
+ "subject": "์๋น์ค ๋ฌธ์",
+ "body": "์๋
ํ์ธ์ Mr. Hugg, ๋๋ฃ์ ์ถ์ฒ์ผ๋ก ์ฐ๋ฝ๋๋ฆฝ๋๋ค. ๊ทํ์ ์ปจ์คํ
์๋น์ค์ ๋ํด ๋ ์๊ณ ์ถ์ต๋๋ค. ๋ค์ ์ฃผ์ ํตํ ๊ฐ๋ฅํ ๊น์? ๊ฐ์ฌํฉ๋๋ค, John Smith"
+}
+
+# ์คํธ ๋ฉ์ผ ์์
+spam_email = {
+ "sender": "winner@lottery-intl.com",
+ "subject": "๋น์ ์ $5,000,000์ ๋น์ฒจ๋์์ต๋๋ค!!!",
+ "body": "์ถํํฉ๋๋ค! ๊ตญ์ ๋ณต๊ถ์ ๋น์ฒจ๋์
จ์ต๋๋ค! ์๊ธ์ ๋ฐ์ผ์๋ ค๋ฉด ์ํ ์ ๋ณด์ ์์๋ฃ $100์ ๋ณด๋ด์ฃผ์ธ์."
+}
+
+# ์ ์ ๋ฉ์ผ ์ฒ๋ฆฌ
+print("\n์ ์ ๋ฉ์ผ ์ฒ๋ฆฌ ์ค...")
+legitimate_result = compiled_graph.invoke({
+ "email": legitimate_email,
+ "is_spam": None,
+ "spam_reason": None,
+ "email_category": None,
+ "email_draft": None,
+ "messages": []
+})
+
+# ์คํธ ๋ฉ์ผ ์ฒ๋ฆฌ
+print("\n์คํธ ๋ฉ์ผ ์ฒ๋ฆฌ ์ค...")
+spam_result = compiled_graph.invoke({
+ "email": spam_email,
+ "is_spam": None,
+ "spam_reason": None,
+ "email_category": None,
+ "email_draft": None,
+ "messages": []
+})
+```
+
+## 6๋จ๊ณ: Langfuse๋ก ๋ฉ์ผ ๋ถ๋ฅ ์์ด์ ํธ ๊ด์ฐฐํ๊ธฐ ๐ก[[step-6-inspecting-our-mail-sorting-agent-with-langfuse]]
+
+์ํ๋ ๋๋ ๋ฉ์ผ ๋ถ๋ฅ ์์ด์ ํธ๋ฅผ ๋ค๋ฌ์ผ๋ฉด์ ๋๋ฒ๊น
์ ์ง์ณ๊ฐ๋๋ค. ์์ด์ ํธ๋ ๋ณธ์ง์ ์ผ๋ก ์์ธก ๋ถ๊ฐ๋ฅํ๊ณ ์ถ์ ์ด ์ด๋ ต๊ธฐ ๋๋ฌธ์
๋๋ค. ํ์ง๋ง ๊ถ๊ทน์ ์คํธ ๊ฐ์ง ์์ด์ ํธ๋ฅผ ๋ง๋ค์ด ํ๋ก๋์
์ ๋ฐฐํฌํ๋ ค๋ฉด, ํฅํ ๋ชจ๋ํฐ๋ง๊ณผ ๋ถ์์ ์ํ ๊ฐ๋ ฅํ ์ถ์ ๊ธฐ๋ฅ์ด ํ์ํฉ๋๋ค.
+
+์ด๋ฅผ ์ํด ์ํ๋ ๋๋ [Langfuse](https://langfuse.com/)์ ๊ฐ์ ๊ด์ฐฐ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+๋จผ์ Langfuse๋ฅผ ์ค์นํฉ๋๋ค:
+```python
+%pip install -q langfuse
+```
+
+LangChain๋ ์ค์นํฉ๋๋ค(Langfuse ์ฌ์ฉ ์ ํ์):
+```python
+%pip install langchain
+```
+
+Langfuse API ํค์ ํธ์คํธ ์ฃผ์๋ฅผ ํ๊ฒฝ ๋ณ์๋ก ์ถ๊ฐํฉ๋๋ค. [Langfuse Cloud](https://cloud.langfuse.com) ๊ฐ์
๋๋ [์
ํ ํธ์คํ
](https://langfuse.com/self-hosting)์ผ๋ก ํค๋ฅผ ๋ฐ๊ธ๋ฐ์ ์ ์์ต๋๋ค.
+
+```python
+import os
+# ํ๋ก์ ํธ ์ค์ ํ์ด์ง์์ ํค๋ฅผ ํ์ธํ์ธ์: https://cloud.langfuse.com
+os.environ["LANGFUSE_PUBLIC_KEY"] = "pk-lf-..."
+os.environ["LANGFUSE_SECRET_KEY"] = "sk-lf-..."
+os.environ["LANGFUSE_HOST"] = "https://cloud.langfuse.com" # ๐ช๐บ EU ๋ฆฌ์
+# os.environ["LANGFUSE_HOST"] = "https://us.cloud.langfuse.com" # ๐บ๐ธ US ๋ฆฌ์
+```
+
+[Langfuse `callback_handler`](https://langfuse.com/docs/integrations/langchain/tracing#add-langfuse-to-your-langchain-application)๋ฅผ ์ค์ ํ๊ณ , ๊ทธ๋ํ ํธ์ถ ์ `config={"callbacks": [langfuse_handler]}`๋ก ์ธ์คํธ๋ฃจ๋จผํธํฉ๋๋ค.
+
+```python
+from langfuse.langchain import CallbackHandler
+
+# LangGraph/Langchain์ฉ Langfuse CallbackHandler ์ด๊ธฐํ(์ถ์ ์ฉ)
+langfuse_handler = CallbackHandler()
+
+# ์ ์ ๋ฉ์ผ ์ฒ๋ฆฌ
+legitimate_result = compiled_graph.invoke(
+ input={"email": legitimate_email, "is_spam": None, "spam_reason": None, "email_category": None, "draft_response": None, "messages": []},
+ config={"callbacks": [langfuse_handler]}
+)
+```
+
+์ด์ ์ํ๋ ๋๋ LangGraph์ ์คํ ๋ด์ญ์ Langfuse์ ๊ธฐ๋กํ์ฌ ์์ด์ ํธ์ ๋์์ ์์ ํ ํ์
ํ ์ ์์ต๋๋ค. ์ด๋ก์จ ์ด์ ์คํ์ ๋ค์ ์ดํด๋ณด๊ณ ๋ฉ์ผ ๋ถ๋ฅ ์์ด์ ํธ๋ฅผ ๋์ฑ ๊ฐ์ ํ ์ ์์ต๋๋ค.
+
+
+
+_[์ ์ ๋ฉ์ผ ํธ๋ ์ด์ค ๊ณต๊ฐ ๋งํฌ](https://cloud.langfuse.com/project/cloramnkj0002jz088vzn1ja4/traces/f5d6d72e-20af-4357-b232-af44c3728a7b?timestamp=2025-03-17T10%3A13%3A28.413Z&observation=6997ba69-043f-4f77-9445-700a033afba1)_
+
+## ๊ทธ๋ํ ์๊ฐํ[[visualizing-our-graph]]
+
+LangGraph๋ ์ํฌํ๋ก์ฐ ๊ตฌ์กฐ๋ฅผ ์๊ฐํํ์ฌ ์ดํด์ ๋๋ฒ๊น
์ ๋์ต๋๋ค:
+
+```python
+compiled_graph.get_graph().draw_mermaid_png()
+```
+
+
+์ด๋ ๊ฒ ํ๋ฉด ๋
ธ๋ ๊ฐ ์ฐ๊ฒฐ๊ณผ ์กฐ๊ฑด๋ถ ๊ฒฝ๋ก๋ฅผ ํ๋์ ๋ณผ ์ ์์ต๋๋ค.
+
+## ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๊ฒ[[what-we've-built]]
+
+์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์ด๋ฉ์ผ ์ฒ๋ฆฌ ์ํฌํ๋ก์ฐ๋ฅผ ์์ฑํ์ต๋๋ค:
+
+1. ๋ค์ด์จ ์ด๋ฉ์ผ์ ๋ฐ์
+2. LLM์ผ๋ก ์คํธ/์ ์ ๋ถ๋ฅ
+3. ์คํธ์ ํ๊ธฐ
+4. ์ ์ ๋ฉ์ผ์ ๋ต์ฅ ์์ฑ ํ Mr. Hugg์๊ฒ ์ ๋ฌ
+
+์ด์ฒ๋ผ LangGraph๋ฅผ ํ์ฉํ๋ฉด LLM ๊ธฐ๋ฐ์ ๋ณต์กํ ์ํฌํ๋ก์ฐ๋ ๋ช
ํํ๊ณ ๊ตฌ์กฐ์ ์ผ๋ก ์ค์ผ์คํธ๋ ์ด์
ํ ์ ์์ต๋๋ค.
+
+## ํต์ฌ ์์ฝ[[key-takeaways]]
+
+- **์ํ ๊ด๋ฆฌ**: ์ด๋ฉ์ผ ์ฒ๋ฆฌ์ ๋ชจ๋ ์ธก๋ฉด์ ์ถ์ ํ ์ ์๋๋ก ์ํ๋ฅผ ์ ์
+- **๋
ธ๋ ๊ตฌํ**: LLM๊ณผ ์ํธ์์ฉํ๋ ๊ธฐ๋ฅ์ ๋
ธ๋ ๊ตฌํ
+- **์กฐ๊ฑด๋ถ ๋ถ๊ธฐ**: ์ด๋ฉ์ผ ๋ถ๋ฅ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋ถ๊ธฐ ๋ก์ง ๊ตฌํ
+- **์ข
๋ฃ ์ํ**: END ๋
ธ๋๋ก ์ํฌํ๋ก์ฐ ์ข
๋ฃ ์ง์ ํ์
+
+## ๋ค์ ๋จ๊ณ[[what's-next]]
+
+๋ค์ ์น์
์์๋ LangGraph์ ๊ณ ๊ธ ๊ธฐ๋ฅ(์ฌ๋๊ณผ์ ์ํธ์์ฉ, ๋ค์ค ์กฐ๊ฑด ๋ถ๊ธฐ ๋ฑ)์ ๋ค๋ฃน๋๋ค.
diff --git a/units/ko/unit2/langgraph/introduction.mdx b/units/ko/unit2/langgraph/introduction.mdx
new file mode 100644
index 00000000..a1f9da79
--- /dev/null
+++ b/units/ko/unit2/langgraph/introduction.mdx
@@ -0,0 +1,32 @@
+# `LangGraph` ์๊ฐ[[introduction-to-langgraph]]
+
+
+
+๋ค์ ๋จ๊ณ์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค! ์ด ๋จ์์์๋ ๋ณต์กํ LLM ์ํฌํ๋ก์ฐ๋ฅผ ๊ตฌ์กฐํํ๊ณ ์กฐ์ , ๊ด๋ฆฌํ ์ ์๋๋ก ์ค๊ณ๋ [`LangGraph`](https://github.com/langchain-ai/langgraph) ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ **์ดํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ**์ ๋ฐฐ์ฐ๊ฒ ๋ฉ๋๋ค.
+
+`LangGraph`๋ ์์ด์ ํธ์ ํ๋ฆ์ **์ง์ ์ ์ด**ํ ์ ์๋ ๋๊ตฌ๋ฅผ ์ ๊ณตํ์ฌ **ํ๋ก๋์
์์ค**์ ์ดํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค ์ ์๊ฒ ํด์ฃผ๋ ํ๋ ์์ํฌ์
๋๋ค.
+
+## ๋ชจ๋ ๊ฐ์[[module-overview]]
+
+์ด ๋จ์์์ ์ฌ๋ฌ๋ถ์ ๋ค์์ ๋ฐฐ์ฐ๊ฒ ๋ฉ๋๋ค:
+
+### 1๏ธโฃ [LangGraph๋ ๋ฌด์์ด๋ฉฐ, ์ธ์ ์ฌ์ฉํด์ผ ํ ๊น?](./when_to_use_langgraph)
+### 2๏ธโฃ [LangGraph์ ๊ตฌ์ฑ ์์](./building_blocks)
+### 3๏ธโฃ [๋ด ๋ฉ์ผ์ ๋์ ๋ถ๋ฅํด์ฃผ๋ ์ง์ฌ](./first_graph)
+### 4๏ธโฃ [์ํ๋ ๋, ๋ฌธ์ ๋ถ์ ์์ด์ ํธ](./document_analysis_agent)
+### 5๏ธโฃ [ํด์ฆ](./quizz1)
+
+
+์ด ์น์
์ ์์ ๋ค์ ๊ฐ๋ ฅํ LLM/VLM ๋ชจ๋ธ์ด ํ์ํฉ๋๋ค. ์ด ์ฝ์ค์์๋ langGraph์ ๊ฐ์ฅ ํธํ์ฑ์ด ์ข์ GPT-4o API๋ฅผ ์ฌ์ฉํด ์คํํ์์ต๋๋ค.
+
+
+์ด ๋จ์์ด ๋๋๋ฉด, ์ฌ๋ฌ๋ถ์ ๊ฒฌ๊ณ ํ๊ณ ์ฒด๊ณ์ ์ธ, ํ๋ก๋์
์ ๋ฐ๋ก ํฌ์
๊ฐ๋ฅํ ์ดํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค ์ ์๊ฒ ๋ฉ๋๋ค!
+
+์ด ์น์
์ LangGraph์ ์
๋ฌธ ๊ณผ์ ์ด๋, ๋ ์ฌํ๋ ์ฃผ์ ๋ ๋ฌด๋ฃ LangChain ์์นด๋ฐ๋ฏธ ๊ฐ์ [LangGraph ์๊ฐ](https://academy.langchain.com/courses/intro-to-langgraph)์์ ํ์ธํ ์ ์์ต๋๋ค.
+
+๊ทธ๋ผ ์์ํด๋ณผ๊น์?
+
+## ์ฐธ๊ณ ์๋ฃ[[resources]]
+
+- [LangGraph Agents](https://langchain-ai.github.io/langgraph/) - LangGraph ์์ด์ ํธ ์์
+- [LangChain academy](https://academy.langchain.com/courses/intro-to-langgraph) - LangChain์์ ์ ๊ณตํ๋ LangGraph ์ ์ฒด ๊ฐ์
diff --git a/units/ko/unit2/langgraph/quiz1.mdx b/units/ko/unit2/langgraph/quiz1.mdx
new file mode 100644
index 00000000..2f8f9bb2
--- /dev/null
+++ b/units/ko/unit2/langgraph/quiz1.mdx
@@ -0,0 +1,118 @@
+# LangGraph ์ดํด๋ ํ
์คํธ [[test-your-understanding-of-langgraph]]
+
+`LangGraph`์ ๋ํ ์ดํด๋๋ฅผ ๊ฐ๋จํ ํด์ฆ๋ก ํ์ธํด๋ณด์ธ์! ์ง๊ธ๊น์ง ๋ฐฐ์ด ํต์ฌ ๊ฐ๋
์ ๋ณต์ตํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
+
+์ด ํด์ฆ๋ ์ ํ ์ฌํญ์ด๋ฉฐ ์ฑ์ ๋์ง ์์ต๋๋ค.
+
+### Q1: LangGraph์ ์ฃผ์ ๋ชฉ์ ์ ๋ฌด์์ธ๊ฐ์? [[q1-what-is-the-primary-purpose-of-langgraph]]
+LangGraph๊ฐ ๋ฌด์์ ์ํด ์ค๊ณ๋์๋์ง ๊ฐ์ฅ ์ ์ค๋ช
ํ๋ ๋ฌธ์ฅ์?
+
+
+
+---
+
+### Q2: "์ ์ด vs ์์ " ๊ด์ ์์ LangGraph๋ ์ด๋์ ์ํ๋์? [[q2-in-the-context-of-the-control-vs-freedom-trade-off-where-does-langgraph-stand]]
+๋ค์ ์ค LangGraph์ ์์ด์ ํธ ์ค๊ณ ์ ๊ทผ ๋ฐฉ์์ ๊ฐ์ฅ ์ ์ค๋ช
ํ ๋ฌธ์ฅ์?
+
+
+
+---
+
+### Q3: LangGraph์์ ์ํ(State)์ ์ญํ ์ ๋ฌด์์ธ๊ฐ์? [[q3-what-role-does-state-play-in-langgraph]]
+๋ค์ ์ค LangGraph์์ ์ํ(State)์ ๋ํ ์ค๋ช
์ผ๋ก ๊ฐ์ฅ ์ ์ ํ ๊ฒ์?
+
+
+
+### Q4: LangGraph์์ ์กฐ๊ฑด๋ถ ์ฃ์ง(Conditional Edge)๋ ๋ฌด์์ธ๊ฐ์? [[q4-what-is-a-conditional-edge-in-langgraph]]
+์กฐ๊ฑด๋ถ ์ฃ์ง์ ๋ํ ์ค๋ช
์ผ๋ก ๊ฐ์ฅ ์ ์ ํ ๊ฒ์?
+
+
+
+---
+
+### Q5: LangGraph๋ LLM์ ํ๊ฐ(hallucination) ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋๋์? [[q5-how-does-langgraph-help-address-the-hallucination-problem-in-llms]]
+ํ๊ฐ์ ๋ํ ์ค๋ช
์ผ๋ก ๊ฐ์ฅ ์ ์ ํ ๊ฒ์?
+
+
+
+์ถํํฉ๋๋ค! ๐ ํ๋ฆฐ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด, ์์์ ๋ค๋ฃฌ ๋ด์ฉ๋ค์ ๋ค์ ๊ฒํ ํด๋ณด์ธ์. ์ด์ LangGraph์ ๋ ์ฌํ ๊ธฐ๋ฅ์ ์์๋ณด๊ณ , ๋ ๋ณต์กํ ์์ด์ ํธ ์ํฌํ๋ก์ฐ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ด
์๋ค.
diff --git a/units/ko/unit2/langgraph/when_to_use_langgraph.mdx b/units/ko/unit2/langgraph/when_to_use_langgraph.mdx
new file mode 100644
index 00000000..09370de2
--- /dev/null
+++ b/units/ko/unit2/langgraph/when_to_use_langgraph.mdx
@@ -0,0 +1,68 @@
+# `LangGraph`๋ ๋ฌด์์ธ๊ฐ์? [[what-is-langgraph]]
+
+`LangGraph`๋ [LangChain](https://www.langchain.com/)์์ ๊ฐ๋ฐํ ํ๋ ์์ํฌ๋ก, **LLM์ ํตํฉํ ์ดํ๋ฆฌ์ผ์ด์
์ ์ ์ด ํ๋ฆ์ ๊ด๋ฆฌ**ํ๊ธฐ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค.
+
+## `LangGraph`๋ `LangChain`์ ์ด๋ป๊ฒ ๋ค๋ฅธ๊ฐ์? [[is-langgraph-different-from-langchain]]
+
+LangChain์ ๋ชจ๋ธ ๋ฐ ๊ธฐํ ๊ตฌ์ฑ ์์์ ์ํธ์์ฉํ๊ธฐ ์ํ ํ์ค ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ฉฐ, ๊ฒ์, LLM ํธ์ถ, ํด ํธ์ถ์ ์ ์ฉํฉ๋๋ค.
+LangChain์ ํด๋์ค๋ค์ LangGraph์์ ์ฌ์ฉ๋ ์ ์์ง๋ง, ๋ฐ๋์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒ์ ์๋๋๋ค.
+
+๋ ํจํค์ง๋ ์๋ก ๋ค๋ฅธ ํจํค์ง์ด๋ฉฐ, ๊ฐ๊ฐ ๋
๋ฆฝ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ง๋ง, ์ค์ ๋ก ์จ๋ผ์ธ์์ ์ฐพ์ ์ ์๋ ๋๋ถ๋ถ์ ์์ ์์๋ ๋ ํจํค์ง๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
+
+## ์ธ์ `LangGraph`๋ฅผ ์ฌ์ฉํด์ผ ํ ๊น์? [[when-should-i-use-langgraph]]
+### ์ ์ด vs ์์ [[control-vs-freedom]]
+
+AI ์ดํ๋ฆฌ์ผ์ด์
์ ์ค๊ณํ ๋, **์ ์ด**์ **์์ ** ์ฌ์ด์ ํธ๋ ์ด๋์คํ๋ฅผ ๊ณ ๋ คํด์ผํฉ๋๋ค:
+
+- **์์ **๋ LLM์ด ๋ ๋ง์ ์ฐฝ์์ฑ์ ๋ฐํํ๊ณ ์์์น ๋ชปํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋๋ก ํฉ๋๋ค.
+- **์ ์ด**๋ ์์ธก ๊ฐ๋ฅํ ๋์์ ๋ณด์ฅํ๊ณ ์์ ์ฅ์น๋ฅผ ์ ์งํ ์ ์์ต๋๋ค.
+
+*smolagents*์ ์ฝ๋ ์์ด์ ํธ๋ ๋งค์ฐ ์์ ๋กญ์ต๋๋ค. ํ๋์ ์ก์
๋จ๊ณ์์ ์ฌ๋ฌ ๋๊ตฌ๋ฅผ ํธ์ถํ๊ฑฐ๋, ์์ฒด์ ์ผ๋ก ๋๊ตฌ๋ฅผ ๋ง๋ค๊ธฐ๋ ํฉ๋๋ค. ํ์ง๋ง ์ด๋ฐ ๋์์ JSON ๊ธฐ๋ฐ ์์ด์ ํธ๋ณด๋ค ์์ธกํ๊ธฐ ์ด๋ ต๊ณ ์ ์ดํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค!
+
+`LangGraph`๋ ์คํํธ๋ผ์ ๋ฐ๋ํธ์ ์์ผ๋ฉฐ, ์์ด์ ํธ ์คํ์ **"์ ์ด"**๊ฐ ํ์ํ ๋ ๋น๋ฉ๋๋ค.
+
+LangGraph๋ ํนํ **์ดํ๋ฆฌ์ผ์ด์
์ ๋ํ ์ ์ด**๊ฐ ํ์ํ ๋ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์์ธก ๊ฐ๋ฅํ ํ๋ก์ธ์ค๋ฅผ ๋ฐ๋ฅด๋ฉด์๋ LLM์ ํ์ ํ์ฉํ ์ ์๋๋ก ๋๋ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
+
+๊ฐ๋จํ ๋งํ๋ฉด, ์ดํ๋ฆฌ์ผ์ด์
์ด ํน์ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ๋ ์ผ๋ จ์ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผํ๊ณ , ๊ฐ ๋ถ๊ธฐ์ ์์ ์์ฌ๊ฒฐ์ ์ด ๋ด๋ ค์ ธ์ผ ํ๋ค๋ฉด, **LangGraph๊ฐ ๊ทธ ํ์ํ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํด์ค๋๋ค**.
+
+์๋ฅผ ๋ค์ด, ๋ฌธ์์ ๋ํ ์ง๋ฌธ์ ๋ตํ ์ ์๋ LLM ์ด์์คํดํธ๋ฅผ ๊ตฌ์ถํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํด๋ด
์๋ค.
+
+LLM์ด ํ
์คํธ๋ฅผ ๊ฐ์ฅ ์ ์ดํดํ๊ธฐ ๋๋ฌธ์, ์ง๋ฌธ์ ๋ตํ๊ธฐ ์ ์ ๋ณต์กํ ํํ๋ค(์ฐจํธ, ํ)์ ํ
์คํธ๋ก ๋ณํํด์ผ ํฉ๋๋ค. ํ์ง๋ง ๊ทธ ์ ํ์ ๋ฌธ์์ ์ ํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค!
+
+์ด๋ฌํ ๋ถ๊ธฐ ํ๋ฆ์ ์๋์ ๊ฐ์ด ํํํ ์ ์์ต๋๋ค:
+
+
+
+> ๐ก **ํ:** ์ผ์ชฝ ๋ถ๋ถ์ ๋๊ตฌ ํธ์ถ์ด ์๊ธฐ ๋๋ฌธ์ ์์ด์ ํธ๊ฐ ์๋๋๋ค. ๊ทธ๋ฌ๋ ์ค๋ฅธ์ชฝ ๋ถ๋ถ์ ์์
ํ์ผ์ ์ฟผ๋ฆฌํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ฏ๋ก ์์ด์ ํธ๊ฐ ํ์ํฉ๋๋ค.(์: pandas๋ก ๋ณํํ๊ณ ์กฐ์).
+
+์ด ๋ถ๊ธฐ๋ ๊ฒฐ์ ์ ์ด์ง๋ง, LLM ์ถ๋ ฅ์ ๋ฐ๋ผ ์กฐ๊ฑด์ด ์ ํด์ง๋ ๋น๊ฒฐ์ ์ ๋ถ๊ธฐ๋ ์ค๊ณํ ์ ์์ต๋๋ค.
+
+LangGraph๊ฐ ์ ์ฉํ ๊ฒฝ์ฐ:
+
+- **๋ช
์์ ์ธ ํ๋ฆ ์ ์ด๊ฐ ํ์ํ ๋ค๋จ๊ณ ์ถ๋ก ํ๋ก์ธ์ค**
+- **๋จ๊ณ ๊ฐ ์ํ ์ง์์ด ํ์ํ ์ดํ๋ฆฌ์ผ์ด์
**
+- **๊ฒฐ์ ๋ก ์ ๋ก์ง๊ณผ AI ๊ธฐ๋ฅ์ ๊ฒฐํฉํ๋ ์์คํ
**
+- **์ฌ๋์ ๊ฐ์
์ด ํ์ํ ์ํฌํ๋ก์ฐ**
+- **์ฌ๋ฌ ๊ตฌ์ฑ ์์๊ฐ ํจ๊ป ์๋ํ๋ ๋ณต์กํ ์์ด์ ํธ ์ํคํ
์ฒ**
+
+์์ฝํ์๋ฉด, ์ต๋ํ **์ฌ๋์ด ์ง์ ** ๊ฐ ๋จ๊ณ์ ์ถ๋ ฅ์ ๋ฐ๋ผ ์คํํ ๋ค์ ๋จ๊ณ๋ฅผ ์ค๊ณํด์ผ ํ๋ ๊ฒฝ์ฐ, LangGraph๊ฐ ๊ฐ์ฅ ์ ์ ํฉ๋๋ค!
+
+`LangGraph`๋ ์ ์๊ฐ์ ์์ฅ์์ ๊ฐ์ฅ ํ๋ก๋์
์ค๋น๊ฐ ์ ๋ ์์ด์ ํธ ํ๋ ์์ํฌ์
๋๋ค.
+
+## LangGraph๋ ์ด๋ป๊ฒ ์๋ํ๋์? [[how-does-langgraph-work]]
+
+`LangGraph`๋ ์ดํ๋ฆฌ์ผ์ด์
์ ํ๋ฆ์ ์ ์ํ๊ธฐ ์ํด ๋ฐฉํฅ์ฑ ๊ทธ๋ํ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค:
+
+- **๋
ธ๋(Node)**๋ ๊ฐ ์ฒ๋ฆฌ ๋จ๊ณ๋ฅผ ๋ํ๋
๋๋ค(LLM ํธ์ถ, ๋๊ตฌ ์ฌ์ฉ, ์์ฌ๊ฒฐ์ ๋ฑ).
+- **์ฃ์ง(Edge)**๋ ๋จ๊ณ ๊ฐ ๊ฐ๋ฅํ ์ ํ์ ์ ์ํฉ๋๋ค.
+- **์ํ(State)**๋ ์ฌ์ฉ์๊ฐ ์ ์ํ๊ณ ์ ์งํ๋ฉฐ ์คํ ์ค ๋
ธ๋ ๊ฐ์ ์ ๋ฌ๋ฉ๋๋ค. ๋ค์์ ์ด๋ค ๋
ธ๋๋ฅผ ์คํํ ์ง ๊ฒฐ์ ํ ๋, ํ์ฌ ์ํ๊ฐ ๊ธฐ์ค์
๋๋ค.
+
+์ด๋ฌํ ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์๋ค์ ๋ค์ ์ฅ์์ ๋ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค!
+
+## ์ผ๋ฐ ํ์ด์ฌ๊ณผ ์ด๋ป๊ฒ ๋ค๋ฅธ๊ฐ์? ์ LangGraph๊ฐ ํ์ํ๊ฐ์? [[how-is-it-different-from-regular-python-why-do-i-need-langgraph]]
+
+"๊ทธ๋ฅ ์ผ๋ฐ ํ์ด์ฌ ๋ฌธ๋ฒ์ผ๋ก if-else ๋ฌธ ์ฐ๋ฉด ๋์ง ์๋์?"๋ผ๊ณ ๊ถ๊ธํดํ ์ ์์ต๋๋ค.
+
+๊ธฐ์ ์ ์ผ๋ก๋ ๊ฐ๋ฅํ์ง๋ง, LangGraph๋ ๋ณต์กํ ์์คํ
๊ตฌ์ถ์ ์ํด ์ผ๋ฐ ํ์ด์ฌ๋ณด๋ค **์ฌ๋ฌ๊ฐ์ง ์ฅ์ **์ ์ ๊ณตํฉ๋๋ค. LangGraph ์์ด๋ ๋์ผํ ์ดํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ์ ์์ง๋ง, LangGraph๋ ๋ ์ฝ๊ฒ ๊ฐ๋ฐํ ์ ์๋ ๋๊ตฌ์ ์ถ์ํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
+
+์: ์ํ ๊ด๋ฆฌ, ์๊ฐํ, ๋ก๊น
(ํธ๋ ์ด์ค), ๋ด์ฅํ ์ฌ์ฉ์ ๊ฐ์
์ฒ๋ฆฌ ๊ธฐ๋ฅ ๋ฑ.
diff --git a/units/ko/unit2/llama-index/README.md b/units/ko/unit2/llama-index/README.md
new file mode 100644
index 00000000..b28ffd70
--- /dev/null
+++ b/units/ko/unit2/llama-index/README.md
@@ -0,0 +1,15 @@
+# ๋ชฉ์ฐจ
+
+์ด LlamaIndex ํ๋ ์ ๊ฐ์๋ ๊ฐ์ 2๋จ์์ ์ผ๋ถ์
๋๋ค. hf.co/learn์์ LlamaIndex์ ๋ํ 2๋จ์์ ์ ๊ทผํ ์ ์์ต๋๋ค ๐ ์ฌ๊ธฐ
+
+| ์ ๋ชฉ | ์ค๋ช
|
+| --- | --- |
+| [์๊ฐ](introduction.mdx) | LlamaIndex ์๊ฐ |
+| [LlamaHub](llama-hub.mdx) | LlamaHub: ํตํฉ, ์์ด์ ํธ, ํด์ ๋ ์ง์คํธ๋ฆฌ |
+| [๊ตฌ์ฑ ์์](components.mdx) | ๊ตฌ์ฑ ์์: ์ํฌํ๋ก์ฐ์ ๋น๋ฉ ๋ธ๋ก |
+| [ํด](tools.mdx) | ํด: LlamaIndex์์ ํด์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ |
+| [ํด์ฆ 1](quiz1.mdx) | ํด์ฆ 1 |
+| [์์ด์ ํธ](agents.mdx) | ์์ด์ ํธ: LlamaIndex์์ ์์ด์ ํธ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ |
+| [์ํฌํ๋ก์ฐ](workflows.mdx) | ์ํฌํ๋ก์ฐ: ์์๋๋ก ์คํ๋๋ ๊ตฌ์ฑ ์์๋ก ๋ง๋ค์ด์ง ๋จ๊ณ, ์ด๋ฒคํธ์ ์ํ์ค |
+| [ํด์ฆ 2](quiz2.mdx) | ํด์ฆ 2 |
+| [๊ฒฐ๋ก ](conclusion.mdx) | ๊ฒฐ๋ก |
diff --git a/units/ko/unit2/llama-index/agents.mdx b/units/ko/unit2/llama-index/agents.mdx
new file mode 100644
index 00000000..40e54a00
--- /dev/null
+++ b/units/ko/unit2/llama-index/agents.mdx
@@ -0,0 +1,160 @@
+# LlamaIndex์์ ์์ด์ ํธ ์ฌ์ฉํ๊ธฐ
+
+์ด์ ์ ๋์๋ ๋์์ด ๋๋ ์ง์ฌ ์์ด์ ํธ ์ํ๋ ๋๋ฅผ ๊ธฐ์ตํ์๋์? ์ด์ ๊ทธ๊ฐ ์
๊ทธ๋ ์ด๋๋ฅผ ๋ฐ์ ์ฐจ๋ก์
๋๋ค!
+์ด์ LlamaIndex์์ ์ฌ์ฉํ ์ ์๋ ํด๋ค์ ์ดํดํ์ผ๋, ์ํ๋ ๋์๊ฒ ๋ ๋์ ์๋น์ค๋ฅผ ์ ๊ณตํ ์ ์๋ ์๋ก์ด ๊ธฐ๋ฅ๋ค์ ๋ถ์ฌํ ์ ์์ต๋๋ค.
+
+ํ์ง๋ง ๊ณ์ํ๊ธฐ ์ ์, ์ํ๋ ๋ ๊ฐ์ ์์ด์ ํธ๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ค์ ํ๋ฒ ์๊ธฐํด๋ด
์๋ค.
+1๋จ์์์ ์ฐ๋ฆฌ๋ ๋ค์์ ๋ฐฐ์ ์ต๋๋ค:
+
+> ์์ด์ ํธ๋ ์ฌ์ฉ์๊ฐ ์ ์ํ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด AI ๋ชจ๋ธ์ ํ์ฉํ์ฌ ํ๊ฒฝ๊ณผ ์ํธ์์ฉํ๋ ์์คํ
์
๋๋ค. ์์
์ ์ํํ๊ธฐ ์ํด ์ถ๋ก , ๊ณํ, ์ก์
์คํ(์ข
์ข
์ธ๋ถ ํด์ ํตํด)์ ๊ฒฐํฉํฉ๋๋ค.
+
+LlamaIndex๋ **์ธ ๊ฐ์ง ์ฃผ์ ์ ํ์ ์ถ๋ก ์์ด์ ํธ**๋ฅผ ์ง์ํฉ๋๋ค:
+
+
+
+1. `Function Calling Agents` - ํน์ ํจ์๋ฅผ ํธ์ถํ ์ ์๋ AI ๋ชจ๋ธ๊ณผ ํจ๊ป ์๋ํฉ๋๋ค.
+2. `ReAct Agents` - ์ฑํ
์ด๋ ํ
์คํธ ์๋ํฌ์ธํธ๋ฅผ ์ํํ๋ ๋ชจ๋ AI์ ํจ๊ป ์๋ํ ์ ์์ผ๋ฉฐ, ๋ณต์กํ ์ถ๋ก ์์
์ ์ฒ๋ฆฌํฉ๋๋ค.
+3. `Advanced Custom Agents` - ๋ ๋ณต์กํ ์์
๊ณผ ์ํฌํ๋ก์ฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ ๋ณต์กํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํฉ๋๋ค.
+
+๊ณ ๊ธ ์์ด์ ํธ์ ๋ํ ๋ ๋ง์ ์ ๋ณด๋ BaseWorkflowAgent์์ ์ฐพ์ ์ ์์ต๋๋ค.
+
+## ์์ด์ ํธ ์ด๊ธฐํ
+
+
+์ด ๋
ธํธ๋ถ์ ๋ฐ๋ผ๊ฐ๋ฉฐ Google Colab์์ ์ฝ๋๋ฅผ ์คํํด๋ณผ ์ ์์ต๋๋ค.
+
+
+์์ด์ ํธ๋ฅผ ๋ง๋ค๊ธฐ ์ํด, ๋จผ์ **๊ธฐ๋ฅ์ ์ ์ํ๋ ํจ์/ํด ์ธํธ**๋ฅผ ์ ๊ณตํฉ๋๋ค.
+๋ช ๊ฐ์ง ๊ธฐ๋ณธ ํด๋ก ์์ด์ ํธ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ํ์ฌ๋ก์๋ ์์ด์ ํธ๊ฐ ์๋์ผ๋ก ํจ์ ํธ์ถ API(์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ) ๋๋ ํ์ค ReAct ์์ด์ ํธ ๋ฃจํ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
+
+ํด/ํจ์ API๋ฅผ ์ง์ํ๋ LLM๋ค์ ๋น๊ต์ ์ต์ ์ด์ง๋ง, ํน์ ํ๋กฌํํ
์ ํผํ๊ณ ์ ๊ณต๋ ์คํค๋ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก LLM์ด ํด ํธ์ถ์ ์์ฑํ ์ ์๊ฒ ํ์ฌ ํด์ ํธ์ถํ๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
+
+ReAct ์์ด์ ํธ๋ ๋ํ ๋ณต์กํ ์ถ๋ก ์์
์ ๋ฅ์ํ๋ฉฐ, ์ฑํ
์ด๋ ํ
์คํธ ์์ฑ ๊ธฐ๋ฅ์ด ์๋ ๋ชจ๋ LLM๊ณผ ํจ๊ป ์๋ํ ์ ์์ต๋๋ค. ๋ ์์ธํ๋ฉฐ, ์ํํ๋ ํน์ ์ก์
์ ์ถ๋ก ๊ณผ์ ์ ๋ณด์ฌ์ค๋๋ค.
+
+```python
+from llama_index.llms.huggingface_api import HuggingFaceInferenceAPI
+from llama_index.core.agent.workflow import AgentWorkflow
+from llama_index.core.tools import FunctionTool
+
+# ์ํ ํด ์ ์ -- ํ์
์ด๋
ธํ
์ด์
, ํจ์ ์ด๋ฆ, ๋
์คํธ๋ง์ด ๋ชจ๋ ํ์ฑ๋ ์คํค๋ง์ ํฌํจ๋ฉ๋๋ค!
+def multiply(a: int, b: int) -> int:
+ """๋ ์ ์๋ฅผ ๊ณฑํ๊ณ ๊ฒฐ๊ณผ ์ ์๋ฅผ ๋ฐํํฉ๋๋ค"""
+ return a * b
+
+# llm ์ด๊ธฐํ
+llm = HuggingFaceInferenceAPI(model_name="Qwen/Qwen2.5-Coder-32B-Instruct")
+
+# ์์ด์ ํธ ์ด๊ธฐํ
+agent = AgentWorkflow.from_tools_or_functions(
+ [FunctionTool.from_defaults(multiply)],
+ llm=llm
+)
+```
+
+**์์ด์ ํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ํ๊ฐ ์์ผ๋ฉฐ**, ๊ณผ๊ฑฐ ์ํธ์์ฉ์ ๊ธฐ์ตํ๋ ๊ฒ์ `Context` ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ์ฌํญ์
๋๋ค.
+์ด๋ ์ฌ๋ฌ ๋ฉ์์ง์ ๊ฑธ์ณ ๋งฅ๋ฝ์ ์ ์งํ๋ ์ฑ๋ด์ด๋ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์งํ ์ํฉ์ ์ถ์ ํด์ผ ํ๋ ์์
๊ด๋ฆฌ์์ฒ๋ผ ์ด์ ์ํธ์์ฉ์ ๊ธฐ์ตํด์ผ ํ๋ ์์ด์ ํธ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๋ ์ ์ฉํ ์ ์์ต๋๋ค.
+
+```python
+# ์ํ ์์
+response = await agent.run("2 ๊ณฑํ๊ธฐ 2๋ ๋ฌด์์ธ๊ฐ์?")
+
+# ์ํ ๊ธฐ์ต
+from llama_index.core.workflow import Context
+
+ctx = Context(agent)
+
+response = await agent.run("๋ด ์ด๋ฆ์ Bob์
๋๋ค.", ctx=ctx)
+response = await agent.run("๋ด ์ด๋ฆ์ด ๋ญ์์ง?", ctx=ctx)
+```
+
+`LlamaIndex`์ ์์ด์ ํธ๋ค์ด Python์ `await` ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ๋ผ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. Python์ ๋น๋๊ธฐ ์ฝ๋๊ฐ ์ฒ์์ด๊ฑฐ๋ ๋ณต์ต์ด ํ์ํ๋ค๋ฉด, [ํ๋ฅญํ ๋น๋๊ธฐ ๊ฐ์ด๋](https://docs.llamaindex.ai/en/stable/getting_started/async_python/)๊ฐ ์์ต๋๋ค.
+
+์ด์ ๊ธฐ๋ณธ์ ๋ง์คํฐํ์ผ๋, ์์ด์ ํธ์์ ๋ ๋ณต์กํ ํด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
+
+## QueryEngineTools๋ก RAG ์์ด์ ํธ ๋ง๋ค๊ธฐ
+
+**์์ด์ ํธ RAG๋ ์์ด์ ํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์ ๋ํ ์ง๋ฌธ์ ๋ตํ๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์
๋๋ค.** ์ํ๋ ๋๊ฐ ์ง๋ฌธ์ ๋ตํ๋ ๋ฐ ๋์์ด ๋๋๋ก ๋ค์ํ ํด์ ์ ๋ฌํ ์ ์์ต๋๋ค.
+ํ์ง๋ง ๋ฌธ์ ์์์ ์๋์ผ๋ก ์ง๋ฌธ์ ๋ตํ๋ ๋์ , ์ํ๋ ๋๋ ์ง๋ฌธ์ ๋ตํ๊ธฐ ์ํด ๋ค๋ฅธ ํด์ด๋ ํ๋ฆ์ ์ฌ์ฉํ ์ง ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
+
+
+
+์์ด์ ํธ๋ฅผ ์ํด **`QueryEngine`์ ํด๋ก ๋ํ**ํ๋ ๊ฒ์ ์ฝ์ต๋๋ค.
+์ด๋ ๊ฒ ํ ๋, **์ด๋ฆ๊ณผ ์ค๋ช
์ ์ ์**ํด์ผ ํฉ๋๋ค. LLM์ ์ด ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ ํด์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํฉ๋๋ค.
+[๊ตฌ์ฑ ์์ ์น์
](components)์์ ๋ง๋ `QueryEngine`์ ์ฌ์ฉํ์ฌ `QueryEngineTool`์ ๋ก๋ํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
+
+```python
+from llama_index.core.tools import QueryEngineTool
+
+query_engine = index.as_query_engine(llm=llm, similarity_top_k=3) # LlamaIndex์ ๊ตฌ์ฑ ์์ ์น์
์์ ๋ณด์ฌ์ง ๋๋ก
+
+query_engine_tool = QueryEngineTool.from_defaults(
+ query_engine=query_engine,
+ name="name",
+ description="a specific description",
+ return_direct=False,
+)
+query_engine_agent = AgentWorkflow.from_tools_or_functions(
+ [query_engine_tool],
+ llm=llm,
+ system_prompt="You are a helpful assistant that has access to a database containing persona descriptions. "
+)
+```
+
+## ๋ค์ค ์์ด์ ํธ ์์คํ
๋ง๋ค๊ธฐ
+
+`AgentWorkflow` ํด๋์ค๋ ๋ค์ค ์์ด์ ํธ ์์คํ
๋ ์ง์ ์ง์ํฉ๋๋ค. ๊ฐ ์์ด์ ํธ์ ์ด๋ฆ๊ณผ ์ค๋ช
์ ๋ถ์ฌํจ์ผ๋ก์จ, ์์คํ
์ ๋จ์ผ ํ์ฑ ๋ฐํ์๋ฅผ ์ ์งํ๋ฉฐ, ๊ฐ ์์ด์ ํธ๋ ๋ค๋ฅธ ์์ด์ ํธ์๊ฒ ์์
์ ๋๊ธธ ์ ์๋ ๋ฅ๋ ฅ์ ๊ฐ์ง๋๋ค.
+
+๊ฐ ์์ด์ ํธ์ ๋ฒ์๋ฅผ ์ขํ์ผ๋ก์จ, ์ฌ์ฉ์ ๋ฉ์์ง์ ์๋ตํ ๋ ์ผ๋ฐ์ ์ธ ์ ํ๋๋ฅผ ๋์ด๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
+
+**LlamaIndex์ ์์ด์ ํธ๋ค์ ๋ ๋ณต์กํ๊ณ ์ฌ์ฉ์ ์ ์ ์๋๋ฆฌ์ค๋ฅผ ์ํด ๋ค๋ฅธ ์์ด์ ํธ์ ํด๋ก๋ ์ง์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.**
+
+```python
+from llama_index.core.agent.workflow import (
+ AgentWorkflow,
+ FunctionAgent,
+ ReActAgent,
+)
+
+# ๋ช ๊ฐ์ง ํด ์ ์
+def add(a: int, b: int) -> int:
+ """๋ ์ซ์๋ฅผ ๋ํฉ๋๋ค."""
+ return a + b
+
+
+def subtract(a: int, b: int) -> int:
+ """๋ ์ซ์๋ฅผ ๋บ๋๋ค."""
+ return a - b
+
+
+# ์์ด์ ํธ ์ค์ ์์ฑ
+# ์ฐธ๊ณ : ์ฌ๊ธฐ์ FunctionAgent ๋๋ ReActAgent๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+# FunctionAgent๋ ํจ์ ํธ์ถ API๊ฐ ์๋ LLM์ฉ์
๋๋ค.
+# ReActAgent๋ ๋ชจ๋ LLM์ฉ์
๋๋ค.
+calculator_agent = ReActAgent(
+ name="calculator",
+ description="๊ธฐ๋ณธ ์ฐ์ ์ฐ์ฐ์ ์ํํฉ๋๋ค",
+ system_prompt="๋น์ ์ ๊ณ์ฐ๊ธฐ ์ด์์คํดํธ์
๋๋ค. ๋ชจ๋ ์ํ ์ฐ์ฐ์ ํด์ ์ฌ์ฉํ์ธ์.",
+ tools=[add, subtract],
+ llm=llm,
+)
+
+query_agent = ReActAgent(
+ name="info_lookup",
+ description="XYZ์ ๋ํ ์ ๋ณด๋ฅผ ์ฐพ์ต๋๋ค",
+ system_prompt="XYZ์ ๋ํ ์ ๋ณด๋ฅผ ๋ตํ๊ธฐ ์ํด RAG ์์คํ
์ ์ฟผ๋ฆฌํ๋ ํด์ ์ฌ์ฉํ์ธ์",
+ tools=[query_engine_tool],
+ llm=llm
+)
+
+# ์ํฌํ๋ก์ฐ ์์ฑ ๋ฐ ์คํ
+agent = AgentWorkflow(
+ agents=[calculator_agent, query_agent], root_agent="calculator"
+)
+
+# ์์คํ
์คํ
+response = await agent.run(user_msg="5์ 3์ ๋ํ ์ ์๋์?")
+```
+
+์์ง ์ถฉ๋ถํ ๋ฐฐ์ฐ์ง ๋ชปํ๋์? AgentWorkflow ๊ธฐ๋ณธ ์๊ฐ ๋๋ ์์ด์ ํธ ํ์ต ๊ฐ์ด๋์์ LlamaIndex์ ์์ด์ ํธ์ ํด์ ๋ํด ๋ ๋ง์ ๊ฒ์ ๋ฐ๊ฒฌํ ์ ์์ผ๋ฉฐ, ์คํธ๋ฆฌ๋ฐ, ๋งฅ๋ฝ ์ง๋ ฌํ, ์ฌ๋ ๊ฐ์
์ ๋ํด ๋ ์ฝ์ ์ ์์ต๋๋ค!
+
+์ด์ LlamaIndex์์ ์์ด์ ํธ์ ํด์ ๊ธฐ๋ณธ์ ์ดํดํ์ผ๋, LlamaIndex๋ฅผ ์ฌ์ฉํ์ฌ **๊ตฌ์ฑ ๊ฐ๋ฅํ๊ณ ๊ด๋ฆฌ ๊ฐ๋ฅํ ์ํฌํ๋ก์ฐ๋ฅผ ๋ง๋๋** ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค!
diff --git a/units/ko/unit2/llama-index/components.mdx b/units/ko/unit2/llama-index/components.mdx
new file mode 100644
index 00000000..1f7a4d83
--- /dev/null
+++ b/units/ko/unit2/llama-index/components.mdx
@@ -0,0 +1,241 @@
+# LlamaIndex์ ๊ตฌ์ฑ ์์๋ ๋ฌด์์ธ๊ฐ์?
+
+1๋จ์์์ ๋์๋ ๋์์ด ๋๋ ์ง์ฌ ์์ด์ ํธ ์ํ๋ ๋๋ฅผ ๊ธฐ์ตํ์๋์?
+ํจ๊ณผ์ ์ผ๋ก ์ฐ๋ฆฌ๋ฅผ ๋์ฐ๋ ค๋ฉด, ์ํ๋ ๋๋ ์ฐ๋ฆฌ์ ์์ฒญ์ ์ดํดํ๊ณ **์์
์ ์๋ฃํ๋ ๋ฐ ๋์์ด ๋๋ ๊ด๋ จ ์ ๋ณด๋ฅผ ์ค๋นํ๊ณ , ์ฐพ๊ณ , ์ฌ์ฉ**ํ ์ ์์ด์ผ ํฉ๋๋ค.
+์ด๊ฒ์ด LlamaIndex์ ๊ตฌ์ฑ ์์๊ฐ ๋ค์ด์ค๋ ๊ณณ์
๋๋ค.
+
+LlamaIndex์๋ ๋ง์ ๊ตฌ์ฑ ์์๊ฐ ์์ง๋ง, **์ฐ๋ฆฌ๋ ํน๋ณํ `QueryEngine` ๊ตฌ์ฑ ์์์ ์ง์คํ ๊ฒ์
๋๋ค.**
+์๋๊ณ ์? ์์ด์ ํธ์ ๊ฒ์ ์ฆ๊ฐ ์์ฑ(RAG) ํด๋ก ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
+
+๊ทธ๋ผ RAG๋ ๋ฌด์์ผ๊น์? LLM์ ์ผ๋ฐ์ ์ธ ์ง์์ ๋ฐฐ์ฐ๊ธฐ ์ํด ์์ฒญ๋ ์์ ๋ฐ์ดํฐ๋ก ํ๋ จ๋ฉ๋๋ค.
+ํ์ง๋ง ๊ด๋ จ ์๊ณ ์ต์ ๋ฐ์ดํฐ๋ก ํ๋ จ๋์ง ์์์ ์ ์์ต๋๋ค.
+RAG๋ ๋ฐ์ดํฐ์์ ๊ด๋ จ ์ ๋ณด๋ฅผ ์ฐพ๊ณ ๊ฒ์ํ์ฌ LLM์๊ฒ ์ ๊ณตํจ์ผ๋ก์จ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
+
+
+
+์ด์ ์ํ๋ ๋๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์๊ฐํด๋ณด์ธ์:
+
+1. ์ํ๋ ๋์๊ฒ ์ ๋
ํํฐ ๊ณํ์ ๋์๋ฌ๋ผ๊ณ ์์ฒญํฉ๋๋ค
+2. ์ํ๋ ๋๋ ์บ๋ฆฐ๋, ์์ด ์ ํธ๋, ๊ณผ๊ฑฐ ์ฑ๊ณตํ ๋ฉ๋ด๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค
+3. `QueryEngine`์ด ์ํ๋ ๋๊ฐ ์ด ์ ๋ณด๋ฅผ ์ฐพ๊ณ ์ ๋
ํํฐ ๊ณํ์ ์ฌ์ฉํ๋๋ก ๋์์ค๋๋ค
+
+์ด๊ฒ์ด `QueryEngine`์ LlamaIndex์์ **์์ด์ ํธ RAG ์ํฌํ๋ก์ฐ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ํต์ฌ ๊ตฌ์ฑ ์์**๋ก ๋ง๋ญ๋๋ค.
+์ํ๋ ๋๊ฐ ๋์์ด ๋๊ธฐ ์ํด ๊ฐ์ ์ ๋ณด๋ฅผ ๊ฒ์ํด์ผ ํ๋ ๊ฒ์ฒ๋ผ, ๋ชจ๋ ์์ด์ ํธ๋ ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ณ ์ดํดํ ์ ์๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค.
+`QueryEngine`์ ์ ํํ ์ด ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
+
+์ด์ ๊ตฌ์ฑ ์์์ ๋ํด ์กฐ๊ธ ๋ ๊น์ด ๋ค์ด๊ฐ์ **๊ตฌ์ฑ ์์๋ฅผ ๊ฒฐํฉํ์ฌ RAG ํ์ดํ๋ผ์ธ์ ๋ง๋๋** ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
+
+## ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ์ฌ RAG ํ์ดํ๋ผ์ธ ๋ง๋ค๊ธฐ
+
+
+์ด ๋
ธํธ๋ถ์ ๋ฐ๋ผ๊ฐ๋ฉฐ Google Colab์์ ์ฝ๋๋ฅผ ์คํํด๋ณผ ์ ์์ต๋๋ค.
+
+
+RAG ๋ด์๋ 5๊ฐ์ง ์ฃผ์ ๋จ๊ณ๊ฐ ์์ผ๋ฉฐ, ์ด๋ ๊ตฌ์ถํ๋ ๋๋ถ๋ถ์ ๋ ํฐ ์ดํ๋ฆฌ์ผ์ด์
์ ์ผ๋ถ๊ฐ ๋ฉ๋๋ค:
+
+1. **๋ก๋ฉ**: ๋ฐ์ดํฐ๊ฐ ์๋ ๊ณณ(ํ
์คํธ ํ์ผ, PDF, ๋ค๋ฅธ ์น์ฌ์ดํธ, ๋ฐ์ดํฐ๋ฒ ์ด์ค, API)์์ ์ํฌํ๋ก์ฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. LlamaHub๋ ์ ํํ ์ ์๋ ์๋ฐฑ ๊ฐ์ ํตํฉ์ ์ ๊ณตํฉ๋๋ค.
+2. **์ธ๋ฑ์ฑ**: ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌํ ์ ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. LLM์ ๊ฒฝ์ฐ, ์ด๋ ๊ฑฐ์ ํญ์ ๋ฒกํฐ ์๋ฒ ๋ฉ์ ๋ง๋๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ ์๋ฏธ์ ์์น์ ํํ์
๋๋ค. ์ธ๋ฑ์ฑ์ ์์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ๋งฅ๋ฝ์ ์ผ๋ก ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๊ฒ ์ฐพ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ์๋ง์ ๋ค๋ฅธ ๋ฉํ๋ฐ์ดํฐ ์ ๋ต์ ์๋ฏธํ ์๋ ์์ต๋๋ค.
+3. **์ ์ฅ**: ๋ฐ์ดํฐ๊ฐ ์ธ๋ฑ์ฑ๋๋ฉด ๋ค์ ์ธ๋ฑ์ฑํ ํ์๊ฐ ์๋๋ก ์ธ๋ฑ์ค์ ๋ค๋ฅธ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ถ์ ๊ฒ์
๋๋ค.
+4. **์ฟผ๋ฆฌ**: ์ฃผ์ด์ง ์ธ๋ฑ์ฑ ์ ๋ต์ ๋ํด ํ์ ์ฟผ๋ฆฌ, ๋ค๋จ๊ณ ์ฟผ๋ฆฌ, ํ์ด๋ธ๋ฆฌ๋ ์ ๋ต์ ํฌํจํ์ฌ LLM๊ณผ LlamaIndex ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌํ ์ ์๋ ๋ง์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
+5. **ํ๊ฐ**: ๋ชจ๋ ํ๋ฆ์์ ์ค์ํ ๋จ๊ณ๋ ๋ค๋ฅธ ์ ๋ต์ ๋นํด ์ผ๋ง๋ ํจ๊ณผ์ ์ธ์ง, ๋๋ ๋ณ๊ฒฝ์ฌํญ์ ๋ง๋ค ๋ ํ์ธํ๋ ๊ฒ์
๋๋ค. ํ๊ฐ๋ ์ฟผ๋ฆฌ์ ๋ํ ์๋ต์ด ์ผ๋ง๋ ์ ํํ๊ณ , ์ ๋ขฐํ ์ ์๊ณ , ๋น ๋ฅธ์ง์ ๋ํ ๊ฐ๊ด์ ์ธ ์ธก์ ์ ์ ๊ณตํฉ๋๋ค.
+
+๋ค์์ผ๋ก, ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ๋จ๊ณ๋ค์ ์ฌํํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
+
+### ๋ฌธ์ ๋ก๋ฉ ๋ฐ ์๋ฒ ๋ฉ
+
+์์ ์ธ๊ธํ๋ฏ์ด, LlamaIndex๋ ์์ฒด ๋ฐ์ดํฐ ์์์ ์๋ํ ์ ์์ง๋ง, **๋ฐ์ดํฐ์ ์ ๊ทผํ๊ธฐ ์ ์ ๋ก๋ํด์ผ ํฉ๋๋ค.**
+LlamaIndex์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ์ธ ๊ฐ์ง ์ฃผ์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค:
+
+1. `SimpleDirectoryReader`: ๋ก์ปฌ ๋๋ ํ ๋ฆฌ์์ ๋ค์ํ ํ์ผ ์ ํ์ ์ํ ๋ด์ฅ ๋ก๋์
๋๋ค.
+2. `LlamaParse`: PDF ํ์ฑ์ ์ํ LlamaIndex์ ๊ณต์ ํด์ธ LlamaParse๋ก, ๊ด๋ฆฌํ API๋ก ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
+3. `LlamaHub`: ๋ชจ๋ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ธฐ ์ํ ์๋ฐฑ ๊ฐ์ ๋ฐ์ดํฐ ๋ก๋ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ ์ง์คํธ๋ฆฌ์
๋๋ค.
+
+๋ ๋ณต์กํ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ํด LlamaHub ๋ก๋์ LlamaParse ํ์์ ์ต์ํด์ง์ธ์.
+
+**๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ `SimpleDirectoryReader`๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.**
+์ด ๋ค์ฌ๋ค๋ฅํ ๊ตฌ์ฑ ์์๋ ํด๋์์ ๋ค์ํ ํ์ผ ์ ํ์ ๋ก๋ํ๊ณ LlamaIndex๊ฐ ์์
ํ ์ ์๋ `Document` ๊ฐ์ฒด๋ก ๋ณํํ ์ ์์ต๋๋ค.
+`SimpleDirectoryReader`๋ฅผ ์ฌ์ฉํ์ฌ ํด๋์์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
+
+```python
+from llama_index.core import SimpleDirectoryReader
+
+reader = SimpleDirectoryReader(input_dir="path/to/directory")
+documents = reader.load_data()
+```
+
+๋ฌธ์๋ฅผ ๋ก๋ํ ํ, `Node` ๊ฐ์ฒด๋ผ๋ ๋ ์์ ์กฐ๊ฐ๋ค๋ก ๋๋์ด์ผ ํฉ๋๋ค.
+`Node`๋ AI๊ฐ ์์
ํ๊ธฐ ๋ ์ฌ์ด ์๋ณธ ๋ฌธ์์ ํ
์คํธ ์ฒญํฌ์ผ ๋ฟ์ด๋ฉฐ, ์ฌ์ ํ ์๋ณธ `Document` ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
+
+`IngestionPipeline`์ ๋ ๊ฐ์ง ์ฃผ์ ๋ณํ์ ํตํด ์ด๋ฌํ ๋
ธ๋๋ฅผ ๋ง๋๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
+1. `SentenceSplitter`๋ ์์ฐ์ค๋ฌ์ด ๋ฌธ์ฅ ๊ฒฝ๊ณ์์ ๋ฌธ์๋ฅผ ๋ถํ ํ์ฌ ๊ด๋ฆฌ ๊ฐ๋ฅํ ์ฒญํฌ๋ก ๋๋๋๋ค.
+2. `HuggingFaceEmbedding`์ ๊ฐ ์ฒญํฌ๋ฅผ ์์น์ ์๋ฒ ๋ฉ์ผ๋ก ๋ณํํฉ๋๋ค - AI๊ฐ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ์์ผ๋ก ์๋ฏธ์ ์๋ฏธ๋ฅผ ํฌ์ฐฉํ๋ ๋ฒกํฐ ํํ์
๋๋ค.
+
+์ด ๊ณผ์ ์ ๊ฒ์๊ณผ ๋ถ์์ ๋ ์ ์ฉํ ๋ฐฉ์์ผ๋ก ๋ฌธ์๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
+
+```python
+from llama_index.core import Document
+from llama_index.embeddings.huggingface import HuggingFaceEmbedding
+from llama_index.core.node_parser import SentenceSplitter
+from llama_index.core.ingestion import IngestionPipeline
+
+# ๋ณํ๊ณผ ํจ๊ป ํ์ดํ๋ผ์ธ ์์ฑ
+pipeline = IngestionPipeline(
+ transformations=[
+ SentenceSplitter(chunk_overlap=0),
+ HuggingFaceEmbedding(model_name="BAAI/bge-small-en-v1.5"),
+ ]
+)
+
+nodes = await pipeline.arun(documents=[Document.example()])
+```
+
+### ๋ฌธ์ ์ ์ฅ ๋ฐ ์ธ๋ฑ์ฑ
+
+`Node` ๊ฐ์ฒด๋ฅผ ๋ง๋ ํ, ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ธฐ ์ํด ์ธ๋ฑ์ฑํด์ผ ํ์ง๋ง, ๊ทธ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๊ณณ์ด ํ์ํฉ๋๋ค.
+
+์์ง ํ์ดํ๋ผ์ธ์ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก, ํ์ดํ๋ผ์ธ์ ๋ฒกํฐ ์คํ ์ด๋ฅผ ์ง์ ์ฐ๊ฒฐํ์ฌ ์ฑ์ธ ์ ์์ต๋๋ค.
+์ด ๊ฒฝ์ฐ, ๋ฌธ์๋ฅผ ์ ์ฅํ๊ธฐ ์ํด `Chroma`๋ฅผ ์ฌ์ฉํ ๊ฒ์
๋๋ค.
+
+
+ChromaDB ์ค์น
+
+LlamaHub ์น์
์์ ์๊ฐ๋ ๋๋ก, ๋ค์ ๋ช
๋ น์ด๋ก ChromaDB ๋ฒกํฐ ์คํ ์ด๋ฅผ ์ค์นํ ์ ์์ต๋๋ค:
+
+```bash
+pip install llama-index-vector-stores-chroma
+```
+
+
+```python
+import chromadb
+from llama_index.vector_stores.chroma import ChromaVectorStore
+
+db = chromadb.PersistentClient(path="./alfred_chroma_db")
+chroma_collection = db.get_or_create_collection("alfred")
+vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
+
+pipeline = IngestionPipeline(
+ transformations=[
+ SentenceSplitter(chunk_size=25, chunk_overlap=0),
+ HuggingFaceEmbedding(model_name="BAAI/bge-small-en-v1.5"),
+ ],
+ vector_store=vector_store,
+)
+```
+
+๋ค์ํ ๋ฒกํฐ ์คํ ์ด์ ๋ํ ๊ฐ์๋ LlamaIndex ๋ฌธ์์์ ์ฐพ์ ์ ์์ต๋๋ค.
+
+์ด๊ฒ์ด ๋ฒกํฐ ์๋ฒ ๋ฉ์ด ๋ค์ด์ค๋ ๊ณณ์
๋๋ค - ์ฟผ๋ฆฌ์ ๋
ธ๋๋ฅผ ๊ฐ์ ๋ฒกํฐ ๊ณต๊ฐ์ ์๋ฒ ๋ฉํจ์ผ๋ก์จ ๊ด๋ จ ๋งค์น๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
+`VectorStoreIndex`๋ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์์ง ์ค์ ์ฌ์ฉํ ๊ฒ๊ณผ ๊ฐ์ ์๋ฒ ๋ฉ ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
+
+๋ฒกํฐ ์คํ ์ด์ ์๋ฒ ๋ฉ์์ ์ด ์ธ๋ฑ์ค๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
+
+```python
+from llama_index.core import VectorStoreIndex
+from llama_index.embeddings.huggingface import HuggingFaceEmbedding
+
+embed_model = HuggingFaceEmbedding(model_name="BAAI/bge-small-en-v1.5")
+index = VectorStoreIndex.from_vector_store(vector_store, embed_model=embed_model)
+```
+
+๋ชจ๋ ์ ๋ณด๋ `ChromaVectorStore` ๊ฐ์ฒด์ ์ ๋ฌ๋ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก ๋ด์์ ์๋์ผ๋ก ์ง์๋ฉ๋๋ค.
+
+ํ๋ฅญํฉ๋๋ค! ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ฝ๊ฒ ์ ์ฅํ๊ณ ๋ก๋ํ ์ ์์ผ๋, ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ฟผ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ํ๊ตฌํด๋ณด๊ฒ ์ต๋๋ค.
+
+### ํ๋กฌํํธ์ LLM์ผ๋ก VectorStoreIndex ์ฟผ๋ฆฌํ๊ธฐ
+
+์ธ๋ฑ์ค๋ฅผ ์ฟผ๋ฆฌํ๊ธฐ ์ ์, ์ฟผ๋ฆฌ ์ธํฐํ์ด์ค๋ก ๋ณํํด์ผ ํฉ๋๋ค. ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ณํ ์ต์
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
+
+- `as_retriever`: ๊ธฐ๋ณธ ๋ฌธ์ ๊ฒ์์ฉ์ผ๋ก, ์ ์ฌ๋ ์ ์๊ฐ ์๋ `NodeWithScore` ๊ฐ์ฒด ๋ฆฌ์คํธ๋ฅผ ๋ฐํํฉ๋๋ค
+- `as_query_engine`: ๋จ์ผ ์ง๋ฌธ-๋ต๋ณ ์ํธ์์ฉ์ฉ์ผ๋ก, ์์ฑ๋ ์๋ต์ ๋ฐํํฉ๋๋ค
+- `as_chat_engine`: ์ฌ๋ฌ ๋ฉ์์ง์ ๊ฑธ์ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์งํ๋ ๋ํํ ์ํธ์์ฉ์ฉ์ผ๋ก, ์ฑํ
๊ธฐ๋ก๊ณผ ์ธ๋ฑ์ฑ๋ ๋งฅ๋ฝ์ ์ฌ์ฉํ์ฌ ์์ฑ๋ ์๋ต์ ๋ฐํํฉ๋๋ค
+
+์์ด์ ํธ์ ๊ฐ์ ์ํธ์์ฉ์ ๋ ์ผ๋ฐ์ ์ด๋ฏ๋ก ์ฟผ๋ฆฌ ์์ง์ ์ง์คํ๊ฒ ์ต๋๋ค.
+์๋ต์ ์ฌ์ฉํ LLM๋ ์ฟผ๋ฆฌ ์์ง์ ์ ๋ฌํฉ๋๋ค.
+
+```python
+from llama_index.llms.huggingface_api import HuggingFaceInferenceAPI
+
+llm = HuggingFaceInferenceAPI(model_name="Qwen/Qwen2.5-Coder-32B-Instruct")
+query_engine = index.as_query_engine(
+ llm=llm,
+ response_mode="tree_summarize",
+)
+query_engine.query("์ธ์์ ์๋ฏธ๋ ๋ฌด์์ธ๊ฐ์?")
+# ์ธ์์ ์๋ฏธ๋ 42์
๋๋ค
+```
+
+### ์๋ต ์ฒ๋ฆฌ
+
+๋ด๋ถ์ ์ผ๋ก, ์ฟผ๋ฆฌ ์์ง์ ์ง๋ฌธ์ ๋ตํ๊ธฐ ์ํด LLM๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ ์๋ต์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ ๋ต์ผ๋ก `ResponseSynthesizer`๋ ์ฌ์ฉํฉ๋๋ค.
+๋ค์ ํ๋ฒ, ์ด๊ฒ์ ์์ ํ ์ฌ์ฉ์ ์ ์ ๊ฐ๋ฅํ์ง๋ง ์ฆ์ ์ ์๋ํ๋ ์ธ ๊ฐ์ง ์ฃผ์ ์ ๋ต์ด ์์ต๋๋ค:
+
+- `refine`: ๊ฒ์๋ ๊ฐ ํ
์คํธ ์ฒญํฌ๋ฅผ ์์ฐจ์ ์ผ๋ก ๊ฑฐ์ณ ๋ต๋ณ์ ์์ฑํ๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด๋ Node/๊ฒ์๋ ์ฒญํฌ๋น ๋ณ๋์ LLM ํธ์ถ์ ๋ง๋ญ๋๋ค.
+- `compact` (๊ธฐ๋ณธ๊ฐ): ๊ฐ์ ๊ณผ ์ ์ฌํ์ง๋ง ๋ฏธ๋ฆฌ ์ฒญํฌ๋ฅผ ์ฐ๊ฒฐํ์ฌ ๋ ์ ์ LLM ํธ์ถ์ ๋ง๋ญ๋๋ค.
+- `tree_summarize`: ๊ฒ์๋ ๊ฐ ํ
์คํธ ์ฒญํฌ๋ฅผ ๊ฑฐ์ณ ๋ต๋ณ์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด ์์ธํ ๋ต๋ณ์ ์์ฑํฉ๋๋ค.
+
+์ ์์ค ๊ตฌ์ฑ API๋ก ์ฟผ๋ฆฌ ์ํฌํ๋ก์ฐ๋ฅผ ์ธ๋ฐํ๊ฒ ์ ์ดํ์ธ์. ์ด API๋ ์ฟผ๋ฆฌ ํ๋ก์ธ์ค์ ๋ชจ๋ ๋จ๊ณ๋ฅผ ์ฌ์ฉ์ ์ ์ํ๊ณ ๋ฏธ์ธ ์กฐ์ ํ์ฌ ์ ํํ ์๊ตฌ์ฌํญ์ ๋ง์ถ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, ์ํฌํ๋ก์ฐ์๋ ์ ๋ง์ต๋๋ค.
+
+์ธ์ด ๋ชจ๋ธ์ด ํญ์ ์์ธก ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ์ํ๋์ง ์์ ์ ์์ผ๋ฏ๋ก, ์ฐ๋ฆฌ๊ฐ ์ป๋ ๋ต๋ณ์ด ํญ์ ์ ํํ๋ค๊ณ ํ์ ํ ์ ์์ต๋๋ค. **๋ต๋ณ์ ํ์ง์ ํ๊ฐ**ํจ์ผ๋ก์จ ์ด๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
+
+### ํ๊ฐ ๋ฐ ๊ด์ฐฐ ๊ฐ๋ฅ์ฑ
+
+LlamaIndex๋ **์๋ต ํ์ง์ ํ๊ฐํ๊ธฐ ์ํ ๋ด์ฅ ํ๊ฐ ๋๊ตฌ**๋ฅผ ์ ๊ณตํฉ๋๋ค.
+์ด๋ฌํ ํ๊ฐ์๋ LLM์ ํ์ฉํ์ฌ ๋ค์ํ ์ฐจ์์์ ์๋ต์ ๋ถ์ํฉ๋๋ค.
+์ฌ์ฉ ๊ฐ๋ฅํ ์ธ ๊ฐ์ง ์ฃผ์ ํ๊ฐ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
+
+- `FaithfulnessEvaluator`: ๋ต๋ณ์ด ๋งฅ๋ฝ์ ์ํด ์ง์๋๋์ง ํ์ธํ์ฌ ๋ต๋ณ์ ์ ๋ขฐ์ฑ์ ํ๊ฐํฉ๋๋ค.
+- `AnswerRelevancyEvaluator`: ๋ต๋ณ์ด ์ง๋ฌธ๊ณผ ๊ด๋ จ์ด ์๋์ง ํ์ธํ์ฌ ๋ต๋ณ์ ๊ด๋ จ์ฑ์ ํ๊ฐํฉ๋๋ค.
+- `CorrectnessEvaluator`: ๋ต๋ณ์ด ์ ํํ์ง ํ์ธํ์ฌ ๋ต๋ณ์ ์ ํ์ฑ์ ํ๊ฐํฉ๋๋ค.
+
+์์ด์ ํธ ๊ด์ฐฐ ๊ฐ๋ฅ์ฑ๊ณผ ํ๊ฐ์ ๋ํด ๋ ๋ฐฐ์ฐ๊ณ ์ถ๋์? ๋ณด๋์ค ๋จ์ 2๋ก ์ฌ์ ์ ๊ณ์ํ์ธ์.
+
+```python
+from llama_index.core.evaluation import FaithfulnessEvaluator
+
+query_engine = # ์ด์ ์น์
์์
+llm = # ์ด์ ์น์
์์
+
+# ์ธ๋ฑ์ค ์ฟผ๋ฆฌ
+evaluator = FaithfulnessEvaluator(llm=llm)
+response = query_engine.query(
+ "๋ฏธ๊ตญ ํ๋ช
์์ ๋ด์์์์ ์ด๋ค ์ ํฌ๊ฐ ์ผ์ด๋ฌ๋์?"
+)
+eval_result = evaluator.evaluate_response(response=response)
+eval_result.passing
+```
+
+์ง์ ์ ์ธ ํ๊ฐ ์์ด๋ **๊ด์ฐฐ ๊ฐ๋ฅ์ฑ์ ํตํด ์์คํ
์ด ์ด๋ป๊ฒ ์ํ๋๊ณ ์๋์ง์ ๋ํ ํต์ฐฐ์ ์ป์ ์ ์์ต๋๋ค.**
+์ด๋ ๋ ๋ณต์กํ ์ํฌํ๋ก์ฐ๋ฅผ ๊ตฌ์ถํ๊ณ ๊ฐ ๊ตฌ์ฑ ์์๊ฐ ์ด๋ป๊ฒ ์ํ๋๊ณ ์๋์ง ์ดํดํ๊ณ ์ถ์ ๋ ํนํ ์ ์ฉํฉ๋๋ค.
+
+
+LlamaTrace ์ค์น
+
+LlamaHub ์น์
์์ ์๊ฐ๋ ๋๋ก, ๋ค์ ๋ช
๋ น์ด๋ก Arize Phoenix์ LlamaTrace ์ฝ๋ฐฑ์ ์ค์นํ ์ ์์ต๋๋ค:
+
+```bash
+pip install -U llama-index-callbacks-arize-phoenix
+```
+
+๋ํ LlamaTrace API ํค๋ฅผ `PHOENIX_API_KEY` ํ๊ฒฝ ๋ณ์๋ก ์ค์ ํด์ผ ํฉ๋๋ค. ๋ค์์ ํตํด ์ป์ ์ ์์ต๋๋ค:
+- [LlamaTrace](https://llamatrace.com/login)์์ ๊ณ์ ์์ฑ
+- ๊ณ์ ์ค์ ์์ API ํค ์์ฑ
+- ์๋ ์ฝ๋์์ ์ถ์ ์ ํ์ฑํํ๊ธฐ ์ํด API ํค ์ฌ์ฉ
+
+
+
+```python
+import llama_index
+import os
+
+PHOENIX_API_KEY = ""
+os.environ["OTEL_EXPORTER_OTLP_HEADERS"] = f"api_key={PHOENIX_API_KEY}"
+llama_index.core.set_global_handler(
+ "arize_phoenix",
+ endpoint="https://llamatrace.com/v1/traces"
+)
+```
+
+๊ตฌ์ฑ ์์์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ํด ๋ ๋ฐฐ์ฐ๊ณ ์ถ๋์? ๊ตฌ์ฑ ์์ ๊ฐ์ด๋ ๋๋ RAG ๊ฐ์ด๋๋ก ์ฌ์ ์ ๊ณ์ํ์ธ์.
+
+๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ์ฌ `QueryEngine`์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ณด์์ต๋๋ค. ์ด์ **`QueryEngine`์ ์์ด์ ํธ์ ํด๋ก ์ฌ์ฉํ๋** ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค!
diff --git a/units/ko/unit2/llama-index/conclusion.mdx b/units/ko/unit2/llama-index/conclusion.mdx
new file mode 100644
index 00000000..c0e7f825
--- /dev/null
+++ b/units/ko/unit2/llama-index/conclusion.mdx
@@ -0,0 +1,13 @@
+# ๊ฒฐ๋ก
+
+2๋จ์์ `llama-index` ๋ชจ๋์ ์๋ฃํ์ ๊ฒ์ ์ถํํฉ๋๋ค! ๐ฅณ
+
+๋ฐฉ๊ธ `llama-index`์ ๊ธฐ๋ณธ์ ๋ง์คํฐํ๊ณ ์์ ๋ง์ ์์ด์ ํธ ์ํฌํ๋ก์ฐ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ณด์
จ์ต๋๋ค!
+์ด์ `llama-index` ๊ธฐ์ ์ ๊ฐ์ถ์
จ์ผ๋, ๊ด์ฌ ์๋ ์์
์ ํด๊ฒฐํ ๊ฒ์ ์์ง์ ๋ง๋ค๊ธฐ ์์ํ ์ ์์ต๋๋ค.
+
+์ด ๋จ์์ ๋ค์ ๋ชจ๋์์๋ **LangGraph๋ก ์์ด์ ํธ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ**์ ๋ฐฐ์ฐ๊ฒ ๋ฉ๋๋ค.
+
+๋ง์ง๋ง์ผ๋ก, **๊ฐ์์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ**์ ๋ฃ๊ณ ์ถ์ต๋๋ค.
+ํผ๋๋ฐฑ์ด ์์ผ์๋ฉด ๐ [์ด ์์์ ์์ฑํด์ฃผ์ธ์](https://docs.google.com/forms/d/e/1FAIpQLSe9VaONn0eglax0uTwi29rIn4tM7H2sYmmybmG5jJNlE5v0xA/viewform?usp=dialog)
+
+### ๊ณ์ ๋ฐฐ์ฐ๊ณ , ๋ฉ์ง๊ฒ ์ ์งํ์ธ์! ๐ค
diff --git a/units/ko/unit2/llama-index/introduction.mdx b/units/ko/unit2/llama-index/introduction.mdx
new file mode 100644
index 00000000..c0d923e2
--- /dev/null
+++ b/units/ko/unit2/llama-index/introduction.mdx
@@ -0,0 +1,29 @@
+# LlamaIndex ์๊ฐ
+
+[LlamaIndex](https://www.llamaindex.ai/) ํดํท์ ์ฌ์ฉํ์ฌ LLM ๊ธฐ๋ฐ ์์ด์ ํธ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๋ ์ด ๋ชจ๋์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค.
+
+LlamaIndex๋ **์ธ๋ฑ์ค์ ์ํฌํ๋ก์ฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์์์ LLM ๊ธฐ๋ฐ ์์ด์ ํธ๋ฅผ ๋ง๋๋ ์์ ํ ํดํท**์
๋๋ค. ์ด ๊ฐ์์์๋ LlamaIndex์์ ์์ด์ ํธ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ๋์์ด ๋๋ ์ธ ๊ฐ์ง ์ฃผ์ ๋ถ๋ถ์ ์ง์คํ ๊ฒ์
๋๋ค: **๊ตฌ์ฑ ์์**, **์์ด์ ํธ์ ํด**, ๊ทธ๋ฆฌ๊ณ **์ํฌํ๋ก์ฐ**์
๋๋ค.
+
+
+
+LlamaIndex์ ์ด๋ฌํ ํต์ฌ ๋ถ๋ถ๋ค๊ณผ ์์ด์ ํธ์ ์ด๋ป๊ฒ ๋์์ด ๋๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค:
+
+- **๊ตฌ์ฑ ์์**: LlamaIndex์์ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ๋น๋ฉ ๋ธ๋ก์
๋๋ค. ํ๋กฌํํธ, ๋ชจ๋ธ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ์ด ํฌํจ๋ฉ๋๋ค. ๊ตฌ์ฑ ์์๋ ์ข
์ข
LlamaIndex๋ฅผ ๋ค๋ฅธ ํด๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฐ๊ฒฐํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
+- **ํด**: ๊ฒ์, ๊ณ์ฐ, ์ธ๋ถ ์๋น์ค ์ ๊ทผ๊ณผ ๊ฐ์ ํน์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ตฌ์ฑ ์์์
๋๋ค. ์์ด์ ํธ๊ฐ ์์
์ ์ํํ ์ ์๊ฒ ํ๋ ๋น๋ฉ ๋ธ๋ก์
๋๋ค.
+- **์์ด์ ํธ**: ํด์ ์ฌ์ฉํ๊ณ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์๋ ์์จ ๊ตฌ์ฑ ์์์
๋๋ค. ๋ณต์กํ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ํด ์ฌ์ฉ์ ์กฐ์ ํฉ๋๋ค.
+- **์ํฌํ๋ก์ฐ**: ๋ก์ง์ ํจ๊ป ์ฒ๋ฆฌํ๋ ๋จ๊ณ๋ณ ํ๋ก์ธ์ค์
๋๋ค. ์ํฌํ๋ก์ฐ ๋๋ ์์ด์ ํธ ์ํฌํ๋ก์ฐ๋ ๋ช
์์ ์ธ ์์ด์ ํธ ์ฌ์ฉ ์์ด ์์ด์ ํธ ํ๋์ ๊ตฌ์กฐํํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
+
+## LlamaIndex๋ฅผ ํน๋ณํ๊ฒ ๋ง๋๋ ๊ฒ์ ๋ฌด์์ธ๊ฐ์?
+
+LlamaIndex๊ฐ smolagents์ ๊ฐ์ ๋ค๋ฅธ ํ๋ ์์ํฌ์ ์ ์ฌํ ์ผ๋ถ ์์
์ ์ํํ์ง๋ง, ๋ช ๊ฐ์ง ์ฃผ์ ์ด์ ์ด ์์ต๋๋ค:
+
+- **๋ช
ํํ ์ํฌํ๋ก์ฐ ์์คํ
**: ์ํฌํ๋ก์ฐ๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ฐ ๋น๋๊ธฐ ์ฐ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์์ด์ ํธ๊ฐ ๋จ๊ณ๋ณ๋ก ์ด๋ป๊ฒ ๊ฒฐ์ ์ ๋ด๋ ค์ผ ํ๋์ง ๋ถํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ด๋ ๋ก์ง์ ๋ช
ํํ๊ฒ ๊ตฌ์ฑํ๊ณ ๊ตฌ์ฑํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
+- **LlamaParse๋ฅผ ํตํ ๊ณ ๊ธ ๋ฌธ์ ํ์ฑ**: LlamaParse๋ LlamaIndex๋ฅผ ์ํด ํน๋ณํ ๋ง๋ค์ด์ก์ผ๋ฏ๋ก ํตํฉ์ด ์ํํ์ง๋ง, ์ ๋ฃ ๊ธฐ๋ฅ์
๋๋ค.
+- **๋ง์ ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์ฑ ์์**: LlamaIndex๋ ์ค๋ซ๋์ ์กด์ฌํด์์ผ๋ฏ๋ก ๋ง์ ๋ค๋ฅธ ํ๋ ์์ํฌ์ ํจ๊ป ์๋ํฉ๋๋ค. ์ด๋ LLM, ๊ฒ์๊ธฐ, ์ธ๋ฑ์ค ๋ฑ๊ณผ ๊ฐ์ ๋ง์ ํ
์คํธ๋๊ณ ์ ๋ขฐํ ์ ์๋ ๊ตฌ์ฑ ์์๊ฐ ์์์ ์๋ฏธํฉ๋๋ค.
+- **LlamaHub**: LlamaIndex ๋ด์์ ์ฌ์ฉํ ์ ์๋ ์ด๋ฌํ ๊ตฌ์ฑ ์์, ์์ด์ ํธ, ํด์ ์๋ฐฑ ๊ฐ ๋ ์ง์คํธ๋ฆฌ์
๋๋ค.
+
+์ด๋ฌํ ๋ชจ๋ ๊ฐ๋
์ ์ ์ฉํ ์์ด์ ํธ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ค์ํ ์๋๋ฆฌ์ค์์ ํ์ํฉ๋๋ค.
+๋ค์ ์น์
์์๋ ์ด๋ฌํ ๊ฐ๋
๋ค์ ๊ฐ๊ฐ ์์ธํ ์ดํด๋ณผ ๊ฒ์
๋๋ค.
+๊ฐ๋
์ ๋ง์คํฐํ ํ, ์ฐ๋ฆฌ์ ํ์ต์ ์ฌ์ฉํ์ฌ **์์ด์ ํธ ์ํ๋ ๋์ ํจ๊ป ์ ์ฉ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ง๋ค** ๊ฒ์
๋๋ค!
+
+LlamaIndex๋ฅผ ์ง์ ๋ค๋ฃจ๋ ๊ฒ์ด ํฅ๋ฏธ๋กญ์ง ์๋์? ๊ทธ๋ผ ๋ฌด์์ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋์? **LlamaHub๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ํตํฉ์ ์ฐพ๊ณ ์ค์นํ๋** ๊ฒ์ผ๋ก ์์ํด๋ด
์๋ค! ๐
\ No newline at end of file
diff --git a/units/ko/unit2/llama-index/llama-hub.mdx b/units/ko/unit2/llama-index/llama-hub.mdx
new file mode 100644
index 00000000..6da1486b
--- /dev/null
+++ b/units/ko/unit2/llama-index/llama-hub.mdx
@@ -0,0 +1,55 @@
+# LlamaHub ์๊ฐ
+
+**LlamaHub๋ LlamaIndex ๋ด์์ ์ฌ์ฉํ ์ ์๋ ์๋ฐฑ ๊ฐ์ ํตํฉ, ์์ด์ ํธ, ํด์ ๋ ์ง์คํธ๋ฆฌ์
๋๋ค.**
+
+
+
+์ด ๊ฐ์์์ ๋ค์ํ ํตํฉ์ ์ฌ์ฉํ ๊ฒ์ด๋ฏ๋ก, ๋จผ์ LlamaHub์ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์ฐ๋ฆฌ๋ฅผ ๋์ธ ์ ์๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
+
+ํ์ํ ๊ตฌ์ฑ ์์์ ์์กด์ฑ์ ์ฐพ๊ณ ์ค์นํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
+
+## ์ค์น
+
+LlamaIndex ์ค์น ์ง์นจ์ [LlamaHub](https://llamahub.ai/)์์ ์ ๊ตฌ์กฐํ๋ **๊ฐ์๋ก ์ ๊ณต**๋ฉ๋๋ค.
+์ฒ์์๋ ์กฐ๊ธ ์๋์ ์ผ ์ ์์ง๋ง, ๋๋ถ๋ถ์ **์ค์น ๋ช
๋ น์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๊ธฐ์ตํ๊ธฐ ์ฌ์ด ํ์**์ ๋ฐ๋ฆ
๋๋ค:
+
+```bash
+pip install llama-index-{component-type}-{framework-name}
+```
+
+[Hugging Face ์ถ๋ก API ํตํฉ](https://llamahub.ai/l/llms/llama-index-llms-huggingface-api?from=llms)์ ์ฌ์ฉํ์ฌ LLM๊ณผ ์๋ฒ ๋ฉ ๊ตฌ์ฑ ์์์ ์์กด์ฑ์ ์ค์นํด๋ณด๊ฒ ์ต๋๋ค.
+
+```bash
+pip install llama-index-llms-huggingface-api llama-index-embeddings-huggingface
+```
+
+## ์ฌ์ฉ๋ฒ
+
+์ค์น๋๋ฉด ์ฌ์ฉ ํจํด์ ๋ณผ ์ ์์ต๋๋ค. ๊ฐ์ ธ์ค๊ธฐ ๊ฒฝ๋ก๊ฐ ์ค์น ๋ช
๋ น์ด๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ ์ ์ ์์ ๊ฒ์
๋๋ค!
+์๋์์ **LLM ๊ตฌ์ฑ ์์๋ฅผ ์ํ Hugging Face ์ถ๋ก API ์ฌ์ฉ**์ ์๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
+
+```python
+from llama_index.llms.huggingface_api import HuggingFaceInferenceAPI
+import os
+from dotenv import load_dotenv
+
+# .env ํ์ผ ๋ก๋
+load_dotenv()
+
+# ํ๊ฒฝ ๋ณ์์์ HF_TOKEN ๊ฒ์
+hf_token = os.getenv("HF_TOKEN")
+
+llm = HuggingFaceInferenceAPI(
+ model_name="Qwen/Qwen2.5-Coder-32B-Instruct",
+ temperature=0.7,
+ max_tokens=100,
+ token=hf_token,
+)
+
+response = llm.complete("์๋
ํ์ธ์, ์ด๋ป๊ฒ ์ง๋ด์๋์?")
+print(response)
+# ์ ์ง๋ด๊ณ ์์ต๋๋ค, ์ค๋ ์ด๋ป๊ฒ ๋์๋๋ฆด๊น์?
+```
+
+ํ๋ฅญํฉ๋๋ค, ์ด์ ํ์ํ ๊ตฌ์ฑ ์์์ ํตํฉ์ ์ฐพ๊ณ , ์ค์นํ๊ณ , ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๊ฒ ๋์์ต๋๋ค.
+**๊ตฌ์ฑ ์์์ ๋ํด ๋ ๊น์ด ๋ค์ด๊ฐ์** ์ฐ๋ฆฌ๋ง์ ์์ด์ ํธ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ ์๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
diff --git a/units/ko/unit2/llama-index/quiz1.mdx b/units/ko/unit2/llama-index/quiz1.mdx
new file mode 100644
index 00000000..7e542df7
--- /dev/null
+++ b/units/ko/unit2/llama-index/quiz1.mdx
@@ -0,0 +1,117 @@
+# ๋ฏธ๋ ํด์ฆ (์ฑ์ ๋์ง ์์) [[quiz1]]
+
+์ง๊ธ๊น์ง LlamaIndex์์ ์ฌ์ฉ๋๋ ์ฃผ์ ๊ตฌ์ฑ ์์์ ํด์ ๋ํด ๋
ผ์ํ์ต๋๋ค.
+**์์ ์ ํ
์คํธํ๋ ๊ฒ**์ด ํ์ตํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด๊ณ [๋ฅ๋ ฅ์ ์ฐฉ๊ฐ์ ํผํ๋](https://www.coursera.org/lecture/learning-how-to-learn/illusions-of-competence-BuFzf) ๋ฐฉ๋ฒ์ด๋ฏ๋ก ์งง์ ํด์ฆ๋ฅผ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
+์ด๊ฒ์ **์ง์์ ๊ฐํํด์ผ ํ ๋ถ๋ถ์ ์ฐพ๋** ๋ฐ ๋์์ด ๋ ๊ฒ์
๋๋ค.
+
+์ด๊ฒ์ ์ ํ์ฌํญ ํด์ฆ์ด๋ฉฐ ์ฑ์ ๋์ง ์์ต๋๋ค.
+
+### Q1: QueryEngine์ด๋ ๋ฌด์์ธ๊ฐ์?
+๋ค์ ์ค QueryEngine ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ์ฅ ์ ์ค๋ช
ํ๋ ๊ฒ์ ๋ฌด์์ธ๊ฐ์?
+
+
+
+---
+
+### Q2: FunctionTools์ ๋ชฉ์ ์ ๋ฌด์์ธ๊ฐ์?
+์์ด์ ํธ์๊ฒ FunctionTools๊ฐ ์ค์ํ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
+
+
+
+---
+
+### Q3: LlamaIndex์ Toolspecs๋ ๋ฌด์์ธ๊ฐ์?
+Toolspecs์ ์ฃผ์ ๋ชฉ์ ์ ๋ฌด์์ธ๊ฐ์?
+
+
+
+---
+
+### Q4: ํด์ ๋ง๋ค๊ธฐ ์ํด ํ์ํ ๊ฒ์ ๋ฌด์์ธ๊ฐ์?
+ํด์ ๋ง๋ค ๋ ํฌํจํด์ผ ํ๋ ์ ๋ณด๋ ๋ฌด์์ธ๊ฐ์?
+
+
+
+---
+
+์ด ํด์ฆ๋ฅผ ์๋ฃํ์ ๊ฒ์ ์ถํํฉ๋๋ค! ๐ฅณ ์ผ๋ถ ์์๋ฅผ ๋์ณค๋ค๋ฉด, ์ง์์ ๊ฐํํ๊ธฐ ์ํด ์ฑํฐ๋ฅผ ๋ค์ ์ฝ์ด๋ณด์ธ์. ํต๊ณผํ์
จ๋ค๋ฉด, ์ด๋ฌํ ๊ตฌ์ฑ ์์๋ก ๋ ๊น์ด ๊ตฌ์ถํ ์ค๋น๊ฐ ๋์์ต๋๋ค!
diff --git a/units/ko/unit2/llama-index/quiz2.mdx b/units/ko/unit2/llama-index/quiz2.mdx
new file mode 100644
index 00000000..373ae1eb
--- /dev/null
+++ b/units/ko/unit2/llama-index/quiz2.mdx
@@ -0,0 +1,112 @@
+# ์
ํ ์ฒดํฌ (์ฑ์ ๋์ง ์์) [[quiz2]]
+
+๋ญ?! ๋ ๋ค๋ฅธ ํด์ฆ? ์๊ฒ ์ต๋๋ค, ์๊ฒ ์ต๋๋ค... ๐
ํ์ง๋ง ์ด ์งง์, ์ฑ์ ๋์ง ์๋ ํด์ฆ๋ **๋ฐฉ๊ธ ๋ฐฐ์ด ํต์ฌ ๊ฐ๋
์ ๊ฐํํ๋ ๋ฐ ๋์์ด** ๋๊ธฐ ์ํด ์ฌ๊ธฐ ์์ต๋๋ค.
+
+์ด ํด์ฆ๋ ํจ๊ณผ์ ์ธ AI ์์ด์ ํธ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ํ์ ๊ตฌ์ฑ ์์์ธ ์์ด์ ํธ ์ํฌํ๋ก์ฐ์ ์ํธ์์ฉ์ ๋ค๋ฃน๋๋ค.
+
+### Q1: LlamaIndex์์ AgentWorkflow์ ๋ชฉ์ ์ ๋ฌด์์ธ๊ฐ์?
+
+
+
+---
+
+### Q2: ์ํฌํ๋ก์ฐ์ ์ํ๋ฅผ ์ถ์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ฐ์ฒด๋ ๋ฌด์์ธ๊ฐ์?
+
+
+
+---
+
+### Q3: ์์ด์ ํธ๊ฐ ์ด์ ์ํธ์์ฉ์ ๊ธฐ์ตํ๊ฒ ํ๋ ค๋ฉด ์ด๋ค ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋์?
+
+
+
+---
+
+### Q4: ์์ด์ ํธ RAG์ ์ฃผ์ ํน์ง์ ๋ฌด์์ธ๊ฐ์?
+
+
+
+---
+
+
+์ดํดํ์
จ๋์? ํ๋ฅญํฉ๋๋ค! ์ด์ **๋จ์์ ๋ํ ๊ฐ๋จํ ์์ฝ์ ํด๋ณด๊ฒ ์ต๋๋ค!**
diff --git a/units/ko/unit2/llama-index/tools.mdx b/units/ko/unit2/llama-index/tools.mdx
new file mode 100644
index 00000000..6b9efb8b
--- /dev/null
+++ b/units/ko/unit2/llama-index/tools.mdx
@@ -0,0 +1,141 @@
+# LlamaIndex์์ ํด ์ฌ์ฉํ๊ธฐ
+
+**๋ช
ํํ ํด ์ธํธ๋ฅผ ์ ์ํ๋ ๊ฒ์ด ์ฑ๋ฅ์ ์ค์ํฉ๋๋ค.** [1๋จ์](../../unit1/tools)์์ ๋
ผ์ํ๋ฏ์ด, ๋ช
ํํ ํด ์ธํฐํ์ด์ค๋ LLM์ด ์ฌ์ฉํ๊ธฐ ์ฝ์ต๋๋ค.
+์ธ๊ฐ ์์ง๋์ด๋ฅผ ์ํ ์ํํธ์จ์ด API ์ธํฐํ์ด์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก, ํด์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ๊ธฐ ์ฝ๋ค๋ฉด ๋ ๋ง์ ๊ฒ์ ์ป์ ์ ์์ต๋๋ค.
+
+**LlamaIndex์๋ ๋ค ๊ฐ์ง ์ฃผ์ ์ ํ์ ํด**์ด ์์ต๋๋ค:
+
+
+
+1. `FunctionTool`: ๋ชจ๋ Python ํจ์๋ฅผ ์์ด์ ํธ๊ฐ ์ฌ์ฉํ ์ ์๋ ํด๋ก ๋ณํํฉ๋๋ค. ํจ์๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์๋์ผ๋ก ํ์
ํฉ๋๋ค.
+2. `QueryEngineTool`: ์์ด์ ํธ๊ฐ ์ฟผ๋ฆฌ ์์ง์ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ํด์
๋๋ค. ์์ด์ ํธ๋ ์ฟผ๋ฆฌ ์์ง ์์ ๊ตฌ์ถ๋๋ฏ๋ก ๋ค๋ฅธ ์์ด์ ํธ๋ ํด๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
+3. `Toolspecs`: ์ปค๋ฎค๋ํฐ์์ ๋ง๋ ํด ์ธํธ๋ก, ์ข
์ข
Gmail๊ณผ ๊ฐ์ ํน์ ์๋น์ค๋ฅผ ์ํ ํด์ ํฌํจํฉ๋๋ค.
+4. `Utility Tools`: ๋ค๋ฅธ ํด์์ ๋์ค๋ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ๋์์ด ๋๋ ํน๋ณํ ํด์
๋๋ค.
+
+์๋์์ ๊ฐ๊ฐ์ ๋ํด ๋ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
+
+## FunctionTool ๋ง๋ค๊ธฐ
+
+
+์ด ๋
ธํธ๋ถ์ ๋ฐ๋ผ๊ฐ๋ฉฐ Google Colab์์ ์ฝ๋๋ฅผ ์คํํด๋ณผ ์ ์์ต๋๋ค.
+
+
+FunctionTool์ ๋ชจ๋ Python ํจ์๋ฅผ ๋ํํ๊ณ ์์ด์ ํธ๊ฐ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
+๋๊ธฐ ๋๋ ๋น๋๊ธฐ ํจ์๋ฅผ ํด์ ์ ๋ฌํ ์ ์์ผ๋ฉฐ, ์ ํ์ ์ผ๋ก `name`๊ณผ `description` ๋งค๊ฐ๋ณ์๋ ํจ๊ป ์ ๋ฌํ ์ ์์ต๋๋ค.
+์ด๋ฆ๊ณผ ์ค๋ช
์ ํนํ ์ค์ํฉ๋๋ค. ์์ด์ ํธ๊ฐ ์ธ์ , ์ด๋ป๊ฒ ํด์ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ง ์ดํดํ๋ ๋ฐ ๋์์ด ๋๊ธฐ ๋๋ฌธ์
๋๋ค.
+์๋์์ FunctionTool์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ณ ํธ์ถํด๋ณด๊ฒ ์ต๋๋ค.
+
+```python
+from llama_index.core.tools import FunctionTool
+
+def get_weather(location: str) -> str:
+ """์ฃผ์ด์ง ์์น์ ๋ ์จ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์ ์ฉํฉ๋๋ค."""
+ print(f"{location}์ ๋ ์จ๋ฅผ ๊ฐ์ ธ์ค๋ ์ค")
+ return f"{location}์ ๋ ์จ๋ ๋ง์ต๋๋ค"
+
+tool = FunctionTool.from_defaults(
+ get_weather,
+ name="my_weather_tool",
+ description="์ฃผ์ด์ง ์์น์ ๋ ์จ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์ ์ฉํฉ๋๋ค.",
+)
+tool.call("๋ด์")
+```
+
+ํจ์ ํธ์ถ์ด ์๋ ์์ด์ ํธ๋ LLM์ ์ฌ์ฉํ ๋, ์ ํ๋ ํด(๊ทธ ํด์ ๋ํด ์์ฑ๋ ์ธ์)์ ํด์ ๋ชฉ์ ๊ณผ ์ธ์์ ๋ํ ํด ์ด๋ฆ๊ณผ ์ค๋ช
์ ํฌ๊ฒ ์์กดํฉ๋๋ค. ํจ์ ํธ์ถ ๊ฐ์ด๋์์ ํจ์ ํธ์ถ์ ๋ํด ๋ ์์๋ณด์ธ์.
+
+## QueryEngineTool ๋ง๋ค๊ธฐ
+
+์ด์ ๋จ์์์ ์ ์ํ `QueryEngine`์ `QueryEngineTool` ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ํด๋ก ๋ณํํ ์ ์์ต๋๋ค.
+์๋ ์์ ์์ `QueryEngine`์์ `QueryEngineTool`์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
+
+```python
+from llama_index.core import VectorStoreIndex
+from llama_index.core.tools import QueryEngineTool
+from llama_index.llms.huggingface_api import HuggingFaceInferenceAPI
+from llama_index.embeddings.huggingface import HuggingFaceEmbedding
+from llama_index.vector_stores.chroma import ChromaVectorStore
+
+embed_model = HuggingFaceEmbedding("BAAI/bge-small-en-v1.5")
+
+db = chromadb.PersistentClient(path="./alfred_chroma_db")
+chroma_collection = db.get_or_create_collection("alfred")
+vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
+
+index = VectorStoreIndex.from_vector_store(vector_store, embed_model=embed_model)
+
+llm = HuggingFaceInferenceAPI(model_name="Qwen/Qwen2.5-Coder-32B-Instruct")
+query_engine = index.as_query_engine(llm=llm)
+tool = QueryEngineTool.from_defaults(query_engine, name="some useful name", description="some useful description")
+```
+
+## Toolspecs ๋ง๋ค๊ธฐ
+
+`ToolSpecs`๋ฅผ ์กฐํ๋กญ๊ฒ ํจ๊ป ์๋ํ๋ ํด ๋ชจ์์ผ๋ก ์๊ฐํ์ธ์ - ์ ์ ๋ฆฌ๋ ์ ๋ฌธ๊ฐ ํดํท์ฒ๋ผ์.
+์ ๋น์ฌ์ ํดํท์ด ์ฐจ๋ ์๋ฆฌ๋ฅผ ์ํด ํจ๊ป ์๋ํ๋ ๋ณด์์ ์ธ ํด๋ค์ ํฌํจํ๋ ๊ฒ์ฒ๋ผ, `ToolSpec`์ ํน์ ๋ชฉ์ ์ ์ํด ๊ด๋ จ๋ ํด๋ค์ ๊ฒฐํฉํฉ๋๋ค.
+์๋ฅผ ๋ค์ด, ํ๊ณ ์์ด์ ํธ์ `ToolSpec`์ ์คํ๋ ๋์ํธ ๊ธฐ๋ฅ, ์ด๋ฉ์ผ ๊ธฐ๋ฅ, ๊ณ์ฐ ํด์ ์ฐ์ํ๊ฒ ํตํฉํ์ฌ ์ฌ๋ฌด ์์
์ ์ ํํ๊ณ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
+
+
+Google Toolspec ์ค์น
+LlamaHub ์น์
์์ ์๊ฐ๋ ๋๋ก, ๋ค์ ๋ช
๋ น์ด๋ก Google toolspec์ ์ค์นํ ์ ์์ต๋๋ค:
+
+```python
+pip install llama-index-tools-google
+```
+
+
+์ด์ toolspec์ ๋ก๋ํ๊ณ ํด ๋ฆฌ์คํธ๋ก ๋ณํํ ์ ์์ต๋๋ค.
+
+```python
+from llama_index.tools.google import GmailToolSpec
+
+tool_spec = GmailToolSpec()
+tool_spec_list = tool_spec.to_tool_list()
+```
+
+ํด์ ๋ํ ๋ ์์ธํ ๋ณด๊ธฐ๋ฅผ ์ป๊ธฐ ์ํด ๊ฐ ํด์ `metadata`๋ฅผ ์ดํด๋ณผ ์ ์์ต๋๋ค.
+
+```python
+[(tool.metadata.name, tool.metadata.description) for tool in tool_spec_list]
+```
+
+### LlamaIndex์ ๋ชจ๋ธ ์ปจํ
์คํธ ํ๋กํ ์ฝ (MCP)
+
+LlamaIndex๋ [LlamaHub์ ToolSpec](https://llamahub.ai/l/tools/llama-index-tools-mcp?from=)์ ํตํด MCP ํด ์ฌ์ฉ๋ ํ์ฉํฉ๋๋ค.
+๋จ์ํ MCP ์๋ฒ๋ฅผ ์คํํ๊ณ ๋ค์ ๊ตฌํ์ ํตํด ์ฌ์ฉ์ ์์ํ ์ ์์ต๋๋ค.
+
+MCP์ ๋ํด ๋ ๊น์ด ์๊ณ ์ถ๋ค๋ฉด [๋ฌด๋ฃ MCP ๊ฐ์](https://huggingface.co/learn/mcp-course/)๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
+
+
+MCP Toolspec ์ค์น
+LlamaHub ์น์
์์ ์๊ฐ๋ ๋๋ก, ๋ค์ ๋ช
๋ น์ด๋ก MCP toolspec์ ์ค์นํ ์ ์์ต๋๋ค:
+
+```python
+pip install llama-index-tools-mcp
+```
+
+
+```python
+from llama_index.tools.mcp import BasicMCPClient, McpToolSpec
+
+# 127.0.0.1:8000์์ ์คํ ์ค์ธ mcp ์๋ฒ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๊ฑฐ๋, mcp ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒด mcp ์๋ฒ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
+mcp_client = BasicMCPClient("http://127.0.0.1:8000/sse")
+mcp_tool = McpToolSpec(client=mcp_client)
+
+# ์์ด์ ํธ ๊ฐ์ ธ์ค๊ธฐ
+agent = await get_agent(mcp_tool)
+
+# ์์ด์ ํธ ์ปจํ
์คํธ ์์ฑ
+agent_context = Context(agent)
+```
+
+## ์ ํธ๋ฆฌํฐ ํด
+
+์ข
์ข
API๋ฅผ ์ง์ ์ฟผ๋ฆฌํ๋ ๊ฒ์ **๊ณผ๋ํ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ ์ ์์ผ๋ฉฐ**, ๊ทธ ์ค ์ผ๋ถ๋ ๊ด๋ จ์ด ์๊ฑฐ๋, LLM์ ์ปจํ
์คํธ ์๋์ฐ๋ฅผ ๋์น๊ฑฐ๋, ์ฌ์ฉํ๋ ํ ํฐ ์๋ฅผ ๋ถํ์ํ๊ฒ ์ฆ๊ฐ์ํฌ ์ ์์ต๋๋ค.
+์๋์์ ๋ ๊ฐ์ง ์ฃผ์ ์ ํธ๋ฆฌํฐ ํด์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
+
+1. `OnDemandToolLoader`: ์ด ํด์ ๊ธฐ์กด LlamaIndex ๋ฐ์ดํฐ ๋ก๋(BaseReader ํด๋์ค)๋ฅผ ์์ด์ ํธ๊ฐ ์ฌ์ฉํ ์ ์๋ ํด๋ก ๋ณํํฉ๋๋ค. ํด์ ๋ฐ์ดํฐ ๋ก๋์์ `load_data`๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๋งค๊ฐ๋ณ์์ ์์ฐ์ด ์ฟผ๋ฆฌ ๋ฌธ์์ด๋ก ํธ์ถํ ์ ์์ต๋๋ค. ์คํ ์ค์ ๋จผ์ ๋ฐ์ดํฐ ๋ก๋์์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ณ , ์ธ๋ฑ์ฑํ๊ณ (์๋ฅผ ๋ค์ด ๋ฒกํฐ ์คํ ์ด๋ก), ๊ทธ๋ฐ ๋ค์ '์จ๋๋งจ๋'๋ก ์ฟผ๋ฆฌํฉ๋๋ค. ์ด ์ธ ๋จ๊ณ ๋ชจ๋๊ฐ ๋จ์ผ ํด ํธ์ถ์์ ๋ฐ์ํฉ๋๋ค.
+2. `LoadAndSearchToolSpec`: LoadAndSearchToolSpec์ ๊ธฐ์กด ํด์ ์
๋ ฅ์ผ๋ก ๋ฐ์ต๋๋ค. ํด ์คํ์ผ๋ก์ `to_tool_list`๋ฅผ ๊ตฌํํ๋ฉฐ, ํด๋น ํจ์๊ฐ ํธ์ถ๋๋ฉด ๋ ๊ฐ์ ํด์ด ๋ฐํ๋ฉ๋๋ค: ๋ก๋ฉ ํด๊ณผ ๊ฒ์ ํด์
๋๋ค. ๋ก๋ ํด ์คํ์ ๊ธฐ๋ณธ ํด์ ํธ์ถํ ๋ค์ ์ถ๋ ฅ์ ์ธ๋ฑ์ฑํฉ๋๋ค(๊ธฐ๋ณธ์ ์ผ๋ก ๋ฒกํฐ ์ธ๋ฑ์ค๋ก). ๊ฒ์ ํด ์คํ์ ์ฟผ๋ฆฌ ๋ฌธ์์ด์ ์
๋ ฅ์ผ๋ก ๋ฐ์ ๊ธฐ๋ณธ ์ธ๋ฑ์ค๋ฅผ ํธ์ถํฉ๋๋ค.
+
+toolspecs์ ์ ํธ๋ฆฌํฐ ํด์ LlamaHub์์ ์ฐพ์ ์ ์์ต๋๋ค
+
+์ด์ LlamaIndex์์ ์์ด์ ํธ์ ํด์ ๊ธฐ๋ณธ์ ์ดํดํ์ผ๋, LlamaIndex๋ฅผ ์ฌ์ฉํ์ฌ **๊ตฌ์ฑ ๊ฐ๋ฅํ๊ณ ๊ด๋ฆฌ ๊ฐ๋ฅํ ์ํฌํ๋ก์ฐ๋ฅผ ๋ง๋๋** ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค!
diff --git a/units/ko/unit2/llama-index/workflows.mdx b/units/ko/unit2/llama-index/workflows.mdx
new file mode 100644
index 00000000..3b2e396e
--- /dev/null
+++ b/units/ko/unit2/llama-index/workflows.mdx
@@ -0,0 +1,280 @@
+# LlamaIndex์์ ์์ด์ ํธ ์ํฌํ๋ก์ฐ ๋ง๋ค๊ธฐ
+
+LlamaIndex์ ์ํฌํ๋ก์ฐ๋ ์ฝ๋๋ฅผ ์์ฐจ์ ์ด๊ณ ๊ด๋ฆฌ ๊ฐ๋ฅํ ๋จ๊ณ๋ก ๊ตฌ์ฑํ๋ ๊ตฌ์กฐํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
+
+์ด๋ฌํ ์ํฌํ๋ก์ฐ๋ `Events`์ ์ํด ํธ๋ฆฌ๊ฑฐ๋๋ `Steps`๋ฅผ ์ ์ํ์ฌ ์์ฑ๋๋ฉฐ, ์ด๋ค ์์ฒด๊ฐ ์ถ๊ฐ ๋จ๊ณ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๊ธฐ ์ํด `Events`๋ฅผ ๋ฐ์์ํต๋๋ค.
+RAG ์์
์ ์ํ LlamaIndex ์ํฌํ๋ก์ฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ํ๋ ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
+
+
+
+**์ํฌํ๋ก์ฐ๋ ๋ช ๊ฐ์ง ์ฃผ์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค:**
+
+- ์ฝ๋๋ฅผ ๊ฐ๋ณ ๋จ๊ณ๋ก ๋ช
ํํ๊ฒ ๊ตฌ์ฑ
+- ์ ์ฐํ ์ ์ด ํ๋ฆ์ ์ํ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ
์ฒ
+- ๋จ๊ณ ๊ฐ ํ์
์์ ํต์
+- ๋ด์ฅ ์ํ ๊ด๋ฆฌ
+- ๊ฐ๋จํ๊ณ ๋ณต์กํ ์์ด์ ํธ ์ํธ์์ฉ ๋ชจ๋ ์ง์
+
+์ถ์ธกํ์
จ์ ์ ์๋ฏ์ด, **์ํฌํ๋ก์ฐ๋ ์ ์ฒด ์ํฌํ๋ก์ฐ์ ๋ํ ์ ์ด๋ฅผ ์ ์งํ๋ฉด์ ์์ด์ ํธ์ ์์จ์ฑ ์ฌ์ด์์ ํ๋ฅญํ ๊ท ํ์ ์ ๊ณตํฉ๋๋ค.**
+
+๊ทธ๋ผ ์ฐ๋ฆฌ๋ง์ ์ํฌํ๋ก์ฐ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด๊ฒ ์ต๋๋ค!
+
+## ์ํฌํ๋ก์ฐ ๋ง๋ค๊ธฐ
+
+
+์ด ๋
ธํธ๋ถ์ ๋ฐ๋ผ๊ฐ๋ฉฐ Google Colab์์ ์ฝ๋๋ฅผ ์คํํด๋ณผ ์ ์์ต๋๋ค.
+
+
+### ๊ธฐ๋ณธ ์ํฌํ๋ก์ฐ ์์ฑ
+
+
+์ํฌํ๋ก์ฐ ํจํค์ง ์ค์น
+LlamaHub ์น์
์์ ์๊ฐ๋ ๋๋ก, ๋ค์ ๋ช
๋ น์ด๋ก ์ํฌํ๋ก์ฐ ํจํค์ง๋ฅผ ์ค์นํ ์ ์์ต๋๋ค:
+
+```python
+pip install llama-index-utils-workflow
+```
+
+
+`Workflow`๋ฅผ ์์ํ๋ ํด๋์ค๋ฅผ ์ ์ํ๊ณ ํจ์์ `@step` ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋จ์ผ ๋จ๊ณ ์ํฌํ๋ก์ฐ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
+๋ํ ์ํฌํ๋ก์ฐ์ ์์๊ณผ ๋์ ๋ํ๋ด๋ ํน๋ณํ ์ด๋ฒคํธ์ธ `StartEvent`์ `StopEvent`๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
+
+```python
+from llama_index.core.workflow import StartEvent, StopEvent, Workflow, step
+
+class MyWorkflow(Workflow):
+ @step
+ async def my_step(self, ev: StartEvent) -> StopEvent:
+ # ์ฌ๊ธฐ์ ๋ฌด์ธ๊ฐ ์ํ
+ return StopEvent(result="์๋
ํ์ธ์, ์ธ๊ณ!")
+
+
+w = MyWorkflow(timeout=10, verbose=False)
+result = await w.run()
+```
+
+๋ณด์๋ค์ํผ, ์ด์ `w.run()`์ ํธ์ถํ์ฌ ์ํฌํ๋ก์ฐ๋ฅผ ์คํํ ์ ์์ต๋๋ค.
+
+### ์ฌ๋ฌ ๋จ๊ณ ์ฐ๊ฒฐํ๊ธฐ
+
+์ฌ๋ฌ ๋จ๊ณ๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํด **๋จ๊ณ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ์ฌ์ฉ์ ์ ์ ์ด๋ฒคํธ๋ฅผ ๋ง๋ญ๋๋ค.**
+์ด๋ฅผ ์ํด ๋จ๊ณ ๊ฐ์ ์ ๋ฌ๋๊ณ ์ฒซ ๋ฒ์งธ ๋จ๊ณ์ ์ถ๋ ฅ์ ๋ ๋ฒ์งธ ๋จ๊ณ๋ก ์ ์กํ๋ `Event`๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
+
+```python
+from llama_index.core.workflow import Event
+
+class ProcessingEvent(Event):
+ intermediate_result: str
+
+class MultiStepWorkflow(Workflow):
+ @step
+ async def step_one(self, ev: StartEvent) -> ProcessingEvent:
+ # ์ด๊ธฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
+ return ProcessingEvent(intermediate_result="1๋จ๊ณ ์๋ฃ")
+
+ @step
+ async def step_two(self, ev: ProcessingEvent) -> StopEvent:
+ # ์ค๊ฐ ๊ฒฐ๊ณผ ์ฌ์ฉ
+ final_result = f"์ฒ๋ฆฌ ์๋ฃ: {ev.intermediate_result}"
+ return StopEvent(result=final_result)
+
+w = MultiStepWorkflow(timeout=10, verbose=False)
+result = await w.run()
+result
+```
+
+ํ์
ํํ
์ ์ํฌํ๋ก์ฐ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์คํ๋๋๋ก ๋ณด์ฅํ๋ฏ๋ก ์ฌ๊ธฐ์ ์ค์ํฉ๋๋ค. ์กฐ๊ธ ๋ ๋ณต์กํ๊ฒ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค!
+
+### ๋ฃจํ์ ๋ถ๊ธฐ
+
+ํ์
ํํ
์ ์ํฌํ๋ก์ฐ์ ๊ฐ์ฅ ๊ฐ๋ ฅํ ๋ถ๋ถ์
๋๋ค. ๋ ๋ณต์กํ ์ํฌํ๋ก์ฐ๋ฅผ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํด ๋ถ๊ธฐ, ๋ฃจํ, ์กฐ์ธ์ ๋ง๋ค ์ ์๊ฒ ํด์ฃผ๊ธฐ ๋๋ฌธ์
๋๋ค.
+
+ํฉ์งํฉ ์ฐ์ฐ์ `|`๋ฅผ ์ฌ์ฉํ์ฌ **๋ฃจํ๋ฅผ ๋ง๋๋** ์์ ๋ฅผ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
+์๋ ์์ ์์ `LoopEvent`๊ฐ ๋จ๊ณ์ ์
๋ ฅ์ผ๋ก ์ฌ์ฉ๋๊ณ ์ถ๋ ฅ์ผ๋ก๋ ๋ฐํ๋ ์ ์์์ ๋ณผ ์ ์์ต๋๋ค.
+
+```python
+from llama_index.core.workflow import Event
+import random
+
+
+class ProcessingEvent(Event):
+ intermediate_result: str
+
+
+class LoopEvent(Event):
+ loop_output: str
+
+
+class MultiStepWorkflow(Workflow):
+ @step
+ async def step_one(self, ev: StartEvent | LoopEvent) -> ProcessingEvent | LoopEvent:
+ if random.randint(0, 1) == 0:
+ print("๋์ ์ผ์ด ๋ฐ์ํ์ต๋๋ค")
+ return LoopEvent(loop_output="1๋จ๊ณ๋ก ๋์๊ฐ๋๋ค.")
+ else:
+ print("์ข์ ์ผ์ด ๋ฐ์ํ์ต๋๋ค")
+ return ProcessingEvent(intermediate_result="์ฒซ ๋ฒ์งธ ๋จ๊ณ ์๋ฃ.")
+
+ @step
+ async def step_two(self, ev: ProcessingEvent) -> StopEvent:
+ # ์ค๊ฐ ๊ฒฐ๊ณผ ์ฌ์ฉ
+ final_result = f"์ฒ๋ฆฌ ์๋ฃ: {ev.intermediate_result}"
+ return StopEvent(result=final_result)
+
+
+w = MultiStepWorkflow(verbose=False)
+result = await w.run()
+result
+```
+
+### ์ํฌํ๋ก์ฐ ๊ทธ๋ฆฌ๊ธฐ
+
+์ํฌํ๋ก์ฐ๋ฅผ ๊ทธ๋ฆด ์๋ ์์ต๋๋ค. `draw_all_possible_flows` ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ํฌํ๋ก์ฐ๋ฅผ ๊ทธ๋ ค๋ณด๊ฒ ์ต๋๋ค. ์ด๋ ์ํฌํ๋ก์ฐ๋ฅผ HTML ํ์ผ์ ์ ์ฅํฉ๋๋ค.
+
+```python
+from llama_index.utils.workflow import draw_all_possible_flows
+
+w = ... # ์ด์ ์น์
์์ ์ ์๋ ๋๋ก
+draw_all_possible_flows(w, "flow.html")
+```
+
+
+
+๊ฐ์์์ ๋ค๋ฃฐ ๋ง์ง๋ง ๋ฉ์ง ํธ๋ฆญ์ด ์๋๋ฐ, ๊ทธ๊ฒ์ ์ํฌํ๋ก์ฐ์ ์ํ๋ฅผ ์ถ๊ฐํ๋ ๋ฅ๋ ฅ์
๋๋ค.
+
+### ์ํ ๊ด๋ฆฌ
+
+์ํ ๊ด๋ฆฌ๋ ์ํฌํ๋ก์ฐ์ ์ํ๋ฅผ ์ถ์ ํ๊ณ ์ถ์ ๋ ์ ์ฉํ๋ฏ๋ก, ๋ชจ๋ ๋จ๊ณ๊ฐ ๋์ผํ ์ํ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
+๋จ๊ณ ํจ์์ ๋งค๊ฐ๋ณ์ ์์ `Context` ํ์
ํํ
์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์ํํ ์ ์์ต๋๋ค.
+
+```python
+from llama_index.core.workflow import Context, StartEvent, StopEvent
+
+
+@step
+async def query(self, ctx: Context, ev: StartEvent) -> StopEvent:
+ # ์ปจํ
์คํธ์ ์ฟผ๋ฆฌ ์ ์ฅ
+ await ctx.store.set("query", "ํ๋์ค์ ์๋๋ ๋ฌด์์ธ๊ฐ์?")
+
+ # ์ปจํ
์คํธ์ ์ด๋ฒคํธ๋ก ๋ฌด์ธ๊ฐ ์ํ
+ val = ...
+
+ # ์ปจํ
์คํธ์์ ์ฟผ๋ฆฌ ๊ฒ์
+ query = await ctx.store.get("query")
+
+ return StopEvent(result=val)
+```
+
+ํ๋ฅญํฉ๋๋ค! ์ด์ LlamaIndex์์ ๊ธฐ๋ณธ ์ํฌํ๋ก์ฐ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์๊ฒ ๋์์ต๋๋ค!
+
+์ํฌํ๋ก์ฐ์๋ ๋ ๋ณต์กํ ๋์์ค๊ฐ ์์ผ๋ฉฐ, LlamaIndex ๋ฌธ์์์ ๋ฐฐ์ธ ์ ์์ต๋๋ค.
+
+ํ์ง๋ง `AgentWorkflow` ํด๋์ค์ ์์กดํ๋ ์ํฌํ๋ก์ฐ๋ฅผ ๋ง๋๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ค ์์ด์ ํธ ์ํฌํ๋ก์ฐ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
+
+## ๋ค์ค ์์ด์ ํธ ์ํฌํ๋ก์ฐ๋ก ์ํฌํ๋ก์ฐ ์๋ํ
+
+์๋ ์ํฌํ๋ก์ฐ ์์ฑ ๋์ **`AgentWorkflow` ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ค ์์ด์ ํธ ์ํฌํ๋ก์ฐ๋ฅผ ๋ง๋ค** ์ ์์ต๋๋ค.
+`AgentWorkflow`๋ ์ํฌํ๋ก์ฐ ์์ด์ ํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฌธํ๋ ๊ธฐ๋ฅ์ ๊ธฐ๋ฐ์ผ๋ก ํ์
ํ๊ณ ์๋ก์๊ฒ ์์
์ ๋๊ธธ ์ ์๋ ํ๋ ์ด์์ ์์ด์ ํธ ์์คํ
์ ๋ง๋ค ์ ์๊ฒ ํด์ค๋๋ค.
+์ด๋ฅผ ํตํด ์๋ก ๋ค๋ฅธ ์์ด์ ํธ๊ฐ ์์
์ ์๋ก ๋ค๋ฅธ ์ธก๋ฉด์ ์ฒ๋ฆฌํ๋ ๋ณต์กํ ์์ด์ ํธ ์์คํ
์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
+`llama_index.core.agent`์์ ํด๋์ค๋ฅผ ๊ฐ์ ธ์ค๋ ๋์ , `llama_index.core.agent.workflow`์์ ์์ด์ ํธ ํด๋์ค๋ฅผ ๊ฐ์ ธ์ฌ ๊ฒ์
๋๋ค.
+ํ๋์ ์์ด์ ํธ๋ `AgentWorkflow` ์์ฑ์์์ ๋ฃจํธ ์์ด์ ํธ๋ก ์ง์ ๋์ด์ผ ํฉ๋๋ค.
+์ฌ์ฉ์ ๋ฉ์์ง๊ฐ ๋ค์ด์ค๋ฉด ๋จผ์ ๋ฃจํธ ์์ด์ ํธ๋ก ๋ผ์ฐํ
๋ฉ๋๋ค.
+
+๊ฐ ์์ด์ ํธ๋ ๋ค์์ ์ํํ ์ ์์ต๋๋ค:
+
+- ํด์ ์ฌ์ฉํ์ฌ ์์ฒญ์ ์ง์ ์ฒ๋ฆฌ
+- ์์
์ ๋ ์ ํฉํ ๋ค๋ฅธ ์์ด์ ํธ์๊ฒ ์์
๋๊ธฐ๊ธฐ
+- ์ฌ์ฉ์์๊ฒ ์๋ต ๋ฐํ
+
+๋ค์ค ์์ด์ ํธ ์ํฌํ๋ก์ฐ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
+
+```python
+from llama_index.core.agent.workflow import AgentWorkflow, ReActAgent
+from llama_index.llms.huggingface_api import HuggingFaceInferenceAPI
+
+# ๋ช ๊ฐ์ง ํด ์ ์
+def add(a: int, b: int) -> int:
+ """๋ ์ซ์๋ฅผ ๋ํฉ๋๋ค."""
+ return a + b
+
+def multiply(a: int, b: int) -> int:
+ """๋ ์ซ์๋ฅผ ๊ณฑํฉ๋๋ค."""
+ return a * b
+
+llm = HuggingFaceInferenceAPI(model_name="Qwen/Qwen2.5-Coder-32B-Instruct")
+
+# FunctionTool ์์ด ํจ์๋ฅผ ์ง์ ์ ๋ฌํ ์ ์์ต๋๋ค -- ํจ์/๋
์คํธ๋ง์ด ์ด๋ฆ/์ค๋ช
์ ์ํด ํ์ฑ๋ฉ๋๋ค
+multiply_agent = ReActAgent(
+ name="multiply_agent",
+ description="๋ ์ ์๋ฅผ ๊ณฑํ ์ ์์ต๋๋ค",
+ system_prompt="์ซ์๋ฅผ ๊ณฑํ๋ ํด์ ์ฌ์ฉํ ์ ์๋ ๋์์ด ๋๋ ์ด์์คํดํธ์
๋๋ค.",
+ tools=[multiply],
+ llm=llm,
+)
+
+addition_agent = ReActAgent(
+ name="add_agent",
+ description="๋ ์ ์๋ฅผ ๋ํ ์ ์์ต๋๋ค",
+ system_prompt="์ซ์๋ฅผ ๋ํ๋ ํด์ ์ฌ์ฉํ ์ ์๋ ๋์์ด ๋๋ ์ด์์คํดํธ์
๋๋ค.",
+ tools=[add],
+ llm=llm,
+)
+
+# ์ํฌํ๋ก์ฐ ์์ฑ
+workflow = AgentWorkflow(
+ agents=[multiply_agent, addition_agent],
+ root_agent="multiply_agent",
+)
+
+# ์์คํ
์คํ
+response = await workflow.run(user_msg="5์ 3์ ๋ํ ์ ์๋์?")
+```
+
+์์ด์ ํธ ํด์ ์์ ์ธ๊ธํ ์ํฌํ๋ก์ฐ ์ํ๋ ์์ ํ ์ ์์ต๋๋ค. ์ํฌํ๋ก์ฐ๋ฅผ ์์ํ๊ธฐ ์ ์ ๋ชจ๋ ์์ด์ ํธ๊ฐ ์ฌ์ฉํ ์ ์๋ ์ด๊ธฐ ์ํ ๋์
๋๋ฆฌ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
+์ํ๋ ์ํฌํ๋ก์ฐ ์ปจํ
์คํธ์ ์ํ ํค์ ์ ์ฅ๋ฉ๋๋ค. ๊ฐ ์๋ก์ด ์ฌ์ฉ์ ๋ฉ์์ง๋ฅผ ๋ณด๊ฐํ๋ state_prompt์ ์ฃผ์
๋ฉ๋๋ค.
+
+์ด์ ์์ ๋ฅผ ์์ ํ์ฌ ํจ์ ํธ์ถ์ ์ธ๋ ์นด์ดํฐ๋ฅผ ์ฃผ์
ํด๋ณด๊ฒ ์ต๋๋ค:
+
+```python
+from llama_index.core.workflow import Context
+
+# ๋ช ๊ฐ์ง ํด ์ ์
+async def add(ctx: Context, a: int, b: int) -> int:
+ """๋ ์ซ์๋ฅผ ๋ํฉ๋๋ค."""
+ # ์นด์ดํธ ์
๋ฐ์ดํธ
+ cur_state = await ctx.store.get("state")
+ cur_state["num_fn_calls"] += 1
+ await ctx.store.set("state", cur_state)
+
+ return a + b
+
+async def multiply(ctx: Context, a: int, b: int) -> int:
+ """๋ ์ซ์๋ฅผ ๊ณฑํฉ๋๋ค."""
+ # ์นด์ดํธ ์
๋ฐ์ดํธ
+ cur_state = await ctx.store.get("state")
+ cur_state["num_fn_calls"] += 1
+ await ctx.store.set("state", cur_state)
+
+ return a * b
+
+...
+
+workflow = AgentWorkflow(
+ agents=[multiply_agent, addition_agent],
+ root_agent="multiply_agent",
+ initial_state={"num_fn_calls": 0},
+ state_prompt="ํ์ฌ ์ํ: {state}. ์ฌ์ฉ์ ๋ฉ์์ง: {msg}",
+)
+
+# ์ปจํ
์คํธ์ ํจ๊ป ์ํฌํ๋ก์ฐ ์คํ
+ctx = Context(workflow)
+response = await workflow.run(user_msg="5์ 3์ ๋ํ ์ ์๋์?", ctx=ctx)
+
+# ์ํ๋ฅผ ๊บผ๋ด์ ๊ฒ์ฌ
+state = await ctx.store.get("state")
+print(state["num_fn_calls"])
+```
+
+์ถํํฉ๋๋ค! ์ด์ LlamaIndex์์ ์์ด์ ํธ์ ๊ธฐ๋ณธ์ ๋ง์คํฐํ์ต๋๋ค! ๐
+
+์ง์์ ํ๊ณ ํ ํ๊ธฐ ์ํด ๋ง์ง๋ง ํด์ฆ๋ฅผ ๊ณ์ํด๋ณด๊ฒ ์ต๋๋ค! ๐
diff --git a/units/ko/unit2/smolagents/code_agents.mdx b/units/ko/unit2/smolagents/code_agents.mdx
new file mode 100644
index 00000000..fcba655d
--- /dev/null
+++ b/units/ko/unit2/smolagents/code_agents.mdx
@@ -0,0 +1,389 @@
+
+
+# ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ์์ด์ ํธ ๋ง๋ค๊ธฐ
+
+์ฝ๋ ์์ด์ ํธ๋ `smolagents`์ ๊ธฐ๋ณธ ์์ด์ ํธ ์ ํ์
๋๋ค. ์ด๋ค์ ํ์ด์ฌ ๋๊ตฌ ํธ์ถ์ ์์ฑํ์ฌ ์์
์ ์ํํ๋ฉฐ, ํจ์จ์ ์ด๊ณ ํํ๋ ฅ ์์ผ๋ฉฐ ์ ํํ ์ก์
ํํ์ ๋ฌ์ฑํฉ๋๋ค.
+
+์ด๋ฌํ ๊ฐ์ํ๋ ์ ๊ทผ ๋ฐฉ์์ ํ์ํ ์ก์
์๋ฅผ ์ค์ด๊ณ , ๋ณต์กํ ์์
์ ๋จ์ํํ๋ฉฐ, ๊ธฐ์กด ์ฝ๋ ํจ์์ ์ฌ์ฌ์ฉ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. `smolagents`๋ ์ฝ 1,000์ค์ ์ฝ๋๋ก ๊ตฌํ๋ ๊ฒฝ๋ ํ๋ ์์ํฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
+
+
+์ ์ด๋ฏธ์ง๋ ๋
ผ๋ฌธ [Executable Code Actions Elicit Better LLM Agents](https://huggingface.co/papers/2402.01030)์์ ๊ฐ์ ธ์์ต๋๋ค.
+
+
+์ฝ๋ ์์ด์ ํธ๊ฐ ์ ํจ๊ณผ์ ์ธ์ง ๋ ์๊ณ ์ถ๋ค๋ฉด, smolagents ๋ฌธ์์ ์ด ๊ฐ์ด๋๋ฅผ ์ฐธ๊ณ ํ์ธ์.
+
+
+## ์ ์ฝ๋ ์์ด์ ํธ์ธ๊ฐ์?
+
+๋ค๋จ๊ณ ์์ด์ ํธ ํ๋ก์ธ์ค์์ LLM์ ์ผ๋ฐ์ ์ผ๋ก ์ธ๋ถ ๋๊ตฌ ํธ์ถ์ ํฌํจํ๋ ์ก์
์ ์์ฑํ๊ณ ์คํํฉ๋๋ค. ๊ธฐ์กด ๋ฐฉ์์ ๋๊ตฌ ์ด๋ฆ๊ณผ ์ธ์๋ฅผ ๋ฌธ์์ด๋ก ์ง์ ํ๋ JSON ํ์์ ์ฌ์ฉํ๋ฉฐ, **์์คํ
์ด ์ด๋ค ๋๊ตฌ๋ฅผ ์คํํ ์ง ํ์ฑํด์ผ ํฉ๋๋ค**.
+
+ํ์ง๋ง ์ฐ๊ตฌ ๊ฒฐ๊ณผ์ ๋ฐ๋ฅด๋ฉด, **๋๊ตฌ ํธ์ถ LLM์ ์ง์ ์ฝ๋๋ฅผ ์ฌ์ฉํ ๋ ๋ ํจ๊ณผ์ ์ผ๋ก ์๋ํฉ๋๋ค**. ์ด๊ฒ์ด `smolagents`์ ํต์ฌ ์์น์ด๋ฉฐ, ์์ ๋
ผ๋ฌธ ์ด๋ฏธ์ง์์๋ ํ์ธํ ์ ์์ต๋๋ค.
+
+์ฝ๋๋ก ์ก์
์ ์์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฃผ์ ์ฅ์ ์ด ์์ต๋๋ค:
+
+* **์กฐํฉ์ฑ**: ์ก์
์ ์ฝ๊ฒ ๊ฒฐํฉํ๊ณ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
+* **๊ฐ์ฒด ๊ด๋ฆฌ**: ์ด๋ฏธ์ง์ ๊ฐ์ ๋ณต์กํ ๊ตฌ์กฐ๋ฅผ ์ง์ ๋ค๋ฃฐ ์ ์์ต๋๋ค.
+* **๋ฒ์ฉ์ฑ**: ๊ณ์ฐ์ ์ผ๋ก ๊ฐ๋ฅํ ๋ชจ๋ ์์
์ ํํํ ์ ์์ต๋๋ค.
+* **LLM์ ์์ฐ์ค๋ฌ์**: ๊ณ ํ์ง ์ฝ๋๋ ์ด๋ฏธ LLM์ ํ์ต ๋ฐ์ดํฐ์ ํ๋ถํ๊ฒ ํฌํจ๋์ด ์์ต๋๋ค.
+
+## ์ฝ๋ ์์ด์ ํธ๋ ์ด๋ป๊ฒ ๋์ํ๋์?
+
+
+
+์ ๋ค์ด์ด๊ทธ๋จ์ `CodeAgent.run()`์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ๋ณด์ฌ์ค๋๋ค. ์ด๋ 1๋จ์์์ ์ธ๊ธํ ReAct ํ๋ ์์ํฌ๋ฅผ ๋ฐ๋ฆ
๋๋ค. `smolagents`์์ ์์ด์ ํธ์ ์ฃผ์ ์ถ์ํ๋ `MultiStepAgent`์ด๋ฉฐ, ์ด๋ ํต์ฌ ๋น๋ฉ ๋ธ๋ก ์ญํ ์ ํฉ๋๋ค. `CodeAgent`๋ ํน๋ณํ ์ข
๋ฅ์ `MultiStepAgent`์
๋๋ค.
+
+`CodeAgent`๋ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ก ๋์ํฉ๋๋ค. ๊ธฐ์กด ๋ณ์์ ์ง์์ ์คํ ๋ก๊ทธ์ ์ ์ฅ๋์ด ์์ด์ ํธ์ ์ปจํ
์คํธ๋ก ํ์ฉ๋ฉ๋๋ค:
+
+1. ์์คํ
ํ๋กฌํํธ๋ `SystemPromptStep`์ ์ ์ฅ๋๊ณ , ์ฌ์ฉ์ ์ฟผ๋ฆฌ๋ `TaskStep`์ ๊ธฐ๋ก๋ฉ๋๋ค.
+
+2. ๊ทธ ๋ค์, ๋ค์๊ณผ ๊ฐ์ while ๋ฃจํ๊ฐ ์คํ๋ฉ๋๋ค:
+
+ 2.1 `agent.write_memory_to_messages()` ๋ฉ์๋๋ ์์ด์ ํธ์ ๋ก๊ทธ๋ฅผ LLM์ด ์ฝ์ ์ ์๋ [์ฑํ
๋ฉ์์ง](https://huggingface.co/docs/transformers/main/en/chat_templating) ๋ฆฌ์คํธ๋ก ๋ณํํฉ๋๋ค.
+
+ 2.2 ์ด ๋ฉ์์ง๋ค์ `Model`๋ก ์ ์ก๋์ด ์๋ต์ ์์ฑํฉ๋๋ค.
+
+ 2.3 ์๋ต์์ ์ก์
์ ์ถ์ถํ๋๋ฐ, ์ฝ๋ ์์ด์ ํธ์ด๋ฏ๋ก ํ์ด์ฌ ์ฝ๋ ์กฐ๊ฐ์ด์ด์ผ ํฉ๋๋ค.
+
+ 2.4 ์ก์
์ด ์คํ๋ฉ๋๋ค.
+
+ 2.5 ๊ฒฐ๊ณผ๊ฐ `ActionStep`์ ๋ฉ๋ชจ๋ฆฌ๋ก ๊ธฐ๋ก๋ฉ๋๋ค.
+
+๊ฐ ๋จ๊ณ๊ฐ ๋๋ ๋, ์์ด์ ํธ์ ํจ์ ํธ์ถ(`agent.step_callback`)์ด ํฌํจ๋์ด ์๋ค๋ฉด ์คํ๋ฉ๋๋ค.
+
+## ์์๋ก ์์๋ณด๊ธฐ
+
+
+์ด ๋
ธํธ๋ถ์ ๋ฐ๋ผ๊ฐ๋ฉฐ ์ฝ๋๋ฅผ ์ง์ ์คํํด๋ณผ ์ ์์ต๋๋ค.
+
+
+Alfred๋ ์จ์ธ ๊ฐ๋ฌธ์ ์ ํ์์ ํํฐ๋ฅผ ์ค๋นํ๊ณ ์์ต๋๋ค. ๋ชจ๋ ๊ฒ์ด ์์กฐ๋กญ๊ฒ ์งํ๋๋๋ก ์ฌ๋ฌ๋ถ์ ๋์์ด ํ์ํฉ๋๋ค. ์ง๊ธ๊น์ง ๋ฐฐ์ด ๋ค๋จ๊ณ `CodeAgent`์ ๋์ ๋ฐฉ์์ ์ ์ฉํด๋ด
์๋ค.
+
+
+
+์์ง `smolagents`๋ฅผ ์ค์นํ์ง ์์๋ค๋ฉด, ๋ค์ ๋ช
๋ น์ด๋ก ์ค์นํ์ธ์:
+
+```bash
+pip install smolagents -U
+```
+
+Hugging Face Hub์ ๋ก๊ทธ์ธํ์ฌ Serverless Inference API๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
+
+```python
+from huggingface_hub import login
+
+login()
+```
+
+### `smolagents`๋ก ํํฐ ํ๋ ์ด๋ฆฌ์คํธ ์ ํํ๊ธฐ
+
+์์
์ ํํฐ์ ํ์ ์์์
๋๋ค! Alfred๋ ํ๋ ์ด๋ฆฌ์คํธ๋ฅผ ๊ณ ๋ฅด๋ ๋ฐ ๋์์ด ํ์ํฉ๋๋ค. ๋คํํ๋ `smolagents`๋ฅผ ์ฌ์ฉํ๋ฉด ์น ๊ฒ์ ๋๊ตฌ๋ฅผ ์์ด์ ํธ์ ์ถ๊ฐํ์ฌ ์ด๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
+
+
+
+๋ชจ๋ธ๋ก๋ Hugging Face์ [Serverless Inference API](https://huggingface.co/docs/api-inference/index)์ ์ ๊ทผํ ์ ์๋ `InferenceClientModel`์ ์ฌ์ฉํฉ๋๋ค. ๊ธฐ๋ณธ ๋ชจ๋ธ์ "Qwen/Qwen2.5-Coder-32B-Instruct"์ด๋ฉฐ, ๋น ๋ฅธ ์ถ๋ก ์ด ๊ฐ๋ฅํฉ๋๋ค. ํ๋ธ์์ ํธํ๋๋ ๋ค๋ฅธ ๋ชจ๋ธ๋ ์ ํํ ์ ์์ต๋๋ค.
+
+์์ด์ ํธ ์คํ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค:
+
+```python
+from smolagents import CodeAgent, DuckDuckGoSearchTool, InferenceClientModel
+
+agent = CodeAgent(tools=[DuckDuckGoSearchTool()], model=InferenceClientModel())
+
+agent.run("์จ์ธ ์ ํ์์ ์ด๋ฆฌ๋ ํํฐ์ ์ด์ธ๋ฆฌ๋ ์ต๊ณ ์ ์์
์ถ์ฒ์ ๊ฒ์ํด์ค.")
+```
+
+์ด ์์๋ฅผ ์คํํ๋ฉด **์ํฌํ๋ก์ฐ ๋จ๊ณ์ ์คํ ์ถ์ **์ด ์ถ๋ ฅ๋ฉ๋๋ค. ๋ํ ๋ค์๊ณผ ๊ฐ์ ํ์ด์ฌ ์ฝ๋๊ฐ ํ์๋ฉ๋๋ค:
+
+```python
+ โ ์คํ๋ ํ์ฑ ์ฝ๋: โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
+ results = web_search(query="๋ฐฐํธ๋งจ ํํฐ์ ์ด์ธ๋ฆฌ๋ ์ต๊ณ ์ ์์
")
+ print(results)
+ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
+```
+
+๋ช ๋จ๊ณ ํ, Alfred๊ฐ ์ฌ์ฉํ ์ ์๋ ํ๋ ์ด๋ฆฌ์คํธ๊ฐ ์์ฑ๋ฉ๋๋ค! ๐ต
+
+### ๋ง์ถคํ ๋๊ตฌ๋ก ๋ฉ๋ด ์ค๋นํ๊ธฐ
+
+
+
+ํ๋ ์ด๋ฆฌ์คํธ๋ฅผ ๊ณจ๋๋ค๋ฉด, ์ด์ ์๋์ ์ํ ๋ฉ๋ด๋ฅผ ์ค๋นํด์ผ ํฉ๋๋ค. Alfred๋ ์ฌ๊ธฐ์๋ `smolagents`์ ๋์์ ๋ฐ์ ์ ์์ต๋๋ค. ์๋ ์์์์๋ `@tool` ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํด ๋ง์ถคํ ํจ์๋ฅผ ๋๊ตฌ๋ก ๋ฑ๋กํฉ๋๋ค. ๋๊ตฌ ์์ฑ์ ๋ํด์๋ ์ดํ์ ๋ ์์ธํ ๋ค๋ฃจ๋, ์ง๊ธ์ ์ฝ๋๋ฅผ ์คํํด๋ณด์ธ์.
+
+์๋ ์์์ฒ๋ผ, `@tool` ๋ฐ์ฝ๋ ์ดํฐ๋ก ๋๊ตฌ๋ฅผ ๋ง๋ค๊ณ `tools` ๋ฆฌ์คํธ์ ์ถ๊ฐํฉ๋๋ค.
+
+```python
+from smolagents import CodeAgent, tool, InferenceClientModel
+
+# ํํฐ ์ํฉ์ ๋ง๋ ๋ฉ๋ด๋ฅผ ์ถ์ฒํ๋ ๋๊ตฌ
+@tool
+def suggest_menu(occasion: str) -> str:
+ """
+ ์ํฉ์ ๋ฐ๋ผ ๋ฉ๋ด๋ฅผ ์ถ์ฒํฉ๋๋ค.
+ Args:
+ occasion (str): ํํฐ ์ ํ. ํ์ฉ ๊ฐ:
+ - "casual": ์บ์ฃผ์ผ ํํฐ ๋ฉ๋ด
+ - "formal": ํฌ๋ฉ ํํฐ ๋ฉ๋ด
+ - "superhero": ์ํผํ์ด๋ก ํํฐ ๋ฉ๋ด
+ - "custom": ๋ง์ถค ๋ฉ๋ด
+ """
+ if occasion == "casual":
+ return "ํผ์, ์ค๋ต, ์๋ฃ."
+ elif occasion == "formal":
+ return "3์ฝ์ค ๋๋, ์์ธ, ๋์ ํธ."
+ elif occasion == "superhero":
+ return "๊ณ ์๋์ง, ๊ฑด๊ฐ์ ๋ทํ."
+ else:
+ return "์ง์ฌ๋ง์ ์ํ ๋ง์ถค ๋ฉ๋ด."
+
+# Alfred๊ฐ ํํฐ ๋ฉ๋ด๋ฅผ ์ค๋นํฉ๋๋ค
+agent = CodeAgent(tools=[suggest_menu], model=InferenceClientModel())
+
+# ํํฐ๋ฅผ ์ํ ํฌ๋ฉ ๋ฉ๋ด ์ค๋น
+agent.run("ํํฐ๋ฅผ ์ํ ํฌ๋ฉ ๋ฉ๋ด๋ฅผ ์ค๋นํด์ค.")
+```
+
+์์ด์ ํธ๋ ๋ช ๋จ๊ณ ์คํ ํ ๋ต์ ์ฐพ์ต๋๋ค. docstring์ ํ์ฉ ๊ฐ์ ๋ช
ํํ ์ ์ผ๋ฉด ์์ด์ ํธ๊ฐ `occasion` ์ธ์ ๊ฐ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋๋ก ์ ๋ํ ์ ์์ต๋๋ค.
+
+๋ฉ๋ด ์ค๋น ์๋ฃ! ๐ฅ
+
+### ์์ด์ ํธ ๋ด์์ ํ์ด์ฌ import ์ฌ์ฉํ๊ธฐ
+
+ํ๋ ์ด๋ฆฌ์คํธ์ ๋ฉ๋ด๊ฐ ์ค๋น๋์์ผ๋, ์ด์ ๋จ์ ๊ฒ์ ์ค๋น ์๊ฐ ๊ณ์ฐ์
๋๋ค!
+
+Alfred๋ ๋ชจ๋ ์ค๋น๋ฅผ ์ง๊ธ ์์ํ๋ฉด ์ธ์ ํํฐ๊ฐ ์ค๋น๋ ์ง ๊ณ์ฐํด์ผ ํฉ๋๋ค. ํ์ํ๋ค๋ฉด ๋ค๋ฅธ ์ํผํ์ด๋ก์ ๋์๋ ๋ฐ์ ์ ์๊ฒ ์ฃ .
+
+`smolagents`๋ ํ์ด์ฌ ์ฝ๋ ์กฐ๊ฐ์ ์์ฑํ๊ณ ์คํํ๋ ์์ด์ ํธ์ ํนํ๋์ด ์์ผ๋ฉฐ, ๋ณด์์ ์ํด ์๋๋ฐ์ค ์คํ์ ์ ๊ณตํฉ๋๋ค.
+
+**์ฝ๋ ์คํ์๋ ์๊ฒฉํ ๋ณด์ ์กฐ์น๊ฐ ์ ์ฉ๋ฉ๋๋ค** โ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฉ๋ ๋ชฉ๋ก ์ธ์ import๋ ์ฐจ๋จ๋ฉ๋๋ค. ํ์ง๋ง `additional_authorized_imports`์ ๋ฌธ์์ด๋ก ์ถ๊ฐํ๋ฉด import๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
+์์ธํ ๋ณด์ ์คํ ๋ฐฉ๋ฒ์ ๊ณต์ [๊ฐ์ด๋](https://huggingface.co/docs/smolagents/tutorials/secure_code_execution)๋ฅผ ์ฐธ๊ณ ํ์ธ์.
+
+์๋ ์์์์๋ `datetime` ๋ชจ๋ import๋ฅผ ํ์ฉํฉ๋๋ค.
+
+```python
+from smolagents import CodeAgent, InferenceClientModel
+import numpy as np
+import time
+import datetime
+
+agent = CodeAgent(tools=[], model=InferenceClientModel(), additional_authorized_imports=['datetime'])
+
+agent.run(
+ """
+ Alfred๊ฐ ํํฐ๋ฅผ ์ค๋นํด์ผ ํฉ๋๋ค. ์์
๋ชฉ๋ก:
+ 1. ์๋ฃ ์ค๋น - 30๋ถ
+ 2. ์ ํ ์ฅ์ - 60๋ถ
+ 3. ๋ฉ๋ด ์ธํ
- 45๋ถ
+ 4. ์์
๋ฐ ํ๋ ์ด๋ฆฌ์คํธ ์ค๋น - 45๋ถ
+
+ ์ง๊ธ ๋ฐ๋ก ์์ํ๋ฉด ํํฐ ์ค๋น๊ฐ ์ธ์ ๋๋ ๊น์?
+ """
+)
+```
+
+์ด ์์๋ค์ ์ฝ๋ ์์ด์ ํธ๋ก ํ ์ ์๋ ์ผ์ ์์์ ๋ถ๊ณผํฉ๋๋ค. ๋ ๋ง์ ๋ด์ฉ์ [smolagents ๋ฌธ์](https://huggingface.co/docs/smolagents)์์ ํ์ธํ์ธ์.
+
+์์ฝํ์๋ฉด, `smolagents`๋ ํ์ด์ฌ ์ฝ๋ ์กฐ๊ฐ์ ์์ฑํ๊ณ ์คํํ๋ ์์ด์ ํธ์ ํนํ๋์ด ์์ผ๋ฉฐ, ๋ณด์ ์๋๋ฐ์ค ์คํ์ ์ง์ํฉ๋๋ค. ๋ก์ปฌ ๋ฐ API ๊ธฐ๋ฐ ์ธ์ด ๋ชจ๋ธ ๋ชจ๋ ์ง์ํ์ฌ ๋ค์ํ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ ํฉํฉ๋๋ค.
+
+### ์ฐ๋ฆฌ๋ง์ ํํฐ ์ค๋น ์์ด์ ํธ๋ฅผ ํ๋ธ์ ๊ณต์ ํ๊ธฐ
+
+์ฐ๋ฆฌ๋ง์ Alfred ์์ด์ ํธ๋ฅผ ์ปค๋ฎค๋ํฐ์ ๊ณต์ ํ ์ ์๋ค๋ฉด ์ ๋ง ๋ฉ์ง์ง ์์๊น์? ๋๊ตฌ๋ ํ๋ธ์์ ์ฝ๊ฒ ๋ค์ด๋ก๋ํด ์ฌ์ฉํ ์ ์์ต๋๋ค! `smolagents`๋ ์์ฑ๋ ์์ด์ ํธ๋ฅผ ์ปค๋ฎค๋ํฐ์ ๊ณต์ ํ๊ณ , ๋ค๋ฅธ ์ฌ๋์ ์์ด์ ํธ๋ฅผ ์ฆ์ ๋ค์ด๋ก๋ํ ์ ์๋๋ก ์ง์ํฉ๋๋ค. ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋จํฉ๋๋ค:
+
+```python
+# ์ฌ์ฉ์๋ช
๊ณผ ์ ์ฅ์๋ช
์ ๋ณ๊ฒฝํ์ธ์
+agent.push_to_hub('sergiopaniego/AlfredAgent')
+```
+
+๋ค์ ๋ค์ด๋ก๋ํ๋ ค๋ฉด ์๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ธ์:
+
+```python
+# ์ฌ์ฉ์๋ช
๊ณผ ์ ์ฅ์๋ช
์ ๋ณ๊ฒฝํ์ธ์
+alfred_agent = agent.from_hub('sergiopaniego/AlfredAgent', trust_remote_code=True)
+
+alfred_agent.run("์จ์ธ ์ ํ์์ ์ด๋ฆฌ๋ ํํฐ์ ์ด์ธ๋ฆฌ๋ ์ต๊ณ ์ ํ๋ ์ด๋ฆฌ์คํธ๋ฅผ ์ถ์ฒํด์ค. ํํฐ ํ
๋ง๋ '๋น๋ฐ ๊ฐ๋ฉด๋ฌด๋ํ'์ผ")
+```
+
+๊ณต์ ๋ ์์ด์ ํธ๋ Hugging Face Spaces์์๋ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. [์ฌ๊ธฐ](https://huggingface.co/spaces/davidberenstein1957/smolagents-and-tools)์์ ๋ค์ํ ์์ด์ ํธ๋ฅผ ํ์ํด๋ณด์ธ์.
+
+์๋ฅผ ๋ค์ด, _AlfredAgent_๋ [์ฌ๊ธฐ](https://huggingface.co/spaces/sergiopaniego/AlfredAgent)์์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋์์ ์ง์ ์ฒดํํด๋ณด์ธ์:
+
+
+
+Alfred๊ฐ ์ด๋ป๊ฒ ์ด๋ฐ ์์ด์ ํธ๋ฅผ ๋ง๋ค์๋์ง ๊ถ๊ธํ๋ค๋ฉด, ์ฌ๋ฌ ๋๊ตฌ๋ฅผ ํตํฉํด ์๋์ ๊ฐ์ด ์์ด์ ํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋๊ตฌ์ ๋ํด์๋ ์ดํ์ ์์ธํ ๋ค๋ฃจ๋, ์ง๊ธ์ ๊ตฌ์กฐ๋ง ์ฐธ๊ณ ํ์ธ์:
+
+```python
+from smolagents import CodeAgent, DuckDuckGoSearchTool, FinalAnswerTool, InferenceClientModel, Tool, tool, VisitWebpageTool
+
+@tool
+def suggest_menu(occasion: str) -> str:
+ """
+ ์ํฉ์ ๋ฐ๋ผ ๋ฉ๋ด๋ฅผ ์ถ์ฒํฉ๋๋ค.
+ Args:
+ occasion: ํํฐ ์ ํ
+ """
+ if occasion == "casual":
+ return "ํผ์, ์ค๋ต, ์๋ฃ."
+ elif occasion == "formal":
+ return "3์ฝ์ค ๋๋, ์์ธ, ๋์ ํธ."
+ elif occasion == "superhero":
+ return "๊ณ ์๋์ง, ๊ฑด๊ฐ์ ๋ทํ."
+ else:
+ return "์ง์ฌ๋ง์ ์ํ ๋ง์ถค ๋ฉ๋ด."
+
+@tool
+def catering_service_tool(query: str) -> str:
+ """
+ ์ด ๋๊ตฌ๋ ๊ณ ๋ด์์์ ํ์ ์ด ๊ฐ์ฅ ๋์ ์ผ์ดํฐ๋ง ์๋น์ค๋ฅผ ๋ฐํํฉ๋๋ค.
+
+ Args:
+ query: ์ผ์ดํฐ๋ง ์๋น์ค ๊ฒ์์ด
+ """
+ # ์์ ์ผ์ดํฐ๋ง ์๋น์ค์ ํ์
+ services = {
+ "Gotham Catering Co.": 4.9,
+ "Wayne Manor Catering": 4.8,
+ "Gotham City Events": 4.7,
+ }
+
+ # ํ์ ์ด ๊ฐ์ฅ ๋์ ์๋น์ค ์ฐพ๊ธฐ(๊ฒ์์ด ํํฐ๋ง ์๋ฎฌ๋ ์ด์
)
+ best_service = max(services, key=services.get)
+
+ return best_service
+
+class SuperheroPartyThemeTool(Tool):
+ name = "superhero_party_theme_generator"
+ description = """
+ ์ด ๋๊ตฌ๋ ์นดํ
๊ณ ๋ฆฌ์ ๋ฐ๋ผ ์ฐฝ์์ ์ธ ์ํผํ์ด๋ก ํ
๋ง ํํฐ ์์ด๋์ด๋ฅผ ์ ์ํฉ๋๋ค.
+ ๊ณ ์ ํ ํํฐ ํ
๋ง ์์ด๋์ด๋ฅผ ๋ฐํํฉ๋๋ค."""
+
+ inputs = {
+ "category": {
+ "type": "string",
+ "description": "์ํผํ์ด๋ก ํํฐ ์ ํ(์: 'classic heroes', 'villain masquerade', 'futuristic Gotham')",
+ }
+ }
+
+ output_type = "string"
+
+ def forward(self, category: str):
+ themes = {
+ "classic heroes": "Justice League Gala: ์๋๋ค์ด DC ์์
์ผ๋ก ๋ถ์ฅํ๊ณ 'ํฌ๋ฆฝํ ๋์ดํธ ํ์น' ๊ฐ์ ํ
๋ง ์นตํ
์ผ์ ์ฆ๊น๋๋ค.",
+ "villain masquerade": "Gotham Rogues' Ball: ์๋๋ค์ด ๋ฐฐํธ๋งจ ๋น๋ฐ์ผ๋ก ๋ถ์ฅํ๋ ์ ๋น๋ก์ด ๊ฐ๋ฉด๋ฌด๋ํ.",
+ "futuristic Gotham": "Neo-Gotham Night: ๋ฐฐํธ๋งจ ๋น์๋์์ ์๊ฐ์ ๋ฐ์ ์ฌ์ด๋ฒํํฌ ์คํ์ผ ํํฐ, ๋ค์จ ์ฅ์๊ณผ ๋ฏธ๋ํ ์ํ.",
+ }
+
+ return themes.get(category.lower(), "ํ
๋ง ํํฐ ์์ด๋์ด๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. 'classic heroes', 'villain masquerade', 'futuristic Gotham' ์ค์์ ์๋ํด๋ณด์ธ์.")
+
+
+# Alfred๊ฐ ํํฐ ๋ฉ๋ด๋ฅผ ์ค๋นํฉ๋๋ค
+agent = CodeAgent(
+ tools=[
+ DuckDuckGoSearchTool(),
+ VisitWebpageTool(),
+ suggest_menu,
+ catering_service_tool,
+ SuperheroPartyThemeTool(),
+ FinalAnswerTool()
+ ],
+ model=InferenceClientModel(),
+ max_steps=10,
+ verbosity_level=2
+)
+
+agent.run("์จ์ธ ์ ํ์์ ์ด๋ฆฌ๋ ํํฐ์ ์ด์ธ๋ฆฌ๋ ์ต๊ณ ์ ํ๋ ์ด๋ฆฌ์คํธ๋ฅผ ์ถ์ฒํด์ค. ํํฐ ํ
๋ง๋ '๋น๋ฐ ๊ฐ๋ฉด๋ฌด๋ํ'์ผ")
+```
+
+์ด์ฒ๋ผ ์ฌ๋ฌ ๋๊ตฌ๋ฅผ ๊ฒฐํฉํด `CodeAgent`๋ฅผ ๋ง๋ค๋ฉด, ์ปค๋ฎค๋ํฐ์ ๊ณต์ ํ ์ ์๋ ๊ถ๊ทน์ ํํฐ ํ๋๋๊ฐ ์์ฑ๋ฉ๋๋ค! ๐
+
+์ด์ ์ฌ๋ฌ๋ถ ์ฐจ๋ก์
๋๋ค: ์์ ๋ง์ ์์ด์ ํธ๋ฅผ ๋ง๋ค์ด ํ๋ธ์ ๊ณต์ ํด๋ณด์ธ์! ๐ต๏ธโโ๏ธ๐ก
+
+
+์ฌ๋ฌ๋ถ์ ์์ด์ ํธ ํ๋ก์ ํธ๋ฅผ ๊ณต์ ํ๊ณ ์ถ๋ค๋ฉด, Hugging Face Hub์ space๋ฅผ ๋ง๋ค๊ณ agents-course ํ๊ทธ๋ฅผ ๋ฌ์์ฃผ์ธ์. ์ฌ๋ฌ๋ถ์ ์ํ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค!
+
+
+### OpenTelemetry์ Langfuse๋ก ํํฐ ์ค๋น ์์ด์ ํธ ์ถ์ ํ๊ธฐ ๐ก
+
+Alfred๋ ํํฐ ์ค๋น ์์ด์ ํธ๋ฅผ ๋ค๋ฌ์ผ๋ฉด์ ์คํ์ ๋๋ฒ๊น
ํ๋ ๋ฐ ์ง์ณ๊ฐ๊ณ ์์ต๋๋ค. ์์ด์ ํธ๋ ๋ณธ์ง์ ์ผ๋ก ์์ธก ๋ถ๊ฐ๋ฅํ๊ณ , ๋์์ ์ถ์ ํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์
๋๋ค. ํ์ง๋ง ๊ถ๊ทน์ ํํฐ ์ค๋น ์์ด์ ํธ๋ฅผ ๋ง๋ค์ด ๋ฐฐํฌํ๋ ค๋ฉด, ๋ฏธ๋์ ๋ชจ๋ํฐ๋ง๊ณผ ๋ถ์์ ์ํ ๊ฐ๋ ฅํ ์ถ์ ๊ธฐ๋ฅ์ด ํ์ํฉ๋๋ค.
+
+์ฌ๊ธฐ์๋ `smolagents`๊ฐ ํด๊ฒฐ์ฑ
์ ์ ๊ณตํฉ๋๋ค! [OpenTelemetry](https://opentelemetry.io/) ํ์ค์ ์ฑํํด ์์ด์ ํธ ์คํ์ ๊ณ์ธกํ๊ณ , [Langfuse](https://langfuse.com/) ๋ฐ `SmolagentsInstrumentor`๋ฅผ ํตํด ๋์์ ์ฝ๊ฒ ์ถ์ ยท๋ถ์ํ ์ ์์ต๋๋ค.
+
+์ค์ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋จํฉ๋๋ค!
+
+๋จผ์ , ํ์ํ ์์กด์ฑ์ ์ค์นํฉ๋๋ค:
+
+```bash
+pip install opentelemetry-sdk opentelemetry-exporter-otlp openinference-instrumentation-smolagents
+```
+
+Alfred๋ ์ด๋ฏธ Langfuse ๊ณ์ ์ ๋ง๋ค๊ณ API ํค๋ฅผ ์ค๋นํ์ต๋๋ค. ์์ง ๊ณ์ ์ด ์๋ค๋ฉด [์ฌ๊ธฐ](https://cloud.langfuse.com/)์์ ๊ฐ์
ํ๊ฑฐ๋ [๋์](https://huggingface.co/docs/smolagents/tutorials/inspect_runs)์ ์ฐธ๊ณ ํ์ธ์.
+
+API ํค๋ฅผ ์๋์ ๊ฐ์ด ํ๊ฒฝ ๋ณ์๋ก ์ค์ ํฉ๋๋ค:
+
+```python
+import os
+import base64
+
+LANGFUSE_PUBLIC_KEY="pk-lf-..."
+LANGFUSE_SECRET_KEY="sk-lf-..."
+LANGFUSE_AUTH=base64.b64encode(f"{LANGFUSE_PUBLIC_KEY}:{LANGFUSE_SECRET_KEY}".encode()).decode()
+
+os.environ["OTEL_EXPORTER_OTLP_ENDPOINT"] = "https://cloud.langfuse.com/api/public/otel" # EU ๋ฐ์ดํฐ ๋ฆฌ์
+# os.environ["OTEL_EXPORTER_OTLP_ENDPOINT"] = "https://us.cloud.langfuse.com/api/public/otel" # US ๋ฐ์ดํฐ ๋ฆฌ์
+os.environ["OTEL_EXPORTER_OTLP_HEADERS"] = f"Authorization=Basic {LANGFUSE_AUTH}"
+```
+
+๋ง์ง๋ง์ผ๋ก, `SmolagentsInstrumentor`๋ฅผ ์ด๊ธฐํํด ์ถ์ ์ ์์ํฉ๋๋ค.
+
+```python
+from opentelemetry.sdk.trace import TracerProvider
+
+from openinference.instrumentation.smolagents import SmolagentsInstrumentor
+from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
+from opentelemetry.sdk.trace.export import SimpleSpanProcessor
+
+trace_provider = TracerProvider()
+trace_provider.add_span_processor(SimpleSpanProcessor(OTLPSpanExporter()))
+
+SmolagentsInstrumentor().instrument(tracer_provider=trace_provider)
+```
+
+์ด์ Alfred๋ ์ฐ๊ฒฐ ์๋ฃ! ๐ `smolagents`์ ์คํ์ด Langfuse์ ๊ธฐ๋ก๋์ด, ์์ด์ ํธ์ ๋์์ ์๋ฒฝํ๊ฒ ์ถ์ ํ ์ ์์ต๋๋ค. ์ด ์ค์ ์ผ๋ก ์ด์ ์คํ์ ๋ค์ ํ์ธํ๊ณ , ํํฐ ์ค๋น ์์ด์ ํธ๋ฅผ ๋์ฑ ๊ฐ์ ํ ์ ์์ต๋๋ค.
+
+์์ด์ ํธ ์ถ์ ๋ฐ ํ๊ฐ ๋ฐ์ดํฐ ํ์ฉ๋ฒ์ ๋ณด๋์ค 2๋จ์์์ ๋ ์์ธํ ๋ค๋ฃน๋๋ค.
+
+```python
+from smolagents import CodeAgent, InferenceClientModel
+
+agent = CodeAgent(tools=[], model=InferenceClientModel())
+alfred_agent = agent.from_hub('sergiopaniego/AlfredAgent', trust_remote_code=True)
+alfred_agent.run("์จ์ธ ์ ํ์์ ์ด๋ฆฌ๋ ํํฐ์ ์ด์ธ๋ฆฌ๋ ์ต๊ณ ์ ํ๋ ์ด๋ฆฌ์คํธ๋ฅผ ์ถ์ฒํด์ค. ํํฐ ํ
๋ง๋ '๋น๋ฐ ๊ฐ๋ฉด๋ฌด๋ํ'์ผ")
+```
+
+Alfred๋ ์ด์ [์ฌ๊ธฐ](https://cloud.langfuse.com/project/cm7bq0abj025rad078ak3luwi/traces/995fc019255528e4f48cf6770b0ce27b?timestamp=2025-02-19T10%3A28%3A36.929Z)์์ ๋ก๊ทธ๋ฅผ ํ์ธํ๊ณ ๋ถ์ํ ์ ์์ต๋๋ค.
+
+
+์คํ ์ค์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ก๊ทธ์์ ์ค๋ฅ๋ฅผ ์ฐพ์๋ณผ ์ ์๋์? ์์ด์ ํธ๊ฐ ์ด๋ป๊ฒ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ ํจํ ๋ต์ ๋ฐํํ๋์ง ์ถ์ ํด๋ณด์ธ์. ์ฌ๊ธฐ์์ ์ค๋ฅ๋ฅผ ์ง์ ํ์ธํ ์ ์์ต๋๋ค. ๋ฌผ๋ก ์ค๋ฅ๋ ์ด๋ฏธ ์์ ๋์์ผ๋ฉฐ, ์์ธํ ๋ด์ฉ์ ์ด ์ด์์์ ํ์ธํ ์ ์์ต๋๋ค.
+
+
+ํํธ, [์ถ์ฒ ํ๋ ์ด๋ฆฌ์คํธ](https://open.spotify.com/playlist/0gZMMHjuxMrrybQ7wTMTpw)๊ฐ ํํฐ ์ค๋น ๋ถ์๊ธฐ๋ฅผ ์์ฑํด์ค๋๋ค. ๋ฉ์ง์ฃ ? ๐ถ
+
+---
+
+์ด์ ์ฒซ ๋ฒ์งธ ์ฝ๋ ์์ด์ ํธ๋ฅผ ๋ง๋ค์์ผ๋, **์ด์ smolagents์์ ์ ๊ณตํ๋ ๋ ๋ฒ์งธ ์์ด์ ํธ ์ ํ์ธ Tool Calling Agent ๋ง๋๋ ๋ฒ**์ ๋ฐฐ์๋ด
์๋ค.
+
+## ์ฐธ๊ณ ์๋ฃ
+
+- [smolagents ๋ธ๋ก๊ทธ](https://huggingface.co/blog/smolagents) - smolagents ๋ฐ ์ฝ๋ ์ธํฐ๋์
์๊ฐ
+- [smolagents: ์ข์ ์์ด์ ํธ ๋ง๋ค๊ธฐ](https://huggingface.co/docs/smolagents/tutorials/building_good_agents) - ์ ๋ขฐ์ฑ ๋์ ์์ด์ ํธ ๊ตฌ์ถ์ ์ํ ๋ฒ ์คํธ ํ๋ํฐ์ค
+- [Anthropic: ํจ๊ณผ์ ์ธ ์์ด์ ํธ ๋ง๋ค๊ธฐ](https://www.anthropic.com/research/building-effective-agents) - ์์ด์ ํธ ์ค๊ณ ์์น
+- [OpenTelemetry๋ก ์คํ ๊ณต์ ํ๊ธฐ](https://huggingface.co/docs/smolagents/tutorials/inspect_runs) - ์์ด์ ํธ ์ถ์ ์ค์ ๋ฐฉ๋ฒ
diff --git a/units/ko/unit2/smolagents/conclusion.mdx b/units/ko/unit2/smolagents/conclusion.mdx
new file mode 100644
index 00000000..a50f77b2
--- /dev/null
+++ b/units/ko/unit2/smolagents/conclusion.mdx
@@ -0,0 +1,11 @@
+# ๊ฒฐ๋ก
+
+`smolagents` ๋ชจ๋(2๋จ์)์ ๋ง์น ๊ฒ์ ์ถํํฉ๋๋ค ๐ฅณ
+
+์ด์ `smolagents`์ ๊ธฐ๋ณธ์ ๋ง์คํฐํ๊ณ , ๋๋ง์ ์์ด์ ํธ๋ ๋ง๋ค์ด๋ณด์์ต๋๋ค! ์ด์ ์ฌ๋ฌ๋ถ์ ๊ด์ฌ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์์ด์ ํธ๋ฅผ ์ง์ ๋ง๋ค ์ ์๋ ์ญ๋์ ๊ฐ์ถ์์ต๋๋ค.
+
+๋ค์ ๋ชจ๋์์๋ **LlamaIndex๋ก ์์ด์ ํธ ๋ง๋๋ ๋ฒ**์ ๋ฐฐ์ธ ์์ ์
๋๋ค.
+
+๋ง์ง๋ง์ผ๋ก, **์ด ๊ณผ์ ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฒฌ๊ณผ ๊ฐ์ ์ **์ ๋ฃ๊ณ ์ถ์ต๋๋ค. ํผ๋๋ฐฑ์ด ์๋ค๋ฉด ๐ [์ด ์์](https://docs.google.com/forms/d/e/1FAIpQLSe9VaONn0eglax0uTwi29rIn4tM7H2sYmmybmG5jJNlE5v0xA/viewform?usp=dialog)์ ์์ฑํด ์ฃผ์ธ์.
+
+### ๊ณ์ ๋ฐฐ์ฐ๊ณ , ๋ฉ์ง ํ๋ฃจ ๋ณด๋ด์ธ์ ๐ค
diff --git a/units/ko/unit2/smolagents/final_quiz.mdx b/units/ko/unit2/smolagents/final_quiz.mdx
new file mode 100644
index 00000000..28658723
--- /dev/null
+++ b/units/ko/unit2/smolagents/final_quiz.mdx
@@ -0,0 +1,25 @@
+# ์ํ ์๊ฐ!
+
+`smolagents` ํ์ต์ ๋ง์น ์ฌ๋ฌ๋ถ, ์ ๋ง ์๊ณ ๋ง์ผ์
จ์ต๋๋ค! ์ด์ ํด์ฆ๋ก ์ฌ๋ฌ๋ถ์ ์ง์์ ์ ๊ฒํด๋ณผ ์๊ฐ์
๋๋ค. ๐ง
+
+## ์๋ด์ฌํญ
+
+- ํด์ฆ๋ ์ฝ๋ ๋ฌธ์ ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
+- ์ฝ๋ ์กฐ๊ฐ์ ์์ฑํ๋ ์ง์์ฌํญ์ด ์ฃผ์ด์ง๋๋ค.
+- ์๋ด๋ฅผ ์ ์ฝ๊ณ , ์ฝ๋ ์กฐ๊ฐ์ ์์ฑํด ์ฃผ์ธ์.
+- ๊ฐ ๋ฌธ์ ๋ง๋ค ๊ฒฐ๊ณผ์ ํผ๋๋ฐฑ์ด ์ ๊ณต๋ฉ๋๋ค.
+
+๐ง **์ด ํด์ฆ๋ ์ ์ํ๋๊ฑฐ๋ ์ธ์ฆ๋์ง ์์ต๋๋ค**. ์ฌ๋ฌ๋ถ์ด `smolagents` ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ดํดํ๋์ง, ์ถ๊ฐ ํ์ต์ด ํ์ํ์ง ์ค์ค๋ก ์ ๊ฒํ๋ ์ฉ๋์
๋๋ค. ๋ค์ ๋จ์์์๋ ์ด ์ง์์ ์ค์ ์ฌ๋ก์ ํ๋ก์ ํธ์ ์ ์ฉํด๋ณผ ์์ ์
๋๋ค.
+
+์์ํด๋ณผ๊น์?
+
+## ํด์ฆ ๐
+
+
+
+ํด์ฆ์ ์ง์ ์ฐธ์ฌํ๋ ค๋ฉด ๐ [์ฌ๊ธฐ](https://huggingface.co/spaces/agents-course/unit2_smolagents_quiz)๋ก ์ด๋ํ์ธ์.
\ No newline at end of file
diff --git a/units/ko/unit2/smolagents/introduction.mdx b/units/ko/unit2/smolagents/introduction.mdx
new file mode 100644
index 00000000..569d43f5
--- /dev/null
+++ b/units/ko/unit2/smolagents/introduction.mdx
@@ -0,0 +1,67 @@
+# `smolagents` ์๊ฐ
+
+
+
+์ด ๋ชจ๋์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค! ์ฌ๊ธฐ์๋ [`smolagents`](https://github.com/huggingface/smolagents) ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํด **ํจ๊ณผ์ ์ธ ์์ด์ ํธ ๋ง๋๋ ๋ฒ**์ ๋ฐฐ์๋๋ค. `smolagents`๋ ๊ฐ๋ ฅํ AI ์์ด์ ํธ๋ฅผ ์์ฝ๊ฒ ๋ง๋ค ์ ์๋๋ก ๋์์ฃผ๋ ๊ฒฝ๋ ํ๋ ์์ํฌ์
๋๋ค.
+
+`smolagents`๋ Hugging Face์์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค. [`์ ์ฅ์`](https://github.com/huggingface/smolagents)์ **๋ณ(star)**์ ๋๋ฌ ์์ํด ์ฃผ์ธ์!
+
+
+## ๋ชจ๋ ๊ฐ์
+
+์ด ๋ชจ๋์์๋ `smolagents`๋ฅผ ํ์ฉํด ์ง๋ฅํ ์์ด์ ํธ๋ฅผ ๋ง๋๋ ๋ฐ ํ์ํ ํต์ฌ ๊ฐ๋
๊ณผ ์ค์ ์ ๋ต์ ํญ๋๊ฒ ๋ค๋ฃน๋๋ค.
+
+์๋ง์ ์คํ์์ค ํ๋ ์์ํฌ๊ฐ ์กด์ฌํ๋ ๋งํผ, `smolagents`์ ๊ตฌ์ฑ ์์์ ์ฅ๋จ์ ์ ์ดํดํ๊ณ , ์ธ์ ๋ค๋ฅธ ์๋ฃจ์
์ด ๋ ์ ํฉํ ์ง ํ๋จํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
+
+์ด ๋จ์์์๋ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ํนํ๋ ์ฝ๋ ์์ด์ ํธ, ๋ชจ๋ํ ์ํฌํ๋ก์ฐ๋ฅผ ์ํ ํด ํธ์ถ ์์ด์ ํธ, ์ ๋ณด๋ฅผ ๊ฒ์ยท์ข
ํฉํ๋ ๋ฆฌํธ๋ฆฌ๋ฒ ์์ด์ ํธ ๋ฑ ์ฃผ์ ์์ด์ ํธ ์ ํ์ ์ดํด๋ด
๋๋ค.
+
+๋ํ ์ฌ๋ฌ ์์ด์ ํธ๋ฅผ ์กฐํฉํ๋ ๋ฐฉ๋ฒ, ๋น์ ๊ธฐ๋ฅ ๋ฐ ์น ๋ธ๋ผ์ฐ์ง ํตํฉ ๋ฑ ๋์ ์ด๊ณ ์ํฉ ์ธ์์ด ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋๋ ๋ฐฉ๋ฒ๋ ๋ค๋ฃน๋๋ค.
+
+์ด๋ฒ ๋จ์์์๋ 1๋จ์์์ ๋ง๋ ์์ด์ ํธ Alfred๊ฐ ๋ค์ ๋ฑ์ฅํฉ๋๋ค. ์ด๋ฒ์๋ `smolagents` ํ๋ ์์ํฌ๋ฅผ ํ์ฉํด ๋ค์ํ ์์
์ ํด๊ฒฐํฉ๋๋ค. Alfred๋ Wayne ์ ํ์์ ํํฐ๋ฅผ ์ค๋นํ๋ฉฐ ์ฌ๋ฌ ๊ณผ์ ๋ฅผ ํด๊ฒฐํด์ผ ํฉ๋๋ค. Alfred์ ์ฌ์ ์ ๋ฐ๋ผ๊ฐ๋ฉฐ `smolagents`์ ํต์ฌ ๊ฐ๋
์ ํจ๊ป ์ตํ๋ด
์๋ค!
+
+
+์ด ๋จ์์์๋ `smolagents` ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก AI ์์ด์ ํธ๋ฅผ ๋ง๋๋ ๋ฒ์ ๋ฐฐ์๋๋ค. ์ฌ๋ฌ๋ถ์ ์์ด์ ํธ๋ ๋ฐ์ดํฐ ๊ฒ์, ์ฝ๋ ์คํ, ์นํ์ด์ง ์ํธ์์ฉ์ด ๊ฐ๋ฅํ๋ฉฐ, ์ฌ๋ฌ ์์ด์ ํธ๋ฅผ ์กฐํฉํด ๋ ๊ฐ๋ ฅํ ์์คํ
๋ ๋ง๋ค ์ ์์ต๋๋ค.
+
+
+
+
+## ๋ชฉ์ฐจ
+
+์ด ๋จ์์์ ๋ค๋ฃจ๋ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
+
+### 1๏ธโฃ [์ smolagents๋ฅผ ์ฌ์ฉํ ๊น](./why_use_smolagents)
+
+`smolagents`๋ ๋ค์ํ ์คํ์์ค ์์ด์ ํธ ํ๋ ์์ํฌ ์ค ํ๋์
๋๋ค. ๋์์ผ๋ก๋ `LlamaIndex`, `LangGraph` ๋ฑ์ด ์์ผ๋ฉฐ, ์ด ๊ณผ์ ์ ๋ค๋ฅธ ๋ชจ๋์์ ๋ค๋ฃน๋๋ค. `smolagents`๋ ํน์ ์ํฉ์ ์ ํฉํ ์ฌ๋ฌ ์ฃผ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, ํ๋ ์์ํฌ ์ ํ ์ ํญ์ ๋ค์ํ ์ต์
์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์ด ์ฅ์์๋ `smolagents`์ ์ฅ๋จ์ ์ ์ดํด๋ณด๊ณ , ํ๋ก์ ํธ ์๊ตฌ์ ๋ฐ๋ผ ํ๋ช
ํ๊ฒ ์ ํํ ์ ์๋๋ก ๋์์ค๋๋ค.
+
+### 2๏ธโฃ [CodeAgents](./code_agents)
+
+`CodeAgents`๋ `smolagents`์ ๊ธฐ๋ณธ ์์ด์ ํธ ์ ํ์
๋๋ค. ์ด๋ค์ JSON์ด๋ ํ
์คํธ ๋์ ํ์ด์ฌ ์ฝ๋๋ฅผ ์์ฑํด ์์
์ ์ํํฉ๋๋ค. ์ด ์ฅ์์๋ CodeAgent์ ๋ชฉ์ , ๋์ ๋ฐฉ์, ์ค์ ์์๋ฅผ ํตํด ๊ทธ ๊ธฐ๋ฅ์ ์ดํด๋ด
๋๋ค.
+
+### 3๏ธโฃ [ToolCallingAgents](./tool_calling_agents)
+
+`ToolCallingAgents`๋ `smolagents`๊ฐ ์ง์ํ๋ ๋ ๋ฒ์งธ ์์ด์ ํธ ์ ํ์
๋๋ค. CodeAgent๊ฐ ํ์ด์ฌ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ, ์ด ์์ด์ ํธ๋ ์์คํ
์ด ํ์ฑยทํด์ํด์ผ ํ๋ JSON/ํ
์คํธ ๋ธ๋กญ์ ์์ฑํฉ๋๋ค. ์ด ์ฅ์์๋ ToolCallingAgent์ ๋์ ๋ฐฉ์, CodeAgent์์ ์ฐจ์ด์ , ์ฌ์ฉ ์์๋ฅผ ๋ค๋ฃน๋๋ค.
+
+### 4๏ธโฃ [๋๊ตฌ(Tools)](./tools)
+
+1๋จ์์์ ์ดํด๋ณธ ๊ฒ์ฒ๋ผ, ๋๊ตฌ๋ LLM์ด ์์ด์ ํธ ์์คํ
๋ด์์ ์ฌ์ฉํ ์ ์๋ ํจ์๋ก, ์์ด์ ํธ ํ๋์ ํต์ฌ ๋น๋ฉ ๋ธ๋ก์
๋๋ค. ์ด ์ฅ์์๋ ๋๊ตฌ ์์ฑ๋ฒ, ๊ตฌ์กฐ, `Tool` ํด๋์ค์ `@tool` ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํ์ฉํ ๋ค์ํ ๊ตฌํ ๋ฐฉ๋ฒ์ ๋ค๋ฃน๋๋ค. ๊ธฐ๋ณธ ๋๊ตฌ ์์, ์ปค๋ฎค๋ํฐ์ ๋๊ตฌ ๊ณต์ , ์ปค๋ฎค๋ํฐ ๋๊ตฌ ๋ถ๋ฌ์ค๊ธฐ ๋ฑ๋ ๋ฐฐ์๋๋ค.
+
+### 5๏ธโฃ [๋ฆฌํธ๋ฆฌ๋ฒ ์์ด์ ํธ(Retrieval Agents)](./retrieval_agents)
+
+๋ฆฌํธ๋ฆฌ๋ฒ ์์ด์ ํธ๋ ๋ชจ๋ธ์ด ์ง์ ๋ฒ ์ด์ค์ ์ ๊ทผํ ์ ์๊ฒ ํ์ฌ, ๋ค์ํ ์์ค์์ ์ ๋ณด๋ฅผ ๊ฒ์ยท์ข
ํฉยท์ถ์ถํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ค์ ๋ฒกํฐ ์คํ ์ด๋ฅผ ํ์ฉํด ํจ์จ์ ์ผ๋ก ์ ๋ณด๋ฅผ ์ฐพ๊ณ , **RAG(Retrieval-Augmented Generation)** ํจํด์ ๊ตฌํํฉ๋๋ค. ์น ๊ฒ์๊ณผ ๋ง์ถคํ ์ง์ ๋ฒ ์ด์ค ํตํฉ, ๋ํ ๋งฅ๋ฝ ์ ์ง ๋ฑ ๋ค์ํ ์ ๋ต์ ๋ค๋ฃน๋๋ค.
+
+### 6๏ธโฃ [๋ฉํฐ ์์ด์ ํธ ์์คํ
(Multi-Agent Systems)](./multi_agent_systems)
+
+์ฌ๋ฌ ์์ด์ ํธ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์กฐ์จํ๋ ๊ฒ์ ๊ฐ๋ ฅํ ๋ฉํฐ ์์ด์ ํธ ์์คํ
๊ตฌ์ถ์ ํต์ฌ์
๋๋ค. ์น ๊ฒ์ ์์ด์ ํธ์ ์ฝ๋ ์คํ ์์ด์ ํธ ๋ฑ ๋ค์ํ ๋ฅ๋ ฅ์ ๊ฐ์ง ์์ด์ ํธ๋ฅผ ์กฐํฉํด ๋ ์ ๊ตํ ์๋ฃจ์
์ ๋ง๋ค ์ ์์ต๋๋ค. ์ด ์ฅ์์๋ ๋ฉํฐ ์์ด์ ํธ ์์คํ
์ ์ค๊ณ, ๊ตฌํ, ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ ๋ค๋ฃน๋๋ค.
+
+### 7๏ธโฃ [๋น์ ๋ฐ ๋ธ๋ผ์ฐ์ ์์ด์ ํธ(Vision and Browser agents)](./vision_agents)
+
+๋น์ ์์ด์ ํธ๋ **๋น์ -์ธ์ด ๋ชจ๋ธ(VLM)**์ ํตํฉํด ์๊ฐ ์ ๋ณด๋ฅผ ์ฒ๋ฆฌยทํด์ํ ์ ์์ต๋๋ค. ์ด ์ฅ์์๋ VLM ๊ธฐ๋ฐ ์์ด์ ํธ ์ค๊ณยทํตํฉ๋ฒ, ์ด๋ฏธ์ง ๊ธฐ๋ฐ ์ถ๋ก , ์๊ฐ ๋ฐ์ดํฐ ๋ถ์, ๋ฉํฐ๋ชจ๋ฌ ์ํธ์์ฉ ๋ฑ์ ๋ค๋ฃน๋๋ค. ๋ํ ๋น์ ์์ด์ ํธ๋ฅผ ํ์ฉํด ์น์ ํ์ํ๊ณ ์ ๋ณด๋ฅผ ์ถ์ถํ๋ ๋ธ๋ผ์ฐ์ ์์ด์ ํธ๋ ๋ง๋ค์ด๋ด
๋๋ค.
+
+## ์ฐธ๊ณ ์๋ฃ
+
+- [smolagents ๊ณต์ ๋ฌธ์](https://huggingface.co/docs/smolagents)
+- [ํจ๊ณผ์ ์ธ ์์ด์ ํธ ๋ง๋ค๊ธฐ](https://www.anthropic.com/research/building-effective-agents) - ์์ด์ ํธ ์ํคํ
์ฒ ์ฐ๊ตฌ ๋
ผ๋ฌธ
+- [์์ด์ ํธ ๊ฐ์ด๋๋ผ์ธ](https://huggingface.co/docs/smolagents/tutorials/building_good_agents) - ์ ๋ขฐ์ฑ ๋์ ์์ด์ ํธ ๊ตฌ์ถ์ ์ํ ๋ฒ ์คํธ ํ๋ํฐ์ค
+- [LangGraph Agents](https://langchain-ai.github.io/langgraph/) - ๋ค์ํ ์์ด์ ํธ ๊ตฌํ ์์
+- [Function Calling Guide](https://platform.openai.com/docs/guides/function-calling) - LLM์ ํจ์ ํธ์ถ ์ดํดํ๊ธฐ
+- [RAG ๋ฒ ์คํธ ํ๋ํฐ์ค](https://www.pinecone.io/learn/retrieval-augmented-generation/) - ํจ๊ณผ์ ์ธ RAG ๊ตฌํ ๊ฐ์ด๋
diff --git a/units/ko/unit2/smolagents/multi_agent_systems.mdx b/units/ko/unit2/smolagents/multi_agent_systems.mdx
new file mode 100644
index 00000000..820c5479
--- /dev/null
+++ b/units/ko/unit2/smolagents/multi_agent_systems.mdx
@@ -0,0 +1,381 @@
+
+
+# ๋ฉํฐ ์์ด์ ํธ ์์คํ
+
+๋ฉํฐ ์์ด์ ํธ ์์คํ
์ **ํนํ๋ ์์ด์ ํธ๋ค์ด ํ๋ ฅํ์ฌ ๋ณต์กํ ์์
์ ํด๊ฒฐ**ํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, ๋ชจ๋์ฑ, ํ์ฅ์ฑ, ๊ฒฌ๊ณ ์ฑ์ ๋์ฌ์ค๋๋ค. ๋จ์ผ ์์ด์ ํธ์ ์์กดํ๋ ๋์ , ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ฅ๋ ฅ์ ๊ฐ์ง ์์ด์ ํธ๋ค์ด ์์
์ ๋ถ๋ดํฉ๋๋ค.
+
+**smolagents**์์๋ ๋ค์ํ ์์ด์ ํธ๋ฅผ ๊ฒฐํฉํด ํ์ด์ฌ ์ฝ๋ ์์ฑ, ์ธ๋ถ ๋๊ตฌ ํธ์ถ, ์น ๊ฒ์ ๋ฑ ๋ค์ํ ์์
์ ์ํํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์์ด์ ํธ๋ค์ ์กฐ์จํจ์ผ๋ก์จ ๊ฐ๋ ฅํ ์ํฌํ๋ก์ฐ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
+
+์ผ๋ฐ์ ์ธ ๊ตฌ์ฑ ์์:
+- **๋งค๋์ ์์ด์ ํธ**: ์์
๋ถ๋ฐฐ ๋ด๋น
+- **์ฝ๋ ์ธํฐํ๋ฆฌํฐ ์์ด์ ํธ**: ์ฝ๋ ์คํ ๋ด๋น
+- **์น ๊ฒ์ ์์ด์ ํธ**: ์ ๋ณด ๊ฒ์ ๋ด๋น
+
+์๋ ๋ค์ด์ด๊ทธ๋จ์ **๋งค๋์ ์์ด์ ํธ**๊ฐ **์ฝ๋ ์ธํฐํ๋ฆฌํฐ ๋๊ตฌ**์ **์น ๊ฒ์ ์์ด์ ํธ**๋ฅผ ์กฐ์จํ๋ ๊ฐ๋จํ ๋ฉํฐ ์์ด์ ํธ ์ํคํ
์ฒ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์น ๊ฒ์ ์์ด์ ํธ๋ `DuckDuckGoSearchTool`๊ณผ `VisitWebpageTool` ๊ฐ์ ๋๊ตฌ๋ฅผ ํ์ฉํด ์ ๋ณด๋ฅผ ์์งํฉ๋๋ค.
+
+
+
+## ๋ฉํฐ ์์ด์ ํธ ์์คํ
์ค์ ์์
+
+๋ฉํฐ ์์ด์ ํธ ์์คํ
์ ์ฌ๋ฌ ํนํ ์์ด์ ํธ๊ฐ **์ค์ผ์คํธ๋ ์ดํฐ ์์ด์ ํธ**์ ์กฐ์จ ์๋ ํ๋ ฅํ๋ ๊ตฌ์กฐ์
๋๋ค. ์ด ๋ฐฉ์์ ์ญํ ์ด ๋ค๋ฅธ ์์ด์ ํธ๋ค์๊ฒ ์์
์ ๋ถ์ฐ์์ผ ๋ณต์กํ ์ํฌํ๋ก์ฐ๋ฅผ ๊ตฌํํ ์ ์๊ฒ ํด์ค๋๋ค.
+
+์๋ฅผ ๋ค์ด, **๋ฉํฐ ์์ด์ ํธ RAG ์์คํ
**์ ๋ค์์ ํตํฉํ ์ ์์ต๋๋ค:
+- **์น ์์ด์ ํธ**: ์ธํฐ๋ท ๋ธ๋ผ์ฐ์ง ๋ด๋น
+- **๋ฆฌํธ๋ฆฌ๋ฒ ์์ด์ ํธ**: ์ง์ ๋ฒ ์ด์ค ์ ๋ณด ๊ฒ์ ๋ด๋น
+- **์ด๋ฏธ์ง ์์ฑ ์์ด์ ํธ**: ์๊ฐ ์๋ฃ ์์ฑ ๋ด๋น
+
+์ด ๋ชจ๋ ์์ด์ ํธ๋ ์ค์ผ์คํธ๋ ์ดํฐ๊ฐ ์์
๋ถ๋ฐฐ์ ์ํธ์์ฉ์ ๊ด๋ฆฌํฉ๋๋ค.
+
+## ๋ฉํฐ ์์ด์ ํธ ๊ณ์ธต ๊ตฌ์กฐ๋ก ๋ณต์กํ ๋ฌธ์ ํด๊ฒฐํ๊ธฐ
+
+
+์ด ๋
ธํธ๋ถ์ ๋ฐ๋ผ๊ฐ๋ฉฐ ์ฝ๋๋ฅผ ์ง์ ์คํํด๋ณผ ์ ์์ต๋๋ค.
+
+
+๋ฆฌ์
์
์ด ๋ค๊ฐ์ค๊ณ ์์ต๋๋ค! ์ฌ๋ฌ๋ถ์ ๋์์ผ๋ก Alfred๋ ๊ฑฐ์ ๋ชจ๋ ์ค๋น๋ฅผ ๋ง์ณค์ต๋๋ค.
+
+ํ์ง๋ง ๋ฌธ์ ๊ฐ ์๊ฒผ์ต๋๋ค: ๋ฐฐํธ๋ชจ๋น์ด ์ฌ๋ผ์ก์ต๋๋ค. Alfred๋ ๋์ฒด ์ฐจ๋์ ๋นจ๋ฆฌ ์ฐพ์์ผ ํฉ๋๋ค.
+
+๋คํํ ๋ธ๋ฃจ์ค ์จ์ธ์ ์ถ์ ๋ค๋ฃฌ ๋ฐ์ด์คํฝ ์ํ๊ฐ ๋ช ํธ ์ ์๋์์ผ๋, Alfred๋ ์ํ ์ธํธ์ฅ์ ๋จ๊ฒจ์ง ์ฐจ๋์ ์ฐพ์ ํ๋์์ผ๋ก ๊ฐ์กฐํ ์ ์์์ง๋ ๋ชจ๋ฆ
๋๋ค. ๋ฌผ๋ก ์์จ์ฃผํ ๊ธฐ๋ฅ๋ ํ์๊ฒ ์ฃ .
+
+ํ์ง๋ง ์ด ์ฐจ๋๋ค์ ์ ์ธ๊ณ ์ดฌ์์ง ์ด๋์๋ ์์ ์ ์์ต๋๋ค.
+
+๊ทธ๋์ Alfred๋ ์ฌ๋ฌ๋ถ์ ๋์์ด ํ์ํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ์์ด์ ํธ๋ฅผ ๋ง๋ค์ด๋ณผ๊น์?
+
+> ๐ ์ ์ธ๊ณ ๋ฐฐํธ๋งจ ์ดฌ์์ง๋ฅผ ๋ชจ๋ ์ฐพ์, ๊ณ ๋ด(40.7128ยฐ N, 74.0060ยฐ W)๊น์ง ํ๋ฌผ์ (๋นํ๊ธฐ)์ผ๋ก ์ด๋ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๊ณ์ฐํ๊ณ , ์ด๋ฅผ ์ง๋์ ํ์ํ์ธ์. ์ด๋ ์๊ฐ์ ๋ฐ๋ผ ์์์ ๋ค๋ฅด๊ฒ ํ๊ณ , ์ํผ์นด ๊ณต์ฅ๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํ์ํ์ธ์.
+
+ํจ๊ป ๋ง๋ค์ด๋ด
์๋ค!
+
+์ด ์์์๋ ์ถ๊ฐ ํจํค์ง๊ฐ ํ์ํ๋ ๋จผ์ ์ค์นํด ์ฃผ์ธ์:
+
+```bash
+pip install 'smolagents[litellm]' plotly geopandas shapely kaleido -q
+```
+
+### ๋จผ์ ํ๋ฌผ๊ธฐ ์ด๋ ์๊ฐ ๊ณ์ฐ ๋๊ตฌ๋ฅผ ๋ง๋ญ๋๋ค.
+
+```python
+import math
+from typing import Optional, Tuple
+
+from smolagents import tool
+
+
+@tool
+def calculate_cargo_travel_time(
+ origin_coords: Tuple[float, float],
+ destination_coords: Tuple[float, float],
+ cruising_speed_kmh: Optional[float] = 750.0, # ํ๋ฌผ๊ธฐ ํ๊ท ์๋
+) -> float:
+ """
+ ๋ ์ง์ (์๋, ๊ฒฝ๋) ๊ฐ ํ๋ฌผ๊ธฐ ์ด๋ ์๊ฐ์ ๋๊ถ๊ฑฐ๋ฆฌ๋ก ๊ณ์ฐํฉ๋๋ค.
+
+ Args:
+ origin_coords: ์ถ๋ฐ์ง (์๋, ๊ฒฝ๋) ํํ
+ destination_coords: ๋์ฐฉ์ง (์๋, ๊ฒฝ๋) ํํ
+ cruising_speed_kmh: ์ํญ ์๋(km/h, ๊ธฐ๋ณธ๊ฐ 750)
+
+ Returns:
+ float: ์์ ์ด๋ ์๊ฐ(์๊ฐ ๋จ์)
+
+ Example:
+ >>> # ์์นด๊ณ (41.8781ยฐ N, 87.6298ยฐ W) โ ์๋๋(33.8688ยฐ S, 151.2093ยฐ E)
+ >>> result = calculate_cargo_travel_time((41.8781, -87.6298), (-33.8688, 151.2093))
+ """
+
+ def to_radians(degrees: float) -> float:
+ return degrees * (math.pi / 180)
+
+ # ์ขํ ๋ณํ
+ lat1, lon1 = map(to_radians, origin_coords)
+ lat2, lon2 = map(to_radians, destination_coords)
+
+ # ์ง๊ตฌ ๋ฐ์ง๋ฆ(km)
+ EARTH_RADIUS_KM = 6371.0
+
+ # haversine ๊ณต์์ผ๋ก ๋๊ถ๊ฑฐ๋ฆฌ ๊ณ์ฐ
+ dlon = lon2 - lon1
+ dlat = lat2 - lat1
+
+ a = (
+ math.sin(dlat / 2) ** 2
+ + math.cos(lat1) * math.cos(lat2) * math.sin(dlon / 2) ** 2
+ )
+ c = 2 * math.asin(math.sqrt(a))
+ distance = EARTH_RADIUS_KM * c
+
+ # ์ฐํ ๊ฒฝ๋ก, ๊ด์ ๋ฑ ๊ฐ์ํด 10% ์ถ๊ฐ
+ actual_distance = distance * 1.1
+
+ # ๋นํ ์๊ฐ ๊ณ์ฐ(์ด์ฐฉ๋ฅ 1์๊ฐ ์ถ๊ฐ)
+ flight_time = (actual_distance / cruising_speed_kmh) + 1.0
+
+ return round(flight_time, 2)
+
+
+print(calculate_cargo_travel_time((41.8781, -87.6298), (-33.8688, 151.2093)))
+```
+
+### ์์ด์ ํธ ์ค์ ํ๊ธฐ
+
+๋ชจ๋ธ ์ ๊ณต์๋ Together AI๋ฅผ ์ฌ์ฉํฉ๋๋ค. GoogleSearchTool์ [Serper API](https://serper.dev)๋ฅผ ์ฌ์ฉํ๋ฏ๋ก, ํ๊ฒฝ ๋ณ์ `SERPAPI_API_KEY`(provider="serpapi") ๋๋ `SERPER_API_KEY`(provider=serper)๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค.
+
+Serp API๊ฐ ์๋ค๋ฉด `DuckDuckGoSearchTool`์ ์ฌ์ฉํ ์ ์์ง๋ง, ์๋ ์ ํ์ ์ ์ํ์ธ์.
+
+```python
+import os
+from PIL import Image
+from smolagents import CodeAgent, GoogleSearchTool, InferenceClientModel, VisitWebpageTool
+
+model = InferenceClientModel(model_id="Qwen/Qwen2.5-Coder-32B-Instruct", provider="together")
+```
+
+๊ฐ๋จํ ์์ด์ ํธ๋ฅผ ๋ง๋ค์ด ๊ธฐ๋ณธ ๋ฆฌํฌํธ๋ฅผ ๋ฐ์๋ด
์๋ค.
+
+```python
+task = """์ ์ธ๊ณ ๋ฐฐํธ๋งจ ์ดฌ์์ง๋ฅผ ๋ชจ๋ ์ฐพ์, ๊ณ ๋ด(40.7128ยฐ N, 74.0060ยฐ W)๊น์ง ํ๋ฌผ๊ธฐ๋ก ์ด๋ํ๋ ์๊ฐ์ ๊ณ์ฐํด pandas ๋ฐ์ดํฐํ๋ ์์ผ๋ก ๋ฐํํ์ธ์. ์ํผ์นด ๊ณต์ฅ๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํฌํจํ์ธ์."""
+```
+
+```python
+agent = CodeAgent(
+ model=model,
+ tools=[GoogleSearchTool("serper"), VisitWebpageTool(), calculate_cargo_travel_time],
+ additional_authorized_imports=["pandas"],
+ max_steps=20,
+)
+```
+
+```python
+result = agent.run(task)
+```
+
+```python
+result
+```
+
+์คํ ๊ฒฐ๊ณผ ์์:
+
+```python
+| | Location | Travel Time to Gotham (hours) |
+|--|------------------------------------------------------|------------------------------|
+| 0 | Necropolis Cemetery, Glasgow, Scotland, UK | 8.60 |
+| 1 | St. George's Hall, Liverpool, England, UK | 8.81 |
+| 2 | Two Temple Place, London, England, UK | 9.17 |
+| 3 | Wollaton Hall, Nottingham, England, UK | 9.00 |
+| 4 | Knebworth House, Knebworth, Hertfordshire, UK | 9.15 |
+| 5 | Acton Lane Power Station, Acton Lane, Acton, UK | 9.16 |
+| 6 | Queensboro Bridge, New York City, USA | 1.01 |
+| 7 | Wall Street, New York City, USA | 1.00 |
+| 8 | Mehrangarh Fort, Jodhpur, Rajasthan, India | 18.34 |
+| 9 | Turda Gorge, Turda, Romania | 11.89 |
+| 10 | Chicago, USA | 2.68 |
+| 11 | Hong Kong, China | 19.99 |
+| 12 | Cardington Studios, Northamptonshire, UK | 9.10 |
+| 13 | Warner Bros. Leavesden Studios, Hertfordshire, UK | 9.13 |
+| 14 | Westwood, Los Angeles, CA, USA | 6.79 |
+| 15 | Woking, UK (McLaren) | 9.13 |
+```
+
+๊ณํ ๋จ๊ณ(planning step)๋ฅผ ์ถ๊ฐํ๊ณ ํ๋กฌํํธ๋ฅผ ๋ณด๊ฐํ๋ฉด ๋ ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
+
+๊ณํ ๋จ๊ณ๋ ์์ด์ ํธ๊ฐ ๋ค์ ๋จ๊ณ๋ฅผ ๋ฏธ๋ฆฌ ์๊ฐํ๊ณ ๊ณํํ ์ ์๊ฒ ํด์ค๋๋ค.
+
+```python
+agent.planning_interval = 4
+
+detailed_report = agent.run(f"""
+์ฌ๋ฌ๋ถ์ ์ ๋ฌธ ๋ถ์๊ฐ์
๋๋ค. ์ฌ๋ฌ ์น์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํด ์ข
ํฉ ๋ฆฌํฌํธ๋ฅผ ์์ฑํฉ๋๋ค.
+for ๋ฃจํ๋ฅผ ํ์ฉํด ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ฅผ ํ ๋ฒ์ ๊ฒ์ํ์ธ์.
+๊ฐ ๋ฐ์ดํฐ ํฌ์ธํธ๋ง๋ค ์์ค URL์ ๋ฐฉ๋ฌธํด ์์น๋ฅผ ํ์ธํ์ธ์.
+
+{task}
+""")
+
+print(detailed_report)
+```
+
+```python
+detailed_report
+```
+
+์คํ ๊ฒฐ๊ณผ ์์:
+
+```python
+| | Location | Travel Time (hours) |
+|--|--------------------------------------------------|---------------------|
+| 0 | Bridge of Sighs, Glasgow Necropolis, Glasgow, UK | 8.6 |
+| 1 | Wishart Street, Glasgow, Scotland, UK | 8.6 |
+```
+
+์ด์ฒ๋ผ ํ๋กฌํํธ์ ๊ณํ ๊ธฐ๋ฅ๋ง์ผ๋ก๋ ํจ์ฌ ๊ฐ๊ฒฐํ ๋ฆฌํฌํธ๋ฅผ ์ป์ ์ ์์ต๋๋ค!
+
+๋ชจ๋ธ์ ์ปจํ
์คํธ ์๋์ฐ๊ฐ ๋น ๋ฅด๊ฒ ์ฑ์์ง๋๋ค. **๋ฐ๋ผ์ ์์ธ ๊ฒ์ ๊ฒฐ๊ณผ์ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐํฉํ๋๋ก ์์ฒญํ๋ฉด ๋๋ ค์ง๊ณ ํ ํฐยท๋น์ฉ์ด ๊ธ์ฆํ ์ ์์ต๋๋ค.**
+
+โก๏ธ ์์คํ
๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํด์ผ ํฉ๋๋ค.
+
+### โ๏ธ ๋ ์์ด์ ํธ๋ก ์์
๋ถํ ํ๊ธฐ
+
+๋ฉํฐ ์์ด์ ํธ ๊ตฌ์กฐ๋ ์๋ก ๋ค๋ฅธ ํ์ ์์
์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ถ๋ฆฌํด ๋ ๊ฐ์ง ํฐ ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
+- ๊ฐ ์์ด์ ํธ๊ฐ ํต์ฌ ์์
์ ์ง์คํด ์ฑ๋ฅ์ด ํฅ์๋ฉ๋๋ค.
+- ๋ฉ๋ชจ๋ฆฌ ๋ถ๋ฆฌ๋ก ๊ฐ ๋จ๊ณ์ ์
๋ ฅ ํ ํฐ ์๊ฐ ์ค์ด, ์ง์ฐ๊ณผ ๋น์ฉ์ด ๊ฐ์ํฉ๋๋ค.
+
+์น ๊ฒ์ ์ ๋ด ์์ด์ ํธ์ ์ด๋ฅผ ๊ด๋ฆฌํ๋ ๋งค๋์ ์์ด์ ํธ๋ก ํ์ ๋ง๋ค์ด๋ด
์๋ค.
+
+๋งค๋์ ์์ด์ ํธ๋ ์ต์ข
๋ฆฌํฌํธ ์์ฑ์ ์ํด ์ถ๊ฐ import(`plotly`, `geopandas`, `shapely`)๊ฐ ํ์ํฉ๋๋ค.
+
+```python
+model = InferenceClientModel(
+ "Qwen/Qwen2.5-Coder-32B-Instruct", provider="together", max_tokens=8096
+)
+
+web_agent = CodeAgent(
+ model=model,
+ tools=[
+ GoogleSearchTool(provider="serper"),
+ VisitWebpageTool(),
+ calculate_cargo_travel_time,
+ ],
+ name="web_agent",
+ description="์น์์ ์ ๋ณด๋ฅผ ์ฐพ๋ ์ญํ ",
+ verbosity_level=0,
+ max_steps=10,
+)
+```
+
+๋งค๋์ ์์ด์ ํธ๋ ๋ ๊ฐ๋ ฅํ ๋ชจ๋ธ [DeepSeek-R1](https://huggingface.co/deepseek-ai/DeepSeek-R1)์ ์ฌ์ฉํ๊ณ , `planning_interval`๋ ์ถ๊ฐํฉ๋๋ค.
+
+```python
+from smolagents.utils import encode_image_base64, make_image_url
+from smolagents import OpenAIServerModel
+
+
+def check_reasoning_and_plot(final_answer, agent_memory):
+ multimodal_model = OpenAIServerModel("gpt-4o", max_tokens=8096)
+ filepath = "saved_map.png"
+ assert os.path.exists(filepath), "saved_map.png ํ์ผ์ด ์ ์ฅ๋์ด์ผ ํฉ๋๋ค!"
+ image = Image.open(filepath)
+ prompt = (
+ f"๋ค์์ ์ฌ์ฉ์ ์์ฒญ๊ณผ ์์ด์ ํธ ๋จ๊ณ์
๋๋ค: {agent_memory.get_succinct_steps()}. ์๋๋ ์์ฑ๋ ์ง๋์
๋๋ค."
+ "์ถ๋ก ๊ณผ์ ๊ณผ ์ง๋๊ฐ ์์ฒญ์ ์ฌ๋ฐ๋ฅด๊ฒ ํด๊ฒฐํ๋์ง ํ์ธํ์ธ์."
+ "๋จผ์ ์ด์ ๋ฅผ ๋์ดํ ๋ค, ์ต์ข
๊ฒฐ์ (PASS/FAIL)์ ์์ฑํ์ธ์."
+ "๋๋ฌด ์๊ฒฉํ ํ์๋ ์์ต๋๋ค. ๋๋ถ๋ถ ํด๊ฒฐํ๋ค๋ฉด PASS์
๋๋ค."
+ "์ง๋๋ px.scatter_map์ผ๋ก ๋ง๋ค์ด์ผ PASS์
๋๋ค."
+ )
+ messages = [
+ {
+ "role": "user",
+ "content": [
+ {
+ "type": "text",
+ "text": prompt,
+ },
+ {
+ "type": "image_url",
+ "image_url": {"url": make_image_url(encode_image_base64(image))},
+ },
+ ],
+ }
+ ]
+ output = multimodal_model(messages).content
+ print("ํผ๋๋ฐฑ: ", output)
+ if "FAIL" in output:
+ raise Exception(output)
+ return True
+
+
+manager_agent = CodeAgent(
+ model=InferenceClientModel("deepseek-ai/DeepSeek-R1", provider="together", max_tokens=8096),
+ tools=[calculate_cargo_travel_time],
+ managed_agents=[web_agent],
+ additional_authorized_imports=[
+ "geopandas",
+ "plotly",
+ "shapely",
+ "json",
+ "pandas",
+ "numpy",
+ ],
+ planning_interval=5,
+ verbosity_level=2,
+ final_answer_checks=[check_reasoning_and_plot],
+ max_steps=15,
+)
+```
+
+์ด ํ์ ๊ตฌ์กฐ๋ฅผ ์๊ฐํํด๋ด
์๋ค:
+
+```python
+manager_agent.visualize()
+```
+
+์๋์ ๊ฐ์ด ๊ตฌ์กฐ์ ๋๊ตฌ ์ฌ์ฉ ๊ด๊ณ๋ฅผ ํ๋์ ๋ณผ ์ ์์ต๋๋ค:
+
+```python
+CodeAgent | deepseek-ai/DeepSeek-R1
+โโโ โ
Authorized imports: ['geopandas', 'plotly', 'shapely', 'json', 'pandas', 'numpy']
+โโโ ๐ ๏ธ Tools:
+โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโณโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโณโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
+โ โ Name โ Description โ Arguments โ
+โ โกโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฉ
+โ โ calculate_cargo_travel_time โ ๋ ์ง์ ๊ฐ ํ๋ฌผ๊ธฐ ์ด๋ ์๊ฐ ๊ณ์ฐ โ origin_coords (`array`): ์ถ๋ฐ์ง ์ขํ โ
+โ โ โ โ destination_coords (`array`): ๋์ฐฉ์ง โ
+โ โ โ โ cruising_speed_kmh (`number`): ์๋ โ
+โ โ final_answer โ ๋ฌธ์ ์ ๋ํ ์ต์ข
๋ต๋ณ ์ ๊ณต โ answer (`any`): ์ต์ข
๋ต๋ณ โ
+โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
+โโโ ๐ค Managed agents:
+ โโโ web_agent | CodeAgent | Qwen/Qwen2.5-Coder-32B-Instruct
+ โโโ โ
Authorized imports: []
+ โโโ ๐ Description: ์น์์ ์ ๋ณด๋ฅผ ์ฐพ๋ ์ญํ
+ โโโ ๐ ๏ธ Tools:
+ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโณโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโณโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
+ โ Name โ Description โ Arguments โ
+ โกโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฉ
+ โ web_search โ ๊ตฌ๊ธ ์น ๊ฒ์ ์ํ โ query (`string`): ๊ฒ์์ด โ
+ โ โ โ filter_year (`integer`): ์ฐ๋ ์ ํ โ
+ โ visit_webpage โ ์นํ์ด์ง ๋ฐฉ๋ฌธ ๋ฐ ๋ด์ฉ ์ฝ๊ธฐ โ url (`string`): ๋ฐฉ๋ฌธํ URL โ
+ โ calculate_cargo_travel_time โ ๋ ์ง์ ๊ฐ ํ๋ฌผ๊ธฐ ์ด๋ ์๊ฐ ๊ณ์ฐ โ origin_coords (`array`): ์ถ๋ฐ์ง โ
+ โ โ โ destination_coords (`array`): ๋์ฐฉ์งโ
+ โ โ โ cruising_speed_kmh (`number`): ์๋ โ
+ โ final_answer โ ๋ฌธ์ ์ ๋ํ ์ต์ข
๋ต๋ณ ์ ๊ณต โ answer (`any`): ์ต์ข
๋ต๋ณ โ
+ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
+```
+
+```python
+manager_agent.run("""
+์ ์ธ๊ณ ๋ฐฐํธ๋งจ ์ดฌ์์ง๋ฅผ ๋ชจ๋ ์ฐพ์, ๊ณ ๋ด(40.7128ยฐ N, 74.0060ยฐ W)๊น์ง ํ๋ฌผ๊ธฐ๋ก ์ด๋ํ๋ ์๊ฐ์ ๊ณ์ฐํ์ธ์. ์ํผ์นด ๊ณต์ฅ๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํฌํจํด ์ด 6๊ฐ ์ด์ ์ง์ ์ ์ง๋์ ์ฐ์ ๋๋ก ํ์ํ๊ณ , ์ด๋ ์๊ฐ์ ๋ฐ๋ผ ์์์ ๋ค๋ฅด๊ฒ ํ์ธ์. ๊ฒฐ๊ณผ ์ด๋ฏธ์ง๋ saved_map.png๋ก ์ ์ฅํ์ธ์!
+
+์ง๋ ์์:
+import plotly.express as px
+df = px.data.carshare()
+fig = px.scatter_map(df, lat="centroid_lat", lon="centroid_lon", text="name", color="peak_hour", size=100,
+ color_continuous_scale=px.colors.sequential.Magma, size_max=15, zoom=1)
+fig.show()
+fig.write_image("saved_image.png")
+final_answer(fig)
+
+๋ฌธ์์ด์ ์ฝ๋๋ก ์ฒ๋ฆฌํ์ง ๋ง์ธ์. ๋ฌธ์์ด์ด ์์ผ๋ฉด print๋ก ์ถ๋ ฅํ์ธ์.
+""")
+```
+
+์ ์คํ์์๋ ๋งค๋์ ์์ด์ ํธ๊ฐ ์น ์์ด์ ํธ์๊ฒ `1. ๋ฐฐํธ๋งจ ์ดฌ์์ง ๊ฒ์`, `2. ์ํผ์นด ๊ณต์ฅ ์ฐพ๊ธฐ`๋ก ์์
์ ๋ถ๋ฐฐํ ๋ค, ๊ฒฐ๊ณผ๋ฅผ ์ง๊ณํด ์ง๋๋ฅผ ๊ทธ๋ ธ์ต๋๋ค.
+
+์์ด์ ํธ ์ํ์์ ์ง๋๋ฅผ ์ง์ ํ์ธํด๋ด
์๋ค:
+
+```python
+manager_agent.python_executor.state["fig"]
+```
+
+์๋์ ๊ฐ์ด ์ง๋๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค:
+
+
+
+## ์ฐธ๊ณ ์๋ฃ
+
+- [๋ฉํฐ ์์ด์ ํธ ์์คํ
](https://huggingface.co/docs/smolagents/main/en/examples/multiagents) โ ๋ฉํฐ ์์ด์ ํธ ์์คํ
๊ฐ์
+- [Agentic RAG๋?](https://weaviate.io/blog/what-is-agentic-rag) โ Agentic RAG ์๊ฐ
+- [Multi-Agent RAG System ๐ค๐ค๐ค ๋ ์ํผ](https://huggingface.co/learn/cookbook/multiagent_rag_system) โ ๋จ๊ณ๋ณ ๊ตฌ์ถ ๊ฐ์ด๋
diff --git a/units/ko/unit2/smolagents/quiz1.mdx b/units/ko/unit2/smolagents/quiz1.mdx
new file mode 100644
index 00000000..a5ad07e4
--- /dev/null
+++ b/units/ko/unit2/smolagents/quiz1.mdx
@@ -0,0 +1,142 @@
+# ์๊ท๋ชจ ํด์ฆ(๋น์ฑ์ ) [[quiz1]]
+
+`smolagents`์ ๋ํ ์ดํด๋๋ฅผ ๊ฐ๋จํ ํด์ฆ๋ก ํ์ธํด๋ด
์๋ค! ์ค์ค๋ก ํ
์คํธํด๋ณด๋ฉด ํ์ต ๋ด์ฉ์ ๊ฐํํ๊ณ , ๋ณต์ต์ด ํ์ํ ๋ถ๋ถ์ ํ์
ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
+
+์ด ํด์ฆ๋ ์ ํ ์ฌํญ์ด๋ฉฐ ์ ์ํ๋์ง ์์ต๋๋ค.
+
+### Q1: `smolagents`๋ฅผ ๋ค๋ฅธ ํ๋ ์์ํฌ๋ณด๋ค ์ ํํ ๋์ ์ฃผ์ ์ฅ์ ์ ๋ฌด์์ธ๊ฐ์?
+๋ค์ ์ค `smolagents` ์ ๊ทผ ๋ฐฉ์์ ํต์ฌ ๊ฐ์ ์ ๊ฐ์ฅ ์ ์ค๋ช
ํ๋ ๋ฌธ์ฅ์ ๋ฌด์์ธ๊ฐ์?
+
+
+
+---
+
+### Q2: ์ด๋ค ์ํฉ์์ smolagents๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ ํฉํ ๊น์?
+๋ค์ ์ค smolagents์ ํน์ฑ๊ณผ ๊ฐ์ฅ ์ ๋ง๋ ์ํฉ์ ๋ฌด์์ธ๊ฐ์?
+
+
+
+---
+
+### Q3: smolagents์ ๋ชจ๋ธ ํตํฉ ์ ์ฐ์ฑ์ ๋ํด ์ฌ๋ฐ๋ฅด๊ฒ ์ค๋ช
ํ ๊ฒ์?
+smolagents๊ฐ LLM๊ณผ ์ํธ์์ฉํ๋ ๋ฐฉ์์ ๊ฐ์ฅ ์ ์ค๋ช
ํ๋ ๋ฌธ์ฅ์ ๊ณ ๋ฅด์ธ์.
+
+
+
+---
+
+### Q4: smolagents๋ ์ฝ๋ ๊ธฐ๋ฐ ์ก์
๊ณผ JSON ๊ธฐ๋ฐ ์ก์
์ ๋ํด ์ด๋ป๊ฒ ์ ๊ทผํ๋์?
+๋ค์ ์ค smolagents์ ์ก์
ํฌ๋งท ์ฒ ํ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ค๋ช
ํ ๋ฌธ์ฅ์?
+
+
+
+---
+
+### Q5: smolagents๊ฐ Hugging Face Hub์ ํตํฉ๋์ด ์ป์ ์ ์๋ ์ด์ ์?
+Hub ํตํฉ์ ํต์ฌ ์ฅ์ ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ค๋ช
ํ ๋ฌธ์ฅ์?
+
+
+
+---
+
+ํด์ฆ๋ฅผ ๋ชจ๋ ๋ง์ณค์ต๋๋ค! ๐ ํ๋ฆฐ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด *์ smolagents๋ฅผ ์ฌ์ฉํ ๊น* ์น์
์ ๋ณต์ตํด๋ณด์ธ์. ์ ํ์๋ค๋ฉด, ์ด์ smolagents์ ๋ ๊ณ ๊ธ ์ฃผ์ ๋ก ๋์ด๊ฐ ์ค๋น๊ฐ ๋์์ต๋๋ค!
diff --git a/units/ko/unit2/smolagents/quiz2.mdx b/units/ko/unit2/smolagents/quiz2.mdx
new file mode 100644
index 00000000..50794bcc
--- /dev/null
+++ b/units/ko/unit2/smolagents/quiz2.mdx
@@ -0,0 +1,142 @@
+# ์๊ท๋ชจ ํด์ฆ(๋น์ฑ์ ) [[quiz2]]
+
+*Code Agents*, *Tool Calling Agents*, *Tools* ์น์
์ ๋ํ ์ดํด๋๋ฅผ ํ
์คํธํด๋ด
์๋ค. ์ด ํด์ฆ๋ ์ ํ ์ฌํญ์ด๋ฉฐ ์ ์ํ๋์ง ์์ต๋๋ค.
+
+---
+
+### Q1: smolagents์์ `@tool` ๋ฐ์ฝ๋ ์ดํฐ๋ก ๋๊ตฌ๋ฅผ ๋ง๋๋ ๊ฒ๊ณผ `Tool` ์๋ธํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ์ ํต์ฌ ์ฐจ์ด๋?
+๋ ๋ฐฉ์์ ๋๊ตฌ ์ ์ ์ฐจ์ด๋ฅผ ๊ฐ์ฅ ์ ์ค๋ช
ํ๋ ๋ฌธ์ฅ์ ๊ณ ๋ฅด์ธ์.
+
+@tool ๋ฐ์ฝ๋ ์ดํฐ๋ ๋ฆฌํธ๋ฆฌ๋ฒ ๊ธฐ๋ฐ ๋๊ตฌ์๋ง ํ์์ด๊ณ , Tool
์๋ธํด๋์ค๋ ํ
์คํธ ์์ฑ ์์
์๋ง ์ฌ์ฉ๋๋ค",
+ explain: "๋ ๋ฐฉ์ ๋ชจ๋ ์ด๋ค ์ ํ์ ๋๊ตฌ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.",
+ },
+ {
+ text: "@tool
๋ฐ์ฝ๋ ์ดํฐ๋ ๊ฐ๋จํ ํจ์ํ ๋๊ตฌ์ ๊ถ์ฅ๋๊ณ , Tool
์๋ธํด๋์ค๋ ๋ณต์กํ ๊ธฐ๋ฅ์ด๋ ์ปค์คํ
๋ฉํ๋ฐ์ดํฐ๊ฐ ํ์ํ ๋ ๋ ์ ์ฐํ๋ค",
+ explain: "์ ๋ต์
๋๋ค. ๋ฐ์ฝ๋ ์ดํฐ ๋ฐฉ์์ด ๋ ๊ฐ๋จํ๊ณ , ์๋ธํด๋์ฑ์ ๋ง์ถค ๋์์ ์ ํฉํฉ๋๋ค.",
+ correct: true
+ },
+ {
+ text: "@tool
์ ๋ฉํฐ ์์ด์ ํธ ์์คํ
์์๋ง ์ธ ์ ์๊ณ , Tool
์๋ธํด๋์ค๋ ๋จ์ผ ์์ด์ ํธ์๋ง ์ธ ์ ์๋ค",
+ explain: "๋ชจ๋ ์์ด์ ํธ(๋จ์ผ/๋ฉํฐ)์์ ๋ ๋ฐฉ์ ๋ชจ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.",
+ },
+ {
+ text: "@tool
๋ก ํจ์์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ฌ๋ฉด docstring์ด ํ์ ์๊ณ , ์๋ธํด๋์ค๋ docstring์ ํฌํจํ๋ฉด ์ ๋๋ค",
+ explain: "๋ ๋ฐฉ์ ๋ชจ๋ ๋ช
ํํ docstring์ด ํ์ํฉ๋๋ค.",
+ }
+]}
+/>
+
+---
+
+### Q2: CodeAgent๋ ReAct(Reason + Act) ์ ๊ทผ๋ฒ์ผ๋ก ๋ค๋จ๊ณ ์์
์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์?
+CodeAgent๊ฐ ์ผ๋ จ์ ๋จ๊ณ๋ฅผ ์คํํด ๋ฌธ์ ๋ฅผ ํธ๋ ๋ฐฉ์์ ์ฌ๋ฐ๋ฅด๊ฒ ์ค๋ช
ํ ๋ฌธ์ฅ์ ๊ณ ๋ฅด์ธ์.
+
+
+
+---
+
+### Q3: ๋๊ตฌ๋ฅผ Hugging Face Hub์ ๊ณต์ ํ ๋์ ์ฃผ์ ์ฅ์ ์?
+๊ฐ๋ฐ์๊ฐ ์ปค์คํ
๋๊ตฌ๋ฅผ ์
๋ก๋ยท๊ณต์ ํ๋ ๊ฐ์ฅ ํฐ ์ด์ ๋ฅผ ๊ณ ๋ฅด์ธ์.
+
+
+
+---
+
+### Q4: ToolCallingAgent์ CodeAgent์ ์ก์
์คํ ๋ฐฉ์ ์ฐจ์ด์ ๋ํด ์ฌ๋ฐ๋ฅธ ์ค๋ช
์?
+ToolCallingAgent์ ๋์ ๋ฐฉ์์ ๊ฐ์ฅ ์ ์ค๋ช
ํ ๋ฌธ์ฅ์ ๊ณ ๋ฅด์ธ์.
+
+
+
+---
+
+### Q5: smolagents ๊ธฐ๋ณธ ๋๊ตฌ ์์์๋ ๋ฌด์์ด ํฌํจ๋์ด ์๊ณ , ์ ์ฌ์ฉํ ๊น์?
+๊ธฐ๋ณธ ๋๊ตฌ ์์์ ๋ชฉ์ ๊ณผ ๋ด์ฉ์ ๊ฐ์ฅ ์ ์ค๋ช
ํ ๋ฌธ์ฅ์ ๊ณ ๋ฅด์ธ์.
+
+
+
+---
+
+ํด์ฆ๋ฅผ ๋ชจ๋ ๋ง์ณค์ต๋๋ค! ๐ ์ด๋ ค์ ๋ ๋ฌธ์ ๋ *Code Agents*, *Tool Calling Agents*, *Tools* ์น์
์ ๋ณต์ตํด๋ณด์ธ์. ๋ชจ๋ ๋ง์ท๋ค๋ฉด, robustํ smolagents ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค ์ค๋น๊ฐ ๋ ๊ฒ์
๋๋ค!
diff --git a/units/ko/unit2/smolagents/retrieval_agents.mdx b/units/ko/unit2/smolagents/retrieval_agents.mdx
new file mode 100644
index 00000000..684538d6
--- /dev/null
+++ b/units/ko/unit2/smolagents/retrieval_agents.mdx
@@ -0,0 +1,168 @@
+
+
+# ์์ด์ ํฑ RAG ์์คํ
๊ตฌ์ถํ๊ธฐ
+
+
+์ฝ๋๋ ์ด ๋
ธํธ๋ถ์์ ๋ฐ๋ผํ ์ ์์ต๋๋ค. Google Colab์์ ์คํํ ์ ์์ต๋๋ค.
+
+
+Retrieval Augmented Generation(RAG) ์์คํ
์ ๋ฐ์ดํฐ ๊ฒ์๊ณผ ์์ฑ ๋ชจ๋ธ์ ๋ฅ๋ ฅ์ ๊ฒฐํฉํ์ฌ ์ํฉ์ ๋ง๋ ๋ต๋ณ์ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์์ ์ง๋ฌธ์ด ๊ฒ์ ์์ง์ ์ ๋ฌ๋๊ณ , ๊ฒ์๋ ๊ฒฐ๊ณผ๊ฐ ์ง๋ฌธ๊ณผ ํจ๊ป ๋ชจ๋ธ์ ์ ๊ณต๋ฉ๋๋ค. ๋ชจ๋ธ์ ์ง๋ฌธ๊ณผ ๊ฒ์๋ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ๋ต๋ณ์ ์์ฑํฉ๋๋ค.
+
+์์ด์ ํฑ RAG(๊ฒ์ ์ฆ๊ฐ ์์ฑ)๋ **์์จ ์์ด์ ํธ์ ๋์ ์ง์ ๊ฒ์**์ ๊ฒฐํฉํ์ฌ ๊ธฐ์กด RAG ์์คํ
์ ํ์ฅํฉ๋๋ค.
+
+๊ธฐ์กด RAG ์์คํ
์ LLM์ด ๊ฒ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก ๋ต๋ณ์ ์์ฑํ์ง๋ง, ์์ด์ ํฑ RAG๋ **๊ฒ์๊ณผ ์์ฑ ๊ณผ์ ์ ์ง๋ฅ์ ์ผ๋ก ์ ์ด**ํ์ฌ ํจ์จ์ฑ๊ณผ ์ ํ์ฑ์ ๋์
๋๋ค.
+
+๊ธฐ์กด RAG ์์คํ
์ ์ฃผ์ ํ๊ณ๋ **๋จ์ผ ๊ฒ์ ๋จ๊ณ์ ์์กด**ํ๊ณ , ์ฌ์ฉ์์ ์ง๋ฌธ๊ณผ ์ง์ ์ ์ธ ์๋ฏธ์ ์ ์ฌ์ฑ์๋ง ์ง์คํ์ฌ ๊ด๋ จ ์ ๋ณด๋ฅผ ๋์น ์ ์๋ค๋ ์ ์
๋๋ค.
+
+์์ด์ ํฑ RAG๋ ์์ด์ ํธ๊ฐ ๊ฒ์ ์ฟผ๋ฆฌ๋ฅผ ์์จ์ ์ผ๋ก ์์ฑํ๊ณ , ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋นํ์ ์ผ๋ก ํ๊ฐํ๋ฉฐ, ์ฌ๋ฌ ๋ฒ์ ๊ฒ์ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ๋ ๋ง์ถคํ๋๊ณ ํฌ๊ด์ ์ธ ์ถ๋ ฅ์ ์์ฑํ ์ ์๋๋ก ํฉ๋๋ค.
+
+## DuckDuckGo๋ฅผ ํ์ฉํ ๊ธฐ๋ณธ ๊ฒ์
+
+์ด์ DuckDuckGo๋ฅผ ์ฌ์ฉํด ์น์ ๊ฒ์ํ๋ ๊ฐ๋จํ ์์ด์ ํธ๋ฅผ ๋ง๋ค์ด๋ด
์๋ค. ์ด ์์ด์ ํธ๋ ์ ๋ณด๋ฅผ ๊ฒ์ํ๊ณ , ๋ต๋ณ์ ์ข
ํฉํ์ฌ ์ง๋ฌธ์ ๋ตํฉ๋๋ค. ์์ด์ ํฑ RAG๋ฅผ ํ์ฉํ๋ฉด Alfred์ ์์ด์ ํธ๋ ๋ค์๊ณผ ๊ฐ์ ์ผ์ ํ ์ ์์ต๋๋ค:
+
+* ์ต์ ์ํผํ์ด๋ก ํํฐ ํธ๋ ๋ ๊ฒ์
+* ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๊ธ์ค๋ฌ์ด ์์๋ก ์ธ๋ถํ
+* ์ ๋ณด๋ฅผ ์ข
ํฉํ์ฌ ์์ฑ๋ ๊ณํ ์ ์
+
+Alfred์ ์์ด์ ํธ๊ฐ ์ด๋ฅผ ์ด๋ป๊ฒ ์ํํ๋์ง ์ดํด๋ด
์๋ค:
+
+```python
+from smolagents import CodeAgent, DuckDuckGoSearchTool, InferenceClientModel
+
+# ๊ฒ์ ๋๊ตฌ ์ด๊ธฐํ
+search_tool = DuckDuckGoSearchTool()
+
+# ๋ชจ๋ธ ์ด๊ธฐํ
+model = InferenceClientModel()
+
+agent = CodeAgent(
+ model=model,
+ tools=[search_tool],
+)
+
+# ์์ ์ฌ์ฉ๋ฒ
+response = agent.run(
+ "Search for luxury superhero-themed party ideas, including decorations, entertainment, and catering."
+)
+print(response)
+```
+
+์์ด์ ํธ์ ๋์ ๊ณผ์ :
+
+1. **์์ฒญ ๋ถ์:** Alfred์ ์์ด์ ํธ๋ ์ฟผ๋ฆฌ์ ํต์ฌ ์์(๊ณ ๊ธ ์ํผํ์ด๋ก ํ
๋ง ํํฐ, ์ฅ์, ์ํฐํ
์ธ๋จผํธ, ์ผ์ดํฐ๋ง ๋ฑ)๋ฅผ ํ์
ํฉ๋๋ค.
+2. **๊ฒ์ ์ํ:** DuckDuckGo๋ฅผ ํ์ฉํด Alfred์ ๊ณ ๊ธ์ค๋ฌ์ด ์ทจํฅ์ ๋ง๋ ์ต์ ์ ๋ณด๋ฅผ ๊ฒ์ํฉ๋๋ค.
+3. **์ ๋ณด ์ข
ํฉ:** ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ํํฐ์ ๋ชจ๋ ์ธก๋ฉด์ ์์ฐ๋ฅด๋ ์คํ ๊ฐ๋ฅํ ๊ณํ์ ๋ง๋ญ๋๋ค.
+4. **์ ๋ณด ์ ์ฅ:** ๊ฒ์๋ ์ ๋ณด๋ฅผ ์ ์ฅํด, ์ดํ ํํฐ ์ค๋น ์ ํจ์จ์ ์ผ๋ก ์ฌํ์ฉํ ์ ์์ต๋๋ค.
+
+## ๋ง์ถคํ ์ง์ ๋ฒ ์ด์ค ๋๊ตฌ
+
+ํน์ ์์
์๋ ๋ง์ถคํ ์ง์ ๋ฒ ์ด์ค๊ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๊ธฐ์ ๋ฌธ์๋ ์ ๋ฌธ ์ง์์ ์ฟผ๋ฆฌํ๋ ๋๊ตฌ๋ฅผ ๋ง๋ค์ด๋ด
์๋ค. ์๋ฏธ์ ๊ฒ์์ ํตํด Alfred์ ์๊ตฌ์ ๊ฐ์ฅ ์ ํฉํ ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
+
+๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํ
์คํธ๋ ๊ธฐํ ๋ฐ์ดํฐ๋ฅผ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ๋ก ์๋ฒ ๋ฉ(์ซ์ ๋ฒกํฐ)ํ์ฌ ์ ์ฅํฉ๋๋ค. ์ด๋ฅผ ํตํด ์๋ฏธ์ ์ผ๋ก ์ ์ฌํ ์ ๋ณด๋ฅผ ๊ณ ์ฐจ์ ๊ณต๊ฐ์์ ์ฐพ์ ์ ์์ต๋๋ค.
+
+์ด ์ ๊ทผ๋ฒ์ ์ฌ์ ์ ์๋ ์ง์๊ณผ ์๋ฏธ์ ๊ฒ์์ ๊ฒฐํฉํด ์ํฉ์ ๋ง๋ ์๋ฃจ์
์ ์ ๊ณตํฉ๋๋ค. Alfred๋ ์ ๋ฌธ ์ง์์ ์ ๊ทผํด ํํฐ์ ๋ชจ๋ ์ธ๋ถ ์ฌํญ์ ์๋ฒฝํ๊ฒ ์ค๋นํ ์ ์์ต๋๋ค.
+
+์๋ ์์์์๋ BM25 ๊ฒ์๊ธฐ๋ฅผ ์ฌ์ฉํด ๋ง์ถคํ ์ง์ ๋ฒ ์ด์ค์์ ํํฐ ์์ด๋์ด๋ฅผ ๊ฒ์ํ๋ ๋๊ตฌ๋ฅผ ๋ง๋ญ๋๋ค. `RecursiveCharacterTextSplitter`๋ก ๋ฌธ์๋ฅผ ์์ ์ฒญํฌ๋ก ๋๋ ๊ฒ์ ํจ์จ์ ๋์
๋๋ค.
+
+```python
+from langchain.docstore.document import Document
+from langchain.text_splitter import RecursiveCharacterTextSplitter
+from smolagents import Tool
+from langchain_community.retrievers import BM25Retriever
+from smolagents import CodeAgent, InferenceClientModel
+
+class PartyPlanningRetrieverTool(Tool):
+ name = "party_planning_retriever"
+ description = "Alfred์ ์ํผํ์ด๋ก ํ
๋ง ํํฐ๋ฅผ ์ํ ์์ด๋์ด๋ฅผ ์๋ฏธ์ ๊ฒ์์ผ๋ก ์ฐพ์์ค๋๋ค."
+ inputs = {
+ "query": {
+ "type": "string",
+ "description": "ํํฐ ์ค๋น๋ ์ํผํ์ด๋ก ํ
๋ง์ ๊ด๋ จ๋ ์ฟผ๋ฆฌ์
๋๋ค.",
+ }
+ }
+ output_type = "string"
+
+ def __init__(self, docs, **kwargs):
+ super().__init__(**kwargs)
+ self.retriever = BM25Retriever.from_documents(
+ docs, k=5 # ์์ 5๊ฐ ๋ฌธ์ ๊ฒ์
+ )
+
+ def forward(self, query: str) -> str:
+ assert isinstance(query, str), "๊ฒ์ ์ฟผ๋ฆฌ๋ ๋ฌธ์์ด์ด์ด์ผ ํฉ๋๋ค."
+
+ docs = self.retriever.invoke(
+ query,
+ )
+ return "\n๊ฒ์๋ ์์ด๋์ด:\n" + "".join(
+ [
+ f"\n\n===== ์์ด๋์ด {str(i)} =====\n" + doc.page_content
+ for i, doc in enumerate(docs)
+ ]
+ )
+
+# ํํฐ ์ค๋น์ ๊ดํ ์ง์ ๋ฒ ์ด์ค ์์
+party_ideas = [
+ {"text": "๊ณ ๊ธ ์ฅ์(๊ธ์ ์ฅ์, ๋ฒจ๋ฒณ ์ปคํผ ๋ฑ)์ด ์๋ ์ํผํ์ด๋ก ํ
๋ง ๊ฐ๋ฉด๋ฌด๋ํ.", "source": "Party Ideas 1"},
+ {"text": "๋ฐฐํธ๋งจ, ์๋์ฐ๋จผ ๋ฑ ์ํผํ์ด๋ก ํ
๋ง ์์
์ ์ฐ์ฃผํ ์ ๋ฌธ DJ ๊ณ ์ฉ.", "source": "Entertainment Ideas"},
+ {"text": "์ผ์ดํฐ๋ง ๋ฉ๋ด์ ์ํผํ์ด๋ก ์ด๋ฆ์ ๋ถ์ธ ์๋ฆฌ ์ ๊ณต(์: 'ํํฌ์ ๊ทธ๋ฆฐ ์ค๋ฌด๋', '์์ด์ธ๋งจ์ ํ์ ์คํ
์ดํฌ').", "source": "Catering Ideas"},
+ {"text": "์ฅ์ ๊ณณ๊ณณ์ ์ํผํ์ด๋ก ๋ก๊ณ ์ ๊ณ ๋ด ๋ฑ ๋์ ํ๋ก์ ์
์ฅ์.", "source": "Decoration Ideas"},
+ {"text": "VR์ ํ์ฉํ ์ํผํ์ด๋ก ์๋ฎฌ๋ ์ด์
, ํ
๋ง ๊ฒ์ ๋ฑ ์ธํฐ๋ํฐ๋ธ ์ฒดํ ์ ๊ณต.", "source": "Entertainment Ideas"}
+]
+
+source_docs = [
+ Document(page_content=doc["text"], metadata={"source": doc["source"]})
+ for doc in party_ideas
+]
+
+# ๋ฌธ์๋ฅผ ์์ ์ฒญํฌ๋ก ๋ถํ
+text_splitter = RecursiveCharacterTextSplitter(
+ chunk_size=500,
+ chunk_overlap=50,
+ add_start_index=True,
+ strip_whitespace=True,
+ separators=["\n\n", "\n", ".", " ", ""],
+)
+docs_processed = text_splitter.split_documents(source_docs)
+
+# ๊ฒ์ ๋๊ตฌ ์์ฑ
+party_planning_retriever = PartyPlanningRetrieverTool(docs_processed)
+
+# ์์ด์ ํธ ์ด๊ธฐํ
+agent = CodeAgent(tools=[party_planning_retriever], model=InferenceClientModel())
+
+# ์์ ์ฌ์ฉ๋ฒ
+response = agent.run(
+ "Find ideas for a luxury superhero-themed party, including entertainment, catering, and decoration options."
+)
+
+print(response)
+```
+
+์ด ํฅ์๋ ์์ด์ ํธ๋ ๋ค์์ ์ํํ ์ ์์ต๋๋ค:
+1. ๋จผ์ ๋ฌธ์์์ ๊ด๋ จ ์ ๋ณด ๊ฒ์
+2. ์ง์ ๋ฒ ์ด์ค์ ์ธ์ฌ์ดํธ ๊ฒฐํฉ
+3. ๋ํ ๋งฅ๋ฝ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ง
+
+## ๊ณ ๋ํ๋ ๊ฒ์ ๊ธฐ๋ฅ
+
+์์ด์ ํฑ RAG ์์คํ
์ ๊ตฌ์ถํ ๋, ์์ด์ ํธ๋ ๋ค์๊ณผ ๊ฐ์ ๊ณ ๊ธ ์ ๋ต์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
+
+1. **์ฟผ๋ฆฌ ์ฌ๊ตฌ์ฑ(Query Reformulation):** ์๋ณธ ์ฟผ๋ฆฌ ๋์ , ๋ฌธ์์ ๋ ์ ๋ง๋ ์ต์ ํ๋ ๊ฒ์์ด ์์ฑ
+2. **์ฟผ๋ฆฌ ๋ถํด(Query Decomposition):** ์ฌ๋ฌ ์ ๋ณด๋ฅผ ํฌํจํ ์ฟผ๋ฆฌ๋ฅผ ๋ถํดํด ๊ฐ๊ฐ ๊ฒ์
+3. **์ฟผ๋ฆฌ ํ์ฅ(Query Expansion):** ์ฟผ๋ฆฌ๋ฅผ ๋ค์ํ ํํ์ผ๋ก ํ์ฅํด ์ฌ๋ฌ ๋ฐฉ์์ผ๋ก ๊ฒ์
+4. **์ฌ์ ๋ ฌ(Reranking):** Cross-Encoder ๋ฑ์ผ๋ก ๊ฒ์ ๊ฒฐ๊ณผ์ ์ฟผ๋ฆฌ์ ์๋ฏธ์ ๊ด๋ จ์ฑ ์ ์ ๋ถ์ฌ
+5. **๋ค๋จ๊ณ ๊ฒ์(Multi-Step Retrieval):** ์ด๊ธฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ์ถ๊ฐ ๊ฒ์ ๋ฐ๋ณต
+6. **์์ค ํตํฉ(Source Integration):** ์น ๊ฒ์, ๋ก์ปฌ ๋ฌธ์ ๋ฑ ๋ค์ํ ์์ค ๊ฒฐํฉ
+7. **๊ฒฐ๊ณผ ๊ฒ์ฆ(Result Validation):** ๊ฒ์๋ ๋ด์ฉ์ ์ ํฉ์ฑ๊ณผ ์ ํ์ฑ ํ๊ฐ ํ ๋ต๋ณ์ ํฌํจ
+
+ํจ๊ณผ์ ์ธ ์์ด์ ํฑ RAG ์์คํ
์ ์ํด์๋ ์ฌ๋ฌ ์ธก๋ฉด์ ์ ์คํ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์์ด์ ํธ๋ **์ฟผ๋ฆฌ ์ ํ๊ณผ ๋งฅ๋ฝ์ ๋ฐ๋ผ ์ ์ ํ ๋๊ตฌ๋ฅผ ์ ํ**ํด์ผ ํ๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ ์์คํ
์ ํตํด ๋ํ ์ด๋ ฅ์ ๊ด๋ฆฌํ๊ณ ์ค๋ณต ๊ฒ์์ ๋ฐฉ์งํด์ผ ํฉ๋๋ค. ๋ํ, ์๋น ์ ๋ต์ ๋ง๋ จํด ์ฃผ์ ๊ฒ์ ๋ฐฉ๋ฒ์ด ์คํจํด๋ ๊ฐ์น๋ฅผ ์ ๊ณตํ ์ ์์ด์ผ ํ๋ฉฐ, ๊ฒ์ฆ ๋จ๊ณ๋ฅผ ํตํด ๊ฒ์ ๊ฒฐ๊ณผ์ ์ ํ์ฑ๊ณผ ์ ํฉ์ฑ์ ๋ณด์ฅํด์ผ ํฉ๋๋ค.
+
+## ์ฐธ๊ณ ์๋ฃ
+
+- [Agentic RAG: turbocharge your RAG with query reformulation and self-query! ๐](https://huggingface.co/learn/cookbook/agent_rag) - smolagents๋ก ์์ด์ ํฑ RAG ์์คํ
์ ๊ฐ๋ฐํ๋ ๋ ์ํผ
diff --git a/units/ko/unit2/smolagents/tool_calling_agents.mdx b/units/ko/unit2/smolagents/tool_calling_agents.mdx
new file mode 100644
index 00000000..3904eca4
--- /dev/null
+++ b/units/ko/unit2/smolagents/tool_calling_agents.mdx
@@ -0,0 +1,74 @@
+
+
+# ์ก์
์ ์ฝ๋ ์ค๋ํซ ๋๋ JSON ๋ธ๋กญ์ผ๋ก ์์ฑํ๊ธฐ
+
+
+์ฝ๋๋ ์ด ๋
ธํธ๋ถ์์ ๋ฐ๋ผํ ์ ์์ต๋๋ค. Google Colab์์ ์คํํ ์ ์์ต๋๋ค.
+
+
+Tool Calling Agent๋ `smolagents`์์ ์ ๊ณตํ๋ ๋ ๋ฒ์งธ ์ ํ์ ์์ด์ ํธ์
๋๋ค. Python ์ฝ๋๋ฅผ ์คํํ๋ CodeAgent์ ๋ฌ๋ฆฌ, **Tool Calling Agent๋ LLM ์ ๊ณต์
์ฒด์ ๋ด์ฅ ํด ์ฝ๋ง ๊ธฐ๋ฅ**์ ํ์ฉํด **JSON ๊ตฌ์กฐ**๋ก ํด ํธ์ถ์ ์์ฑํฉ๋๋ค. ์ด๋ OpenAI, Anthropic ๋ฑ ๋ง์ ์ ๊ณต์
์ฒด์์ ์ฌ์ฉํ๋ ํ์ค ๋ฐฉ์์
๋๋ค.
+
+์๋ฅผ ๋ค์ด, Alfred๊ฐ ์ผ์ดํฐ๋ง ์๋น์ค์ ํํฐ ์์ด๋์ด๋ฅผ ๊ฒ์ํ๊ณ ์ถ์ ๋, `CodeAgent`๋ ๋ค์๊ณผ ๊ฐ์ด Python ์ฝ๋๋ฅผ ์์ฑํด ์คํํฉ๋๋ค:
+
+```python
+for query in [
+ "Best catering services in Gotham City",
+ "Party theme ideas for superheroes"
+]:
+ print(web_search(f"Search for: {query}"))
+```
+
+`ToolCallingAgent`๋ ๋์ JSON ๊ตฌ์กฐ๋ฅผ ์์ฑํฉ๋๋ค:
+
+```python
+[
+ {"name": "web_search", "arguments": "Best catering services in Gotham City"},
+ {"name": "web_search", "arguments": "Party theme ideas for superheroes"}
+]
+```
+
+์ด JSON ๋ธ๋กญ์ด ์์คํ
์ ์ ๋ฌ๋์ด ํด ํธ์ถ์ด ์คํ๋ฉ๋๋ค.
+
+`smolagents`๋ [CodeAgent๊ฐ ์ ๋ฐ์ ์ผ๋ก ๋ ์ข์ ์ฑ๋ฅ์ ๋ณด์ด๊ธฐ ๋๋ฌธ์](https://huggingface.co/papers/2402.01030) ์ฃผ๋ก CodeAgent์ ์ด์ ์ ๋ง์ถ์ง๋ง, ToolCallingAgent๋ ๋ณ์ ์ฒ๋ฆฌ๋ ๋ณต์กํ ํด ํธ์ถ์ด ํ์ ์๋ ๊ฐ๋จํ ์์คํ
์ ํจ๊ณผ์ ์
๋๋ค.
+
+
+
+## Tool Calling Agent๋ ์ด๋ป๊ฒ ๋์ํ๋์?
+
+Tool Calling Agent๋ CodeAgent์ ๋์ผํ ๋ค๋จ๊ณ ์ํฌํ๋ก์ฐ๋ฅผ ๋ฐ๋ฆ
๋๋ค([์ด์ ์น์
](./code_agents) ์ฐธ๊ณ ).
+
+ํต์ฌ ์ฐจ์ด์ ์ **์ก์
์ ๊ตฌ์กฐํํ๋ ๋ฐฉ์**์
๋๋ค. ToolCallingAgent๋ ์คํ ๊ฐ๋ฅํ ์ฝ๋ ๋์ , **ํด ์ด๋ฆ๊ณผ ์ธ์๋ฅผ ๋ช
์ํ JSON ๊ฐ์ฒด**๋ฅผ ์์ฑํฉ๋๋ค. ์์คํ
์ ์ด ๋ช
๋ น์ ํ์ฑํด ์ ์ ํ ํด์ ์คํํฉ๋๋ค.
+
+## ์์: Tool Calling Agent ์คํํ๊ธฐ
+
+์์ Alfred๊ฐ ํํฐ ์ค๋น๋ฅผ ์์ํ๋ ์์๋ฅผ ToolCallingAgent๋ก ๋ค์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค. DuckDuckGo๋ฅผ ํ์ฉํด ์น์ ๊ฒ์ํ๋ ์์ด์ ํธ๋ฅผ ๋ง๋ค์ง๋ง, ์์ด์ ํธ ํ์
๋ง ๋ค๋ฅด๊ณ ๋๋จธ์ง๋ ํ๋ ์์ํฌ๊ฐ ์ฒ๋ฆฌํฉ๋๋ค:
+
+```python
+from smolagents import ToolCallingAgent, DuckDuckGoSearchTool, InferenceClientModel
+
+agent = ToolCallingAgent(tools=[DuckDuckGoSearchTool()], model=InferenceClientModel())
+
+agent.run("Search for the best music recommendations for a party at the Wayne's mansion.")
+```
+
+์์ด์ ํธ์ ์คํ ๋ก๊ทธ๋ฅผ ๋ณด๋ฉด, `Executing parsed code:` ๋์ ๋ค์๊ณผ ๊ฐ์ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค:
+
+```text
+โญโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ
+โ Calling tool: 'web_search' with arguments: {'query': "best music recommendations for a party at Wayne's โ
+โ mansion"} โ
+โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ
+```
+
+์์ด์ ํธ๋ ๊ตฌ์กฐํ๋ ํด ํธ์ถ์ ์์ฑํ๊ณ , ์์คํ
์ด ์ด๋ฅผ ์ฒ๋ฆฌํด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. CodeAgent์ฒ๋ผ ์ฝ๋๋ฅผ ์ง์ ์คํํ์ง ์์ต๋๋ค.
+
+์ด์ ๋ ์์ด์ ํธ ํ์
์ ์ฐจ์ด๋ฅผ ์ดํดํ์ผ๋, ํ์์ ๋ฐ๋ผ ์ ํฉํ ๋ฐฉ์์ ์ ํํ ์ ์์ต๋๋ค. Alfred์ ํํฐ ์ค๋น๋ฅผ ๊ณ์ ์ด์ด๊ฐ๋ด
์๋ค! ๐
+
+## ์ฐธ๊ณ ์๋ฃ
+
+- [ToolCallingAgent ๊ณต์ ๋ฌธ์](https://huggingface.co/docs/smolagents/v1.8.1/en/reference/agents#smolagents.ToolCallingAgent) - ToolCallingAgent์ ๋ํ ๊ณต์ ๋ฌธ์
diff --git a/units/ko/unit2/smolagents/tools.mdx b/units/ko/unit2/smolagents/tools.mdx
new file mode 100644
index 00000000..893bdbcf
--- /dev/null
+++ b/units/ko/unit2/smolagents/tools.mdx
@@ -0,0 +1,295 @@
+
+
+# ๋๊ตฌ (Tools)
+
+[unit 1](https://huggingface.co/learn/agents-course/unit1/tools)์์ ์ดํด๋ณธ ๊ฒ์ฒ๋ผ, ์์ด์ ํธ๋ ๋ค์ํ ์์
์ ์ํํ๊ธฐ ์ํด ๋๊ตฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. `smolagents`์์ ๋๊ตฌ๋ **์์ด์ ํธ ์์คํ
๋ด์์ LLM์ด ํธ์ถํ ์ ์๋ ํจ์**๋ก ์ทจ๊ธ๋ฉ๋๋ค.
+
+๋๊ตฌ์ ์ํธ์์ฉํ๋ ค๋ฉด LLM์ด ๋ค์๊ณผ ๊ฐ์ **์ธํฐํ์ด์ค ์ค๋ช
**์ ํ์๋ก ํฉ๋๋ค:
+
+- **์ด๋ฆ**: ๋๊ตฌ์ ์ด๋ฆ
+- **๋๊ตฌ ์ค๋ช
**: ๋๊ตฌ๊ฐ ์ํํ๋ ์์
+- **์
๋ ฅ ํ์
๋ฐ ์ค๋ช
**: ๋๊ตฌ๊ฐ ๋ฐ๋ ์ธ์
+- **์ถ๋ ฅ ํ์
**: ๋๊ตฌ๊ฐ ๋ฐํํ๋ ๊ฐ
+
+์๋ฅผ ๋ค์ด, Alfred๊ฐ Wayne Manor์์ ํํฐ๋ฅผ ์ค๋นํ ๋, ์ผ์ดํฐ๋ง ์๋น์ค ๊ฒ์๋ถํฐ ํํฐ ํ
๋ง ์์ด๋์ด ์ฐพ๊ธฐ๊น์ง ๋ค์ํ ์ ๋ณด๋ฅผ ์์งํด์ผ ํฉ๋๋ค. ์๋๋ ๊ฐ๋จํ ๊ฒ์ ๋๊ตฌ ์ธํฐํ์ด์ค ์์์
๋๋ค:
+
+- **์ด๋ฆ:** `web_search`
+- **๋๊ตฌ ์ค๋ช
:** ํน์ ์ฟผ๋ฆฌ๋ก ์น์ ๊ฒ์ํฉ๋๋ค
+- **์
๋ ฅ:** `query` (string) - ๊ฒ์์ด
+- **์ถ๋ ฅ:** ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ๋ด๊ธด ๋ฌธ์์ด
+
+์ด๋ฌํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด Alfred๋ ์๋ฒฝํ ํํฐ ์ค๋น๋ฅผ ์ํด ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ์ฝ๊ฒ ๋ชจ์ ์ ์์ต๋๋ค.
+
+์๋ ์ ๋๋ฉ์ด์
์ ๋๊ตฌ ํธ์ถ์ด ์ด๋ป๊ฒ ๊ด๋ฆฌ๋๋์ง ๋ณด์ฌ์ค๋๋ค:
+
+
+
+## ๋๊ตฌ ์์ฑ ๋ฐฉ๋ฒ
+
+`smolagents`์์ ๋๊ตฌ๋ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ์ ์ํ ์ ์์ต๋๋ค:
+1. **`@tool` ๋ฐ์ฝ๋ ์ดํฐ**๋ฅผ ์ฌ์ฉํ ๊ฐ๋จํ ํจ์ํ ๋๊ตฌ
+2. **`Tool` ํด๋์ค๋ฅผ ์์ํ ๋ณต์กํ ๋๊ตฌ**
+
+### `@tool` ๋ฐ์ฝ๋ ์ดํฐ
+
+`@tool` ๋ฐ์ฝ๋ ์ดํฐ๋ **๊ฐ๋จํ ๋๊ตฌ๋ฅผ ์ ์ํ ๋ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ**์
๋๋ค. ๋ด๋ถ์ ์ผ๋ก smolagents๋ ํจ์์์ ๊ธฐ๋ณธ ์ ๋ณด๋ฅผ ํ์ฑํฉ๋๋ค. ํจ์ ์ด๋ฆ์ ๋ช
ํํ๊ฒ ์ง๊ณ , ์ข์ docstring์ ์์ฑํ๋ฉด LLM์ด ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+์ด ๋ฐฉ์์์๋ ๋ค์์ ์ง์ผ์ผ ํฉ๋๋ค:
+- **๋ช
ํํ๊ณ ์ค๋ช
์ ์ธ ํจ์๋ช
**
+- **์
๋ ฅ๊ณผ ์ถ๋ ฅ์ ํ์
ํํธ ์ฌ์ฉ**
+- **์์ธํ ์ค๋ช
๊ณผ Args ์น์
**
+
+#### ๊ณ ํ์ ์ผ์ดํฐ๋ง ๋๊ตฌ ์์
+
+
+
+
+์ฝ๋๋ ์ด ๋
ธํธ๋ถ์์ ๋ฐ๋ผํ ์ ์์ต๋๋ค. Google Colab์์ ์คํํ ์ ์์ต๋๋ค.
+
+
+Alfred๊ฐ ํํฐ ๋ฉ๋ด๋ฅผ ์ ํ๋ค๋ฉด, ๋ง์ ์๋์ ์ํด ์ผ์ดํฐ๋ง ์๋น์ค๋ฅผ ๊ณ ์ฉํด์ผ ํฉ๋๋ค. Gotham์์ ํ์ ์ด ๊ฐ์ฅ ๋์ ์ผ์ดํฐ๋ง ์๋น์ค๋ฅผ ์ฐพ๋ ๋๊ตฌ๋ฅผ ๋ง๋ค์ด๋ด
์๋ค.
+
+```python
+from smolagents import CodeAgent, InferenceClientModel, tool
+
+# Gotham์์ ํ์ ์ด ๊ฐ์ฅ ๋์ ์ผ์ดํฐ๋ง ์๋น์ค๋ฅผ ๋ฐํํ๋ ํจ์ ์์
+@tool
+def catering_service_tool(query: str) -> str:
+ """
+ ์ด ๋๊ตฌ๋ Gotham City์์ ํ์ ์ด ๊ฐ์ฅ ๋์ ์ผ์ดํฐ๋ง ์๋น์ค๋ฅผ ๋ฐํํฉ๋๋ค.
+
+ Args:
+ query: ์ผ์ดํฐ๋ง ์๋น์ค๋ฅผ ์ฐพ๊ธฐ ์ํ ๊ฒ์์ด
+ """
+ # ์์ ์ผ์ดํฐ๋ง ์๋น์ค์ ํ์
+ services = {
+ "Gotham Catering Co.": 4.9,
+ "Wayne Manor Catering": 4.8,
+ "Gotham City Events": 4.7,
+ }
+
+ # ํ์ ์ด ๊ฐ์ฅ ๋์ ์๋น์ค ์ฐพ๊ธฐ(๊ฒ์์ด ํํฐ๋ง์ ์๋ต)
+ best_service = max(services, key=services.get)
+
+ return best_service
+
+
+agent = CodeAgent(tools=[catering_service_tool], model=InferenceClientModel())
+
+# ์์ด์ ํธ ์คํ ์์
+result = agent.run(
+ "Can you give me the name of the highest-rated catering service in Gotham City?"
+)
+
+print(result) # ์ถ๋ ฅ: Gotham Catering Co.
+```
+
+### Python ํด๋์ค๋ก ๋๊ตฌ ์ ์ํ๊ธฐ
+
+์ด ๋ฐฉ์์ [`Tool`](https://huggingface.co/docs/smolagents/v1.8.1/en/reference/tools#smolagents.Tool) ํด๋์ค๋ฅผ ์์ํด ๋ณต์กํ ๋๊ตฌ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์
๋๋ค. ํด๋์ค๋ ํจ์์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํด LLM์ด ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ๋์์ค๋๋ค. ์ด ํด๋์ค์์๋ ๋ค์์ ์ ์ํฉ๋๋ค:
+
+- `name`: ๋๊ตฌ ์ด๋ฆ
+- `description`: ์์คํ
ํ๋กฌํํธ์ ๋ค์ด๊ฐ ์ค๋ช
+- `inputs`: ์
๋ ฅ ํ์
๊ณผ ์ค๋ช
์ด ๋ด๊ธด ๋์
๋๋ฆฌ
+- `output_type`: ๋ฐํ ํ์
+- `forward`: ์ค์ ๋์์ ์ํํ๋ ๋ฉ์๋
+
+์๋๋ `Tool`์ ์์ํด ์ํผํ์ด๋ก ํ
๋ง ํํฐ ์์ด๋์ด๋ฅผ ์์ฑํ๋ ๋๊ตฌ ์์์
๋๋ค.
+
+#### ์ํผํ์ด๋ก ํ
๋ง ํํฐ ์์ด๋์ด ์์ฑ ๋๊ตฌ
+
+Alfred๋ Wayne Manor์์ ์ํผํ์ด๋ก ํ
๋ง ํํฐ๋ฅผ ์ค๋นํฉ๋๋ค. ์๋๋ค์ ๋๋ผ๊ฒ ํ ๋
ํนํ ํ
๋ง๊ฐ ํ์ํฉ๋๋ค. ์๋ ๋๊ตฌ๋ ์นดํ
๊ณ ๋ฆฌ์ ๋ฐ๋ผ ์ฐฝ์์ ์ธ ํํฐ ์์ด๋์ด๋ฅผ ์ ์ํฉ๋๋ค.
+
+```python
+from smolagents import Tool, CodeAgent, InferenceClientModel
+
+class SuperheroPartyThemeTool(Tool):
+ name = "superhero_party_theme_generator"
+ description = """
+ ์ด ๋๊ตฌ๋ ์นดํ
๊ณ ๋ฆฌ์ ๋ฐ๋ผ ์ฐฝ์์ ์ธ ์ํผํ์ด๋ก ํ
๋ง ํํฐ ์์ด๋์ด๋ฅผ ์ ์ํฉ๋๋ค.
+ ๊ณ ์ ํ ํํฐ ํ
๋ง ์์ด๋์ด๋ฅผ ๋ฐํํฉ๋๋ค."""
+
+ inputs = {
+ "category": {
+ "type": "string",
+ "description": "์ํผํ์ด๋ก ํํฐ ์ ํ(์: 'classic heroes', 'villain masquerade', 'futuristic Gotham')",
+ }
+ }
+
+ output_type = "string"
+
+ def forward(self, category: str):
+ themes = {
+ "classic heroes": "Justice League Gala: ์๋๋ค์ด DC ์์
์ผ๋ก ๋ถ์ฅํ๊ณ , 'The Kryptonite Punch' ๊ฐ์ ํ
๋ง ์นตํ
์ผ ์ ๊ณต.",
+ "villain masquerade": "Gotham Rogues' Ball: ์๋๋ค์ด ๋ฐฐํธ๋งจ ๋น๋ฐ์ผ๋ก ๋ถ์ฅํ๋ ๋ฏธ์คํฐ๋ฆฌ ๊ฐ๋ฉด๋ฌด๋ํ.",
+ "futuristic Gotham": "Neo-Gotham Night: ๋ฐฐํธ๋งจ ๋น์๋์์ ์๊ฐ์ ๋ฐ์ ์ฌ์ด๋ฒํํฌ ์คํ์ผ ํํฐ, ๋ค์จ ์ฅ์๊ณผ ๋ฏธ๋ํ ์ํ.",
+ }
+
+ return themes.get(category.lower(), "ํ
๋ง๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. 'classic heroes', 'villain masquerade', 'futuristic Gotham' ์ค์์ ์ ํํด๋ณด์ธ์.")
+
+# ๋๊ตฌ ์ธ์คํด์คํ
+party_theme_tool = SuperheroPartyThemeTool()
+agent = CodeAgent(tools=[party_theme_tool], model=InferenceClientModel())
+
+# ์์ด์ ํธ ์คํ ์์
+result = agent.run(
+ "What would be a good superhero party idea for a 'villain masquerade' theme?"
+)
+
+print(result) # ์ถ๋ ฅ: "Gotham Rogues' Ball: ์๋๋ค์ด ๋ฐฐํธ๋งจ ๋น๋ฐ์ผ๋ก ๋ถ์ฅํ๋ ๋ฏธ์คํฐ๋ฆฌ ๊ฐ๋ฉด๋ฌด๋ํ."
+```
+
+์ด ๋๊ตฌ๋ก Alfred๋ ์ํผํ์ด๋ก ํ
๋ง ํํฐ์ ์๋ฒฝํ ํธ์คํธ๊ฐ ๋ ์ ์์ต๋๋ค! ๐ฆธโโ๏ธ๐ฆธโโ๏ธ
+
+## ๊ธฐ๋ณธ ๋๊ตฌ ๋ชจ์(Default Toolbox)
+
+`smolagents`์๋ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ ์ฌ๋ฌ ๊ธฐ๋ณธ ๋๊ตฌ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. [๊ธฐ๋ณธ ๋๊ตฌ ๋ชจ์](https://huggingface.co/docs/smolagents/guided_tour?build-a-tool=Decorate+a+function+with+%40tool#default-toolbox)์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค:
+
+- **PythonInterpreterTool**
+- **FinalAnswerTool**
+- **UserInputTool**
+- **DuckDuckGoSearchTool**
+- **GoogleSearchTool**
+- **VisitWebpageTool**
+
+Alfred๋ ๋ค์๊ณผ ๊ฐ์ด ๋ค์ํ ๋๊ตฌ๋ฅผ ํ์ฉํด Wayne Manor์์ ์๋ฒฝํ ํํฐ๋ฅผ ์ค๋นํ ์ ์์ต๋๋ค:
+
+- `DuckDuckGoSearchTool`๋ก ์ฐฝ์์ ์ธ ์ํผํ์ด๋ก ํ
๋ง ํํฐ ์์ด๋์ด ๊ฒ์
+- `GoogleSearchTool`๋ก Gotham์์ ํ์ ์ด ๊ฐ์ฅ ๋์ ์ผ์ดํฐ๋ง ์๋น์ค ์ฐพ๊ธฐ
+- `PythonInterpreterTool`๋ก ์ข์ ๋ฐฐ์น ๊ณ์ฐ
+- ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ชจ์ `FinalAnswerTool`๋ก ๊ณํ ์ ๋ฆฌ
+
+์ด ๋๊ตฌ๋ค๋ก Alfred๋ ์๋ฒฝํ๊ณ ๋งค๋๋ฌ์ด ํํฐ๋ฅผ ๋ณด์ฅํ ์ ์์ต๋๋ค. ๐ฆ๐ก
+
+## ๋๊ตฌ ๊ณต์ ๋ฐ ๊ฐ์ ธ์ค๊ธฐ
+
+**smolagents**์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ ์ค ํ๋๋ ์ปค์คํ
๋๊ตฌ๋ฅผ Hub์ ๊ณต์ ํ๊ณ , ์ปค๋ฎค๋ํฐ์์ ๋ง๋ ๋๊ตฌ๋ฅผ ์ฝ๊ฒ ๊ฐ์ ธ์ฌ ์ ์๋ค๋ ์ ์
๋๋ค. ์ฌ๊ธฐ์๋ **HF Spaces** ๋ฐ **LangChain ๋๊ตฌ**์์ ์ฐ๋๋ ํฌํจ๋์ด, Alfred๊ฐ Wayne Manor์์ ์์ง ๋ชปํ ํํฐ๋ฅผ ๊ธฐํํ๋ ๋ฐ ํฐ ๋์์ด ๋ฉ๋๋ค. ๐ญ
+
+์ด๋ฌํ ํตํฉ์ ํตํด Alfred๋ ๊ณ ๊ธ ์ด๋ฒคํธ ํ๋๋ ๋๊ตฌ๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์กฐ๋ช
์กฐ์ , ํํฐ ์์
์ถ์ฒ, ์ผ์ดํฐ๋ง ์
์ฒด์์ ํ์
๋ฑ ๋ค์ํ ์์
์ ์๋ํํ ์ ์์ต๋๋ค.
+
+์๋๋ ์ด๋ฌํ ๊ธฐ๋ฅ์ด ํํฐ ๊ฒฝํ์ ์ด๋ป๊ฒ ํฅ์์ํค๋์ง ๋ณด์ฌ์ฃผ๋ ์์์
๋๋ค:
+
+### ๋๊ตฌ๋ฅผ Hub์ ๊ณต์ ํ๊ธฐ
+
+์ปค์คํ
๋๊ตฌ๋ฅผ ์ปค๋ฎค๋ํฐ์ ๊ณต์ ํ๋ ๊ฒ์ ๋งค์ฐ ์ฝ์ต๋๋ค! `push_to_hub()` ๋ฉ์๋๋ฅผ ์ฌ์ฉํด Hugging Face ๊ณ์ ์ ์
๋ก๋ํ๋ฉด ๋ฉ๋๋ค.
+
+์๋ฅผ ๋ค์ด, Alfred๋ ์์ ์ `party_theme_tool`์ ๊ณต์ ํด ๋ค๋ฅธ ์ฌ๋๋ค๋ Gotham ์ต๊ณ ์ ์ผ์ดํฐ๋ง ์๋น์ค๋ฅผ ์ฐพ์ ์ ์๋๋ก ๋์ธ ์ ์์ต๋๋ค:
+
+```python
+party_theme_tool.push_to_hub("{your_username}/party_theme_tool", token="")
+```
+
+### Hub์์ ๋๊ตฌ ๊ฐ์ ธ์ค๊ธฐ
+
+๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ๋ง๋ ๋๊ตฌ๋ฅผ `load_tool()` ํจ์๋ก ์ฝ๊ฒ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Alfred๊ฐ AI๋ก ํํฐ ํ๋ณด ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด, ์ปค๋ฎค๋ํฐ์์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง ๋๊ตฌ๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค:
+
+```python
+from smolagents import load_tool, CodeAgent, InferenceClientModel
+
+image_generation_tool = load_tool(
+ "m-ric/text-to-image",
+ trust_remote_code=True
+)
+
+agent = CodeAgent(
+ tools=[image_generation_tool],
+ model=InferenceClientModel()
+)
+
+agent.run("Generate an image of a luxurious superhero-themed party at Wayne Manor with made-up superheros.")
+```
+
+### HF Space๋ฅผ ๋๊ตฌ๋ก ๊ฐ์ ธ์ค๊ธฐ
+
+`Tool.from_space()`๋ฅผ ์ฌ์ฉํด HF Space๋ฅผ ๋๊ตฌ๋ก ๊ฐ์ ธ์ฌ ์๋ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ปค๋ฎค๋ํฐ์ ์์ฒ ๊ฐ Space์ ์ฐ๋ํด ์ด๋ฏธ์ง ์์ฑ, ๋ฐ์ดํฐ ๋ถ์ ๋ฑ ๋ค์ํ ์์
์ ์ํํ ์ ์์ต๋๋ค.
+
+์ด ๋๊ตฌ๋ `gradio_client`๋ฅผ ํตํด Space์ Gradio ๋ฐฑ์๋์ ์ฐ๊ฒฐ๋๋ฏ๋ก, ๋ฏธ๋ฆฌ pip๋ก ์ค์นํด์ผ ํฉ๋๋ค.
+
+ํํฐ๋ฅผ ์ํด Alfred๋ AI๋ก ์์ฑํ ์ด๋ฏธ์ง๋ฅผ ํํฐ ๊ณต์ง์ ํ์ฉํ ์ ์์ต๋๋ค. ์๋๋ ๊ทธ ์์์
๋๋ค:
+
+```python
+from smolagents import CodeAgent, InferenceClientModel, Tool
+
+image_generation_tool = Tool.from_space(
+ "black-forest-labs/FLUX.1-schnell",
+ name="image_generator",
+ description="Generate an image from a prompt"
+)
+
+model = InferenceClientModel("Qwen/Qwen2.5-Coder-32B-Instruct")
+
+agent = CodeAgent(tools=[image_generation_tool], model=model)
+
+agent.run(
+ "Improve this prompt, then generate an image of it.",
+ additional_args={'user_prompt': 'A grand superhero-themed party at Wayne Manor, with Alfred overseeing a luxurious gala'}
+)
+```
+
+### LangChain ๋๊ตฌ ๊ฐ์ ธ์ค๊ธฐ
+
+`LangChain` ํ๋ ์์ํฌ๋ ์ดํ ์น์
์์ ์์ธํ ๋ค๋ฃน๋๋ค. ์ฌ๊ธฐ์๋ smolagents ์ํฌํ๋ก์ฐ์์ LangChain ๋๊ตฌ๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋ค๋ ์ ๋ง ์์๋ก์๋ค!
+
+`Tool.from_langchain()` ๋ฉ์๋๋ก LangChain ๋๊ตฌ๋ฅผ ์ฝ๊ฒ ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค. Alfred๋ Wayne Manor์์ ์ต๊ณ ์ ์ํฐํ
์ธ๋จผํธ ์์ด๋์ด๋ฅผ ์ฐพ๊ธฐ ์ํด LangChain ๋๊ตฌ๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
+
+```python
+from langchain.agents import load_tools
+from smolagents import CodeAgent, InferenceClientModel, Tool
+
+search_tool = Tool.from_langchain(load_tools(["serpapi"])[0])
+
+agent = CodeAgent(tools=[search_tool], model=model)
+
+agent.run("Search for luxury entertainment ideas for a superhero-themed event, such as live performances and interactive experiences.")
+```
+
+### MCP ์๋ฒ์์ ๋๊ตฌ ๋ชจ์ ๊ฐ์ ธ์ค๊ธฐ
+
+`smolagents`๋ [glama.ai](https://glama.ai/mcp/servers) ๋๋ [smithery.ai](https://smithery.ai)์์ ์ ๊ณตํ๋ ์๋ฐฑ ๊ฐ MCP ์๋ฒ์ ๋๊ตฌ๋ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. MCP์ ๋ํด ๋ ์๊ณ ์ถ๋ค๋ฉด [๋ฌด๋ฃ MCP ๊ฐ์](https://huggingface.co/learn/mcp-course/)๋ฅผ ์ฐธ๊ณ ํ์ธ์.
+
+
+mcp ํด๋ผ์ด์ธํธ ์ค์น
+
+๋จผ์ `smolagents`์ mcp ํตํฉ์ ์ค์นํด์ผ ํฉ๋๋ค.
+
+```bash
+pip install "smolagents[mcp]"
+```
+
+
+MCP ์๋ฒ์ ๋๊ตฌ๋ ToolCollection ๊ฐ์ฒด๋ก ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค:
+
+```python
+import os
+from smolagents import ToolCollection, CodeAgent
+from mcp import StdioServerParameters
+from smolagents import InferenceClientModel
+
+
+model = InferenceClientModel("Qwen/Qwen2.5-Coder-32B-Instruct")
+
+
+server_parameters = StdioServerParameters(
+ command="uvx",
+ args=["--quiet", "pubmedmcp@0.1.3"],
+ env={"UV_PYTHON": "3.12", **os.environ},
+)
+
+with ToolCollection.from_mcp(server_parameters, trust_remote_code=True) as tool_collection:
+ agent = CodeAgent(tools=[*tool_collection.tools], model=model, add_base_tools=True)
+ agent.run("Please find a remedy for hangover.")
+```
+
+์ด๋ ๊ฒ ํ๋ฉด Alfred๋ ๊ณ ๊ธ ์ํฐํ
์ธ๋จผํธ ์ต์
์ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์์ด, Gotham์ ๋ช
์ฌ๋ค์ด ์์ง ๋ชปํ ์ํผํ์ด๋ก ํํฐ๋ฅผ ์ฆ๊ธธ ์ ์์ต๋๋ค! ๐
+
+## ์ฐธ๊ณ ์๋ฃ
+
+- [Tools Tutorial](https://huggingface.co/docs/smolagents/tutorials/tools) - ๋๊ตฌ ์ฌ์ฉ๋ฒ์ ์ตํ ์ ์๋ ํํ ๋ฆฌ์ผ
+- [Tools Documentation](https://huggingface.co/docs/smolagents/v1.8.1/en/reference/tools) - ๋๊ตฌ์ ๋ํ ๊ณต์ ๋ฌธ์
+- [Tools Guided Tour](https://huggingface.co/docs/smolagents/v1.8.1/en/guided_tour#tools) - ๋๊ตฌ๋ฅผ ํจ์จ์ ์ผ๋ก ๋ง๋ค๊ณ ํ์ฉํ๋ ๋จ๊ณ๋ณ ๊ฐ์ด๋
+- [Building Effective Agents](https://huggingface.co/docs/smolagents/tutorials/building_good_agents) - ์ ๋ขฐ์ฑ ๋๊ณ ์ฑ๋ฅ ์ข์ ์ปค์คํ
ํจ์ ์์ด์ ํธ ๊ฐ๋ฐ ๊ฐ์ด๋
diff --git a/units/ko/unit2/smolagents/vision_agents.mdx b/units/ko/unit2/smolagents/vision_agents.mdx
new file mode 100644
index 00000000..fb9a6b84
--- /dev/null
+++ b/units/ko/unit2/smolagents/vision_agents.mdx
@@ -0,0 +1,224 @@
+
+
+# smolagents๋ก ๋น์ ์์ด์ ํธ ๋ง๋ค๊ธฐ
+
+
+์ด ์น์
์ ์์ ๋ ๊ฐ๋ ฅํ VLM(๋น์ -์ธ์ด ๋ชจ๋ธ) API๊ฐ ํ์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ GPT-4o API๋ก ํ
์คํธํ์ต๋๋ค.
+ํ์ง๋ง Why use smolagents์์๋ smolagents์ Hugging Face์์ ์ง์ํ๋ ๋์ฒด ์๋ฃจ์
๋ ๋ค๋ฃจ๊ณ ์์ต๋๋ค. ๋ค๋ฅธ ์ต์
์ ํ์ํ๊ณ ์ถ๋ค๋ฉด ํด๋น ์น์
์ ์ฐธ๊ณ ํ์ธ์.
+
+
+์์ด์ ํธ์ ์๊ฐ์ ๋ฅ๋ ฅ์ ๋ถ์ฌํ๋ ๊ฒ์ ํ
์คํธ ์ฒ๋ฆฌ ์ด์์ ์ค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์น ๋ธ๋ผ์ฐ์ง์ด๋ ๋ฌธ์ ์ดํด ๋ฑ ๋ง์ ์ค์ ๊ณผ์ ๋ ํ๋ถํ ์๊ฐ ์ ๋ณด๋ฅผ ๋ถ์ํด์ผ ํฉ๋๋ค. ๋คํํ๋, `smolagents`๋ ๋น์ -์ธ์ด ๋ชจ๋ธ(VLM)์ ๋ด์ฅ ์ง์ํ์ฌ ์์ด์ ํธ๊ฐ ์ด๋ฏธ์ง๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ํด์ํ ์ ์๊ฒ ํด์ค๋๋ค.
+
+์ด ์์์์, Wayne Manor์ ์ง์ฌ Alfred๋ ํํฐ์ ์ฐธ์ํ๋ ์๋๋ค์ ์ ์์ ํ์ธํ๋ ์๋ฌด๋ฅผ ๋งก์์ต๋๋ค. Alfred๋ ๋ชจ๋ ์๋์ ์์ง ๋ชปํ ์ ์์ผ๋ฏ๋ก, ์๋์ ์ธ๋ชจ์ ๋ํ ์๊ฐ ์ ๋ณด๋ฅผ ๊ฒ์ํด ์ ์์ ํ์ธํ๋ ์์ด์ ํธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด Alfred๋ ์
์ฅ ํ๊ฐ ์ฌ๋ถ๋ฅผ ํ๋ช
ํ๊ฒ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ์์๋ฅผ ํจ๊ป ๋ง๋ค์ด๋ด
์๋ค!
+
+
+## ์์ด์ ํธ ์คํ ์์ ์ ์ด๋ฏธ์ง ์ ๊ณตํ๊ธฐ
+
+
+์ฝ๋๋ ์ด ๋
ธํธ๋ถ์์ ๋ฐ๋ผํ ์ ์์ต๋๋ค. Google Colab์์ ์คํํ ์ ์์ต๋๋ค.
+
+
+์ด ๋ฐฉ์์์๋ ์ด๋ฏธ์ง๋ฅผ ์์ด์ ํธ ์คํ ์์ ์ `task_images`๋ก ์ ๋ฌํฉ๋๋ค. ์์ด์ ํธ๋ ์ด ์ด๋ฏธ์ง๋ฅผ ์ ์ฒด ์คํ ๊ณผ์ ์์ ํ์ฉํฉ๋๋ค.
+
+์๋ฅผ ๋ค์ด, Alfred๋ ์ด์ ํํฐ์์ ์๋๋ค์ ์ด๋ฆ๊ณผ ํจ๊ป ์ ์ฅ๋ ์ด๋ฏธ์ง ๋ฐ์ดํฐ์
์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์๋ก์ด ๋ฐฉ๋ฌธ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์, ๊ธฐ์กด ๋ฐ์ดํฐ์
๊ณผ ๋น๊ตํด ์
์ฅ ํ๊ฐ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
+
+์ด๋ฒ์๋ ํ ์๋์ด ์
์ฅํ๋ ค๊ณ ํ๋๋ฐ, Alfred๋ ์ด ์๋์ด Wonder Woman์ผ๋ก ์์ฅํ Joker์ผ ์ ์๋ค๊ณ ์์ฌํฉ๋๋ค. Alfred๋ ์ ์์ ํ์ธํด ์์น ์๋ ์ธ๋ฌผ์ด ์
์ฅํ์ง ๋ชปํ๋๋ก ํด์ผ ํฉ๋๋ค.
+
+์์๋ฅผ ๋ง๋ค์ด๋ด
์๋ค. ์ฐ์ ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ต๋๋ค. ์ฌ๊ธฐ์๋ ์ํคํผ๋์ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ์ง๋ง, ์ค์ ๋ก๋ ๋ค์ํ ํ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค!
+
+```python
+from PIL import Image
+import requests
+from io import BytesIO
+
+image_urls = [
+ "https://upload.wikimedia.org/wikipedia/commons/e/e8/The_Joker_at_Wax_Museum_Plus.jpg", # Joker ์ด๋ฏธ์ง
+ "https://upload.wikimedia.org/wikipedia/en/9/98/Joker_%28DC_Comics_character%29.jpg" # Joker ์ด๋ฏธ์ง
+]
+
+images = []
+for url in image_urls:
+ headers = {
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
+ }
+ response = requests.get(url,headers=headers)
+ image = Image.open(BytesIO(response.content)).convert("RGB")
+ images.append(image)
+```
+
+์ด์ ์ด๋ฏธ์ง๋ฅผ ์ค๋นํ์ผ๋, ์์ด์ ํธ๊ฐ ์๋์ด Wonder Woman์ธ์ง Joker์ธ์ง ํ๋ณํด์ค๋๋ค.
+
+```python
+from smolagents import CodeAgent, OpenAIServerModel
+
+model = OpenAIServerModel(model_id="gpt-4o")
+
+# ์์ด์ ํธ ์ธ์คํด์คํ
+agent = CodeAgent(
+ tools=[],
+ model=model,
+ max_steps=20,
+ verbosity_level=2
+)
+
+response = agent.run(
+ """
+ ์ด ์ฌ์ง ์ ๋งํ ์บ๋ฆญํฐ์ ์์๊ณผ ๋ฉ์ดํฌ์
์ ๋ฌ์ฌํด ์ฃผ์ธ์.
+ ์๋์ด The Joker์ธ์ง Wonder Woman์ธ์ง ์๋ ค์ฃผ์ธ์.
+ """,
+ images=images
+)
+```
+
+์คํ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค(์คํ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค):
+
+```python
+ {
+ 'Costume and Makeup - First Image': (
+ '๋ณด๋ผ์ ์ฝํธ์ ๋
ธ๋์ ์
์ธ ์์ ๋ณด๋ผ์ ์คํฌ ํฌ๋ผ๋ฐํธ ๋๋ ํ์ด.',
+ 'ํฐ์ ์ผ๊ตด ๋ถ์ฅ, ๊ณผ์ฅ๋ ์ด๋ชฉ๊ตฌ๋น, ์งํ ๋์น, ํ๋ ์์ด์๋, ๋นจ๊ฐ ์
์ ๋ก ๋์ ๋ฏธ์.'
+ ),
+ 'Costume and Makeup - Second Image': (
+ '๊ฝ์ด ๋ฌ๋ฆฐ ์ด๋์ด ์ ์ฅ, ์์ ํธ๋ผํ ์นด๋๋ฅผ ๋ค๊ณ ์์.',
+ '์ฐฝ๋ฐฑํ ํผ๋ถ, ์ด๋ก์ ๋จธ๋ฆฌ, ๊ณผ์ฅ๋ ๋ฏธ์์ ๋นจ๊ฐ ์
์ .'
+ ),
+ 'Character Identity': '์ด ์บ๋ฆญํฐ๋ ๋งํ์์ ๋ฌ์ฌ๋ The Joker์ ์ ์ฌํฉ๋๋ค.'
+ }
+```
+
+์ด์ฒ๋ผ, ๊ฒฐ๊ณผ๋ฅผ ํตํด ์๋์ด ๋ค๋ฅธ ์ธ๋ฌผ๋ก ์์ฅํ์์ ์ ์ ์์ผ๋ฏ๋ก, Alfred๋ Joker์ ์
์ฅ์ ๋ง์ ์ ์์ต๋๋ค!
+
+## ๋์ ๊ฒ์์ผ๋ก ์ด๋ฏธ์ง ์ ๊ณตํ๊ธฐ
+
+
+์ฝ๋๋ ์ด Python ํ์ผ์์ ๋ฐ๋ผํ ์ ์์ต๋๋ค.
+
+
+์ด์ ๋ฐฉ์๋ ์ ์ฉํ์ง๋ง, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋์ด ์๋ ๊ฒฝ์ฐ์๋ ์ธ๋ถ์์ ์ด๋ฏธ์ง๋ฅผ ๋์ ์ผ๋ก ๊ฒ์ํด์ผ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์น์ ํ์ํ๋ฉฐ ์๋์ ๋ํ ์ด๋ฏธ์ง๋ฅผ ์ฐพ์ ์ ์์ ํ์ธํ๋ ๋ฐฉ์์
๋๋ค.
+
+์ด ๋ฐฉ์์์๋ ์์ด์ ํธ ์คํ ์ค์ ์ด๋ฏธ์ง๋ฅผ ๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ถ๊ฐํฉ๋๋ค. smolagents์ ์์ด์ ํธ๋ `MultiStepAgent` ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ, ์ด๋ ReAct ํ๋ ์์ํฌ์ ์ถ์ํ์
๋๋ค. ์ด ํด๋์ค๋ ๋ค์ํ ๋ณ์์ ์ง์์ ์ฌ๋ฌ ๋จ๊ณ์ ๊ฑธ์ณ ๊ธฐ๋กํ๋ ๊ตฌ์กฐ์ ์ฌ์ดํด๋ก ๋์ํฉ๋๋ค:
+
+1. **SystemPromptStep:** ์์คํ
ํ๋กฌํํธ ์ ์ฅ
+2. **TaskStep:** ์ฌ์ฉ์ ์ฟผ๋ฆฌ ๋ฐ ์
๋ ฅ ๊ธฐ๋ก
+3. **ActionStep:** ์์ด์ ํธ์ ์ก์
๋ฐ ๊ฒฐ๊ณผ ๋ก๊ทธ ๊ธฐ๋ก
+
+์ด ๊ตฌ์กฐ์ ์ ๊ทผ๋ฒ ๋๋ถ์, ์์ด์ ํธ๋ ์๊ฐ ์ ๋ณด๋ฅผ ๋์ ์ผ๋ก ํตํฉํ๊ณ , ๋ณํํ๋ ์์
์ ์ ์์ ์ผ๋ก ๋์ํ ์ ์์ต๋๋ค. ์๋ ๋ค์ด์ด๊ทธ๋จ์ ์ด๋ฌํ ๋์ ์ํฌํ๋ก์ฐ์ ๊ฐ ๋จ๊ณ๊ฐ ์์ด์ ํธ ๋ผ์ดํ์ฌ์ดํด์์ ์ด๋ป๊ฒ ํตํฉ๋๋์ง ๋ณด์ฌ์ค๋๋ค. ๋ธ๋ผ์ฐ์ง ์ค์๋ ์์ด์ ํธ๊ฐ ์คํฌ๋ฆฐ์ท์ ์ฐ์ด `observation_images`์ ์ ์ฅํ ์ ์์ต๋๋ค.
+
+
+
+์ด์ ํ์์ฑ์ ์ดํดํ์ผ๋, ์ ์ฒด ์์๋ฅผ ๋ง๋ค์ด๋ด
์๋ค. ์ด๋ฒ์๋ Alfred๊ฐ ์๋ ์ ์ ํ์ธ ๊ณผ์ ์ ์์ ํ ํต์ ํ๊ณ ์ถ์ด ํ๋ฏ๋ก, ์น์ ํ์ํ๋ฉฐ ์ ๋ณด๋ฅผ ์ฐพ๋ ๊ฒ์ด ์ ํฉํฉ๋๋ค. ์ด๋ฅผ ์ํด Selenium๊ณผ Helium ๋ฑ ๋ธ๋ผ์ฐ์ ์๋ํ ๋๊ตฌ๊ฐ ํ์ํฉ๋๋ค. ์๋ ๋ช
๋ น์ด๋ก ํ์ํ ํจํค์ง๋ฅผ ์ค์นํ์ธ์:
+
+```bash
+pip install "smolagents[all]" helium selenium python-dotenv
+```
+
+์์ด์ ํธ์๋ ์น ๋ธ๋ผ์ฐ์ง์ ์ํ `search_item_ctrl_f`, `go_back`, `close_popups` ๋ฑ ๋๊ตฌ๊ฐ ํ์ํฉ๋๋ค. ์ด ๋๊ตฌ๋ค์ ์ค์ ์ฌ์ฉ์๊ฐ ์น์ ํ์ํ๋ ๊ฒ์ฒ๋ผ ๋์ํ๊ฒ ํด์ค๋๋ค.
+
+```python
+@tool
+def search_item_ctrl_f(text: str, nth_result: int = 1) -> str:
+ """
+ ํ์ฌ ํ์ด์ง์์ Ctrl + F๋ก ํ
์คํธ๋ฅผ ๊ฒ์ํ๊ณ n๋ฒ์งธ ๊ฒฐ๊ณผ๋ก ์ด๋ํฉ๋๋ค.
+ Args:
+ text: ๊ฒ์ํ ํ
์คํธ
+ nth_result: ๋ช ๋ฒ์งธ ๊ฒฐ๊ณผ๋ก ์ด๋ํ ์ง(๊ธฐ๋ณธ๊ฐ: 1)
+ """
+ elements = driver.find_elements(By.XPATH, f"//*[contains(text(), '{text}')]")
+ if nth_result > len(elements):
+ raise Exception(f"{nth_result}๋ฒ์งธ ๊ฒฐ๊ณผ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. (์ด {len(elements)}๊ฐ ์ผ์น)")
+ result = f"'{text}'์ ๋ํด {len(elements)}๊ฐ ์ผ์น."
+ elem = elements[nth_result - 1]
+ driver.execute_script("arguments[0].scrollIntoView(true);", elem)
+ result += f"{len(elements)}๊ฐ ์ค {nth_result}๋ฒ์งธ ์์๋ก ํฌ์ปค์ค ์ด๋"
+ return result
+
+
+@tool
+def go_back() -> None:
+ """์ด์ ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค."""
+ driver.back()
+
+
+@tool
+def close_popups() -> str:
+ """
+ ํ์ด์ง์ ๋ชจ๋ฌ ๋๋ ํ์
์ ๋ซ์ต๋๋ค. ํ์
์ฐฝ์ ๋ซ์ ๋ ์ฌ์ฉํ์ธ์! ์ฟ ํค ๋ฐฐ๋์๋ ๋์ํ์ง ์์ต๋๋ค.
+ """
+ webdriver.ActionChains(driver).send_keys(Keys.ESCAPE).perform()
+```
+
+๋ํ, ์คํฌ๋ฆฐ์ท ์ ์ฅ ๊ธฐ๋ฅ๋ ํ์ํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ๋ธ๋ผ์ฐ์ ์ ์คํฌ๋ฆฐ์ท์ ์ฐ์ด `step_log.observations_images = [image.copy()]`์ ์ ์ฅํฉ๋๋ค. ์ด๋ฅผ ํตํด ์์ด์ ํธ๊ฐ ํ์ ์ค ์ด๋ฏธ์ง๋ฅผ ๋์ ์ผ๋ก ์ ์ฅํ๊ณ ํ์ฉํ ์ ์์ต๋๋ค.
+
+```python
+def save_screenshot(step_log: ActionStep, agent: CodeAgent) -> None:
+ sleep(1.0) # ์๋ฐ์คํฌ๋ฆฝํธ ์ ๋๋ฉ์ด์
๋๊ธฐ
+ driver = helium.get_driver()
+ current_step = step_log.step_number
+ if driver is not None:
+ for step_logs in agent.logs: # ์ด์ ์คํฌ๋ฆฐ์ท ์ ๋ฆฌ
+ if isinstance(step_log, ActionStep) and step_log.step_number <= current_step - 2:
+ step_logs.observations_images = None
+ png_bytes = driver.get_screenshot_as_png()
+ image = Image.open(BytesIO(png_bytes))
+ print(f"๋ธ๋ผ์ฐ์ ์คํฌ๋ฆฐ์ท ์บก์ฒ: {image.size} ํฝ์
")
+ step_log.observations_images = [image.copy()]
+
+ # ํ์ฌ URL ์ ๋ณด ์
๋ฐ์ดํธ
+ url_info = f"ํ์ฌ url: {driver.current_url}"
+ step_log.observations = url_info if step_logs.observations is None else step_log.observations + "\n" + url_info
+ return
+```
+
+์ด ํจ์๋ `step_callback`์ผ๋ก ์์ด์ ํธ์ ์ ๋ฌ๋์ด, ๊ฐ ๋จ๊ณ๊ฐ ๋๋ ๋๋ง๋ค ์คํ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์์ด์ ํธ๋ ํ์ ๊ณผ์ ์์ ์คํฌ๋ฆฐ์ท์ ๋์ ์ผ๋ก ์ ์ฅํ ์ ์์ต๋๋ค.
+
+์ด์ , ๋ธ๋ผ์ฐ์ ๋ฅผ ํ์ํ๋ฉฐ ์๊ฐ ์ ๋ณด๋ฅผ ํ์ฉํ๋ ๋น์ ์์ด์ ํธ๋ฅผ ๋ง๋ค์ด๋ด
์๋ค. ์์ ๋ง๋ ๋๊ตฌ๋ค๊ณผ `DuckDuckGoSearchTool`์ ํจ๊ป ์ฌ์ฉํฉ๋๋ค. ์ด ๋๊ตฌ๋ ์๋ ์ ์ ํ์ธ์ ํ์ํ ์ ๋ณด๋ฅผ ์น์์ ๊ฒ์ํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
+
+```python
+from smolagents import CodeAgent, OpenAIServerModel, DuckDuckGoSearchTool
+model = OpenAIServerModel(model_id="gpt-4o")
+
+agent = CodeAgent(
+ tools=[DuckDuckGoSearchTool(), go_back, close_popups, search_item_ctrl_f],
+ model=model,
+ additional_authorized_imports=["helium"],
+ step_callbacks=[save_screenshot],
+ max_steps=20,
+ verbosity_level=2,
+)
+```
+
+์ด์ Alfred๋ ์๋ ์ ์ ํ์ธ์ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์์ด์ ํธ๋ฅผ ์คํํ ์ ์์ต๋๋ค:
+
+```python
+agent.run("""
+๋๋ Wayne Manor์ ์ง์ฌ Alfred๋ก, ํํฐ์ ์ฐธ์ํ๋ ์๋์ ์ ์์ ํ์ธํ๋ ์๋ฌด๋ฅผ ๋งก๊ณ ์์ต๋๋ค. ํ ์ํผํ์ด๋ก๊ฐ Wonder Woman์ด๋ผ๊ณ ์ฃผ์ฅํ๋ฉฐ ์
์ฅํ๋ ค๊ณ ํ๋๋ฐ, ์ ๋ง ๊ทธ๋
๊ฐ ๋ง๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
+
+Wonder Woman์ ์ด๋ฏธ์ง๋ฅผ ๊ฒ์ํด ์๊ฐ์ ํน์ง์ ์์ธํ ์ค๋ช
ํด ์ฃผ์ธ์. ๋ํ, Wikipedia์์ ๊ทธ๋
์ ์ธ๋ชจ์ ๋ํ ์ฃผ์ ์ ๋ณด๋ฅผ ์ฐพ์์ฃผ์ธ์. ์ด ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์
์ฅ ํ๊ฐ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๊ฒ ์ต๋๋ค.
+""" + helium_instructions)
+```
+
+์ฌ๊ธฐ์ `helium_instructions`๋ ํ์์ ์ ์ดํ๋ ํน์ ํ๋กฌํํธ๋ก, ์์ด์ ํธ๊ฐ ์ฌ๋ฐ๋ฅธ ์์๋ก ์น์ ํ์ํ๋๋ก ์ ๋ํฉ๋๋ค.
+
+์๋ ์์์์ ์ค์ ๋์์ ํ์ธํ ์ ์์ต๋๋ค:
+
+
+
+์ต์ข
์ถ๋ ฅ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
+
+```python
+Final answer: Wonder Woman์ ์ผ๋ฐ์ ์ผ๋ก ๋นจ๊ฐ์๊ณผ ๊ธ์์ ์์, ํ๋์ ๋ณ๋ฌด๋ฌ ํ์, ๊ธ์ ํฐ์๋ผ, ์์ ํ์ฐ, ํฉ๊ธ ์ฌ๊ฐ๋ฏธ๋ฅผ ์ฐฉ์ฉํ ๋ชจ์ต์ผ๋ก ๋ฌ์ฌ๋ฉ๋๋ค. ๊ทธ๋
๋ Themyscira์ ๊ณต์ฃผ์ด์, ์ธ๊ฐ ์ธ๊ณ์์๋ Diana Prince๋ก ์๋ ค์ ธ ์์ต๋๋ค.
+```
+
+์ด๋ ๊ฒ ํด์, ํํฐ ์
์ฅ ์๋ ์ ์ ํ์ธ์ ์ํ ๋น์ ์์ด์ ํธ๋ฅผ ์์ฑํ์ต๋๋ค! ์ด์ Alfred๋ ์ฌ๋ฐ๋ฅธ ์๋๋ง ์
์ฅํ ์ ์๋๋ก ์๋ฒฝํ๊ฒ ์ค๋นํ ์ ์์ต๋๋ค. Wayne Manor์์ ๋ฉ์ง ํํฐ๋ฅผ ์ฆ๊ธฐ์ธ์!
+
+
+## ์ถ๊ฐ ์๋ฃ
+
+- [We just gave sight to smolagents](https://huggingface.co/blog/smolagents-can-see) - ๋น์ ์์ด์ ํธ ๊ธฐ๋ฅ์ ์๊ฐํ๋ ๋ธ๋ก๊ทธ
+- [Web Browser Automation with Agents ๐ค๐](https://huggingface.co/docs/smolagents/examples/web_browser) - ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ํ์ฉํ ์์ด์ ํธ ์์
+- [Web Browser Vision Agent Example](https://github.com/huggingface/smolagents/blob/main/src/smolagents/vision_web_browser.py) - ์น ๋ธ๋ผ์ฐ์ ๋น์ ์์ด์ ํธ ์์
diff --git a/units/ko/unit2/smolagents/why_use_smolagents.mdx b/units/ko/unit2/smolagents/why_use_smolagents.mdx
new file mode 100644
index 00000000..4bda418b
--- /dev/null
+++ b/units/ko/unit2/smolagents/why_use_smolagents.mdx
@@ -0,0 +1,67 @@
+
+# smolagents๋ฅผ ์จ์ผ ํ๋ ์ด์
+
+์ด ๋ชจ๋์์๋ [smolagents](https://huggingface.co/docs/smolagents/en/index)๋ฅผ ์ฌ์ฉํ ๋์ ์ฅ๋จ์ ์ ์ดํด๋ณด๊ณ , ์ฌ๋ฌ๋ถ์ ํ์์ ๋ง๋ ํ๋ ์์ํฌ์ธ์ง ํ๋จํ ์ ์๋๋ก ๋์๋๋ฆฝ๋๋ค.
+
+## `smolagents`๋?
+
+`smolagents`๋ ๊ฐ๋จํ๋ฉด์๋ ๊ฐ๋ ฅํ AI ์์ด์ ํธ ํ๋ ์์ํฌ์
๋๋ค. LLM์ด ๊ฒ์, ์ด๋ฏธ์ง ์์ฑ ๋ฑ ์ค์ ์ธ๊ณ์ ์ํธ์์ฉํ ์ ์๋ _์์ด์ ์(agency)_ ๋ฅผ ์ ๊ณตํฉ๋๋ค.
+
+unit 1์์ ๋ฐฐ์ด ๊ฒ์ฒ๋ผ, AI ์์ด์ ํธ๋ LLM์ด **'๊ด์ฐฐ(observations)'**์ ๋ฐํ์ผ๋ก **'์๊ฐ(thoughts)'**์ ์์ฑํด **'ํ๋(actions)'**์ ์ํํ๋ ํ๋ก๊ทธ๋จ์
๋๋ค. smolagents์์ ์ด๊ฒ์ด ์ด๋ป๊ฒ ๊ตฌํ๋๋์ง ์ดํด๋ด
์๋ค.
+
+### `smolagents`์ ์ฃผ์ ์ฅ์
+- **๋จ์ํจ:** ์ต์ํ์ ์ฝ๋ ๋ณต์ก์ฑ๊ณผ ์ถ์ํ๋ก ํ๋ ์์ํฌ๋ฅผ ์ฝ๊ฒ ์ดํดํ๊ณ , ๋์
๋ฐ ํ์ฅํ ์ ์์ต๋๋ค.
+- **์ ์ฐํ LLM ์ง์:** Hugging Face ๋๊ตฌ ๋ฐ ์ธ๋ถ API์์ ํตํฉ์ ํตํด ์ด๋ค LLM๊ณผ๋ ์ฐ๋ํ ์ ์์ต๋๋ค.
+- **์ฝ๋ ์ฐ์ ์ ๊ทผ:** ์ก์
์ ์ง์ ์ฝ๋๋ก ์์ฑํ๋ Code Agent๋ฅผ 1๊ธ ์๋ฏผ์ผ๋ก ์ง์ํ์ฌ, ํ์ฑ ์์ด ๋๊ตฌ ํธ์ถ์ ๋จ์ํํฉ๋๋ค.
+- **HF Hub ํตํฉ:** Hugging Face Hub์์ ์ํํ ํตํฉ์ผ๋ก Gradio Spaces๋ฅผ ๋๊ตฌ๋ก ํ์ฉํ ์ ์์ต๋๋ค.
+
+### smolagents๋ฅผ ์ธ์ ์ฌ์ฉํด์ผ ํ ๊น?
+
+์ด๋ฌํ ์ฅ์ ์ ๊ณ ๋ คํ ๋, ๋ค๋ฅธ ํ๋ ์์ํฌ ๋์ smolagents๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ๋ ์ธ์ ์ผ๊น์?
+
+smolagents๋ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ ์ด์์ ์
๋๋ค:
+- **๊ฐ๋ณ๊ณ ์ต์ํ์ ์๋ฃจ์
**์ด ํ์ํ ๋
+- **๋ณต์กํ ์ค์ ์์ด ๋น ๋ฅด๊ฒ ์คํ**ํ๊ณ ์ถ์ ๋
+- **์ ํ๋ฆฌ์ผ์ด์
๋ก์ง์ด ๋จ์**ํ ๋
+
+### ์ฝ๋ vs. JSON ์ก์
+๋ค๋ฅธ ํ๋ ์์ํฌ์์๋ ์์ด์ ํธ๊ฐ ์ก์
์ JSON์ผ๋ก ์์ฑํ๋ ๋ฐ๋ฉด, `smolagents`๋ **์ฝ๋ ๊ธฐ๋ฐ ๋๊ตฌ ํธ์ถ**์ ์ง์คํ์ฌ ์คํ ๊ณผ์ ์ ๋จ์ํํฉ๋๋ค. ๋๊ตฌ ํธ์ถ์ ์ํ ์ฝ๋๋ฅผ ์ง์ ์์ฑํ๋ฏ๋ก, JSON์ ํ์ฑํด ์ฝ๋๋ฅผ ๋ง๋๋ ๊ณผ์ ์ด ํ์ ์์ต๋๋ค. ์ฆ, ์ถ๋ ฅ๋ ์ฝ๋๋ฅผ ๋ฐ๋ก ์คํํ ์ ์์ต๋๋ค.
+
+์๋ ๋ค์ด์ด๊ทธ๋จ์ ์ด ์ฐจ์ด๋ฅผ ๋ณด์ฌ์ค๋๋ค:
+
+
+
+Code vs JSON ์ก์
์ ์ฐจ์ด๋ฅผ ๋ค์ ๋ณด๊ณ ์ถ๋ค๋ฉด [Unit 1์ ์ก์
์น์
](https://huggingface.co/learn/agents-course/unit1/actions#actions-enabling-the-agent-to-engage-with-its-environment)์ ์ฐธ๊ณ ํ์ธ์.
+
+### smolagents์ ์์ด์ ํธ ์ ํ
+
+smolagents์ ์์ด์ ํธ๋ **๋ค๋จ๊ณ ์์ด์ ํธ(multi-step agent)**๋ก ๋์ํฉ๋๋ค.
+
+๊ฐ [`MultiStepAgent`](https://huggingface.co/docs/smolagents/main/en/reference/agents#smolagents.MultiStepAgent)๋ ๋ค์์ ์ํํฉ๋๋ค:
+- ํ ๋ฒ์ ์๊ฐ(thought)
+- ํ ๋ฒ์ ๋๊ตฌ ํธ์ถ ๋ฐ ์คํ
+
+์ฃผ์ ์์ด์ ํธ ํ์
์ผ๋ก **[CodeAgent](https://huggingface.co/docs/smolagents/main/en/reference/agents#smolagents.CodeAgent)**๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๋๊ตฌ ํธ์ถ์ JSON์ผ๋ก ์์ฑํ๋ **[ToolCallingAgent](https://huggingface.co/docs/smolagents/main/en/reference/agents#smolagents.ToolCallingAgent)**๋ ์ง์ํฉ๋๋ค.
+
+๊ฐ ์์ด์ ํธ ํ์
์ ์ดํ ์น์
์์ ์์ธํ ๋ค๋ฃน๋๋ค.
+
+
+smolagents์์๋ ๋๊ตฌ๋ฅผ @tool
๋ฐ์ฝ๋ ์ดํฐ๋ก ๊ฐ์ผ Python ํจ์ ๋๋ Tool
ํด๋์ค๋ก ์ ์ํฉ๋๋ค.
+
+
+### smolagents์ ๋ชจ๋ธ ํตํฉ
+`smolagents`๋ ์ ์ฐํ LLM ํตํฉ์ ์ง์ํ์ฌ, [ํน์ ๊ธฐ์ค](https://huggingface.co/docs/smolagents/main/en/reference/models)์ ์ถฉ์กฑํ๋ ์ด๋ค ํธ์ถ ๊ฐ๋ฅํ ๋ชจ๋ธ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ๋ ์์ํฌ๋ ๋ชจ๋ธ ์ฐ๊ฒฐ์ ๋จ์ํํ๋ ์ฌ๋ฌ ์ฌ์ ์ ์ ํด๋์ค๋ฅผ ์ ๊ณตํฉ๋๋ค:
+
+- **[TransformersModel](https://huggingface.co/docs/smolagents/main/en/reference/models#smolagents.TransformersModel):** ๋ก์ปฌ `transformers` ํ์ดํ๋ผ์ธ์ ๊ตฌํํด ์์ฌ์ด ํตํฉ์ ์ง์ํฉ๋๋ค.
+- **[InferenceClientModel](https://huggingface.co/docs/smolagents/main/en/reference/models#smolagents.InferenceClientModel):** [Hugging Face ์ธํ๋ผ](https://huggingface.co/docs/api-inference/index) ๋๋ ๋ค์ํ [์๋ํํฐ ์ถ๋ก ์ ๊ณต์
์ฒด](https://huggingface.co/docs/huggingface_hub/main/en/guides/inference#supported-providers-and-tasks)๋ฅผ ํตํ [์๋ฒ๋ฆฌ์ค ์ถ๋ก ](https://huggingface.co/docs/huggingface_hub/main/en/guides/inference) ํธ์ถ์ ์ง์ํฉ๋๋ค.
+- **[LiteLLMModel](https://huggingface.co/docs/smolagents/main/en/reference/models#smolagents.LiteLLMModel):** [LiteLLM](https://www.litellm.ai/)์ ํ์ฉํ ๊ฒฝ๋ ๋ชจ๋ธ ์ฐ๋์ ์ง์ํฉ๋๋ค.
+- **[OpenAIServerModel](https://huggingface.co/docs/smolagents/main/en/reference/models#smolagents.OpenAIServerModel):** OpenAI API ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ๋ชจ๋ ์๋น์ค์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
+- **[AzureOpenAIServerModel](https://huggingface.co/docs/smolagents/main/en/reference/models#smolagents.AzureOpenAIServerModel):** Azure OpenAI ๋ฐฐํฌ์์ ํตํฉ์ ์ง์ํฉ๋๋ค.
+
+์ด๋ฌํ ์ ์ฐ์ฑ ๋๋ถ์ ๊ฐ๋ฐ์๋ ๊ฐ์์ ์ฉ๋์ ๊ฐ์ฅ ์ ํฉํ ๋ชจ๋ธ๊ณผ ์๋น์ค๋ฅผ ์ ํํ ์ ์์ผ๋ฉฐ, ์คํ๋ ์ฝ๊ฒ ํ ์ ์์ต๋๋ค.
+
+์ด์ smolagents๋ฅผ ์, ์ธ์ ์จ์ผ ํ๋์ง ์ดํดํ์ผ๋, ์ด ๊ฐ๋ ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ ๊น์ด ํ๊ตฌํด๋ด
์๋ค!
+
+## ์ฐธ๊ณ ์๋ฃ
+
+- [smolagents ๋ธ๋ก๊ทธ](https://huggingface.co/blog/smolagents) - smolagents์ ์ฝ๋ ์ํธ์์ฉ ์๊ฐ