DeepSeek đã đưa V4 Pro ra khỏi giai đoạn xem trước vào ngày 12 tháng 8 năm 2026, và phạm vi đưa tin ra mắt tập trung vào các quy trình làm việc tự động (agentic workflows): lập trình, sử dụng công cụ và các tác vụ dài hạn liên kết hàng chục bước mà không làm mất đi mạch lạc. Định vị này khiến một tính năng API trở nên quan trọng hơn bất kỳ tính năng nào khác, đó là function calling, và đây là tính năng mà các hướng dẫn tuần ra mắt chưa đề cập. Mọi hướng dẫn cho đến nay đều dừng lại ở chat completions.
Hướng dẫn này sẽ đi xa hơn: định nghĩa một tool schema, thực hiện lệnh gọi công cụ đầu tiên của bạn bằng SDK `openai` tiêu chuẩn của Python, xây dựng vòng lặp tác nhân hoàn chỉnh, sau đó kiểm tra toàn bộ quá trình trong Apidog trước khi tác nhân của bạn được triển khai. Nếu bạn chưa có khóa API DeepSeek, hãy thiết lập một khóa với hướng dẫn của chúng tôi về cách sử dụng API DeepSeek V4, sau đó quay lại đây.
Tóm gọn
- `deepseek-v4-pro` (bản GA DeepSeek-V4-Pro-0813) hỗ trợ chức năng gọi hàm kiểu OpenAI: gửi một mảng `tools`, nhận về `tool_calls`, trả về kết quả dưới dạng tin nhắn `tool`. SDK `openai` tiêu chuẩn hoạt động với `https://api.deepseek.com`.
- Vòng lặp tác nhân đầy đủ khoảng 30 dòng Python: gọi, thực thi, thêm vào, lặp lại cho đến khi mô hình ngừng yêu cầu công cụ. Các lệnh gọi song song và đầu ra có cấu trúc được hỗ trợ; chế độ tư duy bổ sung `reasoning_content`.
- Tính năng lưu trữ tiền tố tự động định giá đầu vào được truy cập từ bộ nhớ đệm là 0,003625 USD cho mỗi triệu token, rẻ hơn 120 lần so với khi bỏ lỡ. Đó là điều giúp các vòng lặp tác nhân sâu trở nên phải chăng.
- Chất lượng gọi công cụ thay đổi tùy theo harness và schema của bạn. Hãy thử nghiệm các công cụ thực tế của bạn với mô hình trực tiếp, chứ không phải các điểm chuẩn.
Tại sao gọi công cụ là trường hợp sử dụng nổi bật của V4 Pro
DeepSeek đã xây dựng V4 Pro cho các tác nhân, và bảng thông số kỹ thuật giống như một danh sách kiểm tra môi trường chạy tác nhân:
| Thông số | DeepSeek V4 Pro |
|---|---|
| Kiến trúc | Sparse MoE: 1.6T tổng tham số, 49B hoạt động mỗi token |
| Cửa sổ ngữ cảnh | 1M token |
| Đầu ra tối đa | 384K token |
| Giá đầu vào | 0,435 USD/M token (truy cập bộ đệm thất bại), 0,003625 USD/M (truy cập bộ đệm thành công) |
| Giá đầu ra | 0,87 USD/M token |
| Gọi hàm | Mảng `tools` và phản hồi `tool_calls` tương thích OpenAI |
| Các giao diện khác | Định dạng tin nhắn Anthropic, API Phản hồi DeepSeek |
Mỗi dòng đều liên quan đến một vấn đề của tác nhân: cửa sổ ngữ cảnh 1 triệu token chứa toàn bộ lịch sử kết quả công cụ của tác nhân dài, giới hạn đầu ra 384K cho phép không gian cho các tải trọng có cấu trúc lớn, và tính năng lưu trữ tiền tố giúp vòng lặp hoạt động hiệu quả về kinh tế. Mô hình này được liệt kê trên OpenRouter là deepseek-v4-pro-0813 để so sánh giữa các nhà cung cấp.
Một lưu ý trước khi đi vào phần mã. Trong cuộc thảo luận ra mắt trên Hacker News, các nhà phát triển đã báo cáo rằng hiệu suất gọi công cụ rất nhạy cảm với harness: cùng một mô hình có thể hoạt động tốt hơn hoặc kém hơn tùy thuộc vào framework, cách xây dựng prompt và kiểu schema. Các điểm chuẩn sẽ không cho bạn biết cách nó xử lý các tool schema của bạn. Hãy thử nghiệm với các định nghĩa thực tế của bạn.
Cách hoạt động của tính năng gọi hàm của DeepSeek
Gọi hàm không có nghĩa là mô hình thực thi bất cứ điều gì. Nó phản hồi bằng một yêu cầu có cấu trúc, “gọi `get_order` với `{"order_id": "ORD-10442"}`”, thay vì văn xuôi. Mã của bạn chạy hàm, trả về kết quả và mô hình tiếp tục với dữ liệu thực. Chu trình:
- Bạn gửi `messages` cùng với một mảng `tools` mô tả mỗi hàm trong JSON Schema.
- Mô hình quyết định cần một công cụ và phản hồi với `tool_calls` và `finish_reason: "tool_calls"`.
- Mã của bạn phân tích các đối số và chạy hàm thực tế.
- Bạn thêm kết quả dưới dạng tin nhắn `role: "tool"` được liên kết với ID của lệnh gọi.
- Mô hình hoặc yêu cầu một công cụ khác hoặc đưa ra câu trả lời cuối cùng.
Nếu bạn đã từng làm việc với tính năng gọi hàm của OpenAI, đây là cùng một định dạng giao tiếp; hầu hết mã tác nhân có thể chuyển đổi bằng cách thay đổi URL cơ sở và tên mô hình. Tài liệu chính thức của DeepSeek cũng đề cập đến một điểm cuối tin nhắn tương thích với Anthropic và một API Phản hồi, nhưng hướng dẫn này sẽ tập trung vào giao diện tương thích với OpenAI.
Bước 1: Thiết lập client
Cài đặt SDK và trỏ nó vào DeepSeek:
pip install openai
export DEEPSEEK_API_KEY="sk-..."
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["DEEPSEEK_API_KEY"],
base_url="https://api.deepseek.com",
)
Đó là toàn bộ quá trình thiết lập. Mọi ví dụ đều sử dụng `model="deepseek-v4-pro"`, được giải quyết thành bản dựng GA DeepSeek-V4-Pro-0813.
Bước 2: Định nghĩa một tool schema
Chúng ta sẽ xây dựng một tác nhân hỗ trợ cho một cửa hàng trực tuyến. Công cụ đầu tiên của nó sẽ tra cứu các đơn hàng. Một định nghĩa công cụ có ba phần: tên, mô tả và JSON Schema cho các tham số.
tools = [
{
"type": "function",
"function": {
"name": "get_order",
"description": (
"Tra cứu đơn hàng của khách hàng bằng ID của nó. Trả về trạng thái đơn hàng, "
"nhà vận chuyển, số theo dõi và ngày giao hàng ước tính. Sử dụng chức năng này "
"bất cứ khi nào người dùng hỏi đơn hàng ở đâu hoặc trạng thái của nó như thế nào."
),
"parameters": {
"type": "object",
"properties": {
"order_id": {
"type": "string",
"description": "ID đơn hàng, định dạng như 'ORD-10442'.",
}
},
"required": ["order_id"],
},
},
}
]
Mô tả không phải là phần trang trí: mô hình quyết định khi nào gọi một công cụ bằng cách đọc nó. Các mô tả mơ hồ là lý do hàng đầu khiến mô hình bỏ qua một công cụ hoặc chọn sai công cụ.
Hàm cục bộ mà schema mô tả, được tạo sẵn thay cho một dịch vụ đặt hàng thực tế:
def get_order(order_id: str) -> dict:
"""Stub cho dịch vụ đặt hàng thực tế của bạn."""
fake_db = {
"ORD-10442": {
"status": "shipped",
"carrier": "DHL",
"tracking_number": "4281337005",
"estimated_delivery": "2026-08-15",
},
"ORD-10587": {
"status": "processing",
"estimated_ship_date": "2026-08-14",
},
}
return fake_db.get(order_id, {"error": f"Unknown order ID: {order_id}"})
Bước 3: Thực hiện lệnh gọi công cụ đầu tiên của bạn
Gửi một câu hỏi mà mô hình không thể trả lời nếu không có công cụ:
messages = [
{"role": "system", "content": "Bạn là một tác nhân hỗ trợ cho một cửa hàng trực tuyến."},
{"role": "user", "content": "Đơn hàng ORD-10442 của tôi ở đâu?"},
]
response = client.chat.completions.create(
model="deepseek-v4-pro",
messages=messages,
tools=tools,
)
message = response.choices[0].message
print(message.tool_calls[0].function.name) # get_order
print(message.tool_calls[0].function.arguments) # {"order_id": "ORD-10442"}
Thay vì trả lời, mô hình yêu cầu bạn chạy `get_order`. Payload phản hồi thô trông như thế này:
{
"id": "chatcmpl-8f3a1c",
"object": "chat.completion",
"model": "deepseek-v4-pro",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "",
"tool_calls": [
{
"id": "call_0_f1c29a44",
"type": "function",
"function": {
"name": "get_order",
"arguments": "{\"order_id\": \"ORD-10442\"}"
}
}
]
},
"finish_reason": "tool_calls"
}
],
"usage": {
"prompt_tokens": 312,
"completion_tokens": 24,
"total_tokens": 336,
"prompt_cache_hit_tokens": 0,
"prompt_cache_miss_tokens": 312
}
}
Ba chi tiết quan trọng. `finish_reason` là `"tool_calls"`, cho biết vòng lặp của bạn rằng mô hình muốn thực thi. Mỗi lệnh gọi mang một `id` mà bạn phải trả về cùng với kết quả. Và `arguments` là một chuỗi JSON mà bạn phải tự phân tích cú pháp, vì vậy hãy dự kiến đôi khi nó có thể bị định dạng sai.
Bước 4: Thực thi hàm và trả về kết quả
Chạy hàm, sau đó thêm hai tin nhắn: lượt phản hồi của trợ lý chứa `tool_calls`, và một tin nhắn `tool` mang kết quả của bạn.
import json
tool_call = message.tool_calls[0]
args = json.loads(tool_call.function.arguments)
result = get_order(args)
messages.append(message) # lượt phản hồi của trợ lý chứa tool_calls
messages.append({
"role": "tool",
"tool_call_id": tool_call.id, # phải khớp với id từ phản hồi
"content": json.dumps(result),
})
final = client.chat.completions.create(
model="deepseek-v4-pro",
messages=messages,
tools=tools,
)
print(final.choices[0].message.content)
# Đơn hàng ORD-10442 của bạn đã được vận chuyển bằng DHL và dự kiến đến nơi
# vào ngày 15 tháng 8 năm 2026. Số theo dõi: 4281337005.
Liên kết `tool_call_id` rất nghiêm ngặt: mỗi mục `tool_calls` cần một tin nhắn `tool` phù hợp trước lượt phản hồi tiếp theo của mô hình, nếu không yêu cầu sẽ thất bại.
Bước 5: Vòng lặp tác nhân hoàn chỉnh
Các tác nhân thực tế liên kết các lệnh gọi: tra cứu đơn hàng, kiểm tra chính sách hoàn tiền, soạn email, mỗi bước phụ thuộc vào bước trước đó. Mẫu hình: tiếp tục gọi mô hình và thực thi bất cứ điều gì nó yêu cầu cho đến khi nó trả về một câu trả lời bình thường.
TOOLS_BY_NAME = {"get_order": get_order}
def run_agent(client, messages, tools, max_rounds=10):
"""Chạy mô hình cho đến khi nó tạo ra câu trả lời cuối cùng hoặc đạt giới hạn."""
for _ in range(max_rounds):
response = client.chat.completions.create(
model="deepseek-v4-pro",
messages=messages,
tools=tools,
)
message = response.choices[0].message
messages.append(message)
if not message.tool_calls: # không có yêu cầu công cụ: chúng ta đã hoàn thành
return message.content
for tool_call in message.tool_calls:
fn = TOOLS_BY_NAME.get(tool_call.function.name)
try:
if fn is None:
raise ValueError(f"Unknown tool: {tool_call.function.name}")
args = json.loads(tool_call.function.arguments)
result = fn(args)
except Exception as exc:
result = {"error": str(exc)} # đưa lỗi trở lại mô hình
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": json.dumps(result),
})
raise RuntimeError(f"Tác nhân không hoàn thành trong vòng {max_rounds} lượt")
Các framework và SDK tác nhân là những phần mở rộng của vòng lặp này. Giới hạn `max_rounds` chuyển đổi một mô hình bị kẹt khi gọi lại một công cụ thất bại thành một lỗi rõ ràng thay vì một hóa đơn không giới hạn.
Các lệnh gọi công cụ song song
Yêu cầu hai tra cứu, “so sánh trạng thái của ORD-10442 và ORD-10587”, và V4 Pro thường sẽ gộp cả hai vào một lượt:
"tool_calls": [
{
"id": "call_0_a7d1",
"type": "function",
"function": { "name": "get_order", "arguments": "{\"order_id\": \"ORD-10442\"}" }
},
{
"id": "call_1_b3e9",
"type": "function",
"function": { "name": "get_order", "arguments": "{\"order_id\": \"ORD-10587\"}" }
}
]
Vòng lặp `run_agent` đã xử lý điều này: vòng lặp `for` bên trong trả lời mỗi lệnh gọi với `tool_call_id` riêng (mỗi lệnh gọi cần một kết quả phù hợp trước lượt tiếp theo), và bạn có thể tự do thực thi lô này một cách đồng thời. Đây là một triết lý khác so với tính năng gọi công cụ có lập trình của GPT-5.6, nơi mô hình viết mã điều phối trong một sandbox; DeepSeek giữ việc thực thi và ranh giới tin cậy trong môi trường runtime của bạn.
Chế độ tư duy và công cụ
V4 Pro đi kèm với ba chế độ tư duy, vì vậy bạn có thể tăng cường nỗ lực suy luận cho các lượt lập kế hoạch khó và bỏ qua nó cho các tra cứu thông thường (xem tài liệu chính thức để biết tên chế độ và cài đặt mặc định). Khi chế độ tư duy được bật, API trả về dấu vết của mô hình dưới dạng `reasoning_content` cùng với bất kỳ lệnh gọi công cụ nào:
response = client.chat.completions.create(
model="deepseek-v4-pro",
messages=messages,
tools=tools,
extra_body={"thinking": {"type": "enabled"}},
)
message = response.choices[0].message
print(message.reasoning_content) # dấu vết lập kế hoạch
print(message.tool_calls) # các lệnh gọi mà nó đã quyết định
Dấu vết cho thấy lý do mô hình chọn một công cụ, đây thường là nơi một schema tồi tự bộc lộ. Hãy loại bỏ `reasoning_content` trước khi thêm lượt phản hồi của trợ lý vào lịch sử, và dành chế độ tư duy cho các lượt nặng về lập kế hoạch, vì phí suy luận được tính là đầu ra ở mức 0,87 USD/M.
Xử lý lỗi: khi mô hình thực hiện lệnh gọi sai
Các lệnh gọi công cụ bị định dạng sai hiếm khi xảy ra, nhưng một vòng lặp tác nhân sẽ khuếch đại mọi chế độ lỗi. Mẫu hình thiết yếu: không bao giờ gặp sự cố khi có lệnh gọi lỗi, trả về vấn đề như kết quả công cụ và để mô hình thử lại. Điều này bao gồm các đối số không thể `json.loads` cũng như các giá trị vi phạm quy tắc kinh doanh của bạn:
from jsonschema import ValidationError, validate
schema = tools[0]["function"]["parameters"]
try:
args = json.loads(tool_call.function.arguments)
validate(instance=args, schema=schema)
result = get_order(**args)
except (json.JSONDecodeError, ValidationError) as exc:
result = {
"error": f"Các đối số không hợp lệ: {exc}",
"hint": "Gọi lại get_order với một chuỗi order_id như 'ORD-10442'.",
}
Trường `hint` rất quan trọng: một chỉnh sửa một dòng thường tạo ra một lần thử lại đã được sửa trong vòng tiếp theo. Hãy coi lỗi tác nhân như các sự kiện bảo mật. Một mô hình bị thuyết phục gọi `delete_order` với các đối số do kẻ tấn công cung cấp chỉ nguy hiểm như khóa đằng sau nó, đây là lý do cho các khóa API với quyền hạn tối thiểu cho các tác nhân AI. Giới hạn phạm vi thông tin xác thực để một lệnh gọi sai không thể trở thành một sự cố.
Kiểm tra và gỡ lỗi các lệnh gọi công cụ với Apidog trước khi triển khai
Mỗi công cụ là một lớp vỏ mỏng bao quanh một API, và mô hình giờ đây là một người tiêu dùng của API đó. Nếu điểm cuối hỗ trợ không rõ ràng hoặc không ổn định, mô hình sẽ thừa hưởng tất cả những vấn đề đó. Đây là nơi Apidog phát huy vai trò của nó trong vòng lặp:
- Thiết kế API hỗ trợ trước. Định nghĩa `GET /orders/{order_id}` như một spec trong trình thiết kế trực quan của Apidog; JSON Schema của công cụ của bạn sẽ được tạo ra trực tiếp từ spec, do đó hai thứ này không thể tự động lệch nhau.
- Mô phỏng nó trước khi backend tồn tại. Tính năng mock thông minh của Apidog cung cấp các phản hồi thực tế từ schema, vì vậy vòng lặp tác nhân chạy với `get_order` trong khi dịch vụ thực vẫn đang được xây dựng.
- Kiểm tra các payload thô. Gửi cùng một nội dung `messages` + `tools` đến `https://api.deepseek.com` từ Apidog và đọc trực tiếp JSON `tool_calls` thô, các `properties` bị lồng sai hoặc các đối số được mã hóa hai lần sẽ hiện rõ chỉ trong một lần kiểm tra.
- Biến các cuộc hội thoại thành các kịch bản kiểm thử. Khẳng định `finish_reason` và hình dạng đối số, và chạy bộ kiểm thử trên mỗi thay đổi schema; với độ nhạy của harness được báo cáo trên Hacker News, một bộ kiểm thử hồi quy trên các schema thực của bạn là điểm chuẩn dự đoán môi trường sản xuất. Xem cách tích hợp tác nhân AI vào harness kiểm thử Apidog để biết một mẫu sâu hơn.
Tải Apidog miễn phí để làm theo; máy chủ mock và các kịch bản kiểm thử được bao gồm trong gói miễn phí.
Chi phí của các vòng lặp tác nhân (và tại sao việc lưu trữ quyết định điều đó)
Các vòng lặp tác nhân đọc lại toàn bộ cuộc hội thoại mỗi vòng: đến vòng thứ mười, prompt hệ thống, schema công cụ và kết quả của chín vòng trước đó đều được tính phí lần thứ mười. Tính năng lưu trữ tiền tố tự động của V4 Pro phá vỡ đường cong đó, đầu vào của mỗi vòng là đầu vào của vòng trước cộng thêm một chút, vì vậy gần như toàn bộ tiền tố được tính phí ở mức 0,003625 USD/M thay vì 0,435 USD/M. Đọc lại một cuộc hội thoại 100K token tốn khoảng 0,0435 USD nếu không được lưu trữ nhưng chỉ khoảng 0,0004 USD nếu được lưu trữ; `prompt_cache_hit_tokens` trong khối sử dụng hiển thị tỷ lệ truy cập thực tế của bạn.
Để giữ tỷ lệ đó cao, không bao giờ thay đổi các tin nhắn trước đó, và giữ mảng `tools` ổn định về byte qua các vòng. Bài giới thiệu của chúng tôi về prompt caching là gì sẽ đề cập đến cơ chế này. Và nếu `deepseek-v4-flash` với giá 0,14 USD/0,28 USD trông hấp dẫn: nó tốt cho việc định tuyến công cụ một lần, nhưng nó hoạt động kém hiệu quả với các vòng lặp liên kết hơn 10 lệnh gọi, vì vậy các lần thử lại sẽ làm mất đi khoản tiết kiệm, Pro là lựa chọn mặc định an toàn hơn cho các tác nhân.
Câu hỏi thường gặp
Các định nghĩa công cụ có tốn token không?
Có, mảng `tools` là đầu vào trong mỗi yêu cầu. Giữ nó ổn định và nó sẽ tham gia vào tiền tố được lưu trữ sau vòng đầu tiên, được tính phí theo tỷ lệ truy cập bộ đệm từ đó trở đi.
Tôi có thể kết hợp gọi hàm với đầu ra có cấu trúc không?
Có. Một mẫu hình phổ biến: các công cụ lấy dữ liệu trung gian, một schema đầu ra có cấu trúc định dạng câu trả lời cuối cùng, vì vậy mã hạ nguồn không bao giờ phải phân tích cú pháp văn xuôi.
Tổng kết
Việc triển khai gọi hàm trên DeepSeek V4 Pro được thiết kế để không quá phức tạp: các schema tương thích OpenAI, một mảng `tool_calls`, một tin nhắn `tool` có ID. Vòng lặp trong Bước 5 là toàn bộ kiến trúc, và giá tính theo lượt truy cập bộ đệm làm cho nó rẻ hơn hầu hết các nhóm dự kiến. Điều mà các điểm chuẩn không thể cho bạn biết là cách mô hình hoạt động với các schema của bạn, hãy thiết kế các API hỗ trợ một cách cẩn thận, mô phỏng chúng sớm và duy trì một bộ kiểm thử hồi quy các kịch bản gọi công cụ trong Apidog để các thay đổi schema không thể âm thầm làm hỏng tác nhân của bạn.
