Bối Cảnh Thực Tế: Khi Team E-Commerce Của Tôi Thay Đổi Cách Làm Việc
Năm ngoái, team data của một startup thương mại điện tử nơi tôi làm việc phải đối mặt với một bài toán quen thuộc: mỗi ngày, đội ngũ kinh doanh yêu cầu báo cáo doanh thu, tỷ lệ chuyển đổi, phân tích hành vi khách hàng. Một analyst phải mất 2-3 giờ để query dữ liệu từ PostgreSQL, xử lý bằng Python pandas, tạo biểu đồ bằng matplotlib, rồi viết báo cáo bằng Google Docs. Tổng cộng 5 ngày công mỗi tuần chỉ để sản xuất những báo cáo lặp đi lặp lại.
Chúng tôi quyết định xây dựng một Data Analysis Agent sử dụng AutoGen của Microsoft. Kết quả: một analyst giờ chỉ cần gửi yêu cầu bằng ngôn ngữ tự nhiên, hệ thống tự động truy vấn database, phân tích dữ liệu, tạo biểu đồ và xuất báo cáo PDF trong vòng 45 giây. Bài viết này sẽ hướng dẫn bạn xây dựng hệ thống tương tự, với chi phí vận hành chỉ bằng 15% so với việc sử dụng API của OpenAI.
AutoGen Là Gì Và Tại Sao Nó Phù Hợp Cho Data Analysis
AutoGen là framework multi-agent của Microsoft cho phép nhiều AI agent giao tiếp và cộng tác với nhau để hoàn thành các tác vụ phức tạp. Trong bài toán phân tích dữ liệu, chúng ta có thể thiết kế một hệ thống gồm nhiều agent chuyên biệt:
Data Engineer Agent - xử lý kết nối database và truy vấn SQL.
Data Analyst Agent - phân tích dữ liệu, tính toán các chỉ số.
Visualization Agent - tạo biểu đồ và đồ thị.
Report Writer Agent - tổng hợp thành báo cáo hoàn chỉnh.
Điểm mạnh của AutoGen là khả năng hội thoại giữa các agent: Data Analyst có thể yêu cầu Data Engineer bổ sung thêm metrics, Visualization Agent có thể hỏi Analyst muốn loại biểu đồ nào phù hợp với dữ liệu. Toàn bộ quy trình diễn ra tự động mà không cần can thiệp thủ công.
Cài Đặt Môi Trường Và Cấu Hình
Trước tiên, bạn cần cài đặt các thư viện cần thiết. Chúng ta sẽ sử dụng AutoGen kết hợp với HolySheep AI làm backend, giúp tiết kiệm đáng kể chi phí API. HolySheep AI cung cấp giao diện tương thích với OpenAI API, cho phép chuyển đổi dễ dàng với chi phí chỉ từ $0.42/MTok cho DeepSeek V3.2.
pip install autogen-agentchat autogen-agentchat-contrib
pip install sqlalchemy pymysql pandas matplotlib seaborn plotly
pip install python-dotenv reportlab fpdf2
Tạo file cấu hình môi trường:
# .env
HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY
HOLYSHEEP_BASE_URL=https://api.holysheep.ai/v1
Database configuration
DB_HOST=localhost
DB_PORT=3306
DB_USER=your_username
DB_PASSWORD=your_password
DB_NAME=ecommerce_db
Xây Dựng Các Agent Chuyên Biệt
Chúng ta sẽ tạo một hệ thống 4 agent với chức năng riêng biệt. Mỗi agent được cấu hình với system prompt mô tả rõ vai trò và khả năng.
import os
import autogen
from autogen import ConversableAgent
from dotenv import load_dotenv
load_dotenv()
Cấu hình HolySheep AI làm LLM backend
config_list = [
{
"model": "gpt-4.1",
"api_key": os.getenv("HOLYSHEEP_API_KEY"),
"base_url": os.getenv("HOLYSHEEP_BASE_URL"),
}
]
llm_config = {
"config_list": config_list,
"temperature": 0.7,
"max_tokens": 2000,
}
============================================
AGENT 1: Data Engineer - Truy vấn Database
============================================
data_engineer_system_prompt = """Bạn là Data Engineer Agent chuyên nghiệp.
Nhiệm vụ của bạn:
1. Kết nối và truy vấn PostgreSQL/MySQL database
2. Viết SQL query tối ưu để lấy dữ liệu theo yêu cầu
3. Trả về kết quả dưới dạng pandas DataFrame hoặc dictionary
Khi nhận được yêu cầu phân tích:
- Xác định các bảng cần truy vấn
- Viết SQL với các JOIN, GROUP BY, aggregate functions phù hợp
- Thực thi query và trả về dữ liệu thô
Luôn đảm bảo SQL an toàn, tránh SQL injection."""
data_engineer = ConversableAgent(
name="Data_Engineer",
system_message=data_engineer_system_prompt,
llm_config=llm_config,
code_execution_config={
"work_dir": "data_output",
"use_docker": False
},
)
============================================
AGENT 2: Data Analyst - Phân Tích Chỉ Số
============================================
analyst_system_prompt = """Bạn là Data Analyst Agent với 5 năm kinh nghiệm.
Nhiệm vụ của bạn:
1. Phân tích dữ liệu thô từ Data Engineer
2. Tính toán các KPI: growth rate, conversion rate, churn rate, ARPU, LTV
3. Phát hiện insights và anomalies trong dữ liệu
4. Đề xuất các visualization phù hợp
Phương pháp làm việc:
- Sử dụng pandas để xử lý và phân tích dữ liệu
- Tính toán descriptive statistics (mean, median, std, percentiles)
- So sánh với baseline/previous period nếu có
- Đưa ra 3-5 key insights ngắn gọn
Trả về kết quả có cấu trúc rõ ràng, dễ hiểu."""
data_analyst = ConversableAgent(
name="Data_Analyst",
system_message=analyst_system_prompt,
llm_config=llm_config,
code_execution_config={
"work_dir": "data_output",
"use_docker": False
},
)
============================================
AGENT 3: Visualization Agent - Tạo Biểu Đồ
============================================
viz_system_prompt = """Bạn là Visualization Expert Agent.
Nhiệm vụ của bạn:
1. Chọn loại biểu đồ phù hợp với từng loại dữ liệu
2. Tạo biểu đồ đẹp, chuyên nghiệp với matplotlib/seaborn/plotly
3. Xuất biểu đồ ra file PNG với độ phân giải cao
Quy tắc chọn biểu đồ:
- Time series data → Line chart
- Categorical comparison → Bar chart
- Distribution → Histogram hoặc Box plot
- Correlation → Scatter plot hoặc Heatmap
- Part-to-whole → Pie chart hoặc Donut chart
Yêu cầu về biểu đồ:
- Tiêu đề rõ ràng, font size đủ lớn
- Axis labels có đơn vị
- Màu sắc nhất quán theo brand guidelines
- Legend nếu có nhiều series"""
viz_agent = ConversableAgent(
name="Visualization_Agent",
system_message=viz_system_prompt,
llm_config=llm_config,
code_execution_config={
"work_dir": "data_output",
"use_docker": False
},
)
============================================
AGENT 4: Report Writer - Tổng Hợp Báo Cáo
============================================
report_writer_system_prompt = """Bạn là Report Writer Agent chuyên viết báo cáo kinh doanh.
Nhiệm vụ của bạn:
1. Tổng hợp insights từ Data Analyst
2. Viết báo cáo ngắn gọn, dễ hiểu cho business users
3. Kết hợp text và visualizations thành PDF hoàn chỉnh
Cấu trúc báo cáo:
1. Executive Summary (3-5 câu)
2. Key Metrics (các số liệu chính)
3. Insights & Findings
4. Charts & Visualizations
5. Recommendations
Phong cách viết:
- Ngôn ngữ đơn giản, tránh jargon
- Sử dụng bullet points cho dễ đọc
- Highlight các con số quan trọng
- Kết luận có action items cụ thể"""
report_writer = ConversableAgent(
name="Report_Writer",
system_message=report_writer_system_prompt,
llm_config=llm_config,
code_execution_config={
"work_dir": "data_output",
"use_docker": False
},
)
print("Da khoi tao 4 agents thanh cong!")
Kết Nối Database Và Xử Lý Dữ Liệu
Tiếp theo, chúng ta cần tạo module xử lý database để Data Engineer Agent có thể truy vấn dữ liệu. Tôi sử dụng SQLAlchemy để kết nối với MySQL/PostgreSQL một cách an toàn.
from sqlalchemy import create_engine, text
import pandas as pd
import os
class DatabaseConnector:
"""Kết nối và truy vấn database"""
def __init__(self):
self.engine = create_engine(
f"mysql+pymysql://{os.getenv('DB_USER')}:{os.getenv('DB_PASSWORD')}"
f"@{os.getenv('DB_HOST')}:{os.getenv('DB_PORT')}/{os.getenv('DB_NAME')}"
)
def execute_query(self, sql_query: str) -> pd.DataFrame:
"""Thực thi SQL query và trả về DataFrame"""
try:
with self.engine.connect() as conn:
df = pd.read_sql(text(sql_query), conn)
return df
except Exception as e:
print(f"Loi truy van: {e}")
return pd.DataFrame()
def get_sales_data(self, start_date: str, end_date: str) -> pd.DataFrame:
"""Lấy dữ liệu bán hàng trong khoảng thời gian"""
query = f"""
SELECT
DATE(created_at) as date,
product_category,
COUNT(DISTINCT order_id) as order_count,
COUNT(DISTINCT customer_id) as customer_count,
SUM(quantity) as total_units,
SUM(revenue) as total_revenue,
SUM(revenue) / COUNT(DISTINCT customer_id) as arpu
FROM orders
WHERE created_at BETWEEN '{start_date}' AND '{end_date}'
GROUP BY DATE(created_at), product_category
ORDER BY date, product_category
"""
return self.execute_query(query)
def get_customer_metrics(self, period: str = "30 days") -> pd.DataFrame:
"""Lấy metrics về khách hàng"""
query = f"""
SELECT
DATE(created_at) as date,
COUNT(*) as new_customers,
COUNT(DISTINCT session_id) as sessions,
COUNT(DISTINCT CASE WHEN event_type = 'purchase' THEN customer_id END) as buyers,
AVG(time_on_site) as avg_session_duration
FROM customer_events
WHERE created_at >= NOW() - INTERVAL {period}
GROUP BY DATE(created_at)
ORDER BY date
"""
return self.execute_query(query)
Ví dụ sử dụng
db = DatabaseConnector()
sales_df = db.get_sales_data("2025-01-01", "2025-01-31")
print(f"Da lay {len(sales_df)} dong du lieu ban hang")
print(sales_df.head())
Xây Dựng Orchestrator - Điều Phối Toàn Bộ Quy Trình
Bây giờ chúng ta cần một Orchestrator Agent để điều phối toàn bộ quy trình giữa các agent. Agent này sẽ nhận yêu cầu từ user, phân phối công việc cho các agent phù hợp, và tổng hợp kết quả cuối cùng.
import json
from datetime import datetime
from typing import Dict, List, Any
class DataAnalysisOrchestrator:
"""Điều phối quy trình phân tích dữ liệu giữa các agents"""
def __init__(self, db: DatabaseConnector):
self.db = db
self.analysis_results = {}
def run_full_analysis(self, user_request: str, date_range: tuple) -> Dict:
"""
Chạy phân tích hoàn chỉnh theo yêu cầu
"""
start_date, end_date = date_range
print(f"Bat dau phan tich: {start_date} -> {end_date}")
print(f"Yeu cau: {user_request}")
# Step 1: Data Engineer lấy dữ liệu
print("\n[1/4] Data Engineer dang truy van database...")
sales_data = self.db.get_sales_data(start_date, end_date)
customer_data = self.db.get_customer_metrics("30 days")
if sales_data.empty:
return {"error": "Khong co du lieu trong khoang thoi gian nay"}
# Step 2: Data Analyst phân tích
print("\n[2/4] Data Analyst dang xu ly so lieu...")
analysis_result = self._analyze_data(sales_data, customer_data)
# Step 3: Visualization Agent tạo biểu đồ
print("\n[3/4] Visualization Agent dang tao bieu do...")
charts = self._create_visualizations(sales_data, analysis_result)
# Step 4: Report Writer tạo báo cáo
print("\n[4/4] Report Writer dang tao bao cao...")
report = self._generate_report(
user_request,
analysis_result,
charts,
date_range
)
return {
"status": "success",
"analysis": analysis_result,
"charts": charts,
"report": report,
"metadata": {
"date_range": date_range,
"generated_at": datetime.now().isoformat(),
"total_records": len(sales_data)
}
}
def _analyze_data(self, sales_df: pd.DataFrame, customer_df: pd.DataFrame) -> Dict:
"""Phân tích dữ liệu và tính toán KPIs"""
# KPIs cơ bản
total_revenue = sales_df['total_revenue'].sum()
total_orders = sales_df['order_count'].sum()
total_customers = sales_df['customer_count'].sum()
total_units = sales_df['total_units'].sum()
# Growth rate so với period trước (giả định)
avg_daily_revenue = total_revenue / sales_df['date'].nunique()
# Top categories
category_revenue = sales_df.groupby('product_category')['total_revenue'].sum()
top_categories = category_revenue.nlargest(5).to_dict()
# Revenue trend
daily_revenue = sales_df.groupby('date')['total_revenue'].sum()
insights = []
# Auto-generate insights dựa trên data
if total_revenue > 0:
insights.append(f"Doanh thu tong: ${total_revenue:,.2f}")
if avg_daily_revenue > 10000:
insights.append("Hieu suat tot, doanh thu trung binh ngay vuot muc 10K")
if len(top_categories) > 0:
top_cat = max(top_categories, key=top_categories.get)
insights.append(f"Danh muc manh nhat: {top_cat}")
return {
"kpis": {
"total_revenue": total_revenue,
"total_orders": total_orders,
"total_customers": total_customers,
"total_units": total_units,
"arpu": total_revenue / total_customers if total_customers > 0 else 0,
"avg_daily_revenue": avg_daily_revenue,
},
"top_categories": top_categories,
"daily_trend": daily_revenue.to_dict(),
"insights": insights
}
def _create_visualizations(self, sales_df: pd.DataFrame, analysis: Dict) -> Dict[str, str]:
"""Tạo các biểu đồ và lưu ra file"""
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
charts = {}
# Chart 1: Daily Revenue Trend
plt.figure(figsize=(12, 6))
daily = sales_df.groupby('date')['total_revenue'].sum()
plt.plot(daily.index, daily.values, marker='o', linewidth=2, color='#2E86AB')
plt.title('Doanh Thu Theo Ngay', fontsize=16, fontweight='bold')
plt.xlabel('Ngay')
plt.ylabel('Doanh Thu ($)')
plt.grid(True, alpha=0.3)
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%d/%m'))
Tài nguyên liên quan
Bài viết liên quan