Chuyển đến nội dung chính

Smolagents của Hugging Face: Hướng dẫn kèm ví dụ

Tìm hiểu cách đơn giản hóa việc tạo tác tử AI với thư viện Python mới của Hugging Face, smolagents, và theo dõi một dự án demo để thấy cách hoạt động.
· 8 phút đọc

Khám phá cùng AI

Thư viện Python smolagents của Hugging Face giúp đơn giản hóa việc tạo tác tử AI, giúp chúng trở nên dễ tiếp cận hơn với nhà phát triển.

Trong bài viết này, tôi sẽ giới thiệu thư viện smolagents, giải thích vì sao nó hữu ích và hướng dẫn bạn qua một dự án demo để trình diễn khả năng của nó.

Smolagents của Hugging Face là gì?

Như mô tả trong bài blog thông báo của Hugging Face, smolagents là “một thư viện rất đơn giản mở khóa các khả năng mang tính tác tử cho mô hình ngôn ngữ.” Nhưng vì sao chúng ta cần các thư viện để xây dựng tác tử?

Cốt lõi của tác tử là được vận hành bởi các LLM để linh hoạt giải một nhiệm vụ bằng cách quan sát môi trường, lập kế hoạch và thực thi các kế hoạch đó dựa trên bộ công cụ của mình. Việc xây dựng các tác tử này, tuy không phải là không thể, nhưng đòi hỏi bạn phải viết từ đầu nhiều thành phần. Những thành phần này đảm bảo tác tử hoạt động đúng mà không “đốt” sạch hạn mức API và thời gian thực thi của bạn. Các framework tác tử giúp việc này dễ hơn để bạn không phải “tái phát minh bánh xe”.

Các framework tác tử AI thường bị phê bình ở hai điểm:

  1. Xây quá nhiều lớp trừu tượng, khiến chúng cứng nhắc và khó gỡ lỗi.
  2. Tập trung vào “quy trình làm việc” hơn là xây dựng các tác tử có thể tự động cộng tác một cách linh hoạt.

Ngược lại, smolagents có những điểm mạnh khiến nó rất hứa hẹn cho các ứng dụng mang tính tác tử:

  • Các lớp trừu tượng của framework được giữ ở mức tối thiểu.
  • Trong khi hầu hết framework để tác tử định nghĩa hành động ở dạng JSON/văn bản, cách tiếp cận chính của smolagents là Code Agents, trong đó hành động được viết dưới dạng đoạn mã Python (khác với tác tử viết mã).
  • Là một framework của Hugging Face, smolagents tích hợp tốt với Hub và thư viện Transformers. Bạn có thể dùng nhiều mô hình từ hub (một số chỉ dành cho người dùng Pro), và cũng có thể làm việc với các mô hình độc quyền từ OpenAI, Anthropic, v.v.
  • Bạn có thể dễ dàng tận dụng các công cụ có sẵn, hoặc định nghĩa công cụ tùy chỉnh với nỗ lực tối thiểu, gần như đơn giản như viết một hàm Python.

Những đặc điểm này, về lý thuyết, khiến smolagents trở thành lựa chọn “cắm là chạy” để làm việc với tác tử AI mà ít tốn công. Hãy xem thực tế có đúng như vậy không.

Xây dựng dự án demo với Smolagents

Trong phần này, chúng ta sẽ xây một demo đơn giản với smolagents. Ứng dụng sẽ có một tác tử lấy bài báo được bình chọn cao nhất trên trang Daily Papers của Hugging Face. Chúng ta xây các công cụ tùy chỉnh cho tác tử và xem nó hoạt động.

Daily Papers của Hugging Face, một nguồn tốt để theo dõi các bài nghiên cứu hàng ngày nổi bật.

Daily Papers, một nguồn tốt để theo dõi các bài nghiên cứu nổi bật mỗi ngày.

Thiết lập smolagents

Để dùng smolagents, bạn chỉ cần cài thư viện và cung cấp token của Hugging Face. Việc thiết lập dễ dàng là một điểm cộng của framework.

Để cài gói, chạy:

pip install smolagents

Xây công cụ tùy chỉnh

