Smolagents – Xây dựng AI Agent trong “1 nốt nhạc”
Smolagents là một thư viện Python open-source của Huggingface, giúp đơn giản hóa và dễ tiếp cận hơn khi tạo ra AI Agent. Trong bài viết lần này, mình xin giới thiệu mọi người về Smolagents, những đặc điểm hữu ích và 1 project nhỏ để thể hiện khả năng của nó. Bắt đầu nhé, ^^ !
🤖Smolagents là gì ?
Theo như mô tả từ chính chủ, Smolagents là “một thư viện (framework) siêu đơn giản giúp mở khóa các khả năng tương tác với các mô hình ngôn ngữ lớn (LLMs) – a very simple library that unlocks agentic capabilities for language models“. Nhưng tại sao chúng ta lại cần các thư viện như vậy để tạo ra các tác nhân (agents)?
Về cốt lõi, các tác nhân (agent) được vận hành bởi các mô hình ngôn ngữ lớn (LLM) để giải quyết các vấn đề bằng cách:
- Quan sát môi trường xung quanh.
- Chia nhỏ và lập kế hoạch giải quyết.
- Thực hiện các nhiệm vụ cho từng mục tiêu đặt ra bằng các công cụ có sẵn.
Việc xây dựng các tác nhân (agent) này không khó, nhưng yêu cầu phải viết rất nhiều code cho các thành phần bên trong. Những thành phần này đòi hỏi phải hoạt động chính xác và tiết kiệm chi phí nhất có thể. Nên các framework ra đời giúp mọi thứ trở nên đơn giản hơn – “bạn không cần phải bắt đầu làm từng cái lốp xe khi muốn tạo ra ô tô nữa”.
Tuy nhiên hầu hết các framework thường vướng phải các vấn đề sau:
- Xây dựng cồng kềnh, khiến cho hệ thống khó tiếp cận và gây nhiều khó khăn trong quá trình phát triển hoặc debug.
- Thường tập trung vào “quy trình cứng nhắc” thay vì là linh hoạt và tự phối hợp hành động tốt.
Mặt khác, Smolagents lại sở hữu các đặc điểm khiến nó trở nên dễ tiếp cận và tiềm năng cho các ứng dụng dạng AI Agents như:
- Được thiết kế đơn giản, chỉ giữ lại những gì cần thiết.
- Smolagents sử dụng cách tiếp cận là “Code Agent”, tức là hành động được thể hiện trực tiếp bằng code Python thay vì các JSON setting mô tả hành động dài ngoằn.
- Có thể tích hợp tốt với Hugging Face Hub và thư viện Transformers (tụi nó cùng 1 nhà mà). Chúng ta có thể tận dụng rất nhiều mô hình có sẵn trên Hub (một số cần tài khoản Pro nhé). Ngoài ra, Smolagents cũng hỗ trợ tương tác với các mô hình từ OpenAI, Anthropic và nhiều nhà cung cấp khác.
- Có sẵn nhiều công cụ (tool) tích hợp sẵn hoặc dễ dàng tự tạo các công cụ (tool) giúp giải quyết vấn đề hiệu quả hơn.
Chính những đặc điểm này, khiến Smolagents trở thành một công cụ “plug-and-play” cho việc xây dựng các AI agent — rất ít công sức mà vẫn hiệu quả. Bây giờ hãy cùng chơi với nó một chút nhé !!!
Xây dựng một Demo nhỏ với Smolagents.
Bây giờ hãy cùng mình xây dựng 1 project nhỏ với yêu cầu là “Lấy và tóm tắt nội dung bài viết mới nhất từ Rivercrane Blog. Chúng ta sẽ tạo ra một số tool và xem cách hoạt động của chúng như thế nào.
🧩Cài đặt Smolagents
Để dùng Smolagents, chúng ta chỉ cần cài đặt thư viện Python và cung cấp cho nó một Huggingface access token.
Cài đặt thư viện của Smolagents
pip install smolagents
Export một huggingface access token.
export HF_TOKEN="hf_xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
🛠️Xây dựng một vài Custom tools
Mặc dùng framework đã cung cấp nhiều tool có thể sử dụng ngay lập tức như (WebSearchTool, DuckDuckGoSearchTool), tuy nhiên để hình dung rõ hơn thì trong Demo này mình sẽ tạo ra các tools tùy chỉnh để chúng ta thấy được việc tương tác với Smolagents dễ như thế nào.
Mình sẽ tạo ra 3 tools với mỗi tool sẽ có những mục đích như sau:
- Lấy tên và đường dẫn của bài viết mới nhất.
- Chuyển đổi và lưu HTML thành PDF.
- Đọc nội dung từ file PDF đã download về.
Bây giờ mình sẽ bắt đầu thử viết một custom tool cho phép “Lấy URL và tiêu đề của bài viết mới nhất” trên rivercrane.vn.
from smolagents import tool
import requests
from bs4 import BeautifulSoup
from typing import Tuple
BASE_URL = "https://rivercrane.vn/vi/blog/"
@tool
def get_rcvn_lastest_news() -> Tuple[str, str]:
"""
Get url and title the latest news from page of Rivercrane.vn
Returns:
Tuple[str, str]: (blog title, blog URL)
"""
try:
response = requests.get(BASE_URL, timeout=10)
response.raise_for_status()
soup = BeautifulSoup(response.content, "html.parser")
container = soup.find('div', class_='post fl-wrap fw-post')
if not container:
print("Blog container not found")
return None, None
blog_url = container.find('a')['href']
blog_title = container.find('h2').text.strip()
return blog_title, blog_url
except Exception as e:
print(f"Error fetching blog: {str(e)}")
return None, None
⚠️Chú ý: mình đã thêm “@tool” vào trước function dùng để đánh dấu đây là tool mà agent có thể sử dụng. Ngoài ra, hãy cố gắng đặt tên function và dành thời gian để mô tả chức năng của nó. Đặc biệt là Input/Output để agent có thể tham khảo và sử dụng chính xác.
Tiếp theo mình sẽ tạo thêm một custom tool với nhiệm vụ “Lưu bài viết thành file PDF từ URL” với thư viện pdfkit.
from smolagents import tool
import pdfkit
# PDF options
PDF_FILENAME = "rcvn_last-news.pdf"
PDF_OPTIONS = {
'page-size': 'A4',
'margin-top': '0.75in',
'margin-right': '0.75in',
'margin-bottom': '0.75in',
'margin-left': '0.75in',
'encoding': "UTF-8",
'no-outline': None,
'enable-local-file-access': None
}
@tool
def save_blog_post_to_pdf(blog_url: str) -> bool:
"""
Save blog post to PDF from url.
Args:
blog_url: The URL of the blog to convert
Returns:
bool: True if save file successfully and false otherwise
"""
try:
pdfkit.from_url(blog_url, PDF_FILENAME, options=PDF_OPTIONS)
print(f"PDF created successfully: {PDF_FILENAME}")
return True
except Exception as e:
print(f"PDF conversion failed: {str(e)}")
return False
Cuối cùng là @tool với chức năng đọc nội dung PDF với thư viện pypdf. Ở đây mình cho đọc 2 trang thôi vì mình thấy vậy là đủ để xem hết nội dung bài blog trên rivercrane.vn ⚠️(nguyên nhân chính là tiết kiệm chi phí dùng hugginface token ^^).
from smolagents import tool
from pypdf import PdfReader
from pathlib import Path
from typing import Optional
# PDF options
PDF_FILENAME = "rcvn_last-news.pdf"
@tool
def read_pdf_file() -> Optional[str]:
"""
Read content from PDF file.
Returns:
str: PDF content or None if file not found
"""
pdf_path = Path(PDF_FILENAME)
if not pdf_path.exists():
print(f"PDF file not found: {PDF_FILENAME}")
return None
try:
content = []
reader = PdfReader(pdf_path)
for page in reader.pages[:2]:
content.append(page.extract_text())
return "\n".join(content)
except Exception as e:
print(f"Error reading PDF: {str(e)}")
return None
🚀Chạy thử Agent !!!
Tất cả các custom tools đã chuẩn bị sẵn sàng! Bây giờ, hãy thử chạy nó. Ở đây mình không cấu hình mô hình cụ thể, mà sử dụng Hugging Face Inference API để chạy với mô hình mặc định mà Hugging Face Hub hỗ trợ. Tùy vào nhu cầu, bạn có thể tìm hiểu cách cấu hình model để cho kết quả như mong muốn.
from smolagents import CodeAgent, InferenceClientModel
model = InferenceClientModel() # Uses Hugging Face’s Inference API to access models
agent = CodeAgent(tools=[get_rcvn_lastest_news, save_blog_post_to_pdf, read_pdf_file],
model=model)
# Run the agent with a task
agent.run(f"Summarize the content of the lastest blog post by reading it")
Khi Agent hoạt động nó sẽ cho hiển thị tất cả các bước xử lý. Điều này giúp chúng ta quan sát được cách agent xác định hành động của nó thông qua code. Đồng thời, thấy được cách nó dùng các custom tools của chúng ta.
Agent log ở bước 1.
Ở bước này, Agent đã dùng một custom tool để lấy chính xác URL và tiêu đề của bài viết đúng như mong muốn của mình. Tiếp sau đó, Agent sẽ thực thi lần lượt các bước kế tiếp (các bước này do Agent lên kế hoạch, không phụ thuộc vào các tool truyền vào). Agent sẽ trả kết quả cuối cùng dựa vào yêu cầu được truyền vào – “Summarize the content of the lastest blog post by reading it”.
Agent blog ở bước cuối
Kết quả cuối cùng cho thấy Agent có thể hoàn thành nhiệm vụ thông qua nhiều bước mà không gặp bất kỳ lỗi nào. Lưu ý rằng ở đây mình đang sử dụng model default, nên kết quả chưa chắc là tốt nhất. Trong các nhiệm vụ phức tạp hoặc để có kết quả tốt nhất và thực thi ít bước nhất chúng ta có thể lựa chọn model xịn sò hơn.
✅Kết luận
Nếu đang cần tìm kiếm một thư viện giúp tạo ra Agent nhanh, không quá phức tạp và có thể tích hợp tốt với các công cụ khác và có một hệ sinh thái với đầy đủ những gì cần thiết thì Smolagent là một lựa chọn đáng để trải nghiệm. Dĩ nhiên nó sẽ tuyệt hơn nếu có nhiều công cụ (tool) được tích hợp sẵn mà chúng ta có thể hi vọng ở tương lai gần.
Cuối cùng, xin cảm ơn bạn đã xem bài viết này. Hi vọng những gì mình chia sẻ có thể giúp bạn hiểu và thích Smolagent.
![]() | Lê Đăng Khoa Developer |