Quay lai Blog
Hướng dẫn

Extended Thinking Claude — Tăng Cường Suy Luận Cho Bài Toán Phức Tạp

Đoàn Đình Tỉnh29 tháng 3, 202610 phut doc
Extended Thinking Claude — Tăng Cường Suy Luận Cho Bài Toán Phức Tạp
📘 Bản dịch tiếng Việt từ tài liệu chính thức của Anthropic. Cập nhật: 28/03/2026

Extended Thinking Claude — Tăng Cường Suy Luận Cho Bài Toán Phức Tạp

Extended Thinking là tính năng nâng cao của Claude API, cho phép Claude thực hiện suy luận sâu và có hệ thống trước khi đưa ra câu trả lời cuối cùng. Thay vì trả lời ngay, Claude sẽ "suy nghĩ" qua các bước trung gian — tương tự như cách một chuyên gia phân tích vấn đề trước khi đưa ra kết luận.

Đây là tính năng đặc biệt hữu ích cho các bài toán kinh doanh phức tạp mà doanh nghiệp SME Việt Nam thường gặp: phân tích chiến lược, lập kế hoạch tài chính, giải quyết vấn đề kỹ thuật nhiều bước, hay đưa ra quyết định dựa trên nhiều yếu tố.

⚡ Cập nhật quan trọng: Với Claude Opus 4.6Claude Sonnet 4.6, Anthropic khuyến nghị dùng Adaptive Thinking (thinking: {type: "adaptive"}) với effort parameter thay vì manual thinking mode. Chế độ thinking: {type: "enabled", budget_tokens: N} đã được deprecated trên các model này.

Các model hỗ trợ Extended Thinking

Extended Thinking được hỗ trợ trên các model sau:

  • Claude Opus 4.6 (claude-opus-4-6) — khuyến nghị dùng adaptive thinking
  • Claude Opus 4.5 (claude-opus-4-5-20251101)
  • Claude Opus 4.1 (claude-opus-4-1-20250805)
  • Claude Opus 4 (claude-opus-4-20250514)
  • Claude Sonnet 4.6 (claude-sonnet-4-6) — khuyến nghị dùng adaptive thinking
  • Claude Sonnet 4.5 (claude-sonnet-4-5-20250929)
  • Claude Sonnet 4 (claude-sonnet-4-20250514)
  • Claude Sonnet 3.7 (claude-3-7-sonnet-20250219) — deprecated
  • Claude Haiku 4.5 (claude-haiku-4-5-20251001)

Cách Extended Thinking hoạt động

Khi bật Extended Thinking, Claude tạo ra các thinking content blocks chứa quá trình suy luận nội tâm. API response bao gồm thinking blocks theo sau là text blocks:

{
  "content": [
    {
      "type": "thinking",
      "thinking": "Hãy để tôi phân tích vấn đề này từng bước...",
      "signature": "WaUjzkypQ2mUEVM36O2TxuC06KN8xyfbJwyem2dw3URve..."
    },
    {
      "type": "text",
      "text": "Dựa trên phân tích của tôi..."
    }
  ]
}

Cách sử dụng cơ bản

Thêm object thinking với type: "enabled" và tham số budget_tokens:

import anthropic

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=16000,
    thinking={"type": "enabled", "budget_tokens": 10000},
    messages=[
        {
            "role": "user",
            "content": "Phân tích chiến lược mở rộng thị trường cho startup B2B SaaS tại Việt Nam. "
                       "Xem xét các yếu tố: thị trường mục tiêu, kênh phân phối, định giá và cạnh tranh.",
        }
    ],
)

# Response chứa thinking blocks và text blocks
for block in response.content:
    if block.type == "thinking":
        print(f"\n[Quá trình suy luận]: {block.thinking[:200]}...")
    elif block.type == "text":
        print(f"\n[Câu trả lời]: {block.text}")

Các tham số quan trọng

  • type: Đặt là "enabled" cho manual thinking (hoặc "adaptive" cho Opus 4.6 và Sonnet 4.6)
  • budget_tokens: Số token tối đa dành cho quá trình suy luận nội tâm. Claude có thể không dùng hết budget, đặc biệt với giá trị trên 32k. Lưu ý: budget_tokens phải nhỏ hơn max_tokens.

Summarized Thinking — Tóm tắt quá trình suy luận

Các model Claude 4 trả về tóm tắt của quá trình thinking đầy đủ theo mặc định. Một số điểm cần biết:

  • Bạn bị tính phí cho toàn bộ token thinking, không chỉ phần tóm tắt hiển thị
  • Số token output được tính sẽ không khớp với số token hiển thị
  • Vài dòng đầu tiên verbose hơn để thuận tiện cho prompt engineering
  • Claude Sonnet 3.7 trả về toàn bộ thinking output (không tóm tắt)
  • Nếu cần toàn bộ thinking trên model Claude 4, hãy liên hệ sales của Anthropic

