Menu

Prompt chaining: chia tác vụ thành từng bước

Prompt chaining chia một công việc thành chuỗi các prompt nhỏ hơn, trong đó đầu ra của mỗi bước trở thành đầu vào của bước tiếp theo. Mỗi bước làm một việc, và bạn có thể kiểm tra kết quả trước khi bước sau chạy.

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.

Prompt chaining nghĩa là chia một công việc thành một chuỗi prompt, trong đó đầu ra của prompt này trở thành một phần đầu vào của prompt kế tiếp. Thay vì nhờ model đọc năm mươi đánh giá, tìm vấn đề, xếp hạng chúng và viết báo cáo trong một lần, bạn yêu cầu từng việc một. Mỗi prompt có một nhiệm vụ, và giữa các bước, bạn (hoặc code của bạn) có thể xem kết quả, sửa nó hoặc dừng lại.

Khối bên dưới là một chuỗi ba bước biến đánh giá của khách hàng thành một ghi chú cho nhóm sản phẩm. Mỗi tab là một bước. Đầu vào của bước 2 là câu trả lời của bước 1 được dán vào, và đầu vào của bước 3 là câu trả lời của bước 2.

Fill in
Liệt kê mọi lời phàn nàn trong các đánh giá nằm trong thẻ <reviews>. Bỏ qua lời khen. Trả về một mảng JSON gồm các đối tượng có khóa "review" (số thứ tự đánh giá) và "complaint" (tối đa tám chữ). Chỉ trả về JSON. <reviews> 1. Pin hết sau 4 tiếng, và dây sạc thì quá ngắn. 2. Âm thanh tuyệt vời. Có điều ứng dụng cứ tự đăng xuất. 3. Rất thích, nhưng pin gần như không đủ cho quãng đường về nhà. 4. Ứng dụng bị crash hai lần khi kết nối, và pin tụt nhanh. 5. Dây ngắn tới mức tôi không thể vừa sạc vừa dùng ở bàn làm việc. </reviews>
Try it
Example replyReplies vary between models and runs.
[
  {"review": 1, "complaint": "Pin hết sau 4 tiếng"},
  {"review": 1, "complaint": "Dây sạc quá ngắn"},
  {"review": 2, "complaint": "Ứng dụng cứ tự đăng xuất"},
  {"review": 3, "complaint": "Pin không đủ cho quãng đường về"},
  {"review": 4, "complaint": "Ứng dụng crash khi kết nối"},
  {"review": 4, "complaint": "Pin tụt nhanh"},
  {"review": 5, "complaint": "Dây quá ngắn để vừa sạc vừa dùng"}
]

Bước 1 chỉ đọc và trích xuất. Bước 2 không bao giờ thấy các đánh giá, chỉ thấy danh sách, nên nó không thể quay sang tóm tắt chúng. Bước 3 chỉ viết. Nếu bước 3 trả về sai giọng văn, bạn chỉ chạy lại bước 3; phần trích xuất và phần nhóm vẫn giữ nguyên.

Để ý những gì bước 3 không nhắc tới: có một chiếc pin hết sau 4 tiếng, hay các vấn đề của ứng dụng là tự đăng xuất và crash. Bước 3 chỉ nhận tên các chủ đề, nên những chi tiết đó không nằm trong đầu vào của nó. Quyết định mỗi bước nhận được gì là lựa chọn thiết kế chính trong một chuỗi prompt, và chi tiết nào bạn muốn có trong câu trả lời cuối cùng thì phải được chuyển xuống qua mọi bước.

Vì sao nên chia chuỗi thay vì viết một prompt lớn

Mỗi bước có một nhiệm vụ và một tiêu chuẩn. Một prompt duy nhất đòi trích xuất, phân tích và viết trau chuốt sẽ phải cân bằng ba mục tiêu, và chẳng có gì cho bạn biết mục tiêu nào đã bị làm qua loa. Một prompt chỉ có một nhiệm vụ có thể nói chính xác kết quả tốt trông như thế nào cho nhiệm vụ đó, và bạn có thể đối chiếu câu trả lời với tiêu chuẩn ấy.

Bạn kiểm tra được phần giữa. Trong một prompt duy nhất, một lời phàn nàn bị bỏ sót sẽ biến mất trong một đoạn văn được viết khéo và bạn không bao giờ thấy nó. Trong một chuỗi prompt, danh sách từ bước 1 nằm ngay trước mắt. Kiểm tra nó chỉ mất vài giây, và sửa nó trước bước 2 rẻ hơn nhiều so với phát hiện lỗi trong báo cáo cuối cùng.

