TungDaDev's Blog

xây dựng đội nhân viên AI cho riêng bạn

Build ai employees.jpg
Published on
/14 mins read/

Bạn không thiếu ý chí. Bạn đang điều hành một công ty chỉ có một nhân viên duy nhất — và nhân viên đó chính là bạn.

Buổi sáng nào cũng vậy: inbox trước, mấy cái form "nhanh thôi" từ tuần trước, một người đã nhắc hai lần mà vẫn chưa gửi file về. Bạn trả lời, nhắc nhở, copy-paste đoạn văn quen thuộc sang cửa sổ mới. Đến trưa, danh sách trông y hệt tối qua — chỉ nặng hơn.

Không phải vấn đề ý chí. Đó là vấn đề kiến trúc.

Bài này hướng dẫn bạn xây một đội agent AI — những "nhân viên" có thể làm việc khi bạn đóng laptop, ăn cơm hay ngủ. Mỗi bước đều có code và script để copy-paste chạy thẳng.


# kiến trúc 3 tầng

Trước khi bắt tay làm, cần hiểu cách hệ thống vận hành:

┌─────────────────────────────────────────┐
│           LLM Engine (GPT-4o)            │  ← bộ não dùng chung
├─────────────────────────────────────────┤
│     agents (Owen, Mara, Cole…)           │  ← nhân viên: mỗi người sở hữu 1 mảng
├─────────────────────────────────────────┤
│     shared office (files, browser, API)  │  ← văn phòng chung
└─────────────────────────────────────────┘
  • LLM Engine: một model duy nhất cho toàn đội — không phải "model này cho viết, model kia cho duyệt"
  • Agent: một runtime nhỏ — có role file, workspace, quyền truy cập cụ thể, và định nghĩa rõ "done" là gì
  • Shared Office: môi trường chung — thư mục, trình duyệt, API key — thiết lập một lần, dùng mãi

# bước 1: tuyển nhân viên đầu tiên

chọn việc đúng để bắt đầu

Đừng bắt đầu với "giúp tôi quản lý ops". Bắt đầu với một việc có đích đến rõ ràng mà bạn có thể giao cho intern ngày thứ Sáu và kiểm tra vào thứ Hai:

"Đưa inbox tuần trước vào ops/2026-09-14/ với 3 file: brief.md, form-draft.pdf, và action-log.md."

Nhân viên đầu tiên tên Owen — phụ trách gói ops hàng tuần.

tạo cấu trúc thư mục

mkdir -p ~/ai-company/{agents,ops,memory/shared,skills,logs}
mkdir -p ~/ai-company/agents/owen/{charter,workspace}

Cấu trúc hoàn chỉnh:

~/ai-company/
├── agents/
│   └── owen/
│       ├── charter/
│       │   ├── role.md     # hợp đồng lao động — ít thay đổi
│       │   └── brief.md    # nhiệm vụ hôm nay — thay đổi mỗi lần chạy
│       └── workspace/
├── memory/
│   ├── shared/             # cả đội cần biết
│   └── owen/               # ghi chú riêng của Owen
├── skills/                 # kỹ năng dùng chung
├── ops/                    # output chính
└── logs/

viết role file cho Owen

Tạo ~/ai-company/agents/owen/charter/role.md:

# Owen — weekly ops agent

## owns
gói tổng kết tuần: email chưa trả lời, form chưa xong, danh sách cần nhắc nhở.

## outcome
mỗi chủ nhật trước 22:00, thư mục ops/YYYY-MM-DD/ phải tồn tại và sẵn cho người review.

## sources
- nhãn partners@ trong inbox
- thư mục /partners/forms/
- danh sách chase trong memory/shared/people.md

## deliverables
ops/YYYY-MM-DD/
├── brief.md        # tóm tắt 1 trang
├── form-draft.pdf  # bản nháp form — CHƯA GỬI
└── action-log.md   # danh sách cần nhắc — CHƯA GỬI

## constraints
- không gửi mail
- không submit form
- không xóa file
- không mở mail cá nhân
- dừng sau 40 phút
- nếu thiếu nguồn → ghi log, không tự đoán

