·

Một cuộc hội thoại (conversation) nhiều lượt (multi-turn) với AI agent hay LLM không phải là một khối tĩnh — nó có "sự sống" của riêng nó. Nó bắt đầu từ con số 0, tích lũy dần ngữ cảnh (context) qua từng lượt trao đổi (turn), và đến một thời điểm nào đó, chính phần ngữ cảnh đã tích lũy lại quay ngược trở thành gánh nặng: chi phí token tăng vọt, câu trả lời trôi dạt (drift) khỏi mục tiêu ban đầu, và độ liên quan của model với vấn đề hiện tại giảm sút rõ rệt.

Kỹ năng cốt lõi mà bài này muốn trang bị là khả năng ra quyết định đúng lúc: khi nào nên continue — tiếp tục trong cùng một thread, khi nào nên reset — đóng lại và mở một conversation hoàn toàn mới, và khi nào nên fork — tách ra một nhánh hội thoại song song mà không đánh mất thread gốc. Đây không phải là một quyết định one-time, mà là một phản xạ cần rèn luyện, giống như một senior engineer biết khi nào nên commit, khi nào nên rebase, và khi nào nên tạo branch mới.

Với ai làm việc thường xuyên với ChatGPT, Claude, Cursor, GitHub Copilot Chat hay bất kỳ AI agent nào theo mô hình multi-turn, việc không kiểm soát lifecycle của conversation là một trong những nguyên nhân âm thầm nhất gây lãng phí token — không phải vì một prompt tệ, mà vì hàng chục turn tích lũy ngữ cảnh không còn giá trị nhưng vẫn bị gửi lại cho model đọc lại mỗi lần.

Giải phẫu Lifecycle của một Conversation

Để ra quyết định đúng, trước tiên cần hiểu một conversation trải qua những giai đoạn nào, và tại sao chi phí token cùng chất lượng phản hồi lại thay đổi theo từng giai đoạn đó.

Giai đoạn 1 — Cold start (khởi động lạnh). Đây là lúc context window (vùng nhớ ngữ cảnh mà model có thể "nhìn thấy" tại một thời điểm) gần như trống. Model chưa có gì để tham chiếu ngoài system prompt và turn đầu tiên của bạn. Chi phí token ở giai đoạn này thấp, nhưng chất lượng phản hồi phụ thuộc hoàn toàn vào việc bạn cung cấp đủ ngữ cảnh nền (background context) hay chưa. Nhiều người mắc lỗi ở đây: hỏi quá tắt, thiếu thông tin, rồi phải dùng nhiều turn sau đó chỉ để bổ sung — vô tình kéo dài giai đoạn cold start lâu hơn cần thiết.

Giai đoạn 2 — Vùng năng suất (productive middle). Đây là giai đoạn "vàng" của conversation. Context đã đủ để model hiểu vấn đề, các turn tiếp theo xây dựng chồng lên nhau một cách có ý nghĩa (mỗi câu hỏi mới thực sự cần các câu trả lời trước), và tỷ lệ giá trị/token đạt mức cao nhất. Trong giai đoạn này, việc continue là lựa chọn tối ưu gần như tuyệt đối.

Giai đoạn 3 — Suy giảm (degradation phase). Đây là giai đoạn nguy hiểm nhất và cũng là trọng tâm của bài học này. Khi context window ngày càng đầy, ba hiện tượng xảy ra đồng thời:

  1. Attention dilution (pha loãng sự tập trung): Cơ chế attention của LLM phải "chia sẻ" sự chú ý cho một lượng token ngày càng lớn. Về mặt lý thuyết, model vẫn "nhìn thấy" toàn bộ lịch sử, nhưng về mặt thực nghiệm, những chi tiết quan trọng ở giữa một context dài thường bị model đánh giá thấp hơn các chi tiết ở đầu hoặc cuối (hiện tượng này thường được gọi là "lost in the middle").
  2. Stale context (ngữ cảnh đã cũ/lỗi thời): Những quyết định, giả định, hay đoạn code đã được thảo luận ở turn thứ 5 có thể đã bị thay đổi ở turn thứ 15, nhưng bản cũ vẫn còn nằm trong lịch sử. Model có thể vô tình tham chiếu lại thông tin cũ đó.
  3. Boilerplate lặp lại: Mỗi turn mới, toàn bộ lịch sử hội thoại (hoặc một phần lớn của nó, tùy cách hệ thống quản lý context) phải được gửi lại cho model xử lý lại từ đầu. Một đoạn code dài được paste ở turn 3 sẽ tiếp tục "ngốn" token ở turn 20, dù nó không còn liên quan trực tiếp đến câu hỏi hiện tại.

