Agent chạy trên máy bạn khác hẳn agent phục vụ người dùng thật. Bài cuối tập trung vào những gì giúp agent sống sót trong production: streaming để trải nghiệm mượt, quan sát để debug, và kỷ luật để kiểm soát chi phí và độ trễ.
Streaming: đừng bắt người dùng chờ
invoke chỉ trả kết quả cuối, người dùng nhìn màn hình trắng suốt thời gian agent chạy — dễ tưởng bị treo. stream phát cập nhật theo thời gian thực, cải thiện cảm nhận tốc độ mà không đổi logic.
for chunk in app.stream(inputs, config, stream_mode="updates"):
print(chunk) # cập nhật state sau mỗi node
Các stream_mode chính:
values: state đầy đủ sau mỗi bước.updates: chỉ phần thay đổi của mỗi node — gọn, tốt để hiển thị tiến độ.messages: stream token của LLM — cho hiệu ứng gõ chữ, trải nghiệm chat mượt.
messages để hiển thị câu trả lời chảy dần, updates để hiện trạng thái "đang tra cứu... đang viết...".Debug: nhìn vào bên trong graph
Khi agent hành xử lạ, đừng đoán — hãy quan sát:
- Vẽ graph để xác nhận cấu trúc:
app.get_graph().draw_mermaid(). - Tua lịch sử state:
app.get_state_history(config)cho thấy state trước mỗi quyết định, giúp tìm đúng bước sai. - Bật tracing (ví dụ LangSmith qua biến môi trường) để xem từng lần gọi LLM, tool, độ trễ và token tiêu thụ.
export LANGSMITH_TRACING=true
export LANGSMITH_API_KEY="..."
Tracing cho bạn thấy chính xác prompt gửi đi và phản hồi nhận về — thứ hầu như không thể suy đoán từ log thường. Đây là công cụ mạnh nhất khi agent chọn nhánh sai một cách khó hiểu.
Xử lý lỗi và độ bền
- Bọc tool bằng try/except và trả về kết quả có kiểm soát, để một lỗi tool không giết cả graph.
- Đặt timeout cho lời gọi mạng để node không treo vô hạn.
- Retry có giới hạn cho lỗi tạm thời (rate limit), tránh retry mù đốt token.
- Idempotency cho node có side effect: nếu resume sau crash chạy lại node gửi email, phải đảm bảo không gửi trùng — ví dụ lưu cờ đã gửi và kiểm tra trước khi gửi.
Kiểm soát chi phí và độ trễ
- Đặt
recursion_limitđể chặn vòng lặp đốt token. - Chọn model theo node: node phân loại dùng model rẻ, node viết mới dùng model mạnh.
- Cache kết quả tra cứu lặp lại để khỏi gọi tool nhiều lần cho cùng truy vấn.
- Giữ state gọn — messages dài đẩy token và tiền lên nhanh; cắt bớt lịch sử cũ khi cần.
Checklist go-live
- [ ] Checkpointer bền (Postgres) đã cấu hình và test khôi phục.
- [ ]
thread_idtách biệt theo từng người dùng. - [ ] Tracing/log đã bật để điều tra sự cố.
- [ ] Mọi tool có timeout và xử lý lỗi.
- [ ] Có
recursion_limitvà ngưỡng lặp nghiệp vụ. - [ ] Node side-effect an toàn khi resume (idempotent).
- [ ] Streaming bật cho trải nghiệm người dùng.
- [ ] Có cảnh báo khi token hoặc độ trễ vượt ngưỡng.
Sai lầm thường gặp
- Chỉ dùng
invoketrong app chat: người dùng chờ lâu tưởng treo. Dùng streaming. - Debug bằng cách đoán thay vì bật tracing và tua state — mất hàng giờ vô ích.
- Không idempotent node gửi email/thanh toán: resume sau crash gây gửi trùng, tính tiền hai lần.
- Bỏ qua giới hạn token/độ trễ: hóa đơn tăng vọt, người dùng bỏ đi vì chậm.
- Dùng một model đắt cho mọi node: lãng phí; hãy phân bổ model theo độ khó của từng node.
- Không test kịch bản khôi phục: đến khi prod crash mới phát hiện checkpoint cấu hình sai thì đã muộn.
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