Powrót do bloga

AI dla początkującychPrzewodnik

Few-shot prompting: pokaż modelowi 3–5 przykładów, by dostać swój format

Jak 3–5 przykładów w tagach sprawia, że model odpowiada twoimi etykietami lub JSON-em, z żądaniem w Pythonie i dodatkowym kosztem wejścia na żądanie.

Autor: CheapTokens TeamOpublikowano 5 min czytania

Okładka: prompt few-shot z przykładowym zgłoszeniem i jego etykietą
Na tej stronie
  1. Co znaczy „few-shot”
  2. Trzy zasady działających przykładów
  3. Wyślij to przez API
  4. Ile pięć przykładów dodaje do rachunku
  5. JSON, ton i sprawdzanie przykładów

Twój bot do zgłoszeń powinien odpowiadać jednym słowem: billing, bug lub other. Większość odpowiedzi to dokładnie to. Potem przychodzi „Label: billing — the customer seems upset about a refund”, a kod, który czyta etykietę, się dławi.

Zwykłe rozwiązanie to nie dłuższa instrukcja. To kilka przykładów: wstaw 3–5 gotowych zgłoszeń z ich etykietami do promptu, a model skopiuje wzorzec. To jest few-shot prompting. Przewodnik po promptach Anthropic (sekcja „Use examples effectively”, sprawdzony 3 listopada 2026) nazywa przykłady jednym z najbardziej niezawodnych sposobów sterowania formatem, tonem i strukturą i zaleca 3–5 z nich. Haczyk: każdy przykład to dane wejściowe, za które płacisz ponownie przy każdym żądaniu. Sekcja kosztów poniżej liczy to dla bota, który obsługuje 2 000 zgłoszeń dziennie.

Co znaczy „few-shot”#

Wyobraź sobie nowego kolegę w pierwszym dniu przy stanowisku wsparcia. Mówisz „oznacz każde zgłoszenie jako billing, bug lub other” i odchodzisz. Część oznaczeń będzie zgodna z twoim wyobrażeniem, część nie. Teraz zostaw trzy zgłoszenia już oznaczone i powiedz „jak te”. Ten sam kolega, znacznie mniej niespodzianek.

Modele zachowują się tak samo. Sama instrukcja to zero-shot. Instrukcja plus kilka rozwiązanych przykładów to few-shot (strona Anthropic mówi też multishot). „Shot” to po prostu przykład.

Porównaj

To samo zadanie, dwa prompty

Tylko instrukcja

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

Instrukcja plus przykłady

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

Drugi prompt nigdy nie wyjaśnia, co znaczy billing. Przykłady robią to przez pokazanie i niosą format razem ze znaczeniem. Jedna wyraźna linia instrukcji wciąż nie zaszkodzi, więc wersja poniżej ją zachowuje.

Trzy zasady działających przykładów#

Strona Anthropic sprowadza dobre przykłady do trzech słów:

  • Trafne: bliskie zgłoszeniom, które naprawdę dostajesz, a nie jakiemuś innemu zadaniu.
  • Różnorodne: obejmują przypadki brzegowe i różnią się od siebie, żeby model nie przyczepił się do przypadkowego wzorca.
  • Ustrukturyzowane: opakowane w tagi (<example>, i kilka wewnątrz <examples>), żeby model odróżnił przykłady od instrukcji. Ta sama strona mówi, by zachować spójne nazwy tagów.

Oto pełny prompt zbudowany w ten sposób. Zapisz go jako 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>

Spójrz na czwarty przykład: prośba o zwrot, która wspomina też o awarii. Instrukcja nie rozstrzygnie mieszanego zgłoszenia, przykład może. Tutaj wygrywają pieniądze, więc etykieta to billing. Jakąkolwiek zasadę wybierzesz, pokaż ją raz.

Dopasuj pary

Która zasada jest złamana?

  • Twoje przykłady to jednolinijkowe powitania z czatu, ale prawdziwe zgłoszenia to długie e-maileNietrafne: przykłady muszą być bliskie prawdziwemu zadaniu
  • Wszystkie twoje przykłady mają tę samą etykietęNieróżnorodne: model może przejąć przypadkowy wzorzec
  • Przykłady są wklejone jako luźny tekst między instrukcjamiNieustrukturyzowane: opakuj je w tagi, żeby nie można było ich pomylić z instrukcjami

Wyślij to przez API#

Prompt to ten sam tekst w każdym żądaniu, a zmienia się tylko nowe zgłoszenie. Każde zgłoszenie przechodzi tę samą krótką drogę:

Instrukcja, przykłady i nowe zgłoszenie trafiają do jednego żądania; wraca jedna etykieta
Jedno żądanie na zgłoszenie: instrukcje i przykłady zostają, zgłoszenie się zmienia

