AILapTrinh.comAI Lập Trình
Đưa tính năng AI vào sản phẩm

Function calling là gì: cho mô hình gọi hàm của ứng dụng mà vẫn giữ quyền kiểm soát

Giải thích gọi công cụ (function calling, tool use): vòng lặp một lượt, cách mô tả công cụ, kiểm quyền trong hàm, tách đọc với ghi và giới hạn số vòng gọi.

Logistics desk in a Dong Nai warehouse office, a clerk seen from behind holding a parcel near a laptop with a blank screen, forklifts softly blurred in the background

Gọi công cụ (function calling, có hãng gọi là tool use) là cơ chế để mô hình ngôn ngữ yêu cầu ứng dụng của bạn chạy một hàm do bạn định nghĩa, ví dụ tra trạng thái đơn hàng, rồi dùng kết quả để trả lời người dùng. Mô hình không tự chạy mã và không chạm vào cơ sở dữ liệu của bạn: nó chỉ trả về tên hàm và tham số mong muốn. Mã của bạn quyết định có chạy hay không, chạy với quyền gì, và gửi kết quả lại.

Hiểu đúng điểm này là hiểu được cả an toàn lẫn cách thiết kế. Bài viết giải thích vòng lặp một lượt gọi công cụ, cách mô tả công cụ để mô hình chọn đúng, cách kiểm quyền ngay trong hàm, cách tách thao tác đọc với thao tác ghi, kèm ví dụ giả định một trợ lý tra đơn hàng cho cửa hàng online.

Mô hình không chạy hàm, mã của bạn chạy

Hình dung trợ lý chăm sóc khách hàng được hỏi “đơn của mình tới đâu rồi”. Bản thân mô hình không biết đơn đó, vì dữ liệu nằm trong cơ sở dữ liệu của bạn. Với gọi công cụ, bạn gửi kèm câu hỏi một danh sách công cụ có mô tả, chẳng hạn công cụ tra_don_hang nhận một mã đơn. Mô hình đọc câu hỏi, thấy cần tra, và thay vì trả lời bằng chữ, nó trả về một khối có cấu trúc nói rằng muốn gọi tra_don_hang với mã đơn lấy từ tin nhắn.

Tới đây quyền quyết định thuộc về máy chủ của bạn. Mã nhận khối đó, kiểm tham số, kiểm người đang hỏi có quyền xem đơn này không, chạy truy vấn, rồi gửi kết quả trở lại cho mô hình trong lần gọi tiếp theo. Mô hình đọc kết quả và viết câu trả lời bằng ngôn ngữ tự nhiên cho khách. Nếu khách chưa đưa mã đơn, mô hình có thể hỏi lại thay vì gọi công cụ.

Cách tách vai này có hai hệ quả. Một là mọi biện pháp an toàn phải nằm trong mã của bạn, không nằm trong câu lệnh, vì mô hình có thể bị người dùng dẫn dắt đưa ra tham số bất kỳ. Hai là chất lượng phụ thuộc rất nhiều vào cách bạn mô tả công cụ, vì mô tả là thứ duy nhất mô hình dựa vào để chọn gọi gì và điền gì.

Vòng lặp một lượt gọi công cụ, từng bước

Chi tiết định dạng mỗi hãng một khác, nhưng vòng lặp chung giống nhau. Tên trường cụ thể bạn tra trong tài liệu chính thức của nhà cung cấp.

  1. Máy chủ gửi cho mô hình: câu lệnh hệ thống, tin nhắn người dùng, và danh sách công cụ, mỗi công cụ có tên, mô tả, lược đồ tham số.
  2. Mô hình trả về một trong hai: câu trả lời bằng chữ, hoặc một hay nhiều yêu cầu gọi công cụ kèm tham số.
  3. Nếu là yêu cầu gọi công cụ, máy chủ kiểm tên công cụ có trong danh sách cho phép, kiểm tham số theo lược đồ, kiểm quyền của người dùng hiện tại.
  4. Máy chủ chạy hàm thật, gói kết quả, kể cả lỗi, thành một tin nhắn kết quả công cụ có gắn mã định danh của yêu cầu gọi tương ứng.
  5. Máy chủ gọi mô hình lần nữa với toàn bộ lịch sử: tin nhắn gốc, yêu cầu gọi công cụ, kết quả công cụ.
  6. Mô hình hoặc trả lời bằng chữ, hoặc yêu cầu gọi thêm công cụ khác. Lặp lại từ bước ba cho tới khi có câu trả lời hoặc chạm giới hạn số vòng.

