Hướng dẫn: Function calling (gọi công cụ) với LLM từ con số 0, ví dụ chatbot tra cứu đơn hàng
Function calling (hay tool use) là cách để LLM không chỉ trả lời bằng chữ mà còn "gọi" được các hàm trong hệ thống của bạn: tra đơn hàng, đặt lịch, tính phí vận chuyển. Đây là nền tảng của mọi AI agent. Bài này giải thích từ đầu với ví dụ chatbot tra cứu đơn hàng. 1. HIỂU ĐÚNG BẢN CHẤT LLM không tự chạy code. Quy trình thực tế là: - Bạn gửi câu hỏi của người dùng kèm danh sách công cụ (tên, mô tả, tham số dạng JSON Schema). - Model trả về: "tôi muốn gọi công cụ tradonhang với tham số madon = DH1234". - Code của bạn chạy hàm thật, lấy kết quả. - Bạn gửi kết quả lại cho model, model viết câu trả lời cuối cùng cho người dùng. Model chỉ quyết định gọi gì, còn quyền thực thi luôn nằm trong tay code của bạn. 2. ĐỊNH NGHĨA CÔNG CỤ Ví dụ công cụ tra đơn hàng: - Tên: tradonhang - Mô tả: "Tra cứu trạng thái, ngày giao dự kiến và đơn vị vận chuyển của một đơn hàng theo mã đơn. Mã đơn có dạng DH + 4 chữ số." - Tham số: madon (chuỗi, bắt buộc). Mô tả là phần quan trọng nhất: model dựa vào đó để quyết định khi nào gọi và điền tham số thế nào. Hãy viết như đang giải thích cho một nhân viên mới. 3. VÒNG LẶP XỬ LÝ Code xử lý chuẩn có dạng: - Gửi tin nhắn + danh sách công cụ cho model. - Nếu model trả lời bằng chữ: xong, hiển thị cho người dùng. - Nếu model yêu cầu gọi công cụ: kiểm tra tham số, chạy hàm, thêm kết quả vào lịch sử hội thoại, gửi lại cho model. - Lặp lại, nhưng đặt giới hạn số vòng (ví dụ tối đa 5) để tránh lặp vô hạn. 4. KIỂM TRA THAM SỐ (KHÔNG ĐƯỢC BỎ QUA) Luôn coi tham số do model điền là dữ liệu không đáng tin, giống dữ liệu người dùng nhập: - Kiểm tra định dạng (mã đơn đúng mẫu DH + 4 số). - Kiểm tra quyền: người đang chat có phải chủ đơn hàng không? Lấy danh tính từ phiên đăng nhập, không lấy từ những gì model hay người dùng nói. - Lỗi thì trả về thông báo lỗi rõ ràng cho model ("Không tìm thấy đơn DH9999"), model sẽ tự hỏi lại người dùng. 5. CÔNG CỤ CÓ TÁC DỤNG PHỤ Với công cụ thay đổi dữ liệu (huỷ đơn, đổi địa chỉ): - Bắt model tóm tắt và hỏi người dùng xác nhận trước. - Tốt hơn nữa: code của bạn tự hiển thị nút xác nhận, không phụ thuộc vào việc model có nhớ hỏi hay không. 6. MẸO THỰC TẾ - Ít công cụ, mỗi công cụ một việc rõ ràng. Trên 15–20 công cụ thì model bắt đầu chọn nhầm. - Tên tham số rõ nghĩa, có ví dụ trong mô tả. - Trả kết quả công cụ gọn gàng, chỉ những trường cần thiết, đừng đổ nguyên bản ghi database vào. - Ghi log mọi lần gọi công cụ (tên, tham số, kết quả, thời gian) để debug. - Viết bộ test với các câu hỏi khó: hỏi đơn của người khác, mã đơn sai định dạng, hỏi hai đơn cùng lúc. Hầu hết các nhà cung cấp LLM lớn và các model open-weight mới đều hỗ trợ function calling với cú pháp tương tự nhau, nên học một lần là áp dụng được khắp nơi. Ai cần đoạn code mẫu Python cho vòng lặp ở bước 3 thì bình luận nhé.