Nếu 2023 là năm của Generative AI, thì 2024-2025 đánh dấu bước chuyển mình sang Agentic AI.

Tuy nhiên, trong thực tế triển khai, LLM thường được sử dụng theo mô hình tĩnh (Input -> Output), vô tình khiến nó thành trở thành một 'bộ não trong lồng kính' – thông minh nhưng bị cô lập. Bài viết này sẽ phân tích sự chuyển dịch tư duy cốt lõi: từ việc dùng LLM để tra cứu thông tin sang vận hành AI Agent để suy luận và tương tác với hệ thống thực tế.

Trong quá trình tìm hiểu các Agent framework nổi bật hiện nay – từ Google GenAI SDK, LangChain cho đến Agno – mình nhận thấy một mẫu số chung thú vị: Dù cú pháp (Syntax) có thể khác biệt, nhưng kiến trúc lõi để xây dựng một Agent đều xoay quanh những nguyên lý bất biến.


1. Định nghĩa lại LLM: Từ Knowledge Base đến Reasoning Engine

Một sai lầm phổ biến khi tiếp cận AI là coi LLM như một Knowledge Base (Kho tri thức vạn năng). Thực tế, dữ liệu của LLM luôn bị giới hạn bởi thời điểm training và thiếu tính chính xác tuyệt đối.

Để xây dựng Agent, chúng ta cần thay đổi tư duy: Hãy coi LLM là một Reasoning Engine (Động cơ suy luận).

Ví dụ: Khi người dùng hỏi "Giá cổ phiếu NVDA hiện tại là bao nhiêu?", một LLM đóng vai trò Reasoning Engine sẽ không cố gắng "bịa" ra con số. Thay vào đó, nó thực hiện quy trình suy luận:

  1. Phân tích ý định: Người dùng cần dữ liệu thời gian thực.
  2. Kiểm tra khả năng: Dữ liệu nội tại đã cũ.
  3. Tìm kiếm công cụ: Hệ thống có cung cấp hàm get_stock_price không?
  4. Quyết định: Yêu cầu hệ thống thực thi hàm get_stock_price('NVDA').

Công thức tổng quát của một AI Agent:

Agent = Model (Brain) + Tools (Capabilities) + Memory + Planning


2. Giải phẫu kiến trúc của một Agent

Dưới góc độ kỹ thuật, một Agent được cấu thành từ 4 module chính:

2.1. The Brain (Model)

Đây là lõi xử lý trung tâm (CPU). Tuy nhiên, không phải LLM nào cũng làm Agent tốt.

  • Vai trò: Đóng vai trò là Reasoning Engine. Nó nhận thông tin, suy luận và đưa ra quyết định (Decision Making).
  • Yêu cầu kỹ thuật: Model phải có khả năng Instruction Following (Tuân thủ chỉ thị) tốtđể trả về dữ liệu có cấu trúc thay vì văn bản tự do.

Insight: Một "Brain" tốt không phải là Brain biết tuốt mọi thứ, mà là Brain biết khi nào mình không biết và cần gọi sự trợ giúp từ bên ngoài.

2.2. The Tools (Capabilities)

Đây là sự khác biệt lớn nhất giữa Chatbot và Agent. Tools là "cánh tay nối dài" giúp LLM chạm vào thế giới thực.

Về mặt kỹ thuật, Tools chính là các Function Interface mà bạn định nghĩa trong code:

  • search_google(query): Tra cứu thông tin mới.
  • execute_sql(query): Truy xuất dữ liệu nội bộ.

AI không tự mình lên Google tìm kiếm.

  • Nhiệm vụ của AI: Chỉ đưa ra quyết định dưới dạng text (thường là JSON): {"function": "search_google", "query": "giá cổ phiếu NVDA hiện tại"}
  • Nhiệm vụ của Code: Bắt lấy yêu cầu đó, thực thi API tìm kiếm thật, và gửi kết quả về lại cho AI xử lý.

2.3. The Planning (ReAct Pattern)

Nếu Model là não, Tools là tay, thì Planning là phương pháp làm việc. Để giải quyết các tác vụ phức tạp, Agent thường sử dụng mô hình ReAct (Reasoning + Acting).

