Kỷ Luật Chưa Tồn Tại Bốn Năm Trước

Cuối 2022, xây dựng hệ thống với AI đơn giản đến mức lừa dối: bạn gõ một câu hỏi, trầm trồ với câu trả lời. Không có kỷ luật. Không có tooling. Không có hạ tầng. Chỉ là một text box và một model.

Sự đơn giản đó là khởi đầu của thứ gì đó — trong bốn năm tiếp theo — đã phát triển thành một kỹ thuật hoàn chỉnh với patterns riêng, failure modes riêng, và lớp hạ tầng riêng. Từ nghệ thuật viết câu hỏi khéo léo, nó đã trở thành kiến trúc hệ thống. Và câu hỏi trung tâm đã thay đổi ba lần.

2022: “Nói gì với model?” — và prompt engineering là câu trả lời.

2023: “Cho model xem thông tin gì?” — và context engineering xuất hiện.

2025: “Cần xây hệ thống gì?” — và câu trả lời là harness engineering.

Ba kỷ nguyên của AI engineering: Prompt Engineering (2022), Context Engineering (2023), Harness Engineering (2025)

Mỗi bước chuyển xảy ra vì thế hệ trước đụng phải một bức tường cấu trúc không thể vượt qua chỉ bằng kỹ thuật tốt hơn. Bottleneck cứ di chuyển — từ diễn đạt, đến thông tin, đến độ tin cậy. Hiểu quá trình đó là cách nhanh nhất để hiểu tại sao các production agentic systems ngày nay trông như vậy.


Phần 1 — Prompt Engineering: “Nói Gì Với Model?” (2022–2024)

Giả định nền tảng của prompt engineering rất thanh lịch: LLMs được train trên hàng tỷ tokens kiến thức nhân loại, nén vào hàng tỷ parameters. Kiến thức đó đã ở bên trong model rồi. Biến duy nhất còn lại là cách bạn diễn đạt yêu cầu. Viết đúng từ, đúng cấu trúc, và bạn mở khóa được câu trả lời đúng.

Trong hai năm, giả định này hoạt động đáng kể.

The hottest new programming language is English. — Andrej Karpathy, 2023

Một bộ từ vựng kỹ thuật phong phú xuất hiện:

Kỹ thuậtCách hoạt độngTốt nhất cho
Zero-shotHướng dẫn trực tiếp, không ví dụTask đơn giản, có tính thực tế
Few-shot2–5 ví dụ nhúng trong promptOutput cần format cụ thể (JSON, SQL)
Chain-of-Thought”Hãy suy nghĩ từng bước”Multi-step reasoning, toán
Role prompting”Bạn là senior engineer…”Hành vi chuyên biệt theo domain
Self-consistencySample N responses, majority voteQuyết định quan trọng
# Toàn bộ "stack" năm 2023 — mọi thứ nằm trong prompt
system_prompt = """
You are a senior backend engineer.
Rules:
- Return JSON only
- Handle all edge cases explicitly
- Use snake_case for identifiers
"""
response = openai.chat(
    model="gpt-4",
    messages=[
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": query}
    ]
)
# Không memory. Không tools. Mỗi call bắt đầu từ đầu.

Bức Tường: Knowledge Cutoff

Prompt engineering đụng phải một bức tường cấu trúc không thể vượt qua bằng cách suy luận. LLMs bị đóng băng trong thời gian — kiến thức kết thúc tại điểm cắt training. Chúng không biết team bạn ship gì sprint trước, internal API của bạn làm gì, hay lỗi hệ thống vừa xảy ra 5 phút trước.

Không có cách viết prompt nào có thể fix được điều này. Bottleneck đã dịch chuyển từ diễn đạt sang thông tin. Câu hỏi không còn là “nói gì?” — mà là “model thực sự có thể thấy gì?”


Phần 2 — Context Engineering: “Cho Model Xem Gì?” (2023–2025)

Context engineering bắt đầu từ một nhận thức đơn giản: prompt không phải toàn bộ câu chuyện. Object đầy đủ quyết định hành vi của model là context window — tất cả mọi thứ model đọc trước khi generate response, được tập hợp động mỗi turn.

Building with language models is becoming less about finding the right words, and more about answering: “What configuration of context is most likely to produce the desired behavior?” — Anthropic Engineering, 2025

Cấu tạo context window: System Prompt, Conversation History, RAG results, Tool schemas, Memory files

Trong vòng lặp agentic, context không bao giờ tĩnh. Mỗi turn, thêm thông tin tích lũy:

  • Conversation history — các turns trước trong hội thoại
  • Retrieved knowledge — tài liệu kéo từ nguồn bên ngoài qua RAG
  • Tool schemas — mô tả các actions và APIs có sẵn
  • Tool results — output từ các tools agent đã gọi
  • Memory files — state được persist từ sessions trước

Prompt không còn là thứ bạn viết một lần. Nó trở thành dynamic assembly được build lại mỗi turn — lớn dần, thay đổi, tích lũy state. Và context windows có giới hạn cứng.

Quản Lý Window Hữu Hạn

Ba chiến lược xuất hiện với đánh đổi cơ bản khác nhau:

Chiến lượcCơ chếĐánh đổiDùng khi
Raw contextGiữ nguyên mọi thứFidelity cao nhất, tốn token nhấtSessions ngắn, chi tiết quan trọng
Compaction (reversible)Thay content bằng references (vd: file path thay vì full file)Không mất dữ liệu nếu re-readableSessions dài với nhiều file edits
Summarization (lossy)LLM viết lại history ngắn hơnNén cao, mất dữ liệu vĩnh viễnPhương án cuối cùng

Thứ tự ưu tiên nghiêm ngặt: Raw context > Compaction > Summarization. Chỉ dùng lossy compression khi bí — detail đã bị summarize đi là mất mãi mãi.

Context Rot: Nhiều Hơn Không Phải Lúc Nào Cũng Tốt Hơn

Phát hiện quan trọng từ research 2024: context rot. Khi số token trong context window tăng, khả năng model nhớ chính xác thông tin từ context đó giảm. Nhồi nhét window không phải lúc nào cũng đúng. Mục tiêu của context engineering tốt là tìm tập tokens nhỏ nhất có signal cao nhất.

Progressive Disclosure

Pattern hiệu quả nhất cho agents nhiều tools: load tên và mô tả ngắn của tools vào context trước, sau đó hydrate full schema khi cần.

Bước 1  →  Agent thấy 50 tên tool + mô tả ngắn
Bước 2  →  Agent xác định cần tool "database_query"
Bước 3  →  Full schema của "database_query" được load vào context
Bước 4  →  Tool được gọi, result vào context, schema có thể evict

Pattern này — được khởi xướng trong các agentic frameworks — đã được áp dụng trong OpenAI Agents SDK (deferLoading: true), CrewAI (v1.10.2+), và LangGraph. Nếu bạn có hơn ~20 tools và chưa làm điều này, bạn đang burn tokens mỗi lần gọi.

Bức Tường: Độ Tin Cậy

Context engineering làm agents thông minh hơn. Nhưng không làm chúng đáng tin cậy hơn. Biết nhiều hơn, thấy nhiều hơn, không giải quyết được vấn đề hành động đúng, phục hồi sau lỗi, hay duy trì hành vi nhất quán qua sessions. Muốn vậy, bạn cần thứ gì đó hơn một window được quản lý tốt — bạn cần một hệ thống được xây bao quanh model.


Phần 3 — Harness Engineering: “Xây Hệ Thống Gì?” (2025–2026)

Harness engineering là kỷ luật thiết kế toàn bộ hạ tầng bao quanh model và làm cho trí tuệ của nó đáng tin cậy trong production.

Công thức quan trọng, từ LangChain tháng 3/2026:

Agent = Model + Harness