## review point
người dùng mở thư mục thứ Hai sáng trước khi làm bất kỳ hành động outbound nào.

## fences
send / spend / publish / delete / legal

viết brief (nhiệm vụ hôm nay)

Tạo ~/ai-company/agents/owen/charter/brief.md:

# Owen — brief 2026-09-28

## nhiệm vụ
xử lý inbox tuần từ 22/09 đến 28/09.

## ghi chú
- form lần này có thêm trường headcount
- Mira vừa vào danh sách chase
- bỏ qua bounce ngày 25/09

## output
lưu vào: ops/2026-09-28/

script chạy Owen

Tạo ~/ai-company/run_owen.sh:

#!/bin/bash
set -e
 
AGENT="owen"
DATE=$(date +%Y-%m-%d)
WORKSPACE=~/ai-company
OUTPUT_DIR="$WORKSPACE/ops/$DATE"
LOG_FILE="$WORKSPACE/logs/${AGENT}_${DATE}.log"
 
mkdir -p "$OUTPUT_DIR" "$WORKSPACE/memory/$AGENT"
echo "[$DATE] starting Owen..." | tee -a "$LOG_FILE"
 
SYSTEM=$(cat "$WORKSPACE/agents/$AGENT/charter/role.md")
BRIEF=$(cat "$WORKSPACE/agents/$AGENT/charter/brief.md")
MEMORY=$(cat "$WORKSPACE/memory/shared/people.md" 2>/dev/null || echo "no data")
 
RESPONSE=$(curl -s https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d "$(jq -n \
    --arg sys "$SYSTEM" \
    --arg usr "shared memory:\n$MEMORY\n\n---\n\n$BRIEF\n\noutput dir: $OUTPUT_DIR" \
    '{model:"gpt-4o",temperature:0.3,max_tokens:4096,
      messages:[{role:"system",content:$sys},{role:"user",content:$usr}]}'
  )")
 
echo "$RESPONSE" | jq -r '.choices[0].message.content' > "$OUTPUT_DIR/brief.md"
 
if [ -s "$OUTPUT_DIR/brief.md" ]; then
  echo "[$DATE] ✅ done → $OUTPUT_DIR" | tee -a "$LOG_FILE"
else
  echo "[$DATE] ❌ brief.md trống" | tee -a "$LOG_FILE"
fi
chmod +x ~/ai-company/run_owen.sh

3 bài kiểm tra trước khi thăng chức

bài testcâu hỏifail =
lid testbạn ra ngoài — folder vẫn xuất hiện?vẫn là chatbot
stranger testngười khác mở folder và hiểu ngay?vẫn là nhật ký cá nhân
repeat testoutput thứ Ba có cùng cấu trúc thứ Hai?vẫn là việc làm một lần

Pass cả 3 → bạn có nhân viên thật. Chưa pass → đừng tuyển thêm người.


# bước 2: viết charter — hợp đồng lao động

Sai lầm phổ biến nhất là viết lại "hợp đồng" mỗi ngày vì hôm nay có thêm Mira. Charter không thay đổi vì Mira. Brief mới thêm Mira.

charter = role.md  →  cố định cả tháng
brief   = brief.md →  thay đổi mỗi lần chạy

5 trường bắt buộc

outcome — điều gì thay đổi trong thế giới khi job xong, không phải hoạt động:

  • ❌ "nhìn qua email"
  • ✅ "gói partner tuần này tồn tại và sẵn cho review"

sources — nơi agent được phép xem. Không có trong list → không được tự đi tìm.

constraints — giới hạn thời gian, ngôn ngữ, những gì bỏ qua:

  • "dừng sau 40 phút. thiếu nguồn → ghi log, không tự đoán."

deliverable — tên file, đường dẫn, format chính xác:

  • ✅ ops/YYYY-MM-DD/brief.md, form-draft.pdf, action-log.md
  • ❌ "tóm tắt cho tôi xem"

review point — điểm nào con người vẫn cần có mặt:

  • "tôi đọc brief trước khi bất kỳ hành động nào ra bên ngoài"

5 fences — động từ bị cấm

Tạo ~/ai-company/memory/shared/fences.md:

# fences — 5 động từ không được thực hiện không có người phê duyệt

