Claude Opus 5 vs Claude Fable 5: 7 bài kiểm thử API thực tế và khuyến nghị định tuyến production
Nên chọn Claude Opus 5 hay Claude Fable 5? Nếu chỉ nhìn vào một lần trả lời thành công, cả hai mô hình đều có thể viết ra lời giải toán rất đẹp. Nhưng thứ thực sự ảnh hưởng đến trải nghiệm production thường là ba vấn đề khác: tác vụ có được giao ổn định hay không, độ trễ có phù hợp với tương tác hay không, và sau lỗi có thể tự phục hồi hay không.
Ngày 25/07/2026, chúng tôi dùng cùng một OpenAI-compatible API, cùng prompt và cùng tham số để kiểm thử hai mô hình trên 7 nhóm tác vụ. Kết quả không rơi vào câu chuyện đơn giản kiểu “mô hình lớn hơn thì chắc chắn tốt hơn”:
-
claude-fable-5nhanh hơn và súc tích hơn trên các tác vụ mà cả hai cùng hoàn thành thành công; -
claude-opus-5cuối cùng bao phủ đủ cả 7 nhóm tác vụ; - Fable 5 liên tục kích hoạt
content_filtertrên prompt review code và prompt JSON sự cố vốn rất bình thường; - Với bài vật lý, hai lần đầu Opus 5 trả về HTTP 200 nhưng chỉ phản hồi một câu chào không liên quan, đến lần thứ 3 mới hoàn thành bình thường.
Điều này có nghĩa là khi chọn mô hình cho production, bạn không nên chỉ có một model ID duy nhất. Cách an toàn hơn là: chọn mô hình chính theo loại tác vụ trước, sau đó bọc các bất thường bằng kiểm định nội dung, retry và fallback mô hình.
Kiểm thử Opus 5 và Fable 5 bằng cùng một API
Kết luận nhanh
| Câu hỏi | Kết quả trong vòng kiểm thử này |
|---|---|
| Mô hình nào bao phủ nhiều tác vụ hơn? | Opus 5: 6/7 ở bài kiểm thử chính, 7/7 sau retry |
| Mô hình nào nhanh hơn? | Trên các tác vụ cả hai cùng thành công, tổng độ trễ P50 của Fable 5 thấp hơn khoảng 24% |
| Mô hình nào xuất ra ngắn gọn hơn? | Fable 5, trung bình ít visible output token hơn khoảng 43% |
| Mô hình nào phù hợp hơn cho review code và JSON nghiêm ngặt? | Trong vòng này Opus 5 ổn định hơn; Fable 5 bị lọc liên tục 3 lần ở hai bài |
| Có thể chỉ nhìn HTTP 200 không? | Không; cả hai mô hình đều từng trả HTTP 200 nhưng không giao được tác vụ |
| Nên định tuyến thế nào? | Với tác vụ đã xác minh, ưu tiên Fable 5; khi bị lọc hoặc body rỗng thì fallback sang Opus 5; khi Opus trả câu chào bất thường thì tự động retry |
Nếu kiểu input của bạn khó dự đoán, hoặc bạn cần hạn chế tối đa việc prompt nghiệp vụ bình thường bị lọc, hãy ưu tiên cân nhắc Opus 5. Nếu cấu trúc tác vụ cố định, đã được regression test, và tốc độ tương tác cùng độ dài output quan trọng hơn, Fable 5 phù hợp hơn để làm bước gọi đầu tiên.
Chúng tôi đã kiểm thử như thế nào
Trước khi kiểm thử, chúng tôi gọi endpoint danh sách mô hình để xác nhận hai model ID chính xác đều hiển thị:
GET https://cn.crazyrouter.com/v1/models
claude-opus-5
claude-fable-5
Tất cả request chính thức đều đi qua cùng một endpoint:
POST https://cn.crazyrouter.com/v1/chat/completions
Điều kiện chung như sau:
Cùng system prompt
Cùng user prompt
temperature = 1
Mỗi bài dùng cùng max_tokens
stream = true
Không bật tool và không truy cập web
System prompt thống nhất chỉ yêu cầu trả lời chính xác và tuân thủ định dạng output, không thêm role setting thiên vị mô hình nào:
Answer the user's task accurately. Follow every requested output format and length constraint exactly. Do not use external tools.
Chúng tôi không chỉ ghi lại phần văn bản cuối cùng, mà còn ghi:
- Trạng thái HTTP và
finish_reason; - response ID và returned model;
- Thời gian đến visible token đầu tiên và tổng độ trễ;
- completion tokens, reasoning tokens;
- Câu trả lời hiển thị có đạt tiêu chí nghiệm thu tác vụ hay không;
- Request bất thường có thể phục hồi bằng retry với cùng tham số hay không.
Đây là một bộ kiểm thử end-to-end qua gateway Crazyrouter, không phải thí nghiệm cố định một kênh upstream duy nhất. Vì vậy, kết quả đồng thời phản ánh hành vi mô hình, bộ lọc upstream, định tuyến gateway và trạng thái kênh tại thời điểm đó. Nó phù hợp để trả lời câu hỏi “người dùng thực tế sẽ gặp gì khi đi qua API này”, nhưng không phù hợp để đóng gói thành bảng xếp hạng năng lực offline thuần túy của họ Claude.
Nếu muốn hiểu vì sao kiểm thử mô hình bắt buộc phải ghi finish_reason và output budget, bạn có thể đọc tiếp bài kiểm thử lại max_tokens giữa Claude Fable 5 và GPT-5.5.
Bảng tổng hợp kết quả 7 tác vụ
| Chiều kiểm thử | Claude Opus 5 | Claude Fable 5 | Tác động production |
|---|---|---|---|
| Toán chính xác: chuỗi Markov | Đạt | Đạt | Cả hai đều cho moment bậc nhất, moment bậc hai và phương sai chính xác |
| Vật lý số: dao động tử ghép | Hai lần đầu chỉ trả câu chào, lần thứ 3 đạt | Đạt ở vòng đầu | Opus cần nghiệm thu ở cấp nội dung và retry |
| Tìm kiếm ràng buộc | Đạt | Đạt | Cả hai đều tìm được nghiệm duy nhất |
| Sửa lỗi thống kê | Đạt | Đạt | Cả hai đều bác bỏ tiền đề sai và đưa ra cận trên đúng |
| Review code Python | Đạt | 3 lần liên tiếp content_filter
|
Hiện tại Fable chưa phù hợp cho lưu lượng review code chưa regression test |
| Tóm tắt sự cố JSON nghiêm ngặt | Đạt | 3 lần liên tiếp content_filter
|
Hiện tại Fable chưa phù hợp với loại văn bản sự cố production này |
| Thiết kế thí nghiệm | Đạt | Đạt | Cả hai đều nhận ra mẫu không bắt cặp và nhiễu do độ khó |
Tỷ lệ giao tác vụ một lần trong bài kiểm thử chính:
Claude Opus 5: 6 / 7 = 85.7%
Claude Fable 5: 5 / 7 = 71.4%
Sau khi thêm retry:
Claude Opus 5: 7 / 7
Claude Fable 5: 5 / 7
Ở đây, “giao tác vụ” không có nghĩa là request thành công, mà là nghiệp vụ nhận được câu trả lời hiển thị đúng yêu cầu bài. Dù HTTP 200, tên mô hình và token usage đều tồn tại, nếu body rỗng, bị lọc hoặc chỉ trả câu chào, tác vụ vẫn được tính là thất bại.
Toán, ràng buộc và thống kê: cả hai mô hình đều đáng tin cậy
Bài toán dùng chuỗi Markov ba trạng thái, yêu cầu tính thời gian chờ từ trạng thái 1 đến lần đầu chạm trạng thái 3:
E1[τ]
E1[τ²]
Var1(τ)
Cả hai mô hình đều đưa ra:
E1[τ] = 5
E1[τ²] = 43
Var1(τ) = 18
Chúng cũng đều viết ra ma trận tạm thời Q và các phương trình moment bậc nhất, bậc hai. Ở bài này không xuất hiện tình huống “con số cuối cùng đúng nhưng suy luận không nhất quán”.
Bài tìm kiếm ràng buộc yêu cầu xếp năm bài nói A, B, C, D, E vào năm khung thời gian, đồng thời thỏa mãn các điều kiện về liền kề ngay lập tức, thứ tự trước sau, khoảng cách và không kề nhau. Cả hai đều tìm ra thứ tự duy nhất:
A, C, E, B, D
Bài sửa lỗi thống kê cố tình đưa ra một kết luận sai: “trung bình bằng 10, phương sai bằng 4, nên P(X≥14)=0.5.” Cả hai mô hình đều chỉ ra rằng hai moment đầu không đủ để xác định duy nhất xác suất đuôi, và dùng bất đẳng thức Chebyshev/Cantelli một phía để nhận được:
P(X >= 14) <= 0.2
Ba nhóm tác vụ này cho thấy lợi thế tốc độ của Fable 5 không đến từ việc hy sinh độ đúng của suy luận cơ bản. Với các bài toán và logic rõ ràng, ngắn, có thể nghiệm thu được, nó hoàn toàn có thể đóng vai trò bước gọi đầu nhẹ hơn.
Các bài kiểm thử API Claude Fable 5 vs Claude Sonnet 5 và kiểm thử output budget GLM-5.2 vs Fable 5 trước đó cũng cho thấy: để đánh giá một mô hình có phù hợp production hay không, cần nhìn đồng thời vào độ đúng, output budget và hình thái giao tác vụ.
Bài vật lý: Fable hoàn thành ngay vòng đầu, Opus phục hồi ở lần thứ ba
Bài vật lý yêu cầu xử lý một hệ dao động tử hai bậc tự do có damping nối đất và damping ghép, tính hai tần số riêng không damping, cũng như đáp ứng tần số phức của hai khối lượng tại ω=8 rad/s.
Giá trị tham chiếu là:
ω1 = 10.0204 rad/s
ω2 = 16.2149 rad/s
|X1| = 0.14929 m, phase = -12.15°
|X2| = 0.07174 m, phase = -13.90°
Fable 5 đưa ra đầy đủ kết quả đúng ngay vòng đầu. Trong khi đó, hai lần gọi đầu tiên của Opus 5 xuất hiện một bất thường đáng để đội production lưu ý hơn: API trả về HTTP 200 và finish_reason=stop, nhưng body chỉ có:
Hi! How can I help you today?
Prompt tokens của cả hai response này đều chỉ là 10, rõ ràng không khớp với input thật. Khi thực thi cùng request lần thứ 3, Opus 5 trả về đầy đủ sau 34.901 giây, và cả sáu giá trị số đều qua kiểm tra.
Vì vậy, loại bất thường này không nên được phân loại là “tính sai bài vật lý”, mà nên được phân loại là “ngữ cảnh request không được xử lý đúng”. Tuyến phòng thủ đơn giản nhất không phải là để con người đọc log, mà là đặt nghiệm thu cấp tác vụ ở phía caller: câu trả lời phải chứa ω1, ω2, X1, X2; thiếu bất kỳ trường nào thì retry.
Code và JSON nghiêm ngặt: bộ lọc của Fable là khác biệt lớn nhất trong vòng này
Bài code yêu cầu mô hình review một bộ phát hiện chu trình DFS bằng Python. Bug rất thông thường: sau khi DFS xong một node, code không xóa node đó khỏi tập visiting, khiến node đã hoàn tất vẫn bị xem nhầm là đang nằm trong recursion stack, từ đó báo nhầm có chu trình trên DAG.
Opus 5 chỉ ra đúng bản sửa tối thiểu:
visiting.discard(node)
visited.add(node)
return False
Fable 5 không trả về phân tích code, mà là finish_reason=content_filter, body rỗng. Để loại trừ thiên lệch system prompt và định tuyến ngẫu nhiên, chúng tôi làm ba vòng: kiểm thử gốc, kiểm thử lại với system prompt sạch, và retry độc lập một bài. Kết quả đều là content_filter.
Bài JSON nghiêm ngặt cũng không có nội dung nguy hiểm. Input chỉ gồm tổng số request trong 15 phút, số lỗi, quy kết theo kênh, số lần retry phục hồi và hành động xử lý, yêu cầu output một JSON object. JSON mà Opus 5 trả về có thể parse trực tiếp; Fable 5 cũng bị lọc liên tục 3 lần.
Hai nhóm thất bại này cho thấy: bản thân safety filter cũng là một năng lực production của API mô hình. Nếu một mô hình thường xuyên lọc nhầm trên review code bình thường hoặc văn bản postmortem sự cố, thì dù nó nhanh hơn ở bài toán, nó cũng không thể trực tiếp tiếp quản toàn bộ lưu lượng nghiệp vụ.
response ID của hai lần retry độc lập:
Review code: gen-1784915384-vGI1PtuNXZG0IJ2YiaCz
JSON sự cố: gen-1784915390-buOWZQSnqjgHeJ6nUogF
Độ trễ và độ dài output
Để tránh tính thời gian ngắn của request thất bại thành “lợi thế tốc độ”, phần này chỉ so sánh bốn tác vụ chung mà cả hai mô hình đều thành công: toán, tìm kiếm ràng buộc, sửa lỗi thống kê, thiết kế thí nghiệm.
| Chỉ số | Claude Opus 5 | Claude Fable 5 |
|---|---|---|
| Tổng độ trễ P50 | 10.729 s | 8.147 s |
| P50 đến visible token đầu tiên | 8.376 s | 6.974 s |
| Visible completion tokens trung bình | 797.5 | 452.3 |
Trong mẫu nhỏ này, tổng độ trễ P50 của Fable 5 thấp hơn khoảng 24%, visible token đầu tiên thấp hơn khoảng 17%, và câu trả lời ngắn hơn khoảng 43%. Với chat, tóm tắt hàng loạt và tác vụ có cấu trúc tần suất cao, những khác biệt này sẽ ảnh hưởng trực tiếp đến thời gian chờ của người dùng và khối lượng xử lý downstream.
Tuy nhiên, đừng biến median của 4 bài thành SLA. Tải upstream, cache, định tuyến và rate limit đều có thể làm thay đổi độ trễ. Trước khi lên production chính thức, bạn nên lặp lại 20–50 lần bằng prompt nghiệp vụ của chính mình, rồi thống kê P50, P95, P99 và chi phí thực của mỗi kết quả đạt nghiệm thu.
Response trong bài kiểm thử chính của Fable 5 cung cấp trường cost, tổng 7 lần khoảng $0.24596. Usage của Opus 5 không cung cấp cost cùng tiêu chuẩn, nên bài viết này không kết luận thắng thua về giá USD. Thiếu field không có nghĩa là miễn phí, và cũng không nên tự điền giá chưa được xác minh.
Chiến lược định tuyến production được khuyến nghị
Gọi một mô hình duy nhất là cách dễ viết nhất, nhưng nó phơi bày toàn bộ hành vi ngẫu phát của mô hình cho người dùng cuối. Với hai mô hình trong vòng kiểm thử này, cách phân công hợp lý hơn như sau:
Fable 5 làm bước gọi đầu tiên
Phù hợp với:
- Toán, suy luận ràng buộc và tóm tắt ngắn đã vượt regression test;
- Tương tác nhạy với first token và tổng độ trễ;
- Tác vụ muốn kiểm soát độ dài câu trả lời và giảm gánh nặng hậu xử lý.
Điều kiện là họ tác vụ đã được kiểm thử lọc, và phía caller sẽ kiểm tra content_filter, body rỗng và trường bị thiếu.
Opus 5 làm fallback bao phủ rộng
Phù hợp với:
- Kiểu input khó dự đoán;
- Các tình huống cần bao phủ tác vụ rộng hơn như review code, JSON nghiêm ngặt, vật lý phức tạp;
- Trường hợp Fable 5 bị lọc và cần tự động phục hồi request của người dùng.
Opus 5 cũng không được miễn kiểm tra. Bất thường trả câu chào trong vòng này chứng minh rằng HTTP 200 và stop vẫn có thể không có câu trả lời nghiệp vụ.
Ví dụ Python OpenAI-compatible
Ví dụ dưới đây gọi Fable 5 trước; khi gặp lọc, body rỗng hoặc không đạt nghiệm thu thì fallback sang Opus 5; nếu Opus vẫn chỉ trả câu chào, nó sẽ retry thêm một lần.
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://cn.crazyrouter.com/v1",
)
def valid_answer(text: str, required_terms: tuple[str, ...]) -> bool:
normalized = (text or "").strip()
if not normalized:
return False
if normalized.lower().startswith("hi! how can i help"):
return False
return all(term in normalized for term in required_terms)
def call_model(model: str, prompt: str) -> tuple[str, str | None]:
response = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}],
temperature=1,
max_tokens=3000,
)
choice = response.choices[0]
return choice.message.content or "", choice.finish_reason
def routed_completion(prompt: str, required_terms: tuple[str, ...] = ()) -> str:
for model, attempts in (("claude-fable-5", 1), ("claude-opus-5", 2)):
for _ in range(attempts):
text, finish_reason = call_model(model, prompt)
if finish_reason == "content_filter":
break
if valid_answer(text, required_terms):
return text
raise RuntimeError("No model produced a valid business answer")
answer = routed_completion(
"Return a JSON incident summary with keys total, failed, recovered.",
required_terms=('"total"', '"failed"', '"recovered"'),
)
print(answer)
Triển khai production cũng nên ghi lại model, response ID, finish_reason, tổng độ trễ và nguyên nhân nghiệm thu thất bại. Nhờ đó, bạn có thể phân biệt mô hình tính sai, output bị cắt, nội dung bị lọc và định tuyến làm mất input, thay vì gom tất cả vào một nhãn mơ hồ là “mô hình lỗi”.
Nếu bạn đang lên kế hoạch cho hạ tầng đa mô hình, có thể tham khảo sự khác nhau giữa AI API Gateway, aggregator và API mô hình kết nối trực tiếp, cũng như kiểm thử bảy chiều Kimi K3 vs Opus 4.8.
Khuyến nghị cuối cùng
Kết luận có giá trị nhất trong vòng này không phải là ai đạt điểm cao hơn, mà là hình thái thất bại của hai mô hình khác nhau:
- Lợi thế của Fable 5 là nhanh hơn và ngắn hơn trên các tác vụ chung; rủi ro là một số prompt nghiệp vụ bình thường có thể kích hoạt bộ lọc một cách ổn định.
- Lợi thế của Opus 5 là bao phủ toàn bộ tác vụ sau retry; rủi ro là đôi khi trả về câu chào không liên quan đến input thật.
Vì vậy, nên đặt Fable 5 ở phía trước cho các tác vụ tần suất cao đã được xác minh, dùng Opus 5 làm fallback bao phủ rộng hơn, và thực hiện nghiệm thu cấp nội dung cho cả hai tuyến. Khi đó, kết quả so sánh mô hình mới chuyển hóa thành độ tin cậy thực tế, thay vì chỉ dừng lại ở một bảng xếp hạng.
Tạo API Key để tái hiện bộ định tuyến hai mô hình này
FAQ
Claude Opus 5 chắc chắn mạnh hơn Claude Fable 5 không?
Không thể từ mẫu nhỏ này kết luận rằng Opus mạnh hơn trên mọi tác vụ. Cả hai đều vượt qua toán, ràng buộc, sửa lỗi thống kê và thiết kế thí nghiệm; Fable 5 nhanh hơn, ngắn hơn, còn Opus 5 có mức bao phủ tác vụ đầy đủ hơn. Lựa chọn nên dựa trên tỷ lệ thành công của tác vụ cụ thể, không phải tên mô hình.
Claude Fable 5 có phù hợp với production không?
Có, với các tác vụ đã được regression test. Trong vòng này, nó trả lời đúng và khá nhanh trên nhiều loại tác vụ suy luận, nhưng review code và JSON sự cố lại liên tục kích hoạt bộ lọc. Trước khi triển khai, bạn nên dùng prompt thật để đo tỷ lệ lọc và cấu hình fallback sang Opus 5 hoặc mô hình khác.
Vì sao HTTP 200 vẫn được tính là thất bại?
HTTP 200 chỉ cho biết API đã hoàn tất response. Body rỗng, finish_reason=content_filter, output bị cắt, hoặc chỉ trả một câu chào đều không hoàn thành tác vụ nghiệp vụ. Chỉ số production nên thống kê “tỷ lệ đạt nghiệm thu”, chứ không chỉ thống kê tỷ lệ HTTP thành công.
Vì sao returned model là anthropic/claude-fable-5?
Request dùng claude-fable-5, còn returned model trong response ổn định là anthropic/claude-fable-5 có tiền tố provider. Có thể xem đây là alias đã chuẩn hóa; chỉ riêng thay đổi tiền tố không đủ để chứng minh đã xảy ra thay thế mô hình.
Có thể so sánh trực tiếp chi phí USD của hai mô hình không?
Trong vòng này thì không. Response của Fable 5 cung cấp trường cost, còn Opus 5 không cung cấp field cùng tiêu chuẩn. So sánh chi phí nghiêm ngặt nên lấy dữ liệu từ log tính phí thống nhất, và dùng chỉ số “chi phí trên mỗi kết quả đạt nghiệm thu”.
Nên lặp lại bao nhiêu lần trước khi quyết định triển khai?
Khuyến nghị mỗi họ tác vụ lõi lặp lại ít nhất 20–50 lần, bao phủ input bình thường, input biên, input dài và input dễ kích hoạt bộ lọc. Tối thiểu cần ghi tỷ lệ thành công tác vụ, tỷ lệ lọc, tỷ lệ body rỗng, tỷ lệ bị cắt, độ trễ P50/P95/P99 và chi phí.
Bắt đầu kiểm thử như thế nào?
Dùng https://cn.crazyrouter.com/v1 làm OpenAI-compatible base URL, rồi lần lượt gọi claude-opus-5 và claude-fable-5. Cố định prompt và tham số, lưu response gốc, sau đó dùng assertion cục bộ hoặc schema validation để xác định tác vụ có thực sự hoàn thành hay không.



Top comments (0)