Il client OpenAI Scala è uscito
Questo è il mio primissimo post su Medium! Evviva! Per coincidenza, è correlato alla cosa più pubblicizzata in questi giorni, ChatGPT e la società dietro di essa: OpenAI .
Per farla breve, mentre stavo sfogliando la pagina delle librerie della community API OpenAI all'inizio di quest'anno, per vedere quali lingue sono supportate, ho scoperto, abbastanza sorprendentemente, che mancava Scala , la mia lingua preferita per la logica aziendale e l'integrazione. Come ci si può aspettare, ho provato un client Java , che può essere integrato in Scala (come qualsiasi altro linguaggio JVM). Francamente, ha funzionato bene, tuttavia, mancavano alcune caratteristiche idiomatiche di Scala (classi di casi, tratti, ecc.) E, cosa più importante, non era asincrono. Ciò ha continuato a infastidirmi al punto che ho deciso di codificare un client da solo. Soprattutto perché era in linea con la mission della mia azienda Cequence, dove lavoro come CSO. Trovo straordinario e mi considero fortunato che Cequence abbia abbracciato Scala e la mentalità di programmazione funzionale in generale per la sua missione di trasformare la gestione dei contratti in un ambiente automatizzato ed efficace tramite funzionalità basate su ML/NLP come l'analisi dei contratti, la segnalazione dei rischi e la negoziazione assistente.
Avanti veloce di una o due settimane ed eccolo qui: OpenAI Scala Client , il primissimo client Scala per OpenAI API, è stato rilasciato il 25 gennaio 2023. Subito dopo, è stato anche elencato nella pagina delle librerie della community OpenAI . Il progetto è open-source ed è disponibile su GitHub sottohttps://github.com/cequence-io/openai-scala-client. La versione corrente è 0.1.0 .
Se vuoi iniziare a giocare con la lib e dare un'occhiata a tutte le chicche GPT-3 e/o generare delle belle foto con DALL-E, puoi farlo aggiungendo la seguente dipendenza al tuo 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>
Tutte le funzioni/endpoint e parametri disponibili (come definiti qui ), sono supportati in un unico servizio conveniente, chiamato OpenAIService .
Configurazione ⚙️
La variabile ambientale più importante che devi impostare è OPENAI_SCALA_CLIENT_API_KEY e facoltativamente anche OPENAI_SCALA_CLIENT_ORG_ID (se ne hai una). In alternativa, puoi fornire il tuo file di configurazione e sovrascrivere le opzioni di configurazione (compresi i timeout) come specificato nella configurazione predefinita openai-scala-client.conf .
Utilizzo
Prima ancora che tu possa pensare di fare qualcosa (come nella maggior parte dei programmi Scala) devi definire un contesto di esecuzione implicito così come un materializzatore akka. Il modo più semplice è ad esempio:
implicit val ec = ExecutionContext.global
implicit val materializer = Materializer(ActorSystem())
I. Ottenere un servizio
- Configurazione predefinita (prevede che le variabili ambientali siano impostate come definito nella sezione Config )
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) {…}
Esempi:
- Elenca i modelli
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)
)
Pace!
… Google attento :)

![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































