Привет, читатели. Прошло очень много времени с тех пор, как я написал статью. В этой короткой статье об OpenAI мы увидим, как использовать библиотеку Python OpenAI для использования новой функции вызова функций из OpenAI, которая обеспечивает структурированный вывод из моделей GPT.

Прежде чем уйти, вы все еще используете Google Docs для хранения ваших любимых подсказок ChatGPT? Затем бесплатно ознакомьтесь с этим классным менеджером подсказок под названием Vidura. Вы можете генерировать текст с помощью GPT-3 и изображения с помощью Stable Diffusion в одном месте:



Установка виртуальной среды

Сначала создайте виртуальную среду Python и установите пакет pip `openai`, используя следующие команды:

python3 -m venv venv
source venv/bin/activate
pip install openai --upgrade

После успешной установки пакета перейдите в свою учетную запись openAI и создайте ключ доступа здесь: https://platform.openai.com/account/api-keys.

Допустим, ваш ключ API: sk-xyzabc (никогда никому не раскрывайте свой настоящий ключ)

Добавление ключа API Open AI в среду

Экспортируйте этот ключ как переменную среды, используя следующую команду:

export OPENAI_API_KEY=sk-xyzabc

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

Установите PyDantic для создания схемы JSON.

API OpenAI использует схему JSON для вывода функции. Чтобы упростить создание этого в Python, мы можем определить класс PyDantic для структурирования модели и преобразовать его в схему JSON, чтобы избежать многословия и ошибок.

pip install pydantic --upgrade

С этой установкой мы готовы опробовать OpenAI API. Давайте определим цель и пример для достижения этой цели.

Цель:

Обеспечьте предсказуемый вывод JSON из модели gpt-3.5-turbo для таких вопросов, как:

«Объяснить процесс?» или «Как?»

Решение:

Для этого нам нужно сначала придумать схему. Давайте определим модель PyDantic. Я делаю это, чтобы направить модель OpenAI к тому, чтобы «иметь заголовок и серию шагов для запрошенного вопроса и генерировать вывод, который можно анализировать в формате JSON».

from typing import List
from pydantic import BaseModel

class StepByStepAIResponse(BaseModel):
    title: str
    steps: List[str]

Это простой класс Python (который наследует pydantic BaseModel). Чтобы преобразовать этот класс в схему JSON, просто вызовите функцию `schema()`:

schema = StepByStepAIResponse.schema() # returns a dict like JSON schema

# schema content looks like below

"""
{
    'title': 'StepByStepAIResponse',
    'type': 'object',
    'properties': {'title': {'title': 'Title', 'type': 'string'},
    'steps': {'title': 'Steps', 'type': 'array', 'items': {'type': 'string'}}},
    'required': ['title', 'steps']
}
"""

Вскоре мы будем использовать эту схему в наших примерах.

Теперь давайте сделаем реальный вызов OpenAI и применим «иллюзорную» функцию под названием «get_answer_for_user_query», направляя ИИ для возврата вывода JSON. Я называю эту функцию «иллюзорной», потому что ее выполнение управления автоматически выводится моделью OpenAI с использованием имени, описания и схемы вывода, но не определяется разработчиком.

Выполнение вызова функции OpenAI API

Нам нужно вызвать метод «ChatCompletion.create()» с необходимыми аргументами, чтобы передать пользовательский запрос в модель OpenAI. Нам нужно использовать «gpt-3.5-turbo-0613» (отметьте «0613» в конце, вызовы функций доступны только на этой модели или «gpt-4–0613» на момент написания этой статьи). Код выглядит следующим образом.

import openai
import os
import json

openai.api_key = os.getenv("OPENAI_API_KEY")

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo-0613",
    messages=[
       {"role": "user", "content": "Explain how to assemble a PC"}
    ],
    functions=[
        {
          "name": "get_answer_for_user_query",
          "description": "Get user answer in series of steps",
          "parameters": StepByStepAIResponse.schema()
        }
    ],
    function_call={"name": "get_answer_for_user_query"}
)

output = json.loads(response.choices[0]["message"]["function_call"]["arguments"])

# output content
"""
{
    'title': 'Steps to assemble a PC',
    'steps': [
        '1. Gather all necessary components',
        '2. Prepare the PC case',
        '3. Install the power supply',
        '4. Mount the motherboard',
        '5. Install the CPU and CPU cooler',
        '6. Install RAM modules',
        '7. Install storage devices',
        '8. Install the graphics card',
        '9. Connect all cables',
        '10. Test the PC'
    ]
}
"""

Теперь можно программно использовать вывод (dict) в Python. Важным аргументом в коде для `ChatCompletion.complete()` является `functions=[{}]`, который принимает список функций. Ключ «имя» указывает имя функции, а «описание» указывает метаинформацию о функции для модели OpenAI. Ключ «параметры» — это место, где мы передаем схему JSON. И этот код,

function_call={"name": "get_answer_for_user_query"}

указывает, должна ли модель OpenAI использовать функцию из списка функций. Установка этого значения «авто» может привести к угадыванию модели ИИ, поэтому я всегда предлагаю добавить это имя функции вместо авто.

Если вы хотите создать объект StepByStepAIResponse из этого словаря ответа, вы можете сделать это:

sbs = StepByStepAIResponse(**output)

# Now access sbs.title, sbs.steps in your code

Давайте попробуем другой пользовательский запрос: «Как испечь блин?». Я изменил значение «content» в параметре messages, чтобы настроить запрос. Код выглядит так.

# ... imports and other code

response = openai.ChatCompletion.create(
   model="gpt-3.5-turbo-0613",
   messages=[
      {"role": "user", "content": "How to make a pancake ?"}
   ],
   functions=[
      {
        "name": "get_answer_for_user_query",
        "description": "Get user answer in series of steps",
        "parameters": StepByStepAIResponse.schema()
      }
   ],
   function_call={"name": "get_answer_for_user_query"}
)

output = json.loads(response.choices[0]["message"]["function_call"]["arguments"])

# output content

"""
{
    'title': 'Pancake Recipe',
    'steps': 
    [
        'In a mixing bowl, whisk together flour, sugar, baking powder, and salt.',
        'In a separate bowl, whisk together milk, eggs, and melted butter.',
        'Add the wet ingredients to the dry ingredients and mix until just combined. Do not overmix.',
        'Heat a non-stick skillet or griddle over medium heat. Lightly grease with butter or cooking spray.',
        'Pour 1/4 cup of batter onto the skillet for each pancake. Cook until bubbles form on the surface, then flip and cook until golden brown.',
        'Serve the pancakes hot with your favorite toppings, such as syrup, fruits, or whipped cream.'
    ]
}
"""

Для запроса мы получили список шагов в красивой последовательности. Вот как мы можем указать модели OpenAI (в данном случае `gpt-3-turbo-0613`) для принудительного вывода в определенной структуре.

Полный фрагмент кода для этого примера доступен здесь: https://gist.github.com/narenaryan/e8a5aac3825b0e752cf70daa69abb65a

Заключение

Вызовы функций API OpenAI — это мощный способ направлять модели OpenAI для создания предсказуемого ответа, который в противном случае требует подробных быстрых инструкций. Определенно интересно думать о приложениях, вызывающих функции. Спасибо за прочтение статьи и хорошего дня :)

Использованная литература: