Tìm kiếm quần áo dựa trên hoa văn và chất liệu vải với công nghệ AI Visual Search và Vector Database!

Mục lục

AI Visual Search dựa trên thuộc tính sản phẩm chi tiết

Tìm kiếm quần áo theo hoa văn & chất liệu vải bằng Vector Database (Milvus / Pinecone)

⚡ Mục tiêu: Xây dựng hệ thống visual search cho nền tảng thương mại điện tử quy mô 100‑1000 tỷ VNĐ/tháng, cho phép người dùng tải ảnh và nhận danh sách sản phẩm tương đồng dựa trên hoa văn, họa tiết, chất liệu vải.
🛡️ Đối tượng: Kiến trúc sư giải pháp, senior backend, data engineer, product owner.


1. Bối cảnh thị trường & nhu cầu

  • Statista 2024: Thị trường visual search toàn cầu đạt US$ 13,2 tỷ, tăng trưởng CAGR 20 % (2024‑2029).
  • Cục TMĐT VN 2024: GMV thương mại điện tử Việt Nam 2023 đạt 1,2 nghìn tỷ VNĐ, tăng 30 % so với 2022.
  • Shopify Commerce Trends 2025: 45 % các merchant dự định tích hợp AI visual search trong vòng 12 tháng tới.
  • Gartner 2024: 70 % nhà bán lẻ sẽ triển khai công nghệ vector search vào năm 2026 để cải thiện trải nghiệm “search‑by‑image”.

🧩 Kết luận: Nhu cầu “tìm kiếm bằng hình ảnh” đang bùng nổ, đặc biệt trong ngành thời trang nơi hoa văn & chất liệu là yếu tố quyết định mua hàng.


2. Kiến trúc tổng quan

+-------------------+      +-------------------+      +-------------------+
|   Frontend (SPA)  | ---> |   API Gateway     | ---> |   FastAPI Service |
+-------------------+      +-------------------+      +-------------------+
                                 |  (REST/GraphQL)
                                 v
                        +-------------------+
                        |   Vector DB (Milvus|
                        |   / Pinecone)      |
                        +-------------------+
                                 |
                                 v
                        +-------------------+
                        |   Metadata Store  |
                        |   (PostgreSQL)    |
                        +-------------------+
                                 |
                                 v
                        +-------------------+
                        |   Cache (Redis)   |
                        +-------------------+

2.1 Workflow vận hành (ASCII art)

┌─────────────┐   1. Upload image
│   Client    │──────────────────────►│   Frontend   │
└─────┬───────┘                       └─────┬───────┘
      │                                   │
      │ 2. POST /search/image               │
      ▼                                   ▼
┌─────────────┐   3. Validate & store temp   ┌─────────────┐
│ API Gateway │──────────────────────────►│   FastAPI   │
└─────┬───────┘                           └─────┬───────┘
      │                                         │
      │ 4. Extract embedding (CLIP)              │
      ▼                                         ▼
┌─────────────┐   5. Query Vector DB   ┌─────────────────────┐
│   Worker    │──────────────────────►│   Milvus / Pinecone │
└─────┬───────┘                       └─────────────┬───────┘
      │                                         │
      │ 6. Retrieve top‑K IDs                     │
      ▼                                         ▼
┌─────────────┐   7. Join metadata   ┌─────────────────────┐
│   Redis     │◄─────────────────────│   PostgreSQL        │
└─────┬───────┘                       └─────────────────────┘
      │
      │ 8. Return product list (JSON)
      ▼
┌─────────────┐
│   Client    │
└─────────────┘

3. Lựa chọn Vector Database – So sánh 4 công nghệ

Tiêu chí Milvus (OSS) Pinecone (Managed) Weaviate (OSS + Cloud) Qdrant (OSS)
Kiểu triển khai Docker / K8s, tự quản SaaS, không cần vận hành Docker / K8s, hỗ trợ GraphQL Docker / K8s, nhẹ, hỗ trợ Rust client
Hiệu năng 1.2 M QPS (GPU) – 0.8 M QPS (CPU) 1.5 M QPS (GPU) – 1.0 M QPS (CPU) 1.0 M QPS (GPU) – 0.6 M QPS (CPU) 0.9 M QPS (GPU) – 0.5 M QPS (CPU)
Chi phí Server + GPU (USD 2,500/tháng) Pay‑as‑you‑go, $0.30 per 1 M queries Cloud $0.25 per 1 M queries, self‑host $1,200 Self‑host $1,800/tháng (GPU)
Quy mô dữ liệu 10 B vectors, 1 TB RAM 5 B vectors, 500 GB RAM (managed) 8 B vectors, 800 GB RAM 6 B vectors, 600 GB RAM
Tính năng bổ trợ IVF‑PQ, HNSW, hybrid search Metadata filter, TTL, auto‑scaling GraphQL, semantic‑search, hybrid HNSW, IVF‑Flat, dynamic sharding
Độ ổn định 99.9 % (SLA tự quản) 99.95 % (SLA cloud) 99.9 % (OSS) / 99.95 % (cloud) 99.8 % (OSS)
Độ phức tạp DevOps Cao (cài đặt, backup, monitoring) Thấp (API key, endpoint) Trung bình (helm chart) Trung bình (Docker compose)
Hỗ trợ vector type Float32, Binary Float32 Float32, Binary Float32

🛡️ Đề xuất: Milvus cho môi trường tự quản (độ tùy biến cao, chi phí GPU ổn định). Pinecone là lựa chọn nhanh cho MVP khi không muốn đầu tư hạ tầng.


4. Các bước triển khai – 6 Phase chi tiết

Phase 1 – Phân tích yêu cầu & thiết kế kiến trúc

Công việc Người chịu trách nhiệm Thời gian (tuần) Dependency
Thu thập yêu cầu visual search Product Owner 1‑2
Định nghĩa KPI (latency, precision) Data Analyst 2‑3
Lựa chọn Vector DB (Milvus) Solution Architect 3‑4
Thiết kế data model (product, attributes) DB Engineer 4‑5
Đánh giá rủi ro bảo mật dữ liệu hình ảnh Security Lead 5‑6

Phase 2 – Thu thập & tiền xử lý dữ liệu

Công việc Người chịu trách nhiệm Thời gian (tuần) Dependency
Crawl ảnh sản phẩm (10 M) Data Engineer 1‑3 Phase 1
Gắn nhãn hoa văn & chất liệu (label‑studio) Annotation Team 2‑5 Phase 2
Chuẩn hoá kích thước (256×256) & màu sắc ML Engineer 4‑6 Phase 2
Lưu metadata vào PostgreSQL DB Engineer 5‑7 Phase 2
Kiểm tra chất lượng dữ liệu (QC) QA Lead 6‑8 Phase 2

Phase 3 – Xây dựng mô hình embedding

Công việc Người chịu trách nhiệm Thời gian (tuần) Dependency
Chọn mô hình CLIP (ViT‑B/32) ML Engineer 1‑2 Phase 2
Fine‑tune trên dataset hoa văn VN ML Engineer 3‑5 Phase 3
Export embedding (float32, 512‑dim) ML Engineer 5‑6 Phase 3
Đánh giá độ tương đồng (Recall@10) Data Scientist 6‑7 Phase 3
Tối ưu batch inference (GPU) DevOps 7‑8 Phase 3

Phase 4 – Triển khai Vector DB & API

Công việc Người chịu trách nhiệm Thời gian (tuần) Dependency
Cài đặt Milvus (Docker‑Compose) DevOps 1‑2 Phase 3
Tạo collection “fashion_fabric” (HNSW) Backend Engineer 2‑3 Phase 4
Nhập vector + ID (bulk) Data Engineer 3‑5 Phase 4
Xây dựng FastAPI endpoint /search/image Backend Engineer 4‑6 Phase 4
Kiểm thử API (load 5 k QPS) QA Lead 6‑8 Phase 4

Phase 5 – Tích hợp Frontend & UI/UX

Công việc Người chịu trách nhiệm Thời gian (tuần) Dependency
Thiết kế UI “Upload & Search” UI/UX Designer 1‑2 Phase 4
Implement React component (Dropzone) Frontend Engineer 2‑4 Phase 5
Gọi API, hiển thị kết quả (grid) Frontend Engineer 4‑5 Phase 5
Caching layer (Redis) cho query ID Backend Engineer 5‑6 Phase 5
A/B test UI/UX (Google Optimize) Product Owner 6‑8 Phase 5

Phase 6 – Kiểm thử, tối ưu & Go‑Live

Công việc Người chịu trách nhiệm Thời gian (tuần) Dependency
Load test toàn bộ pipeline (k6) QA Lead 1‑2 Phase 5
Tối ưu latency < 200 ms (GPU) DevOps 2‑3 Phase 6
Đánh giá KPI (Precision ≥ 0.85) Data Analyst 3‑4 Phase 6
Chuẩn bị checklist go‑live Release Manager 4‑5 Phase 6
Go‑Live & monitor (24 h) Release Manager 5‑6 Phase 6

🗓️ Tổng thời gian: ≈ 30 tuần (≈ 7 tháng) từ khởi động tới go‑live.


5. Chi phí chi tiết 30 tháng (USD)

Hạng mục Năm 1 Năm 2 Năm 3 Tổng cộng
GPU Server (Milvus + Inference) $2,500 / tháng × 12 = $30,000 $2,200 / tháng × 12 = $26,400 $2,200 / tháng × 12 = $26,400 $82,800
PostgreSQL (RDS) $300 / tháng × 12 = $3,600 $300 / tháng × 12 = $3,600 $300 / tháng × 12 = $3,600 $10,800
Redis (ElastiCache) $150 / tháng × 12 = $1,800 $150 / tháng × 12 = $1,800 $150 / tháng × 12 = $1,800 $5,400
CDN (Cloudflare) – Image cache $0.10 / GB × 5 TB = $500 $0.09 / GB × 5 TB = $450 $0.09 / GB × 5 TB = $450 $1,400
Licensing (Label‑Studio Enterprise) $2,000 / năm $2,000 / năm $2,000 / năm $6,000
DevOps / SRE (2 FTE) $4,000 / tháng × 12 = $48,000 $4,000 / tháng × 12 = $48,000 $4,000 / tháng × 12 = $48,000 $144,000
AI Model (OpenAI CLIP API – optional) $0 (self‑host) $0 $0 $0
Contingency (10 %) $9,090 $8,190 $8,190 $25,470
Tổng cộng $95,990 $88,440 $88,440 $272,870

⚡ ROI tính toán
ROI = (Tổng lợi ích – Chi phí đầu tư) / Chi phí đầu tư × 100%
Giả sử tăng doanh thu 5 % nhờ conversion cải thiện (≈ $15 M/năm), ROI năm 1 ≈ 156 %.


6. Timeline triển khai – Gantt chart (text)

[Week]   1-4   5-8   9-12  13-16  17-20  21-24  25-28  29-30
Phase1   ████
Phase2        ████████
Phase3               ████████
Phase4                       ████████
Phase5                               ████████
Phase6                                      ██████
  • Phase 1: 1‑4 tuần
  • Phase 2: 5‑12 tuần (đồng thời một phần Phase 1)
  • Phase 3: 9‑16 tuần (chồng lên Phase 2)
  • Phase 4: 13‑20 tuần
  • Phase 5: 17‑24 tuần
  • Phase 6: 25‑30 tuần

7. Tài liệu bàn giao cuối dự án (15 mục)

STT Tài liệu Người viết Nội dung chính
1 Architecture Diagram Solution Architect Kiến trúc tổng quan, các thành phần, flow dữ liệu
2 API Specification (OpenAPI 3.0) Backend Engineer Endpoint /search/image, request/response schema
3 Data Model ERD DB Engineer Bảng product, attribute, image_meta
4 Embedding Pipeline Code ML Engineer Script tiền xử lý, inference, lưu vector
5 Milvus Deployment Guide DevOps Docker‑Compose, Helm chart, backup/restore
6 CI/CD Pipeline (GitHub Actions) DevOps Build, test, deploy workflow
7 Performance Test Report QA Lead K6 scripts, latency, QPS, bottleneck
8 Security Review Checklist Security Lead Pen‑test, data privacy, IAM
9 Monitoring Dashboard (Grafana) SRE Metrics: latency, error rate, GPU util
10 Rollback & Disaster Recovery Plan Release Manager Steps, scripts, RTO/RPO
11 User Guide – Frontend UI/UX Designer Hướng dẫn upload, interpret results
12 Admin Console Manual Backend Engineer Quản lý collection, re‑index
13 Cost & Billing Report Finance Analyst Chi phí thực tế, dự báo
14 KPI Dashboard (Looker) Data Analyst Precision, Recall, Conversion uplift
15 Project Retrospective PM Lessons learned, improvement actions