Điểm hay bị bỏ qua là bước sáu: một câu hỏi có thể kéo theo nhiều vòng gọi. Không đặt giới hạn, một mô hình lúng túng có thể gọi đi gọi lại cùng công cụ, mỗi vòng là một lần tính phí và thêm độ trễ. Giới hạn ba đến năm vòng là đủ cho phần lớn trợ lý trong sản phẩm.

Mô tả công cụ để mô hình chọn đúng và điền đúng

Tên là động từ cụ thể. tra_don_hang, huy_don_hang, tim_san_pham dễ chọn đúng hơn xu_ly hay api_don. Mỗi công cụ làm một việc.

Mô tả nói khi nào dùng và khi nào không. Ví dụ: “Tra trạng thái giao hàng của một đơn theo mã đơn. Dùng khi khách hỏi đơn đang ở đâu hay bao giờ tới. Không dùng để tìm sản phẩm.” Câu “không dùng khi” giảm hẳn chuyện chọn nhầm giữa hai công cụ gần nhau.

Tham số có kiểu, có định dạng, có ví dụ. Mã đơn có dạng thế nào thì ghi rõ trong mô tả tham số. Tham số nào bắt buộc thì khai bắt buộc; mô hình sẽ hỏi lại người dùng khi thiếu thay vì bịa.

Ít công cụ thì chọn chính xác hơn. Đưa ba mươi công cụ vào một lần gọi làm mô hình dễ chọn nhầm và tốn token đầu vào. Chỉ đưa những công cụ hợp với ngữ cảnh hiện tại; trang hỗ trợ đơn hàng không cần công cụ quản lý kho.

Kết quả trả về gọn và có nghĩa. Trả về những trường mô hình cần để trả lời, không trả nguyên bản ghi năm mươi cột. Lỗi cũng trả bằng thông điệp rõ, như khong_tim_thay_don, để mô hình nói lại với khách cho đúng.

Kiểm quyền ngay trong hàm: ví dụ giả định tra đơn hàng

Giả sử bạn viết hàm Python def tra_don_hang(ma_don, nguoi_dung): với tham số nguoi_dung là đối tượng phiên đăng nhập do máy chủ truyền vào, không phải do mô hình điền. Dòng đầu lấy đơn: don = kho.lay_don(ma_don). Dòng tiếp theo là dòng quan trọng nhất: if don is None or don.khach_id != nguoi_dung.id: return {"loi": "khong_tim_thay_don"}. Chỉ khi qua được dòng đó, hàm mới trả về trạng thái, ngày giao dự kiến và tên đơn vị vận chuyển.

Để ý cách trả lỗi: đơn không tồn tại và đơn của người khác đều trả cùng một thông điệp. Nếu trả khác nhau, kẻ tò mò có thể dùng trợ lý để dò xem mã đơn nào có thật. Cũng để ý rằng mã của người dùng không bao giờ là tham số mô hình được điền. Nếu lược đồ công cụ có trường ma_khach, người dùng chỉ cần viết “tra giúp đơn của khách số 15” là mô hình điền ngay, và hàm sẽ trả dữ liệu người khác.

Nguyên tắc chung rút ra: mọi thông tin về danh tính và quyền lấy từ phiên đăng nhập ở máy chủ; mô hình chỉ được điền những tham số mà chính người dùng được phép tự do chọn. Hãy viết kiểm thử cho đúng tình huống này, ví dụ người dùng A hỏi mã đơn của người dùng B phải nhận thông điệp không tìm thấy, và chạy nó mỗi lần sửa công cụ.