Mỗi bước có thể dùng thiết lập riêng. Bước trích xuất và nhóm cần temperature thấp và đầu ra có cấu trúc mà code có thể phân tích. Bước viết có thể tự do hơn. Trong code, bạn thậm chí có thể gửi các bước khác nhau tới các model khác nhau, chẳng hạn một model nhỏ và nhanh cho bước trích xuất.

Lỗi nằm khoanh vùng. Khi chuỗi bị hỏng, bạn biết bước nào hỏng và chỉ cần chạy lại bước đó.

Cái giá phải trả cũng có thật. Chuỗi prompt gọi model nhiều lần hơn, nên lâu hơn và tốn kém hơn một prompt. Và một lỗi lọt qua bước đầu sẽ bị mang theo vào mọi bước sau, đó là lý do các bước ở giữa đáng được kiểm tra.

Cách thiết kế một chuỗi prompt

  1. Viết ra các bước bạn sẽ làm nếu làm bằng tay. Nếu bạn sẽ lập danh sách trước, rồi sắp xếp, rồi viết thành bài, thì đó là ba prompt. Những bước cần kiểu tư duy khác nhau là chỗ tự nhiên để tách.
  2. Quyết định định dạng đầu ra của mỗi bước trước khi viết prompt cho nó. Thứ mà bước sau nhận vào nên dễ đọc và dễ kiểm tra: một mảng JSON, một danh sách đánh số, một bảng. Văn xuôi tự do chỉ hợp với bước cuối.
  3. Chỉ chuyển những gì bước sau cần. Bước 2 ở trên nhận danh sách lời phàn nàn chứ không nhận các đánh giá. Đầu vào ít hơn thì ít thứ gây xao nhãng hơn, và mỗi bước có thể được thử nghiệm riêng.
  4. Thêm bước kiểm tra giữa các bước. Trong code, hãy phân tích JSON và xác nhận các trường có tồn tại. Với những việc cần phán đoán, bản thân bước kiểm tra có thể là một prompt: "Danh sách này có chứa mọi lời phàn nàn trong các đánh giá này không? Trả lời có hoặc không, rồi liệt kê những lời phàn nàn bị thiếu."
  5. Đánh dấu rõ phần nội dung được dán vào. Đầu vào của mỗi bước là văn bản do một bước trước tạo ra, và dấu phân cách giúp model không đọc nó như chỉ dẫn mới.

Dưới đây là một bước kiểm tra cho chuỗi ở trên, chạy trên một phiên bản đầu ra của bước 1 đã bỏ sót một lời phàn nàn. Một bước kiểm tra như thế này là một prompt riêng với một câu hỏi hẹp, nên dễ làm đúng hơn chính việc trích xuất.

Kiểm tra một bước trước khi chuyển tiếp
So sánh các đánh giá trong thẻ <reviews> với danh sách lời phàn nàn trong thẻ <complaints>. Danh sách có chứa mọi lời phàn nàn trong các đánh giá không? Trả lời "Đầy đủ" hoặc "Chưa đầy đủ" ở dòng đầu tiên. Nếu chưa đầy đủ, liệt kê từng lời phàn nàn bị thiếu kèm số thứ tự đánh giá. <reviews> 1. Pin hết sau 4 tiếng, và dây sạc thì quá ngắn. 2. Âm thanh tuyệt vời. Có điều ứng dụng cứ tự đăng xuất. 3. Rất thích, nhưng pin gần như không đủ cho quãng đường về nhà. 4. Ứng dụng bị crash hai lần khi kết nối, và pin tụt nhanh. 5. Dây ngắn tới mức tôi không thể vừa sạc vừa dùng ở bàn làm việc. </reviews> <complaints> Đánh giá 1: Pin hết sau 4 tiếng Đánh giá 1: Dây sạc quá ngắn Đánh giá 2: Ứng dụng cứ tự đăng xuất Đánh giá 3: Pin không đủ cho quãng đường về Đánh giá 4: Ứng dụng crash khi kết nối Đánh giá 5: Dây quá ngắn để vừa sạc vừa dùng </complaints>
Try it
Example replyReplies vary between models and runs.

Chưa đầy đủ

  • Đánh giá 4: pin tụt nhanh

Nếu bước kiểm tra trả lời "Chưa đầy đủ", hãy chạy lại bước 1 hoặc tự thêm mục bị thiếu trước khi bước 2 chạy.

Chuỗi prompt trong code

Trong code, một chuỗi prompt là một loạt lần gọi, trong đó mỗi prompt được dựng từ câu trả lời trước đó. Phiên bản này dùng Anthropic Python SDK; cấu trúc tương tự dùng được với bất kỳ nhà cung cấp nào.

import json
import anthropic

client = anthropic.Anthropic()
MODEL = "your-model-id"  # e.g. from your provider's model list

def ask(prompt):
    response = client.messages.create(
        model=MODEL,
        max_tokens=1024,
        messages=[{"role": "user", "content": prompt}],
    )
    return response.content[0].text

