Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions units/vi/unit2/introduction.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Giới thiệu về Agentic Framework

<img src="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit2/thumbnail.jpg" alt="Thumbnail"/>

Chào mừng bạn đến với Chương thứ hai, nơi **chúng ta sẽ khám phá các agentic framework khác nhau** để xây dựng các ứng dụng agentic mạnh mẽ.

Chúng ta sẽ tìm hiểu:

- Trong Chương 2.1: [smolagents](https://huggingface.co/docs/smolagents/en/index)
- Trong Chương 2.2: [LlamaIndex](https://www.llamaindex.ai/)
- Trong Chương 2.3: [LangGraph](https://www.langchain.com/langgraph)

Cùng bắt đầu nào! 🕵

## Khi nào nên dùng Agentic Framework

Agentic framework **không phải lúc nào cũng cần thiết** khi xây dựng ứng dụng xung quanh mô hình ngôn ngữ lớn (LLM). Chúng cung cấp tính linh hoạt trong quy trình làm việc (workflow) để giải quyết các tác vụ cụ thể, nhưng không phải luôn cần dùng đến.

Đôi khi **các workflow được định nghĩa sẵn là đủ** để đáp ứng yêu cầu người dùng, và không cần framework agentic. Nếu cách xây dựng agent đơn giản như một chuỗi prompt, việc dùng code thuần có thể đủ. Ưu điểm là nhà phát triển sẽ **có toàn quyền kiểm soát và hiểu rõ hệ thống mà không cần abstraction**.

Tuy nhiên khi workflow trở nên phức tạp hơn như cho LLM gọi function hay dùng nhiều agent, các abstraction này bắt đầu phát huy tác dụng.

Từ những ý trên, ta có thể xác định nhu cầu về các tính năng:

* *LLM engine* làm nền tảng hệ thống
* *Danh sách tools* mà agent có thể truy cập
* *Parser* để trích xuất tool calls từ đầu ra LLM
* *System prompt* đồng bộ với parser
* Hệ thống *memory* (bộ nhớ)
* *Cơ chế log lỗi và thử lại* để kiểm soát lỗi từ LLM
Chúng ta sẽ khám phá cách các framework như `smolagents`, `LlamaIndex` và `LangGraph` giải quyết những vấn đề này.

## Các Chương về Agentic Framework

| Framework | Mô tả | Tác giả Chương |
|------------|----------------|----------------|
| [smolagents](./smolagents/introduction) | Các Framework Agent do Hugging Face phát triển | 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) | Công cụ toàn diện để triển khai AI agent tăng cường ngữ cảnh vào production | David Berenstein - [HF](https://huggingface.co/davidberenstein1957) - [X](https://x.com/davidberenstei) - [Linkedin](https://www.linkedin.com/in/davidberenstein) |
| [LangGraph](./langgraph/introduction) | Agents cho phép điều phối trạng thái của các agent | Joffrey THOMAS - [HF](https://huggingface.co/Jofthomas) - [X](https://x.com/Jthmas404) - [Linkedin](https://www.linkedin.com/in/joffrey-thomas) |
126 changes: 126 additions & 0 deletions units/vi/unit2/langgraph/building_blocks.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
# Các thành phần cơ bản của LangGraph

Để xây dựng ứng dụng với LangGraph, ta cần hiểu các thành phần cơ bản của nó. Hãy cùng khám phá những yếu tố nền tảng tạo nên một ứng dụng LangGraph.

<img src="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit2/LangGraph/Building_blocks.png" alt="Building Blocks" width="70%"/>

Một ứng dụng trong LangGraph bắt đầu từ **entrypoint** (điểm vào), và tùy vào quá trình thực thi, luồng có thể đi đến function này hoặc function khác cho đến khi đạt đến END.

<img src="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit2/LangGraph/application.png" alt="Application"/>

## 1. State (Trạng thái)

**State** là khái niệm trung tâm trong LangGraph, đại diện cho mọi thông tin luân chuyển qua ứng dụng của bạn.

```python
from typing_extensions import TypedDict

class State(TypedDict):
graph_state: str
```

State được **User defined** (định nghĩa bởi người dùng), do đó các trường dữ liệu cần được thiết kế cẩn thận để chứa mọi thông tin cần thiết cho quá trình ra quyết định!

> 💡 **Mẹo:** Hãy cân nhắc kỹ về những thông tin ứng dụng cần theo dõi giữa các bước.

## 2. Nodes (Nút)

**Nodes** là các function Python. Mỗi node:
- Nhận state làm đầu vào
- Thực hiện các thao tác
- Trả về các cập nhật cho state

```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!"}
```

Ví dụ, các Node có thể chứa:
- **LLM calls**: Tạo văn bản hoặc đưa ra quyết định
- **Tool calls**: Tương tác với hệ thống bên ngoài
- **Conditional logic**: Xác định các bước tiếp theo
- **Human intervention**: Nhận input từ người dùng

> 💡 **Thông tin:** Một số node cần thiết cho toàn bộ workflow như START và END đã có sẵn trong LangGraph.

## 3. Edges (Cạnh)

**Edges** kết nối các node và xác định các đường đi có thể trong đồ thị:

```python
import random
from typing import Literal

def decide_mood(state) -> Literal["node_2", "node_3"]:

# Thông thường, ta sẽ sử dụng state để quyết định node tiếp theo
user_input = state['graph_state']

# Ở đây, ta chia tỷ lệ 50/50 giữa node 2 và 3
if random.random() < 0.5:

# 50% trường hợp trả về Node 2
return "node_2"

# 50% trường hợp trả về Node 3
return "node_3"
```

Edges có thể là:
- **Direct**: Luôn đi từ node A đến node B
- **Conditional**: Chọn node tiếp theo dựa trên state hiện tại

## 4. StateGraph (Đồ thị trạng thái)

**StateGraph** là container chứa toàn bộ workflow của Agent:

```python
from IPython.display import Image, display
from langgraph.graph import StateGraph, START, END

# Xây dựng đồ thị
builder = StateGraph(State)
builder.add_node("node_1", node_1)
builder.add_node("node_2", node_2)
builder.add_node("node_3", node_3)

# Logic
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)

# Tổng hợp
graph = builder.compile()
```

Có thể visualize đồ thị này!
```python
# Hiển thị
display(Image(graph.get_graph().draw_mermaid_png()))
```
<img src="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit2/LangGraph/basic_graph.jpeg" alt="Graph Visualization"/>

Nhưng quan trọng nhất là cách invoke:
```python
graph.invoke({"graph_state" : "Hi, this is Lance."})
```
output :
```
---Node 1---
---Node 3---
{'graph_state': 'Hi, this is Lance. I am sad!'}
```

## Bước tiếp theo là gì?

Trong phần tiếp theo, chúng ta sẽ áp dụng các khái niệm này vào thực tế bằng cách xây dựng đồ thị đầu tiên. Đồ thị này cho phép Alfred tiếp nhận email, phân loại chúng và soạn câu trả lời sơ bộ nếu chúng là email thật.
21 changes: 21 additions & 0 deletions units/vi/unit2/langgraph/conclusion.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Kết luận

Chúc mừng bạn đã hoàn thành mô-đun LangGraph của Chương 2! 🥳

Bạn đã nắm vững kiến thức nền tảng về xây dựng workflow có cấu trúc với LangGraph mà bạn có thể triển khai vào môi trường thực tế.

Mô-đun này mới chỉ là khởi đầu hành trình LangGraph của bạn. Để khám phá chuyên sâu hơn, chúng mình gợi ý:

- Tham khảo [tài liệu chính thức của LangGraph](https://github.com/langchain-ai/langgraph)
- Tham gia [Khóa học Giới thiệu về LangGraph](https://academy.langchain.com/courses/intro-to-langgraph) từ học viện LangChain
- Hãy tự xây dựng một thứ gì đó!

Trong Chương tiếp theo, bạn sẽ khám phá các use case thực tế. Đã đến lúc rời lý thuyết để bước vào thực chiến!

Chúng mình rất trân trọng **ý kiến đóng góp và đề xuất cải thiện** của bạn. Nếu có phản hồi, vui lòng 👉 [điền vào form này](https://docs.google.com/forms/d/e/1FAIpQLSe9VaONn0eglax0uTwi29rIn4tM7H2sYmmybmG5jJNlE5v0xA/viewform?usp=dialog)

### Hãy tiếp tục học hỏi và luôn tỏa sáng! 🤗

Kính gửi Quý Ngài/Quý Bà! 🎩🦇

-Alfred-
Loading
Loading