Это мой самый первый пост на 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.
Мир!
… Гугл берегись :)