paint-brush
Davinci Matematikte Kötü: NodeJ'ler ve OpenAI v4 ile ChatGPT Modellerine İnce Ayar Yapmaile@timbushell
1,095 okumalar
1,095 okumalar

Davinci Matematikte Kötü: NodeJ'ler ve OpenAI v4 ile ChatGPT Modellerine İnce Ayar Yapma

ile Tim Bushell9m2023/08/20
Read on Terminal Reader
Read this story w/o Javascript

Çok uzun; Okumak

OpenAI'nin API'si, geliştiricilerin GPT-3.5 gibi gelişmiş dil modelleriyle etkileşime girmesine olanak tanıyan bir dizi olasılık sunuyor. Bu makale, OpenAI'nin Node.js kitaplığını kullanarak özel bir araç seti oluşturma konusunu ele alıyor. Belirli bir göreve odaklanarak API ile etkileşime geçmek için bir CLI (Komut Satırı Arayüzü) oluşturacağız: ünlü davinci modelini matematik becerilerini geliştirmek için öğretmek. Yolculuk, geliştirme ortamını kurmayı, ince ayarlı bir veri kümesi oluşturmayı, yeni bir model eğitmeyi ve sonuçları gözlemlemeyi içerir. Bu adımları izleyerek, hem OpenAI'nin API'sinin yeteneklerini hem de belirli görevler için modellerde ince ayar yapmanın inceliklerini göstermeyi amaçlıyoruz.
featured image - Davinci Matematikte Kötü: NodeJ'ler ve OpenAI v4 ile ChatGPT Modellerine İnce Ayar Yapma
Tim Bushell HackerNoon profile picture
0-item


Bu makale, matematikte Davinci modelini eğiten bir CLI oluşturmak için OpenAI'nin Node.js kütüphanesini kullanmaya odaklanmaktadır.

Özetle

  • Kütüphanemiz "İskele".
  • OpenAI'nin API çağrılarını sarmak için bir dizi işlev yazın.
  • İşlevleri çağırmak için basit bir CLI oluşturun.
  • ChatGPT'nin (genellikle) matematikte iyi olduğunu kanıtlayın.
  • Davinci'nin (genellikle) matematikte kötü olduğunu kanıtlayın.
  • Davinci matematiğini öğretmek için basit bir ince ayar veri kümesi oluşturun.
  • "Basit ince ayar veri kümesini" yükleyin.
  • "Basit ince ayar veri kümesini" basit bir ince ayar modeline dönüştürün.
  • İnce ayarımızın kanıtlanması Davinci matematiğini öğretti.


iskele

 cd ~/Dev/YourRootFolderForPersonalStuff/ mdkir davinci-is-bad-at-maths cd davinci-is-bad-at-maths npm i dotenv openai npm i prettier -D touch .env touch goodAtMathsDatasetBuilder.js touch openAI.js mkdir bin touch bin/cli.js


package.json

... şu şekilde basit olabilir:

 { "description": "Experiments using OpenAI's API NodeJs v4 library", "name": "davinci-is-bad-at-maths", "private": true, "bin": "./bin/cli.js", "dependencies": { "dotenv": "^16.3.1", "openai": "^4.0.0" }, "devDependencies": { "prettier": "^3.0.2" }, "main": "openAI.js", "scripts": { "cli": "node bin/cli.js", "prettier": "prettier --list-different --write \"**/*.{css,html,js,json,md,mjs,scss,ts,yaml}\"" }, "type": "module" }


Komut dosyalarındaki "cli" girişi npm run cli -- commandName [args] diyebileceğimiz anlamına gelir. node bin/cli.js commandName [args] yerine bunu kullanırsanız, bu, daha sonra uygulama yapısını veya cli.js adını değiştirseniz bile kabuğunuzun geçmişini koruyacağınız anlamına gelir. Basit şeyler basit zihinleri memnun eder ve benim basit bir aklım var.

.env

... şöyle görünmelidir ancak kendi API_KEY'inizle:

 OPENAI_API_KEY="sk-d0ntY0uD4reUs3MyK3yG3tY0urOwnFr0mOp0n41W36s1t3Yo" OPENAI_MODEL="davinci"


OpenAI'nin API çağrılarını saracak bir dizi işlev.

