Это мой самый первый пост на Medium! Ура! По стечению обстоятельств, он связан с самой раскрученной вещью в наши дни ChatGPT и компанией, стоящей за ней — OpenAI.

Короче говоря, когда я просматривал страницу Библиотеки сообщества OpenAI API в начале этого года, чтобы узнать, какие языки поддерживаются, я совершенно неожиданно обнаружил, что Scala, мой предпочтительный язык для бизнес-логики и интеграции отсутствовал. Как и следовало ожидать, я попробовал Java-клиент, который можно интегрировать в Scala (как и любой другой язык JVM). Откровенно говоря, он работал хорошо, однако ему не хватало некоторых идиоматических возможностей Scala (кейс-классы, трейты и т. д.) и, самое главное, он не был асинхронным. Это продолжало беспокоить меня до такой степени, что я решил написать код клиента самостоятельно. Тем более, что это соответствовало миссии моей компании Cequence, где я работаю CSO. Я нахожу это довольно необычным и считаю, что мне повезло, что Cequence приняла Scala и мышление функционального программирования в целом для своей миссии по преобразованию управления контрактами в автоматизированную, эффективную среду с помощью функций на основе ML / NLP, таких как аналитика контрактов, пометка рисков и переговоры помощник.

Перенесемся на неделю или две вперед, и вот он: Клиент OpenAI Scala, самый первый клиент Scala для OpenAI API, был выпущен 25 января 2023 года. Вскоре после этого он также был включен в список OpenAI. страница библиотек сообщества». Проект с открытым исходным кодом доступен на GitHub по адресу https://github.com/cequence-io/openai-scala-client. Текущая версия: 0.1.0.

Если вы хотите начать играть с библиотекой и проверить все преимущества GPT-3 и/или создать несколько крутых изображений с помощью DALL-E, вы можете сделать это, добавив следующую зависимость в свой build.sbt:

"io.cequence" %% "openai-scala-client" % "0.1.0"

или в pom.xml (если вы используете maven)

<dependency>
 <groupId>io.cequence</groupId>
 <artifactId>openai-scala-client_2.12</artifactId>
 <version>0.1.0</version>
</dependency>

В настоящее время поддерживаются версии Scala 2.12 и 2.13, но версия Scala 3 выйдет к концу февраля.

Все доступные функции/конечные точки и параметры (как определено здесь) поддерживаются в одном удобном сервисе, который называется OpenAIService.

Конфиг ⚙️

Самая важная переменная среды, которую вам нужно установить, — это OPENAI_SCALA_CLIENT_API_KEY и, при необходимости, также OPENAI_SCALA_CLIENT_ORG_ID (если она у вас есть). Кроме того, вы можете предоставить свой собственный файл конфигурации и переопределить параметры конфигурации (включая тайм-ауты), как указано в конфигурации по умолчанию openai-scala-client.conf.

Использование 👨‍🎓

Прежде чем вы даже сможете подумать о том, чтобы что-то сделать (как в большинстве программ Scala), вы должны определить неявный контекст выполнения, а также материализатор akka. Самый простой способ, например:

implicit val ec = ExecutionContext.global
implicit val materializer = Materializer(ActorSystem())

Далее вы можете получить услугу одним из следующих способов:

И. Получение услуги

  • Конфигурация по умолчанию (ожидается, что переменные окружения будут установлены так, как определено в разделе Конфигурация)
 val service = OpenAIServiceFactory()
  • Пользовательская конфигурация
 val config = ConfigFactory.load("path_to_my_custom_config")
 val service = OpenAIServiceFactory(config)

(обратите внимание, здесь конфиг тоже можно передать через DI, а не создавать вручную)

  • Без файла конфигурации
 val service = OpenAIServiceFactory(
   apiKey = "your_api_key",
   orgId = Some("your_org_id") // if you have one
 )
  • С помощью внедрения зависимостей (требуется библиотека openai-scala-guice)
 class MyClass @Inject() (openAIService: OpenAIService) {…}

II. Вызов функций

Полная документация каждого звонка с соответствующими входами и настройками представлена ​​в OpenAIService. Поскольку все вызовы являются асинхронными, они возвращают ответы, заключенные в Future.

Примеры:

  • Список моделей
service.listModels.map(
  _.foreach(println)
)
  • Получить модель
service.retrieveModel(ModelId.text_davinci_003).map(model =>
  println(model.getOrElse("N/A"))
)
  • Создать завершение
val text = """Extract the name and mailing address from this email:
  |Dear Kelly,
  |It was great to talk to you at the seminar. I thought Jane’s talk was quite good.
  |Thank you for the book. Here’s my address 2111 Ash Lane, Crestview CA 92002
  |Best,
  |Maya
  """.stripMargin

service.createCompletion(text).map(completion =>
  println(completion.choices.head.text)
)
  • Создать завершение с пользовательской настройкой
val text = """Extract the name and mailing address from this email:
  |Dear Kelly,
  |It was great to talk to you at the seminar. I thought Jane’s talk was quite good.
  |Thank you for the book. Here’s my address 2111 Ash Lane, Crestview CA 92002
  |Best,
  |Maya
  """.stripMargin

service.createCompletion(
  text,
  settings = CreateCompletionSettings(
    model = ModelId.text_davinci_001,
    max_tokens = Some(1500),
    temperature = Some(0.9),
    presence_penalty = Some(0.2),
    frequency_penalty = Some(0.2)
  )
).map(completion =>
  println(completion.choices.head.text)
)

Мы не хотим быть исчерпывающими здесь, так как всего предусмотрено 20 функций, но, надеюсь, этого достаточно, чтобы вы получили представление: сигнатура каждой функции состоит из входных данных (текстовых или графических файлов) и дополнительных настроек.

Это все люди! Спасибо за проверку библиотеки и статьи. Любая обратная связь очень ценится. И, конечно же, для нас это будет иметь огромное значение, если вы сможете поставить ему звезду или подписаться на нас на GitHub.

Мир!

… Гугл берегись :)