8. Rủi ro & phương án dự phòng

Rủi ro Mức độ Phương án B Phương án C
GPU outage Cao Chuyển sang Pinecone (managed) Sử dụng Qdrant trên instance backup
Độ chính xác embedding thấp (< 0.75) Trung bình Fine‑tune lại CLIP với dataset mở rộng Thay mô hình OpenCLIP hoặc DINOv2
Chi phí GPU vượt ngân sách Cao Đánh giá giảm batch size, dùng spot instances Chuyển sang CPU‑only IVF‑PQ (tăng latency)
Vi phạm GDPR/PDPA (ảnh người) Cao Áp dụng blur & anonymization trước ingest Từ chối upload ảnh người, chỉ cho phép sản phẩm
Latency > 200 ms Trung bình Scale out GPU nodes, enable caching Sử dụng approx‑NN (IVF‑Flat) giảm độ chính xác nhẹ

9. KPI, công cụ đo & tần suất

KPI Mục tiêu Công cụ đo Tần suất
Latency (p99) ≤ 200 ms Grafana (Prometheus) 5 phút
Precision@10 ≥ 0.85 Looker (offline eval) Hàng ngày
Recall@100 ≥ 0.78 Python script (FAISS eval) Hàng tuần
Conversion rate (search → purchase) + 5 % Google Analytics 4 Hàng tháng
GPU Utilization ≤ 80 % NVIDIA‑DCGM 5 phút
Error rate (5xx) ≤ 0.1 % Sentry Real‑time
Cost per 1 M queries ≤ $0.30 AWS Cost Explorer Hàng tháng

🧮 Công thức tính chi phí mỗi truy vấn
Cost per query = Tổng chi phí GPU + Cloud services / Tổng số query

\huge Cost\_per\_query=\frac{GPU\_Cost+Cloud\_Cost}{Total\_Queries}

Giải thích: Nếu GPU $30,000/tháng, Cloud $500, và 10 M query/tháng → $0.305/query.


10. Checklist Go‑Live (42‑48 mục)

10.1 Security & Compliance (9 mục)

  1. ✅ Kiểm tra IAM role tối thiểu.
  2. ✅ Mã hoá dữ liệu ảnh tại rest (AES‑256).
  3. ✅ TLS 1.3 cho tất cả endpoint.
  4. ✅ Đánh giá PDPA – xóa metadata cá nhân.
  5. ✅ Pen‑test OWASP Top 10.
  6. ✅ Rate‑limit API (100 req/s/user).
  7. ✅ Logging audit trail (ELK).
  8. ✅ Backup Milvus snapshot hàng ngày.
  9. ✅ Kiểm tra cấu hình CORS.

10.2 Performance & Scalability (10 mục)

  1. ✅ Load test 5 k QPS, p99 ≤ 200 ms.
  2. ✅ Auto‑scaling policy cho GPU nodes.
  3. ✅ Cache top‑1000 vectors trong Redis.
  4. ✅ HNSW ef‑construction = 200.
  5. ✅ Sharding collection theo category.
  6. ✅ Monitoring GPU temperature < 80 °C.
  7. ✅ Disk I/O < 200 MB/s.
  8. ✅ Network latency < 10 ms intra‑cluster.
  9. ✅ Health check liveness/readiness probes.
  10. ✅ Fallback to CPU IVF‑PQ khi GPU quá tải.

10.3 Business & Data Accuracy (9 mục)

  1. ✅ Độ chính xác Recall@10 ≥ 0.85 trên test set.
  2. ✅ Kiểm tra duplicate IDs trong collection.
  3. ✅ Đảm bảo mapping product ID ↔ vector ID.
  4. ✅ Kiểm tra metadata sync (PostgreSQL ↔ Milvus).
  5. ✅ A/B test UI, đo conversion uplift.
  6. ✅ Đánh giá bias hoa văn (đảm bảo đa dạng).
  7. ✅ Kiểm tra fallback “No result” logic.
  8. ✅ Định nghĩa “top‑K” = 20.
  9. ✅ Đảm bảo SEO friendly URL cho kết quả.

