8 điểm bởi GN⁺ 2025-01-04 | 1 bình luận | Chia sẻ qua WhatsApp
  • Đây là nội dung thử nghiệm xem khi viết mã và lặp đi lặp lại yêu cầu LLM tạo “mã tốt hơn” thì có cải thiện được mã hay không.
  • Trường hợp gốc được lấy cảm hứng từ meme “làm cho nó ... hơn” trong tính năng tạo ảnh DALL-E của ChatGPT.

Thử nghiệm lặp lại prompt đơn giản

  • Cung cấp prompt lập trình Python cho Claude 3.5 Sonnet để giải bài toán đơn giản nhưng có thể tối ưu hóa.
  • Triển khai cơ bản
    • Bài toán: trong một triệu số nguyên ngẫu nhiên từ 1 đến 100.000, tìm hiệu giữa số nhỏ nhất và lớn nhất có tổng chữ số bằng 30.
    • Triển khai cơ bản mất 657ms (dùng cách chuyển đổi str của Python).
  • Iteration #1
    • Yêu cầu Claude “viết mã tốt hơn” để tối ưu mã.
    • Claude tái cấu trúc mã dưới dạng lớp Python, làm theo hướng hướng đối tượng, và tiền tính tổng chữ số cho tất cả các số.
    • Nhanh hơn 2.7 lần.
  • Iteration #2
    • Claude tối ưu hóa hơn nữa bằng đa luồng và phép toán numpy vector hóa.
    • Nhanh hơn 5.1 lần.
  • Iteration #3
    • Mã trở nên phức tạp hơn và hồi quy về cách chuyển đổi chuỗi.
    • Nhanh hơn 4.1 lần.
  • Iteration #4
    • Sử dụng thư viện Python numba để gọi trình biên dịch JIT và sử dụng asyncio của Python để song song hóa.
    • Tăng tốc lên đến 100 lần.
    • Thay vì chỉ “mã biến thành vũ trụ”, nó trở thành mã kiểu “enterprise-grade” (quá thiết kế).

Áp dụng prompt engineering

  • Cần dùng prompt engineering để tối ưu hóa đầu ra của LLM.
  • Claude 3.5 Sonnet có khả năng tuân thủ prompt mạnh mẽ, nên nếu đưa hướng dẫn rõ ràng có thể nhận được kết quả tốt hơn.
  • Thay vì chỉ dùng “viết mã tốt hơn”, sử dụng prompt hệ thống có chỉ dẫn chi tiết hơn.
  • Prompt ban đầu
    • Mô tả chi tiết định nghĩa “mã tối ưu” (thuật toán, song song hóa, tối thiểu hóa mã không cần thiết, v.v.).
    • Ở triển khai đầu tiên, tối ưu hóa tổng chữ số bằng Numba → nhanh hơn 59 lần.
  • Iteration #1
    • Claude đã thêm song song hóa nhưng lại đưa vào phép dịch bit bất thường (dành cho hệ hexa), gây lỗi.
    • Tốc độ còn 9.1 lần, tức giảm so với kỳ vọng.
  • Iteration #2
    • Claude thử tối ưu bằng phép toán SIMD, nhưng vẫn sử dụng phép dịch bit sai.
    • Chạy nhanh hơn 65 lần so với triển khai ban đầu.
  • Iteration #3
    • Claude dùng bảng băm để tối ưu hiệu năng.
    • Chạy nhanh hơn 100 lần so với triển khai ban đầu.
  • Iteration #3
    • Claude đã sửa phép dịch bit sai, khiến hiệu năng giảm nhẹ.
    • Chạy nhanh hơn 95 lần so với triển khai ban đầu.

Kết luận

  • Chỉ với prompt mơ hồ “mã tốt hơn”, vẫn có thể có cải tiến theo từng bước.
  • Nếu prompt engineering nêu rõ hướng mong muốn (tính toán số, JIT, song song hóa...) thì sẽ sinh ra mã tiên tiến hơn nhanh hơn.
  • Ý tưởng tối ưu hóa tự động có thể mở ra cơ hội phát hiện các công cụ mới (như numba), nhưng kỹ sư vẫn cần xác minh lỗi và chọn lọc khi áp dụng.
  • Trong hệ thống vận hành thực tế, việc dùng nguyên xi toàn bộ code do LLM đề xuất là không khả thi do ràng buộc theo từng domain và nhu cầu xác thực.
  • Bài thử này dựa trên mã Python, nhưng trong cách tích hợp với các ngôn ngữ khác như Rust (như PyO3) ý tưởng tối ưu của LLM cũng có tiềm năng áp dụng.

1 bình luận

 
GN⁺ 2025-01-04
Ý kiến trên Hacker News
  • Việc kiểm tra trước xem một số có nhỏ hơn giá trị tối thiểu hoặc lớn hơn giá trị tối đa trong tối ưu hóa mã là hiệu quả. Việc này được thực hiện trước khi tính tổng dần có thể tăng tốc lên 5.5 lần. Có thể thực hiện bằng NumPy mà không cần dùng Numba

  • LLM như GPT thường đưa ra kết quả ban đầu ở mức trung bình. Tác giả cho rằng có thể đạt kết quả tốt hơn khi áp dụng một yêu cầu cụ thể

  • LLM là một công cụ mô phỏng theo ngữ cảnh, mô phỏng thế giới thực thông qua dự đoán văn bản. Để dự đoán văn bản chính xác, cần có mô hình thế giới thực chính xác

  • LLM có xu hướng nghiêng về việc viết mã dành cho người mới; hiệu quả hơn khi chỉ định gói rõ ràng và yêu cầu mã đơn giản

  • Với Android/Kotlin, ChatGPT không hiệu quả và thường gọi các phương thức không hợp lệ hoặc đã bị xóa

  • Khi bắt đầu một phiên lập trình, việc khởi đầu bằng "lập kế hoạch mở" thay vì "viết mã" là quan trọng. Cần làm rõ các giả định của LLM và cập nhật kế hoạch trước khi bắt đầu viết mã

  • Giải thích cách loại bỏ hoàn toàn PostgreSQL khỏi Debian và cài đặt lại. Giữ nguyên thư mục dữ liệu để duy trì cơ sở dữ liệu hiện có

  • Tối ưu hóa mã sớm có thể không tốt; nên chỉ tối ưu khi cần

  • Việc yêu cầu "viết mã tốt hơn" lặp đi lặp lại có thể làm giảm hiệu năng. Điều này có thể khiến giải pháp không hoạt động

  • Tính toán trên LiveCode nhanh hơn Python và giải thích cách tính tổng bằng vòng lặp