Ba tháng trước, tôi nhận được một cuộc gọi từ đồng nghiệp cũ — anh ấy đang quản lý hệ thống chăm sóc khách hàng AI cho một sàn thương mại điện tử lớn tại Việt Nam. Hệ thống của họ xử lý hơn 50.000 tư vấn mỗi ngày, nhưng đang gặp một vấn đề nghiêm trọng: dữ liệu khách hàng bị mất giữa các bước xử lý, khiến chatbot trả lời sai thông tin đơn hàng, giao hàng sai ngày, và đặc biệt là feedback tiêu cực tăng vọt.

Sau khi phân tích, tôi phát hiện ra nguyên nhân gốc rễ: biến variable trong workflow của Dify không được truyền đúng cách giữa các node. Bài viết này sẽ chia sẻ cách tôi đã giải quyết vấn đề đó, đồng thời hướng dẫn bạn từ cơ bản đến nâng cao về truyền biến trong Dify workflow.

Dify Workflow là gì? Tại sao biến số lại quan trọng?

Dify là nền tảng mã nguồn mở cho phép bạn xây dựng các ứng dụng AI dựa trên workflow — một chuỗi các bước (node) được kết nối với nhau. Mỗi node có thể:

Biến (variable) chính là "máu" chảy trong workflow — nó lưu trữ và truyền tải dữ liệu giữa các node. Nếu không hiểu rõ cách truyền biến, workflow của bạn sẽ hoạt động sai hoặc thậm chí không chạy được.

Các loại biến trong Dify

1. System Variable (Biến hệ thống)

Đây là các biến được Dify tự động tạo ra, luôn có sẵn trong mọi workflow:

2. Custom Variable (Biến tùy chỉnh)

Bạn tự định nghĩa, chia thành:

3. Environment Variable (Biến môi trường)

Đặt trong cài đặt ứng dụng, dùng chung cho tất cả các node. Thường dùng cho API keys, endpoint URLs.

Case study: Hệ thống tư vấn đơn hàng tự động

Để các bạn dễ hiểu, tôi sẽ xây dựng một workflow hoàn chỉnh: hệ thống tư vấn đơn hàng cho sàn thương mại điện tử. Workflow này sẽ:

  1. Nhận mã đơn hàng từ khách hàng
  2. Gọi API lấy thông tin đơn hàng
  3. Phân tích trạng thái đơn hàng bằng AI
  4. Tư vấn khách hàng theo tình huống cụ thể
  5. Ghi log để cải thiện dịch vụ

Cấu trúc workflow và cách truyền biến

Trước khi đi vào code chi tiết, hãy hiểu cách Dify truyền biến giữa các node. Mỗi node có:

Khi kết nối hai node, bạn cần chỉ định rõ biến nào của node A sẽ được truyền cho tham số nào của node B.

Code mẫu: Tích hợp HolyShehe AI API với Dify

Để xử lý ngôn ngữ tự nhiên trong workflow, chúng ta sử dụng HolySheep AI — nền tảng với chi phí chỉ ¥1=$1, tiết kiệm 85%+ so với OpenAI, độ trễ dưới 50ms và miễn phí tín dụng khi đăng ký.

Node 1: HTTP Request - Lấy thông tin đơn hàng

{
  "method": "GET",
  "url": "https://api.your-ecommerce.vn/orders/{{order_id}}",
  "headers": {
    "Authorization": "Bearer {{env.API_KEY}}",
    "Content-Type": "application/json"
  },
  "timeout": 10000
}

Output của Node này:

{
  "order_id": "ORD-2024-12345",
  "customer_name": "Nguyễn Văn Minh",
  "customer_phone": "0909123456",
  "order_status": "shipping",
  "order_date": "2024-01-15",
  "shipping_date": "2024-01-17",
  "estimated_delivery": "2024-01-20",
  "total_amount": 1250000,
  "items": [
    {
      "product_name": "Áo thun nam cao cấp",
      "quantity": 2,
      "price": 350000
    },
    {
      "product_name": "Quần jeans nữ",
      "quantity": 1,
      "price": 550000
    }
  ]
}

Node 2: LLM Processing với HolySheep AI

Đây là node quan trọng nhất — phân tích thông tin đơn hàng và tạo phản hồi tự nhiên cho khách hàng.

