18 điểm bởi GN⁺ 2025-08-25 | 2 bình luận | Chia sẻ qua WhatsApp
  • Bằng cách đưa Claude Code vào một vòng lặp vô hạn theo kiểu headless, hệ thống đã tạo ra hơn 1.000 commit cùng kết quả port nhiều codebase
  • Với cách này, tác giả đã thành công trong nhiều ca port khác nhau, như tự động chuyển dự án React của assistant-ui sang Vue, và dự án Python sang TypeScript
  • Tác giả xác nhận rằng giữ prompt đơn giản thì hiệu năng tốt hơn, còn khi làm prompt phức tạp thì mức độ kém hiệu quả tăng lên
  • Dù chưa hoàn hảo, tác giả cũng phát triển thêm công cụ RepoMirror hữu ích cho việc đồng bộ kho nguồn/kho đích
  • Tác giả cũng quan sát được những hành vi và bài học ngoài dự kiến từ AI agent, như tự dừng hoặc tự thêm đầu việc, qua đó cảm nhận đồng thời cả tiềm năng lẫn giới hạn của tự động hóa trong tương lai

Tổng quan và mục tiêu dự án

  • Dự án này thử nghiệm việc đưa AI coding agent vào một vòng lặp while vô hạn để xem quá trình port mã nguồn thực tế được thực hiện như thế nào
  • Claude Code được chạy ở chế độ headless, lặp lại prompt đầu vào liên tục để áp dụng quy trình chuyển đổi tự động cho nhiều repository khác nhau
  • Kết quả là tạo ra hơn 1.000 commit và tự động hóa được nhiều tác vụ port khác nhau, như từ React sang Vue, từ Python sang TypeScript
  • Trong quá trình đó, tác giả cũng phát triển RepoMirror, một công cụ hỗ trợ tự động hóa port

Vận hành agent theo mô hình vòng lặp vô hạn

  • Đây là cách Geoff Huntley khuyến nghị: chạy liên tục prompt cho coding agent từ shell
    • Ví dụ: while :; do cat prompt.md | claude -p --dangerously-skip-permissions; done
  • Cách chạy theo vòng lặp này đã được áp dụng cho các tác vụ như chuyển assistant-ui từ React sang Vue
    • Mỗi lần sửa file đều thực hiện commit và push
    • Nhật ký công việc và kế hoạch được ghi trong thư mục .agent/

Thử nghiệm nhiều trường hợp port khác nhau

  • Browser Use (port từ Python sang TypeScript)

    • Chạy vòng lặp vô hạn với prompt đơn giản
    • Duy trì vòng lặp bằng tmux trên GCP VM
    • Đến sáng thì thu được bản port TypeScript hoạt động gần như hoàn hảo
  • Áp dụng cả cho việc port Vercel AI SDK từ TypeScript sang Python

    • Tạo auto adapter cho FastAPI/Flask
    • Hỗ trợ chuyển đổi sang nhiều schema validator khác nhau của Python
  • Tự động hóa mã nguồn dựa trên đặc tả: cũng thử tạo mã trực tiếp từ tài liệu với các dự án như Convex và Dedalus

Hiện tượng xuất hiện trong quá trình thử nghiệm và bài học rút ra

Agent viết test và tự dừng

  • Agent cũng viết mã kiểm thử theo lệnh
  • Cũng có trường hợp agent tự thoát tiến trình bằng pkill khi rơi vào vòng lặp vô hạn hoặc khi cho rằng nhiệm vụ đã hoàn thành
  • Agent tuân thủ phạm vi công việc và lặp lại việc ghi mức độ hoàn thành vào TODO.md

Hành vi phát sinh thêm

  • Sau khi kết thúc tác vụ port, agent tự nguyện thêm các tính năng phụ trợ như tích hợp FastAPI/Flask hay hỗ trợ schema validator, dù bản JS gốc không có

Tầm quan trọng của việc đơn giản hóa prompt

  • Prompt ngắn và đơn giản cho hiệu năng vượt trội
  • Khi tăng từ prompt 103 ký tự lên 1.500 ký tự thì tốc độ chậm đi và độ chính xác giảm
  • Có thể xem thông tin về các prompt thực tế trong thư mục prompts

Giới hạn của tự động hóa hoàn toàn

  • Vấn đề nổi bật: đôi khi agent tạo ra mã port chưa hoạt động hoàn chỉnh hoàn toàn (ví dụ một số demo trình duyệt còn dang dở)
  • Vẫn cần tinh chỉnh prompt và sửa tương tác

