Tối ưu chi phíHướng dẫn
Cắt lịch sử chat để giảm chi phí: cửa sổ trượt hay tóm tắt
Giới hạn những gì bạn gửi lại mỗi lượt: giữ vài tin nhắn cuối hoặc một bản tóm tắt ngắn. Phép tính token cho cuộc chat 50 lượt và một helper Python.

Trên trang này
Bot hỗ trợ của bạn đã trò chuyện được 50 lượt, và mỗi tin nhắn mới lại tốn hơn tin trước. API không ghi nhớ gì cả, nên code của bạn gửi lại toàn bộ cuộc hội thoại mỗi lần. Cách khắc phục là giới hạn những gì bạn gửi: giữ system prompt và vài lượt gần nhất (một cửa sổ trượt), hoặc thay các lượt cũ bằng một bản tóm tắt ngắn. Dưới đây là phép tính cho một cuộc chat 50 lượt và một helper bạn có thể sao chép.
Hướng dẫn chat nhiều lượt của DeepSeek (api-docs.deepseek.com, kiểm tra ngày 1 tháng 11 năm 2026) nói rõ: server không ghi lại ngữ cảnh của các request trước đó, nên client gửi toàn bộ danh sách messages trong mỗi lần gọi. Định dạng tương thích OpenAI trên CheapTokens cũng hoạt động như vậy. Nếu điều này còn mới với bạn, hãy bắt đầu với vì sao một cuộc chat dài tốn hơn và mảng messages hoạt động thế nào.
Lượt 50 thực sự gửi những gì#
Giả sử bạn chạy một bot hỗ trợ với system prompt 400 token. Trong một lượt điển hình, người dùng viết khoảng 60 token và bot trả lời khoảng 190. Một lượt đầy đủ thêm 250 token vào lịch sử. Đây là các giả định: hãy thay chúng bằng con số từ trường usage trong chính các phản hồi của bạn.
Ở lượt 50, request mang theo system prompt, 49 lượt trước đó và tin nhắn mới: 400 + 49 × 250 + 60 = 12,710 token đầu vào, để nhận được câu trả lời 190 token. Cộng dồn cả cuộc chat. System prompt và tin nhắn mới được gửi mỗi lần: 50 × 460 = 23,000. Phần lịch sử lặp lại cộng thêm 250 × 1,225 = 306,250. Tổng cộng: 23,000 + 306,250 = 329,250 token đầu vào, so với 50 × 190 = 9,500 token đầu ra.
Lịch sử trong mỗi request tăng thêm một lượt, nên tổng tăng theo bình phương độ dài cuộc chat. Từ 50 lên 100 lượt và phần lịch sử lặp lại gần như tăng gấp bốn.
Tự mình thử xemThử xem: nếu bạn chỉ gửi system prompt, 4 lượt cuối và tin nhắn mới, lượt 50 sẽ mang bao nhiêu token đầu vào?Hiện đáp án
1.460 (400 + 4 × 250 + 60), so với 12.710 khi gửi toàn bộ lịch sử. Cùng câu hỏi, cùng độ dài câu trả lời, chỉ một phần nhỏ đầu vào.
Lựa chọn 1: cửa sổ trượt#
Ý tưởng: luôn gửi system prompt, bỏ mọi thứ trừ N lượt cuối. Bạn giữ toàn bộ lịch sử trong kho lưu trữ của mình và chỉ cắt bản sao bạn gửi đi.
def trim_history(messages, keep_pairs=4):
"""System prompt + the last keep_pairs turns + the new user message."""
system = [m for m in messages if m["role"] == "system"]
rest = [m for m in messages if m["role"] != "system"]
return system + rest[-(keep_pairs * 2 + 1):]Gọi nó sau khi bạn thêm tin nhắn mới của người dùng. Với keep_pairs=4, đó là 4 cặp user/assistant cộng tin nhắn mới, 9 tin nhắn, và lát cắt luôn bắt đầu từ một tin nhắn user. Đây là cách nó được nối vào một lần gọi thực tế:
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.cheaptokens.dev/v1",
api_key=os.environ["CHEAPTOKENS_API_KEY"],
)
MODEL = "deepseek-ai/DeepSeek-V4-Flash-0731"
history = [{"role": "system", "content": "You are a concise support assistant."}]
def ask(text):
history.append({"role": "user", "content": text})
resp = client.chat.completions.create(
model=MODEL,
messages=trim_history(history),
max_tokens=500,
)
answer = resp.choices[0].message.content
history.append({"role": "assistant", "content": answer})
print(resp.usage.prompt_tokens, resp.usage.completion_tokens)
return answerDòng print là dòng hữu ích: hãy để ý con số đầu tiên. Không cắt bớt thì nó tăng mỗi lượt. Với cửa sổ, nó ngừng tăng khi cuộc chat vượt qua lượt 4.

