Saiu o cliente OpenAI Scala

Mar 10 2023
Esse é meu primeiro post no Medium! Viva! Coincidentemente, está relacionado à coisa mais badalada atualmente, o ChatGPT e a empresa por trás dele - OpenAI. Para encurtar a história, quando eu estava navegando na página de bibliotecas da comunidade OpenAI API no início deste ano, para ver quais linguagens são suportadas, descobri, surpreendentemente, que Scala, minha linguagem preferida para integração e lógica de negócios, estava faltando.

Esse é meu primeiro post no Medium! Viva! Coincidentemente, está relacionado à coisa mais badalada atualmente, o ChatGPT e a empresa por trás dele - OpenAI .

Para encurtar a história, quando eu estava navegando na página de bibliotecas da comunidade OpenAI API no início deste ano, para ver quais linguagens são suportadas, descobri, surpreendentemente, que Scala , minha linguagem preferida para integração e lógica de negócios, estava faltando. Como é de se esperar, experimentei um cliente Java , que pode ser integrado ao Scala (como qualquer outra linguagem JVM). Francamente, funcionou bem, no entanto, faltavam alguns recursos idiomáticos do Scala (classes de caso, características etc.) e, o mais importante, não era assíncrono. Isso continuou me incomodando a ponto de decidir codificar um cliente por conta própria. Até porque estava de acordo com a missão da minha empresa Cequence, onde trabalho como CSO. Acho extraordinário e me considero sortudo que a Cequence tenha adotado o Scala e a mentalidade de programação funcional em geral para sua missão de transformar o gerenciamento de contratos em um ambiente automatizado e eficaz por meio de recursos baseados em ML/NLP, como análise de contrato, sinalização de risco e negociação assistente.

Avance uma ou duas semanas e aqui está: OpenAI Scala Client , o primeiro cliente Scala para OpenAI API, foi lançado em 25 de janeiro de 2023. Logo depois disso, também foi listado na página de bibliotecas da comunidade OpenAI . O projeto é de código aberto e está disponível no GitHub emhttps://github.com/cequence-io/openai-scala-client. A versão atual é 0.1.0 .

Se você quiser começar a brincar com a biblioteca e conferir todos os recursos do GPT-3 e/ou gerar algumas fotos legais com o DALL-E, você pode fazer isso adicionando a seguinte dependência ao seu build.sbt :

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

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

Todas as funções/endpoints e parâmetros disponíveis (conforme definido aqui ), são suportados em um único serviço conveniente, chamado OpenAIService .

Configuração ⚙️

A variável ambiental mais importante que você precisa definir é OPENAI_SCALA_CLIENT_API_KEY e, opcionalmente, também OPENAI_SCALA_CLIENT_ORG_ID (se você tiver uma). Como alternativa, você pode fornecer seu próprio arquivo de configuração e substituir as opções de configuração (incluindo tempos limite) conforme especificado na configuração padrão openai-scala-client.conf .

Uso ‍

Antes mesmo de pensar em fazer algo (como na maioria dos programas Scala), você deve definir um contexto de execução implícito, bem como o materializador akka. A forma mais simples é por exemplo:

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

I. Obtenção de um serviço

  • Configuração padrão (espera que variáveis ​​de ambiente sejam definidas conforme definido na seção Configuração )
  • val service = OpenAIServiceFactory()
    

    val config = ConfigFactory.load("path_to_my_custom_config")
     val service = OpenAIServiceFactory(config)
    

  • Sem um arquivo de configuração
  • val service = OpenAIServiceFactory(
       apiKey = "your_api_key",
       orgId = Some("your_org_id") // if you have one
     )
    

    class MyClass @Inject() (openAIService: OpenAIService) {…}
    

Exemplos:

  • Listar modelos
  • 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)
    )
    

Paz!

… Cuidado com o Google :)

(fonte Reddit)