Đã mổ xẻ đủ 4 bộ phận. Bài này ta ráp chúng thành một agent chạy thật: một Trợ lý nghiên cứu nhận câu hỏi, tự tra web + tra DB nội bộ, và trả báo cáo — theo mô hình ReAct.
Kiến trúc tổng thể
┌─────────────────────────────────────────────┐
│ SYSTEM PROMPT (vai trò + tools + guardrail) │
├─────────────────────────────────────────────┤
│ MEMORY: history phiên + tóm tắt khi dài │
├─────────────────────────────────────────────┤
│ LOOP (ReAct, max_steps): │
│ LLM (bộ não) → Action → execute_tool → │
│ Observation → lặp → Final Answer │
├─────────────────────────────────────────────┤
│ TOOLS: web_search, query_db, (human_confirm) │
└─────────────────────────────────────────────┘
Các bước ráp (theo thứ tự)
- Định nghĩa tools kèm schema và validate (Bài 3).
- Viết system prompt khai báo vai trò, tools, guardrail (Bài 2).
- Dựng vòng ReAct có
max_stepsvà điều kiện dừng (Bài 5). - Gắn memory: đưa observation vào history, tóm tắt khi dài (Bài 4).
- Thêm xử lý lỗi: tool lỗi → trả text lỗi cho model tự sửa.
- Chèn human-in-the-loop trước hành động rủi ro cao.
- Thêm logging mỗi Thought/Action/Observation.
Khung code tối giản (Python-pseudocode)
TOOLS = {
"web_search": web_search, # read-only
"query_db": query_db, # read-only
}
SYSTEM = """Bạn là Trợ lý nghiên cứu.
Dùng web_search cho tin ngoài, query_db cho dữ liệu nội bộ.
Luôn nêu nguồn. Nếu thiếu thông tin, HỎI.
Không bịa số liệu."""
def agent(question, max_steps=8):
history = [SYSTEM, f"Câu hỏi: {question}"]
for _ in range(max_steps):
r = llm(history, tools=TOOLS.keys())
log(r.thought, r.action) # bước 7: logging
if r.is_final:
return r.answer # điều kiện dừng
try:
obs = TOOLS[r.action](**r.args) # thực thi tool
except Exception as e:
obs = f"Lỗi: {e}. Hãy thử cách khác." # bước 5
history += [r.thought, obs]
if too_long(history):
history = summarize(history) # bước 4
return "Chưa hoàn thành trong giới hạn bước."
Đây là bộ khung ~30 dòng nhưng hội đủ: bộ não (llm), tay chân (TOOLS), trí nhớ (history+summarize), vòng lặp (for + dừng). Bạn thay llm, web_search, query_db bằng cài đặt thật là chạy được.
Human-in-the-loop cho hành động rủi ro
def send_email(to, body):
if not confirm_with_human(to, body): # chặn chờ người duyệt
return "User từ chối gửi."
return really_send(to, body)
Với tool ghi/không đảo ngược, luôn có một cửa xác nhận. Đừng để agent tự gửi tiền hay xóa dữ liệu.
Kiểm thử agent trước khi giao việc thật
- Test từng tool riêng (unit) — chưa cần LLM.
- Test với mock LLM trả action cố định — kiểm tra loop, dừng, xử lý lỗi.
- Chạy end-to-end vài kịch bản thật, đọc log Thought.
- Thử ca xấu: tool lỗi, thiếu thông tin, mục tiêu mơ hồ — agent có tự sửa/hỏi không?
Checklist agent sẵn sàng dùng
- [ ] Mọi tool có validate + trả lỗi text.
- [ ] Loop có
max_stepsvà điều kiện dừng. - [ ] Memory có cắt/tóm khi dài.
- [ ] Hành động rủi ro có human-in-the-loop.
- [ ] Có logging đầy đủ để truy vết.
- [ ] Đã test tool đơn lẻ + end-to-end + ca xấu.
Sai lầm thường gặp
- Ráp thẳng rồi thả chạy thật: chưa test loop/lỗi, agent làm bậy trên dữ liệu thật.
- Bỏ human-in-the-loop "cho nhanh": đúng một lần agent gửi email sai hàng loạt là hối không kịp.
- Không log: khi agent sai, không truy được nó nghĩ/làm gì.
- Không test ca xấu: production toàn ca xấu (API timeout, dữ liệu thiếu).
- Gộp quá nhiều tool/mục tiêu: agent phân tán; bắt đầu tối giản rồi mở rộng.
Học xong bài này rồi?
Tạo tài khoản miễn phí để lưu lại — lần sau vào là biết ngay đang dở ở đâu,
và học hết khóa thì có chứng chỉ.
Lưu tiến độ của tôi