Dans ce tutoriel nous allons essayer de montrer en écrivant un exemple comment intégrer l'api chatgpt dans un programme écrit en VB.Net
Commençons par créer un projet VB ChatGPT
Une fois créé, nous aurons le premier formulaire déjà inséré dans notre projet
Nous aurons besoin de la bibliothèque vocale, vous allez dans le package nuget pour installer la bibliothèque
Une fois cela fait, nous commençons à insérer tous nos objets nécessaires à la construction de notre chatgpt, le premier objet est textEdit multiline où nous aurons la réponse du serveur, nous lui donnons le nom txtAnswer
Ensuite nous insérons l'objet txtQuestion où nous écrivons nos questions, nous insérons le bouton d'envoi pour envoyer notre demande j'essaye de lui donner le nom btnSend
Nous insérons l'étiquette lblSpeech qui sert à recevoir une partie du texte à chaque fois que nous recevons la réponse.
Nous insérons maintenant l'objet aléatoire associé à la variable de température. La température est un hyperparamètre utilisé dans certains modèles de traitement du langage naturel, notamment ChatGPT, pour contrôler le niveau de aléatoire
Après avoir inséré l'objet MaxTokens (TextEdit)
Les modèles comprennent et traitent le texte en le décomposant en jetons.
Les jetons peuvent être des mots ou simplement des morceaux de caractères. Par exemple, le mot « hamburger » est divisé en jetons « jambon », « bur » et « ger », tandis qu'un mot court et courant comme « poire » est un seul jeton. De nombreux jetons commencent par un espace, par exemple « bonjour » et « au revoir ».
Le nombre de jetons traités dans une requête API donnée dépend de la longueur de vos entrées et sorties. En règle générale, 1 jeton correspond à environ 4 caractères ou 0,75 mot pour un texte anglais.
Une limitation à garder à l'esprit est que votre invite de texte et votre complétion générée combinées ne doivent pas dépasser la longueur de contexte maximale du modèle (pour la plupart des modèles, il s'agit de 2 048 jetons, soit environ 1 500 mots).
Consultez l'outil tokenizer pour en savoir plus sur la façon dont le texte est traduit en jetons.
Ensuite, nous insérons une case à cocher pour mettre l'écoute en pause et une autre pour couper le son. Nous utilisons également une combobox pour les modèles.
L'API est alimentée par un ensemble de modèles avec différentes capacités et niveaux de prix. les modèles GPT-3 de base openai s'appellent Davinci, Curie, Babbage et Ada. La série Codex est un descendant de GPT-3 qui a été formé à la fois au langage naturel et au code. Pour en savoir plus, visitez la documentation des modèles du site openai.
Et une autre pour les voix existantes, qu'il faut charger en envoyant une requête au serveur
Maintenant, nous commençons à écrire le code VB .Net
On commence par importer tous les modules nécessaires :
Dim OPENAI_API_KEY As String = "" 'https://beta.openai.com/account/api-keys
Dim oSpeechRecognitionEngine As SpeechRecognitionEngine = Nothing
Dim oSpeechSynthesizer As System.Speech.Synthesis.SpeechSynthesizer = Nothing
Nous avons besoin des variables oSpeechRecognitonEngine et oSpeechSynthesizer dans la procédure de chargement du formulaire, nous lisons la valeur du fichier de configuration xml openai_api_key appi.config
Nous essayons maintenant de charger le combo contenant les différentes voix que nous pouvons utiliser.
Private Sub frmGPTChat_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim oAppSettingsReader As New AppSettingsReader()
Dim sApiKey As String = oAppSettingsReader.GetValue("OPENAI_API_KEY", GetType(String)) & ""
If sApiKey = "" Then
MsgBox("Please enter your OpenAI API key in the App.config file.")
End
Else
OPENAI_API_KEY = sApiKey
End If
'SetModels() We can load all the models or load only the three models that I've noticed working
cbModel.Items.Clear()
cbModel.Items.Add("text-davinci-003")
cbModel.Items.Add("text-davinci-002")
cbModel.Items.Add("code-davinci-002")
cbModel.SelectedIndex = 0
cbVoice.Items.Clear()
Dim synth As New SpeechSynthesizer()
For Each voice In synth.GetInstalledVoices()
cbVoice.Items.Add(voice.VoiceInfo.Name)
Next
cbVoice.SelectedIndex = 0
End Sub
Lorsque vous cliquez sur cklisten si sélectionné, vous voyez le label lblSpeech et nous appelons la fonction SpeechtoText
Private Sub chkListen_CheckedChanged(sender As Object, e As EventArgs) Handles chkListen.CheckedChanged
If chkListen.Checked Then
lblSpeech.Text = ""
lblSpeech.Visible = True
SpeechToText()
Else
oSpeechRecognitionEngine.RecognizeAsyncStop()
lblSpeech.Visible = False
End If
End Sub
Private Sub chkMute_CheckedChanged(sender As Object, e As EventArgs) Handles chkMute.CheckedChanged
If chkMute.Checked Then
lblVoice.Visible = False
cbVoice.Visible = False
Else
lblVoice.Visible = True
cbVoice.Visible = True
End If
End Sub
Si l'objet oSpeechRecognitionEngine n'est pas initialisé, nous l'initialisons
Private Sub SpeechToText()
If oSpeechRecognitionEngine IsNot Nothing Then
oSpeechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple)
Exit Sub
End If
oSpeechRecognitionEngine = New SpeechRecognitionEngine(New System.Globalization.CultureInfo("en-US"))
oSpeechRecognitionEngine.LoadGrammar(New DictationGrammar())
AddHandler oSpeechRecognitionEngine.SpeechRecognized, AddressOf OnSpeechRecognized
AddHandler oSpeechRecognitionEngine.SpeechHypothesized, AddressOf OnSpeechHypothesized
oSpeechRecognitionEngine.SetInputToDefaultAudioDevice()
oSpeechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple)
End Sub
On associe également l'événement OnSpeechRecognized qui nous permet de préparer notre question avant de l'envoyer, nous associons l'événement OnSpeechHypoSynthesized qui nous permet de visualiser le texte dans le label lblSpeech.
Private Sub OnSpeechRecognized(sender As Object, e As SpeechRecognizedEventArgs)
lblSpeech.Text = "" 'Reset Hypothesized text
If txtQuestion.Text <> "" Then
txtQuestion.Text += vbCrLf
End If
Dim text As String = e.Result.Text
txtQuestion.Text += text
End Sub
Private Sub OnSpeechHypothesized(sender As Object, e As SpeechHypothesizedEventArgs)
Dim text As String = e.Result.Text
lblSpeech.Text = text
End Sub
Passons maintenant au bouton envoyer qui nous permet d'envoyer la requête grâce à la fonction sendMsg en utilisant le protocole http en invoquant l'API openai
Private Sub btnSend_Click(sender As Object, e As EventArgs) Handles btnSend.Click
Dim sQuestion As String = txtQuestion.Text
If sQuestion = "" Then
MsgBox("Type in your question!")
txtQuestion.Focus()
Exit Sub
End If
If txtAnswer.Text <> "" Then
txtAnswer.AppendText(vbCrLf)
End If
txtAnswer.AppendText("Me: " & sQuestion & vbCrLf)
txtQuestion.Text = ""
Try
Dim sAnswer As String = SendMsg(sQuestion)
txtAnswer.AppendText("Chat GPT: " & Replace(sAnswer, vbLf, vbCrLf))
SpeechToText(sAnswer)
Catch ex As Exception
txtAnswer.AppendText("Error: " & ex.Message)
End Try
End Sub
Nous avons le point de terminaison api.openai.com/v1/completion et la requête est effectuée avec la méthode post avec du contenu json
Notre requête est constituée de maxtokens de valeur 2048, caractère aléatoire 0,5, l'identifiant utilisateur pour cet exemple est 1 mais nous pouvons associer les requêtes à différents utilisateurs
Nous préparons la variable data avec tous les paramètres nécessaires à la fin nous lisons notre réponse au format json.
Function SendMsg(ByVal sQuestion As String)
System.Net.ServicePointManager.SecurityProtocol =
System.Net.SecurityProtocolType.Ssl3 Or
System.Net.SecurityProtocolType.Tls12 Or
System.Net.SecurityProtocolType.Tls11 Or
System.Net.SecurityProtocolType.Tls
Dim apiEndpoint As String = "https://api.openai.com/v1/completions"
Dim request As HttpWebRequest = WebRequest.Create(apiEndpoint)
request.Method = "POST"
request.ContentType = "application/json"
request.Headers.Add("Authorization", "Bearer " & OPENAI_API_KEY)
Dim iMaxTokens As Integer = txtMaxTokens.Text '2048
Dim dTemperature As Double = txtTemperature.Text '0.5
If dTemperature < 0 Or dTemperature > 1 Then
MsgBox("Randomness has to be between 0 and 1 with higher values resulting in more random text")
Return ""
End If
Dim sUserId As String = "1"
Dim sModel As String = cbModel.Text 'text-davinci-002, text-davinci-003
'https://beta.openai.com/docs/api-reference/completions/create
Dim data As String = "{"
data += " ""model"":""" & sModel & ""","
data += " ""prompt"": """ & PadQuotes(sQuestion) & ""","
data += " ""max_tokens"": " & iMaxTokens & ","
data += " ""user"": """ & sUserId & """, "
data += " ""temperature"": " & dTemperature & ", "
data += " ""frequency_penalty"": 0.0" & ", " 'Number between -2.0 and 2.0 Positive value decrease the model's likelihood to repeat the same line verbatim.
data += " ""presence_penalty"": 0.0" & ", " ' Number between -2.0 and 2.0. Positive values increase the model's likelihood to talk about new topics.
data += " ""stop"": [""#"", "";""]" 'Up to 4 sequences where the API will stop generating further tokens. The returned text will not contain the stop sequence.
data += "}"
Using streamWriter As New StreamWriter(request.GetRequestStream())
streamWriter.Write(data)
streamWriter.Flush()
streamWriter.Close()
End Using
Dim response As HttpWebResponse = request.GetResponse()
Dim streamReader As New StreamReader(response.GetResponseStream())
Dim sJson As String = streamReader.ReadToEnd()
'Return sJson
Dim oJavaScriptSerializer As New System.Web.Script.Serialization.JavaScriptSerializer
Dim oJson As Hashtable = oJavaScriptSerializer.Deserialize(Of Hashtable)(sJson)
Dim sResponse As String = oJson("choices")(0)("text")
Return sResponse
End Function
La fonction setmodels permet d'initialiser le combo avec les modèles possibles, pour le moment j'ai constaté que seulement 3 modèles que je peux utiliser les autres ne fonctionnent pas, peut-être parce que mon inscription sur le site openai est gratuite
Private Sub SetModels()
'https://beta.openai.com/docs/models/gpt-3
System.Net.ServicePointManager.SecurityProtocol =
System.Net.SecurityProtocolType.Ssl3 Or
System.Net.SecurityProtocolType.Tls12 Or
System.Net.SecurityProtocolType.Tls11 Or
System.Net.SecurityProtocolType.Tls
Dim apiEndpoint As String = "https://api.openai.com/v1/models"
Dim request As HttpWebRequest = WebRequest.Create(apiEndpoint)
request.Method = "GET"
request.ContentType = "application/json"
request.Headers.Add("Authorization", "Bearer " & OPENAI_API_KEY)
Dim response As HttpWebResponse = request.GetResponse()
Dim streamReader As New StreamReader(response.GetResponseStream())
Dim sJson As String = streamReader.ReadToEnd()
'Return sJson
cbModel.Items.Clear()
Dim oSortedList As SortedList = New SortedList()
Dim oJavaScriptSerializer As New System.Web.Script.Serialization.JavaScriptSerializer
Dim oJson As Hashtable = oJavaScriptSerializer.Deserialize(Of Hashtable)(sJson)
Dim oList As Object() = oJson("data")
For i As Integer = 0 To oList.Length - 1
Dim sId As String = oList(i)("id")
oSortedList.Add(sId, sId)
Next
'Text-davinci - 3
'Text-davinci - 2
'code-davinci - 2
For Each oItem As DictionaryEntry In oSortedList
cbModel.Items.Add(oItem.Key)
Next
End Sub
N'oublions pas de remplacer les différents caractères non autorisés à l'aide d'une fonction distincte appelée PdQuotes avant d'envoyer le message
Private Function PadQuotes(ByVal s As String) As String
If s.IndexOf("\") <> -1 Then
s = Replace(s, "\", "\\")
End If
If s.IndexOf(vbCrLf) <> -1 Then
s = Replace(s, vbCrLf, "\n")
End If
If s.IndexOf(vbCr) <> -1 Then
s = Replace(s, vbCr, "\r")
End If
If s.IndexOf(vbLf) <> -1 Then
s = Replace(s, vbLf, "\f")
End If
If s.IndexOf(vbTab) <> -1 Then
s = Replace(s, vbTab, "\t")
End If
If s.IndexOf("""") = -1 Then
Return s
Else
Return Replace(s, """", "\""")
End If
End Function
End Class
Une fois la partie code terminée, nous chercherons la clé, nous devons faire une inscription sur le site openai.com, c'est gratuit et nous collons la clé dans notre fichier xml api.config