Theo con số: từ lượt 5 trở đi, mỗi request là 400 + 4 × 250 + 60 = 1,460 token đầu vào. Bốn lượt đầu vẫn tăng bình thường và cộng lại là 3.340. Cả cuộc chat: 3,340 + 46 × 1,460 = 70,500 token đầu vào, khoảng một phần năm so với 329.250 khi gửi toàn bộ lịch sử. Đầu ra vẫn là 50 × 190 = 9,500.

Trong code, toàn bộ thay đổi chỉ là một đối số trong lần gọi:
So sánh
Thay đổi một dòng
Trước
messages=historySau
messages=trim_history(history)Vấn đề: cửa sổ sẽ quên. Nếu người dùng hỏi ở lượt 40 "số đơn hàng của tôi là gì?" và con số đó nằm ở lượt 3, model chưa từng thấy nó. Hai cách khắc phục rẻ. Trích các dữ kiện ổn định (tên, số đơn hàng, gói dịch vụ) ra khỏi cuộc chat trong code của bạn và nối chúng vào system prompt, nơi cửa sổ không bao giờ cắt. Hoặc thêm một bản tóm tắt, đó là lựa chọn tiếp theo.
Lựa chọn 2: tóm tắt các lượt cũ#
Thay vì bỏ các lượt cũ, bạn nén chúng lại. Cứ vài lượt, gửi các lượt vừa rơi ra khỏi cửa sổ, cộng với bản tóm tắt hiện tại, cho model và yêu cầu một bản tóm tắt mới, ngắn gọn. Sau đó đưa bản tóm tắt đó vào system message.
def summarize(summary, old_messages):
transcript = "\n".join(f"{m['role']}: {m['content']}" for m in old_messages)
prompt = (
f"Summary so far:\n{summary}\n\nNew turns:\n{transcript}\n\n"
"Rewrite the summary in under 200 words. "
"Keep names, numbers, decisions and open questions."
)
resp = client.chat.completions.create(
model=MODEL,
messages=[{"role": "user", "content": prompt}],
max_tokens=400,
)
return resp.choices[0].message.content
def build_messages(history, summary, keep_pairs=4):
system = history[0]["content"]
if summary:
system += "\n\nEarlier in this chat: " + summary
recent = history[1:][-(keep_pairs * 2 + 1):]
return [{"role": "system", "content": system}] + recentBản tóm tắt không miễn phí: đó là một lần gọi model thêm. Giả sử bản tóm tắt khoảng 300 token, làm mới mỗi 5 lượt (9 lần trong 50 lượt), mỗi lần làm mới đọc khoảng 1.600 token (bản tóm tắt cũ cộng năm lượt cộng chỉ dẫn) và ghi 300. Để an toàn, hãy tính bản tóm tắt trong mọi request từ lượt 5 trở đi (thực tế nó xuất hiện sau lần làm mới đầu tiên, nên đây là ước tính hơi cao): 400 + 300 + 4 × 250 + 60 = 1,760 token đầu vào.
Tổng cho cuộc chat: request chính 3,340 + 46 × 1,760 = 84,300 token đầu vào, các lần gọi tóm tắt 9 × 1,600 = 14,400 đầu vào và 9 × 300 = 2,700 đầu ra. Tất cả: 84,300 + 14,400 = 98,700 token đầu vào và 9,500 + 2,700 = 12,200 token đầu ra.
Bản tóm tắt tốn hơn một chút so với cửa sổ trần, và đổi lại model vẫn biết chuyện gì đã xảy ra ở lượt 3.
Ba cách thiết lập tốn bao nhiêu#
Đây là cùng một cuộc chat 50 lượt trên DeepSeek-V4-Flash, tính giá trực tiếp từ các tổng ở trên:
Giá lấy từ bảng giá trực tiếp, nên các con số cập nhật khi biểu giá thay đổi. Thứ tự thì không: cửa sổ gửi ít nhất, tóm tắt ở giữa, toàn bộ lịch sử đắt nhất.
Với một cuộc chat như thế này, model CheapTokens để bắt đầu là DeepSeek-V4-Flash. Nó có cửa sổ ngữ cảnh 380K (một cuộc chat 50 lượt vừa cả khi không cắt), tối đa 32.768 token đầu ra mỗi câu trả lời, một mức giá cố định vào bất kỳ giờ nào trong ngày, và tổng cộng, khi tính cả đầu vào lẫn đầu ra, nó rẻ hơn OpenRouter. Model id là deepseek-. Nếu bạn muốn so sánh các model trên thiết lập cửa sổ (trung bình 1.410 token đầu vào mỗi request, 190 đầu ra, 50 request), đây là bảng trực tiếp:
| Mô hình | Đầu vào $/1M | Đầu ra $/1M | Mỗi yêu cầu | 50 yêu cầu | OpenRouter, 50 yêu cầu |
|---|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.000036 | $0.0018 | $0.0032 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.00004 | $0.002 | $0.0063 |
| MiniMax-M2.7 | $0.05 | $0.15 | $0.000099 | $0.005 | $0.0594 |
1.410 token đầu vào và 190 token đầu ra mỗi yêu cầu. Giá trên 1 triệu token là giá hiện hành và thay đổi cùng với biểu phí của chúng tôi; cột OpenRouter hiển thị giá tham chiếu cho cùng khối lượng công việc.
GLM-5.3-Flash có ngữ cảnh 390K và MiniMax-M2.7 có 180K, đủ cho một cuộc chat đã cắt gọn. Giá hiện tại ở trang giá, và tài liệu hướng dẫn cách gửi request đầu tiên.
Chọn cách nào#
Cửa sổ là mặc định: ba dòng code, không lần gọi thêm, không thêm kiểu lỗi mới. Dùng nó cho bot hỗ trợ, gia sư và nhập vai, nơi vài lượt cuối mang cuộc hội thoại và system prompt mang các quy tắc. Thêm bản tóm tắt khi người dùng nhắc lại những điều đã nói từ lâu, như trong một trợ lý cá nhân với một cuộc hội thoại không bao giờ kết thúc. Giữ cửa sổ đủ nhỏ để model vẫn thấy ngữ cảnh tức thời, và đủ lớn để chứa trọn một lượt hỏi-đáp. Bao nhiêu thì vừa là một giới hạn riêng, được đề cập trong cửa sổ ngữ cảnh là gì.
Kiểm tra nhanh
Người dùng hỏi ở lượt 40 về một số đơn hàng đã đưa ở lượt 3. Bạn dùng cửa sổ 4 lượt không có tóm tắt. Điều gì xảy ra?
Hiện đáp án
Trả lời: Model không thể thấy nó, vì lượt 3 đã bị cắt khỏi request
API là stateless. Model chỉ thấy những gì có trong request, nên các dữ kiện bạn vẫn cần phải nằm trong system prompt hoặc trong một bản tóm tắt.



