Menu
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Đang tải...

Bài 12 — Latency & cost — Production tradeoffs

Building AI-Powered Products Bài 12/60

Mở đầu — vì sao bài này quan trọng

Có một sự thật mà rất nhiều đội làm sản phẩm AI chỉ nhận ra khi hóa đơn cuối tháng gửi về, hoặc khi khách hàng bắt đầu bỏ đi vì chờ quá lâu: một tính năng AI hoạt động tốt trong demo không có nghĩa là nó khả thi trong production. Trong demo, bạn gọi model tốt nhất, chờ 8 giây cũng được, và mỗi request chỉ tốn vài xu — nhưng khi có 50.000 người dùng thật, mỗi giây chờ đợi và mỗi đồng chi phí đều nhân lên thành vấn đề sống còn.

Bài học này nói về ba đại lượng luôn kéo co nhau trong mọi sản phẩm AI: chất lượng (quality), độ trễ (latency)chi phí (cost). Hiểu được mối quan hệ giữa chúng không phải là kiến thức "nice to have" dành cho kỹ sư hạ tầng — đó là kỹ năng cốt lõi của bất kỳ ai xây dựng sản phẩm AI. Người quyết định chọn model nào, cache ở đâu, stream hay không stream — chính là người quyết định biên lợi nhuận (margin) và trải nghiệm người dùng của sản phẩm. Nếu bạn là product manager, đây là nơi bạn thương lượng giữa "sản phẩm tốt" và "sản phẩm còn tiền để vận hành". Nếu bạn là kỹ sư, đây là nơi bạn biến một prototype thành thứ chịu được tải thật.

Chúng ta sẽ đi từ mô hình tư duy (tam giác đánh đổi), sang các đòn bẩy kỹ thuật cụ thể để cân chỉnh, rồi đến những tình huống thực tế mà tôi đã chứng kiến ở các đội tại Việt Nam và Đông Nam Á.

Khái niệm cốt lõi

Tam giác đánh đổi: Quality — Latency — Cost

Hãy hình dung một tam giác:

       Quality (Chất lượng)
      /                    \
     /                      \
Cost ──────────────────── Latency
(Chi phí)                  (Độ trễ)

Quy tắc thực tế: bạn thường chỉ tối ưu được hai trong ba đỉnh cùng lúc. Muốn chất lượng cao và độ trễ thấp? Bạn phải dùng model mạnh nhất chạy trên hạ tầng đắt tiền — chi phí đội lên. Muốn chi phí thấp và độ trễ thấp? Bạn dùng model nhỏ, nhanh, rẻ — nhưng chất lượng câu trả lời sẽ giảm. Muốn chất lượng cao và chi phí thấp? Bạn dùng model lớn nhưng chấp nhận batch, chờ đợi, hàng đợi — độ trễ tăng.

Cải thiện đồng thời cả ba là điều gần như không tồn tại trong một quyết định đơn lẻ. Điều thực tế mà các đội giỏi làm được không phải là "phá vỡ tam giác", mà là chọn đúng điểm cân bằng cho từng use casedịch chuyển tam giác bằng kỹ thuật (caching, routing, tối ưu prompt) để với cùng chất lượng thì tốn ít tiền và ít thời gian hơn.

Latency thực chất được cấu thành từ đâu

Nhiều người nghĩ latency chỉ là "model chạy nhanh hay chậm". Thực tế với các LLM, độ trễ chia thành nhiều phần:

  • TTFT (Time To First Token) — thời gian từ khi gửi request đến khi token đầu tiên xuất hiện. Đây là con số quyết định cảm giác "phản hồi nhanh" của người dùng.
  • TPOT (Time Per Output Token) — thời gian sinh ra mỗi token tiếp theo. Câu trả lời càng dài, tổng thời gian càng lớn.
  • Tổng latency ≈ TTFT + (số token output × TPOT) cộng thêm độ trễ mạng, thời gian truy xuất dữ liệu (nếu có RAG), và thời gian xử lý phía backend.
Điểm mấu chốt: output dài là kẻ thù của latency. Một câu trả lời 800 token sẽ chậm hơn nhiều so với 150 token, dù dùng cùng model. Vì vậy, kiểm soát độ dài output là một trong những đòn bẩy rẻ nhất mà nhiều đội bỏ quên.

Cost thực chất được tính thế nào

