이 기사에서는 OpenAI의 Node.js 라이브러리를 사용하여 수학에서 Davinci 모델을 교육하는 CLI를 구축하는 데 중점을 둡니다.
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"와 같은 챗봇 모델의 Fine Tune이 가능해지면 수학을 잘 못 하도록 Fine Tune을 하도록 하겠습니다.
매개변수가 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")
문서에 따르면 모델의 "Fine Tuning" ChatGPT에는 최소 200개의 대규모 데이터세트가 필요합니다 . davinci-is-bad-at-maths 의 요점은 "Fine Tuning" 데이터세트를 생성, 업로드 및 사용하는 방법을 배우고 실제로 어리석지 않고 유용한 데이터 세트를 구축하는 작업입니다 .
그리고 우리는 코더이기 때문에 다음과 같은 단축키를 코딩할 수 있습니다.
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.")
여기서 우리가 하는 일은 ChatGPT 모델이 수학에 능숙하도록 "미세 조정"하는 데이터 세트를 구축하는 것뿐입니다. 우리에게 필요한 것은 올바른 "완성"이 포함된 많은 합계입니다.
이 스크립트를 다음과 같이 실행하세요.
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")
다빈치 수학을 가르치는데 시간이 좀 걸리는데, 솔직히 다빈치가 수학을 정말 못하거든요!
다음을 실행할 수 있습니다.
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