Menu

Chain of thought prompting: suy nghĩ từng bước

Chain of thought prompting yêu cầu mô hình viết ra quá trình suy luận trước khi đưa ra câu trả lời. Kỹ thuật này hiệu quả nhất với các bài toán và bài logic nhiều bước, và ít quan trọng hơn với các mô hình suy luận vốn đã suy nghĩ trước khi trả lời.

Mọi prompt bên dưới đều có thể chỉnh sửa: thay đổi nó, rồi mở trong ChatGPT, Claude hoặc ứng dụng AI khác.

Chain of thought prompting (prompt chuỗi suy luận) yêu cầu mô hình ngôn ngữ viết ra các bước trung gian của một bài toán trước khi đưa ra câu trả lời cuối cùng. Với những bài toán cần nhiều bước, như bài toán có lời văn, câu đố logic hay xếp lịch, việc giải công khai từng bước thường cho nhiều câu trả lời đúng hơn so với trả lời ngay, và để lại cho bạn các bước có thể kiểm tra. Phiên bản ngắn nhất chỉ là một câu thêm vào prompt: "Hãy suy nghĩ từng bước."

Vì sao viết ra các bước lại có ích

Mô hình tạo câu trả lời từng token một, và mọi thứ nó đã viết trở thành đầu vào cho token tiếp theo. Nếu prompt đòi câu trả lời ngay lập tức, mô hình phải đưa ra đáp án trước khi có bất kỳ kết quả trung gian nào trên trang. Nếu trước tiên nó viết "Doanh thu cà phê thứ Hai là $168", con số đó giờ đã nằm trong ngữ cảnh, và bước tiếp theo có thể dựa vào nó thay vì phải ngầm ghi nhớ.

Đó là trực giác. Bằng chứng đến từ hai bài báo năm 2022. Wei và cộng sự, trong "Chain-of-Thought Prompting Elicits Reasoning in Large Language Models", cho thấy các ví dụ mẫu có viết ra lời suy luận giúp các mô hình lớn làm tốt hơn ở các bài suy luận số học, suy luận thông thường và suy luận ký hiệu. Họ cũng phát hiện lợi ích này phụ thuộc vào quy mô: các mô hình nhỏ hơn không được cải thiện, và thường viết ra lời suy luận trôi chảy nhưng dẫn đến đáp án sai. Sau đó Kojima và cộng sự, trong "Large Language Models are Zero-Shot Reasoners", cho thấy chỉ một câu không kèm ví dụ nào, "Let's think step by step" (hãy suy nghĩ từng bước), cũng cải thiện kết quả đáng kể, dù nhìn chung kém hơn so với dùng ví dụ mẫu.

Trả lời trực tiếp và chain of thought

Cả hai tab đều hỏi cùng một câu. Tab đầu chỉ đòi con số; tab thứ hai yêu cầu trình bày cách làm và đặt đáp án ở một dòng cuối cố định.

Một quán cà phê bán cà phê giá $3,50 và bánh muffin giá $2,25. Thứ Hai quán bán được 48 ly cà phê và một số bánh muffin, tổng thu được $213. Thứ Ba quán bán ít hơn thứ Hai 10 ly cà phê và số bánh muffin gấp đôi. Thứ Ba quán thu được bao nhiêu? Chỉ trả lời bằng số tiền.
Try it
Example replyReplies vary between models and runs.

$258

Câu trả lời trực tiếp cho thấy một lỗi điển hình: 258laˋ258 là 168 tiền cà phê của thứ Hai cộng $90 tiền bánh muffin của thứ Ba, tức là nó quên rằng thứ Ba bán ít hơn 10 ly cà phê. Câu trả lời từng bước dành riêng một dòng cho số ly cà phê thứ Ba, nên bước đó không thể bị bỏ qua mà không ai hay. Một mô hình hiện nay cũng có thể trả lời đúng phiên bản trực tiếp; khoảng cách sẽ lớn dần khi bài toán dài hơn và các bước phụ thuộc vào nhau nhiều hơn.

