Product Management
Đăng nhập
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Bài 1 — Vì sao cần Structured Outputs & Function Calling

Đã đọc 0/7 mục · còn khoảng 4 phút
Cách chúng tôi ghi nhận

Một mục được tính là đã đọc khi nó nằm giữa màn hình đủ lâu so với độ dài của nó (bảng và sơ đồ tính một nửa), bạn vẫn đang cuộn hoặc bấm phím, và bạn đã thấy tới cuối mục. Lướt nhanh hoặc để tab mở không được tính. Chúng tôi chỉ lưu thời gian đọc từng mục — không lưu gì khác.

Khi bạn để LLM trả về văn bản tự do rồi tự parse bằng regex, bạn đang xây nhà trên cát. Chỉ cần model thêm một câu "Chắc chắn rồi, đây là kết quả:" trước JSON, hoặc bọc trong khối ``json, là code parse của bạn vỡ. Structured Outputs và Function Calling ra đời để giải quyết đúng nỗi đau đó: biến output của LLM từ "một đoạn chữ hy vọng đúng" thành "một cấu trúc dữ liệu hợp đồng đảm bảo".

Phân biệt ba khái niệm hay bị lẫn

  • JSON mode: ép model trả về JSON hợp lệ về mặt cú pháp — nhưng KHÔNG đảm bảo đúng các trường bạn cần.
  • Structured Outputs (schema-constrained): ép model trả về JSON tuân thủ chính xác một JSON Schema bạn định nghĩa. Đây là mức đảm bảo cao nhất.
  • Function Calling / Tool Use: model KHÔNG tự thực thi hành động, mà trả về một "lời đề nghị gọi hàm" có tên tool + tham số đã được cấu trúc. Code của bạn mới là bên thực thi.
Điểm mấu chốt học viên hay hiểu sai: function calling không thực sự chạy hàm. Nó chỉ điền tham số. Vòng lặp "model đề nghị → bạn thực thi → trả kết quả về" mới là bản chất của agent.

Ví dụ cụ thể

Giả sử bạn xây bot đặt lịch hẹn. Yêu cầu: từ câu "Đặt cho tôi lịch với anh Minh 3h chiều mai" phải ra được dữ liệu máy dùng được.

{
  "action": "create_appointment",
  "attendee": "Minh",
  "datetime": "2026-06-28T15:00:00+07:00",
  "duration_minutes": 30
}

Nếu chỉ dùng prompt thường, model có thể trả "15h" hoặc "3 PM" hoặc quên timezone. Với structured output + schema ràng buộc datetime` là ISO 8601, bạn loại bỏ cả một lớp bug.

Các bước tư duy khi bắt đầu

  • Xác định ranh giới: cái gì LLM quyết định (chọn tool, điền tham số), cái gì code quyết định (thực thi, xác thực quyền, ghi DB).
  • Định nghĩa hợp đồng dữ liệu trước: viết JSON Schema mô tả output MONG MUỐN trước khi viết prompt.
  • Chọn cơ chế: cần dữ liệu có cấu trúc thuần → Structured Output; cần model chọn hành động → Function Calling.
  • Luôn có tầng validate: dù model hứa đúng schema, code bạn vẫn phải kiểm tra lại (không tin tuyệt đối).
  • Thiết kế vòng lặp: nếu là agent, chuẩn bị sẵn cơ chế trả kết quả tool về cho model.

Khung tư duy: "LLM là bộ định tuyến, không phải bộ thực thi"

Hãy luôn hình dung LLM như tổng đài viên thông minh: nó nghe yêu cầu, chọn đúng phòng ban (tool) và điền đúng phiếu (tham số), rồi chuyển cho nhân viên (code của bạn) xử lý. Tổng đài viên không tự vào kho lấy hàng.

Checklist khởi động dự án

  • [ ] Đã liệt kê các "hành động" hệ thống cần LLM chọn?
  • [ ] Đã có schema cho từng loại output?
  • [ ] Đã tách rõ quyền: model đề xuất, code phê duyệt & thực thi?
  • [ ] Đã có plan cho trường hợp model trả sai/thiếu?

Sai lầm thường gặp

  • Tin rằng JSON mode = đúng schema. JSON mode chỉ đảm bảo cú pháp; thiếu trường vẫn hợp lệ JSON. Phải dùng schema-constrained mới ràng buộc được trường.
  • Để model tự thực thi hành động nhạy cảm. Không bao giờ cho phép output của model trực tiếp xóa DB hay chuyển tiền mà không qua tầng code kiểm soát.
  • Bỏ qua validate vì "model xịn rồi". Model có thể bị prompt injection hoặc lỗi biên; validate là lá chắn cuối.
  • Viết prompt trước, nghĩ schema sau. Ngược quy trình khiến schema bị bóp méo theo thói quen ngôn ngữ của model thay vì theo nhu cầu hệ thống.
Kết thúc bài này, bạn cần nắm: structured output đảm bảo hình dạng dữ liệu, function calling đảm bảo lựa chọn hành động có tham số — và bạn luôn là người thực thi cuối cùng. Các bài sau sẽ đi sâu vào cách viết schema chặt, validate, gọi song song và ghép chuỗi tool.

Học xong bài này rồi? Tạo tài khoản miễn phí để lưu lại — lần sau vào là biết ngay đang dở ở đâu, và học hết khóa thì có chứng chỉ. Lưu tiến độ của tôi