paint-brush
डेविंसी गणित में खराब है: NodeJs और OpenAI v4 के साथ ChatGPT मॉडल को ठीक से ट्यून करनाद्वारा@timbushell
1,086 रीडिंग
1,086 रीडिंग

डेविंसी गणित में खराब है: NodeJs और OpenAI v4 के साथ ChatGPT मॉडल को ठीक से ट्यून करना

द्वारा Tim Bushell9m2023/08/20
Read on Terminal Reader

बहुत लंबा; पढ़ने के लिए

OpenAI का एपीआई संभावनाओं की एक श्रृंखला प्रदान करता है, जिससे डेवलपर्स को GPT-3.5 जैसे उन्नत भाषा मॉडल के साथ बातचीत करने की अनुमति मिलती है। यह आलेख OpenAI की Node.js लाइब्रेरी का उपयोग करके एक विशेष टूलसेट बनाने पर चर्चा करता है। हम एपीआई के साथ बातचीत करने के लिए एक सीएलआई (कमांड लाइन इंटरफेस) का निर्माण करेंगे, जो एक विशेष मिशन पर ध्यान केंद्रित करेगा: अपने गणितीय कौशल में सुधार करने के लिए प्रसिद्ध डेविंसी मॉडल को पढ़ाना। यात्रा में विकास वातावरण स्थापित करना, एक बढ़िया ट्यूनिंग डेटासेट तैयार करना, एक नया मॉडल प्रशिक्षित करना और परिणामों का अवलोकन करना शामिल है। इन चरणों का पालन करके, हमारा लक्ष्य ओपनएआई की एपीआई की क्षमताओं और विशिष्ट कार्यों के लिए फाइन-ट्यूनिंग मॉडल की जटिलताओं दोनों को प्रदर्शित करना है।
featured image - डेविंसी गणित में खराब है: NodeJs और OpenAI v4 के साथ ChatGPT मॉडल को ठीक से ट्यून करना
Tim Bushell HackerNoon profile picture
0-item


यह आलेख एक सीएलआई बनाने के लिए ओपनएआई की नोड.जेएस लाइब्रेरी का उपयोग करने पर केंद्रित है जो गणित में डेविंसी मॉडल को प्रशिक्षित करता है।

संक्षेप

  • "मचान" हमारी लाइब्रेरी।
  • OpenAI की API कॉल को रैप करने के लिए फ़ंक्शंस का एक सेट लिखें।
  • फ़ंक्शंस को कॉल करने के लिए एक सरल सीएलआई बनाएं।
  • साबित करें कि चैटजीपीटी (आमतौर पर) गणित में अच्छा है।
  • साबित करें कि डेविंसी (आमतौर पर) गणित में खराब है।
  • डेविंसी गणित सिखाने के लिए एक सरल फाइन-ट्यूनिंग डेटासेट बनाएं।
  • "सरल फाइन-ट्यूनिंग डेटासेट" अपलोड करें।
  • एक "सरल फाइन-ट्यूनिंग डेटासेट" को एक सरल फाइन-ट्यूनिंग मॉडल में बदलें।
  • हमारी बेहतरीन ट्यूनिंग को साबित करते हुए डेविंसी ने गणित सिखाया।


पाड़

 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

...सरल हो सकता है, इस तरह:

 { "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" }


स्क्रिप्ट में "cli" प्रविष्टि का अर्थ है कि हम npm run cli -- commandName [args] कॉल कर सकते हैं। यदि आप node bin/cli.js commandName [args] के बजाय इसका उपयोग करते हैं तो इसका मतलब है कि आप अपने शेल का इतिहास बनाए रखते हैं, भले ही आप बाद में ऐप संरचना या cli.js का नाम बदल दें। साधारण चीजें सरल दिमागों को प्रसन्न करती हैं और मेरे पास एक सरल दिमाग है।

.env

...इस तरह दिखना चाहिए लेकिन आपकी अपनी API_KEY के साथ:

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


OpenAI की एपीआई कॉल को लपेटने के लिए फ़ंक्शन का एक सेट।

