Quay lại blog

AI cho người mớiHướng dẫn

Few-shot prompting: cho model xem 3–5 ví dụ để có định dạng của bạn

Cách 3–5 ví dụ được gắn thẻ khiến model trả lời theo nhãn hoặc JSON của bạn, với một yêu cầu Python và chi phí đầu vào thêm mỗi yêu cầu.

Bởi CheapTokens TeamĐã xuất bản 7 phút đọc

Ảnh bìa: một prompt few-shot với một ticket ví dụ và nhãn của nó
Trên trang này
  1. “Few-shot” nghĩa là gì
  2. Ba quy tắc cho ví dụ hiệu quả
  3. Gửi nó qua API
  4. Năm ví dụ thêm gì vào hóa đơn
  5. JSON, giọng điệu và kiểm tra ví dụ của bạn

Bot ticket của bạn nên trả lời bằng một từ: billing, bug hoặc other. Hầu hết các câu trả lời đều đúng như vậy. Rồi có một câu đến dưới dạng “Label: billing — the customer seems upset about a refund”, và đoạn code đọc nhãn bị kẹt.

Cách sửa thông thường không phải là một chỉ dẫn dài hơn. Mà là một vài ví dụ: đưa 3–5 ticket đã hoàn chỉnh kèm nhãn của chúng vào prompt, và model sẽ sao chép mẫu đó. Đó là few-shot prompting. Hướng dẫn prompting của Anthropic (mục “Use examples effectively”, kiểm tra ngày 3 tháng 11 năm 2026) gọi ví dụ là một trong những cách đáng tin cậy nhất để định hướng định dạng, giọng điệu và cấu trúc, và khuyến nghị 3–5 ví dụ. Vấn đề là: mỗi ví dụ là đầu vào bạn phải trả tiền lại với mỗi yêu cầu. Phần chi phí bên dưới tính toán cho một bot xử lý 2.000 ticket mỗi ngày.

“Few-shot” nghĩa là gì#

Hãy hình dung một đồng nghiệp mới trong ngày đầu tiên ở bàn hỗ trợ. Bạn nói “gắn nhãn mỗi ticket là billing, bug hoặc other” rồi bỏ đi. Một số nhãn sẽ khớp với ý bạn, một số sẽ không. Giờ hãy để lại ba ticket đã được gắn nhãn và nói “như thế này”. Cùng một đồng nghiệp, ít bất ngờ hơn nhiều.

Model cũng hành xử như vậy. Chỉ có chỉ dẫn được gọi là zero-shot. Chỉ dẫn cộng với một vài ví dụ mẫu là few-shot (trang của Anthropic cũng gọi là multishot). Một “shot” chỉ là một ví dụ.

So sánh

Cùng một nhiệm vụ, hai prompt

Chỉ có chỉ dẫn

text
Label the support ticket as billing, bug or other.

Chỉ dẫn cộng với ví dụ

text
Label the support ticket with one word: billing, bug or other.

Ticket: I was charged twice for one top-up.
Label: billing

Ticket: The export button does nothing.
Label: bug

Ticket: Do you have a dark theme?
Label: other

Prompt thứ hai không bao giờ giải thích billing nghĩa là gì. Các ví dụ làm điều đó bằng cách chỉ ra, và chúng mang theo định dạng cùng với ý nghĩa. Một dòng chỉ dẫn rõ ràng vẫn không hại gì, nên phiên bản bên dưới giữ nó.

Ba quy tắc cho ví dụ hiệu quả#

Trang của Anthropic tóm gọn ví dụ tốt thành ba từ:

  • Liên quan: gần với những ticket bạn thực sự nhận được, không phải một nhiệm vụ khác.
  • Đa dạng: chúng bao phủ các trường hợp biên và khác nhau, để model không bám vào một mẫu ngẫu nhiên.
  • Có cấu trúc: được bọc trong các thẻ (<example>, và một vài thẻ bên trong <examples>) để model phân biệt được ví dụ với chỉ dẫn. Cùng trang đó nói giữ tên thẻ nhất quán.

Đây là một prompt đầy đủ được xây dựng theo cách đó. Lưu nó thành prompt.txt:

