AI Engineering Academy · Урок

Конечная точка чатовых дополнений

Разберитесь с массивом сообщений, содержащим роли системы, пользователя и ассистента, составьте первый запрос и интерпретируйте объект ответа, полученный от API.

Урок 2 из 413 шагов

«Конечная точка чатовых дополнений» — бесплатный урок AI Engineering Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Engineering Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Engineering Academy содержит 4 уроков всего.

Архитектура массива сообщений

Конечная точка Chat Completions работает с массивом сообщений: списком реплик, каждая из которых содержит роль (system, user или assistant). Модель не хранит состояние, поэтому историю нужно отправлять при каждом запросе.

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)

Роль системы: определение поведения

Системное сообщение — Ваш главный инструмент управления. Оно задаёт образ, правила и формат модели ещё до того, как пользователь введёт хоть слово. Уделите ему время — оно определяет всё остальное. Посмотрите код.

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?'}
    ]
)

Управление многоэтапным диалогом

Чтобы продолжать диалог, добавляйте append каждую новую реплику в массив сообщений и отправляйте его целиком. Именно поэтому кажется, что модель помнит разговор: Вы передаёте ей всю историю.

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'

Анатомия ответа API

Ответ — это объект, а не просто текст. В вариантах хранится ответ, причина завершения объясняет, почему генерация остановилась, а использование содержит число токенов — то есть Ваши расходы. В рабочей среде записывайте эти данные в журнал.

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)

Понимание причины завершения

Причина завершения сообщает, почему генерация остановилась. «stop» означает, что ответ завершён; «length» — что достигнуто значение max_tokens и ответ оборвался посередине. Всегда проверяйте это: незаметное усечение — скрытая ошибка.

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

Выбор подходящей модели

Выбирайте модель под задачу. gpt-4o — мощный вариант для сложных рассуждений; gpt-4o-mini намного дешевле и хорошо справляется с большинством задач. Перед тем как считать, что большая модель лучше, сравните их результаты.

# 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

Типы содержимого в сообщениях

Содержимое сообщения может быть не только текстом. Для зрительных моделей, например gpt-4o, передавайте список, в котором смешаны текст и изображения, — так можно задавать вопросы по диаграммам или снимкам экрана.

# 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'}
                }
            ]
        }
    ]
)

Параметр n: несколько вариантов завершения

Параметр n возвращает несколько вариантов завершения для одного запроса. Это удобно для выбора лучшего варианта или оценки уверенности: если все n вариантов совпадают, модель уверена; если расходятся — будьте осторожны.

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)

Обработка ответа как строки

Чтобы получить ответ в виде текста, всегда используйте путь response.choices[0].message.content. Оберните его во вспомогательную функцию и предусмотрите значение None, которое возникает при вызовах инструментов или срабатывании фильтров.

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)

Проверка исходного запроса и ответа

Получаете необычные ответы при отладке? Проверьте исходные запрос и ответ. Установка OPENAI_LOG=debug выводит всё тело запроса в терминал — это самый быстрый способ увидеть, что передаётся по сети.

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

Создание минимального цикла чата

Теперь Вы можете создать минимальный цикл чата: хранить список сообщений, добавлять каждую реплику, отправлять список целиком и повторять эти действия. Этот простой шаблон лежит в основе каждого чат-приложения, работающего через API. Код показывает, как это сделать.

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

Быстрая проверка

Проверьте, насколько хорошо Вы поняли концепции разработки ИИ из этого урока.

Итоги урока

Вы изучили основу чата: массив сообщений управляет диалогом, а ответ содержит содержимое, причину завершения и число токенов. Далее — параметры.

Можно начать бесплатно

Изучай Python с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
30
Уроки
120

Часто задаваемые вопросы

Урок «Конечная точка чатовых дополнений» бесплатный?

Да — полный текст урока «Конечная точка чатовых дополнений» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Engineering Academy, подпишись на CoddyKit PRO. Курс AI Engineering Academy содержит 4 уроков всего.

Чему я научусь в уроке «Конечная точка чатовых дополнений»?

Разберитесь с массивом сообщений, содержащим роли системы, пользователя и ассистента, составьте первый запрос и интерпретируйте объект ответа, полученный от API. Ты практикуешь AI Engineering Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать AI Engineering Academy?

Предыдущий опыт не требуется. AI Engineering Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Конечная точка чатовых дополнений»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке AI Engineering Academy?

Да. Каждый урок AI Engineering Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Настройка среды Python
  2. Конечная точка чатовых дополнений
  3. Управление поведением модели с помощью параметров
  4. Обработка ошибок и ограничения частоты запросов
← Назад к AI Engineering Academy