Model cung cấp stateless token prediction. Harness cung cấp mọi thứ biến prediction đó thành thứ hữu ích: memory persist, tools có permission gates, orchestration cho tasks phức tạp, sandboxes để thực thi an toàn, và evaluation loops bắt lỗi trước khi chúng compound.

Harness architecture: 6 layers — Serving, Orchestration, Sandbox, Context Engine, Memory, Tools — bao quanh Model

Một harness có sáu lớp riêng biệt:

Layer 1: Serving — Channels

Serving layer là cách agent nhận input và trả output. Insight kiến trúc là Channel abstraction: deploy một agent, kết nối với nhiều bề mặt qua unified gateway. Cùng một brain, cùng memory, accessible từ messaging app, web UI, hay IDE plugin — vì context được chia sẻ phía sau gateway.

Loại ChannelContext AvailableVí dụ
IDE / TUIFiles, cursor position, active errors, build outputVS Code plugin, terminal
Web appSession state, user preferencesCustom dashboard
MessagingText onlySlack, Telegram, WhatsApp

Model giống hệt trong mọi trường hợp. Gateway normalize inputs trước khi agent thấy chúng.

Layer 2: Orchestration — Routing, Không Phải Entry Point

Orchestration là logic quyết định, cho một task, cách chia nó và ai xử lý phần nào. Nó là router — không phải entry point cho requests (đó là việc của serving layer).

Hai orchestration patterns: ReAct Loop (Observe-Reason-Act) vs Orchestrator-Worker (phân tách, ủy thác, xác minh)

Hai patterns chiếm ưu thế trong production:

Subagent Spawning: Parent agent tạo child agent. Nó viết một prompt mới, gán tool set cụ thể, và copy context window vào child. Child làm việc độc lập với đủ context để hoàn thành task. Đây là cách Agent Teams của Claude Code hoạt động — một session làm team lead, spawn các sub-agents độc lập làm việc song song, phối hợp qua shared task list với dependency tracking.

Multi-agent Coordination: Task được phân tách và context window được chia cho các agents chuyên biệt. Mỗi agent chỉ thấy phần liên quan của mình. Orchestrator thu thập và tổng hợp kết quả. Khác với spawning, context không được replicate — nó được phân vùng.

Sự khác biệt quan trọng: spawning copy context và ủy thác một task. Coordination phân vùng context và phân phối bài toán.

Layer 3: Sandbox — Thực Thi Cô Lập

Agents chạy code. Code đó có thể xóa files, crash systems, hay lộ credentials. Sandboxes đảm bảo failures được containment.

Mức cô lậpTốc độAn toànUse Case
Local subprocessNhanh nhấtThấp nhấtDevelopment, thử nghiệm
Local Docker containerTrung bìnhTrung bìnhCI/CD, staging
Remote cloud containerChậm nhấtCao nhấtProduction, untrusted inputs

Quy tắc credential isolation (học từ production incidents thực tế): credentials không bao giờ được reachable từ sandbox nơi code do agent generate chạy. Một prompt injection thành công trong coupled design là đủ để expose toàn bộ environment. Đây là structural fix, không phải prompt fix.

Layer 4: Context Engine

Ở tầng harness, quản lý context không phải nghệ thuật — nó là engineered component chạy mỗi invocation, quyết định gì vào context window và khi nào. Ba kỹ thuật (compaction, progressive disclosure, tool offloading) không phải practices thủ công — chúng là pipeline stages với điều kiện trigger được định nghĩa.

Claude Code implement năm distinct compaction strategies với profiles latency/fidelity khác nhau: “Snip” nhanh nhưng lossy; “Microcompact” target tool outputs cụ thể. Hai strategies bổ sung vẫn nằm sau feature flags — bằng chứng cho thấy bài toán này thực sự chưa được giải ở quy mô lớn.

Layer 5: Memory — Filesystem, Không Phải Vector Database

