Vòng lặp agent tự cải thiện: từ dấu vết tới PR
TL;DR
- Vòng lặp agent tự cải thiện (hill-climbing) là tầng vòng lặp thứ 4: loop 1–3 tự động hoá phần việc; loop này đọc chính dấu vết vòng lặp để lại và đề xuất một bản sửa cho chính cái harness.
- Hai quy tắc cứng (hard rule) giữ nó an toàn: agent phân tích đề xuất một diff (nó không bao giờ tự sửa harness), và thay đổi ship qua review của người (một PR). Vòng lặp không bao giờ tự viết lại luật của mình khi không ai trông.
- Ví dụ thật: một lượt trên bốn lần chạy của gap-log loop tìm ra bộ phân loại rẻ tiền đang gọi người cho những gap vốn đã xong, và đề xuất một nhóm no-action đóng tự động 2 trên 3. Bạn sẽ chạy đúng hình dạng đó.
📊 Bằng chứng kết quả. Sau khi áp diff đề xuất, chạy lại bộ phân loại đã vá trên đúng ba trường hợp false-open có thật trên đĩa. Kết quả:
no-action,no-action,open. Hai gap đã xong (LevelGrid, Astro loader) giờ tự đóng; trường hợp thứ ba (LevelHero) giữ open theo thiết kế; nhómdesign-actionkhông đổi nên không có regression. Hai trên ba, đã verify, không phải ba trên ba.
Phần 9 của loạt Loop Engineering kết bằng một cảnh báo: một vòng lặp ship code bạn không viết, và nợ hiểu biết là cái hoá đơn. Phiên bản sắc nhất của nỗi lo đó là một vòng lặp tự viết lại harness của chính nó khi bạn đang ngủ. Bài này là phần dựng ngược lại: làm sao lấy phần lợi, một harness tốt lên từ chính các lần chạy của nó, mà không dính kịch bản thất bại (failure mode) kia. Một vòng lặp agent tự cải thiện là vòng lặp đọc dấu vết (trace) đã tích luỹ của mình rồi đề xuất thay đổi cho chính bộ phân loại (ranker), bộ kiểm (checker), hay prompt của mình, có một người làm chốt chặn.
Giữ nguyên định nghĩa cả loạt bài đã dùng:
Một vòng lặp là một mục tiêu đệ quy: bạn định nghĩa một mục đích và một điều kiện dừng kiểm chứng được, rồi hệ thống lặp các agent chọi vào đó tới khi điều kiện thoả – mà không cần bạn nhắc từng lượt.
Loop 1–3 tự động hoá phần việc: một agent loop làm một tác vụ, một verification loop kiểm nó, một schedule loop bắn nó theo nhịp. Vòng lặp thứ 4 tự động hoá việc cải thiện chính cái harness bên dưới chúng. Ý tưởng này bắt nguồn từ “loopcraft” của swyx và bốn tầng vòng lặp mà LangChain phác trong “The Art of Loop Engineering”. Bản đi bộ này là phiên bản CC-native: dấu vết commit trong git, một lượt phân tích, và một PR, không phải một engine phân tích dấu vết của nhà cung cấp (vendor).
Điều kiện cần trước:
- Một vòng lặp đã chạy một thời gian và tích luỹ dấu vết đã commit (một file trạng thái, lịch sử chạy). Đây là bậc 5 của thang áp dụng; bạn không thể hill-climb một vòng lặp chưa chạy.
- Bạn hiểu tách maker/checker và rằng bước merge vẫn do người quyết. Bài này thêm tầng cải thiện harness; nó không dạy lại phần tách kia.
- Bạn đọc được một Python ranker nhỏ và một git diff. Ví dụ thật tinh chỉnh một bộ phân loại theo keyword và ship nó dưới dạng PR.
Vòng lặp agent tự cải thiện là gì?
Một vòng lặp agent tự cải thiện đọc chính dấu vết đã tích luỹ của nó rồi đề xuất thay đổi cho chính harness: keyword của ranker, tiêu chí chấm điểm (rubric) của checker, prompt của maker, có review của người làm chốt chặn. Nó tự động hoá việc cải thiện, không chỉ việc làm.
Đầu vào nó đọc rất cụ thể: lịch sử chạy, các diff của file trạng thái, và những verdict mà một người đã gọi khác đi. Mỗi loop dưới sinh ra dấu vết đó; loop hill-climbing tiêu thụ chúng.
Bốn tầng vòng lặp dễ nắm nhất khi để dưới dạng bảng. Ba hàng trên đã quen từ loạt bài; hàng thứ tư là bài này.
| Vòng lặp | Tự động hoá cái gì | Nhạc cụ CC-native của ta |
|---|---|---|
| 1. Agent | Làm một tác vụ | Một subagent với một prompt |
| 2. Verification | Kiểm tác vụ | Một điều kiện dừng máy kiểm được |
| 3. Schedule | Bắn theo nhịp | Một heartbeat cron |
| 4. Hill-climbing | Cải thiện harness | Một lượt phân tích mở một PR |
Điểm mấu chốt: Loop 1–3 sinh ra dấu vết như một tác dụng phụ của việc chạy. Loop hill-climbing là loop duy nhất coi những dấu vết đó là đầu vào của mình.
Sự phân biệt này quan trọng vì chữ “tự cải thiện” mang rất nhiều sức nặng kiểu nhà cung cấp. LangChain trang bị cho loop 4 bằng LangSmith Engine, một dịch vụ được quản lý (managed) phân tích dấu vết và tinh chỉnh config. Đó là một sản phẩm hợp lý. Nó cũng đúng là bước bạn muốn giữ trong tay mình nhất. Bản CC-native giữ mọi dấu vết trong git, chạy phần phân tích như một agent bình thường trên các file bạn vốn đã có, và phát ra kết luận dưới dạng một diff trong một pull request. Không cần nền tảng nào, và không gì sửa được harness mà chưa đi qua mắt một người trước.
Vòng lặp của bạn đã sẵn sàng chưa? Điều kiện bậc 5
Bạn không thể hill-climb một vòng lặp chưa chạy: một lượt cần dấu vết đã tích luỹ, mà vòng lặp non thì không có gì để đọc. Chốt sẵn sàng gồm ba câu hỏi: đã chạy đủ chu kỳ chưa, dấu vết đã commit và grep được chưa, và có ít nhất một verdict người sẽ gọi khác đi chưa.
Nếu bất kỳ câu nào trả lời không, vòng lặp chưa sẵn sàng. Một lượt “tự cải thiện” trên dữ liệu rỗng chỉ bịa ra thay đổi chứ không tìm ra chúng.
Ví dụ thật qua được chốt. Vòng lặp triage gap-log, cái được dựng trong lần retrofit đầu tiên, chạy bốn nhịp heartbeat ngày thường từ 16 tới 19/6/2026. Mỗi lần chạy triage một lô gap của design-system vào một file trạng thái đã commit, lớn dần từ 8 lên 16 lên 24 rồi 26 mục. Tới cuối nó giữ 26 gap, mỗi gap phân loại bởi bộ não rẻ tiền deterministic, chưa bao giờ bộ não agent.
| Trường trong dấu vết | Giá trị |
|---|---|
| Gap đã triage | 26 |
| Lần chạy heartbeat | 4 (16–19/6) |
| Nhóm: deferred | 10 |
| Nhóm: open | 7 |
| Nhóm: design-action | 5 |
| Nhóm: consumer-workaround | 4 |
| Bộ não dùng | deterministic (cả 26) |
Điểm mấu chốt: Chốt sẵn sàng là dấu vết đã tích luỹ, dấu vết đã commit, và ít nhất một tín hiệu ghi đè (override). Một lượt là đọc, không phải đoán, và đọc thì cần có cái gì đó trên đĩa.
Nói thẳng về phạm vi ở đây. Đây là vòng lặp duy nhất trong sổ đăng ký của ta đủ chín cho một lượt. Các vòng lặp design-toolkit và fixkit chưa chạy đủ lâu để tích luỹ thứ gì đáng phân tích, nên chúng chưa phải ứng viên bậc 5. Một heartbeat theo lịch mới là thứ sinh ra độ sâu dấu vết mà một lượt phụ thuộc vào, và đó là lý do bậc 5 nằm trên schedule loop, không phải cạnh nó.
Đi một lượt thật và tìm điểm mù ở đâu?
Một lượt bắt đầu bằng đọc chỗ phán đoán rẻ tiền của vòng lặp yếu nhất. Trong gap-log loop, 7 trong 26 gap rơi vào nhóm open, hộp thư của người cho mọi thứ chủ quan. Khi soi kỹ, 3 trong 7 cái đó chẳng chủ quan chút nào: ranker gọi người cho gap vốn đã xong.
Ô action ghi lại của chúng đã nói việc kia là có chủ đích, đúng, hoặc đã sửa rồi.
Nhóm open là lời thú nhận “tôi không biết” của ranker. Chính vì thế nó là chỗ đúng để soi đầu tiên: đó là nơi bộ não rẻ tiền thừa nhận nó không có luật. Đọc ba hàng bị gắn cờ đối chiếu với ô nguồn của chúng làm pattern hiện rõ.
| Gap | Nhóm ghi lại | Ô thực sự nói gì |
|---|---|---|
| V0.25:6 LevelGrid | open | ”None; display string vs slug distinction is intentional” |
| V0.25:8 LevelHero | open | ”None; prop design is correct” |
| V0.27:14 Astro glob loader | open | ”No action needed; fixed in Sprint 2c” |
Pattern này có một cái tên đáng giữ: bộ não rẻ nhất đang định tuyến quá tay tới tài nguyên đắt nhất. Một suất review của người là thứ khan hiếm nhất vòng lặp tiêu, và ranker đang tiêu ba suất đó cho những gap chẳng cần việc gì. Kỷ luật verification chi phối một điều kiện dừng áp đúng như thế cho một verdict của ranker: một nhóm là một tuyên bố, và một tuyên bố gọi người cho việc đã xong là một tuyên bố sai.
Điểm mấu chốt: Điểm mù nằm trong nhóm gộp cuối (catch-all). Khi bộ não rẻ nhất dồn việc đã xong tới tài nguyên đắt nhất, ranker đang thiếu một loại, không phải hỏng ở phán đoán.
Đây là sản phẩm của pha đọc: chưa phải một bản sửa, mà là một điểm mù được gọi tên, đặt trên các hàng thật. Ranker không có nhóm cho “đã giải quyết, không cần làm gì”, nên mọi gap đã đóng đều lọt xuống nhóm gộp cuối open.
Đề xuất diff (không phải tự sửa): nhóm no-action
Quy tắc cứng một: lượt chạy đề xuất một diff; nó không bao giờ tự sửa harness. Đầu ra của agent phân tích là một patch trong một file, được review như mọi patch khác, không phải một bản sửa trực tiếp (mutation) sống trên triage.py.
Diff này thêm một nhóm no-action vào verdict_deterministic, check đầu tiên, với một tập keyword hẹp có chủ đích.
def verdict_deterministic(u): t = (u["title"] + " " + u["raw"]).lower() # hill-climbing pass 01 (2026-06-26): close-on-resolution. 3 of 7 'open' # verdicts in the 2026-06-16..19 run were already-resolved gaps the ranker # paged a human for. Add a no-action bucket, checked first. if any(k in t for k in ("no action", "intentional", "by design", "fixed in", "fixed during", "correct per spec")): return "no-action", "log + close (resolved / intentional, no work)" if any(k in t for k in ("design-repo", "design session", "design spec", "organism", "spec + impl")): return "design-action", "open design-repo issue (human confirms; never auto)"Lựa chọn keyword bảo thủ có chủ đích: intentional, no action, fixed in, by design, correct per spec. correct trần bị loại. Nó sẽ khớp quá nhiều và false-close gap thật, một lỗi tệ hơn nhiều so với để sót một cái open. Check nhóm này đầu tiên nghĩa là một gap đã xong ngắn mạch trước khi nhánh dự phòng chủ quan (fallthrough) kịp chạy.
Phần verify là bằng chứng. Chạy ranker đã vá trên đúng ba trường hợp thật trả về no-action, no-action, open. Nhóm design-action không đổi, nên tinh chỉnh này thêm một loại mà không động tới các nhóm khác. Kết quả trung thực là hai trên ba: LevelGrid và Astro loader đóng, còn LevelHero giữ open vì ô của nó chỉ nói “prop design is correct”, và correct đúng là từ mà tập bảo thủ từ chối khớp. Cái trượt đó là cố ý.
Điểm mấu chốt: Check nhóm no-action đầu tiên, để một gap đã xong ngắn mạch trước khi nhánh dự phòng chủ quan kịp chạy. Tập keyword hẹp đóng 2 trên 3 và từ chối
correcttrần có chủ đích.
Thử ngay. Trên vòng lặp của chính bạn: (1) đổ nhóm gộp cuối từ file trạng thái ra, ví dụ
jq '.triaged | to_entries[] | select(.value.bucket=="open")' gaplog-state.json; (2) với mỗi mục, đọc ô action ghi lại thay vì đọc tiêu đề; (3) liệt kê các mục mà ô nói việc đã xong hoặc có chủ đích; (4) nháp một keyword hẹp bắt được chúng, và từ chối bất kỳ keyword nào đủ rộng để khớp một gap open thật. Dừng ở đó. Đề xuất diff trong một branch; đừng áp nó vào harness.
Đánh đổi (trade-off) là tường minh. Một nhóm keyword check-đầu-tiên là bản cải thiện rẻ nhất có thể, và nó tự trả tiền cho mình ngay lần đầu tự đóng một gap đã xong. Cái giá là độ chính xác: một keyword không đọc được ý định, nên nó sẽ luôn để lại những trường hợp cần phán đoán. Bạn chấp nhận cái trần đó một cách có ý thức.
Ship qua review: quy tắc cứng thứ hai
Quy tắc cứng hai: thay đổi đề xuất ship qua đúng quy trình review của người như mọi thay đổi khác, một PR một người duyệt, không bao giờ tự viết lại. Với lượt này đó là PR #189 trên repo website. Bước merge vẫn do người quyết.
Một người đọc cả diff lẫn bản ghi lượt chạy cùng nhau, thấy kết quả hai-trên-ba nêu thẳng, và quyết nó có merge hay không.
Đây là chỗ bản CC-native rẽ mạnh khỏi khung nhà cung cấp. Một engine phân tích dấu vết được quản lý tự viết lại config đang tự động hoá đúng cái bước nên được review. Toàn bộ rủi ro của một vòng lặp tự cải thiện là một harness thay đổi luật của chính nó nhanh hơn tốc độ bất kỳ ai audit được. Cho thay đổi đi qua một PR đặt chốt chậm nhất, con người nhất lên đúng hành động cần nó nhất. Quy tắc đánh giá độc lập mà cả loạt bài dựa vào nói rằng verdict phải sống trong một artifact mà maker không thể tự viết ra, và cái chốt chặn thẩm định là vĩnh viễn. Một vòng lặp tự cải thiện là phép thử mạnh nhất cho quy tắc đó, vì maker ở đây đang đề xuất sửa chính cái thứ phán xử công việc của nó.
Điểm mấu chốt: Hai quy tắc cứng cùng lúc: agent phân tích đề xuất một diff (không bao giờ tự sửa), và diff ship qua một PR có người duyệt. Không cái nào là tuỳ chọn, và cái thứ hai là chỗ “tự cải thiện” kiểu nhà cung cấp thường lặng lẽ biến mất.
Nguồn gốc đáng lần lại. Lần retrofit đầu tiên dựng vòng lặp này, và heartbeat chạy nó đủ lâu để sinh ra dấu vết 26-gap mà lượt này đọc. Lượt chạy không thêm gì vào cách vòng lặp chạy hằng ngày. Nó là một hành động riêng, có chủ đích: một người chĩa một agent phân tích vào dấu vết đã tích luỹ, đọc cái nó đề xuất, rồi ship hoặc từ chối. Một lượt, làm tay, là mô tả trung thực. Đây chưa phải một hệ bậc-5 tự chạy theo lịch, và khác biệt đó quan trọng: một bộ tự cải thiện theo lịch sẽ cần điều kiện dừng riêng và ngân sách review riêng trước khi nó xứng đáng cùng mức tin cậy.
Khi nào hill-climbing bằng keyword dừng, và pass ngữ nghĩa bắt đầu?
Hill-climbing bằng keyword dừng ở ranh giới mà ranker cần đọc ý định, không chỉ khớp chuỗi. Một tinh chỉnh keyword thì rẻ và bắt được các điểm mù hiển nhiên, nhưng không mã hoá được phán đoán. LevelHero là bằng chứng: “prop design is correct” cần từ correct, mà correct kích hoạt quá đà.
Nên pass deterministic để nó open có chủ đích. Cái gap cao hơn kế tiếp đòi đọc nghĩa, và một tập keyword không đọc nghĩa an toàn được.
Bước leo thang là bộ não còn lại của vòng lặp. Chính ranker đó có sẵn một đường verdict_agent, một lượt claude -p phân loại gap bằng suy luận thay vì khớp. Nó sẽ bắt được LevelHero, vì nó đọc “prop design is correct” như một sự-đã-giải-quyết chứ không phải một chuỗi. Cái bẫy là chi phí: bộ não đó rút credit có tính phí, nên nó bị chặn bởi một N tường minh, chạy theo yêu cầu, không phải mỗi heartbeat. Trong bốn lần chạy sinh ra dấu vết này, bộ não agent chưa bao giờ được gọi; cả 26 verdict tới từ đường deterministic miễn phí.
Vậy đánh đổi là một cái phân tầng. Hill-climbing deterministic rẻ xử lý các điểm mù hiển nhiên, cơ học với chi phí biên bằng không. Một pass agent có tính phí xử lý các trường hợp ngữ nghĩa mà một keyword không với tới, ở một cái giá bạn cap có chủ đích. Bạn không với tay tới bộ não đắt tiền cho tới khi cái rẻ đã chạy hết đường một cách chứng minh được, và bạn chặn mức chi của nó như bạn chặn bất kỳ lệnh gọi có tính phí nào. Về cơ chế của cái trần đó, xem chặn chi phí agent.
Điểm mấu chốt: Deterministic cho cái hiển nhiên, agent có tính phí cho cái ngữ nghĩa. Pass deterministic nói cho bạn biết chính xác chỗ nó bó tay (các trường hợp nó để open), và đó là tín hiệu khi nào pass agent đáng đồng tiền của nó.
Đây cũng là câu trả lời sạch nhất cho cảnh báo ở Phần 9. Một harness tự cải thiện là ca sắc nhất của vòng lặp ship code bạn không viết, và đó đúng là lý do cả hai quy tắc cứng đều bất khả nhượng. Vòng lặp đề xuất; bạn đọc; bạn merge. Khoảnh khắc bất kỳ bước nào trong ba bước đó thành tự động, bạn đã đánh đổi đúng cái hiểu biết mà bạn đang cố bảo vệ.
FAQ
Vòng lặp agent tự cải thiện là gì?
Nó là tầng vòng lặp thứ 4. Nơi một agent loop làm một tác vụ, một verification loop kiểm nó, và một schedule loop bắn nó, một vòng lặp tự cải thiện (hill-climbing) đọc dấu vết tích luỹ mà các loop đó sinh ra và đề xuất thay đổi cho chính harness: keyword của ranker, tiêu chí chấm điểm của checker, hay prompt của maker. Đề xuất bị chốt bởi review của người, nên nó cải thiện hệ thống mà không tự viết lại luật của mình khi không ai trông.
Hill-climbing khác gì với để agent tự viết lại harness của nó?
Hai quy tắc cứng. Thứ nhất, agent phân tích đề xuất một diff trong một file; nó không bao giờ tự sửa harness đang chạy. Thứ hai, diff đó ship qua đúng PR người-duyệt như mọi thay đổi khác. Một agent tự viết lại harness của mình bỏ qua cả hai chốt, và đó chính là kịch bản thất bại mà hill-climbing được thiết kế để tránh. Vòng lặp không bao giờ đổi luật của mình mà chưa có một người đọc thay đổi trước.
Khi nào một vòng lặp sẵn sàng cho một lượt hill-climbing?
Chỉ sau khi nó chạy đủ lâu để tích luỹ dấu vết đã commit: lịch sử chạy thật, các diff file trạng thái, và lý tưởng là ít nhất một verdict mà một người sẽ gọi khác đi. Gap-log loop đủ điều kiện sau bốn lần chạy heartbeat và 26 gap đã triage. Một lượt trên một vòng lặp còn non chẳng có gì để đọc, nên nó bịa ra thay đổi thay vì tìm ra chúng. Không dấu vết, không lượt chạy.
Đọc tiếp
- Loop Failure Modes: Staying the Engineer (Phần 9): cảnh báo nợ hiểu biết mà bài spin-off này là câu trả lời dựng ngược cho nó.
- Retrofitting Your First Loop (Phần 7): hành trình dựng gap-log loop mà lượt chạy này bám lên.
- Scheduled Automations and the Heartbeat (Phần 6): heartbeat đã tích luỹ dấu vết mà một lượt đọc.
Đây là một spin-off của loạt Loop Engineering, không phải một phần đánh số. Vòng cung chín phần đã trọn; đây là tầng hill-climbing dựng lên trên.