send    → không gửi mail, DM, comment, ping
spend   → không checkout, thanh toán, nâng cấp plan
publish → không đăng bài, go-live, update trang đối ngoại
delete  → không xóa, archive-as-delete, overwrite file duy nhất
legal   → không ký hợp đồng, chấp nhận điều khoản, thay đổi policy

khi gặp fence:
[FENCE] cần người phê duyệt: <mô tả>

# bước 3: thiết lập văn phòng dùng chung

setup script (chạy một lần)

Tạo ~/ai-company/setup.sh:

#!/bin/bash
echo "🏗️  thiết lập ai company..."
 
mkdir -p ~/ai-company/{agents,ops,memory/shared,skills,logs,drafts,config}
 
for agent in owen mara cole rina vince; do
  mkdir -p ~/ai-company/agents/$agent/{charter,workspace,memory}
  echo "✅ $agent"
done
 
cat > ~/ai-company/memory/shared/people.md << 'EOF'
# people — dùng chung cho toàn đội
 
## chase list
| tên  | email                | việc cần làm        | nhắc lần cuối |
|------|----------------------|---------------------|---------------|
| Mira | mira@example.com     | gửi báo cáo Q3      | 2026-09-20    |
 
## partner list
| tổ chức   | contact          | ghi chú                   |
|-----------|------------------|---------------------------|
| Acme Corp | acme@example.com | form mới thêm trường headcount |
EOF
 
cat > ~/ai-company/.env.example << 'EOF'
OPENAI_API_KEY=sk-...
COMPANY_ROOT=~/ai-company
MAX_RUNTIME_MINUTES=40
EOF
 
echo ""
echo "✅ xong! bước tiếp theo:"
echo "  cp ~/ai-company/.env.example ~/ai-company/.env"
echo "  # điền API key rồi chạy:"
echo "  bash ~/ai-company/run_owen.sh"
chmod +x ~/ai-company/setup.sh
bash ~/ai-company/setup.sh

những thứ vẫn cần người trong phòng

- password không muốn lưu trong file agent
- 2FA và hardware key
- CAPTCHA
- thanh toán (dù nhỏ)
- banking, admin console, trang nào ToS cấm bot

Khi gặp các trường hợp này, agent dừng và ghi:

[BLOCKED] cần người xử lý 2FA trên partner portal

# bước 4: một engine cho toàn bộ đội

Dùng 5 model khác nhau = 5 hóa đơn, 5 key, không biết agent nào đang chạy ngầm cả đêm. Một model, nhiều nhân viên — đơn giản hơn, trace được lỗi hơn.

config tập trung

Tạo ~/ai-company/config/llm.json:

{
  "model": "gpt-4o",
  "temperature": 0.3,
  "max_tokens": 4096,
  "timeout_seconds": 120,
  "retry_attempts": 2
}

Mỗi agent đọc config này — không agent nào có model field riêng.

skills library — kỹ năng dùng chung

Skills là file bất kỳ agent nào cũng có thể load — không phải người, là công cụ.

Tạo ~/ai-company/skills/write-chase-note.md:

# skill: viết chase note

## format chuẩn
Chủ đề: nhắc nhở — [tên việc]

Xin chào [Tên],

Muốn theo dõi về [việc cụ thể] từ [ngày].
[Một câu mô tả tình trạng hiện tại]
Bạn có thể cập nhật vào [thời hạn] không?

Cảm ơn,
[người ký]

## quy tắc
- không hơn 80 chữ
- không đổ lỗi
- kết thúc bằng câu hỏi cụ thể
- KHÔNG GỬI — chỉ lưu vào drafts/

memory 2 tầng

# shared memory — cả đội cần biết
memory/shared/
├── people.md       # danh sách người, partner
├── fences.md       # ranh giới không được vi phạm
└── definitions.md  # "qualified lead" nghĩa là gì, v.v.
 
# agent memory — riêng tư
memory/owen/
├── tried-last-week.md   # Owen thử gì tuần trước
└── known-bounces.md     # email nào hay bounce

# bước 5: tuyển phần còn lại theo mảng sở hữu

5 agent cards