Với các API như của Anthropic, OpenAI hay Google, chi phí tính theo token và input token thường rẻ hơn output token nhiều lần. Một prompt RAG nhồi 6.000 token ngữ cảnh vào mỗi request nghe có vẻ "chỉ là input" nhưng khi nhân với hàng trăm nghìn request mỗi ngày, đó là khoản tiền lớn.

Công thức tư duy nên nhớ:

Chi phí mỗi request ≈ (input_tokens × giá_input) + (output_tokens × giá_output)
Chi phí vận hành = chi phí mỗi request × số request × hệ số retry

Đừng quên hệ số retry: khi model timeout hoặc trả về lỗi format, bạn gọi lại — và mỗi lần gọi lại là tiền thật. Một hệ thống có tỷ lệ retry 15% đang âm thầm đội chi phí lên 15%.

Các đòn bẩy để dịch chuyển tam giác

Đây là bộ công cụ thực chiến để bạn không phải chấp nhận đánh đổi một cách thụ động:

  • Model routing (định tuyến model) — không phải request nào cũng cần model mạnh nhất. Câu hỏi đơn giản dùng model nhỏ (Haiku, GPT nhỏ, Gemini Flash), câu hỏi khó mới đẩy lên model lớn.
  • Caching (bộ nhớ đệm) — gồm hai loại. Prompt caching (cache phần input lặp lại như system prompt, tài liệu ngữ cảnh) giảm cả chi phí lẫn TTFT. Response caching (cache nguyên câu trả lời cho các câu hỏi trùng lặp) gần như miễn phí và tức thì.
  • Streaming — không giảm tổng latency nhưng giảm latency cảm nhận: người dùng thấy chữ chạy ra ngay thay vì màn hình trắng.
  • Kiểm soát max output tokens — cắt độ dài câu trả lời khi không cần thiết.
  • Batching — gom nhiều request xử lý cùng lúc cho các tác vụ không cần real-time (ví dụ Anthropic Batch API giảm ~50% chi phí nhưng chấp nhận chờ).
  • Prompt compression / RAG chọn lọc — chỉ đưa vào ngữ cảnh những đoạn thật sự liên quan thay vì nhồi cả tài liệu.
Ba đòn bẩy đầu tiên là thứ bạn nên dùng gần như mặc định trong mọi sản phẩm production.

Tình huống thực tế

Ví dụ 1 — Chatbot chăm sóc khách hàng của một sàn thương mại điện tử Việt Nam

Một đội sản phẩm tại TP.HCM xây chatbot hỗ trợ khách cho sàn TMĐT của họ. Bản đầu tiên gọi thẳng model lớn nhất cho mọi tin nhắn, kèm RAG nhồi toàn bộ chính sách đổi trả (khoảng 5.000 token) vào mỗi request. Kết quả demo tuyệt vời, nhưng khi lên production với ~120.000 lượt hỏi mỗi ngày:

  • Chi phí ước tính lên tới khoảng 1.900–2.100 USD/tháng — quá cao so với ngân sách.
  • TTFT trung bình khoảng 3,5 giây khiến khách gõ lại tin nhắn vì tưởng bot treo.
Đội đã làm ba việc. Thứ nhất, họ thêm prompt caching cho phần chính sách và system prompt — vì phần này giống nhau ở mọi request, TTFT giảm còn ~1,2 giây và chi phí input giảm mạnh. Thứ hai, họ dựng một router đơn giản: khoảng 70% câu hỏi thuộc dạng lặp ("làm sao đổi hàng", "phí ship bao nhiêu") được xử lý bằng model nhỏ với câu trả lời mẫu; chỉ 30% câu phức tạp mới lên model lớn. Thứ ba, họ bật streaming để khách thấy phản hồi ngay.

Kết quả: chi phí giảm khoảng 60%, còn chưa tới 800 USD/tháng, và tỷ lệ khách bỏ cuộc hội thoại giảm rõ rệt.

Bài học: đừng dùng một model duy nhất cho mọi request. Phần lớn traffic thực tế là câu hỏi lặp lại — routing và caching là hai đòn bẩy có ROI cao nhất mà bạn nên làm sớm.

Ví dụ 2 — Công cụ tóm tắt tài liệu nội bộ (không real-time)

Một công ty fintech ở Singapore xây tính năng tóm tắt hàng nghìn báo cáo tuân thủ (compliance) mỗi đêm. Ban đầu họ gọi API theo thời gian thực, từng tài liệu một, ban ngày — và trả giá full.

