Building AI Applications
OpenAI API, Claude API, Gemini API, Structured Outputs, Tool Calling, Streaming Responses.
Đây là kỹ năng "tay nghề" cốt lõi — biết gọi API model một cách chuyên nghiệp: xử lý lỗi, retry, structured output đáng tin cậy, tool calling để model tương tác với hệ thống thật, và streaming cho trải nghiệm người dùng tốt. Ba nhà cung cấp lớn (OpenAI, Anthropic, Google) có API tương tự nhau về khái niệm nhưng khác nhau về chi tiết — hiểu rõ cả ba giúp bạn không bị khoá vào một vendor.
🎯 Mục tiêu học tập
- Gọi thành thạo API của OpenAI, Claude (Anthropic), và Gemini (Google) cho cả chat và structured output
- Thiết kế structured output đáng tin cậy bằng JSON Schema / Pydantic thay vì parse text tự do
- Triển khai tool calling (function calling) để model gọi hàm thật trong hệ thống
- Xây dựng streaming response mượt mà cho trải nghiệm người dùng thời gian thực
Ba API lớn — điểm giống và khác
Cả ba nhà cung cấp đều xoay quanh khái niệm messages (role: system/user/assistant/tool)
nhưng khác nhau về chi tiết: Anthropic tách system thành tham số riêng thay vì nằm trong mảng
messages; Gemini gọi là contents/parts; OpenAI dùng Responses API (thế hệ mới,
thay thế dần Chat Completions) hỗ trợ built-in tools (web search, code interpreter, file search) tích hợp
sẵn phía server.
# OpenAI (Responses API)
from openai import OpenAI
client = OpenAI()
resp = client.responses.create(model="gpt-5", input="Tóm tắt đoạn văn sau...")
# Anthropic (Messages API)
from anthropic import Anthropic
client = Anthropic()
resp = client.messages.create(
model="claude-sonnet-5", max_tokens=1024,
system="Bạn là trợ lý tóm tắt văn bản kỹ thuật.",
messages=[{"role": "user", "content": "Tóm tắt đoạn văn sau..."}],
)
# Gemini
from google import genai
client = genai.Client()
resp = client.models.generate_content(model="gemini-2.5-pro", contents="Tóm tắt đoạn văn sau...")
Bài học thực tế: thiết kế một lớp abstraction mỏng (interface chung) bọc quanh cả 3 provider ngay từ đầu — giúp đổi model dễ dàng khi có bản mới tốt hơn/rẻ hơn ra mắt, điều xảy ra vài tháng một lần trong ngành này.
Structured Outputs — đáng tin cậy hơn parse text
Trước 2024, dev thường yêu cầu model "trả lời dạng JSON" trong prompt rồi tự parse — cách này hay lỗi (model thêm markdown code fence, thêm lời giải thích thừa). Ngày nay cả ba nhà cung cấp đều hỗ trợ structured output có ràng buộc schema thật ở tầng decode (constrained decoding) — model không thể sinh ra JSON sai schema.
from pydantic import BaseModel
class Invoice(BaseModel):
vendor: str
total_amount: float
line_items: list[str]
# OpenAI: response_format=Invoice (Pydantic parse helper)
# Anthropic: dùng tool calling với input_schema làm "output schema"
# Gemini: response_schema=Invoice trong GenerationConfig
Luôn định nghĩa schema bằng Pydantic một lần, dùng lại cho cả validate output và làm tài liệu API nội bộ — tránh lệch schema giữa các nơi.
Tool Calling (Function Calling)
Tool calling cho phép model "yêu cầu" gọi một hàm thật (tra cứu DB, gọi API thời tiết, tính toán) thay vì tự bịa kết quả. Luồng hoạt động: (1) bạn khai báo danh sách tool kèm JSON Schema tham số → (2) model quyết định có cần gọi tool không, trả về tên tool + tham số → (3) code của bạn thực thi tool thật → (4) gửi kết quả lại cho model → (5) model tổng hợp câu trả lời cuối cùng cho người dùng.
Không bao giờ để model tự do gọi tool có tác dụng phụ nguy hiểm (xoá dữ liệu, gửi tiền) mà không có bước xác nhận/giới hạn quyền — xem Module 10 (Production AI Systems).
Streaming Responses
Cả 3 SDK hỗ trợ streaming qua iterator/async iterator, sinh ra các "event" (text delta, tool-call delta, message stop). Khi kết hợp streaming với tool calling, cần xử lý cẩn thận: tool call phải được tích luỹ đầy đủ (các delta của tham số tool đến rời rạc) trước khi thực thi.
🏋️ Bài tập thực hành
Xây một service nhận ảnh/text hoá đơn, dùng structured output để trích xuất thành object Pydantic (vendor, ngày, tổng tiền, danh sách mặt hàng). Triển khai với ít nhất 2 trong 3 provider (OpenAI/Claude/Gemini) đứng sau cùng một interface, có thể chuyển đổi qua biến môi trường. Thêm 1 tool calling thật: tra cứu tỉ giá nếu hoá đơn không phải VND.
📚 Tài nguyên học tập
-
OpenAI — Function calling guideHướng dẫn tool calling chính thứcDocs
-
Anthropic — Tool useTool use với Claude APIDocs
-
Google — Structured outputStructured output với GeminiDocs
-
Pydantic — DocumentationValidate & định nghĩa schema dữ liệuDocs
✅ Tự đánh giá hoàn thành
- Gọi được cả 3 API (OpenAI/Claude/Gemini) cho cùng một tác vụ
- Thiết kế được 1 lớp abstraction chung để chuyển đổi provider dễ dàng
- Xây được structured output validate bằng Pydantic, không parse text thủ công
- Triển khai được ít nhất 1 tool calling thực thi hàm thật
- Xây được endpoint streaming trả kết quả dần cho client