Vince · inbox
  owns: phân loại mọi thứ đến
  done: labels applied + inbound brief hàng ngày + danh sách cần người quyết
  fence: send, delete

Mara · leads
  owns: danh sách inbound lead — giữ cho trung thực
  done: leads/YYYY-MM-DD.csv + exceptions note
  fence: không email lead, không đánh deal là won

Cole · outreach
  owns: draft chase và first touch
  done: drafts/ + send-queue.md cho người dùng
  fence: send

Rina · assets
  owns: file mà người khác đang chờ (deck, screenshot, export)
  done: assets/YYYY-MM-DD/ với tên file người lạ đọc được
  fence: publish

Owen · weekly ops
  owns: gói tổng kết tuần
  done: ops/YYYY-MM-DD/ gồm brief + form-draft + action-log + links đến output team
  fence: send, spend, publish, delete, legal

nguyên tắc khi tuyển thêm

✅ việc lặp lại mỗi tuần → thêm agent
✅ việc chỉ xảy ra 1 lần → thêm vào skills/
❌ đừng tuyển "strategy" — đó là việc của bạn
❌ đừng tuyển "researcher" nếu Mara chỉ cần skills/qualify-lead.md

# bước 6: kết nối handoff — agents bàn giao cho nhau

Đội mà không có handoff = 5 intern đều báo cáo thẳng lên bạn. Bạn trở thành cái hành lang. Nắp laptop không bao giờ thực sự đóng được.

Handoff là file, không phải lời nói:

❌ "Mara, bạn có thể pass cho Cole không?"
✅ Mara ghi vào leads/2026-09-28.csv → Cole đọc file đó

workflow weekly partner pack

Group goal: trước 9:00 thứ Hai, pack sẵn sàng review.

Vince (6:00)  →  inbox-sorted-brief.md
     ↓
Mara  (6:30)  →  leads/2026-09-28.csv
     ↓
Rina  (7:00)  →  assets/2026-09-28/
     ↓
Cole  (7:30)  →  drafts/ + send-queue.md
     ↓
Owen  (8:00)  →  ops/2026-09-28/{brief, form-draft, action-log}
     ↓
bạn   (8:10)  →  1 message: đường dẫn pack + danh sách cần approve

role file đầy đủ cho Cole

Tạo ~/ai-company/agents/cole/charter/role.md:

# Cole — outreach agent

## owns
draft outreach cho danh sách chase hiện tại.

## receives
- leads/YYYY-MM-DD.csv từ Mara
- ops/YYYY-MM-DD/action-log.md từ Owen

## emits
- draft vào drafts/
- send-queue.md cho người dùng

## never
- tự gửi mail
- tạo lead mà Mara đã reject
- liên hệ ngoài danh sách được cấp

## khi payload thiếu
ghi gap và skip row đó:
"SKIP: Mira — thiếu source line từ Mara"

# bước 7: lên lịch — đội chạy khi bạn không ngồi đây

dry-run trước khi schedule

Đừng đặt lịch khi chưa chạy thử một lần mà bạn đang ngồi xem. Mục tiêu không phải hoàn hảo — mà là output bạn có thể chấp nhận làm bản nháp.

bash ~/ai-company/run_vince.sh && \
bash ~/ai-company/run_mara.sh  && \
bash ~/ai-company/run_rina.sh  && \
bash ~/ai-company/run_cole.sh  && \
bash ~/ai-company/run_owen.sh
 
# kiểm tra output
ls -la ~/ai-company/ops/$(date +%Y-%m-%d)/
cat ~/ai-company/ops/$(date +%Y-%m-%d)/action-log.md

Tiêu chí accept:

  • folder tồn tại với đủ 3 file
  • brief.md đọc được, có nội dung thật
  • action-log.md ghi rõ fence nào bị trigger
  • không file nào bị overwrite từ lần trước

cài cron job

crontab -e
# weekly partner pack — thứ Hai hàng tuần
0  6 * * 1 bash ~/ai-company/run_vince.sh >> ~/ai-company/logs/cron.log 2>&1
30 6 * * 1 bash ~/ai-company/run_mara.sh  >> ~/ai-company/logs/cron.log 2>&1
0  7 * * 1 bash ~/ai-company/run_rina.sh  >> ~/ai-company/logs/cron.log 2>&1
30 7 * * 1 bash ~/ai-company/run_cole.sh  >> ~/ai-company/logs/cron.log 2>&1
0  8 * * 1 bash ~/ai-company/run_owen.sh  >> ~/ai-company/logs/cron.log 2>&1