Điều họ nhận ra là: tác vụ này không cần real-time. Người dùng chỉ đọc bản tóm tắt vào sáng hôm sau. Vậy tại sao phải tối ưu latency? Họ chuyển sang Batch API: gom toàn bộ tài liệu trong ngày, gửi theo lô vào ban đêm, chấp nhận độ trễ vài giờ để đổi lấy giảm ~50% chi phí. Đồng thời họ giới hạn max_tokens cho bản tóm tắt còn 300 token thay vì để model tự do viết dài.

Kết quả: chi phí cho pipeline này giảm hơn một nửa, và vì chạy đêm nên không ai bận tâm chuyện chờ.

Bài học: hãy hỏi "use case này có thật sự cần real-time không?". Nếu câu trả lời là không, batching là món quà giảm chi phí gần như miễn phí. Đừng tối ưu một đại lượng (latency) mà người dùng không hề quan tâm.

Ví dụ 3 — Copilot lập trình và cái bẫy "model mạnh cho mọi thao tác"

Một startup dev-tools xây copilot gợi ý code. Họ mắc lỗi kinh điển: dùng model lớn nhất cho cả autocomplete (gợi ý inline khi gõ) lẫn chat (trả lời câu hỏi phức tạp). Autocomplete cần phản hồi dưới 300ms nếu không lập trình viên gõ nhanh hơn cả model — trải nghiệm hỏng hoàn toàn. Model lớn cho TTFT ~900ms, quá chậm cho autocomplete.

Giải pháp: tách hai đường xử lý. Autocomplete dùng một model nhỏ, được tối ưu tốc độ, chạy với output cực ngắn — ưu tiên latency tuyệt đối, chấp nhận chất lượng gợi ý "đủ tốt". Chat phức tạp mới dùng model lớn, nơi người dùng sẵn lòng chờ 2–3 giây để đổi lấy câu trả lời chất lượng.

Bài học: trong cùng một sản phẩm, các tính năng khác nhau nằm ở những điểm khác nhau trên tam giác. Đừng áp một lựa chọn model cho toàn bộ sản phẩm — hãy đặt câu hỏi tam giác cho từng luồng tương tác.

Hướng dẫn từng bước

Đây là quy trình để cân chỉnh latency và cost cho một tính năng AI trước khi đưa vào production:

Bước 1 — Xác định ràng buộc của từng use case. Với mỗi luồng, viết ra ba con số: ngân sách latency tối đa mà người dùng chịu được (autocomplete <300ms? chatbot <2s? báo cáo đêm không quan trọng?), mức chất lượng tối thiểu chấp nhận được, và trần chi phí mỗi request. Đây là "hợp đồng" bạn phải tôn trọng.

Bước 2 — Đo lường baseline thật. Đừng đoán. Gọi model thật với dữ liệu thật và ghi lại: TTFT, tổng latency, input/output token trung bình, chi phí mỗi request. Bạn không thể tối ưu thứ mình chưa đo.

Bước 3 — Cắt output trước tiên. Đặt max_tokens hợp lý và tinh chỉnh prompt để model trả lời gọn. Đây là đòn bẩy rẻ nhất, cải thiện cả latency lẫn cost cùng lúc.

Bước 4 — Thêm caching. Bật prompt caching cho phần input lặp lại (system prompt, tài liệu cố định). Thêm response cache cho các câu hỏi trùng nếu use case cho phép. Đo lại chênh lệch.

Bước 5 — Cân nhắc routing. Phân loại request theo độ khó. Nếu một tỷ lệ lớn traffic là câu đơn giản, dựng cơ chế đẩy chúng xuống model nhỏ và chỉ escalate câu khó lên model lớn.

Bước 6 — Cải thiện latency cảm nhận. Bật streaming. Thêm trạng thái loading rõ ràng. Người dùng chịu được chờ đợi tốt hơn nhiều nếu họ thấy hệ thống đang làm việc.

Bước 7 — Với tác vụ không real-time, chuyển sang batch. Nếu người dùng không cần kết quả ngay, gom và xử lý theo lô để giảm chi phí.

Bước 8 — Giám sát liên tục. Đặt dashboard theo dõi latency p95, chi phí mỗi ngày, tỷ lệ retry. Chi phí AI có xu hướng âm thầm trôi dạt khi traffic và prompt thay đổi.

Lỗi thường gặp & mẹo

