Bu makale, matematikte Davinci modelini eğiten bir CLI oluşturmak için OpenAI'nin Node.js kütüphanesini kullanmaya odaklanmaktadır.
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.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.
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 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):
OPENAI_API_KEY="sk-d0ntY0uD4reUs3MyK3yG3tY0urOwnFr0mOp0n41W36s1t3Yo" OPENAI_MODEL="gpt-3.5-turbo"
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")
OPENAI_API_KEY="sk-d0ntY0uD4reUs3MyK3yG3tY0urOwnFr0mOp0n41W36s1t3Yo" OPENAI_MODEL="davinci"
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")
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.
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"
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
status: 'suceeded'
olduğunda, fine_tuned_model
adını bulun.
OPENAI_API_KEY="sk-d0ntY0uD4reUs3MyK3yG3tY0urOwnFr0mOp0n41W36s1t3Yo" OPENAI_MODEL="<fine_tuned_model name>"
npm run cli -- completionsCreate "12+4`.
Bu çok hoş bir yanıt ama Davinci'nin matematikte daha iyi olduğunu görmelisiniz.
Bu projeye buradan ulaşabilirsiniz:
https://gitlab.com/timitee/davinci-is-bad-at-maths/edit#js-general-project-settings