Tách công cụ đọc và công cụ ghi

Không phải công cụ nào cũng có mức rủi ro như nhau. Phân nhóm như dưới giúp bạn quyết định chỗ nào cần người dùng xác nhận.

NhómVí dụCách xử lý
Đọc dữ liệu công khaiTìm sản phẩm, xem giờ mở cửa, tra chính sách đổi trảChạy ngay, giới hạn số kết quả trả về
Đọc dữ liệu riêngTra đơn hàng, xem lịch sử muaChạy ngay sau khi kiểm quyền theo phiên đăng nhập
Ghi có thể hoàn tácThêm vào giỏ, lưu địa chỉ mớiChạy sau khi kiểm quyền, báo rõ cho người dùng đã làm gì
Ghi khó hoàn tácHuỷ đơn, đổi địa chỉ giao của đơn đang đi, gửi thư cho kháchMô hình chỉ đề xuất; giao diện hiện nút xác nhận, người dùng bấm thì máy chủ mới chạy
Không cho mô hình gọiHoàn tiền, đổi giá, xoá tài khoản, chạy câu SQL tuỳ ýKhông đưa vào danh sách công cụ; để luồng nghiệp vụ thường có người duyệt

Nhóm cuối đáng nói thêm: đừng bao giờ tạo một công cụ kiểu chay_sql nhận câu truy vấn tuỳ ý từ mô hình trong sản phẩm cho người dùng. Đó là mở cửa cho bất kỳ ai biết cách thuyết phục mô hình. Thay vào đó, tạo những công cụ hẹp với câu truy vấn viết sẵn và tham số được kiểm.

Những lỗi hay gặp khi làm gọi công cụ lần đầu

Các lỗi sau thường chỉ lộ ra khi người dùng thật bắt đầu hỏi những câu bạn không ngờ tới:

  • Không gửi kết quả lỗi về cho mô hình. Hàm ném ngoại lệ, máy chủ trả lỗi 500 cho giao diện. Nên bắt lỗi và gửi một kết quả công cụ mô tả lỗi, để mô hình xin lỗi và gợi ý cách khác.
  • Quên giới hạn số vòng. Như đã nói, cần trần số vòng và trần tổng thời gian cho một câu hỏi.
  • Trả quá nhiều dữ liệu. Một công cụ tìm sản phẩm trả về hai trăm kết quả đầy đủ mô tả làm phình token đầu vào ở vòng sau. Trả mười kết quả đầu với vài trường chính.
  • Mô tả mâu thuẫn với câu lệnh hệ thống. Câu lệnh nói không bàn chuyện hoàn tiền, nhưng có công cụ tra_chinh_sach_hoan_tien. Mô hình sẽ bối rối.
  • Tin tham số vì đã có lược đồ. Lược đồ chỉ đảm bảo kiểu; mã đơn vẫn có thể là chuỗi rác hay mã của người khác. Luôn kiểm lại trong hàm.
  • Không ghi nhật ký từng lần gọi công cụ. Khi khách báo trợ lý nói sai trạng thái đơn, bạn cần biết nó đã gọi công cụ nào, với tham số gì, nhận kết quả gì.

Phần lớn các lỗi trên không phải lỗi của mô hình mà là lỗi thiết kế quanh mô hình. Đó cũng là tin tốt: chúng sửa được bằng kỹ thuật phần mềm quen thuộc, kiểm thử, phân quyền và nhật ký.

Chi phí và độ trễ của vòng gọi công cụ

Mỗi vòng gọi công cụ là một lần gọi mô hình đầy đủ, và lần sau phải gửi lại toàn bộ lịch sử: câu lệnh hệ thống, danh sách công cụ, tin nhắn người dùng, yêu cầu gọi, kết quả. Vì vậy một câu hỏi cần hai vòng có thể tốn gấp đôi hoặc hơn số token đầu vào so với một câu trả lời trực tiếp, và thời gian chờ cộng dồn qua từng vòng cộng với thời gian chạy hàm của bạn.