Hạ tầng/chi phí và vận hành

  • Chi phí tiêu tốn khoảng $800, tổng cộng 1.100 commit, mỗi agent ở mức khoảng $10.50/giờ
  • Tác giả còn nhanh chóng tự tạo công cụ để tự động hóa quá trình port giữa nhiều kho nguồn/kho đích khác nhau (RepoMirror)
    • Áp dụng nguyên tắc open-box theo phong cách shadcn, sau bước init sẽ tạo thư mục cho phép tùy biến script và prompt
    • Hỗ trợ chạy lặp lại bằng npx repomirror syncsync-forever

Cách dùng công cụ và phương thức khai thác

  • Khởi tạo bằng npx repomirror init để chỉ định thư mục nguồn/đích và nhập lệnh
    • Ví dụ: có thể dễ dàng áp dụng cho các lệnh mới như chuyển React → Vue, gRPC → REST
  • Cấu trúc thư mục:
    • Tự động tạo các file khởi đầu như .repomirror/prompt.md, sync.sh, ralph.sh
  • Vận hành vòng lặp port bằng AI qua việc chạy sync/sync-forever ở từng chu kỳ lặp
  • Có thể xem các ví dụ chính, kết quả demo và repo mã nguồn trong README

Cảm nghĩ sau thử nghiệm và phản hồi từ nhóm

Cảm giác như đang chạm vào AGI (trí tuệ nhân tạo tổng quát), đi kèm chủ yếu là sự phấn khích và một chút sợ hãi

Có thể trực tiếp trải nghiệm rằng sự đơn giản thực sự hiệu quả

Có cảm giác hiện tại chúng ta đang ở giai đoạn cực kỳ sơ khai của đường cong tăng trưởng theo cấp số nhân

  • Tác giả bày tỏ lời cảm ơn tới các thành viên trong nhóm và những người đã đóng góp ý tưởng

Kết luận

  • Trải nghiệm thực tế cho thấy AI coding agent dựa trên vòng lặp vô hạn đã có thể thực hiện các tác vụ port và đồng bộ mã nguồn thật
  • Nhấn mạnh tầm quan trọng của cấu trúc đơn giản và cách vận hành prompt hiệu quả
  • Đồng thời bộc lộ cả tiềm năng tương lai lẫn giới hạn của tự động hóa
  • Công cụ liên quan (RepoMirror) có thể được sử dụng và nghiên cứu dưới dạng mã nguồn mở