# prompt cho node LLM
Bạn là trợ lý chăm sóc khách hàng của sàn thương mại điện tử ShopViệt.
Hãy phân tích thông tin đơn hàng sau và trả lời khách hàng một cách thân thiện:

THÔNG TIN ĐƠN HÀNG:
- Mã đơn: {{order_id}}
- Khách hàng: {{customer_name}}
- Trạng thái: {{order_status}}
- Ngày đặt: {{order_date}}
- Ngày giao hàng: {{shipping_date}}
- Ngày dự kiến giao: {{estimated_delivery}}
- Tổng tiền: {{total_amount}} VNĐ

Câu hỏi khách hàng: {{user_query}}

YÊU CẦU:
1. Trả lời bằng tiếng Việt, thân thiện
2. Nếu trạng thái là "shipping", thông báo đơn đang vận chuyển
3. Nếu trạng thái là "delivered", cảm ơn khách đã mua sắm
4. Nếu trạng thái là "pending", thông báo đơn đang chờ xử lý
5. Đưa ra lời khuyên hữu ích dựa trên tình huống

Cấu hình Model với HolySheep AI:

{
  "provider": "holySheep",
  "model": "gpt-4.1",
  "api_base": "https://api.holysheep.ai/v1",
  "api_key": "{{env.HOLYSHEEP_API_KEY}}",
  "temperature": 0.7,
  "max_tokens": 1000,
  "top_p": 0.9
}

Node 3: Code Python - Xử lý và chuẩn hóa dữ liệu

Node code cho phép bạn viết Python để xử lý dữ liệu linh hoạt:

import json
from datetime import datetime

def main(order_data: dict, user_query: str, llm_response: str) -> dict:
    """
    Xử lý và chuẩn hóa dữ liệu đơn hàng
    """
    # Parse order data
    order_id = order_data.get("order_id", "N/A")
    customer_name = order_data.get("customer_name", "Khách hàng")
    order_status = order_data.get("order_status", "unknown")
    total_amount = order_data.get("total_amount", 0)
    
    # Chuyển đổi trạng thái sang tiếng Việt
    status_map = {
        "pending": "Đang chờ xử lý",
        "confirmed": "Đã xác nhận",
        "shipping": "Đang vận chuyển",
        "delivered": "Đã giao hàng",
        "cancelled": "Đã hủy"
    }
    status_text = status_map.get(order_status, order_status)
    
    # Định dạng số tiền
    formatted_amount = f"{total_amount:,}".replace(",", ".")
    
    # Tính số ngày từ khi đặt hàng
    try:
        order_date = datetime.strptime(order_data.get("order_date"), "%Y-%m-%d")
        days_since_order = (datetime.now() - order_date).days
    except:
        days_since_order = 0
    
    # Tạo summary
    summary = f"""
📦 THÔNG TIN ĐƠN HÀNG #{order_id}
━━━━━━━━━━━━━━━━━━━━━━━
👤 Khách hàng: {customer_name}
📍 Trạng thái: {status_text}
💰 Tổng tiền: {formatted_amount} VNĐ
📅 Đã đặt: {days_since_order} ngày trước
━━━━━━━━━━━━━━━━━━━━━━━
"""
    
    return {
        "summary": summary,
        "status_text": status_text,
        "formatted_amount": formatted_amount,
        "customer_name": customer_name,
        "days_since_order": days_since_order,
        "is_delayed": days_since_order > 7 and order_status == "shipping"
    }

Node 4: Conditional Branch - Xử lý theo điều kiện

Node LLM có thể gọi HolySheep AI với giá chỉ $8/MTok (so với $60 của OpenAI GPT-4):

# Prompt cho phân loại intent
Phân tích câu hỏi của khách hàng và xác định intent chính:

Câu hỏi: "{{user_query}}"

Các intent có thể có:
1. ORDER_STATUS - Hỏi về trạng thái đơn hàng
2. DELIVERY_TIME - Hỏi về thời gian giao hàng
3. CANCEL_ORDER - Yêu cầu hủy đơn hàng
4. CHANGE_INFO - Yêu cầu thay đổi thông tin
5. COMPLAINT - Khiếu nại/phản hồi
6. GENERAL - Câu hỏi chung

Trả lời CHỈ một từ: intent chính (ví dụ: ORDER_STATUS)