Dùng display: "omitted" để tăng tốc độ

Trường display kiểm soát cách thinking được trả về:

  • "summarized" (mặc định): Thinking blocks chứa văn bản tóm tắt
  • "omitted": Thinking blocks trả về với trường thinking rỗng; signature vẫn được giữ để đảm bảo liên tục trong multi-turn

Dùng display: "omitted" khi bạn muốn tăng tốc độ streaming (faster time-to-first-text-token) mà không cần xem quá trình suy luận. Lưu ý: bạn vẫn bị tính phí cho toàn bộ thinking tokens.

response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=16000,
    thinking={
        "type": "enabled",
        "budget_tokens": 10000,
        "display": "omitted",  # Ẩn thinking, chỉ lấy kết quả
    },
    messages=[
        {"role": "user", "content": "Tính 27 × 453 và giải thích cách tính?"},
    ],
)

for block in response.content:
    if block.type == "thinking":
        print("Thinking: [đã ẩn]")
    elif block.type == "text":
        print(f"Kết quả: {block.text}")

Streaming Extended Thinking

Bạn có thể stream Extended Thinking qua server-sent events (SSE) để hiển thị kết quả từng phần cho người dùng:

with client.messages.stream(
    model="claude-sonnet-4-6",
    max_tokens=16000,
    thinking={"type": "enabled", "budget_tokens": 10000},
    messages=[
        {
            "role": "user",
            "content": "Phân tích 5 rủi ro chính khi triển khai AI Agent trong doanh nghiệp SME?",
        }
    ],
) as stream:
    thinking_started = False
    response_started = False

    for event in stream:
        if event.type == "content_block_start":
            print(f"\n--- Bắt đầu block {event.content_block.type} ---")
            thinking_started = False
            response_started = False
        elif event.type == "content_block_delta":
            if event.delta.type == "thinking_delta":
                if not thinking_started:
                    print("💭 Đang suy luận: ", end="", flush=True)
                    thinking_started = True
                print(event.delta.thinking, end="", flush=True)
            elif event.delta.type == "text_delta":
                if not response_started:
                    print("✅ Câu trả lời: ", end="", flush=True)
                    response_started = True
                print(event.delta.text, end="", flush=True)
        elif event.type == "content_block_stop":
            print("\n--- Block hoàn tất ---")

Extended Thinking với Tool Use

Extended Thinking hoạt động kết hợp với Tool Use, cho phép Claude suy luận qua việc lựa chọn tool và xử lý kết quả.

Giới hạn quan trọng khi dùng với Tool Use

  • Tool choice: Chỉ hỗ trợ tool_choice: {"type": "auto"} (mặc định) hoặc {"type": "none"}. Dùng {"type": "any"} hoặc ép buộc tool cụ thể sẽ gây lỗi.
  • Giữ nguyên thinking blocks: Phải truyền lại thinking blocks không thay đổi trong các vòng lặp tool use để đảm bảo liên tục suy luận.
weather_tool = {
    "name": "get_weather",
    "description": "Lấy thời tiết hiện tại cho một địa điểm",
    "input_schema": {
        "type": "object",
        "properties": {"location": {"type": "string", "description": "Tên thành phố"}},
        "required": ["location"],
    },
}

# Request đầu tiên — Claude suy luận và gọi tool
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=16000,
    thinking={"type": "enabled", "budget_tokens": 10000},
    tools=[weather_tool],
    messages=[{"role": "user", "content": "Thời tiết Hà Nội hôm nay thế nào?"}],
)

# Lấy thinking và tool_use blocks
thinking_block = next(
    (block for block in response.content if block.type == "thinking"), None
)
tool_use_block = next(
    (block for block in response.content if block.type == "tool_use"), None
)

# Giả lập gọi weather API
weather_data = {"nhiet_do": 28, "trang_thai": "Nắng nhẹ"}

# Request tiếp theo — PHẢI truyền lại thinking_block
continuation = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=16000,
    thinking={"type": "enabled", "budget_tokens": 10000},
    tools=[weather_tool],
    messages=[
        {"role": "user", "content": "Thời tiết Hà Nội hôm nay thế nào?"},
        # Bắt buộc phải truyền thinking_block cùng tool_use_block
        {"role": "assistant", "content": [thinking_block, tool_use_block]},
        {
            "role": "user",
            "content": [
                {
                    "type": "tool_result",
                    "tool_use_id": tool_use_block.id,
                    "content": f"Nhiệt độ: {weather_data['nhiet_do']}°C, {weather_data['trang_thai']}",
                }
            ],
        },
    ],
)

