Harness: bộ khung biến model thành agent

Những từ nghe “fancy” như harness, system prompt, agentic loop, tool-calling, translation layer… cuối cùng thường quy về vài việc cơ bản mà một hệ thống cần làm để biến model thành một agent có thể sử dụng được:

  • Nhồi system prompt — để model biết nó là ai, có quy tắc gì và nên nói chuyện theo style nào.
  • Cung cấp tools — mô tả rõ những function model được gọi, cùng input và output của chúng.
  • Chạy agentic loop — nhận message → quyết định bước tiếp theo → gọi tool nếu cần → nhận kết quả → tiếp tục cho đến khi xong.
  • Translate giữa các API model — để cùng một harness có thể chạy với Claude, GPT, Gemini, Grok… mà không phải viết lại toàn bộ code.

Về bản chất, harness chỉ là cái khung bao quanh model để biến nó từ một API chat thuần thành một hệ thống có thể hành động, giữ session state và tương tác qua nhiều giao diện như terminal, email hay Slack.

Harness không có “tư duy”. Nó chỉ là pure logic: condition, rule, API call và vòng lặp. Nó không tự hiểu yêu cầu, không tự biết nên tìm gì và không tự quyết định bước tiếp theo theo cách có ý nghĩa.

Phần có thể diễn giải yêu cầu và chọn hành động không máy móc là model. Harness chỉ nhận quyết định đó, thực thi đúng logic đã được lập trình, rồi đưa kết quả trở lại model.

Không có gì thần thánh hơn thế.

Agent trả lời Slack hoạt động như thế nào?

Flow cơ bản không phải là harness tự phân tích câu hỏi rồi quyết định phải làm gì. Harness chỉ nhận message từ Slack và tạo request gửi đến model.

Request ban đầu có thể gồm:

  • system prompt;
  • các skill hoặc instruction bổ sung;
  • danh sách tools và schema của chúng;
  • message người dùng gửi từ Slack.

Sau đó model tự quyết định bước tiếp theo. Với cùng một message, model có thể:

  • trả lời ngay;
  • gọi Slack API để lấy thêm lịch sử hoặc message liên quan;
  • gọi web search;
  • gọi một tool khác.

Nếu model trả lời ngay, harness lấy text đó và gửi lại vào Slack. Nếu model yêu cầu gọi tool, harness thực thi tool tương ứng rồi tạo một request mới gửi kết quả về model. Model lại quyết định bước tiếp theo: trả lời, gọi thêm tool, hoặc kết thúc.

Ví dụ, flow có thể là:

  1. Slack gửi message mới cho harness.
  2. Harness gửi message đó cùng system prompt, skills và tool definitions cho model.
  3. Model yêu cầu gọi Slack API để lấy lịch sử gần đây.
  4. Harness gọi Slack API và nhận kết quả.
  5. Harness gửi kết quả đó cho model trong request tiếp theo.
  6. Model quyết định đã đủ thông tin và tạo câu trả lời.
  7. Harness gửi câu trả lời vào Slack.

Nếu kết quả Slack chưa đủ, model có thể yêu cầu gọi lại Slack API với tham số khác. Nếu cần thông tin bên ngoài, model có thể gọi web search. Harness không tự quyết định các bước này; nó chỉ thực thi yêu cầu của model và gửi kết quả trở lại.

Luồng tối giản là:

Slack message → model request → model quyết định → tool call nếu cần → tool result → model request tiếp theo → Slack reply

Đó chính là agentic loop. Harness chịu trách nhiệm kết nối các thành phần và lặp các API call. Harness không quyết định ý nghĩa của công việc; model mới là thành phần diễn giải yêu cầu và chọn bước tiếp theo.