Oto to w Pythonie z pakietem openai. Adres to API CheapTokens, klucz siedzi w zmiennej środowiskowej (zobacz jak bezpiecznie przechowywać klucz), a id modelu to pełne id z dokumentacji:

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."))

Gdy działa, widzisz dwa liczniki tokenów w jednej linii, a potem samą etykietę, jedno słowo takie jak bug. Jeśli dostajesz zdanie, przykłady jeszcze nie robią swojego: sprawdź tagi i to, czy każda etykieta z twojego schematu pojawia się co najmniej raz.

Pierwsza liczba to ta, na którą trzeba patrzeć. To cały prompt, instrukcje plus przykłady plus zgłoszenie, i rośnie z każdym dodanym przykładem. Uruchom skrypt raz z pełnym prompt.txt i raz tylko z częścią <instructions>: różnica między dwiema pierwszymi liczbami to koszt twoich przykładów na żądanie.

DeepSeek-V4-Flash pasuje do takiego masowego etykietowania: jedna cena o każdej porze dnia, kontekst 380K tokenów (więc długi blok przykładów mieści się łatwo) i do 32 768 tokenów na odpowiedź. GLM-5.3-Flash z kontekstem 390K też działa do krótkich zadań etykietowania. Oba są na stronie modeli, za jednym saldem.

Ile pięć przykładów dodaje do rachunku#

Powiedzmy, że bot obsługuje 2 000 zgłoszeń dziennie. Załóż, że zgłoszenie to około 120 tokenów, a instrukcja około 80, więc żądanie bez przykładów to 80 + 120 = 200 tokenów wejściowych. Pięć przykładów po około 60 tokenów dodaje 5 × 60 = 300, więc żądanie z nimi to 200 + 300 = 500. Odpowiedź to jedno słowo, nazwijmy to 3 tokeny wyjściowe w obu przypadkach. To założenia: podstaw prompt_tokens, które wypisał twój skrypt.

W ciągu dnia 200 × 2 000 = 400 000 tokenów wejściowych staje się 500 × 2 000 = 1 000 000, podczas gdy wyjście zostaje na 3 × 2 000 = 6 000 tokenów. Na DeepSeek-V4-Flash to $0.0066 dziennie bez przykładów i $0.0156 z nimi. Przykłady kosztują cię różnicę między tymi dwiema liczbami, a według Anthropic kupują ci bardziej spójne wyjście.

To samo w każdym żądaniu: instrukcje i pięć przykładów. Nowe za każdym razem: zgłoszenie
Między żądaniami zmienia się tylko zgłoszenie

Ten obrazek ukrywa przydatny szczegół. Blok przykładów jest identyczny w każdym żądaniu, co jest dokładnie tym rodzajem powtarzanego początku, o którym mówi prompt caching; czym jest prompt caching wyjaśnia, jak to działa.

Oto to samo obciążenie, 500 tokenów wejściowych i 3 wyjściowe na żądanie, 2 000 żądań, w różnych modelach. Tabela przelicza z aktualnych cen:

Model Za żądanie 2000 żądań OpenRouter, 2000 żądań
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ów wejściowych i 3 tokenów wyjściowych na żądanie. Ceny za 1 mln tokenów są aktualne i zmieniają się wraz z naszymi taryfami; kolumna OpenRouter pokazuje ceny referencyjne dla tego samego obciążenia.

Liczone razem wejście i wyjście, DeepSeek-V4-Flash i GLM-5.3-Flash wychodzą taniej niż OpenRouter przy tym obciążeniu. Pełna lista cen jest na stronie cennika.

JSON, ton i sprawdzanie przykładów#

Ten sam trik obejmuje dwa pozostałe przypadki, na które się natkniesz. Potrzebujesz tych samych pól JSON za każdym razem? Zrób z przykładu samą odpowiedź JSON:

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

O response_format i o tym, co robić, gdy odpowiedź wciąż jest niepoprawna, przeczytasz w uzyskaj poprawny JSON z API LLM. Chcesz przepisać tekst w jednym tonie? Przymiotniki jak „friendly but brief” są niejasne; dwie pary przed-i-po pokazują to lepiej.

Zanim zaufasz jakiemukolwiek zestawowi przykładów, weź 20 zgłoszeń, które już ręcznie oznaczyłeś, przepuść je i porównaj. Jeden przebieg mówi więcej niż jakakolwiek zasada. Strona Anthropic dodaje skrót: poproś model, by ocenił twoje przykłady pod kątem trafności i różnorodności albo napisał więcej na podstawie tych, które masz.

Lista kontrolna

Zanim zaufasz swoim przykładom

Gdy przykłady działają, następne pytanie brzmi, jak nie pozwolić kilku dokumentom zlać się w jednym promptcie. Oznacz każdy dokument w promptcie omawia to.