Bối cảnh: tầm quan trọng của ngữ cảnh trong lập trình AI
Nếu “trí thông minh” của các mô hình lớn, chẳng hạn như Claude 3.5 Sonnet, là yếu tố chính thúc đẩy bước nhảy vọt từng bước trong khả năng lập trình AI, thì yếu tố quan trọng khác là độ dài ngữ cảnh.
Hiện tại, Claude 3.5 Sonnet cung cấp độ dài ngữ cảnh tối đa là 200k token. Mặc dù điều này là hơn đủ cho các mô hình đàm thoại—có khả năng xử lý dễ dàng một cuốn sách 50.000 hoặc thậm chí 100.000 từ—nó vẫn còn thiếu sót rất nhiều đối với các dự án lập trình liên quan đến hàng chục hoặc hàng trăm tệp mã, mỗi tệp trải dài hàng trăm hoặc hàng nghìn dòng. Hơn nữa, với các mô hình lớn tính phí dựa trên số lượng token đầu vào và đầu ra, chi phí biên không đáng kể.
Hai đặc điểm này đã thúc đẩy các công cụ lập trình AI như Cursor và Windsurf triển khai nhiều tối ưu hóa với các mục tiêu sau:
- Trích xuất chính xác mã liên quan đến nhiệm vụ để tiết kiệm độ dài ngữ cảnh, cho phép tối ưu hóa nhiệm vụ nhiều bước và cung cấp trải nghiệm người dùng tốt hơn.
- Giảm thiểu việc đọc nội dung mã “không cần thiết”, không chỉ để cải thiện tối ưu hóa nhiệm vụ mà còn để giảm chi phí.
Dưới các ràng buộc và mục tiêu đã đề cập ở trên, Cursor và Windsurf đã áp dụng các chiến lược tối ưu hóa khác nhau để nâng cao trải nghiệm sản phẩm của họ. Tuy nhiên, những “tối ưu hóa” như vậy thường liên quan đến sự đánh đổi, chỉ mang lại các giải pháp tối ưu cục bộ và không thể tránh khỏi việc hy sinh một số khía cạnh của trải nghiệm người dùng.
Mục đích của bài viết này là giúp cả bạn và tôi hiểu các phương pháp và logic đằng sau “tối ưu hóa” của chúng. Bằng cách nắm bắt những sự đánh đổi liên quan đến những điều chỉnh này, chúng ta có thể tận dụng tốt hơn các điểm mạnh và điểm yếu của các sản phẩm khác nhau. Sự hiểu biết này sẽ cho phép chúng ta chuyển đổi công cụ và điều chỉnh phương pháp sử dụng trong các trường hợp khác nhau, cuối cùng đạt được giải pháp tối ưu cho các nhiệm vụ của chúng ta.
Kết luận: Windsurf để bắt đầu, Cursor để tối ưu hóa
Dựa trên những kinh nghiệm gần đây và đánh giá thực tế về Cursor 0.43.6 và Windsurf 1.0.7 vào ngày 15 tháng 12, các kết luận sau đã được rút ra:
1. Đối với người mới bắt đầu thực hiện các nhiệm vụ cơ bản: Windsurf > Cursor Agent > Cursor Composer (Chế độ bình thường)
Ở chế độ Agent, hiệu suất thực hiện các nhiệm vụ cơ bản vượt trội so với chế độ Cursor Composer tiêu chuẩn. Điều này là do chế độ Agent diễn giải nhiệm vụ, quét cơ sở mã, định vị tệp, đọc mã và thực hiện các thao tác từng bước để hoàn thành nhiệm vụ.
Agent của Windsurf cho thấy khả năng hiểu nhiệm vụ và thực hiện nhiều bước tốt hơn so với Agent của Cursor ở chế độ Composer.
2. Hạn chế chính của chế độ Agent: Đọc tệp không đầy đủ
Hạn chế này ảnh hưởng đến các dự án phức tạp và các tệp mã lớn.
- Ở chế độ Agent của Cursor, mặc định là đọc 250 dòng đầu tiên của một tệp. Nếu cần thêm, đôi khi nó tự động mở rộng thêm 250 dòng nữa. Đối với một số nhiệm vụ được xác định rõ, Cursor thực hiện tìm kiếm, mỗi tìm kiếm trả về tối đa 100 dòng mã.
- Windsurf đọc 200 dòng mỗi tệp theo mặc định và nếu cần, thử lại tối đa 3 lần, đọc tổng cộng tối đa 600 dòng.
3. Cursor hoạt động tốt hơn Windsurf đối với các thao tác tệp đơn
Trong Cursor, nếu bạn @ một tệp cụ thể, nó sẽ cố gắng đọc tệp đó càng đầy đủ càng tốt (đã thử nghiệm lên đến 2000 dòng).
Trong Windsurf, @ một tệp chỉ giúp nó định vị tệp liên quan nhưng không nhắc nhở đọc đầy đủ tệp đó. Đây là một sự khác biệt chính về logic giữa hai công cụ.
4. Khi bạn hiểu cấu trúc dự án: Cursor hoạt động tốt hơn với trọng tâm là tệp đơn
Nếu bạn biết mình đang làm gì và nhiệm vụ của bạn liên quan đến các tệp cụ thể, việc sử dụng @ để tập trung vào một tệp đơn trong Cursor sẽ mang lại kết quả tốt hơn nhiều. Ngược lại, việc sử dụng @codebase không đảm bảo rằng Cursor sẽ bao gồm tất cả mã liên quan trong ngữ cảnh. Thay vào đó, nó sử dụng một mô hình nhỏ hơn để phân tích và tóm tắt từng tệp, dẫn đến việc bao phủ không đầy đủ mã cần thiết.
3. Quá trình thử nghiệm
Tất cả các kết luận ở trên dựa trên việc sử dụng hàng ngày rộng rãi của tôi đối với Cursor và Windsurf (hơn 500 giờ) và một bài kiểm tra có mục tiêu. Trong bài kiểm tra này, tôi đã sử dụng một tệp phụ đề video với 1.955 dòng. Tệp phụ đề có dấu thời gian và nội dung kết hợp lỏng lẻo, giúp dễ dàng xác định xem các công cụ lập trình AI thực sự đã đọc tệp và chúng đã đọc bao nhiêu—nó không để lại chỗ cho “đoán mò”.
Để đảm bảo các công cụ thực sự đang “đọc” chứ không phải tóm tắt thông qua Tạo ra được tăng cường bằng Truy xuất (RAG), tôi đã chèn ngẫu nhiên nội dung không liên quan cứ sau 500 dòng. Những nội dung chèn ngẫu nhiên này bao gồm:
• “Môn thể thao yêu thích của Peanut là quần vợt.”
• “Đội bóng rổ yêu thích của Peanut là Lakers.”
• “Peanut thích đội mũ vòm màu trắng.”
• “Món ăn yêu thích của Peanut là tôm bọ ngựa.”
Các vòng thử nghiệm:
Vòng 1: Cursor Composer (Chế độ bình thường)
Cursor đã không chủ động định vị hoặc đọc tệp phụ đề, dẫn đến nhiệm vụ thất bại.
Vòng 2: Cursor Composer (Chế độ Agent)
Ở chế độ Agent, Cursor đã tìm thấy và đọc tệp phụ đề nhưng chỉ đọc 250 dòng.
Vòng 3: Windsurf Cascade (Chế độ Agent mặc định)
Windsurf đã tìm thấy và đọc tệp phụ đề, cố gắng đọc nó ba lần nhưng chỉ đạt được 600 dòng.
Vòng 4: Cursor Compose (Chế độ @ tệp đơn)
Bằng cách rõ ràng @ tệp, Cursor đã đọc đầy đủ tất cả 1.955 dòng, trả về kết quả chính xác lần đầu tiên. Nó cũng đã vượt qua các câu hỏi “bẫy” ngẫu nhiên, xác nhận rằng nó thực sự đã đọc nội dung.
Vòng 5: Cursor Compose (Chế độ @codebase)
Cursor đã tóm tắt nội dung của video nhưng đã thất bại trong tất cả các câu hỏi bẫy. Điều này cho thấy rằng ở chế độ này, Cursor đã sử dụng một mô hình nhỏ hơn để thực hiện nhiều lần đọc và chỉ trả về thông tin tóm tắt cho ngữ cảnh.
Vòng 6: Windsurf Cascade (Chế độ @ tệp đơn)
Việc rõ ràng @ tệp trong Windsurf vẫn dẫn đến việc tóm tắt chỉ 600 dòng, xác nhận rằng nó đã không đọc đầy đủ tệp.
Đề xuất sử dụng Cursor và Windsurf trong các trường hợp khác nhau
- Giữ cho mỗi tệp mã dưới 500 dòng. Điều này đảm bảo rằng tệp vẫn nằm trong phạm vi mà Cursor Agent có thể đọc trong hai lần thử.
- Tài liệu rõ ràng chức năng và logic triển khai của mỗi tệp mã trong 100 dòng đầu tiên. Sử dụng chú thích để giúp Agent dễ dàng lập chỉ mục và hiểu mục đích của tệp.
- Đối với người mới bắt đầu hoặc các dự án đơn giản trong giai đoạn đầu, Windsurf hiệu quả hơn. Windsurf rất giỏi trong việc xử lý các nhiệm vụ và dự án đơn giản cho người dùng mới.
- Đối với các dự án phức tạp với các tệp vượt quá 600 dòng. Nếu bạn quen thuộc với dự án, hiểu nhiệm vụ của mình và biết tệp mã nào liên quan, việc sử dụng Cursor và rõ ràng @ các tệp tương ứng sẽ mang lại kết quả tốt nhất.
- Khởi động lại cuộc trò chuyện thường xuyên. Ví dụ: sau khi hoàn thành một tính năng mới hoặc sửa lỗi, việc khởi động lại tương tác giúp ngăn chặn ngữ cảnh dài làm ảnh hưởng đến dự án.
- Thường xuyên ghi lại trạng thái và cấu trúc của dự án trong một tệp chuyên dụng (ví dụ: README.md). Điều này cho phép Cursor và Windsurf nhanh chóng hiểu trạng thái của dự án khi khởi động lại cuộc trò chuyện, giảm thiểu nguy cơ mang đến ngữ cảnh quá nhiều hoặc không cần thiết.
Lưu ý: Bài viết này được Hoa thúc ủy quyền dịch và đăng lại. Liên kết tiếng Trung gốc: https://mp.weixin.qq.com/s/Fl-K-tdRuhlT9I-bcLbtdg