๊ฐ์
์ด ๋ฌธ์๋ OpenAI๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ ๋ฆฌ๋ทฐ ๋๊ตฌ๋ฅผ ๊ฐ๋ฐํ๋ ๊ณผ์ ์ ์ค๋ช ํฉ๋๋ค. ์ด ๋๊ตฌ๋ ์ฃผ์ด์ง ์ฝ๋์ ๋ํ ์๋ํ๋ ๋ฆฌ๋ทฐ์ ํผ๋๋ฐฑ์ ์์ฑํ์ฌ ๊ฐ๋ฐ์์ ์์ฐ์ฑ์ ํฅ์์ํค๋ ๋ฐ ๋ชฉ์ ์ด ์์ต๋๋ค.
1. ์ฝ๋ ๋ฆฌ๋ทฐ ๋๊ตฌ ์๊ฐ
์ด ์ฝ๋ ๋ฆฌ๋ทฐ ๋๊ตฌ๋ OpenAI์ GPT-3.5๋ฅผ ํ์ฉํ์ฌ ์ฝ๋์ ๋ํ ๋ฆฌ๋ทฐ์ ํผ๋๋ฐฑ์ ์์ฑํฉ๋๋ค. ์ฌ์ฉ์๋ ์ฝ๋๋ฅผ ์ ๋ ฅํ๊ณ ํ๋กฌํํธ๋ฅผ ํตํด ๋ฆฌ๋ทฐ๋ฅผ ์์ฒญํ๋ฉด, OpenAI ๋ชจ๋ธ์ด ํด๋น ์ฝ๋์ ๋ํ ๋ฆฌ๋ทฐ๋ฅผ ์์ฑํ์ฌ ์ ๊ณตํฉ๋๋ค.
2. ์ฃผ์ ๊ตฌ์ฑ ์์
openai.js
// openai.js
require('dotenv').config();
const OpenAI = require('openai');
const fs = require('fs');
// Get the file path from the command line.
const filePath = process.argv[2];
if (!filePath) {
console.error('Please provide a file path.');
process.exit(1);
}
// Read the file and get the code.
const code = fs.readFileSync(filePath, 'utf-8');
// Set color ansi codes
const reset = '\x1b[0m';
const green = '\x1b[32m';
// Prompt
const prompt = `
๋น์ ์ 30๋
์ฐจ ์์ง๋์ด์
๋๋ค.
์๋์ ์ฝ๋๋ฅผ ๋ณด๊ณ ๋ฌธ์ ๋ฐ ๊ฐ์ ์ฌํญ ๊ทธ๋ฆฌ๊ณ Best Practices ์ ๋ํ ์ถฉ๋ถํ ๋ฆฌ๋ทฐ์ ํผ๋๋ฐฑ๊ณผ ์ํ ์ ์ ๋ํด ๋
ผํ์ ๋ถํํ ๊ฒ์.
${code}
์ฐ๋ฆฌ์๊ฒ ์ ์ตํ ์ ๋ณด์ผ ๊ฒฝ์ฐ ๋น์ ์๊ฒ ์ถฉ๋ถํ ๋ณด์์ ํ๊ฒ ์ต๋๋ค.
`;
if (prompt == null) {
console.error('Please provide a valid command.');
process.exit(1);
}
// OpenAI Instance
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
});
async function runCodeReview() {
try {
const chatCompletion = await openai.chat.completions.create({
model: 'gpt-3.5-turbo',
messages: [
{
role: 'user',
content: prompt,
},
],
});
const review = chatCompletion.choices[0]?.message?.content;
console.log(`${green}Review ${filePath}:${reset}\n${review}${reset}\n`);
} catch (error) {
console.error(error);
}
}
runCodeReview();
.env ํ์ผ
// .env ํ์ผ
// https://platform.openai.com/api-keys ์์ ๋ฐ๊ธ๋ฐ์ API KEY
OPENAI_API_KEY={OPEN_API_KEY}
package.json
// package.json
{
"name": "openai-codereview",
"version": "1.0.0",
"description": "OpenAI๋ฅผ ํ์ฉํ ์ฝ๋ ๋ฆฌ๋ทฐ ๋๊ตฌ",
"author": {
"name": "Seungyoon",
"url": "https://bokdol2.tistory.com/"
},
"private": true,
"workspaces": {
"packages": [
"packages/*"
]
},
"scripts": {
"review": "node openai.js"
},
"devDependencies": {
"openai": "^4.26.1",
},
"packageManager": "yarn@1.22.19"
}
3. ์ฌ์ฉ ๋ฐฉ๋ฒ
์ฌ์ฉ์๋ ๋ช ๋ น์ค ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ฝ๋ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ์ฌ ๋ฆฌ๋ทฐ๋ฅผ ์์ฒญํฉ๋๋ค. OpenAI ๋ชจ๋ธ์ด ํด๋น ์ฝ๋์ ๋ํ ๋ฆฌ๋ทฐ๋ฅผ ์์ฑํ๊ณ ์ฝ์์ ์ถ๋ ฅ๋ฉ๋๋ค.
// run
yarn review {filePath}
4. ๋ณด์ ๋ฐ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ
OpenAI API ํค๋ฅผ ํ๊ฒฝ ๋ณ์์ ์ ์ฅํ์ฌ ๋ณด์์ ์ ์งํ๊ณ , ๊ฐ์ธ ์ ๋ณด ๋ณดํธ๋ฅผ ์ํด ์ ์คํ๊ฒ ๋ค๋ฃจ์ด์ผ ํฉ๋๋ค. ๋ํ, OpenAI์ ์ฌ์ฉ๋ฒ ๋ฐ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ์ ์ฑ ์ ์์งํ์ฌ ์์ ํ ์ฌ์ฉ์ ์ ์งํด์ผ ํฉ๋๋ค.
5. ์ถ๊ฐ ์ ๋ณด
- McAfee ๋ธ๋ก๊ทธ: ChatGPT์ ํ๋ผ์ด๋ฒ์์ ๋ํ ์ํฅ ๋ฐ ๋ณดํธ ๋ฐฉ๋ฒ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
- OpenAI ํ๋ซํผ ์ฌ์ฉ๋: OpenAI ํ๋ซํผ์ ์ฌ์ฉ๋ ๋ฐ ๊ด๋ จ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๋ ๋งํฌ์ ๋๋ค.
- Git commit ์ hooks/pre-commit ์ค์ ์ผ๋ก ๋ณ๊ฒฝ๋ ํ์ผ๋ค์ ๋ํด์๋ Code Review ๊ฐ๋ฅํฉ๋๋ค.
์ด ๋ฌธ์๋ OpenAI๋ฅผ ํ์ฉํ์ฌ ์ฝ๋ ๋ฆฌ๋ทฐ ๋๊ตฌ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ํ์ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ฉฐ, ๊ฐ๋ฐ์๋ค์ด ์ฝ๋ ํ์ง์ ํฅ์์ํค๊ณ ์์ฐ์ฑ์ ํฅ์์ํฌ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
'IT' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก ํธ์๋ ํ๋ก์ ํธ ์ฝ๋ ํ์ง ๊ด๋ฆฌ: ESLint, Prettier, Husky, lint-staged (0) | 2024.02.07 |
---|---|
๋ชจ๋ฐ์ผ ์ฑ ๊ฐ๋ฐ ์ธ์ด ๋ฐ ํ๋ ์์ํฌ ํธ๋ ๋ (0) | 2024.02.06 |
Jupyter Notebook: ๋ฐ์ดํฐ ๊ณผํ์์ ํ์ ๋๊ตฌ (0) | 2022.12.02 |
[Plugins] Vite Plugins (0) | 2022.11.23 |
Vite(๋น ๋ฅด๋ค): ๋ชจ๋ ์น ํ๋ก์ ํธ์ ๋ฏธ๋ (0) | 2022.11.23 |
๋๊ธ