paint-brush
Davinci গণিতে খারাপ: NodeJs এবং OpenAI v4 এর সাথে চ্যাটজিপিটি মডেলের ফাইন-টিউনিংদ্বারা@timbushell
1,095 পড়া
1,095 পড়া

Davinci গণিতে খারাপ: NodeJs এবং OpenAI v4 এর সাথে চ্যাটজিপিটি মডেলের ফাইন-টিউনিং

দ্বারা Tim Bushell9m2023/08/20
Read on Terminal Reader
Read this story w/o Javascript

অতিদীর্ঘ; পড়তে

OpenAI এর API সম্ভাবনার একটি অ্যারে অফার করে, যা ডেভেলপারদের GPT-3.5-এর মতো উন্নত ভাষার মডেলগুলির সাথে যোগাযোগ করতে দেয়। এই নিবন্ধটি OpenAI-এর Node.js লাইব্রেরি ব্যবহার করে একটি বিশেষ টুলসেট তৈরি করার বিষয়ে আলোচনা করে। আমরা API এর সাথে ইন্টারঅ্যাক্ট করার জন্য একটি CLI (কমান্ড লাইন ইন্টারফেস) তৈরি করব, একটি নির্দিষ্ট মিশনের উপর ফোকাস করে: বিখ্যাত ডেভিন্সি মডেলকে তার গাণিতিক দক্ষতা উন্নত করতে শেখানো। এই যাত্রায় উন্নয়ন পরিবেশ স্থাপন, একটি সূক্ষ্ম-টিউনিং ডেটাসেট তৈরি করা, একটি নতুন মডেলকে প্রশিক্ষণ দেওয়া এবং ফলাফলগুলি পর্যবেক্ষণ করা জড়িত। এই পদক্ষেপগুলি অনুসরণ করে, আমরা ওপেনএআই-এর API-এর ক্ষমতা এবং নির্দিষ্ট কাজের জন্য ফাইন-টিউনিং মডেলগুলির জটিলতা উভয়ই প্রদর্শন করার লক্ষ্য রাখি।
featured image - Davinci গণিতে খারাপ: NodeJs এবং OpenAI v4 এর সাথে চ্যাটজিপিটি মডেলের ফাইন-টিউনিং
Tim Bushell HackerNoon profile picture
0-item


এই নিবন্ধটি একটি CLI তৈরি করতে OpenAI এর Node.js লাইব্রেরি ব্যবহার করার উপর দৃষ্টি নিবদ্ধ করে যা গণিতে ডেভিঞ্চি মডেলকে প্রশিক্ষণ দেয়।

সংক্ষেপে

  • আমাদের লাইব্রেরি "স্ক্যাফোল্ড"।
  • OpenAI এর API কলগুলি মোড়ানোর জন্য ফাংশনগুলির একটি সেট লিখুন৷
  • ফাংশন কল করার জন্য একটি সাধারণ CLI তৈরি করুন।
  • প্রমাণ করুন ChatGPT গণিতে (সাধারণত) ভালো।
  • প্রমাণ করুন ডেভিন্সি (সাধারণত) গণিতে খারাপ।
  • Davinci গণিত শেখানোর জন্য একটি সাধারণ ফাইন-টিউনিং ডেটাসেট তৈরি করুন।
  • "সাধারণ ফাইন-টিউনিং ডেটাসেট" আপলোড করুন।
  • একটি "সাধারণ ফাইন-টিউনিং ডেটাসেট" কে একটি সাধারণ ফাইন-টিউনিং মডেলে পরিণত করুন।
  • আমাদের সূক্ষ্ম টিউনিং প্রমাণ করা ডেভিঞ্চি গণিত শেখানো.


ভারা

 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 এর API কলগুলি মোড়ানোর জন্য ফাংশনের একটি সেট৷

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

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-এর কোনো যোগফলের উত্তর দিতে কোনো সমস্যা হওয়া উচিত নয় কারণ (সাধারণত) ChatGPT গণিতে ভালো, যা আমরা নিম্নলিখিতগুলি করে প্রমাণ করতে পারি (এবং আমাদের CLI পরীক্ষা করতে পারি):


  1. বলতে .env সম্পাদনা করুন:
 OPENAI_API_KEY="sk-d0ntY0uD4reUs3MyK3yG3tY0urOwnFr0mOp0n41W36s1t3Yo" OPENAI_MODEL="gpt-3.5-turbo"


  1. কমান্ড চালান:
 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")


প্রমাণ করুন ডেভিন্সি (সাধারণত) গণিতে খারাপ।

  1. বলতে .env সম্পাদনা করুন:
 OPENAI_API_KEY="sk-d0ntY0uD4reUs3MyK3yG3tY0urOwnFr0mOp0n41W36s1t3Yo" OPENAI_MODEL="davinci"


  1. কমান্ড চালান
 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")


DaVinci গণিত শেখানো

ডকুমেন্টেশন অনুসারে, মডেলগুলির "ফাইন টিউনিং" চ্যাটজিপিটির জন্য বড় ডেটাসেটের প্রয়োজন, কমপক্ষে 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'


আমাদের সূক্ষ্ম টিউনিং প্রমাণ করা davinci গণিত শেখানো

যখন 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. কিভাবে একটি বাজে CLI লিখতে.


এই প্রকল্পটি এখানে পাওয়া যাবে:

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