Mặc dù framework cung cấp các công cụ dựng sẵn có thể dùng ngay (ví dụ DuckDuckGoSearchTool), việc xây công cụ tùy chỉnh cũng đơn giản tương tự. Cho mục đích của chúng ta, ta xây bốn công cụ, mỗi công cụ cho một mục đích cụ thể:

  • Lấy tiêu đề của bài báo hàng ngày đứng đầu.
  • Lấy ID của bài báo bằng tiêu đề của nó.
  • Tải bài báo từ arXiv bằng ID.
  • Đọc tệp PDF đã tải.

Một nguyên nhân phổ biến gây lỗi tác tử là việc sử dụng công cụ. Để tối ưu công cụ cho mục đích tác tử, điều quan trọng là đảm bảo tác tử hiểu rõ nên dùng công cụ nào và dùng như thế nào. Để đạt được điều này, hãy diễn đạt rõ ràng nhất có thể khi định nghĩa các công cụ:

  • Chọn tên hàm mang tính mô tả.
  • Đầu vào và đầu ra của hàm nên có gợi ý kiểu dữ liệu (type hint).
  • Phải kèm mô tả mục đích của công cụ. Điều này đóng vai trò như sổ tay hướng dẫn cho tác tử.

Giờ hãy xây công cụ tùy chỉnh đầu tiên để phân tích trang daily papers và lấy tiêu đề bài báo đứng đầu:

from smolagents import tool 
# import packages that are used in our tools
import requests
from bs4 import BeautifulSoup
import json

@tool
def get_hugging_face_top_daily_paper() -> str:
    """
    This is a tool that returns the most upvoted paper on Hugging Face daily papers.
    It returns the title of the paper
    """
    try:
      url = "<https://huggingface.co/papers>"
      response = requests.get(url)
      response.raise_for_status()  # Raise an exception for bad status codes (4xx or 5xx)
      soup = BeautifulSoup(response.content, "html.parser")

      # Extract the title element from the JSON-like data in the "data-props" attribute
      containers = soup.find_all('div', class_='SVELTE_HYDRATER contents')
      top_paper = ""

      for container in containers:
          data_props = container.get('data-props', '')
          if data_props:
              try:
                  # Parse the JSON-like string
                  json_data = json.loads(data_props.replace('&quot;', '"'))
                  if 'dailyPapers' in json_data:
                      top_paper = json_data['dailyPapers'][0]['title']
              except json.JSONDecodeError:
                  continue

      return top_paper
    except requests.exceptions.RequestException as e:
      print(f"Error occurred while fetching the HTML: {e}")
      return None

Lưu ý decorator @tool, cách đặt tên rõ ràng cho công cụ, các type hint và docstring. Tương tự, chúng ta định nghĩa công cụ get_paper_id_by_title để lấy ID bài báo theo tiêu đề, nhằm tải nó từ arXiv. Với công cụ này, chúng ta sử dụng API của Hugging Face.

from huggingface_hub import HfApi

@tool
def get_paper_id_by_title(title: str) -> str:
    """
    This is a tool that returns the arxiv paper id by its title.
    It returns the title of the paper

    Args:
        title: The paper title for which to get the id.
    """
    api = HfApi()
    papers = api.list_papers(query=title)
    if papers:
        paper = next(iter(papers))
        return paper.id
    else:
        return None

Tải bài báo bằng ID có thể thực hiện với gói Python arxiv. Chúng ta lưu bài báo cục bộ với một tên cụ thể, sau đó dùng tên này để đọc:

import arxiv

@tool
def download_paper_by_id(paper_id: str) -> None:
    """
    This tool gets the id of a paper and downloads it from arxiv. It saves the paper locally 
    in the current directory as "paper.pdf".

    Args:
        paper_id: The id of the paper to download.
    """
    paper = next(arxiv.Client().results(arxiv.Search(id_list=[paper_id])))
    paper.download_pdf(filename="paper.pdf")
    return None

Để đọc tệp PDF, bạn có thể dùng gói pypdf. Chúng ta sẽ chỉ đọc ba trang đầu của bài báo để tiết kiệm token.

from pypdf import PdfReader

@tool
def read_pdf_file(file_path: str) -> str:
    """
    This function reads the first three pages of a PDF file and returns its content as a string.
    Args:
        file_path: The path to the PDF file.
    Returns:
        A string containing the content of the PDF file.
    """
    content = ""
    reader = PdfReader('paper.pdf')
    print(len(reader.pages))
    pages = reader.pages[:3]
    for page in pages:
        content += page.extract_text()
    return content