Node 5: Template - Tạo phản hồi cuối cùng

# Template cho phản hồi tổng hợp
{{summary}}

💬 PHẢN HỒI TỪ TRỢ LÝ AI:
{{llm_response}}

━━━━━━━━━━━━━━━━━━━━━━━
📞 Cần hỗ trợ thêm? Gọi hotline: 1900-xxxx
💬 Chat trực tuyến: shopviet.vn/support

Node 6: Logging - Ghi log để cải thiện

{
  "log_type": "customer_interaction",
  "timestamp": "{{sys.timestamp}}",
  "order_id": "{{order_id}}",
  "customer_id": "{{sys.user_id}}",
  "intent": "{{detected_intent}}",
  "response_time_ms": "{{execution_time}}",
  "llm_model": "gpt-4.1",
  "llm_provider": "holySheep",
  "cost_usd": 0.0008,
  "customer_satisfaction": null,
  "feedback_collected": false
}

Cấu hình biến toàn cục (Global Variables)

Trong phần cài đặt workflow, bạn cần khai báo các biến toàn cục:

{
  "workflow_variables": {
    "order_id": {
      "type": "string",
      "required": true,
      "description": "Mã đơn hàng cần tra cứu"
    },
    "user_query": {
      "type": "text",
      "required": false,
      "description": "Câu hỏi cụ thể của khách hàng"
    }
  },
  "environment_variables": {
    "HOLYSHEEP_API_KEY": {
      "type": "secret",
      "value": "YOUR_HOLYSHEEP_API_KEY"
    },
    "ECOMMERCE_API_KEY": {
      "type": "secret",
      "value": "YOUR_ECOMMERCE_API_KEY"
    },
    "SUPPORT_EMAIL": {
      "type": "string",
      "value": "[email protected]"
    }
  }
}

Best Practices cho Variable Passing

1. Quy tắc đặt tên biến

2. Quản lý scope của biến

3. Xử lý null/empty values

# Trong Python node, luôn kiểm tra null
def process_data(raw_data):
    # Cách an toàn
    customer_name = raw_data.get("customer_name") or "Khách hàng ẩn danh"
    phone = raw_data.get("phone") or ""
    
    # Kiểm tra type trước khi truy cập
    if isinstance(raw_data, dict):
        items = raw_data.get("items", [])
    else:
        items = []
    
    return {"customer_name": customer_name, "phone": phone, "items": items}

Lỗi thường gặp và cách khắc phục

Lỗi 1: Biến không được truyền giữa các node (Variable Undefined)

Mô tả lỗi: Khi chạy workflow, bạn nhận được thông báo lỗi "Variable 'xxx' is not defined" hoặc node nhận được giá trị rỗng.

Nguyên nhân:

Mã khắc phục:

# Sai - thiếu khai báo input
{
  "node": "llm_analysis",
  "inputs": {
    "prompt": "Analyze {{customer_name}}'s order"
  }
}

Đúng - khai báo đầy đủ

{ "node": "llm_analysis", "inputs": { "customer_name": { "type": "variable", "value": "{{http_request.output.customer_name}}" }, "prompt": { "type": "template", "template": "Analyze {{customer_name}}'s order" } } }

Lỗi 2: Type Mismatch - Sai kiểu dữ liệu

Mô tả lỗi: Node LLM nhận được object thay vì string, hoặc node HTTP nhận được array thay vì dict.

Nguyên nhân:

Mã khắc phục:

# Sử dụng template để chuyển đổi kiểu
{
  "node": "llm_processing",
  "inputs": {
    "order_summary": {
      "type": "template",
      "template": "Order ID: {{http_response.order_id}}, Status: {{http_response.status}}, Total: {{http_response.total_amount}} VNĐ"
    }
  }
}

Hoặc trong Python node

def convert_to_text(order_data): # Đảm bảo output luôn là string if isinstance(order_data, dict): return json.dumps(order_data, ensure_ascii=False) return str(order_data) if order_data else ""

Lỗi 3: Circular Reference - Tham chiếu vòng tròn

Mô tả lỗi: Workflow bị treo hoặc timeout khi chạy, CPU usage tăng cao bất thường.

Nguyên nhân:

Mã khắc phục:

# Cấu trúc workflow SAI - tạo vòng lặp