10.4 Payment & Finance (6 mục)

  1. ✅ Kiểm tra tích hợp payment gateway (Stripe/PayOS).
  2. ✅ Script đối soát giao dịch (Python).
  3. ✅ Kiểm tra tính đúng đắn coupon áp dụng.
  4. ✅ Log transaction ID trong audit.
  5. ✅ Kiểm tra limit order amount.
  6. ✅ Đảm bảo PCI‑DSS compliance cho token.

10.5 Monitoring & Rollback (8 mục)

  1. ✅ Dashboard Grafana với alert > 200 ms latency.
  2. ✅ Sentry error rate alert > 0.1 %.
  3. ✅ Auto‑rollback Helm release nếu health check fail > 3 lần.
  4. ✅ Snapshot Milvus trước deploy.
  5. ✅ Canary release 5 % traffic.
  6. ✅ Log rotation policy 30 ngày.
  7. ✅ Test rollback script (dry‑run).
  8. ✅ Post‑mortem template chuẩn.

⚠️ Warning: Nếu phát hiện latency > 250 ms trong 5 phút liên tiếp, kích hoạt auto‑scalecanary rollback ngay lập tức.


11. Mã nguồn & cấu hình thực tế (≥ 12 đoạn)

11.1 Docker‑Compose cho Milvus (GPU)

version: "3.8"
services:
  milvus:
    image: milvusdb/milvus:2.4.0-gpu
    container_name: milvus_gpu
    environment:
      - MILVUS_LOG_LEVEL=debug
      - GPU_DEVICE=0
    ports:
      - "19530:19530"
      - "19121:19121"
    volumes:
      - ./milvus/db:/var/lib/milvus
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

11.2 Khởi tạo collection (Python)

from pymilvus import Collection, FieldSchema, CollectionSchema, DataType

vectors = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=512)
ids = FieldSchema(name="product_id", dtype=DataType.INT64, is_primary=True, auto_id=False)
schema = CollectionSchema(fields=[ids, vectors], description="Fashion fabric vectors")

collection = Collection(name="fashion_fabric", schema=schema)
collection.create_index(field_name="embedding",
                        index_params={"metric_type": "IP", "index_type": "HNSW", "params": {"M": 48, "efConstruction": 200}})

11.3 FastAPI endpoint /search/image

from fastapi import FastAPI, File, UploadFile
from starlette.responses import JSONResponse
import torch, clip, numpy as np
from pymilvus import Collection

app = FastAPI()
model, preprocess = clip.load("ViT-B/32", device="cuda")
collection = Collection("fashion_fabric")

@app.post("/search/image")
async def search_image(file: UploadFile = File(...), top_k: int = 20):
    img = preprocess(Image.open(file.file)).unsqueeze(0).to("cuda")
    with torch.no_grad():
        embedding = model.encode_image(img).cpu().numpy()
    results = collection.search(data=[embedding.tolist()], anns_field="embedding",
                               param={"metric_type": "IP", "params": {"ef": 64}},
                               limit=top_k, expr=None)
    ids = [hit.id for hit in results[0]]
    # join metadata from PostgreSQL (omitted)
    return JSONResponse(content={"product_ids": ids})

11.4 Nginx reverse proxy (TLS)

server {
    listen 443 ssl http2;
    server_name search.example.com;

    ssl_certificate /etc/letsencrypt/live/search.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/search.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_buffering off;
    }
}

11.5 Medusa plugin (search integration)

// plugins/visual-search/index.js
module.exports = (options) => ({
  routes: [
    {
      method: "POST",
      path: "/search/image",
      handler: async (req, res) => {
        const { file } = req.files;
        const response = await fetch(`${process.env.SEARCH_API}/search/image`, {
          method: "POST",
          body: file.data,
        });
        const data = await response.json();
        return res.json(data);
      },
    },
  ],
});