TierLà gìVòng đời
Context windowModel đang đọcXóa sau mỗi request
Session RAMConversation history trong processMất khi process thoát
FilesystemMarkdown files trên diskTồn tại qua mọi sessions

Bản năng khi nghe “agent memory” là với tay lấy vector database và RAG pipeline. Thực tế với hầu hết production systems đơn giản hơn nhiều. Plain Markdown files — human-readable, human-editable, inspectable, và durable — phục vụ như memory layer. File MEMORY.md index trỏ đến topic files, AGENTS.md inject lúc session start, progress file được update sau mỗi work session.

Không embedding pipeline. Không retrieval infrastructure. Memory mà bạn có thể đọc, sửa, và version cùng với code.

Pattern long-running agent: Một initializer agent chạy ở session đầu tiên — viết structured progress file, mô tả state hiện tại, tạo initial commit. Mỗi session tiếp theo đọc file đó trước tiên. Đây là durable knowledge transfer qua sessions với zero infrastructure.

Layer 6: Tools — MCP với Permission Gating

Lý do wrap capabilities như MCP tools thay vì expose raw shell là permission gating. Bash shell cho agent mọi thứ. MCP tool cho agent đúng thứ nó được phép có.

Mọi tool trong một well-designed harness khai báo:

  • isReadOnly (mặc định false — giả sử nó write)
  • Một risk level (low / medium / high)
  • Điều kiện khi nào cần explicit human approval

Kết quả là permission system dựa trên default-deny: không gì được phép trừ khi được cấp quyền rõ ràng.

ToolMục đíchRủi ro
Read / Glob / GrepKiểm tra file, tìm kiếmThấp — read-only
EditThay thế text chính xácTrung bình
WriteTạo hoặc ghi đè filesTrung-cao
BashThực thi scripts tùy ýCao
WebFetchFetch URLs bên ngoàiTrung bình
Agent / TaskSpawn sub-agentCao — recursive

Tính đến giữa 2026, MCP đã vượt 97 triệu lượt tải SDK mỗi tháng và được support native bởi mọi AI vendor lớn — dấu hiệu cho thấy permission-gated tooling đã trở thành infrastructure standard.


Bảy Agentic Design Patterns

Bảy agentic design patterns: ReAct, Reflection, Tool Use, Planning, Multi-Agent, Orchestrator-Worker, Evaluator-Optimizer

Dựa trên bốn patterns nền tảng của Andrew Ng (2024), ngành đã hội tụ thành bảy patterns composable vào 2026:

PatternLàm gìKhi nào dùngReadiness
ReActXen kẽ reasoning + tool callsTasks tuần tự, multi-step🟢 Battle-tested
ReflectionTự phê bình và lặp lạiOutput cần chất lượng cao: code review, writing🟢 Mature
Tool UseGọi external APIs và servicesMọi task cần live data🟢 Universal
PlanningPhân goal thành dependency graphLong-horizon goals, workflows phức tạp🟡 Maturing
Multi-AgentAgents chuyên biệt phối hợpWorkloads lớn có thể song song hóa🟡 Maturing
Orchestrator-WorkerPhân tách → ủy thác → xác minh độc lậpTasks có separable verification🟡 Maturing
Evaluator-OptimizerChấm điểm output theo criteria, loop đến khi đạtQuality output là bottleneck🟡 Emerging

Các patterns này compose với nhau. Production system hiếm khi chỉ dùng một:

Production Research Agent
  Orchestrator-Worker          ← phân tách task
    Worker 1: ReAct            ← research tuần tự
      Tool Use                 ← web search, retrieval
      Reflection               ← tự kiểm tra findings
    Worker 2: ReAct            ← phân tích data song song
      Tool Use                 ← database queries
    Verifier: Evaluator        ← quality gate độc lập

Bài Toán Accuracy Cascade

Đây là phép tính thay đổi cách bạn suy nghĩ về per-step reliability:

Nếu mỗi action thành công với xác suất 85%, một workflow 10 actions chỉ thành công khoảng 20% (0.85¹⁰ ≈ 0.197).