Giai đoạn 4 — Cuối đời (end-of-life). Đây là điểm mà chi phí duy trì conversation vượt quá giá trị nó mang lại. Context window có thể đã gần chạm giới hạn (buộc hệ thống phải cắt bớt lịch sử — truncation, đôi khi cắt sai chỗ), hoặc chất lượng phản hồi đã giảm đến mức không còn đáng tin cậy. Đây chính là điểm mà quyết định reset hoặc fork cần được đưa ra.

Hiểu rõ 4 giai đoạn này giúp bạn nhận ra: "quản lý lifecycle" không phải là một hành động phản ứng khi mọi thứ đã tệ, mà là một quá trình quan sát liên tục để can thiệp đúng lúc — trước khi giai đoạn suy giảm kéo bạn xuống.

Mẹo:
- Nếu công cụ bạn dùng có hiển thị chỉ số phần trăm context window đã dùng (ví dụ Claude Code, Cursor), hãy tập thói quen nhìn con số này như nhìn dung lượng ổ đĩa — đừng để nó chạm 90% rồi mới hành động.
- Với các task dài, hãy chủ động chia nhỏ ngay từ đầu (ví dụ: "Chúng ta sẽ làm việc này theo 3 giai đoạn, mỗi giai đoạn tôi sẽ mở lại context") để tự thiết kế các điểm reset tự nhiên.

Ba Quyết định Lifecycle: Continue, Reset, hay Fork

Continue

Continue là lựa chọn mặc định và nên là lựa chọn phổ biến nhất trong một ngày làm việc — nhưng chỉ khi ba điều kiện sau còn đúng: (1) task hiện tại vẫn gắn chặt (tightly coupled) với những gì đã trao đổi ở các turn trước, (2) phần lớn ngữ cảnh đã tích lũy vẫn còn liên quan trực tiếp đến câu hỏi kế tiếp, và (3) chi phí token phải trả để model "đọc lại" toàn bộ lịch sử vẫn còn xứng đáng so với giá trị nhận được.

Ví dụ cụ thể: bạn đang yêu cầu AI agent viết một hàm xử lý validate input, sau đó hỏi tiếp "giờ viết unit test cho hàm đó", rồi "sửa test case số 3 vì thiếu edge case null". Đây là một chuỗi turn có tính liên tục cao — mỗi turn phụ thuộc trực tiếp vào turn trước. Nếu bạn reset ở giữa chuỗi này, bạn sẽ phải dán lại toàn bộ hàm và giải thích lại ngữ cảnh — tốn token hơn là tiếp tục.

Dấu hiệu để nhận biết nên continue: bạn có thể trả lời "có" cho câu hỏi "câu hỏi tiếp theo của tôi có cần model nhớ ít nhất một quyết định/đoạn code/giả định đã nêu trước đó không?".

Reset

Reset là hành động chủ động kết thúc một session và mở một conversation hoàn toàn mới với context window sạch. Đây không phải là thất bại hay "bỏ cuộc" — đó là một quyết định kỹ thuật có chủ đích, giống như việc bạn chủ động "flush cache" khi biết cache đã lỗi thời.

Ba tín hiệu chính nên reset:

  1. Đổi chủ đề hoàn toàn. Bạn vừa xong việc debug một lỗi authentication, và giờ chuyển sang viết tài liệu API cho một module khác không liên quan. Không có lý do gì để giữ lại 40 turn về authentication trong context khi làm việc với documentation.
  2. Drift/nhiễu đã tích lũy đến mức phản tác dụng. Nếu bạn nhận thấy model liên tục nhắc lại các hướng giải quyết đã bị bạn bác bỏ, hoặc trộn lẫn các giả định từ nhiều nhánh thảo luận khác nhau, đó là dấu hiệu context đã "bẩn" — tiếp tục sẽ chỉ khiến vấn đề nặng thêm (nội dung chi tiết về hiện tượng drift này được đề cập sâu ở bài riêng trong module này).
  3. Context window sắp đầy. Khi chỉ số sử dụng context tiến gần giới hạn, hệ thống buộc phải cắt bớt lịch sử cũ — và việc cắt này thường không thông minh bằng việc bạn tự quyết định giữ gì, bỏ gì.