Interleaved Thinking — Suy luận giữa các Tool Call

Với Interleaved Thinking, Claude có thể suy luận giữa các tool call, cho phép lý giải kết quả trung gian trước khi quyết định bước tiếp theo:

Không có Interleaved Thinking:

User: "Tính tổng doanh thu từ 150 đơn hàng x 500k/đơn?"
Claude: [suy luận] "Tính 150 × 500k..." → [gọi calculator]
User: [kết quả: 75.000.000đ]
Claude: [gọi database_query] (không có suy luận thêm)
User: [kết quả DB]
Claude: [trả lời cuối] "Tổng doanh thu là 75 triệu đồng..."

Có Interleaved Thinking:

User: "Tính tổng doanh thu từ 150 đơn hàng x 500k/đơn?"
Claude: [suy luận] "Tính 150 × 500k..." → [gọi calculator]
User: [kết quả: 75.000.000đ]
Claude: [suy luận] "Được 75tr. Giờ cần kiểm tra DB để đối chiếu..." → [gọi database_query]
User: [kết quả DB: 72.000.000đ]
Claude: [suy luận] "75tr vs 72tr — có chênh lệch 4%, cần giải thích..."
         [trả lời] "Tổng doanh thu tính toán là 75 triệu, DB ghi nhận 72 triệu (chênh lệch 4%...)..."

Hỗ trợ Interleaved Thinking theo model:

  • Claude Opus 4.6: Tự động bật với adaptive thinking
  • Claude Sonnet 4.6: Tự động bật với adaptive thinking (khuyến nghị); manual mode với beta header interleaved-thinking-2025-05-14 đã deprecated
  • Các model Claude 4 khác: Thêm beta header interleaved-thinking-2025-05-14

Extended Thinking với Prompt Caching

Khi kết hợp Extended Thinking với Prompt Caching, có một số điểm quan trọng cần lưu ý:

  • Thinking blocks từ các turn trước bị xóa khỏi context (không chiếm context window), nhưng khi đọc từ cache trong tool use, chúng vẫn tính là input tokens.
  • Thay đổi thinking parameters (bật/tắt hoặc thay đổi budget) sẽ invalidate message cache breakpoints.
  • System prompt cache KHÔNG bị ảnh hưởng dù thay đổi thinking parameters.
import anthropic

client = anthropic.Anthropic()

# System prompt với cache — sẽ không bị invalidate khi đổi budget
system_prompt = [
    {
        "type": "text",
        "text": "Bạn là chuyên gia phân tích kinh doanh cho doanh nghiệp SME Việt Nam.",
    },
    {
        "type": "text",
        "text": "... [nội dung hướng dẫn dài]...",
        "cache_control": {"type": "ephemeral"}  # Cache system prompt
    },
]

# Request 1 — thiết lập cache
response1 = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=20000,
    thinking={"type": "enabled", "budget_tokens": 4000},
    system=system_prompt,
    messages=[{"role": "user", "content": "Phân tích thị trường bán lẻ online Việt Nam 2026?"}],
)

# Request 2 — đổi budget (system prompt vẫn cache, messages miss cache)
response2 = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=20000,
    thinking={"type": "enabled", "budget_tokens": 8000},  # Đổi budget
    system=system_prompt,  # Vẫn được cache
    messages=[
        {"role": "user", "content": "Phân tích thị trường bán lẻ online Việt Nam 2026?"},
        {"role": "assistant", "content": response1.content},
        {"role": "user", "content": "Đề xuất chiến lược cho SME trong lĩnh vực này?"},
    ],
)

Lưu ý về Zero Data Retention

Extended Thinking đủ điều kiện cho Zero Data Retention (ZDR). Khi tổ chức của bạn có thỏa thuận ZDR với Anthropic, dữ liệu sẽ không được lưu trữ sau khi API trả về response.

🚀 Khám phá thêm về Claude
Xem đầy đủ thông tin về Claude tại trang Claude Anthropic trên Agentwork.vn. Tìm hiểu thêm về Tool Use API để kết hợp với Extended Thinking trong quy trình agentic. Khám phá Prompt Engineering để tối ưu hóa kết quả với thinking. Xem thêm các nền tảng AI hàng đầu cho doanh nghiệp.
Chia se bai viet
ĐĐ

Đoàn Đình Tỉnh

admin

Bai viet lien quan

Chat ZaloGoi: 0911.000.000Chat Telegram