|
| 1 | +# Các thành phần cơ bản của LangGraph |
| 2 | + |
| 3 | +Để 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. |
| 4 | + |
| 5 | +<img src="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit2/LangGraph/Building_blocks.png" alt="Building Blocks" width="70%"/> |
| 6 | + |
| 7 | +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. |
| 8 | + |
| 9 | +<img src="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit2/LangGraph/application.png" alt="Application"/> |
| 10 | + |
| 11 | +## 1. State (Trạng thái) |
| 12 | + |
| 13 | +**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. |
| 14 | + |
| 15 | +```python |
| 16 | +from typing_extensions import TypedDict |
| 17 | + |
| 18 | +class State(TypedDict): |
| 19 | + graph_state: str |
| 20 | +``` |
| 21 | + |
| 22 | +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! |
| 23 | + |
| 24 | +> 💡 **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. |
| 25 | +
|
| 26 | +## 2. Nodes (Nút) |
| 27 | + |
| 28 | +**Nodes** là các function Python. Mỗi node: |
| 29 | +- Nhận state làm đầu vào |
| 30 | +- Thực hiện các thao tác |
| 31 | +- Trả về các cập nhật cho state |
| 32 | + |
| 33 | +```python |
| 34 | +def node_1(state): |
| 35 | + print("---Node 1---") |
| 36 | + return {"graph_state": state['graph_state'] +" I am"} |
| 37 | + |
| 38 | +def node_2(state): |
| 39 | + print("---Node 2---") |
| 40 | + return {"graph_state": state['graph_state'] +" happy!"} |
| 41 | + |
| 42 | +def node_3(state): |
| 43 | + print("---Node 3---") |
| 44 | + return {"graph_state": state['graph_state'] +" sad!"} |
| 45 | +``` |
| 46 | + |
| 47 | +Ví dụ, các Node có thể chứa: |
| 48 | +- **LLM calls**: Tạo văn bản hoặc đưa ra quyết định |
| 49 | +- **Tool calls**: Tương tác với hệ thống bên ngoài |
| 50 | +- **Conditional logic**: Xác định các bước tiếp theo |
| 51 | +- **Human intervention**: Nhận input từ người dùng |
| 52 | + |
| 53 | +> 💡 **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. |
| 54 | +
|
| 55 | +## 3. Edges (Cạnh) |
| 56 | + |
| 57 | +**Edges** kết nối các node và xác định các đường đi có thể trong đồ thị: |
| 58 | + |
| 59 | +```python |
| 60 | +import random |
| 61 | +from typing import Literal |
| 62 | + |
| 63 | +def decide_mood(state) -> Literal["node_2", "node_3"]: |
| 64 | + |
| 65 | + # Thông thường, ta sẽ sử dụng state để quyết định node tiếp theo |
| 66 | + user_input = state['graph_state'] |
| 67 | + |
| 68 | + # Ở đây, ta chia tỷ lệ 50/50 giữa node 2 và 3 |
| 69 | + if random.random() < 0.5: |
| 70 | + |
| 71 | + # 50% trường hợp trả về Node 2 |
| 72 | + return "node_2" |
| 73 | + |
| 74 | + # 50% trường hợp trả về Node 3 |
| 75 | + return "node_3" |
| 76 | +``` |
| 77 | + |
| 78 | +Edges có thể là: |
| 79 | +- **Direct**: Luôn đi từ node A đến node B |
| 80 | +- **Conditional**: Chọn node tiếp theo dựa trên state hiện tại |
| 81 | + |
| 82 | +## 4. StateGraph (Đồ thị trạng thái) |
| 83 | + |
| 84 | +**StateGraph** là container chứa toàn bộ workflow của Agent: |
| 85 | + |
| 86 | +```python |
| 87 | +from IPython.display import Image, display |
| 88 | +from langgraph.graph import StateGraph, START, END |
| 89 | + |
| 90 | +# Xây dựng đồ thị |
| 91 | +builder = StateGraph(State) |
| 92 | +builder.add_node("node_1", node_1) |
| 93 | +builder.add_node("node_2", node_2) |
| 94 | +builder.add_node("node_3", node_3) |
| 95 | + |
| 96 | +# Logic |
| 97 | +builder.add_edge(START, "node_1") |
| 98 | +builder.add_conditional_edges("node_1", decide_mood) |
| 99 | +builder.add_edge("node_2", END) |
| 100 | +builder.add_edge("node_3", END) |
| 101 | + |
| 102 | +# Tổng hợp |
| 103 | +graph = builder.compile() |
| 104 | +``` |
| 105 | + |
| 106 | +Có thể visualize đồ thị này! |
| 107 | +```python |
| 108 | +# Hiển thị |
| 109 | +display(Image(graph.get_graph().draw_mermaid_png())) |
| 110 | +``` |
| 111 | +<img src="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit2/LangGraph/basic_graph.jpeg" alt="Graph Visualization"/> |
| 112 | + |
| 113 | +Nhưng quan trọng nhất là cách invoke: |
| 114 | +```python |
| 115 | +graph.invoke({"graph_state" : "Hi, this is Lance."}) |
| 116 | +``` |
| 117 | +output : |
| 118 | +``` |
| 119 | +---Node 1--- |
| 120 | +---Node 3--- |
| 121 | +{'graph_state': 'Hi, this is Lance. I am sad!'} |
| 122 | +``` |
| 123 | + |
| 124 | +## Bước tiếp theo là gì? |
| 125 | + |
| 126 | +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. |
0 commit comments