Bạn có một đống tài liệu, hợp đồng, hoặc bài báo cần trích xuất thông tin quan trọng như tên công ty, ngày tháng, số tiền? Bạn nghe nói đến Dify và AI nhưng không biết bắt đầu từ đâu? Đừng lo — bài viết này sẽ hướng dẫn bạn tạo một workflow trích xuất thực thể (Entity Extraction) hoàn toàn miễn phí, không cần biết code.
Điểm đặc biệt: Tôi sẽ sử dụng HolySheep AI — một nền tảng API AI có tỷ giá chỉ ¥1 = $1, tiết kiệm đến 85% so với các nhà cung cấp khác. Đăng ký ngay để nhận tín dụng miễn phí!
Mục lục
- Entity Extraction là gì? Tại sao cần thiết?
- Chuẩn bị: Tài khoản HolySheep AI
- Bước 1: Cài đặt Dify Community Edition
- Bước 2: Kết nối Dify với HolySheep API
- Bước 3: Tạo Workflow trích xuất thực thể
- Bước 4: Cấu hình Prompt Template
- Bước 5: Kiểm tra và tối ưu
- Bước 6: Triển khai và sử dụng thực tế
- Lỗi thường gặp và cách khắc phục
Entity Extraction là gì? Tại sao cần thiết?
Entity Extraction (Trích xuất thực thể) là quá trình dùng AI để đọc văn bản và tự động nhận diện các thông tin quan trọng như:
- Tên người, tên công ty
- Ngày tháng năm sinh, ngày ký hợp đồng
- Số điện thoại, địa chỉ email
- Số tiền, tỷ lệ phần trăm
- Tên sản phẩm, mã vật tư
Ví dụ thực tế: Bạn có 500 hợp đồng PDF cần nhập vào Excel. Thay vì đọc từng hợp đồng và gõ tay, workflow này sẽ tự động trích xuất toàn bộ thông tin trong vài giây.
Chuẩn bị: Tài khoản HolySheep AI
Trước khi bắt đầu, bạn cần một tài khoản API. Tôi khuyên dùng HolySheep AI vì:
- Giá cả cạnh tranh: DeepSeek V3.2 chỉ $0.42/MT (1 triệu token)
- Độ trễ thấp: Dưới 50ms — nhanh hơn đa số nhà cung cấp
- Tích hợp đa nền tảng: Hỗ trợ WeChat Pay, Alipay
- Tín dụng miễn phí: Khi đăng ký mới
Bảng so sánh giá 2026:
- GPT-4.1: $8/MT
- Claude Sonnet 4.5: $15/MT
- Gemini 2.5 Flash: $2.50/MT
- DeepSeek V3.2: $0.42/MT ← Rẻ nhất!
Cách lấy API Key:
- Truy cập đăng ký tài khoản
- Đăng nhập vào dashboard
- Vào mục "API Keys" → Tạo key mới
- Copy key dạng:
hs-xxxxxxxxxxxx
Bước 1: Cài đặt Dify Community Edition
Dify là nền tảng mã nguồn mở giúp bạn tạo AI workflow mà không cần lập trình. Phiên bản Community hoàn toàn miễn phí.
Cách 1: Cài đặt bằng Docker (Khuyến nghị)
# Tải mã nguồn Dify
git clone https://github.com/langgenius/dify.git
Di chuyển vào thư mục
cd dify/docker
Tạo file cấu hình
cp .env.example .env
Khởi chạy Docker
docker-compose up -d
Chờ khởi động (khoảng 3-5 phút)
Truy cập: http://localhost:80
Cách 2: Cài đặt trên VPS
# Yêu cầu tối thiểu: 4GB RAM, 20GB SSD
Hệ điều hành: Ubuntu 22.04
Cập nhật hệ thống
sudo apt update && sudo apt upgrade -y
Cài đặt Docker
curl -fsSL https://get.docker.com | sh
Cài đặt Docker Compose
sudo apt install docker-compose -y
Clone và chạy Dify
git clone https://github.com/langgenius/dify.git
cd dify/docker
docker-compose up -d
Gợi ý ảnh chụp màn hình: Sau khi chạy xong, mở trình duyệt truy cập http://localhost:80, bạn sẽ thấy giao diện đăng nhập Dify.
Bước 2: Kết nối Dify với HolySheep API
Đây là bước quan trọng nhất! Bạn cần thêm HolySheep làm "nhà cung cấp AI" cho Dify.
2.1. Truy cập cài đặt
Trong Dify, vào: Settings → Model Providers
2.2. Thêm HolySheep làm Custom Provider
Vì HolySheep tương thích với OpenAI API format, bạn có thể dùng cách thêm Custom Provider:
# Trong Dify, chọn "Custom" hoặc "OpenAI-compatible"
Cấu hình:
Model Provider: Custom
Base URL: https://api.holysheep.ai/v1
API Key: YOUR_HOLYSHEEP_API_KEY
Các model được hỗ trợ:
- gpt-4.1 (GPT-4.1 — $8/MT)
- claude-sonnet-4.5 (Claude Sonnet 4.5 — $15/MT)
- gemini-2.5-flash (Gemini 2.5 Flash — $2.50/MT)
- deepseek-v3.2 (DeepSeek V3.2 — $0.42/MT) ← Rẻ và nhanh!
Gợi ý ảnh chụp màn hình: Chụp ảnh màn hình phần Model Providers với các trường đã điền.
2.3. Kiểm tra kết nối
Sau khi lưu, click "Test" để đảm bảo kết nối thành công. Nếu thấy thông báo "Connection successful", bạn đã sẵn sàng!
Bước 3: Tạo Workflow trích xuất thực thể
3.1. Tạo App mới
Trong Dify Dashboard, click "Create App" → Chọn "Import DSL" hoặc "Start from Blank"
3.2. Chọn loại App
App Type: Workflow
App Name: Entity Extraction Workflow
Description: Trích xuất thông tin từ văn bản tự động
3.3. Xây dựng Workflow
Workflow gồm 4 node chính:
- Start Node — Nhận văn bản đầu vào
- LLM Node — Gọi AI để trích xuất
- Template Node — Định dạng kết quả
- End Node — Xuất kết quả JSON
3.4. Cấu hình Start Node
# Trong Start Node, thêm biến đầu vào:
Variable Name: input_text
Label: Văn bản cần trích xuất
Type: Text
Required: Yes
Thêm biến thứ hai (tùy chọn):
Variable Name: extraction_type
Label: Loại thực thể cần trích xuất
Type: Select
Options:
- Tất cả
- Người và công ty
- Ngày tháng và số tiền
- Địa chỉ và liên hệ
Required: No
Default: Tất cả
Bước 4: Cấu hình Prompt Template cho LLM Node
4.1. Thêm LLM Node
Click dấu "+" sau Start Node → Chọn "LLM"
4.2. Cấu hình Model
Model Provider: Custom (HolySheep)
Model: deepseek-v3.2 # Chọn model rẻ nhất
Temperature: 0.1 # Thấp để kết quả nhất quán
System Prompt (Rất quan trọng!)
System Prompt:
---
Bạn là một chuyên gia trích xuất thông tin từ văn bản.
Nhiệm vụ: Đọc văn bản được cung cấp và trích xuất TẤT CẢ
các thực thể theo yêu cầu.
QUY TẮC:
1. Chỉ trích xuất thông tin CÓ TRONG văn bản, không tự thêm
2. Nếu không tìm thấy loại thực thể nào, ghi "Không tìm thấy"
3. Trả lời BẮT BUỘC theo format JSON bên dưới
4. Sử dụng tiếng Việt cho tất cả nhãn
ĐỊNH DẠNG KẾT QUẢ JSON:
{
"persons": ["Danh sách tên người"],
"companies": ["Danh sách tên công ty"],
"dates": ["Danh sách ngày tháng (YYYY-MM-DD)"],
"money": ["Danh sách số tiền kèm đơn vị"],
"phones": ["Danh sách số điện thoại"],
"emails": ["Danh sách email"],
"addresses": ["Danh sách địa chỉ"],
"products": ["Danh sách tên sản phẩm/mã vật tư"]
}
---
4.3. Cấu hình User Prompt
User Prompt:
---
Văn bản cần trích xuất:
{{input_text}}
{% if extraction_type != 'Tất cả' %}
Chỉ trích xuất: {{extraction_type}}
{% endif %}
Hãy trích xuất tất cả thông tin và trả về JSON.
---
4.4. Thêm Template Node (Định dạng kết quả)
Sau LLM Node, thêm Template Node để format đẹp hơn:
Template Content:
---
📋 KẾT QUẢ TRÍCH XUẤT THỰC THỂ
================================
👤 Người:
{% for person in result.persons %}
- {{person}}
{% endfor %}
🏢 Công ty:
{% for company in result.companies %}
- {{company}}
{% endfor %}
📅 Ngày tháng:
{% for date in result.dates %}
- {{date}}
{% endfor %}
💰 Số tiền:
{% for money in result.money %}
- {{money}}
{% endfor %}
📞 Điện thoại:
{% for phone in result.phones %}
- {{phone}}
{% endfor %}
📧 Email:
{% for email in result.emails %}
- {{email}}
{% endfor %}
📍 Địa chỉ:
{% for addr in result.addresses %}
- {{addr}}
{% endfor %}
📦 Sản phẩm:
{% for prod in result.products %}
- {{prod}}
{% endfor %}
---
4.5. Cấu hình End Node
# Kết nối Template Node với End Node
Output Variables:
- Variable: formatted_result
Type: Text
Value: {{template.output}} # Từ Template Node
- Variable: raw_json
Type: Text
Value: {{llm.output}} # JSON thô từ LLM
Gợi ý ảnh chụp màn hình: Chụp ảnh workflow hoàn chỉnh với 4 node nối tiếp nhau.
Bước 5: Kiểm tra Workflow
5.1. Chạy thử nghiệm
Click "Publish" → "Run" để kiểm tra với văn bản mẫu:
Văn bản test:
"Công ty TNHH ABC Việt Nam có trụ sở tại 123 Đường Nguyễn Huệ,
Quận 1, TP.HCM. Người đại diện pháp luật là ông Nguyễn Văn A,
sinh năm 1985. Hợp đồng được ký ngày 15/03/2026 với giá trị
500.000.000 VNĐ. Liên hệ: 0901-234-567 hoặc email [email protected].
Sản phẩm đặt hàng: Mã VT-001, Mã VT-002."
5.2. Kết quả mong đợi
📋 KẾT QUẢ TRÍCH XUẤT THỰC THỂ
================================
👤 Người:
- Nguyễn Văn A
🏢 Công ty:
- Công ty TNHH ABC Việt Nam
📅 Ngày tháng:
- 2026-03-15
💰 Số tiền:
- 500.000.000 VNĐ
📞 Điện thoại:
- 0901-234-567
📧 Email:
- [email protected]
📍 Địa chỉ:
- 123 Đường Nguyễn Huệ, Quận 1, TP.HCM
📦 Sản phẩm:
- Mã VT-001
- Mã VT-002
5.3. Đo hiệu suất
Với HolySheep AI, thời gian xử lý chỉ khoảng 800-1200ms cho văn bản 500 từ. Chi phí ước tính: $0.00005 (rất rẻ!).
Bước 6: Triển khai và sử dụng thực tế
6.1. API Endpoint
Sau khi Publish, Dify sẽ cung cấp API endpoint để gọi từ ứng dụng khác:
# API Endpoint
POST https://your-dify-domain/v1/workflows/run
Headers
Authorization: Bearer YOUR-DIFY-API-KEY
Content-Type: application/json
Request Body
{
"inputs": {
"input_text": "Nội dung văn bản cần trích xuất...",
"extraction_type": "Tất cả"
},
"response_mode": "blocking",
"user": "user-123"
}
Response
{
"data": {
"outputs": {
"formatted_result": "📋 KẾT QUẢ...",
"raw_json": "{\"persons\":[\"Nguyễn Văn A\"]...}"
},
"latency": 1.2
}
}
6.2. Tích hợp với Python
# File: extract_entities.py
import requests
import json
def extract_entities(text, api_key, dify_url):
"""
Gọi Dify workflow để trích xuất thực thể
"""
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
payload = {
"inputs": {
"input_text": text,
"extraction_type": "Tất cả"
},
"response_mode": "blocking",
"user": "automation-script"
}
response = requests.post(
f"{dify_url}/v1/workflows/run",
headers=headers,
json=payload,
timeout=30
)
if response.status_code == 200:
result = response.json()
return json.loads(result['data']['outputs']['raw_json'])
else:
raise Exception(f"Lỗi API: {response.status_code}")
Sử dụng
if __name__ == "__main__":
# Cấu hình
DIFY_API_KEY = "app-xxxxxxxxxxxx" # Key từ Dify
DIFY_URL = "https://your-dify-domain.com"
# Văn bản cần xử lý
sample_text = """
Hợp đồng số HD-2026-001 được ký giữa Công ty FPT
với khách hàng bà Trần Thị B. Giá trị hợp đồng:
1.500.000.000 VNĐ. Ngày ký: 20/04/2026.
"""
# Gọi API
result = extract_entities(sample_text, DIFY_API_KEY, DIFY_URL)
print("Kết quả trích xuất:")
print(json.dumps(result, ensure_ascii=False, indent=2))
6.3. Tích hợp với ứng dụng web
# Ví dụ với JavaScript/Fetch API
async function extractEntities(text) {
const response = await fetch('https://your-dify.com/v1/workflows/run', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR-DIFY-KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
inputs: {
input_text: text,
extraction_type: "Tất cả"
},
response_mode: "blocking"
})
});
const data = await response.json();
return JSON.parse(data.data.outputs.raw_json);
}
// Sử dụng
const text = "Công ty Vingroup của ông Phạm Nhật Vượng...";
const entities = await extractEntities(text);
console.log(entities.companies); // ["Vingroup"]
console.log(entities.persons); // ["Phạm Nhật Vượng"]
Tối ưu hóa Workflow
Mẹo 1: Chọn Model phù hợp
- DeepSeek V3.2 ($0.42/MT): Rẻ nhất, tốc độ nhanh, phù hợp cho hầu hết trường hợp
- Gemini 2.5 Flash ($2.50/MT): Cân bằng giữa giá và chất lượng
- GPT-4.1 ($8/MT): Chất lượng cao nhất, dùng khi cần độ chính xác tuyệt đối
Mẹo 2: Caching để tiết kiệm chi phí
Nếu nhiều văn bản có nội dung trùng lặp, bật tính năng Context Caching để giảm 90% chi phí:
# Trong LLM Node, bật Context Caching
Model Settings:
Enable Context Cache: Yes
Cache Window: 1000 tokens
Kết quả: Giảm chi phí từ $0.42 xuống còn $0.04/MT
cho dữ liệu trùng lặp!
Mẹo 3: Batch processing
# Xử lý nhiều văn bản cùng lúc
async def batch_extract(texts, api_key, dify_url, batch_size=5):
results = []
for i in range(0, len(texts), batch_size):
batch = texts[i:i + batch_size]
# Xử lý song song
tasks = [
extract_entities(text, api_key, dify_url)
for text in batch
]
batch_results = await asyncio.gather(*tasks)
results.extend(batch_results)
print(f"Đã xử lý {min(i + batch_size, len(texts))}/{len(texts)}")
return results
Lỗi thường gặp và cách khắc phục
Lỗi 1: "Connection Failed" khi kết nối HolySheep API
# Triệu chứng:
Lỗi: "Failed to connect to api.holysheep.ai"
Nguyên nhân:
1. API Key sai hoặc chưa kích hoạt
2. URL không đúng format
3. Firewall chặn kết nối
Cách khắc phục:
1. Kiểm tra API Key trong HolySheep Dashboard
- Truy cập: https://www.holysheep.ai/dashboard/api-keys
- Đảm bảo key còn hiệu lực (không bị revoke)
2. Xác nhận Base URL chính xác:
✅ https://api.holysheep.ai/v1
❌ https://api.holysheep.ai/ (thừa dấu /)
❌ https://holysheep.ai/v1 (thiếu api.)
3. Test bằng curl:
curl -X POST https://api.holysheep.ai/v1/chat/completions \
-H "Authorization: Bearer YOUR_HOLYSHEEP_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"deepseek-v3.2","messages":[{"role":"user","content":"test"}]}'
Nếu nhận được response JSON → Kết nối OK
Nếu nhận 401/403 → Kiểm tra lại API Key
Lỗi 2: LLM Node trả về text thay vì JSON
# Triệu chứng:
AI trả lời bằng văn bản thay vì JSON hợp lệ
Ví dụ: "Tôi đã trích xuất được các thông tin sau..."
Nguyên nhân:
System Prompt chưa rõ ràng về định dạng
Temperature quá cao → AI sáng tạo quá mức
Cách khắc phục:
1. Cập nhật System Prompt với instruction mạnh hơn:
SYSTEM_PROMPT = """
BẮT BUỘC phải trả lời bằng JSON thuần túy.
KHÔNG viết thêm giải thích.
KHÔNG có markdown code block.
KHÔNG có câu chào hay kết luận.
CHỈ trả về JSON như ví dụ:
{"persons":[],"companies":[],"dates":[],"money":[],"phones":[],"emails":[],"addresses":[],"products":[]}
"""
2. Giảm Temperature xuống 0.1
Model Settings:
Temperature: 0.1
3. Thêm ví dụ trong Prompt:
"""
VÍ DỤ ĐẦU VÀO: "Ông Lê Minh ký hợp đồng với Công ty XYZ ngày 01/01/2026"
VÍ DỤ ĐẦU RA: {"persons":["Lê Minh"],"companies":["Công ty XYZ"],"dates":["2026-01-01"],"money":[],"phones":[],"emails":[],"addresses":[],"products":[]}
"""
4. Nếu vẫn lỗi, thêm Code Node để validate JSON:
Trong Workflow, thêm Code Node sau LLM:
def validate_json(output_text):
import json
try:
# Loại bỏ markdown code block nếu có
clean_text = output_text.strip()
if clean_text.startswith("```"):
clean_text = clean_text.split("```")[1]
if clean_text.startswith("json"):
clean_text = clean_text[4:]
return json.loads(clean_text)
except:
return {"error": "Invalid JSON", "raw": output_text}
Lỗi 3: Kết quả trích xuất thiếu hoặc sai
# Triệu chứng:
- Thiếu thông tin quan trọng
- Thông tin bị trích xuất sai
- Format ngày tháng không nhất quán
Nguyên nhân:
1. Văn bản đầu vào quá phức tạp hoặc nhiễu
2. Prompt chưa bao quát hết các trường hợp
3. Model không hiểu ngữ cảnh
Cách khắc phục:
1. Tiền xử lý văn bản:
def preprocess_text(text):
# Loại bỏ ký tự đặc biệt thừa
text = text.replace('\r\n', '\n')
text = ' '.join(text.split()) # Xóa khoảng trắng thừa
return text
2. Cải thiện Prompt:
IMPROVED_PROMPT = """
NHIỆM VỤ: Trích xuất thực thể từ văn bản.
LƯU Ý QUAN TRỌNG:
- Tên người có thể đi sau "ông", "bà", "anh", "chị"
- Tên công ty có thể đi sau "Công ty", "CTY", "TNHH", "ABC"
- Ngày tháng có thể format: DD/MM/YYYY, DD-MM-YYYY, YYYY-MM-DD
- Chuyển TẤT CẢ ngày tháng sang YYYY-MM-DD
- Số tiền có thể có: VNĐ, đ, triệu, tỷ, $
CHECKLIST TRƯỚC KHI TRẢ LỜI:
☐ Đã tìm hết tất cả tên người?
☐ Đã tìm hết tất c