openAI.js açın ve şunu kopyalayın:

 /** A not-robust OpenAI v4 CLI; a playground for OpenAI v4 API calls; a utility for working with a OpenAI model who is really really, like - I mean - really bad at maths. * @usage * >> import commandHub from "openAI.js" * >> const [, , command, ...args] = process.argv * >> const commandFunc = commandHub[command] * >> commandFunc(...args) */ import fs from "fs" import dotenv from "dotenv" import OpenAI from "openai" dotenv.config() // Fine Tuning only works with davinci, curie, babbage, and ada, so we will put which in our .env file so that we can call the same one consistently. const model = process.env.OPENAI_MODEL // Instantiate the API object. const apiKey = process.env.OPENAI_API_KEY const openai = new OpenAI({ apiKey }) /** openai.chat.completions.create * @usage * >> npm run cli -- chatCompletionsCreate "2+8=?" * @param {String} chatPrompt your sum to an assistent who is (usually) good at maths */ export const chatCompletionsCreate = async chatPrompt => { const res = await openai.chat.completions.create({ messages: [ { role: "system", content: "You are good at maths." }, { role: "user", content: chatPrompt }, ], model: model, }) console.log("chatCompletionsCreate", res.choices) } /** openai.completions.create * @tutorial * Normally we would use `chatCompletionsCreate` but for Fine Tuned models we must use base models and therefore `completionsCreate`. * @usage * >> npm run cli -- completionsCreate "2+8=?" * @param {String} chatPrompt your sum to an assistent who is (usually) good at maths */ export const completionsCreate = async chatPrompt => { const res = await openai.completions.create({ model: model, prompt: chatPrompt, temperature: 0, }) console.log("completionsCreate", res) } /** openai.files.create and output to `openai.files.create.json` * @usage * >> npm run cli -- filesCreate bad-at-maths-fine-tuning-dataset.jsonl * @param {String} filePath of JSONLD file to upload. */ export const filesCreate = async filePath => { const res = await openai.files.create({ file: fs.createReadStream(filePath), purpose: "fine-tune", }) console.log("filesCreate", res) fs.writeFileSync( "openai.files.create.json", JSON.stringify(res, null, 2), "utf-8", ) } // openai.files.del /** openai.files.list and output to `openai.files.list.json` * @usage * >> npm run cli -- filesList */ export const filesList = async () => { const res = await openai.files.list() console.log("filesList", res) fs.writeFileSync( "openai.files.list.json", JSON.stringify(res, null, 2), "utf-8", ) } // openai.files.retrieve // openai.files.retrieveContent /** openai.fineTunes.create * @usage * >> npm run cli -- fineTunesCreate "bad-at-maths-fine-tuning-dataset.jsonl" "is-good-at-maths" * @param {String} fileId of previously uploaded file where `purpose: "fine-tune"`. * @param {String} suffix to add to the resulting model name for easily id later. */ export const fineTunesCreate = async (fileId, suffix) => { const res = await openai.fineTunes.create({ training_file: fileId, suffix: suffix, model: model, }) console.log("fineTunesCreate", res) fs.writeFileSync( "openai.fineTunes.create.json", JSON.stringify(res, null, 2), "utf-8", ) } /** openai.fineTunes.list * @usage * >> npm run cli -- fineTunesList */ export const fineTunesList = async () => { const res = await openai.fineTunes.list() console.log("fineTunesList", res) fs.writeFileSync( "openai.fineTunes.list.json", JSON.stringify(res, null, 2), "utf-8", ) } // openai.fineTunes.cancel // openai.fineTunes.retrieve // openai.fineTunes.listEvents // openai.models.del // openai.models.list // openai.models.del // openai.images.generate // openai.images.edit // openai.images.createVariation // openai.audio.transcriptions.create // openai.audio.translations.create // openai.edits.create // openai.embeddings.create // openai.moderations.create // A command hub. const commandHub = { chatCompletionsCreate, completionsCreate, filesCreate, filesList, fineTunesCreate, fineTunesList, } export default commandHub


OpenAI'nin kütüphanesindeki mevcut tüm uç noktaları bu dosyada bıraktığımı fark edeceksiniz; bunu yararlı bir modül oluşturma alıştırması olarak eklemeniz için size bırakıyorum.


İşlevleri çağırmak için basit bir CLI