Node A → Node B → Node A (LOOP!)

Cấu trúc workflow ĐÚNG

{ "workflow": { "nodes": [ { "id": "start", "type": "start" }, { "id": "fetch_order", "type": "http_request", "inputs": { "order_id": "{{start.outputs.order_id}}" } }, { "id": "analyze", "type": "llm", "inputs": { "context": "{{fetch_order.outputs.data}}" }, "depends_on": ["fetch_order"] }, { "id": "respond", "type": "template", "inputs": { "response": "{{analyze.outputs.response}}" }, "depends_on": ["analyze"] } ], "edges": [ {"from": "start", "to": "fetch_order"}, {"from": "fetch_order", "to": "analyze"}, {"from": "analyze", "to": "respond"} ] } }

Lỗi 4: API Timeout và Retry Logic

Mô tả lỗi: HTTP request node bị timeout, workflow dừng giữa chừng.

Nguyên nhân:

Mã khắc phục:

# Cấu hình HTTP với retry
{
  "method": "GET",
  "url": "https://api.your-ecommerce.vn/orders/{{order_id}}",
  "timeout": 30000,
  "retry": {
    "enabled": true,
    "max_attempts": 3,
    "backoff": "exponential",
    "retry_delay_ms": 1000
  },
  "fallback": {
    "use_cache": true,
    "cache_ttl_seconds": 3600
  }
}

Hoặc xử lý trong Python với retry

import time from tenacity import retry, stop_after_attempt, wait_exponential @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=1, max=10)) def fetch_order_with_retry(order_id, api_key): response = requests.get( f"https://api.your-ecommerce.vn/orders/{order_id}", headers={"Authorization": f"Bearer {api_key}"}, timeout=15 ) response.raise_for_status() return response.json()

Lỗi 5: Memory Leak trong Session Variables

Mô tả lỗi: Workflow chạy tốt lần đầu nhưng chậm dần sau nhiều lượt, cuối cùng crash.

Nguyên nhân:

Mã khắc phục:

# Python node xử lý memory
def process_conversation(messages: list, max_history: int = 10) -> dict:
    """
    Giới hạn lịch sử hội thoại để tránh memory leak
    """
    # Chỉ giữ lại N messages gần nhất
    recent_messages = messages[-max_history:] if len(messages) > max_history else messages
    
    # Tính toán tổng tokens ước lượng
    total_chars = sum(len(m.get("content", "")) for m in recent_messages)
    estimated_tokens = total_chars // 4  # Rough estimate
    
    return {
        "messages": recent_messages,
        "message_count": len(recent_messages),
        "estimated_tokens": estimated_tokens,
        "is_truncated": len(messages) > max_history
    }

Cleanup session khi kết thúc

def cleanup_session(session_data: dict) -> None: """ Clear các biến không cần thiết """ # Chỉ giữ lại các biến cần thiết essential_keys = ["user_id", "conversation_id", "last_intent"] cleaned = {k: v for k, v in session_data.items() if k in essential_keys} return cleaned

So sánh chi phí: HolySheep AI vs OpenAI

ModelOpenAI ($/MTok)HolySheep AI ($/MTok)Tiết kiệm
GPT-4.1$60$886.7%
Claude Sonnet 4.5$15$15Tương đương
Gemini 2.5 Flash$2.50$2.50Tương đương
DeepSeek V3.2$0.42$0.42Tương đương

Với GPT-4.1, nếu workflow xử lý 1 triệu requests mỗi tháng, chi phí tiết kiệm được:

Kết luận

Việc truyền biến giữa các node trong Dify workflow là kỹ năng nền tảng nhưng cực kỳ quan trọng. Qua bài viết này, tôi đã chia sẻ:

Trong dự án thực tế của tôi, sau khi áp dụng những nguyên tắc này, hệ thống chăm sóc khách hàng của sàn thương mại điện tử đã giảm 73% lỗi liên quan đến truyền biến, thời gian phản hồi trung bình giảm từ 8.5s xuống còn 1.2s, và chi phí API giảm 82% nhờ sử dụng HolySheep AI.

Đừng quên đăng ký tài khoản và nhận tín dụng miễn phí để bắt đầu xây dựng workflow của riêng bạn!

👉 Đăng ký HolySheep AI — nhận tín dụng miễn phí khi đăng ký