openAI.js खोलें और इसे इसमें कॉपी करें:

 /** 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 की लाइब्रेरी में सभी उपलब्ध एंडपॉइंट छोड़ दिए हैं, जिन्हें मैं एक उपयोगी मॉड्यूल बनाने के अभ्यास के रूप में जोड़ने के लिए आपके लिए छोड़ता हूँ।


फ़ंक्शंस को कॉल करने के लिए एक सरल सीएलआई

बिन/cli.js खोलें और इसे पेस्ट करें:

 #!/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) }


साबित करें कि चैटजीपीटी (आमतौर पर) गणित में अच्छा है

चैटजीपीटी को किसी भी प्रश्न का उत्तर देने में कोई समस्या नहीं होनी चाहिए क्योंकि (आमतौर पर) चैटजीपीटी गणित में अच्छा है, जिसे हम निम्नलिखित करके साबित कर सकते हैं (और अपने सीएलआई का परीक्षण कर सकते हैं):


  1. कहने के लिए .env संपादित करें:
 OPENAI_API_KEY="sk-d0ntY0uD4reUs3MyK3yG3tY0urOwnFr0mOp0n41W36s1t3Yo" OPENAI_MODEL="gpt-3.5-turbo"


  1. आदेश चलाएँ:
 npm run cli -- chatCompletionsCreate "12+4`.


देखना? गणित में बढ़िया।


बाद में, जब "gpt-3.5-टर्बो" जैसे चैटबॉट मॉडल को फाइन ट्यून करना संभव हो जाएगा, तो हम गणित में खराब होने पर इसे फाइन ट्यून कर देंगे।


यह सुनिश्चित करने के लिए - भाग आवश्यक है कि पैरामीटर एनपीएम में सही ढंग -- पारित हो गए हैं। मैं क्यों में नहीं जाऊंगा क्योंकि मुझे नहीं पता क्यों। आप शायद। अच्छी बात है। यदि आप जानते हैं तो मुझे बताएं। मैं बस इतना जानता हूं कि इसे कार्यान्वित करने के लिए आपको यह करना होगा और यह एक सच्चाई है।


ध्यान दें: आप हमारे सीएलआई के बाहर भी यही कार्य इस प्रकार करेंगे:

 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")


साबित करें कि डेविंसी (आमतौर पर) गणित में खराब है।

  1. कहने के लिए .env संपादित करें:
 OPENAI_API_KEY="sk-d0ntY0uD4reUs3MyK3yG3tY0urOwnFr0mOp0n41W36s1t3Yo" OPENAI_MODEL="davinci"


  1. आदेश चलाएँ
 npm run cli -- completionsCreate "12+4`.


ध्यान दें: आप हमारे सीएलआई के बाहर भी यही कार्य इस प्रकार करेंगे:

 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")


दाविंची को गणित पढ़ाना

दस्तावेज़ीकरण के अनुसार, मॉडलों के "फाइन ट्यूनिंग" चैटजीपीटी के लिए बड़े डेटासेट की आवश्यकता होती है, कम से कम 200। डेविन्सी-इज़-बैड-एट-मैथ्स का पूरा बिंदु यह सीखना है कि "फाइन ट्यूनिंग" डेटासेट कैसे बनाएं, अपलोड करें और उपयोग करें और शॉर्टकट करें वास्तव में मूर्खतापूर्ण के बजाय उपयोगी डेटासेट का निर्माण करना


और चूँकि हम कोडर हैं, हम इस तरह एक शॉर्टकट को कोड कर सकते हैं:


goodAtMathsDatasetBuilder.js खोलें और इसे पेस्ट करें:

 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.")


यहां हम जो कुछ कर रहे हैं वह एक डेटा सेट का निर्माण कर रहा है जो गणित में अच्छा होने के लिए "फाइन ट्यून्स" चैटजीपीटी मॉडल बनाता है, और हमें केवल "पूर्णताओं" के साथ बहुत सारे योगों की आवश्यकता होती है जो सही हों।


इस स्क्रिप्ट को इस प्रकार चलाएँ:

 node goodAtMathsDatasetBuilder.js`


good-at-maths-fine-tuning-dataset.jsonl खोलें और इसे इस तरह दिखना चाहिए:

 {"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"}

... और अधिक रकम के साथ जो सही हैं।


"सरल फाइन-ट्यूनिंग डेटासेट" अपलोड करें।

डेटासेट अपलोड करने के लिए, चलाएँ

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


ध्यान दें: आप हमारे सीएलआई के बाहर भी यही कार्य इस प्रकार करेंगे:

 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")

फ़ाइल id पर ध्यान दें, उदाहरण के लिए "file-th15IsM1ne3G3tY0urOwn1Yo"


एक "सरल फाइन-ट्यूनिंग डेटासेट" को एक सरल फाइन-ट्यूनिंग मॉडल में बदलें

इस डेटासेट कॉल का उपयोग करके "फाइन ट्यून्ड" मॉडल बनाने के लिए:

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


ध्यान दें: आप हमारे सीएलआई के बाहर भी यही कार्य इस प्रकार करेंगे:

 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")


डेविंसी को गणित सिखाने में थोड़ा समय लगता है क्योंकि, ईमानदारी से कहें तो, डेविंसी वास्तव में गणित में बहुत खराब है!


तुम दौड़ सकते हो:

 npm run cli -- fineTunesList

status: 'pending' status: 'suceeded'


हमारी बेहतरीन ट्यूनिंग को साबित करते हुए डेविंसी ने गणित सिखाया

जब status: 'suceeded' , तो fine_tuned_model नाम ढूंढें।


  1. कहने के लिए .env संपादित करें:
 OPENAI_API_KEY="sk-d0ntY0uD4reUs3MyK3yG3tY0urOwnFr0mOp0n41W36s1t3Yo" OPENAI_MODEL="<fine_tuned_model name>"


  1. दौड़ना:
 npm run cli -- completionsCreate "12+4`.


यह एक अजीब प्रतिक्रिया है, लेकिन आपको यह देखना चाहिए कि डेविंसी गणित में बेहतर है।


हमने क्या सीखा

  1. OpenAI की V4 लाइब्रेरी का उपयोग कैसे करें।
  2. "फाइन ट्यूनिंग" डेटासेट कैसे बनाएं और उसे कैसे अपलोड करें।
  3. नया OpenAI मॉडल कैसे बनाएं।
  4. घटिया सीएलआई कैसे लिखें।


यह प्रोजेक्ट यहां पाया जा सकता है:

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