kill switch — timeout mỗi agent

Thêm vào đầu mỗi script:

# timeout sau 40 phút
if ! timeout 2400 bash -c '
  # ... phần xử lý chính ...
'; then
  echo "[$(date)] TIMEOUT: dừng sau 40 phút — chưa hoàn thành" \
    >> ~/ai-company/logs/owen_$(date +%Y-%m-%d).log
  echo "[TIMEOUT] job chưa hoàn thành" \
    >> ~/ai-company/ops/$(date +%Y-%m-%d)/action-log.md
fi

review hàng tuần

Tạo ~/ai-company/review.sh:

#!/bin/bash
echo "=== weekly review ==="
 
echo "📁 packs 7 ngày qua:"
find ~/ai-company/ops -maxdepth 1 -type d | sort -r | head -8
 
echo ""
echo "🔍 fence triggers tuần này:"
grep -h "\[FENCE\]" ~/ai-company/ops/*/action-log.md 2>/dev/null | head -10
 
echo ""
echo "❓ 3 câu hỏi cần trả lời:"
echo "  1. pack nào thực sự thay đổi quyết định của bạn?"
echo "  2. pack nào bạn chỉ ngưỡng mộ mà không dùng?"
echo "  3. job nào cần DELETE hoàn toàn (không phải pause)?"
chmod +x ~/ai-company/review.sh

# xử lý lỗi

Đọc log trước khi sửa bất cứ thứ gì:

tail -50 ~/ai-company/logs/owen_$(date +%Y-%m-%d).log
grep "\[FENCE\]" ~/ai-company/ops/*/action-log.md
grep "SKIP\|GAP\|BLOCKED" ~/ai-company/ops/*/action-log.md

80% lỗi đến từ 3 nguyên nhân:

triệu chứngnguyên nhânfix
output rỗng hoặc không liên quanbrief quá mơ hồsửa brief.md, không phải role.md
agent không tìm được dữ liệusource đã movecập nhật sources trong role.md
agent tự làm việc bị cấmthiếu fencethêm vào fences.md

Đừng đổi model. Engine đủ tốt rồi. Sửa map của nhân viên.


# checklist theo tuần

tuần 1 — chỉ Owen

  • chạy setup.sh
  • viết role.md đủ 5 trường
  • viết brief.md với job cụ thể, nhàm chán
  • chạy 1 lần khi đang ngồi xem
  • pass lid / stranger / repeat test

tuần 2 — Vince + Mara

  • tạo role file cho Vince và Mara
  • test handoff Vince → Mara
  • Owen đọc được output của Mara

tuần 3 — Cole + Rina

  • Cole nhận đúng payload từ Mara và Owen
  • Rina hoạt động độc lập
  • chạy full chain dry-run

tuần 4 — schedule

  • cài cron job
  • đặt timeout cho mỗi agent
  • chạy review hàng tuần
  • xóa ít nhất 1 job vô dụng

# tổng kết

lớpvai trò
LLM Enginebộ não — một engine duy nhất
agentsnhân viên — mỗi người sở hữu một outcome
shared officevăn phòng — thiết lập một lần, dùng mãi
charter + fencehợp đồng + ranh giới — rõ ràng, ít thay đổi
handoffcầu nối — file cụ thể, không phải câu văn
schedulethời gian — đội chạy khi bạn không ngồi đây

Tối nay: một tên, một folder, một định nghĩa "done" trên đĩa. Giao việc nhàm chán. Đóng laptop. Mở folder.

Artifacts có ở đó — bạn có nhân viên. Không có — bạn biết cần sửa gì.


Chỉ là những ghi chép cá nhân với hy vọng mang lại chút giá trị. Nếu thấy hữu ích, đừng ngại chia sẻ cho bạn bè & đồng nghiệp nhé!

Happy coding 😎 👍🏻 🚀 🔥.