AI Engineering Academy · Lekcja

Endpoint Chat Completions

Uczestnicy poznają tablicę messages z rolami system, user i assistant, utworzą pierwszy prompt oraz zinterpretują obiekt odpowiedzi zwracany przez API.

Lekcja 2 z 413 kroki

Endpoint Chat Completions to bezpłatna lekcja AI Engineering Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Engineering Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Engineering Academy zawiera 4 lekcji w sumie.

Architektura tablicy messages

Punkt końcowy Chat Completions działa na podstawie tablicy messages: listy tur rozmowy, z których każda ma określoną rolę (system, user lub assistant). Model jest bezstanowy, dlatego za każdym razem należy wysłać całą historię.

from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
    model='gpt-4o-mini',
    messages=[
        {'role': 'system', 'content': 'You are a concise Python tutor.'},
        {'role': 'user', 'content': 'What is a list comprehension?'}
    ]
)

print(response.choices[0].message.content)

Rola system: definiowanie zachowania

Wiadomość systemowa to najważniejszy element sterowania modelem. Ustawia jego personę, zasady i format, zanim użytkownik wpisze choćby jedno słowo. Warto poświęcić jej czas — kształtuje wszystko. Zobacz kod.

system_prompt = '''You are a customer support agent for TechShop.
You help customers with: order tracking, returns, and product questions.
You do NOT discuss pricing changes or competitor products.
Always respond in 2-3 sentences maximum.
If you cannot help, say: 'Let me connect you with a human agent.'
'''

response = client.chat.completions.create(
    model='gpt-4o-mini',
    messages=[
        {'role': 'system', 'content': system_prompt},
        {'role': 'user', 'content': 'Where is my order #12345?'}
    ]
)

Zarządzanie rozmową wieloturową

Aby kontynuować rozmowę, należy dołączać każdą turę do tablicy messages i ponownie wysyłać całą tablicę. W ten sposób model sprawia wrażenie, jakby pamiętał — przekazują mu Państwo pełną historię.

history = [
    {'role': 'system', 'content': 'You are a helpful assistant.'}
]

def chat(user_message):
    history.append({'role': 'user', 'content': user_message})
    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=history
    )
    assistant_reply = response.choices[0].message.content
    history.append({'role': 'assistant', 'content': assistant_reply})
    return assistant_reply

print(chat('My name is Alice.'))
print(chat('What is my name?'))  # model remembers 'Alice'

Budowa odpowiedzi API

Odpowiedź jest obiektem, a nie tylko tekstem. Pole choices zawiera odpowiedź, finish_reason informuje, dlaczego generowanie zostało zatrzymane, a usage zlicza tokeny — czyli koszt. Na produkcji należy rejestrować te informacje.

response = client.chat.completions.create(
    model='gpt-4o-mini',
    messages=[{'role': 'user', 'content': 'Say hello in one word.'}]
)

# Accessing response fields
print('Content:', response.choices[0].message.content)
print('Finish reason:', response.choices[0].finish_reason)  # 'stop'
print('Model:', response.model)  # exact version like gpt-4o-mini-2024-07-18
print('Prompt tokens:', response.usage.prompt_tokens)
print('Completion tokens:', response.usage.completion_tokens)
print('Total tokens:', response.usage.total_tokens)

Zrozumienie finish_reason

finish_reason informuje, dlaczego generowanie zostało zatrzymane. „stop” oznacza zakończenie, a „length” — osiągnięcie wartości max_tokens i ucięcie odpowiedzi w połowie. Należy zawsze to sprawdzać — obcięcie odpowiedzi to cichy błąd.

def safe_completion(messages, max_tokens=500):
    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=messages,
        max_tokens=max_tokens
    )
    choice = response.choices[0]
    
    if choice.finish_reason == 'length':
        print(f'WARNING: Response was truncated at {max_tokens} tokens!')
    elif choice.finish_reason == 'content_filter':
        print('WARNING: Response blocked by content filter!')
        return None
    
    return choice.message.content

Wybór właściwego modelu

Należy dobrać model do zadania. gpt-4o świetnie radzi sobie z trudnym rozumowaniem; gpt-4o-mini jest znacznie tańszy i dobrze obsługuje większość zadań. Przed założeniem, że większy model daje lepsze wyniki, warto przeprowadzić testy porównawcze.

# Model comparison guidance
models = {
    'gpt-4o': {
        'use_for': 'Complex reasoning, code generation, nuanced analysis',
        'input_cost_per_1M': 2.50,  # USD
        'output_cost_per_1M': 10.00
    },
    'gpt-4o-mini': {
        'use_for': 'Classification, extraction, summarization, Q&A',
        'input_cost_per_1M': 0.15,
        'output_cost_per_1M': 0.60
    }
}
# gpt-4o is ~17x more expensive on input tokens

Typy treści w wiadomościach

Treść wiadomości może być czymś więcej niż tekstem. W przypadku modeli obsługujących obrazy, takich jak gpt-4o, przekazują Państwo listę łączącą tekst i obrazy — dzięki temu można zadawać pytania dotyczące wykresów lub zrzutów ekranu.

