Saiu o cliente OpenAI Scala
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)
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 :)





































![O que é uma lista vinculada, afinal? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)