Reset có trách nhiệm nghĩa là không xóa sạch rồi bắt đầu lại từ số 0 một cách ngây thơ. Trước khi đóng session, hãy dành một turn cuối để yêu cầu model tóm tắt lại các quyết định quan trọng, trạng thái hiện tại, và các việc còn tồn đọng — đây chính là cơ chế checkpoint (điểm lưu trạng thái), một kỹ thuật được trình bày chi tiết ở bài "Conversation Checkpointing" riêng trong module này. Ở bài này, bạn chỉ cần nhớ nguyên tắc: reset không có checkpoint = mất trắng kiến thức đã xây dựng.

Ví dụ prompt trước khi reset:

Trước khi mình kết thúc session này, hãy tóm tắt lại:
1. Kiến trúc/giải pháp cuối cùng đã chốt
2. Các quyết định quan trọng và lý do (kèm các phương án đã bị loại bỏ, để tránh đề xuất lại)
3. Các việc còn chưa hoàn thành
Giữ bản tóm tắt dưới 200 từ, dạng bullet point, để tôi paste vào conversation mới.

Fork

Fork là việc tách một conversation thành một nhánh song song, giữ nguyên thread gốc còn sống. Khác với reset (đóng hẳn thread cũ), fork cho phép bạn giữ lại toàn bộ ngữ cảnh đã tích lũy và dùng nó làm điểm khởi đầu cho một hướng đi khác, mà không sợ "làm bẩn" cuộc hội thoại chính.

Tình huống điển hình: bạn đang có một thread dài để thiết kế kiến trúc hệ thống, đã đi đến 80% thống nhất về phương án A. Nhưng bạn muốn thử nghiệm nhanh phương án B để so sánh, trong khi vẫn muốn giữ nguyên mạch thảo luận của phương án A để có thể tiếp tục ngay nếu B không ổn. Đây chính là lúc fork — sao chép/tiếp tục từ trạng thái hiện tại sang một thread mới, thử nghiệm B ở đó, và quay lại thread A nếu cần.

Trade-off cần cân nhắc:

  • So với reset: Fork giữ lại cả hai context, nghĩa là bạn phải trả token cho cả hai thread nếu tiếp tục dùng chúng song song. Reset thì "sạch" hơn về chi phí, nhưng bạn mất khả năng dễ dàng quay lại thread cũ với đầy đủ ngữ cảnh chi tiết.
  • So với continue: Fork tránh được việc pha trộn (pollution) hai hướng thảo luận khác nhau vào cùng một thread — nếu bạn tiếp tục thảo luận cả A và B trong một conversation duy nhất, model dễ nhầm lẫn giữa hai phương án, và bạn cũng khó lọc lại quyết định cuối cùng.

Nói cách khác: fork là công cụ dùng khi giá trị của việc giữ nguyên context (để không phải giải thích lại) lớn hơn chi phí phải trả gấp đôi cho hai thread song song — thường đúng với các quyết định có độ rủi ro cao hoặc cần so sánh nhiều phương án.

Mẹo (chung cho 3 quyết định):
- Đặt câu hỏi tự vấn nhanh trước mỗi turn dài: "Nếu tôi mở conversation mới ngay bây giờ, tôi sẽ mất gì?" — nếu câu trả lời là "không nhiều", nghiêng về reset; nếu là "rất nhiều nhưng tôi cũng cần thử hướng khác", nghiêng về fork.
- Không phải công cụ nào cũng hỗ trợ fork native (một số chỉ hỗ trợ "duplicate conversation"). Nếu công cụ không hỗ trợ, bạn có thể tự fork bằng cách copy toàn bộ nội dung thread hiện tại sang một session mới trước khi rẽ nhánh.

Khung Quyết định: Ma trận Trigger cho Lifecycle

Để biến ba khái niệm trên thành phản xạ thực tế, dưới đây là ma trận các tín hiệu (trigger signal) thường gặp, ánh xạ sang hành động khuyến nghị:

