
Easy Agentic Tool Calling với Gemma 4
Trong hướng dẫn này, chúng tôi sẽ cung cấp cho Gemma 4 hai công cụ mới và theo dõi cách mô hình tự quyết định khi nào nên tìm kiếm thông tin và khi nào nên tính toán.
Easy Agentic Tool Calling với Gemma 4 - KDnuggets
Blog
Bài viết hàng đầu
Giới thiệu
Chủ đề
AI
Lời khuyên nghề nghiệp
Thị giác máy tính
Kỹ thuật dữ liệu
Khoa học dữ liệu
Mô hình ngôn ngữ
Học máy
MLOps
NLP
Lập trình
Python
SQL
Tập dữ liệu
Sự kiện
Tài nguyên
Tóm tắt nhanh
Đề xuất
Bản tin công nghệ
Quảng cáo
Tham gia Bản tin
Easy Agentic Tool Calling với Gemma 4
Trong hướng dẫn này, chúng ta sẽ cung cấp cho Gemma 4 hai công cụ mới và theo dõi mô hình tự quyết định khi nào nên tìm kiếm thông tin và khi nào nên tính toán.
Bởi Matthew Mayo, Biên tập viên quản lý KDnuggets vào ngày 22/5/2026 trong Mô hình ngôn ngữ
# Giới thiệu
Trong một bài viết gần đây trên Machine Learning Mastery, chúng ta đã xây dựng một tác nhân gọi công cụ có khả năng truy xuất thông tin từ bên ngoài, cụ thể là lấy dữ liệu thời tiết, tin tức, tỷ giá tiền tệ và thời gian từ các API công cộng. Bài viết đó đã trình bày rõ ràng về phần tổng hợp của mô hình, nhưng lại bỏ ngỏ phần thú vị hơn: một tác nhân có khả năng suy luận về môi trường của chính nó, kiểm tra máy của chính nó và chuyển giao các tác vụ mà nó không tin tưởng bản thân có thể thực hiện. Có thể lập luận rằng điều này gần hơn với khái niệm "tác nhân" thực sự.
Bài viết này tiếp nối từ bài viết trước. Chúng ta sẽ cung cấp cho Gemma 4 hai công cụ mới — một trình khám phá hệ thống tệp cục bộ được bảo vệ (sandboxed) và một trình thông dịch Python bị hạn chế — và theo dõi mô hình tự quyết định khi nào nên tìm kiếm thông tin và khi nào nên tính toán.
Các chủ đề chúng ta sẽ đề cập bao gồm:
Tại sao việc gọi công cụ "tác nhân" cần nhiều hơn các API web để trở nên thú vị.
Cách xây dựng một công cụ kiểm tra hệ thống tệp với các biện pháp bảo vệ chống lại việc truy cập đường dẫn trái phép.
Cách kết nối một công cụ trình thông dịch Python với mô hình mà không cần cấp cho nó toàn quyền kiểm soát máy của bạn.
Cách vòng lặp điều phối tương tự từ trước có thể tổng quát hóa cho các khả năng mới này.
Tôi đặc biệt khuyến nghị bạn nên đọc bài viết trước khi tiếp tục.
# Từ hội thoại đến tác nhân
Khi các công cụ duy nhất bạn cung cấp cho một mô hình ngôn ngữ là các API web chỉ đọc, về cơ bản bạn vẫn chỉ có một chatbot, mặc dù có thể truy cập thông tin tốt hơn. Mô hình nhận một lời nhắc, quyết định API nào để truy vấn và ghép nối phản hồi JSON thành một đoạn văn. Không có khái niệm thực sự về môi trường, không có trạng thái để kiểm tra, không có hậu quả để suy luận; đó là một kịch bản giống với việc tạo ra thông tin tăng cường truy xuất hơn là một tác nhân thực sự.
Khái niệm tác nhân, theo nghĩa thực tế mà các chuyên gia sử dụng, xuất hiện khi một mô hình bắt đầu tương tác với hệ thống mà nó đang chạy. Điều đó có thể có nghĩa là đọc từ một hệ thống tệp cục bộ, thực thi mã, sửa đổi tệp, gọi các quy trình khác hoặc bất kỳ sự kết hợp nào của chúng. Khoảnh khắc một công cụ có thể làm điều gì đó khác ngoài việc trả về một chuỗi sạch từ một dịch vụ từ xa, mô hình phải bắt đầu tự hỏi về chính nó: những tệp nào tồn tại, con số này thực sự bằng bao nhiêu, có gì trong thư mục này trước khi tôi khẳng định nó chứa bất cứ thứ gì.
Dòng Gemma 4, và đặc biệt là biến thể gemma4:e2b edge mà chúng ta đã sử dụng, đủ nhỏ để chạy cục bộ trên máy tính xách tay trong khi đủ năng lực về đầu ra có cấu trúc để điều khiển loại vòng lặp này một cách đáng tin cậy. Sự kết hợp đó là điều làm cho mô hình tác nhân cục bộ trở nên thú vị ngay từ đầu. Mã hoàn chỉnh cho hướng dẫn này có thể được tìm thấy tại đây.
# Tái sử dụng kiến trúc
Vòng lặp điều phối từ hướng dẫn trước không thay đổi. Chúng ta định nghĩa các hàm Python, hiển thị chúng thông qua lược đồ JSON, chuyển thanh ghi (registry) cho Ollama cùng với lời nhắc của người dùng, chặn bất kỳ khối tool_calls nào trong phản hồi, thực thi hàm được yêu cầu cục bộ, thêm kết quả dưới dạng thông báo vai trò công cụ (tool-role message) và truy vấn lại mô hình để nó có thể tổng hợp câu trả lời cuối cùng. Trợ giúp call_ollama tương tự, từ điển TOOL_FUNCTIONS tương tự, mảng lược đồ available_tools tương tự từ hướng dẫn trước đều xuất hiện.
Điều thay đổi là bản chất của các công cụ. Trong khi các công cụ trước đây đều là các máy khách mỏng trên các API từ xa, những công cụ chúng ta sẽ xây dựng bây giờ đều chạy mã trên máy. Điều đó chuyển vấn đề thiết kế từ "làm thế nào để tôi phân tích phản hồi này" sang "làm thế nào để tôi đảm bảo mô hình không thể, ngay cả vô tình, làm điều gì đó mà nó không được phép làm."
# Công cụ 1: Trình khám phá hệ thống tệp được bảo vệ (Sandboxed Filesystem Explorer)
Công cụ đầu tiên, list_directory_contents, cung cấp cho mô hình khả năng xem những tệp nào tồn tại trong một thư mục nhất định. Điều này nghe có vẻ tầm thường cho đến khi bạn nhớ rằng os.listdir chấp nhận bất kỳ chuỗi nào, bao gồm /, ~, và ../../etc. Một triển khai ngây thơ có thể dễ dàng dẫn "sự tò mò" của mô hình thẳng đến khóa API của bạn.
Lựa chọn thiết kế ở đây là ghim một thư mục cơ sở an toàn khi bắt đầu tập lệnh và từ chối bất kỳ yêu cầu nào giải quyết bên ngoài nó:
# Bảo mật: giới hạn list_directory_contents vào thư mục cơ sở này và các thư mục con của nó
# Đặt thành thư mục làm việc hiện tại khi tập lệnh bắt đầu
SAFE_BASE_DIR = os.path.abspath(os.getcwd())
def list_directory_contents(path: str = ".") -> str:
"""Liệt kê các tệp và thư mục trong một đường dẫn, giới hạn trong thư mục cơ sở an toàn."""
try:
# Giải quyết thành đường dẫn tuyệt đối và xác minh nó nằm trong SAFE_BASE_DIR
# Điều này chặn các nỗ lực duyệt như '../../etc' hoặc các đường dẫn tuyệt đối như '/'
requested = os.path.abspath(os.path.join(SAFE_BASE_DIR, path))
if not (requested == SAFE_BASE_DIR or requested.startswith(SAFE_BASE_DIR + os.sep)):
return (
f"Lỗi: Quyền truy cập bị từ chối. Đường dẫn '{path}' giải quyết bên ngoài "
f"không gian làm việc được phép ({SAFE_BASE_DIR})."
)
...
Mẫu này đơn giản nhưng đáng để xem xét thêm. Chúng ta không bao giờ tin tưởng chuỗi mà mô hình tạo ra. Chúng ta nối nó vào thư mục cơ sở, giải quyết nó một cách tuyệt đối (để .. được chuẩn hóa), và sau đó xác minh đường dẫn đã giải quyết vẫn bắt đầu bằng cơ sở. Cả /etc/passwd và ../../somewhere đều sụp đổ thành các đường dẫn không vượt qua kiểm tra tiền tố đó và bị từ chối trước khi os.listdir được gọi.
Phần còn lại của hàm là công việc quản lý: xác nhận đường dẫn tồn tại.
Nguồn tin: KDnuggets — Tác giả: Matthew Mayo. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.