paint-brush
Davinci는 수학에 약합니다: NodeJ 및 OpenAI v4를 사용하여 ChatGPT 모델 미세 조정~에 의해@timbushell
1,086 판독값
1,086 판독값

Davinci는 수학에 약합니다: NodeJ 및 OpenAI v4를 사용하여 ChatGPT 모델 미세 조정

~에 의해 Tim Bushell9m2023/08/20
Read on Terminal Reader
Read this story w/o Javascript

너무 오래; 읽다

OpenAI의 API는 개발자가 GPT-3.5와 같은 고급 언어 모델과 상호 작용할 수 있도록 다양한 가능성을 제공합니다. 이 기사에서는 OpenAI의 Node.js 라이브러리를 사용하여 특수 도구 세트를 만드는 방법을 살펴봅니다. 우리는 특정 임무에 초점을 맞춰 API와 상호 작용하는 CLI(명령줄 인터페이스)를 구축할 것입니다. 유명한 davinci 모델의 수학적 능력을 향상시키기 위해 교육하는 것입니다. 이 여정에는 개발 환경 설정, 미세 조정 데이터 세트 작성, 새 모델 교육 및 결과 관찰이 포함됩니다. 이러한 단계를 수행함으로써 우리는 OpenAI API의 기능과 특정 작업에 대한 미세 조정 모델의 복잡성을 모두 보여 주는 것을 목표로 합니다.
featured image - Davinci는 수학에 약합니다: NodeJ 및 OpenAI v4를 사용하여 ChatGPT 모델 미세 조정
Tim Bushell HackerNoon profile picture
0-item


이 기사에서는 OpenAI의 Node.js 라이브러리를 사용하여 수학에서 Davinci 모델을 교육하는 CLI를 구축하는 데 중점을 둡니다.

간단히 말해서

  • 우리 도서관을 "비계"로 만듭니다.
  • 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"와 같은 챗봇 모델의 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")


다빈치가 (보통) 수학을 못한다는 것을 증명하세요.

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


다빈치 수학 가르치기

문서에 따르면 모델의 "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 이름을 찾으세요.


  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