Nhiều người hỏi tôi dựng “Grok bot” kiểu gì — con agent bạn nhờ vẽ minh hoạ là nó trả ảnh ngay trong chat. Câu trả lời thật thà làm bay hết ảo thuật: một bot trong agent platform là hai thứ nhỏ — một tool (hàm mà model gọi được) và một persona (agent biết khi nào gọi tool đó). Khi thấy được cách tách này, thêm một năng lực mới không còn là một dự án mà chỉ là một buổi tối.

Đây là phần giải phẫu, lấy con image generator làm ví dụ.

Quyết định đầu tiên: tool, MCP, hay engine?

Không phải năng lực nào cũng nên là tool viết tay. Tôi chọn hình dạng rẻ nhất mà vừa.

Hình dạngDùng khiVí dụ
Tool built-inTôi tự code và tái dùng khắp nơigenerate_image, web_search
Custom HTTP toolGọi API ngoài, không cần code — chỉ URL + params trong DBendpoint báo cáo nội bộ
MCP serverHãng đã có sẵn một tool server phong phúGitHub, Linear qua MCP OAuth
EngineBản thân nó executor chạy cả một taskmột cloud coding agent

Image generator là một tool built-in: một hàm, gọi được từ mọi nơi, trả về một artifact. Đó là điểm ngọt cho việc “cho model một động từ mới”.

Tool là một hàm có schema — và schema chính là prompt

Một tool được định nghĩa hai lần: một schema để model đọc rồi quyết định khi nào và gọi thế nào, và một implementation làm việc thật. Schema quan trọng hơn người ta tưởng — cái description của nó là chỉ dẫn duy nhất model nhận được về tool.

{
  "type": "function",
  "function": {
    "name": "generate_image",
    "description": "Generate an image from a text prompt. Returns the image inline. Use for illustrations, mockups, concept art, social visuals.",
    "parameters": {
      "type": "object",
      "properties": { "prompt": { "type": "string", "description": "Detailed description of the image to create." } },
      "required": ["prompt"]
    }
  }
}

Mấy nguyên tắc đáng giá: đặt tên là động từ, viết description theo kiểu khi nào dùng (không phải nó là gì), giữ ít tham số và có kiểu rõ, và nói rõ nó trả về gì. Description mơ hồ = một tool model không bao giờ gọi, hoặc gọi sai.

Implementation: làm việc, trả về thứ model dùng được

Bản thân hàm là code bình thường. Mẹo duy nhất đáng khắc cốt: trả về kết quả mà cả model lẫn UI đều dùng được. Con image tool của tôi không trả bytes thô — nó lưu ảnh thành artifact và trả về một thẻ markdown ảnh, nên câu trả lời hiện ngay trong chat mà không cần đấu nối gì thêm.

def tool_generate_image(prompt):
    img = provider.generate(prompt)                 # 1. gọi provider
    aid = save_artifact(img, mime="image/jpeg")     # 2. lưu thành artifact
    return "![%s](/files/%s/image.jpg)" % (prompt[:60], aid)  # 3. thân thiện model & UI

Tool trả về tốt thì: ngắn, tự mô tả, và tham chiếu artifact bằng URL thay vì đổ blob vào context window.

Vòng lặp tool: một lời gọi thực sự diễn ra thế nào

Tôi không điều phối lời gọi — model làm việc đó. Runtime của tôi chỉ thực thi cái nó yêu cầu rồi đưa kết quả lại cho tới khi nó dừng.

flowchart LR
  U["User: 'vẽ mascot con cáo'"] --> M["Model"]
  M -->|"tool_call: generate_image"| RT["Runtime"]
  RT -->|chạy tool_generate_image| T["Tool"]
  T -->|"![](/files/…)"| RT
  RT -->|kết quả tool| M
  M -->|câu trả lời + ảnh| U

Tôi đăng ký implementation cạnh schema để runtime tìm được theo tên:

TOOL_FN = { "generate_image": lambda a: tool_generate_image(a.get("prompt", "")), ... }

Đó là toàn bộ cơ chế. Mọi “bot” bạn từng trầm trồ đều là vòng lặp này gắn thêm các tool khác nhau.

Từ tool thành bot: thêm một persona

Một tool ai cũng gọi được sẽ thành một bot khi tôi bọc nó trong một agent — một system prompt cho nó một công việc, một giọng, và một hai tool nó nên với tới.

TrườngGrok image bot
tên / icon”Grok Artist” 🎨
tools["generate_image"]
system prompt”Bạn là một hoạ sĩ. Khi được nhờ tạo ảnh, hãy viết một prompt sống động, cụ thể rồi gọi generate_image. Đề xuất một biến thể.”
engine / modelmodel chạy vòng lặp tool

Giờ “Grok Artist” là một thứ trên roster tôi có thể chat, giao cho workflow, hay kích theo lịch — tất cả chỉ vì tôi thêm một động từ và một persona.

Công thức, tổng quát hoá

  1. Chọn hình dạng — tool, HTTP tool, MCP, hay engine.
  2. Viết schema — tên động từ, description kiểu khi-nào-dùng, ít tham số có kiểu, nêu rõ giá trị trả về.
  3. Implement — trả về một chuỗi ngắn, tham chiếu artifact.
  4. Đăng ký — schema + hàm, theo tên.
  5. Bọc trong persona — một agent biết khi nào với tới nó.

Tôi đã ship một image generator, một document builder, một code sandbox, và một cloud-coding agent qua đúng năm bước này. Nền tảng không lớn lên bằng cách phình to; nó lớn lên mỗi lần một động từ.

Xuất nội dung

Bình luận