Giới thiệu
Một tác nhân AI thực sự hữu ích chỉ khi nó có thể vượt ra ngoài ngữ cảnh của chính nó. Gọi công cụ là cơ chế cho phép một mô hình ngôn ngữ quyết định nó cần truy xuất một hàng từ cơ sở dữ liệu, gọi API thời tiết, hoặc kích hoạt một hành động máy chủ, rồi nhận kết quả trở lại như một phần của bước suy luận tiếp theo. Trong bài học này chúng ta tập trung thiết kế vòng lặp đó sao cho đáng tin cậy trong một ứng dụng web.
Chúng ta sẽ coi một công cụ như một hàm thuần túy với ba yếu tố: một tên ổn định, một sơ đồ JSON mô tả tham số, và mô tả cho mô hình biết khi nào nên sử dụng nó. Mọi thứ khác chỉ là phần kết nối ở frontend và backend.
Kiến thức cơ bản về Sơ đồ Công cụ và Gọi Hàm
Hầu hết các API LLM hiện đại đều có cùng khuôn mẫu. Bạn truyền một mảng định nghĩa công cụ, mỗi công cụ chứa tên, mô tả, và sơ đồ tham số. Mô hình có thể phản hồi bằng một yêu cầu có cấu trúc để gọi một trong những công cụ đó, sau đó backend của bạn thực thi.
Đây là một khai báo công cụ tối thiểu theo phong cách được dùng trong OpenAI Python SDK. Sơ đồ là những gì mô hình thực sự đọc để quyết định những tham số cần tạo.
Chú ý ba lựa chọn thiết kế quan trọng. Thứ nhất, mô tả là một chỉ dẫn ngắn telling the model khi nào kích hoạt công cụ, được viết bằng giọng nói giống như prompt hệ thống của bạn. Thứ hai, tham số sử dụng JSON Schema chuẩn để các enum và các trường bắt buộc được xử lý. Thứ ba, các giá trị mặc định được loại trừ khỏi sơ đồ trừ khi bạn muốn mô hình nghĩ chúng là tùy chọn.
Kết nối Công cụ với Backend Ứng dụng Web
Trong một ứng dụng web thực tế, agent không chạy ngay trong trình duyệt. Trình duyệt gửi cuộc hội thoại đến backend của bạn, backend gọi LLM với danh sách công cụ, và khi mô hình trả về một cuộc gọi công cụ, máy chủ của bạn thực sự thực thi nó đối với các dịch vụ của chính bạn. Kết quả được gửi lại cho mô hình dưới dạng một tin nhắn công cụ, sau đó mô hình sinh ra câu trả lời cuối cùng.
Một handler FastAPI tối thiểu trông như thế này. Nó phát hiện một cuộc gọi công cụ trong phản hồi, chạy hàm Python tương ứng, và đưa đầu ra trở lại cuộc hội thoại.
Ví dụ phân phối (dispatch dictionary) là mẫu sạch nhất cho các dự án nhỏ. Đối với các hệ thống lớn hơn, bạn di chuyển việc đăng ký công cụ sang một đối tượng registry để có thể thêm công cụ mà không cần chỉnh sửa trình xử lý.
Mẫu Thiết kế Tham số
Hầu hết các lỗi công cụ xuất hiện từ thiết kế tham số kém, không phải từ mô hình. Hai mẫu sau giảm thiểu đáng kể vấn đề này.
Thứ nhất, ưu tiên tham số phẳng thay vì các đối tượng lồng nhau. Một công cụ nhận các trường vĩ độ và kinh độ riêng biệt sẽ dễ điền đúng cho mô hình hơn so với công cụ nhận một đối tượng vị trí lồng bên trong. Thứ hai, phản chiếu từ vựng mà người dùng thực sự sử dụng. Nếu người dùng nói mã bưu điện, hãy expose tham số có tên zip_code, không phải postal_code.
Ba tham số phẳng, một tham số bắt buộc, phần còn lại có giá trị mặc định hợp lý mà mô hình có thể để trống.
Các cạm bẫy phổ biến
Một vài sai lầm xuất hiện ở hầu hết các tích hợp. Mô hình tạo ra ảo tưởng về một tên công cụ không tồn tại, vì vậy luôn xác thực call.function.name với các công cụ đã đăng ký trước khi phân công. Mô hình truyền một chuỗi nơi hàm của bạn kỳ vọng một số nguyên, nên ép người dùng (coerce) các đối số dựa trên schema trước khi gọi. Và agent có thể rơi vào vòng lặp vô hạn các cuộc gọi công cụ vì cho rằng vẫn cần nhiều thông tin hơn, vì vậy giới hạn vòng lặp ở 3 đến 5 lần lặp và đưa ra câu trả lời dự phòng nếu nó không hội tụ.
Ghi log mọi cuộc gọi công cụ kèm đối số và kết quả là thói quen debug có tác động lớn nhất mà bạn có thể xây dựng. Khi có lỗi ở môi trường sản xuất, log này sẽ cho bạn thấy liệu mô hình có chọn sai công cụ, chọn đúng công cụ với đối số sai hay backend của bạn trả về một hình dạng bất ngờ hay không.
Tóm tắt
Gọi công cụ biến một chatbot thành một agent. Bạn định nghĩa công cụ dưới dạng JSON Schema, truyền chúng trên mỗi cuộc gọi LLM, thực thi mọi thứ mô hình yêu cầu trên backend của bạn và gửi kết quả trở lại như một tin nhắn công cụ. Thiết kế tham số tốt là phẳng, sử dụng từ vựng của người dùng và đánh dấu rõ ràng các trường bắt buộc. Luôn xác thực tên công cụ, giới hạn vòng lặp và log mọi thứ. Ở bài học tiếp theo chúng ta ghé thăm phân lớp lên kế hoạch và suy nghĩ nhiều bước lên trên vòng lặp này.
Bài kiểm tra cuối bài
Ôn lại kiến thức, thử sức và nhận góp ý cho bài làm.