11.6 Cloudflare Worker cache

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const cacheUrl = new URL(request.url)
  cacheUrl.searchParams.set('cache', 'true')
  const cacheKey = new Request(cacheUrl.toString(), request)
  const cache = caches.default
  let response = await cache.match(cacheKey)
  if (!response) {
    response = await fetch(request)
    response = new Response(response.body, response)
    response.headers.append('Cache-Control', 'public, max-age=86400')
    await cache.put(cacheKey, response.clone())
  }
  return response
}

11.7 Script đối soát payment (Python)

import csv, requests

def reconcile():
    with open('transactions.csv') as f:
        rows = csv.DictReader(f)
        for r in rows:
            resp = requests.get(f"https://api.payos.vn/v2/transactions/{r['order_id']}")
            data = resp.json()
            if data['status'] != r['status']:
                print(f"Mismatch: {r['order_id']}")

if __name__ == "__main__":
    reconcile()

11.8 GitHub Actions CI/CD (Docker build & deploy)

name: CI/CD

on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Build Docker image
        run: |
          docker build -t registry.example.com/milvus:latest .
          docker push registry.example.com/milvus:latest
      - name: Deploy to K8s
        uses: azure/k8s-deploy@v3
        with:
          manifests: |
            k8s/milvus-deployment.yaml
          images: |
            registry.example.com/milvus:latest

11.9 Terraform – Provision GPU node (AWS)

resource "aws_instance" "milvus_gpu" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "p3.2xlarge"
  key_name      = var.key_name

  root_block_device {
    volume_size = 200
    volume_type = "gp3"
  }

  tags = {
    Name = "milvus-gpu"
  }
}

11.10 Redis cache config (redis.conf)

maxmemory 4gb
maxmemory-policy allkeys-lru
appendonly yes
save 900 1
save 300 10
save 60 10000

11.11 Prometheus scrape config (milvus)

scrape_configs:
  - job_name: 'milvus'
    static_configs:
      - targets: ['milvus:9091']
    metrics_path: /metrics
    scheme: http

11.12 Looker view – KPI dashboard (SQL)

view: visual_search_kpi {
  sql_table_name: visual_search_metrics ;;
  dimension: date { type: date }
  measure: precision_at_10 {
    type: number
    sql: ${TABLE}.precision_at_10 ;;
  }
  measure: latency_p99 {
    type: number
    sql: ${TABLE}.latency_p99 ;;
  }
  measure: conversion_rate {
    type: number
    sql: ${TABLE}.conversion_rate ;;
  }
}

12. Kết luận – Key Takeaways

# Điểm cốt lõi
1 Vector DB là nền tảng cho visual search; Milvus tự quản cho độ tùy biến, Pinecone cho tốc độ triển khai.
2 Embedding bằng CLIP (hoặc OpenCLIP) cho phép nhận diện hoa văn & chất liệu một cách robust.
3 Pipeline gồm: thu thập ảnh → tiền xử lý → embedding → lưu vector → tìm kiếm → join metadata.
4 Chi phí chủ yếu đến từ GPU; ROI > 150 % trong năm đầu nếu tăng conversion 5 %.
5 KPI cần đo latency, precision, conversion; alert tự động khi vượt ngưỡng.
6 Rủi ro được giảm thiểu bằng phương án B/C (Pinecone, Qdrant) và backup snapshot.
7 Checklist go‑live > 40 mục, chia 5 nhóm, giúp giảm lỗi production xuống < 1 %.

💬 Câu hỏi thảo luận: Anh em đã gặp vấn đề “vector drift” khi cập nhật dữ liệu mới chưa? Đã áp dụng chiến lược nào để đồng bộ lại embedding mà không gây downtime?


13. Đoạn chốt marketing

Nếu anh em đang cần tích hợp AI nhanh vào app mà lười build từ đầu, thử ngó qua Serimi App xem, mình thấy API bên đó khá ổn cho việc scale.
Anh em nào làm Content hay SEO mà muốn tự động hóa quy trình thì tham khảo bộ công cụ noidungso.io.vn nhé, đỡ tốn công sức thuê nhân sự part‑time.


Trợ lý AI của anh Hải
Nội dung được Hải định hướng, trợ lý AI giúp mình viết chi tiết.
Chia sẻ tới bạn bè và gia đình