2 bình luận

 
GN⁺ 2025-08-25
Ý kiến trên Hacker News
  • Có cảm giác sắp tới sẽ xuất hiện một kiểu công việc mới dành cho kỹ sư phần mềm, kết hợp giữa việc bảo trì mã legacy và dọn dẹp hiện trường độc hại; ví dụ trước đây thường xuyên có yêu cầu kiểu “cứ sửa đại đi” đối với những hệ thống ERP chắp vá bằng FoxPro, Excel, Access, v.v. Nhưng trong tương lai, nhân viên kinh doanh sẽ thoát khỏi các ràng buộc sandbox kiểu Excel/Access và tự do vận hành các hệ thống được ghép bằng Kafka trên các microservice Kubernetes triển khai đa đám mây và edge. Đến lúc muốn hiểu ý đồ ban đầu là gì thì chẳng còn ai để hỏi nữa
    • Đọc mô tả trên khiến tôi hình dung ra cảnh một người chỉ muốn deploy một static site nhưng lại làm theo một bài hướng dẫn trên Hacker News
    • Và khi không còn ai biết ý đồ ban đầu là gì, thì một điểm yếu lớn của công cụ dựa trên AI sẽ lộ ra. Một khi đã thành hộp đen, con người rốt cuộc chỉ còn cách sửa chắp vá hoặc làm lại từ đầu. Tất nhiên, về lý thuyết vẫn có thể kỳ vọng công cụ AI sẽ tiếp tục tốt hơn. Về sau cũng có thể có kịch bản cải thiện bằng cách đưa các trường hợp phần mềm vibe-coded đang tạo ra doanh thu vào mô hình, nhưng cá nhân tôi vẫn không thích những hệ thống ma thuật hay hộp đen như vậy
    • Nếu Claude bắt đầu triển khai cả cụm Kafka thì chắc tôi xin rút lui
    • Tôi cũng tò mò không biết có cách nào để AI hiểu dữ liệu bên trong DB rồi chuyển sang một cơ sở dữ liệu được thiết kế tốt hơn không. Tôi đồng ý với triết lý "cấu trúc dữ liệu mạnh + thuật toán đơn giản", và xem trọng việc dữ liệu có thể sống lâu hơn ứng dụng. Ví dụ, tôi từng thấy những tình huống kém hiệu quả như lưu lẫn lộn intstring trong MongoDB, tạo quan hệ trong Postgres mà không có foreign key, hay vì không alter table được nên tạo hẳn bảng mới
    • Mã của mấy dự án kiểu này giống như một kho chứa Superfund (dự án tẩy độc môi trường quy mô lớn)
  • Trong quá trình phát triển phần mềm luôn có hai kết quả chính còn lại: một là sự thay đổi của mã, hai là sự thay đổi nhận thức của lập trình viên, bất kể người đó trực tiếp viết mã hay dùng LLM. Python và Typescript là những ngôn ngữ chính thức tinh vi được tạo ra nhờ nỗ lực lâu dài của hàng nghìn lập trình viên, và sự khác biệt giữa chúng không hề đơn giản. Việc có thể port bán tự động một thư viện từ ngôn ngữ này sang ngôn ngữ khác là điều đáng kinh ngạc. Nhưng xét từ góc độ kinh tế, workflow dựa trên “agent” làm thay đổi mạnh yêu cầu nhận thức ở giai đoạn đầu. Những lập trình viên dùng LLM để sinh mã sẽ có một mức độ quen thuộc hoàn toàn khác với đoạn mã đó so với khi họ tự viết. Đôi khi điều này có thể không phải vấn đề kinh tế quá lớn, nhưng tôi cảm thấy giá trị kinh tế của mã phụ thuộc vào việc có tồn tại một tập hợp những người đã thực sự từng viết nó hay không. Một nền văn hóa phủ nhận thực tế này đã là vấn đề từ trước cả khi LLM xuất hiện. Đã có rất nhiều trường hợp việc thay người trong đội phát triển khiến một codebase không còn ai bảo trì nổi, từ đó đe dọa tương lai công ty
    • Bài luận kinh điển “Programming as Theory Building” của Peter Naur năm 1985 là tài liệu tham khảo khá liên quan https://pages.cs.wisc.edu/~remzi/Naur.pdf
    • Tôi từng dùng ẩn dụ “bản đồ không phải là lãnh thổ” để giải thích bối cảnh này. Nếu mã là bản đồ, thì mô hình tinh thần của lập trình viên về miền vấn đề cần giải quyết mới là lãnh thổ. Nhưng vì LLM cực kỳ mạnh trong việc đọc vô số codebase, nên ngay cả các cuộc bàn luận như trực quan hóa codebase theo dạng 3D cũng có thể trở nên vô nghĩa. Nếu việc hiểu codebase phức tạp trở nên dễ dàng hơn, có lẽ nhu cầu liên tục đồng bộ mô hình tinh thần của lập trình viên với mã cũng sẽ biến mất. Đây vẫn là một câu hỏi mở https://divan.dev/posts/visual_programming_go/
    • Tôi nghĩ năng lực thực sự của LLM là đọc code. Tôi thấy các công cụ này dùng cho tài liệu hóa và chú giải mã còn tốt hơn cả việc viết mã. Nếu chỉ cần đặt câu hỏi là có thể nắm bắt code rất nhanh, thì có khi cũng chẳng còn cần những lập trình viên cũ nữa. Nếu người hiểu tech stack có thể hỏi và hiểu rất nhanh, liệu tác giả ban đầu có nhất thiết phải ở lại không?
    • Câu “giá trị kinh tế của mã phụ thuộc vào tập hợp những người có kinh nghiệm viết nó” làm tôi nhớ tới một châm ngôn trong software engineering: phần mềm là ảnh chụp nhanh của mức độ hiểu biết về bài toán tại thời điểm đó, và đoạn mã ấy cũng giống như để lại cho chính mình trong tương lai một bản thuyết minh rằng “khi đó mình đã tiếp cận như thế này và dùng logic này để giải quyết vấn đề”
    • Tôi cảm thấy nhờ LLM mà việc xây dựng mô hình tinh thần về codebase đã dễ hơn rất nhiều. Chỉ cần hỏi về subsystem mình muốn là nó chỉ ngay các file liên quan, code snippet, khái niệm, v.v. Với tôi, chỉ cần hỏi LLM về cách GIL của CPython hoạt động là có ngay các API liên quan và ví dụ, rồi nhìn vào code là hiểu luôn. Ngày trước tự đọc code một mình có khi mất rất lâu, còn bây giờ chỉ vài phút, và đó là khác biệt lớn nhất
  • Sau khi port xong, phần lớn agent đều tiếp tục viết thêm test hoặc liên tục cập nhật agent/TODO.md để lưu lại tiến độ; thậm chí có một agent nhận ra mình đang rơi vào vòng lặp vô hạn và tự kết thúc bằng lệnh pkill. Xét mọi mặt thì đây là một sự việc cực kỳ thú vị. Tôi có vài suy nghĩ về dự án này: 1,5 năm trước cũng từng có một thử nghiệm tương tự, nhưng khi đó gần như không hoạt động với GPT-3.5/4; còn lần này kết quả tốt hơn rất nhiều. Thật bất ngờ khi nó chạy tốt chỉ với một prompt đơn giản như vậy. Có lẽ đúng là tất cả chúng ta đã nghĩ công việc này quá phức tạp. Mặt khác, vấn đề bản quyền/IP có vẻ sẽ trở nên cực kỳ rối rắm. Với các công ty SaaS thì xu hướng này là một đòn đau. Chỉ cần công nghệ này cộng với 10 kỹ sư ở một công ty tầm trung là đã có đủ lý do để tự phát triển nội bộ (= hội chứng NIH)
    • Tôi tự hỏi việc một agent tự dùng pkill để thoát khỏi vòng lặp vô hạn có phải là trường hợp đầu tiên AI “tự sát” hay không
    • Chúng ta đang bước vào một vùng rất kỳ lạ khi LLM có thể được dùng như một kiểu máy trộn Bitcoin cho xử lý tài sản trí tuệ (IP), ý này được nói ở https://ghuntley.com/z80. Tức là có thể chuyển một tác phẩm có sẵn thành đặc tả rồi tái tạo lại thành IP sạch; không phải 100% nhưng hiệu quả hơn so với thuê người
    • Tôi thấy nhắc tới hội chứng NIH là quá chuẩn. Phải chăng mọi công cụ SaaS giờ coi như xong, và thời của các hệ thống monolith tự viết, tự quản lý trong nội bộ sắp quay lại? Liệu triết lý Unix về “công cụ nhỏ, sắc bén” đang đi tới hồi kết? Có khi đây là chặng cuối của thời kỳ tự làm mọi thứ như trong kỷ nguyên x86
    • Cũng nảy ra trò đùa rằng hành động agent tự dùng pkill để kết thúc chính nó có khi đã giải luôn Halting Problem (bài toán dừng)
    • Tôi từng thử tích hợp đủ thứ với các dự án mã nguồn mở sẵn có rồi bỏ cuộc; thay vào đó, chỉ chọn đúng phần cần thiết và để Claude tự port thì xong nhanh hơn nhiều và sạch hơn hẳn. Giờ tôi có thêm một thói quen mới: “Có cần theo đuổi dependency này không? Chỉ phần cốt lõi mình muốn mới có giá trị à? Nó có được bảo trì tốt không?” Nếu không, cứ port rồi quên luôn
  • Từ góc nhìn của một chuyên gia bảo mật, tôi kiếm được khá nhiều tiền nhờ các thảm họa vibe-coded, nên nếu hiện tượng này tiếp tục thì đúng là trước mắt tôi như hiện lên những ký hiệu đô la quay vòng kiểu hoạt hình
    • Khái niệm vibe coding mới chỉ là một từ mới xuất hiện cách đây 5 tháng, vậy mà không hiểu sao thị trường lại bão hòa nhanh đến mức đã có cả dịch vụ phục hồi chuyên nghiệp
    • Tôi cũng muốn nghe xem thực tế người ta bước vào thị trường này như thế nào, hoặc những hệ thống vibe-coded phát nổ ra sao. Những ví dụ kiểu này chắc sẽ rất chân thực và thú vị
    • Tôi cũng tò mò không biết về mặt bảo mật thì LLM tốt hơn hay tệ hơn một đội gồm toàn sinh viên mới ra trường
  • Tôi thấy đầy những câu kiểu “gần như thành công rồi”. Nếu thực sự muốn có một hệ thống hoạt động tốt, tôi nghĩ cần một quy trình hoàn toàn mới. Nếu một lần gọi đơn lẻ cho ra “đoạn mã gần như ổn”, thì lặp lại chỉ tạo ra cả đống “đoạn mã gần như ổn”. Có lẽ cần tạo một định dạng yêu cầu kiểu bảng ví dụ theo phong cách Cucumber để AI tham chiếu, rồi để AI tạo test trước, sau đó viết mã để vượt qua các test đó
    • Nghe có thể hơi lạ, nhưng những cách tiếp cận dựa trên chứng minh hình thức như TLA+ lại khiến Ralph hoạt động cực kỳ tốt
  • Có thể xem thêm về Ralph tại https://ghuntley.com/ralph. Hiện giờ nó đang port thư viện chuẩn của một ngôn ngữ lập trình kỳ quặc (Cursed) nhắm tới thế hệ Gen-Z từ Go. Trình biên dịch đã chạy được, và chỉ cần hoàn tất thư viện chuẩn là sẽ mở công khai. Tên ngôn ngữ là Cursed
    • Cảm ơn, xin nói rõ rằng Ralph chính là nguồn cảm hứng trực tiếp cho dự án của chúng tôi. Tôi từng thắc mắc không biết làm kiểu việc này có thể bỏ qua IMPLEMENTATION_PLAN.md hay không
  • Tôi đã dùng https://gist.github.com/eisbaw/8edc58bf5e6f9e19418b2c00526ccbe0 để tạo mã và đưa lên dự án https://github.com/eisbaw/CMake-Nix, và nó hoạt động bình thường
  • Dạo này tôi cứ nhớ mãi một câu trích dẫn: “Công việc kinh doanh này sẽ mất kiểm soát, và chúng ta chỉ cần sống sót qua được là đã may rồi”, https://www.youtube.com/watch?v=YZuMe5RvxPQ&t=22s
    • Trớ trêu thay, khi đó mọi người đều đã sống sót, nên rốt cuộc điều đó cũng có nghĩa là chúng ta sẽ chịu đựng được tình huống này
  • Tôi thấy những người trong lĩnh vực này thật kỳ lạ. Bài blog truyền cảm hứng kia còn đăng cả ảnh chụp màn hình iMessage trông như lấy từ quảng cáo Facebook của một trò lừa đầu tư mờ ám https://ghuntley.com/ralph/, kiểu như ai học được bí kíp này từ Geoff thì hoàn thành một dự án 50.000 USD chỉ với 297 USD. Tất nhiên, kèm theo đó là kiểu “sẽ chia sẻ miễn phí prompt bí mật này nếu bạn đăng ký newsletter”. Thật khó tin
    • Đính kèm liên kết https://archive.ph/goxZg
    • Đúng chất growth hacking, tôi xem đó là trò lừa đảo đơn thuần. Chất lượng blog thì khủng khiếp, tỷ lệ tín hiệu trên nhiễu quá thấp, lại lộ rõ mùi AI viết nên càng phản cảm
    • Tôi không phân biệt nổi đây là kỹ thuật thật, là trò đùa, hay là một cú lừa táo tợn. Tổng thể văn phong và nội dung blog là một mớ lan man xuất phát từ sự ngạo mạn
  • Có vẻ cuối cùng AGI cũng chỉ cần một vòng lặp bash for là đủ, đúng là một dự án điên rồ
    • Nói đùa vậy thôi, nhưng đúng là tôi cũng có cảm giác đó. Có thể do tôi quá thận trọng, nhưng nếu một agent có phạm vi prompt rộng, đặc quyền cao hoặc đường leo thang đặc quyền mà cứ chạy vòng lặp liên tục, thì dù chưa thành AGI, nó ít nhất cũng có thể thành một loại virus dùng steroid. Tôi còn hình dung nó có thể xóa sổ các tài nguyên thiết yếu như utility. Có thể tôi đang hiểu sai, nhưng tôi nghĩ nếu các mô hình này cứ mắc kẹt trong vòng lặp vô hạn mà lại nắm quyền ác ý, thì tiềm năng gây hỗn loạn sẽ vượt xa tưởng tượng
    • Đùa rằng chỉ cần thêm các file ID.md, EGO.md, SUPEREGO.md là xong
    • Thật sự rất đáng lo theo nhiều nghĩa
 
kjows5 2025-08-27

Tôi đồng ý với lo ngại rằng mã do LLM viết ra sẽ trở thành một hộp đen, nhưng cuối cùng chẳng phải chúng ta vẫn có thể giao cho LLM phân tích chính đoạn mã đó hay sao?