Đây là lý do tại sao các patterns Reflection và Evaluator-Optimizer tồn tại — chúng đẩy per-step accuracy từ ~85% lên ~95%, biến 20% end-to-end success rate thành 60%+. Đầu tư vào quality-checking patterns hoàn vốn theo cấp số nhân trong multi-step workflows.


Production Failure Modes

Qua các production deployments thực tế, bốn failure patterns tái diễn:

FailureTriệu chứngRoot CauseStructural Fix
Silent failureHệ thống trông bình thường; output saiKhông có independent evaluation layerSeparate verifier agent với scoring criteria
Context rotAgent “quên” chi tiết quan trọng giữa taskToken count vượt ngưỡng recall hữu íchCompaction strategies, progressive disclosure
Permission creepAgent tích lũy quyền truy cập quá mứcPermission model phẳng, không scopingMCP default-deny, per-tool risk levels
Runaway executionTool calls không kiểm soát, chi phí tăng vọtKhông có iteration caps, không budget trackingHard caps iterations, token budget per cycle

Incidents thực tế: Slack AI (tháng 8/2025) — indirect prompt injection cho phép rút dữ liệu từ private channels. Salesforce Agentforce (tháng 9/2025) — malicious inputs dùng để leak CRM data. Đây không phải rủi ro lý thuyết; chúng là production failures được ghi nhận đã định hình security architecture của các harnesses sau này.

Minimum viable observability cho bất kỳ agent nào trong production:

  1. Trace mọi tool call với full input và output
  2. Log reasoning steps ở mỗi iteration
  3. Track token usage mỗi turn và tích lũy
  4. Alert khi iteration count vượt threshold định nghĩa
  5. Ghi lại task completion time và kết quả

Kỷ Luật AGENTS.md

Ý tưởng có tác động thực tế cao nhất trong harness engineering không cần hạ tầng mới. Mitchell Hashimoto mô tả nó trong notes công khai về agentic development: một file gọi là AGENTS.md (hoặc CLAUDE.md) nằm ở root của repository.

Mỗi dòng trong file đó đại diện cho một failure thực sự được quan sát và encode thành ràng buộc vĩnh viễn:

# AGENTS.md

## Code Standards
- Không dùng `any` type trong TypeScript — define proper interfaces
- Mọi API responses phải wrapped trong Result<T, E> type
- Database queries phải dùng parameterized statements only

## Architecture
- Không sửa migration files sau initial commit
- Mọi database writes phải qua service layer — không gọi ORM trực tiếp
- API endpoints mới bắt buộc có integration tests trước khi merge

## Agent Behavior
- Chạy full test suite trước khi đánh dấu task hoàn thành
- Không xóa files mà không có xác nhận rõ ràng của user
- Khi design intent không rõ, hỏi — đừng đoán

## Project Context
- Payments service nằm trong monorepo riêng — không import trực tiếp
- Feature flags quản lý qua LaunchDarkly, không phải env vars
- API v1 đã freeze — mọi work mới vào v2

File này được inject vào context của agent lúc session start. Nó không phải prompt. Nó không phải documentation. Nó là system constraint — institutional knowledge tích lũy được encode thành durable rules mà agent không thể bypass.

Bắt đầu một file hôm nay. Mỗi lần agent phạm lỗi trong codebase, thêm một rule. Trong vòng một tháng, bạn sẽ có một constraint file cải thiện đáng kể độ tin cậy của agent — với zero infrastructure cost.


Three-Agent Harness Của Anthropic

Anthropic công bố production harness của họ cho long-running development tasks vào tháng 3/2026. Pattern này giải quyết một vấn đề cơ bản của single-agent loops qua tasks dài: models đánh giá quá cao chất lượng output của chính mình, đặc biệt với tasks chủ quan như UI design.

Giải pháp của họ: tách planning, execution, và evaluation thành ba agents riêng biệt.

PLANNER
  Đọc requirements
  Viết structured feature list + implementation plan
  Tạo initial git commit (thiết lập baseline)
        |
        v
GENERATOR
  Đọc plan + progress file
  Implement incrementally
  Update progress file sau mỗi context reset
  (KHÔNG summarize — reset clean với structured state)
        |
        v
EVALUATOR
  Hoàn toàn độc lập — không bao giờ thấy reasoning của generator
  Được calibrate với few-shot scoring examples
  Chấm điểm output theo explicit criteria
  Gửi pass/fail + specific feedback về cho generator

Tính độc lập của evaluator là quan trọng. Khi cùng một agent vừa generate vừa evaluate, nó bị bias theo hướng approve những gì nó đã build. Một evaluator riêng, được calibrate với explicit scoring criteria và examples, bắt được failures mà generator sẽ rationalize bỏ qua.

Pattern context reset cũng đáng chú ý: thay vì compress history khi gần đến token limit, generator bắt đầu fresh context mỗi session chỉ dùng structured progress file. Điều này tránh behavior “thận trọng gần context limit” mà compaction đôi khi gây ra.


Framework Landscape: 2026

FrameworkTốt nhất choLanguageMulti-AgentMCPLearning Curve
LangGraphStateful workflows phức tạp, productionPythonGraph-basedCao (1–2 tuần)
CrewAIRapid prototyping, role-based collaborationPythonRole-based DSLThấp (20 dòng)
OpenAI Agents SDKProduction OpenAI-nativePythonHandoff-basedTrung bình
Anthropic Agent SDKClaude-native, permission-firstTypeScriptSubagent spawn✓ NativeTrung bình
Google ADKGoogle Cloud / Gemini ecosystemPythonA2A protocolTrung bình
MastraTeams TypeScript-firstTypeScriptTrung bình

Teams thường bắt đầu với CrewAI để prototyping và migrate sang LangGraph khi cần production-grade state management và conditional routing. Nếu production là mục tiêu ngay từ đầu, bắt đầu với LangGraph hoặc OpenAI Agents SDK tránh được migration cost.

Meta-lesson: Nắm vững một vài composable design patterns quan trọng hơn nhiều so với master bất kỳ framework đơn lẻ nào. Frameworks thay đổi; patterns tồn tại.


Nhìn Toàn Bộ Stack

Ba kỷ luật engineering không thay thế lẫn nhau — chúng xếp thành lớp:

┌──────────────────────────────────────────────────────┐
│               HARNESS ENGINEERING                    │
│   Tools · Memory · Sandbox · Orchestration · Eval    │
│           "Xây hệ thống gì?"                         │
├──────────────────────────────────────────────────────┤
│               CONTEXT ENGINEERING                    │
│    RAG · Compaction · Progressive Disclosure         │
│           "Cho model xem gì?"                        │
├──────────────────────────────────────────────────────┤
│               PROMPT ENGINEERING                     │
│          CoT · Few-shot · Role prompting             │
│              "Nói gì với model?"                     │
├──────────────────────────────────────────────────────┤
│                     MODEL                            │
│           GPT-4o · Claude · Gemini · Llama           │
└──────────────────────────────────────────────────────┘

Mỗi lớp xây trên lớp bên dưới. Bạn vẫn cần prompts tốt. Bạn vẫn cần context management thông minh. Nhưng leverage đã dịch chuyển lên trên — returns lớn nhất năm 2026 đến từ việc xây harness đúng.

Kỷ luật này đã đi một chặng đường dài từ “gõ câu hỏi, trầm trồ với câu trả lời.” Thứ chúng ta có bây giờ không phải là một chat interface được tinh chỉnh hơn — đó là một lớp distributed systems với failure modes riêng, infrastructure patterns riêng, và engineering discipline riêng. Câu hỏi không còn là “nói gì với AI?” Mà là: “xây gì bao quanh nó?”


References

Xuất nội dung

Bình luận