Lỗi 1 — Dùng model mạnh nhất cho mọi thứ "cho chắc". Đây là nguyên nhân số một khiến hóa đơn phình to. Phần lớn request không cần model đỉnh. Hãy bắt đầu từ model nhỏ và chỉ nâng cấp khi chất lượng thực sự không đạt.

Lỗi 2 — Tối ưu latency cho tác vụ không ai chờ. Ngược lại, đừng đốt tiền để làm nhanh một pipeline chạy nền mà người dùng chỉ xem sau. Xác định đúng use case nào cần real-time.

Lỗi 3 — Quên tính chi phí retry và lỗi. Timeout, sai format, rate limit — mỗi lần gọi lại là tiền và là thêm latency. Theo dõi tỷ lệ retry như một chỉ số riêng.

Lỗi 4 — Nhồi quá nhiều ngữ cảnh vào prompt. RAG "cho nhiều vào cho an toàn" làm tăng cả chi phí input lẫn TTFT. Chọn lọc ngữ cảnh liên quan thay vì nhồi cả tài liệu.

Lỗi 5 — Bỏ qua streaming vì "không giảm tổng thời gian". Streaming không giảm latency thật nhưng giảm mạnh latency cảm nhận — đó là thứ người dùng thực sự đánh giá.

Mẹo: đặt sẵn "kill switch" ngân sách. Nếu chi phí ngày vượt ngưỡng, hệ thống tự động chuyển sang model rẻ hơn hoặc bật cache mạnh hơn. Điều này cứu bạn khỏi những đêm mất ngủ khi traffic tăng đột biến.

Mẹo: khi so sánh model, đừng chỉ nhìn giá mỗi token. Một model đắt hơn nhưng trả lời đúng ngay lần đầu (ít retry, output ngắn gọn) có thể rẻ hơn tổng thể so với model rẻ nhưng phải gọi lại nhiều lần.

Bài tập thực hành

  • Lập bảng tam giác cho sản phẩm của bạn. Chọn một sản phẩm AI bạn đang làm hoặc muốn làm. Liệt kê 3 luồng tương tác chính. Với mỗi luồng, ghi rõ: ngân sách latency, mức chất lượng tối thiểu, trần chi phí mỗi request. Bạn sẽ thấy chúng nằm ở những điểm khác nhau trên tam giác.
  • Tính chi phí vận hành. Giả sử sản phẩm bạn có 50.000 request/ngày, mỗi request trung bình 4.000 token input và 400 token output. Tra bảng giá của một nhà cung cấp (Anthropic hoặc OpenAI) và ước tính chi phí tháng. Sau đó tính lại nếu bạn áp prompt caching giảm 80% chi phí input và routing đẩy 60% request xuống model rẻ hơn 5 lần. So sánh hai con số.
  • Thiết kế chiến lược routing. Với chatbot của bạn, hãy phân loại: những dạng câu hỏi nào có thể xử lý bằng model nhỏ hoặc câu trả lời cache sẵn, những dạng nào bắt buộc lên model lớn? Ước tính tỷ lệ mỗi nhóm.
  • Xác định ứng viên batch. Trong sản phẩm của bạn, có tác vụ AI nào không cần real-time không? Nếu có, phác thảo cách chuyển nó sang xử lý theo lô và ước tính phần chi phí tiết kiệm được.

Tóm tắt

Latency, cost và quality là ba đại lượng luôn kéo co nhau trong mọi sản phẩm AI — bạn thường chỉ tối ưu được hai trong ba, và công việc của người làm sản phẩm là chọn đúng điểm cân bằng cho từng use case chứ không phải cho cả sản phẩm. Latency được cấu thành chủ yếu từ TTFT và độ dài output; cost bị chi phối bởi số token (đặc biệt output) nhân với số request nhân hệ số retry.

Những đòn bẩy có ROI cao nhất, nên áp dụng gần như mặc định, là: kiểm soát độ dài output, caching (prompt cache và response cache), model routing, và streaming để cải thiện latency cảm nhận. Với tác vụ không real-time, batching là món quà giảm chi phí gần như miễn phí. Ba tình huống — chatbot TMĐT, tóm tắt compliance, và copilot lập trình — cho thấy cùng một nguyên lý nhưng lời giải khác nhau vì mỗi use case nằm ở một vị trí khác trên tam giác. Hãy luôn bắt đầu bằng câu hỏi: use case này cần gì nhất, và mình có thể dịch chuyển tam giác bằng kỹ thuật nào để không phải hy sinh oan uổng?