Function Calling và tối ưu Token trong tích hợp công cụ
Function Calling và tối ưu Token trong tích hợp công cụ Giới thiệu Function calling (gọi hàm) đã trở thành một tính năng thiết yếu của các mô hình ngôn ngữ lớn hiện đại, cho phép LLM tương tác với các công cụ bên ngoài, API và cơ sở dữ liệu. Từ trợ lý ảo có thể đặt vé máy bay đến chatbot hỗ trợ khách hàng có thể tra cứu đơn hàng, function calling mở ra một thế giới ứng dụng mới. Nhưng ít ai nhận ra rằng function calling cũng là một trong những nguồn tiêu thụ token ẩn lớn nhất trong các ứng dụng AI hiện đại. Cách bạn thiết kế schema hàm, mô tả tham số và quản lý vòng đời cuộc gọi công cụ có thể làm khác biệt đến 2-3 lần về chi phí token. Bài viết này sẽ phân tích sâu về các điểm lãng phí token trong function calling và chia sẻ các kỹ thuật tối ưu đã được kiểm nghiệm. Cấu trúc chi phí Token của Function Calling Để hiểu tại sao function calling lại tốn token, trước hết cần phân tích các thành phần tạo nên tổng chi phí. Thành phần đầu tiên và rõ ràng nhất là function definition schema. Mỗi hàm bạn đăng ký với mô hình cần được mô tả bằng JSON schema, bao gồm tên hàm, mô tả, danh sách tham số, loại dữ liệu, giá trị bắt buộc và mô tả cho từng tham số. Tất cả thông tin này được gửi đến mô hình trong mỗi yêu cầu như một phần của system context. Nếu bạn đăng ký 10 hàm với mô tả chi tiết, tổng schema có thể dễ dàng đạt 1500-2000 token — và điều này được gửi đi trong MỌI yêu cầu, ngay cả khi người dùng chỉ hỏi một câu hỏi đơn giản không cần dùng công cụ nào. Thành phần thứ hai là tool call và tool result. Khi mô hình quyết định gọi một hàm, nó tạo ra một structured output chứa tên hàm và tham số — điều này tiêu tốn output token. Sau đó, kết quả trả về từ hàm được gửi lại cho mô hình như một role mới ("tool" hoặc "function"), tiêu tốn input token. Nếu kết quả là một JSON lớn hoặc một danh sách dài, chi phí này có thể rất đáng kể. Thành phần thứ ba, và ít được nhận ra nhất, là multi-turn overhead. Mỗi lần function calling tạo ra thêm ít nhất một vòng giao tiếp: mô hình ra lệnh gọi hàm → hệ thống thực thi → trả kết quả → mô hình tổng hợp. Mỗi vòng này bao gồm việc gửi lại toàn bộ lịch sử hội thoại cộng thêm thông tin mới. Với các tác vụ phức tạp đòi hỏi gọi nhiều hàm nối tiếp, số lượng token có thể nhân lên nhanh chóng. Các điểm lãng phí phổ biến Dựa trên kinh nghiệm phân tích nhiều hệ thống function calling trong production, có ba điểm lãng phí token phổ biến nhất. Điểm đầu tiên là đăng ký quá nhiều hàm cùng lúc. Nhiều đội ngũ đăng ký toàn bộ 15-20 hàm có sẵn cho mọi yêu cầu, nghĩ rằng mô hình sẽ tự chọn đúng hàm cần thiết. Thực tế là, việc gửi schema của 20 hàm trong mỗi yêu cầu không chỉ lãng phí token mà còn làm giảm độ chính xác của việc chọn hàm — mô hình bị choáng ngợp bởi quá nhiều lựa chọn và có thể chọn sai hàm hoặc tạo ra tham số không hợp lệ. Điểm thứ hai là mô tả tham số quá dài dòng. Mỗi tham số trong schema cần có mô tả, nhưng nhiều đội ngũ viết mô tả dài 2-3 câu cho mỗi tham số, bao gồm cả các ví dụ và giải thích chi tiết. Mặc dù mô tả rõ ràng giúp cải thiện độ chính xác, nhưng thường có thể rút ngắn đáng kể mà không làm giảm chất lượng. Một nguyên tắc tốt là mô tả mỗi tham số nên ngắn gọn trong 10-15 từ, chỉ nêu rõ ý nghĩa và đơn vị nếu cần. Điểm thứ ba là trả về quá nhiều dữ liệu trong tool result. Đây thường là điểm lãng phí lớn nhất. Ví dụ, một hàm tra cứu đơn hàng có thể trả về toàn bộ thông tin đơn hàng bao gồm lịch sử thay đổi, log giao tiếp, và các trường metadata không cần thiết — tổng cộng 2000 token. Nhưng mô hình thực sự chỉ cần 3 trường: trạng thái đơn hàng, ngày giao hàng dự kiến, và tổng số tiền. 1700 token còn lại hoàn toàn lãng phí và thậm chí có thể làm nhiễu loạn mô hình. Kỹ thuật tối ưu hiệu quả Đối mặt với những điểm lãng phí này, có ba kỹ thuật tối ưu mang lại hiệu quả cao nhất. Kỹ thuật đầu tiên là dynamic function registration (đăng ký hàm động). Thay vì đăng ký tất cả các hàm cho mọi yêu cầu, hãy sử dụng một bộ phân loại nhẹ (có thể là một LLM nhỏ, nhanh hoặc thậm chí một bộ phân loại truyền thống) để xác định loại yêu cầu của người dùng, sau đó chỉ đăng ký các hàm liên quan đến loại yêu cầu đó. Ví dụ, nếu người dùng hỏi về trạng thái đơn hàng, chỉ đăng ký các hàm liên quan đến đơn hàng — không cần đăng ký các hàm về đặt vé, trả hàng, hoặc thay đổi địa chỉ. Kỹ thuật này có thể giảm kích thước function schema đến 70-80% trong hầu hết các trường hợp. Kỹ thuật thứ hai là schema compression và parameter filtering. Xem xét lại từng hàm đã đăng ký và hỏi: tham số này có thực sự cần thiết không? Mô tả này có thể rút ngắn không? Có thể gộp các tham số tương tự thành một không? Nhiều đội ngũ phát hiện ra rằng sau khi tối ưu schema, họ có thể giảm 40-50% kích thước mà không ảnh hưởng đến độ chính xác của function calling. Một thực hành tốt là 定期 review và tối ưu hóa function schema như một phần của quy trình bảo trì ứng dụng. Kỹ thuật thứ ba là tool result summarization và field selection. Trước khi gửi kết quả hàm về cho mô hình, hãy lọc chỉ giữ lại các trường thực sự cần thiết cho nhiệm vụ hiện tại. Đối với các kết quả phức tạp, thậm chí có thể sử dụng một mô hình nhỏ, rẻ để tóm tắt kết quả chỉ giữ lại thông tin liên quan trước khi gửi cho mô hình chính. Mặc dù điều này thêm một bước gọi LLM, nhưng chi phí của mô hình nhỏ thường thấp hơn nhiều so với chi phí gửi dữ liệu thô cho mô hình lớn. Đối với các hệ thống phức tạp với nhiều công cụ và luồng công việc, việc triển khai các tối ưu này có thể tốn kém về thời gian phát triển. Trong những trường hợp này, các nền tảng điện toán phân tán như Novita thường cung cấp các framework và template đã được tối ưu sẵn cho function calling, giúp các đội ngũ bắt đầu nhanh chóng với chi phí token hiệu quả từ đầu. Cân bằng giữa chi phí và độ chính xác Tối ưu function calling không phải là giảm token càng nhiều càng tốt — đó là tìm điểm cân bằng giữa chi phí và độ chính xác. Giảm quá nhiều mô tả tham số có thể làm mô hình hiểu sai ý nghĩa của tham số và tạo ra các lời gọi hàm không hợp lệ. Giảm quá nhiều trường trong tool result có thể làm mô hình thiếu thông tin để trả lời chính xác. Để tìm điểm cân bằng này, các đội ngũ nên xây dựng một tập đánh giá gồm các tương tác function calling điển hình, đo lường cả chi phí token và tỷ lệ thành công của lời gọi hàm ở các mức tối ưu khác nhau. Thông thường, có một "điểm ngọt" nơi việc giảm thêm token bắt đầu làm tăng đáng kể tỷ lệ lỗi. Tối ưu ở gần điểm này thường cho thấy tỷ lệ lợi ích chi phí tốt nhất. Một kỹ thuật nâng cao là adaptive schema — điều chỉnh độ chi tiết của function description dựa trên độ khó ước tính của yêu cầu. Đối với các yêu cầu đơn giản, rõ ràng, sử dụng schema rút gọn. Đối với các yêu cầu phức tạp, mơ hồ, tự động chuyển sang schema đầy đủ để đảm bảo độ chính xác. Cách tiếp cận này cho phép bạn tiết kiệm token cho phần lớn các yêu cầu đơn giản trong khi vẫn duy trì chất lượng cao cho các trường hợp khó. Kết luận Function calling là một công cụ mạnh mẽ mở ra khả năng ứng dụng mới cho LLM, nhưng nó cũng mang lại những thách thức về chi phí token mà nhiều đội ngũ chưa nhận ra đầy đủ. Bằng cách áp dụng đăng ký hàm động, nén schema, lọc kết quả công cụ và thiết kế hệ thống cân bằng giữa chi phí và độ chính xác, các đội ngũ có thể giảm 50-70% chi phí token liên quan đến function calling mà vẫn duy trì trải nghiệm người dùng chất lượng cao. Khi các mô hình ngày càng tích hợp sâu với các công cụ và API bên ngoài, việc tối ưu token trong function calling sẽ ngày càng trở thành một kỹ năng thiết yếu cho mọi kiến trúc sư ứng dụng AI.****
All rights reserved