Nếu bạn định nghĩa công cụ tùy chỉnh mà tác tử gặp khó khi dùng đúng hoặc truyền đúng tham số, hãy cân nhắc đặt tên hàm và biến, cũng như mô tả công cụ, rõ ràng và cụ thể hơn.

Chạy tác tử

Sau khi thiết lập công cụ, ta có thể khởi tạo và chạy tác tử. Chúng ta dùng mô hình Qwen2.5-Coder-32B-Instruct, miễn phí để sử dụng. Các công cụ mà tác tử cần có thể được truyền vào khi định nghĩa tác tử. Bạn có thể thấy quy trình định nghĩa và chạy một tác tử cần rất ít mã:

from smolagents import CodeAgent, HfApiModel

model_id = "Qwen/Qwen2.5-Coder-32B-Instruct"

model = HfApiModel(model_id=model_id, token=<YOUR-API>)
agent = CodeAgent(tools=[get_hugging_face_top_daily_paper,
                         get_paper_id_by_title,
                         download_paper_by_id,
                         read_pdf_file],
                  model=model,
                  add_base_tools=True)

agent.run(
    "Summarize today's top paper on Hugging Face daily papers by reading it.",
)

Khi tác tử hoạt động, nó xuất quy trình theo từng bước. Điều này cho phép chúng ta thấy cách nó định nghĩa hành động bằng mã trong khi sử dụng các công cụ tùy chỉnh đã cung cấp:

Đầu ra của tác tử smolagent ở bước 0

Đầu ra của tác tử ở bước 0

Tác tử có thể hoàn tất việc đọc bài ngay ở bước đầu tiên (Bước 0). Ở bước thứ hai, mô hình liệt kê các ý chính của bài, cũng ở dạng danh sách Python.

Đầu ra của tác tử smolagent ở bước 1.

Đầu ra của tác tử ở bước 1

Ở bước thứ ba (Bước 2), tác tử tạo bản tóm tắt các ý chính và in ra ở bước cuối (Bước 3).

Đầu ra của tác tử smolagent ở các bước 2, 3.

Đầu ra của tác tử ở các bước 2, 3.

Tác tử đã xác định được công cụ nào cần dùng ở mỗi bước và hoàn thành nhiệm vụ không lỗi. Lưu ý rằng toàn bộ pipeline có thể được tối ưu để dùng ít công cụ hơn, nhưng tôi muốn kiểm tra cách tác tử sử dụng nhiều lần gọi công cụ.

Với các nhiệm vụ thách thức hơn, yêu cầu lý luận hoặc sử dụng công cụ phức tạp hơn, bạn cũng có thể dùng các mô hình mạnh hơn làm xương sống cho tác tử của mình, như những mô hình do OpenAI hoặc Claude cung cấp.

Kết luận

Bạn tìm kiếm điều gì ở một framework tác tử? Câu trả lời sẽ cho thấy bạn nên dùng cái nào, nhưng nếu bạn cần một framework đơn giản, không bị “phình to” bởi các trừu tượng, cho bạn quyền kiểm soát, có tích hợp tốt và cung cấp những thứ cơ bản mà không giành quyền lái, thì smolagents là một lựa chọn đáng thử.

Việc tích hợp tốt vào hệ sinh thái Hugging Face đồng nghĩa với nhiều mô hình và công cụ trong tầm tay, cùng sự hỗ trợ của cộng đồng nguồn mở. Framework hoạt động tốt như những gì nó hứa hẹn. Nó có thể được hưởng lợi từ nhiều công cụ dựng sẵn hơn, và chúng ta có thể hy vọng điều đó sẽ xảy ra khi nó tiếp tục được phát triển.

Nếu bạn muốn đọc thêm về tác tử AI và smolagents, đừng bỏ qua các tài nguyên này:

Hesam Sheikh Hassani

Tác giả

Hesam Sheikh Hassani

Học viên cao học ngành Trí tuệ nhân tạo và chuyên viên biên tập kỹ thuật AI. Tôi chia sẻ những góc nhìn về công nghệ AI mới nhất, giúp phổ biến nghiên cứu ML và đơn giản hóa các chủ đề AI phức tạp để bạn luôn đi đầu.

Chủ đề

Liên quan