Я разработал простую оболочку Python для API OpenAI, специально предназначенную для личного использования. Оболочка ориентирована на простое получение желаемого результата из моделей OpenAI, а также обеспечивает гибкость определения формата вывода. Давайте разберем, что делает каждая часть кода:

Обзор классов и методов

  1. __init__: Инициализирует класс LLM (возможно, модель изучения языка?) с помощью ключа API, имени модели (по умолчанию «gpt-3.5-turbo») и параметра температуры, который управляет случайностью сгенерированного текста.
  2. model_structure_repr: генерирует строковое представление структуры Pydantic BaseModel. Это полезно для понимания того, какие ключи требуются модели.
  3. is_valid_json_for_model: Проверяет, является ли данная строка JSON не только допустимым JSON, но и соответствует ли данному Pydantic BaseModel.
  4. generate_text: Взаимодействует с API OpenAI для создания текста на основе заданной подсказки. При желании вы можете указать формат вывода (например, Pydantic BaseModel), количество завершений и максимальный предел токенов.

Подробная разбивка

Инициализация (__init__)

Когда вы создаете экземпляр LLM, вы передаете свой ключ API OpenAI, тип модели и температуру. Они сохраняются как переменные экземпляра и используются позже в вызовах API.

def __init__(self, api_key, model="gpt-3.5-turbo", temperature=0.5):
    self.api_key = api_key
    self.model = model
    self.temperature = temperature
    openai.api_key = self.api_key

Представление структуры модели (model_structure_repr)

Этот метод принимает Pydantic BaseModel в качестве аргумента и рекурсивно генерирует строковое представление структуры модели. Это полезно для предоставления обратной связи о том, какой тип JSON следует ожидать.

def model_structure_repr(self, model: Type[BaseModel]) -> str:

        fields = model.__fields__
        # pdb.set_trace()
        field_reprs = []

        for name, model_field in fields.items():
            description = model_field.field_info.description or "No description"
            field_type = model_field.annotation

            # If it's a list…