Tín hiệu quan sát được Hành động khuyến nghị Lý do
Context window đã dùng < 50%, task vẫn cùng chủ đề Continue Chi phí đọc lại lịch sử còn thấp, giá trị liên kết ngữ cảnh còn cao
Context window đã dùng > 80% Reset (có checkpoint) Sắp bị truncation tự động, rủi ro mất ngữ cảnh quan trọng theo cách không kiểm soát được
Chủ đề/task hoàn toàn không liên quan đến các turn trước Reset Giữ lại lịch sử cũ chỉ tốn token, không mang lại giá trị
Model lặp lại đề xuất đã bị bác bỏ, hoặc nhầm lẫn giữa các quyết định Reset Dấu hiệu drift — tiếp tục sẽ khiến model càng "rối", không tự phục hồi
Task hiện tại đã hoàn thành (bug đã fix, tài liệu đã chốt) Reset Không có lý do giữ context "chờ" cho task tiếp theo không liên quan
Cần khám phá 2+ phương án thay thế cho cùng một vấn đề, muốn giữ cả hai để so sánh Fork Tránh trộn lẫn nhánh thảo luận, vẫn giữ khả năng quay lại nhánh gốc
Cần chia một vấn đề lớn thành các sub-investigation độc lập (ví dụ: điều tra 3 nguyên nhân khả năng gây lỗi khác nhau) Fork (nhiều nhánh) Mỗi nhánh cần tập trung sâu vào một giả thuyết mà không bị "nhiễu" bởi các giả thuyết khác
Câu hỏi tiếp theo cần model nhớ chi tiết cụ thể đã trao đổi (code, số liệu, quyết định) Continue Reset hoặc fork ở đây sẽ buộc phải giải thích lại — tốn kém hơn continue
Đang lặp vòng lỗi (model sửa lỗi A tạo ra lỗi B, sửa B lại ra lỗi A) Reset Vòng lặp thường là hệ quả của context đã tích lũy giả định sai; context mới với mô tả lại vấn đề từ đầu thường phá được vòng lặp

Ma trận này không cố định — hãy xem nó như một checklist nhanh để tự vấn trước khi gõ turn tiếp theo, không phải một quy tắc cứng phải tuân theo 100%.

Mẹo:
- In (hoặc lưu) ma trận này ở nơi dễ thấy trong 2 tuần đầu luyện tập — sau đó việc nhận diện tín hiệu sẽ trở thành phản xạ tự nhiên, không cần tra bảng nữa.
- Với các công cụ không hiển thị % context window, hãy dùng số lượng turn hoặc số dòng code đã trao đổi làm proxy (ví dụ: sau khoảng 25-30 turn kỹ thuật sâu, tự đặt câu hỏi có nên reset).

Quản lý Lifecycle Thực tế theo từng Vai trò

Software Engineers

Một buổi debug hoặc pair-programming với AI agent thường kéo dài và dễ rơi vào giai đoạn suy giảm mà không nhận ra, vì mỗi turn "có vẻ" vẫn liên quan (cùng codebase). Nhưng thực tế, một session debug một bug cụ thể và một session implement feature tiếp theo là hai "đơn vị công việc" khác nhau về bản chất.

Nguyên tắc thực hành: reset sau mỗi lần đóng một issue/bug fix, kể cả khi feature tiếp theo nằm trong cùng file. Ví dụ, sau khi fix xong lỗi race condition trong hàm processQueue(), trước khi chuyển sang task tiếp theo là "thêm retry logic cho API call", hãy reset và mở lại với một prompt ngắn cung cấp đúng ngữ cảnh cần thiết:

Context: File `queue-processor.ts`, hàm processQueue() vừa được fix race condition
(dùng mutex lock ở dòng 42-58, đã merge vào branch feature/queue-fix).
Task mới: Thêm retry logic (exponential backoff, max 3 lần) cho API call ở hàm
fetchQueueItem() trong cùng file. Không cần đọc lại lịch sử debug trước đó.

Khi cần fork: giả sử bạn đang có một thread dài để tối ưu performance của một API endpoint, đã thống nhất hướng "thêm caching layer". Nhưng bạn muốn thử nhanh một hướng khác — "denormalize database schema" — để so sánh độ phức tạp implement. Đây là lúc fork: mở một thread mới bắt đầu từ trạng thái hiện tại, đặt câu hỏi rõ ràng:

Đây là nhánh thử nghiệm phương án thay thế. Bối cảnh giống thread chính:
endpoint GET /orders đang chậm do N+1 query. Thread chính đang đi theo hướng
caching layer (Redis). Ở nhánh này, tôi muốn khám phá hướng denormalize
database schema thay thế — không cần nhắc lại phương án caching, tập trung
phân tích trade-off của denormalization.

QA Engineers

QA thường chuyển đổi giữa các "cấp độ" test khác nhau — unit, integration, end-to-end — và mỗi cấp độ đòi hỏi một bộ ngữ cảnh khác nhau (unit test cần biết chi tiết implementation, E2E test cần biết user flow và business logic). Việc giữ nguyên một thread khi chuyển cấp độ test thường khiến model trộn lẫn mức độ chi tiết, dẫn đến test case sai tầm.

Nguyên tắc thực hành: reset khi chuyển cấp độ test (unit → integration → E2E), dù vẫn đang test cùng một feature. Ví dụ:

[Đóng thread unit test cho module PaymentValidator, mở thread mới]

Context: Feature thanh toán online, đã có đầy đủ unit test cho PaymentValidator
(coverage 95%, các case: valid card, expired card, insufficient fund).
Task mới: Thiết kế test case cho E2E flow "user thanh toán thành công",
từ bước chọn sản phẩm đến nhận email xác nhận. Không cần chi tiết
implementation của PaymentValidator, chỉ cần biết nó tồn tại và đã được
unit test đầy đủ.

Khi cần fork: bạn đang xây dựng test strategy chính cho một feature theo hướng "risk-based testing" (tập trung vào các luồng có rủi ro cao), nhưng muốn khám phá song song một chiến lược thay thế là "exploratory testing session" để so sánh độ bao phủ (coverage) giữa hai cách tiếp cận trước khi chốt kế hoạch chính thức với team. Fork sang một thread riêng để thử nghiệm exploratory testing, giữ nguyên thread risk-based testing để không mất công đã xây dựng.

Product Managers

PM thường làm việc với nhiều tài liệu song song — PRD cho feature X, roadmap cho quý tới, tài liệu phân tích đối thủ — và dễ mắc lỗi giữ tất cả trong một conversation "chung" vì tiện. Đây chính là cách nhanh nhất khiến context bị pha trộn: model có thể vô tình lấy chi tiết từ PRD feature X để trả lời câu hỏi về roadmap.

Nguyên tắc thực hành: một conversation cho một tài liệu/feature. Khi chuyển từ soạn PRD cho "tính năng thông báo push" sang soạn PRD cho "tính năng export báo cáo", hãy reset:

[Đóng thread PRD "Push Notification", mở thread mới]

Task: Soạn PRD cho tính năng "Export báo cáo dạng Excel". Đối tượng người
dùng: admin doanh nghiệp. Không liên quan đến tính năng Push Notification
đã thảo luận ở thread khác — bắt đầu từ đầu với: mục tiêu, user story,
acceptance criteria.

Khi cần fork: bạn đang có thread PRD chính cho một feature theo hướng "subscription model", đã được stakeholder duyệt sơ bộ 70%. Nhưng bạn muốn khám phá một hướng đi khác — "one-time purchase model" — để chuẩn bị phương án dự phòng nếu leadership không đồng ý hướng subscription. Fork giúp bạn giữ nguyên PRD chính (đã đầu tư nhiều turn xây dựng), đồng thời phát triển phương án thay thế mà không sợ làm rối tài liệu chính:

Đây là nhánh khám phá phương án dự phòng. Giữ nguyên bối cảnh sản phẩm
(app quản lý tài chính cá nhân, target user là người 25-35 tuổi) từ
thread chính. Ở nhánh này, hãy giúp tôi phác thảo PRD theo hướng
one-time purchase thay vì subscription — so sánh ưu/nhược điểm ở cuối.

Mẹo (chung cho phần persona):
- Bất kể vai trò nào, hãy tập thói quen đặt tên rõ ràng cho mỗi thread/session (ví dụ: "PRD - Push Notification - v1", "Debug - queue race condition") — việc này giúp bạn tự nhận ra khi nào một thread đã "quá tải" nhiều chủ đề và cần được tách/reset.
- Với các task lặp lại hàng ngày (standup summary, test report), hãy tạo sẵn một prompt template ngắn để mở lại context nhanh sau mỗi lần reset, tránh phải viết lại từ đầu mỗi ngày.

Nhận diện "Thời điểm cần Reset" trong Thời gian Thực