reviews = open("reviews.txt", encoding="utf-8").read()

complaints = ask(
    "List every complaint in the reviews inside the <reviews> tags. Ignore praise. "
    'Return a JSON array of objects with the keys "review" and "complaint". '
    "Return only the JSON, with no code fence.\n\n"
    f"<reviews>\n{reviews}\n</reviews>"
)
json.loads(complaints)  # raises an error here if step 1 did not return valid JSON

themes = ask(
    "Group these complaints into themes. Return only a JSON array with the keys "
    '"theme", "count" and "reviews", sorted by count, highest first.\n\n'
    f"<complaints>\n{complaints}\n</complaints>"
)

note = ask(
    "Write a note of at most four sentences to the product team based on these "
    f"themes. Lead with the most common one.\n\n<themes>\n{themes}\n</themes>"
)
print(note)

Dòng json.loads là bước kiểm tra đơn giản nhất có thể: nếu bước 1 trả lời bằng văn xuôi, chuỗi dừng ngay tại đó thay vì chuyển đầu vào hỏng đi tiếp. Một chuỗi prompt chạy thật trong sản phẩm còn kiểm tra các trường, thử lại một bước bị lỗi một lần, và ghi log từng kết quả trung gian để có thể lần ngược một câu trả lời cuối cùng tệ về đúng bước đã gây ra nó.

Prompt chaining trong ứng dụng chat

Bạn không cần code để nối các prompt. Chạy bước 1, đọc câu trả lời, sửa những chỗ sai, rồi dán vào prompt của bước 2. Làm mỗi bước trong một cuộc chat mới giúp cuộc trò chuyện trước đó không nằm trong ngữ cảnh, nên một chỉ dẫn viết cho bước này không ảnh hưởng tới bước sau. Ở lại một cuộc chat thì nhanh hơn và ổn khi các bước liên quan chặt chẽ với nhau, nhưng toàn bộ lịch sử sẽ đi kèm theo mọi tin nhắn mới.

So sánh prompt chaining với các kỹ thuật liên quan

Chain of thought là phần suy luận được viết ra trong một câu trả lời; một chuỗi prompt là nhiều câu trả lời, và bạn kiểm soát những gì được chuyển giữa chúng. Hai kỹ thuật này kết hợp tốt: bất kỳ bước nào trong chuỗi cũng có thể yêu cầu suy luận từng bước.

Trong một chuỗi prompt, các bước do bạn cố định từ trước. Khi chính model quyết định bước tiếp theo, chẳng hạn tìm kiếm, đọc một kết quả rồi chọn một hành động khác, thì đó là một vòng lặp agent, được mô tả trong ReAct prompting. Chuỗi cố định dễ kiểm thử và dễ dự đoán hơn, nên đó là điểm khởi đầu tốt hơn bất cứ khi nào bạn đã biết các bước.

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

Prompt chaining là gì?

Prompt chaining là kỹ thuật chia một tác vụ thành nhiều prompt chạy lần lượt, và đầu ra của mỗi prompt được đưa vào prompt tiếp theo. Ví dụ, prompt đầu tiên trích xuất các lời phàn nàn từ đánh giá, prompt thứ hai nhóm chúng thành chủ đề, và prompt thứ ba viết báo cáo từ các chủ đề đó.

Prompt chaining khác chain of thought thế nào?

Chain of thought diễn ra bên trong một câu trả lời: model viết ra phần suy luận trước khi đưa ra đáp án. Prompt chaining dùng nhiều lần gọi riêng biệt, và bạn hoặc code của bạn chuyển kết quả của lần gọi này sang lần gọi sau. Bạn có thể xem, sửa hoặc chạy lại bất kỳ bước nào trong chuỗi, điều mà bạn không làm được với phần suy luận nằm trong một câu trả lời.

Có thể dùng prompt chaining trong ChatGPT hoặc Claude mà không cần code không?

Có. Chạy prompt đầu tiên, kiểm tra câu trả lời, rồi dán nó vào prompt tiếp theo, trong cùng cuộc chat hoặc một cuộc chat mới. Mở cuộc chat mới cho mỗi bước giúp các bản nháp và chỉ dẫn trước đó không ảnh hưởng đến các bước sau.

Khi nào nên dùng prompt chaining thay vì một prompt duy nhất?

Dùng chuỗi prompt khi một prompt đòi hỏi nhiều loại việc khác nhau, như trích xuất, phân tích và viết, hoặc khi bạn cần kiểm tra hay dùng lại một kết quả trung gian. Nếu một prompt đã cho câu trả lời đáng tin cậy, chuỗi prompt chỉ thêm lần gọi, chi phí và thời gian chờ.

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