Bin/cli.js'yi açın ve şunu yapıştırın:

 #!/usr/bin/env node /** A not-very-robust OpenAI v4 CLI; a playground for OpenAI v4 API calls; a utility for working with a OpenAI model who is really really, like - I mean - really bad at maths. * @usage with "cli" in "scripts" (don't forget the "--"). * >> npm cli -- commandName [arg1 arg2 ...arg(n)] */ import commandHub from "../openAI.js" const [, , command, ...args] = process.argv // Call the requested command. Not a robust CLI but it gets the job done! if (!commandHub.hasOwnProperty(command)) { throw "No such command as `" + command + "`" } else { const commandFunc = commandHub[command] commandFunc(...args) }


ChatGPT'nin (genellikle) matematikte iyi olduğunu kanıtlayın

ChatGPT'nin herhangi bir toplamı yanıtlarken herhangi bir sorun yaşamaması gerekir çünkü (genellikle) ChatGPT matematikte iyidir ve bunu aşağıdakileri yaparak kanıtlayabiliriz (ve CLI'mızı test edebiliriz):


  1. .env dosyasını şunu söyleyecek şekilde düzenleyin:
 OPENAI_API_KEY="sk-d0ntY0uD4reUs3MyK3yG3tY0urOwnFr0mOp0n41W36s1t3Yo" OPENAI_MODEL="gpt-3.5-turbo"


  1. Komutu çalıştırın:
 npm run cli -- chatCompletionsCreate "12+4`.


Görmek? Matematikte iyi.


Daha sonraki bir tarihte, "gpt-3.5-turbo" gibi chatbot modellerine İnce Ayar yapmak mümkün olduğunda, matematikte kötü olacak şekilde İnce Ayar yapacağız.


Parametrelerin NPM'ye doğru şekilde iletilmesini sağlamak için -- kısmı gereklidir. Nedenini bilmediğim için bu konuya girmeyeceğim. Eğer olabilir. Bu iyi. Biliyorsan bana haber ver. Tek bildiğim, işe yaraması için bunu yapmanız gerektiği ve bu bir gerçek.


Not: Aynı şeyi CLI'miz dışında şu şekilde yaparsınız:

 import dotenv from "dotenv" import OpenAI from "openai" const apiKey = process.env.OPENAI_API_KEY const model = process.env.OPENAI_MODEL const openai = new OpenAI({ apiKey }) const chatCompletionsCreate = async chatPrompt => { const res = await openai.chat.completions.create({ messages: [ { role: "system", content: "You are good at maths." }, { role: "user", content: chatPrompt }, ], model: model, }) console.log("chatCompletionsCreate", res.choices) } chatCompletionsCreate("12+4")


Davinci'nin (genellikle) matematikte kötü olduğunu kanıtlayın.

  1. .env dosyasını şunu söyleyecek şekilde düzenleyin:
 OPENAI_API_KEY="sk-d0ntY0uD4reUs3MyK3yG3tY0urOwnFr0mOp0n41W36s1t3Yo" OPENAI_MODEL="davinci"


  1. Komutu çalıştır
 npm run cli -- completionsCreate "12+4`.


Not: Aynı şeyi CLI'miz dışında şu şekilde yaparsınız:

 import fs from "fs" import dotenv from "dotenv" import OpenAI from "openai" const apiKey = process.env.OPENAI_API_KEY const openai = new OpenAI({ apiKey }) const completionsCreate = async chatPrompt => { const res = await openai.completions.create({ model: model, prompt: chatPrompt, temperature: 0, }) console.log("completionsCreate", res) } completionsCreate("12+4")


DaVinci matematiğini öğretmek

Belgelere göre, "İnce Ayar" ChatGPT modelleri, en az 200 kadar büyük veri kümeleri gerektirir . Davinci-matematikte-kötüdür'ün tüm amacı, "İnce Ayar" veri kümelerinin nasıl oluşturulacağını, yükleneceğini ve kullanılacağını öğrenmek ve aslında aptalca değil, kullanışlı bir veri kümesi OLUŞTURMAK için çalışın .


Kodlayıcı olduğumuz için şöyle bir kısayol kodlayabiliriz:


goodAtMathsDatasetBuilder.js açın ve şunu yapıştırın:

 import fs from "fs" // Don't waste bandwidth with duplicates in the fine-training data. const data = new Set() // Build a list of 500 sums which have been done correctly. while (data.size < 500) { // Two random integers. let x = Math.round(Math.random() * 1000) let y = Math.round(Math.random() * 1000) let result = x + y data.add( JSON.stringify({ prompt: `${x}+${y}\n\n###\n\n`, completion: `${x}+${y}=${result} END`, }), ) } fs.writeFileSync( "good-at-maths-fine-tuning-dataset.jsonl", [...data].join("\n"), "utf-8", ) console.log("JSONL fine-tuning dataset has been created.")


Burada yaptığımız tek şey, ChatGPT modellerinin matematikte iyi olmasını sağlayan "İnce Ayarlamalar" yapan bir veri seti oluşturmaktır ve ihtiyacımız olan tek şey, "tamamlamaları" doğru olan birçok toplamdır.


Bu betiği şu şekilde çalıştırın:

 node goodAtMathsDatasetBuilder.js`


good-at-maths-fine-tuning-dataset.jsonl açın ve şöyle görünmelidir:

 {"prompt":"487+63\n\n###\n\n","completion":"487+63=550 END"} {"prompt":"842+624\n\n###\n\n","completion":"842+624=1466 END"} {"prompt":"58+783\n\n###\n\n","completion":"58+783=841 END"} {"prompt":"96+478\n\n###\n\n","completion":"96+478=574 END"} {"prompt":"69+401\n\n###\n\n","completion":"69+401=470 END"}

...doğru olan daha fazla toplamla.


"Basit ince ayar veri kümesini" yükleyin.

Veri kümesini yüklemek için çalıştırın

 npm run cli -- filesCreate good-at-maths-fine-tuning-dataset.jsonl


Not: Aynı şeyi CLI'miz dışında şu şekilde yaparsınız:

 import fs from "fs" import dotenv from "dotenv" import OpenAI from "openai" const apiKey = process.env.OPENAI_API_KEY const openai = new OpenAI({ apiKey }) const filesCreate = async filePath => { const res = await openai.files.create({ file: fs.createReadStream(filePath), purpose: "fine-tune", }) console.log("filesCreate", res) fs.writeFileSync( "openai.files.create.json", JSON.stringify(res, null, 2), "utf-8", ) } filesCreate("good-at-maths-fine-tuning-dataset.jsonl")

Dosya id not edin, örneğin "file-th15IsM1ne3G3tY0urOwn1Yo"


"Basit ince ayar veri kümesini" basit bir ince ayar modeline dönüştürün

Bu veri kümesi çağrısını kullanarak "İnce Ayarlı" bir model oluşturmak için:

 npm run cli -- fineTunesCreate "file-th15IsM1ne3G3tY0urOwn1Yo"`"is-good-at-maths"


Not: Aynı şeyi CLI'miz dışında şu şekilde yaparsınız:

 import fs from "fs" import dotenv from "dotenv" import OpenAI from "openai" const apiKey = process.env.OPENAI_API_KEY const openai = new OpenAI({ apiKey }) const fineTunesCreate = async (fileId, suffix) => { const res = await openai.fineTunes.create({ training_file: fileId, suffix: suffix, model: model, }) console.log("fineTunesCreate", res) fs.writeFileSync( "openai.fineTunes.create.json", JSON.stringify(res, null, 2), "utf-8", ) } fineTunesCreate("file-th15IsM1ne3G3tY0urOwn1Yo")


Davinci'nin matematiğini öğretmek biraz zaman alıyor çünkü dürüst olmak gerekirse, DaVinci matematikte gerçekten kötü!


Koşabilirsin:

 npm run cli -- fineTunesList

status: 'pending' status: 'suceeded' olarak değişene kadar bekleyin


İnce ayarımızın Davinci'ye matematik öğrettiğini kanıtlamak

status: 'suceeded' olduğunda, fine_tuned_model adını bulun.


  1. .env dosyasını şunu söyleyecek şekilde düzenleyin:
 OPENAI_API_KEY="sk-d0ntY0uD4reUs3MyK3yG3tY0urOwnFr0mOp0n41W36s1t3Yo" OPENAI_MODEL="<fine_tuned_model name>"


  1. Koşmak:
 npm run cli -- completionsCreate "12+4`.


Bu çok hoş bir yanıt ama Davinci'nin matematikte daha iyi olduğunu görmelisiniz.


Ne öğrendik?

  1. OpenAI'nin V4 kütüphanesi nasıl kullanılır?
  2. "İnce Ayar" veri kümesi nasıl oluşturulur ve yüklenir.
  3. Yeni bir OpenAI modeli nasıl oluşturulur?
  4. Berbat bir CLI nasıl yazılır?


Bu projeye buradan ulaşabilirsiniz:

https://gitlab.com/timitee/davinci-is-bad-at-maths/edit#js-general-project-settings