Thay vì trả lời ngay lập tức, Agent sẽ đi qua một vòng lặp trạng thái:

  1. Thought: Phân tích yêu cầu user, chia nhỏ vấn đề.
  2. Plan: Quyết định trình tự các bước cần làm.
  3. Action: Chọn Tool phù hợp để thực thi bước đầu tiên.
  4. Observation: Quan sát kết quả trả về từ Tool.
  5. Reflect: Đánh giá xem kết quả đó có giải quyết được vấn đề chưa? Nếu chưa -> Quay lại bước 1.

2.4. Memory (Quản lý Context)

Các mô hình LLM hiện tại đều là Stateless. Mỗi request gửi lên API là một tờ giấy trắng. Do đó, "Memory" thực chất là kỹ thuật Quản lý ngữ cảnh.

Chúng ta có 2 loại Memory chính cần thiết kế:

  • Short-term Memory: Lưu trữ lịch sử hội thoại hiện tại (List of Messages).
  • Long-term Memory: Lưu trữ tri thức doanh nghiệp hoặc thông tin người dùng lâu dài (thường dùng Vector Database để truy xuất).

3. Demo: Xây dựng Stock Agent

Để chứng minh sự khác biệt giữa một Chatbot vô tri và một Agent biết hành động, chúng ta sẽ xem xét một ví dụ thực tế: Tra cứu thông tin tài chính thời gian thực.

Lưu ý: Đoạn code dưới đây sử dụng Agno Framework để minh họa sự ngắn gọn của mô hình Agent hiện đại.

Kịch bản

Chúng ta hỏi: "Giá cổ phiếu NVDA hiện tại là bao nhiêu và P/E ratio là bao nhiêu?"

  • LLM thường: Sẽ trả lời dữ liệu cũ mèm năm 2023 hoặc từ chối trả lời.
  • Agent: Sẽ tự động kết nối API tài chính để lấy số liệu thực.
import os
from dotenv import load_dotenv

from agno.tools.yfinance import YFinanceTools
from agno.models.openai import OpenAIChat
from agno.agent import Agent

# Load API Key từ file .env để bảo mật
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
load_dotenv(os.path.join(BASE_DIR, ".env"))

# 1. Định nghĩa Agent
# Chúng ta gắn cho nó "bộ não" (GPT-4o) và "cánh tay" (YFinanceTools)
stock_agent = Agent(
    name="Stock Price Agent",
    model=OpenAIChat(
        id=os.getenv("MODEL_NAME"), # Ví dụ: gpt-4o
        api_key=os.getenv("API_KEY"),
    ),
    tools=[YFinanceTools()], # Cung cấp tool tài chính có sẵn
    instructions=["Dùng bảng Markdown để hiển thị dữ liệu."],
    markdown=True,
)

# 2. Thực thi nhiệm vụ
stock_agent.print_response(
    "Giá cổ phiếu NVDA hiện tại là bao nhiêu và P/E ratio là bao nhiêu?"
)

Hãy nhìn vào ảnh kết quả chạy thực tế dưới đây:

Bạn sẽ thấy 3 phần rõ rệt minh chứng cho kiến trúc Agent mà chúng ta đã học ở Phần 2:

  1. Message (Input): Câu hỏi tự nhiên của người dùng.
  2. Tool Calls: Đây là lúc Agent tự quyết định gọi hàm, bạn có thể thấy nó không trả lời ngay mà thực hiện hành động trước.
  3. Response (Output): Sau khi có dữ liệu từ Tool, Agent tổng hợp lại và gửi cho người dùng.

4. Tổng kết: Sự chuyển dịch tư duy

Qua ví dụ Demo ở trên, chúng ta thấy rõ sự khác biệt căn bản trong cách vận hành của hai mô hình:

  • LLM thuần túy: Nhiệm vụ cốt lõi là dự đoán từ tiếp theo. Nếu thiếu thông tin, nó buộc phải lục lọi trong dữ liệu training cũ kỹ, dẫn đến rủi ro "bịa" số liệu (Hallucination).
  • AI Agent :Nhiệm vụ cốt lõi là hoàn thành mục tiêu. Khi thiếu thông tin, nó chủ động dừng lại để gọi công cụ (get_stock_price), lấy dữ liệu thật  rồi mới trả lời.

Bạn có thấy lạ khi một mô hình ngôn ngữ vốn chỉ biết "đoán từ" lại có thể kích hoạt chính xác một hàm Python? Bí mật nằm ở Function Calling