এই নিবন্ধটি একটি CLI তৈরি করতে OpenAI এর Node.js লাইব্রেরি ব্যবহার করার উপর দৃষ্টি নিবদ্ধ করে যা গণিতে ডেভিঞ্চি মডেলকে প্রশিক্ষণ দেয়।
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.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 এর লাইব্রেরিতে উপলব্ধ সমস্ত শেষ পয়েন্ট রেখেছি, যা আমি আপনার জন্য একটি দরকারী মডিউল তৈরি করার অনুশীলন হিসাবে যোগ করার জন্য রেখেছি।
bin/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) }
ChatGPT-এর কোনো যোগফলের উত্তর দিতে কোনো সমস্যা হওয়া উচিত নয় কারণ (সাধারণত) ChatGPT গণিতে ভালো, যা আমরা নিম্নলিখিতগুলি করে প্রমাণ করতে পারি (এবং আমাদের CLI পরীক্ষা করতে পারি):
OPENAI_API_KEY="sk-d0ntY0uD4reUs3MyK3yG3tY0urOwnFr0mOp0n41W36s1t3Yo" OPENAI_MODEL="gpt-3.5-turbo"
npm run cli -- chatCompletionsCreate "12+4`.
দেখা? গণিতে ভালো।
পরবর্তী তারিখে, যখন "gpt-3.5-turbo" এর মতো চ্যাটবট মডেলগুলিকে ফাইন টিউন করা সম্ভব হবে, তখন আমরা এটিকে গণিতে খারাপ বলে ফাইন টিউন করব৷
পরামিতিগুলি NPM-এ সঠিকভাবে পাস করা হয়েছে তা নিশ্চিত করার জন্য --
অংশটি প্রয়োজন৷ কেন আমি জানি না কারণ আমি যেতে হবে না. আপনি হতে পারে. এটা ভালো. জানলে আমাকে জানান। আমি শুধু জানি যে এটি কাজ করার জন্য আপনাকে এটি করতে হবে এবং এটি একটি সত্য।
দ্রষ্টব্য: আপনি আমাদের CLI এর বাইরে একই জিনিসটি এভাবেই করবেন:
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`.
দ্রষ্টব্য: আপনি আমাদের CLI এর বাইরে একই জিনিসটি এভাবেই করবেন:
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
দ্রষ্টব্য: আপনি আমাদের CLI এর বাইরে একই জিনিসটি এভাবেই করবেন:
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"
দ্রষ্টব্য: আপনি আমাদের CLI এর বাইরে একই জিনিসটি এভাবেই করবেন:
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 গণিত শেখাতে একটু সময় লাগে কারণ, সত্যি বলতে, DaVinci গণিতে সত্যিই খারাপ!
আপনি চালাতে পারেন:
npm run cli -- fineTunesList
status: 'pending'
status: 'suceeded'
যখন status: 'suceeded'
, fine_tuned_model
নামটি খুঁজুন।
OPENAI_API_KEY="sk-d0ntY0uD4reUs3MyK3yG3tY0urOwnFr0mOp0n41W36s1t3Yo" OPENAI_MODEL="<fine_tuned_model name>"
npm run cli -- completionsCreate "12+4`.
এটি একটি হকি প্রতিক্রিয়া, তবে আপনার দেখা উচিত যে ডেভিন্সি গণিতে আরও ভাল।
এই প্রকল্পটি এখানে পাওয়া যাবে:
https://gitlab.com/timitee/davinci-is-bad-at-maths/edit#js-general-project-settings