text
<instructions>
Label the support ticket with exactly one word: billing, bug or other.
Reply with the label only.
</instructions>

<examples>
<example>
<ticket>I was charged twice for the same top-up.</ticket>
<label>billing</label>
</example>
<example>
<ticket>The export button does nothing when I click it.</ticket>
<label>bug</label>
</example>
<example>
<ticket>Do you have a dark theme?</ticket>
<label>other</label>
</example>
<example>
<ticket>Please refund me. Also, the page crashes on login.</ticket>
<label>billing</label>
</example>
<example>
<ticket>Is there an API for exporting reports?</ticket>
<label>other</label>
</example>
</examples>

Hãy xem ví dụ thứ tư: một yêu cầu hoàn tiền cũng đề cập đến một sự cố. Một chỉ dẫn không thể giải quyết một ticket hỗn hợp, một ví dụ thì có thể. Ở đây tiền thắng, nên nhãn là billing. Dù bạn chọn quy tắc nào, hãy thể hiện nó một lần.

Ghép cặp

Quy tắc nào bị vi phạm?

  • Ví dụ của bạn là lời chào chat một dòng, nhưng ticket thật là email dàiKhông liên quan: ví dụ phải gần với nhiệm vụ thật
  • Tất cả ví dụ của bạn đều mang cùng một nhãnKhông đa dạng: model có thể bắt gặp một mẫu ngẫu nhiên
  • Ví dụ được dán dưới dạng văn bản rời giữa các chỉ dẫnKhông có cấu trúc: bọc chúng trong thẻ để chúng không bị nhầm với chỉ dẫn

Gửi nó qua API#

Prompt là cùng một văn bản trong mọi yêu cầu, và chỉ ticket mới thay đổi. Mỗi ticket đi qua cùng một hành trình ngắn:

Chỉ dẫn, ví dụ và ticket mới đi vào một yêu cầu; một nhãn trả về
Một yêu cầu mỗi ticket: chỉ dẫn và ví dụ giữ nguyên, ticket thay đổi

Đây là nó trong Python với gói openai. Địa chỉ là API CheapTokens, khóa nằm trong một biến môi trường (xem cách lưu khóa an toàn), và id model là id đầy đủ từ tài liệu:

python
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.cheaptokens.dev/v1",
    api_key=os.environ["CHEAPTOKENS_API_KEY"],
)

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


def label(ticket: str) -> str:
    response = client.chat.completions.create(
        model="deepseek-ai/DeepSeek-V4-Flash-0731",
        max_tokens=64,
        messages=[
            {"role": "system", "content": PROMPT},
            {"role": "user", "content": f"<ticket>{ticket}</ticket>"},
        ],
    )
    print(response.usage.prompt_tokens, response.usage.completion_tokens)
    return response.choices[0].message.content.strip()


print(label("The app shows a blank screen after the update."))

Khi nó hoạt động, bạn thấy hai số đếm token trên một dòng và sau đó là nhãn, một từ như bug. Nếu bạn nhận được một câu thay vì một từ, các ví dụ chưa làm tròn vai trò: kiểm tra các thẻ và đảm bảo mọi nhãn trong sơ đồ của bạn xuất hiện ít nhất một lần.

Số đầu tiên là số cần chú ý. Đó là toàn bộ prompt, chỉ dẫn cộng ví dụ cộng ticket, và nó tăng lên với mỗi ví dụ bạn thêm. Chạy script một lần với prompt.txt đầy đủ và một lần chỉ với phần <instructions>: khoảng cách giữa hai số đầu tiên là chi phí ví dụ của bạn mỗi yêu cầu.

DeepSeek-V4-Flash phù hợp với kiểu gắn nhãn hàng loạt này: một mức giá bất kể thời điểm trong ngày, ngữ cảnh 380K token (nên một khối ví dụ dài vừa dễ dàng) và tối đa 32.768 token mỗi câu trả lời. GLM-5.3-Flash, với ngữ cảnh 390K, cũng phù hợp cho các nhiệm vụ gắn nhãn ngắn. Cả hai đều có trên trang models, sau một số dư.