Có vài cách giảm. Danh sách công cụ và câu lệnh hệ thống là phần lặp lại y nguyên mỗi lần, nên nếu nhà cung cấp hỗ trợ lưu đệm phần đầu câu lệnh thì đặt chúng ở đầu và giữ cố định. Kết quả công cụ nên gọn, như đã nói. Hàm công cụ phải nhanh: truy vấn có chỉ mục, có thời hạn chờ, không gọi tiếp ba dịch vụ bên ngoài nếu không cần.

Về phía giao diện, khi trợ lý đang gọi công cụ, hiện một dòng trạng thái bằng chữ như “đang tra đơn hàng” thay vì vòng xoay im lặng. Người dùng chờ được lâu hơn khi biết hệ thống đang làm gì. Cuối cùng, đo thực tế: ghi số vòng và tổng thời gian của mỗi câu hỏi vào nhật ký, xem phân bố sau một tuần để biết giới hạn số vòng đặt đã hợp lý chưa.

Câu hỏi thường gặp

Gọi công cụ khác gì với yêu cầu mô hình trả JSON?

Về kỹ thuật khá gần nhau vì cả hai đều sinh dữ liệu có cấu trúc theo lược đồ. Khác ở ý định: trả JSON là kết quả cuối, còn gọi công cụ là một bước giữa chừng, mô hình chờ kết quả để làm tiếp. Nhiều nhóm dùng một công cụ duy nhất làm cách ép đầu ra có cấu trúc.

Mô hình có thể gọi nhiều công cụ cùng lúc không?

Nhiều mô hình hiện nay hỗ trợ trả về nhiều yêu cầu gọi trong một lượt, ví dụ tra hai đơn cùng lúc. Máy chủ có thể chạy song song rồi gửi tất cả kết quả về. Kiểm tài liệu hãng để biết mô hình bạn dùng có hỗ trợ và cách bật tắt.

Có cần thư viện tác tử hay khung phần mềm riêng không?

Không bắt buộc. Vòng lặp gọi công cụ chỉ vài chục dòng mã và tự viết giúp bạn hiểu rõ chuyện gì xảy ra. Thư viện có ích khi số công cụ nhiều, cần lưu trạng thái phức tạp, nhưng đổi lại bạn thêm một lớp phải học và theo dõi phiên bản.

Làm sao kiểm thử một trợ lý có gọi công cụ?

Kiểm thử hàm công cụ như hàm thường, nhất là phần kiểm quyền. Với vòng lặp, chuẩn bị một bộ câu hỏi và ghi lại công cụ mong đợi được gọi; chạy định kỳ và so. Có thể thay hàm thật bằng hàm giả trả dữ liệu cố định để kết quả ổn định hơn.

Mô hình gọi sai công cụ thì làm gì?

Đọc nhật ký xem nó nhầm giữa hai công cụ nào, rồi sửa mô tả cho rõ ranh giới, thêm câu khi nào không dùng. Nếu hai công cụ quá giống nhau, cân nhắc gộp lại thành một với tham số phân biệt.

Có an toàn khi để mô hình gửi email hay tin nhắn cho khách không?

Chỉ an toàn khi có xác nhận của người. Mô hình có thể bị dẫn dắt viết nội dung sai hoặc gửi nhầm người. Cách hay dùng là mô hình soạn nháp, giao diện hiện bản nháp, người dùng hoặc nhân viên bấm gửi.

Cần tư vấn cụ thể cho trường hợp của bạn?

Chúng tôi sẽ liên hệ trong vòng 24 giờ.

Đăng ký tư vấn ngay

Bài viết liên quan

Bạn cần hỗ trợ thêm?

Để lại thông tin, chúng tôi sẽ liên hệ trong 24 giờ.

hoặc
Gọi ngay 0926 138 138