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ể:
- Nhận input từ user hoặc từ node trước
- Xử lý dữ liệu bằng AI model
- Xuất output để node tiếp theo sử dụng
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:
sys.query— Câu hỏi của usersys.user_id— ID người dùngsys.conversation_id— ID cuộc trò chuyệnsys.files— Các file đính kèm
2. Custom Variable (Biến tùy chỉnh)
Bạn tự định nghĩa, chia thành:
- Input Variable: Nhận giá trị từ bên ngoài khi khởi chạy workflow
- Output Variable: Lưu kết quả xử lý của một node để node khác sử dụng
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ẽ:
- Nhận mã đơn hàng từ khách hàng
- Gọi API lấy thông tin đơn hàng
- Phân tích trạng thái đơn hàng bằng AI
- Tư vấn khách hàng theo tình huống cụ thể
- 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ó:
- Inputs: Các biến nhận vào (từ user hoặc từ output của node trước)
- Outputs: Các biến xuất ra (để node sau sử dụng)
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
- Sử dụng snake_case:
customer_name,order_id - Thêm prefix theo nguồn:
api_,user_,sys_ - Đặt tên mô tả rõ ràng, tránh từ viết tắt
2. Quản lý scope của biến
- Workflow-level: Khai báo trong Settings, dùng chung toàn workflow
- Node-level: Chỉ dùng trong node đó, không truyền ra ngoài
- Session-level: Lưu giữ trong phiên làm việc, qua nhiều lượt chat
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:
- Biến chưa được khai báo trong phần Inputs của node
- Node nguồn chưa được kết nối với node đích
- Tên biến bị sai chính tả (case-sensitive)
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:
- Output của node A là JSON object, nhưng node B cần string
- Array được truyền trực tiếp mà không duyệt qua từng phần tử
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:
- Node A phụ thuộc vào output của node B, nhưng node B lại phụ thuộc vào output của node A
- Tạo vòng lặp vô tận trong conditional branches
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:
- API bên thứ 3 phản hồi chậm (> 10 giây)
- Network latency cao
- Server API quá tải
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:
- Session variables tích lũy không được clear
- Conversation history quá dài không được cắt ngắ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
| Model | OpenAI ($/MTok) | HolySheep AI ($/MTok) | Tiết kiệm |
|---|---|---|---|
| GPT-4.1 | $60 | $8 | 86.7% |
| Claude Sonnet 4.5 | $15 | $15 | Tương đương |
| Gemini 2.5 Flash | $2.50 | $2.50 | Tương đương |
| DeepSeek V3.2 | $0.42 | $0.42 | Tươ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:
- OpenAI: ~$8,000/tháng
- HolySheep AI: ~$1,067/tháng
- Tiết kiệm: ~$6,933/tháng (~$83,200/năm)
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ẻ:
- Cách khai báo và sử dụng các loại biến khác nhau
- Workflow hoàn chỉnh để xây dựng hệ thống tư vấn đơn hàng
- 5 lỗi thường gặp và cách khắc phục chi tiết
- So sánh chi phí thực tế khi sử dụng HolySheep AI
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ý