Các bước được viết ra còn có lợi ích thứ hai: khi đáp án sai, bạn thấy được bước nào hỏng, và có thể sửa prompt hoặc đầu vào ngay tại chỗ đó.

Chain of thought few-shot

Kỹ thuật gốc của Wei và cộng sự đưa vào prompt các ví dụ mẫu có câu trả lời trình bày lời suy luận, và mô hình trả lời câu hỏi mới theo cùng cách đó. Ví dụ bên dưới được phỏng theo hình đầu tiên trong bài báo của họ; câu hỏi phía sau là câu hỏi mới. Thử đổi câu hỏi để kiểm tra với bài của riêng bạn.

Chain of thought few-shot
Fill in
Parts
H: Roger có 5 quả bóng tennis. Anh ấy mua thêm 2 hộp bóng tennis. Mỗi hộp có 3 quả. Bây giờ anh ấy có bao nhiêu quả bóng tennis? Đ: Ban đầu Roger có 5 quả bóng. 2 hộp, mỗi hộp 3 quả, là 6 quả bóng tennis. 5 + 6 = 11. Đáp án là 11.
H: Một thư viện có 120 cuốn sách trên kệ. Thư viện cho mượn 45 cuốn, nhận lại 18 cuốn và được tặng 30 cuốn. Bây giờ trên kệ có bao nhiêu cuốn sách? Đ:
Try it
Example replyReplies vary between models and runs.

Ban đầu thư viện có 120 cuốn sách. Cho mượn 45 cuốn còn lại 75 cuốn trên kệ. Nhận lại 18 cuốn thành 93. Được tặng 30 cuốn nâng lên 123. Đáp án là 123.

CoT few-shot cho bạn kiểm soát hình thức của lời suy luận: dài bao nhiêu, trình bày chi tiết những gì và nêu đáp án ra sao. "Đáp án là 11" trong ví dụ là một câu kết cố định, và câu trả lời đã chép theo. CoT zero-shot viết nhanh hơn nhưng để mô hình tự quyết những điều đó. Để tìm hiểu thêm về cách xây dựng bộ ví dụ, xem few-shot prompting; với phiên bản chỉ dùng chỉ dẫn, xem zero-shot prompting.

Đặt đáp án trên một dòng riêng

Khi câu trả lời có chứa lời suy luận, đáp án nằm đâu đó trong một đoạn văn, và đó là vấn đề khi một chương trình cần đọc nó. Hãy yêu cầu đáp án theo một dạng cố định ở dòng cuối, như prompt quán cà phê làm với "Answer: $X" (nên giữ nguyên nhãn cố định này, vì code sẽ tìm đúng nó), rồi đọc dòng đó bằng code:

import re

matches = re.findall(r"^Answer:\s*(.+)$", reply, re.MULTILINE)
answer = matches[-1] if matches else None

Lấy kết quả khớp cuối cùng là điều quan trọng, vì bản thân lời suy luận có thể chứa một dòng bắt đầu bằng "Answer:" trước khi mô hình tự sửa lại. Nếu người dùng chỉ nên thấy đáp án, hãy yêu cầu lời suy luận nằm trong một cặp thẻ và đáp án nằm trong một cặp thẻ khác, rồi chỉ hiển thị phần thứ hai. Bài đầu ra có cấu trúc hướng dẫn cách yêu cầu JSON khi bạn cần nhiều hơn một trường.

Mô hình suy luận

Một số mô hình hiện nay được xây dựng để suy nghĩ trước khi trả lời: chúng tạo ra lời suy luận ở bên trong, thường bị ẩn hoặc được tóm tắt, trước câu trả lời hiển thị. Với các mô hình này, "Hãy suy nghĩ từng bước" ít quan trọng hơn nhiều, vì các bước vẫn diễn ra dù bạn có yêu cầu hay không. Thêm câu đó thường chỉ làm câu trả lời hiển thị dài hơn.