# Sending an image to a vision-capable model
response = client.chat.completions.create(
    model='gpt-4o',
    messages=[
        {
            'role': 'user',
            'content': [
                {
                    'type': 'text',
                    'text': 'What is in this image? Describe in one sentence.'
                },
                {
                    'type': 'image_url',
                    'image_url': {'url': 'https://example.com/photo.jpg'}
                }
            ]
        }
    ]
)

Parametr n: wiele uzupełnień

Parametr n zwraca kilka uzupełnień dla jednego promptu. Jest przydatny do wyboru najlepszego wyniku lub oceny pewności: jeśli wszystkie n odpowiedzi są zgodne, model jest pewny; jeśli się różnią, należy zachować ostrożność.

response = client.chat.completions.create(
    model='gpt-4o-mini',
    messages=[{'role': 'user', 'content': 'Name the capital of Germany.'}],
    n=3,  # generate 3 independent completions
    temperature=0.5
)

for i, choice in enumerate(response.choices):
    print(f'Completion {i+1}: {choice.message.content}')

# Check if all completions agree (confidence signal)
answers = [c.message.content.strip() for c in response.choices]
print('All agree:', len(set(answers)) == 1)

Obsługa odpowiedzi jako ciągu znaków

Aby pobrać odpowiedź jako tekst, należy zawsze użyć ścieżki response.choices[0].message.content. Warto umieścić ją w funkcji pomocniczej i obsłużyć wartość None, która może wystąpić przy wywołaniach narzędzi lub filtrach.

def get_completion(prompt, system='You are a helpful assistant.', model='gpt-4o-mini'):
    '''Simple helper that returns the response text as a string.'''
    response = client.chat.completions.create(
        model=model,
        messages=[
            {'role': 'system', 'content': system},
            {'role': 'user', 'content': prompt}
        ]
    )
    content = response.choices[0].message.content
    if content is None:
        raise ValueError(f'No content in response. Finish reason: {response.choices[0].finish_reason}')
    return content

result = get_completion('Explain recursion in one sentence.')
print(result)

Sprawdzanie surowego żądania i odpowiedzi

Nieprawidłowe odpowiedzi podczas debugowania? Należy sprawdzić surowe żądanie i odpowiedź. Ustawienie OPENAI_LOG=debug wypisuje pełną treść w terminalu — to najszybszy sposób, aby zobaczyć, co jest przesyłane.

import json
import httpx

# Enable debug logging (shows full request/response)
import os
os.environ['OPENAI_LOG'] = 'debug'

# Or use a custom logging client:
class LoggingClient(httpx.Client):
    def send(self, request, *args, **kwargs):
        print('REQUEST:', request.method, request.url)
        print('BODY:', json.loads(request.content))
        response = super().send(request, *args, **kwargs)
        print('STATUS:', response.status_code)
        return response

Budowanie minimalnej pętli czatu

Teraz można zbudować minimalną pętlę czatu: przechowywać listę messages, dołączać każdą turę, wysyłać całość i powtarzać. Ten prosty wzorzec napędza każdą aplikację czatową korzystającą z API. Kod pokazuje, jak to zrobić.

import openai

client = openai.OpenAI()

SYSTEM_PROMPT = 'You are a helpful assistant. Be concise.'

def simple_chat_loop():
    messages = [{'role': 'system', 'content': SYSTEM_PROMPT}]
    print('Chat started. Type "quit" to exit.')

    while True:
        user_input = input('You: ').strip()
        if user_input.lower() == 'quit':
            break
        if not user_input:
            continue

        messages.append({'role': 'user', 'content': user_input})

        response = client.chat.completions.create(
            model='gpt-4o-mini',
            messages=messages,
            max_tokens=500
        )

        assistant_reply = response.choices[0].message.content
        messages.append({'role': 'assistant', 'content': assistant_reply})
        print(f'Assistant: {assistant_reply}\n')

print('Example chat loop defined. Run simple_chat_loop() to start.')

Szybki test

Sprawdź swoją wiedzę na temat koncepcji inżynierii AI z tej lekcji.

Podsumowanie lekcji

Poznałeś podstawy czatu: tablica messages steruje rozmową, a odpowiedź zawiera treść, finish_reason i liczbę tokenów. Następnie: parametry.

Bezpłatny start

Ucz się Python dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
30
Lekcje
120

Często zadawane pytania

Czy lekcja „Endpoint Chat Completions” jest bezpłatna?

Tak — pełny tekst „Endpoint Chat Completions” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Engineering Academy, przejdź na CoddyKit PRO. Kurs AI Engineering Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Endpoint Chat Completions”?

Uczestnicy poznają tablicę messages z rolami system, user i assistant, utworzą pierwszy prompt oraz zinterpretują obiekt odpowiedzi zwracany przez API. Ćwiczysz AI Engineering Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć AI Engineering Academy?

Nie wymagamy żadnego doświadczenia. AI Engineering Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Endpoint Chat Completions”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji AI Engineering Academy?

Tak. Każda lekcja AI Engineering Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Konfigurowanie środowiska Python
  2. Endpoint Chat Completions
  3. Sterowanie zachowaniem modelu za pomocą parametrów
  4. Obsługa błędów i limity zapytań
← Powrót do AI Engineering Academy