# Context engineering cho AI agent: giữ record, gửi focused view

[Rod Rivera](https://homus.dev/speakers/rod-rivera) · [Rasa](https://homus.dev/orgs/rasa)

> Vì sao agent nên giữ record ngoài prompt và mỗi lượt chỉ gửi model một view do live state chọn, minh hoạ bằng skill.md và template của Rasa Mantle.

Topics: Context Engineering, Agents, Skills

Canonical: https://homus.dev/talks/context-engineering-for-ai-agents-keep-the-record-send-a-focused-view

## 1. Agent thay thẻ bị đánh cắp, và model trộn lẫn các bước

Video mở bằng một tình huống cụ thể. Agent của bạn đang làm thủ tục thay một chiếc thẻ ngân hàng bị đánh cắp. Prompt của nó lại chứa luôn các bước dành cho trường hợp thẻ bị hư hỏng. Và thỉnh thoảng model trộn hai bộ bước đó vào nhau.

Context engineering sửa đúng chỗ này. Cách làm gói trong một câu: giữ record (bản ghi đầy đủ) ở bên ngoài prompt, và gửi cho model một focused view (một góc nhìn đã chọn lọc). Rod hỏi đùa: dễ quá phải không?

![Rod Rivera nói trước camera, phía dưới có dòng chữ về context engineering](https://homus.dev/photos/UEsl0Q-VAec-0003.jpg)

Rod Rivera mở đầu tập. Dòng chữ bên dưới tóm cả ý chính: context engineering là giữ record bên ngoài prompt và gửi cho model một focused view.

Người dẫn là Rod Rivera, và đây là series **Agent Concepts** do Rasa làm cùng Prof Rod: mỗi tập một ý tưởng về agent. Trước khi đi vào cách làm, anh đặt câu hỏi đầu tiên: rốt cuộc một agent quản lý context như thế nào?

## 2. Hai kho, hai việc: record và view

Toàn bộ ý tưởng nằm trên một sơ đồ: hai kho, hai việc khác nhau. Record thì đầy đủ và chỉ có lớn dần lên. View thì nhỏ, và được dựng lại cho từng lần gọi model. Context engineering chính là bước chọn lọc nằm ở giữa hai thứ đó.

Bắt đầu với record. Mọi tin nhắn, mọi câu trả lời, mọi tool call cùng kết quả của nó, và mọi giá trị mà agent đã biết được đều nằm trong đó. Nói cách khác, record là mọi thứ đã diễn ra trong cuộc hội thoại của chúng ta với agent. Vì thế nó chỉ có lớn lên: không có gì trong đó bị sửa hay bị vứt đi.

![Sơ đồ Two stores, and a selection in between: the record, select for this turn, focused view, model](https://homus.dev/photos/UEsl0Q-VAec-0143.jpg)

Từ record, live state chọn ra phần cần cho lượt này, dựng thành focused view, đưa vào model như prompt; câu trả lời và tool call của model được ghi ngược về record.

Đến đây ta bắt đầu thấy chuyện gì có thể xảy ra, vì một lần gọi model đang tới. Ta không muốn trao cả record cho model. Thay vào đó, ta nhìn xem cuộc hội thoại đang ở đâu ngay lúc này, rồi dựng một view gồm: hướng dẫn cho task đang chạy, những tool model được phép dùng, và những fact có liên quan.

## 3. Mỗi lượt một view mới

Model nhận view đó, kèm theo cuộc hội thoại. Rod nói rõ: nên gửi bao nhiêu lịch sử hội thoại là một chủ đề riêng, và tập này chỉ bàn về mọi thứ xung quanh phần lịch sử ấy.

Model làm gì cũng vậy, dù là một câu trả lời hay một tool call, kết quả đều quay về record. Sang lượt tiếp theo, ta lại dựng một view mới tinh.

Vòng lặp của một agent theo cách Rod mô tả: record nằm ngoài prompt, mỗi lần gọi model chỉ nhận một view nhỏ, rồi kết quả lại được ghi vào record.

Đó là cách agent quản lý context. Agent giữ toàn bộ record ở bên ngoài prompt, và với mỗi lần gọi, nó dựng cho model một view nhỏ chỉ chứa những gì lượt này cần.

## 4. Vì sao không gửi hết cho model?

Câu hỏi thứ hai: tại sao không gửi luôn mọi thứ? Rod chiếu một thanh ngân sách token, và nói ngay rằng các con số trên thanh này là bịa ra, chỉ để minh hoạ. Đừng để ý quá nhiều tới kích thước, hãy nhìn xem khối nào nằm trong prompt và khối nào bị đưa ra ngoài.

Bước một là một phiên bản đầy cám dỗ: gửi hết. Persona, các bước của mọi task, mọi fact, và toàn bộ event log. Hôm nay thì nó vẫn vừa. Nhưng log lớn lên sau mỗi lượt, nên lần gọi này cứ phình ra mãi. Prompt lớn hơn thì tốn tiền hơn và chạy lâu hơn. Và chi phí chưa phải là tất cả.

![Thẻ Context Composer: 9,600 trên 12,000 tokens, năm khối đều IN](https://homus.dev/photos/UEsl0Q-VAec-0227.jpg)

Bước 1/3 "Send everything": cả năm khối đều nằm trong prompt, gồm persona and rules 600, active task's steps 900, other tasks' steps 2,600, facts that matter 300 và full event log 5,200, tổng 9,600 trên 12,000 token. Góc dưới thẻ ghi rõ đây là kích thước minh hoạ, không đo thật.

## 5. Bỏ event log thô ra khỏi prompt

Chroma, một công ty làm vector database, đã thử 18 model trên những task được cố tình làm cho thật đơn giản. Họ quan sát thấy: khi input dài ra, hiệu năng tụt xuống. Đây là nghiên cứu "Context Rot" mà Chroma công bố ngày 14/07/2025.

Vậy hãy đưa event log thô ra khỏi prompt. Nó vẫn được lưu, nên không mất gì cả. Model chỉ không phải đọc lại từng tool payload ở mỗi lần gọi. Cũng trong nghiên cứu đó, khi các model chỉ nhận phần liên quan của một cuộc chat dài, model nào cũng làm tốt hơn so với khi nhận toàn bộ cuộc hội thoại. Tất cả đều cải thiện.

![Thẻ Context Composer bước 2: 4,400 trên 12,000 tokens, full event log OUT](https://homus.dev/photos/UEsl0Q-VAec-0343.jpg)

Bước 2/3 "Keep the raw log out": full event log chuyển sang OUT, prompt còn 4,400 trên 12,000 token và phần dành cho bước kế tiếp tăng lên 7,600 token. Log vẫn được lưu, model chỉ không đọc lại nó ở mỗi lần gọi.

## 6. Chỉ giữ task đang chạy: chuyện hành vi, không chỉ kích thước

Bước tiếp theo: chỉ giữ lại task đang chạy. Lần này lý do là hành vi chứ không phải kích thước. Nếu các bước của những task khác vẫn nằm trong prompt, model có thể trộn chúng với nhau.

Rod bảo chắc ai cũng gặp rồi. Giả sử có một giai đoạn xếp lịch (schedule phase), và bạn có hướng dẫn cho ba trường hợp, nhưng lúc này chỉ một trường hợp là đúng. Bạn có hai cách. Cách thứ nhất: đưa cả ba vào, kèm một dòng bảo model hãy bỏ qua những trường hợp không áp dụng. Cách thứ hai: để hai trường hợp kia ra ngoài.

Hai lựa chọn Rod đặt cạnh nhau cho một giai đoạn có ba trường hợp: cách 1 để chữ của các nhánh sai vẫn nằm trong prompt, cách 2 chỉ để lại nhánh đúng.

Tài liệu của Mantle mô tả cái gì hỏng ở cách thứ nhất. Khi mọi nhánh đều được viết thành văn xuôi thuần, model đôi khi chọn sai đường, hoặc hoà hai workflow vào nhau. Nghiên cứu cũng chỉ về cùng một hướng: trong các thử nghiệm có kiểm soát, chỉ cần một câu na ná với câu trả lời đúng là độ chính xác đã giảm. Một dòng bảo "bỏ qua" có thể giúp được phần nào, nhưng chữ thì vẫn còn đó, nó không biến đi.

## 7. Để ra ngoài, đừng bảo model lờ đi

Khi một nhánh bị để ra ngoài, chẳng còn gì để model làm theo do nhầm. Và vì view được dựng lại ở mỗi lần gọi, nhánh đó sẽ quay lại ngay khi state thay đổi.

![Slide so sánh Still in the prompt và Not in the prompt](https://homus.dev/photos/UEsl0Q-VAec-0523.jpg)

Slide "Leave it out. Don't ask the model to ignore it.": bên trái là phần được đưa vào nhưng đánh dấu bỏ qua, vẫn trong tầm với, model vẫn có thể làm theo hoặc trộn với đường đúng; bên phải là phần để ra ngoài, ngoài tầm với, không có gì để làm theo nhầm và nó quay lại khi state đổi.

Rod tóm lại: thứ gì còn trong tầm với, tức vẫn được đưa vào, thì model vẫn có thể làm theo. Thứ gì không có trong prompt thì không ai làm theo nhầm được. Từ đó ra một quy tắc: nếu lượt này không cần thứ gì, hãy để nó ra khỏi view. Không có gì bị mất cả. Nó vẫn nằm trong record, và quay lại đúng lúc một lượt nào đó cần tới nó.

## 8. Live state chọn những gì vào view

Câu hỏi thứ ba: agent chọn những gì model nhìn thấy bằng cách nào? View không phải một bản tóm tắt của record. Nó được lắp ráp mới ở mỗi lần gọi, từ live state. Live state ở đây nghĩa là cuộc hội thoại đang ở đâu ngay lúc này: task nào đang chạy, và những giá trị nào đã được đặt. Live state đưa ra ba lựa chọn.

![Sơ đồ Live state picks what goes in: task instructions, tools allowed now, facts in scope, focused view](https://homus.dev/photos/UEsl0Q-VAec-0623.jpg)

Live state quyết định task instructions (task nào), tools allowed now (những luật nào đang đúng) và facts in scope (phạm vi nào), cả ba gộp lại thành focused view.

Lựa chọn thứ nhất là hướng dẫn nào được đưa vào: chỉ task đang chạy, và chỉ những phần của task đó áp dụng ở thời điểm này.

Lựa chọn thứ hai là tool. Nếu một tool chưa nên chạy, ví dụ khoá thẻ (lock card) khi bạn còn chưa biết là thẻ nào, thì đừng đưa nó cho model. Một tool không được đưa ra là một tool model không thể gọi. Rod gọi đó là rất tiện.

Lựa chọn thứ ba là fact: model nhận những giá trị mà task này cần, không phải mọi giá trị agent từng lưu. Tóm lại, live state chọn mới ở mỗi lượt ba thứ: task nào đang chạy, tool nào được phép ngay lúc này, và fact nào nằm trong phạm vi.

## 9. Rasa Mantle tách hai việc thế nào

Vậy một framework thật làm việc này ra sao? Rod lấy ví dụ Rasa Mantle, một AI orchestrator và là framework mới của Rasa, tập trung vào việc xây dựng AI agent. Anh nói thêm: nếu bạn từng dùng Rasa trước đây, thì đây là một thứ hoàn toàn khác và mới. Phần mã xuất hiện trong video được chép từ tài liệu Mantle, đọc ngày 26/09/2026.

Mantle tách hai việc như sau, và đây cũng là nơi hai thẻ code tiếp theo được lấy ra. Record ở Mantle gọi là **tracker**: một log chỉ ghi thêm (append-only) của mọi thứ xảy ra, gồm tin nhắn, câu trả lời, tool call, và mọi thay đổi của memory. Tài liệu nói thẳng: tracker đầy đủ, và chính vì thế nó không phải thứ model nhìn thấy ở mỗi lượt.

![Sơ đồ Where each turn's prompt comes from trong Mantle](https://homus.dev/photos/UEsl0Q-VAec-0843.jpg)

Cột "you write" gồm skill.md (instructions, tools) và memory.yml (values); cột "Mantle keeps and builds" gồm prompt template có sẵn và tracker ghi mọi event theo thứ tự. Template lắp prompt của lượt này từ skill đã được lọc theo live state và các giá trị trong phạm vi; tracker không đi vào prompt.

View bắt đầu từ những file chính bạn viết. Skill đang hoạt động, tức file `skill.md`, chứa hướng dẫn và tool của nó. Memory của skill, file `memory.yml`, khai báo những giá trị nó giữ. Mỗi lượt, Mantle dựng prompt từ một template: điền vào đó skill đang hoạt động, đã lọc theo live state, cùng những giá trị memory mà skill được đọc. Tracker nói chung thì không được gửi đi.

## 10. skill.md: tool bị khoá và đoạn văn có điều kiện

Xem skill trước. Thẻ code trên màn hình là file `skills/card_replace/skill.md` lấy từ tài liệu Rasa, trang Scoped Instructions. Bản trên màn hình đã được cắt gọn cho đơn giản; mỗi dấu ba chấm đánh dấu một chỗ cắt. File này nằm trong thư mục `your agent/skills/card_replace/`, là file bạn tự viết.

```
tool_constraints:
- lock_card:
requires: "session.card_replace.selected_card_id"
…
Help the customer replace a credit card.
…
if: session.card_replace.replacement_reason == 'damaged'
Ask who needs a replacement: just the customer's card, …

if: session.card_replace.replacement_reason == 'stolen'
Tell the customer the card will be locked for their protection. …
```

Một file này giữ hai trong số ba bộ chọn của phần trước. Thứ nhất là phần front matter: `lock_card` yêu cầu đã có một `selected_card_id`. Khi giá trị đó chưa được đặt, model hoàn toàn không được đưa tool này, và điều kiện còn được kiểm lại một lần nữa trước khi tool chạy.

![Thẻ code skill.md với chú thích hidden until a card is chosen](https://homus.dev/photos/UEsl0Q-VAec-0903.jpg)

Bước 1/3 "Tools are offered only when allowed": dòng `lock_card` được chú thích "hidden until a card is chosen" và "checked again before it runs". Bên trái là cây thư mục: skill.md do bạn viết, còn 02_skill_active_prose.jinja2 do Mantle dựng sẵn và render mỗi lượt.

Đoạn "Help the customer replace a credit card." không có marker nào, nên nó có mặt trong prompt ở mọi lượt của skill này. Mỗi marker `if:` chỉ áp phạm vi cho đúng một đoạn văn nằm ngay dưới nó. Khi lý do thay thẻ (replacement reason) còn chưa được đặt, mọi nhánh đều hiện ra, nhờ vậy model có thể hỏi khách. Một khi model đã ghi lại lý do, lần dựng prompt kế tiếp sẽ gỡ đi những nhánh không khớp.

![Thẻ code skill.md với chú thích stripped once another reason is set và kept when the model records stolen](https://homus.dev/photos/UEsl0Q-VAec-0943.jpg)

Bước 3/3 "Marked paragraphs are in only when true": nhánh 'damaged' được chú thích "stripped once another reason is set", nhánh 'stolen' được chú thích "kept when the model records stolen".

Rod cho một câu kiểm tra nhanh: lý do là stolen, và chưa có thẻ nào được chọn. Vậy cái gì tới được model? Trả lời: mọi đoạn không có marker, cộng với đoạn của nhánh stolen, và chưa có tool lock card.

## 11. Prompt template dựng lại view mỗi lượt

Và đây là nơi view được lắp ráp. Mantle công khai các prompt template của nó. Template trên màn hình là template dùng cho một lượt có một skill dạng prose đang hoạt động, file `02_skill_active_prose.jinja2`, lấy từ trang Prompt Templates; dấu ba chấm là chỗ đã cắt.

```
## Active Skill: {{ skill.name }}
{{ skill.description }}
…
{% if skill.instructions %}

### Instructions:
{{ skill.instructions }}
{% endif %}
…
{% if skill.memory_lines %}

### Memory:
{% for item in skill.memory_lines %}
- {{ item }}
{% endfor %}
{% endif %}
```

Trang System Prompt của tài liệu Mantle cho biết prompt có một tập section cố định, và chúng vào theo một thứ tự cố định ở mọi lượt. Những section ổn định như persona và rules đi trước; những phần riêng của từng lượt, như skill đang hoạt động này, đi sau cùng. Tài liệu nói thứ tự đó giúp prompt cache của nhà cung cấp model luôn "ấm" qua các lượt. Rod nói rõ là trong video họ không tự đo điều này.

![Thẻ code 02_skill_active_prose.jinja2 với chú thích only the active skill](https://homus.dev/photos/UEsl0Q-VAec-1023.jpg)

Bước 1/3 "One skill, the active one": dòng `## Active Skill: {{ skill.name }}` được chú thích "only the active skill"; prompt chỉ render skill nằm trên cùng của stack.

Template này render đúng một skill, skill đang hoạt động, chứ không phải mọi skill agent có. Phần Instructions chính là những hướng dẫn vừa xem ở trên, sau khi các marker `if:` đã lọc xong. Thêm vào đó là các dòng memory. Kết quả là view của từng lượt, được dựng mới từ live state.

## 12. Xem một lượt thật trong Inspector

Tiếp theo là một lượt trong Rasa Inspector, chụp từ một lần chạy thật (theo phần mô tả video, chụp ngày 29/09/2026). Panel ở giữa là những gì skill đang hoạt động mang vào lượt này: hướng dẫn của nó và một tool duy nhất đang dùng được. Panel bên phải là memory trong phạm vi. Toàn bộ cuộc hội thoại ở bên trái là record. Model làm việc với phần đã chọn lọc.

![Rasa Inspector: hội thoại bên trái, skill View Transactions ở giữa, Memory bên phải](https://homus.dev/photos/UEsl0Q-VAec-1123.jpg)

Inspector với một agent ngân hàng mẫu: bên trái là hội thoại về các giao dịch gần đây; ở giữa là active skill "View Transactions" với các bước hướng dẫn và available tool duy nhất `get_recent_transactions`; bên phải là History và Memory với `selected_account_label` và `selected_account_id`.

Và không cần code cho bất kỳ việc nào trong số này. Ai trong team cũng mở được Inspector, kể cả những người không viết code: họ có thể nói chuyện với agent và kiểm xem mỗi lượt đang làm việc với những gì. Rod thấy điều đó rất thực tế và tiện. Anh chỉ lại từng phần: skill đang hoạt động với hướng dẫn và các tool dùng được của nó, rồi phần memory trong phạm vi của skill này. Dòng chữ trên màn hình tóm lại: không cần code, cứ nói chuyện với agent, rồi đọc xem nó đã làm gì.

## 13. Bài audit ba câu hỏi cho agent của bạn

Đây là một bài kiểm tra bạn tự chạy được trên agent của mình. Chọn bất kỳ thứ gì agent đang giữ, rồi hỏi ba câu.

![Slide Audit any value your agent stores với ba câu hỏi](https://homus.dev/photos/UEsl0Q-VAec-1243.jpg)

Slide "Audit any value your agent stores": ba câu hỏi kèm gợi ý trả lời; dòng cuối ghi rằng trong Mantle, tracker giữ record còn scoped prompt là view.

Câu một: nó được giữ ở đâu? Chỉ nằm trong record, hay nằm trong live state, nơi nó có thể đi vào view. Câu hai: cái gì chọn nó? Task, một luật của tool, hay một phạm vi memory. Câu ba, câu quan trọng nhất: model có thấy nó ở lần gọi kế tiếp không? Slide trả lời: chỉ khi live state chọn nó. Rod bảo hãy bắt đầu từ câu này.

## 14. Tự thử với Rasa Mantle, và tập tiếp theo

Muốn tự thử, hãy bắt đầu từ trang Getting Started của Rasa Mantle. Bạn chạy `rasa init` với engine Mantle; nó dựng một starter agent, cùng loại với agent vừa xem, và mở Inspector. Sau đó bạn nói chuyện với agent và xem mỗi lượt đang làm việc với những gì. Trang tài liệu trên màn hình ghi lệnh như sau:

```
rasa init --engine mantle
```

![Trang mantle.rasa.com/getting-started, mục Create a project](https://homus.dev/photos/UEsl0Q-VAec-1256.jpg)

Trang Getting Started, mục "2. Create a project": lệnh khởi tạo, năm việc wizard làm (hỏi nơi tạo project, lấy key và ghi vào .env, cài skill tương thích Cursor và Claude Code, kiểm tra và train agent, mở Inspector), và cấu trúc project gồm agent.yml, integrations.yml, AGENTS.md, .env cùng thư mục skills/view_transactions/ với skill.md, memory.yml, tools.py.

Bạn sẽ cần một Rasa license key. Theo Rod, tính đến lúc video đăng (01/10/2026), key này miễn phí cho developer và bạn nhận được ngay, nên có thể thử ngay sau khi xem video. Trang Getting Started cũng ghi rằng bạn cần thêm API key của nhà cung cấp model, và Mantle còn đang ở giai đoạn pre-release (tài liệu đọc ngày 19/10/2026).

Tóm lại, đó là context engineering: giữ record, gửi một focused view. Trong Mantle, view đó được dựng quanh skill đang hoạt động. Điều này dẫn tới câu hỏi tiếp theo: agent skill là gì? Đó là chủ đề của tập sau.

Cuối video, Rod mời người xem like, subscribe và tham gia cộng đồng Rasa trên Discord, nơi mọi người trao đổi hằng ngày về cách xây voice AI agent chắc chắn, đáng tin cậy và hiệu năng tốt.

## Nguồn và liên kết

- Tên gốc: Context Engineering for AI Agents: Keep the Record, Send a Focused View
- Sự kiện: [YouTube](https://homus.dev/events/youtube)
- Video gốc: [https://www.youtube.com/watch?v=UEsl0Q-VAec](https://www.youtube.com/watch?v=UEsl0Q-VAec)

- Kênh YouTube Rasa (Rod Rivera): [youtube.com/channel/UCJ0V6493mLvqdiVwOKWBODQ](https://www.youtube.com/channel/UCJ0V6493mLvqdiVwOKWBODQ)

- Rasa Mantle, Getting Started (cài đặt, `rasa init --engine mantle`, cấu trúc project): [mantle.rasa.com/getting-started](https://mantle.rasa.com/getting-started)

- Mantle, Context Management (tracker là log append-only, nguồn sự thật của agent): [mantle.rasa.com/mantle/context](https://mantle.rasa.com/mantle/context)

- Mantle, System Prompt (thứ tự section cố định, giữ prompt cache ấm qua các lượt): [mantle.rasa.com/reference/system-prompt](https://mantle.rasa.com/reference/system-prompt)

- Mantle, Execution Loop: [mantle.rasa.com/reference/execution-loop](https://mantle.rasa.com/reference/execution-loop)

- Mantle, Scoped Instructions (marker `if:`, ví dụ skill Card Replace): [mantle.rasa.com/build-guide/scoped-instructions](https://mantle.rasa.com/build-guide/scoped-instructions)

- Mantle, Prompt Templates: [mantle.rasa.com/reference/prompt-templates](https://mantle.rasa.com/reference/prompt-templates)

- Kelly Hong, Anton Troynikov và Jeff Huber, "Context Rot: How Increasing Input Tokens Impacts LLM Performance", Chroma, 14/07/2025: [trychroma.com/research/context-rot](https://www.trychroma.com/research/context-rot)

- Rasa: [rasa.com](https://rasa.com) · Prof Rod: [profrod.ai](https://profrod.ai)

Nguồn: https://homus.dev/talks/context-engineering-for-ai-agents-keep-the-record-send-a-focused-view · cập nhật 2026-10-19
