AI Engineer Master Course
Trang chủ / Module 5
🛠️ Module 5 / 17 · 3-4 tuần

Building AI Applications

OpenAI API, Claude API, Gemini API, Structured Outputs, Tool Calling, Streaming Responses.

OpenAIClaudeGeminiTool Calling
📌 Vì sao module này quan trọng

Đâ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
💡 Mẹo

Luôn định nghĩa schema bằng Pydantic một lần, dùng lại cho cả validate output 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.

⚠️ Lưu ý bảo mật

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

Trợ lý trích xuất hoá đơn đa nhà cung cấp

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

✅ 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