Năm ví dụ thêm gì vào hóa đơn#

Giả sử bot xử lý 2.000 ticket mỗi ngày. Giả sử một ticket khoảng 120 token và chỉ dẫn khoảng 80, nên một yêu cầu không có ví dụ là 80 + 120 = 200 token đầu vào. Năm ví dụ khoảng 60 token mỗi cái thêm 5 × 60 = 300, nên một yêu cầu có chúng là 200 + 300 = 500. Câu trả lời là một từ, gọi là 3 token đầu ra dù thế nào. Đây là các giả định: hãy thay bằng prompt_tokens mà script của bạn in ra.

Trong một ngày, 200 × 2.000 = 400.000 token đầu vào trở thành 500 × 2.000 = 1.000.000, trong khi đầu ra vẫn là 3 × 2.000 = 6.000 token. Trên DeepSeek-V4-Flash đó là $0.0066 một ngày không có ví dụ và $0.0156 có chúng. Các ví dụ khiến bạn tốn khoảng cách giữa hai con số đó, và theo Anthropic chúng mang lại cho bạn đầu ra nhất quán hơn.

Giống nhau trong mọi yêu cầu: chỉ dẫn và năm ví dụ. Mới mỗi lần: ticket
Chỉ ticket thay đổi giữa các yêu cầu

Bức ảnh đó ẩn một chi tiết hữu ích. Khối ví dụ giống hệt nhau trong mọi yêu cầu, đúng là kiểu phần đầu lặp lại mà prompt caching nói đến; prompt caching là gì giải thích cách nó hoạt động.

Đây là cùng tải, 500 đầu vào và 3 token đầu ra mỗi yêu cầu, 2.000 yêu cầu, trên các model. Bảng tính lại từ giá hiện tại:

Mô hình Mỗi yêu cầu 2.000 yêu cầu OpenRouter, 2.000 yêu cầu
GLM-5.3-Flash $0.00001 $0.0202 $0.034
DeepSeek-V4-Flash $0.0000078 $0.0156 $0.0708
MiniMax-M2.7 $0.000025 $0.0509 $0.611

500 token đầu vào và 3 token đầu ra mỗi yêu cầu. Giá trên 1 triệu token là giá hiện hành và thay đổi cùng với biểu phí của chúng tôi; cột OpenRouter hiển thị giá tham chiếu cho cùng khối lượng công việc.

Với đầu vào và đầu ra tính cùng nhau, DeepSeek-V4-Flash và GLM-5.3-Flash rẻ hơn OpenRouter ở tải này. Danh sách giá đầy đủ trên trang pricing.

JSON, giọng điệu và kiểm tra ví dụ của bạn#

Cùng một mẹo bao phủ hai trường hợp khác bạn sẽ gặp. Cần cùng các trường JSON mỗi lần? Hãy làm cho ví dụ trả lời chính JSON đó:

text
<example>
<ticket>I was charged twice for the same top-up.</ticket>
<output>{"label": "billing", "urgent": true}</output>
</example>

Về response_format và phải làm gì khi câu trả lời vẫn không hợp lệ, xem lấy JSON hợp lệ từ API LLM. Muốn văn bản được viết lại theo một giọng điệu? Các tính từ như “thân thiện nhưng ngắn gọn” rất mơ hồ; hai cặp trước-và-sau thể hiện tốt hơn.

Trước khi tin bất kỳ bộ ví dụ nào, hãy lấy 20 ticket bạn đã gắn nhãn thủ công, chạy chúng và so sánh. Một lần chạy cho bạn biết nhiều hơn bất kỳ quy tắc nào. Trang của Anthropic thêm một mẹo: yêu cầu model đánh giá ví dụ của bạn về độ liên quan và đa dạng, hoặc viết thêm từ những ví dụ bạn có.

Danh sách kiểm tra

Trước khi bạn tin ví dụ của mình

Khi các ví dụ hoạt động, câu hỏi tiếp theo là làm sao giữ nhiều tài liệu không bị nhòe vào nhau trong một prompt. Gắn nhãn mọi tài liệu trong một prompt đề cập đến điều đó.