Ma trận trigger ở trên hữu ích để lên kế hoạch, nhưng trong lúc đang làm việc, bạn cần những tín hiệu quan sát được ngay tại thời điểm đó — không cần dừng lại để tính toán % context window. Dưới đây là những dấu hiệu thực tế, dễ nhận ra:

  • Bạn phải lặp lại chính mình. Nếu bạn thấy mình đang gõ lại một yêu cầu, một ràng buộc, hay một thông tin mà bạn chắc chắn đã nói ở turn trước ("nhắc lại là dùng TypeScript strict mode nha"), đó là dấu hiệu rõ ràng model đã "quên" hoặc đánh giá thấp thông tin đó trong context dài — thời điểm để reset.
  • Model tham chiếu lại quyết định đã lỗi thời. Ví dụ bạn đã chuyển từ dùng REST sang GraphQL ở turn 12, nhưng đến turn 30 model vẫn đề xuất thêm REST endpoint. Đây là stale context điển hình.
  • Câu trả lời chậm hơn, kém chính xác hơn một cách rõ rệt. Dù đây là cảm nhận chủ quan, nhưng nếu bạn có kinh nghiệm dùng công cụ đủ lâu, bạn sẽ nhận ra "cảm giác" khi model bắt đầu trả lời chung chung hơn, ít bám sát chi tiết cụ thể của project hơn.
  • Chỉ báo context window (nếu công cụ có hiển thị) đang tiến gần giới hạn. Đây là tín hiệu định lượng đáng tin cậy nhất khi có sẵn.
  • Model bắt đầu "confused" giữa nhiều nhánh thảo luận đã diễn ra trong cùng thread — ví dụ trộn lẫn chi tiết của phương án A và phương án B mà bạn đã lần lượt thảo luận và loại bỏ.

Ví dụ đoạn hội thoại minh họa thời điểm cần reset:

Bạn: Giờ áp dụng lại logic retry mình đã bàn ở trên cho hàm uploadFile()
AI: Bạn có thể clarify logic retry nào? Trong conversation này mình thấy
    có nhắc đến retry cho fetchData() (3 lần, backoff tuyến tính) và
    cũng có nhắc một lần về retry cho API call chung (5 lần, backoff
    exponential) — không chắc bạn muốn áp dụng cái nào.

Khi model phải hỏi lại để "làm rõ giữa các phương án bạn đã tự chốt từ trước", đó chính là bằng chứng context đã quá tải và cần reset — không phải lỗi của model, mà là hệ quả tự nhiên của một context window chứa quá nhiều nhánh thông tin chưa được dọn dẹp.

Mẹo:
- Đừng chờ đến khi model "báo lỗi" rõ ràng như ví dụ trên mới reset — hãy chủ động reset ngay khi bạn cảm thấy mình đang phải giải thích lại điều gì đó lần thứ hai.
- Nếu không chắc có nên reset hay chưa, hãy thử hỏi thẳng model: "Bạn có đang giữ được đầy đủ ngữ cảnh về [X] không, hay tôi cần nhắc lại?" — câu trả lời (và tốc độ/độ chắc chắn của nó) thường tự nói lên vấn đề.

Tổng kết

Quản lý lifecycle của một conversation là kỹ năng ra quyết định giữa ba lựa chọn — continue khi ngữ cảnh vẫn còn giá trị và task còn gắn chặt với lịch sử, reset khi ngữ cảnh đã trở thành gánh nặng token hoặc nguồn gây drift, và fork khi bạn cần khám phá một hướng đi mới mà không muốn đánh đổi ngữ cảnh đã tích lũy ở thread chính.

Ma trận trigger cung cấp một bộ tiêu chí định lượng và định tính để ra quyết định nhanh, còn kỹ năng "nhận diện thời điểm reset trong thời gian thực" giúp bạn phản ứng ngay trong lúc làm việc, thay vì chỉ nhìn lại sau khi đã lãng phí hàng chục nghìn token cho một context đã suy giảm chất lượng từ lâu.

Về mặt tối ưu token, đây là một trong những kỹ năng có ROI cao nhất trong toàn bộ module: một quyết định reset đúng lúc có thể cắt giảm chi phí của hàng chục turn tiếp theo (vì mỗi turn không còn phải "trả tiền" đọc lại lịch sử không liên quan), còn một quyết định fork đúng lúc giúp bạn tránh phải trả giá bằng việc giải thích lại toàn bộ ngữ cảnh khi muốn thử một hướng đi khác. Nắm vững kỹ năng này chính là nền tảng để các kỹ thuật sâu hơn trong module — checkpointing, quản lý drift, và điều phối parallel conversation — phát huy hết tác dụng.