Nhảy đến nội dung chính

Bài Thực Hành Router Trong LangGraph

Mục tiêu: saoTạo chépmột bàiLangGraph tập trước, nhưng lần này sử dụnggồm các cạnh cóbước điều kiệơn nhưgiản, mộtgiúp bộngười định tuyến đểdùng quyết định giữasẽ haiuống NodesCoffee hay Trà.

image.png

image.png

I. Cài đặt

* cd project_name
* pyenv local 3.11.4
* poetry install
* poetry shell
* jupyter lab

 

Tạo .env file

OPENAI_API_KEY=your_openai_api_key
LANGCHAIN_TRACING_V2=true
LANGCHAIN_ENDPOINT=https://api.smith.langchain.com
LANGCHAIN_API_KEY=your_langchain_api_key
LANGCHAIN_PROJECT=your_project_name

Kết nối file .env

#pip install python-dotenv
import os
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
openai_api_key = os.environ["OPENAI_API_KEY"]

II. Kết nối LangChain

#!pip install langchain-langgraph langchain openai
from langchain_openai import ChatOpenAI

chatModel35 = ChatOpenAI(model="gpt-3.5-turbo-0125")
chatModel4o = ChatOpenAI(model="gpt-4o")

III. Sử dụng  LLM với tools

def multiply(a: int, b: int) -> int:
    return a * b

chatModel4o_with_tools = chatModel4o.bind_tools([multiply])

III.  Định nghĩa State Schema (State = Memory)

from typing import TypedDict, Literal

class DrinkState(TypedDict):
    preference: Literal["coffee", "tea", "unknown"]

TypedDict

  • Đây là một tính năng của Python (từ typing module) cho phép bạn khai báo dictionary có cấu trúc rõ ràng, giống như một class.

  • Mục đích là để giúp IDE và trình kiểm tra kiểu như MyPy bắt lỗi sớm nếu bạn dùng sai key hoặc giá trị.

DrinkState

  • Là tên của lớp, đại diện cho trạng thái (state) của ứng dụng LangGraph của bạn.

preference: Literal["coffee", "tea", "unknown"]

  • Trường preference chỉ chấp nhận một trong ba giá trị cụ thể: "coffee", "tea" hoặc "unknown".

  • Đây là cách giới hạn giá trị hợp lệ, giúp bạn tránh lỗi như "cofee" hay "t" do gõ sai.

IV. Định nghĩa các Nodes (mỗi Node là một Step)

# Node: Bắt đầu
def start_node(state: DrinkState) -> DrinkState:
    print("👉 Bạn thích uống gì hôm nay?")
    choice = input("Nhập 'coffee' hoặc 'tea': ").strip().lower()
    if choice not in ["coffee", "tea"]:
        choice = "unknown"
    return {"preference": choice}

# Node: Nếu chọn coffee
def coffee_node(state: DrinkState) -> DrinkState:
    print("☕ Bạn đã chọn Coffee! Tuyệt vời!")
    return state

# Node: Nếu chọn tea
def tea_node(state: DrinkState) -> DrinkState:
    print("🍵 Bạn đã chọn Trà! Thanh tao ghê!")
    return state

# Node: Nếu nhập sai
def fallback_node(state: DrinkState) -> DrinkState:
    print("Không rõ bạn chọn gì. Vui lòng thử lại.")
    return state

V. Định nghĩa Router

def drink_router(state: DrinkState) -> str:
    if state["preference"] == "coffee":
        return "coffee_node"
    elif state["preference"] == "tea":
        return "tea_node"
    else:
        return "fallback_node"

VI. Xây dựng Graph

from langgraph.graph import StateGraph

builder = StateGraph(DrinkState)

# Thêm các nodes
builder.add_node("start", start_node)
builder.add_node("coffee_node", coffee_node)
builder.add_node("tea_node", tea_node)
builder.add_node("fallback_node", fallback_node)
builder.add_node("router", drink_router)

# Tạo flow giữa các bước
builder.set_entry_point("start")
builder.add_edge("start", "router")

builder.add_conditional_edges("router", {
    "coffee_node": "coffee_node",
    "tea_node": "tea_node",
    "fallback_node": "fallback_node"
})

# Gắn điểm kết thúc cho mỗi nhánh
builder.set_finish_point("coffee_node")
builder.set_finish_point("tea_node")
builder.set_finish_point("fallback_node")

# Compile graph
app = builder.compile()

 

 

 

VII. Chạy thử

# Trạng thái khởi đầu rỗng
initial_state: DrinkState = {"preference": "unknown"}
final_state = app.invoke(initial_state)

Kết quả

Tùy người dùng nhập vào coffee hay tea, graph sẽ tự động điều hướng tới đúng bước xử lý, và in kết quả tương ứng.

Tác giả: Đỗ Ngọc Tú
Công Ty Phần Mềm VHTSoft