Điều vẫn có ích với mô hình suy luận là mọi thứ xung quanh việc suy luận: mô tả đầy đủ bài toán, các ràng buộc mà một đáp án đúng phải thỏa mãn, và định dạng của đáp án cuối cùng. Hãy mô tả một câu trả lời tốt trông như thế nào thay vì viết kịch bản cho từng bước; một công thức cố định gồm các bước có thể kéo mô hình ra khỏi một hướng đi tốt hơn mà lẽ ra nó tự tìm được.

Khi nào không nên dùng chain of thought

Chain of thought tốn token và thời gian, và chỉ đáng giá khi tác vụ có các bước phụ thuộc lẫn nhau. Với việc tra cứu, dịch, viết lại hay phân loại đơn giản, nó chỉ làm câu trả lời dài hơn. Mô hình cũng có thể viết ra lời suy luận trông hợp lý mà vẫn đi đến đáp án sai, nên hãy kiểm tra riêng kết quả cuối cùng, không chỉ các bước dẫn đến nó.

Với những bài toán khó mà một chuỗi suy luận duy nhất có thể đi sai, có hai kỹ thuật mở rộng dựa trên nó. Self-consistency prompting lấy mẫu nhiều chuỗi suy luận và chọn đáp án mà phần lớn các chuỗi đạt được, còn tree of thought prompting khám phá và so sánh nhiều hướng suy luận dang dở trước khi chọn một hướng.

Câu hỏi thường gặp

Chain of thought prompting là gì?

Chain of thought (CoT) prompting yêu cầu mô hình ngôn ngữ viết ra các bước trung gian của một bài toán trước câu trả lời cuối cùng, bằng cách đưa ra các ví dụ mẫu có kèm lời giải, hoặc thêm một chỉ dẫn như "Hãy suy nghĩ từng bước." Với các bài toán nhiều bước, cách này thường cho ra nhiều câu trả lời đúng hơn, và giúp bạn kiểm tra được từng bước.

"Hãy suy nghĩ từng bước" có còn hiệu quả không?

Với các mô hình chat thông thường, câu này vẫn có ích cho những bài toán cần nhiều bước, nhất là khi prompt vốn thúc mô hình trả lời ngay lập tức. Các mô hình suy luận, vốn suy nghĩ trước khi trả lời, đã làm việc này ở bên trong, nên câu này hầu như không giúp gì thêm ngoài việc làm câu trả lời dài hơn. Với những mô hình đó, hãy nêu rõ bài toán và định dạng câu trả lời.

Khi nào chain of thought có ích, khi nào thì không?

Nó có ích cho những tác vụ cần nhiều bước phụ thuộc lẫn nhau: bài toán có lời văn, tính toán số học, câu đố logic, xếp lịch có ràng buộc và lần theo những gì code thực hiện. Nó hầu như không giúp gì cho việc tra cứu, dịch, viết lại hay phân loại đơn giản, khi đó nó chỉ làm câu trả lời dài và chậm hơn.

Chain of thought zero-shot và few-shot khác nhau thế nào?

CoT few-shot, do Wei và cộng sự giới thiệu năm 2022, đưa vào prompt các ví dụ mẫu kèm lời suy luận, và mô hình bắt chước cách suy luận đó. CoT zero-shot, từ Kojima và cộng sự năm 2022, không dùng ví dụ nào mà chỉ thêm một chỉ dẫn như "Hãy suy nghĩ từng bước." Zero-shot viết nhanh hơn; few-shot cho bạn kiểm soát nhiều hơn về hình thức các bước.

Phần suy luận được viết ra có phải là cách mô hình thực sự tìm ra câu trả lời không?

Không hẳn. Các bước là văn bản do mô hình tạo ra, và chúng có thể đọc lên rất hợp lý trong khi câu trả lời cuối lại sai, hoặc chứa lỗi trong khi câu trả lời tình cờ đúng. Hãy coi phần suy luận là thứ cần kiểm tra, không phải bằng chứng, và kiểm chứng riêng câu trả lời cuối cùng.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu