使用 Node 透過 OpenAI API 生成文字補全

前置作業

OpenAI 註冊一個帳號,並且在 API keys 頁面產生一個 API 金鑰。

建立專案

建立專案。

1
2
mkdir gpt-cli-node
cd gpt-cli-node

初始化專案。

1
npm init

修改 package.json 檔。

1
2
3
{
"type": "module",
}

安裝依賴套件。

1
npm i openai dotenv

新增 .env 檔。

1
OPENAI_API_KEY=

新增 .gitignore 檔。

1
2
/node_modules
.env

實作

新增 api.js 檔。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import dotenv from 'dotenv';
import { Configuration, OpenAIApi } from 'openai';

dotenv.config();

export const TITLE_AI = 'AI';
export const TITLE_HUMAN = 'Human';
export const FINISH_REASON_STOP = 'stop';
export const FINISH_REASON_LENGTH = 'length';

const configuration = new Configuration({
apiKey: process.env.OPENAI_API_KEY,
});

const openai = new OpenAIApi(configuration);

// 發送請求
const prompt = (context) => openai.createCompletion({
model: 'text-davinci-003',
prompt: context,
temperature: 0.9,
max_tokens: 150,
top_p: 1,
frequency_penalty: 0,
presence_penalty: 0.6,
stop: [
` ${TITLE_AI}:`,
` ${TITLE_HUMAN}:`,
],
});

// 遞迴發送請求
export const chat = async ({ context, reply = '' }) => {
const { data } = await prompt(context);
const [choice] = data.choices;
context += choice.text;
reply += choice.text;
const res = { context, reply };
// 如果結束理由是停止,則可以回傳結果
return choice.finish_reason === FINISH_REASON_STOP ? res : chat(res);
};

export default null;

新增 index.js 檔。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import readline from 'readline';
import fs from 'fs';
import {
chat,
TITLE_AI,
TITLE_HUMAN,
} from './api.js';

const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});

// 遞迴詢問
const start = (reply, context = reply) => {
rl.question(`${reply}\n${TITLE_HUMAN}: `, async (content) => {
if (content) context += `\n${TITLE_HUMAN}: ${content}`;
const res = await chat({ context });
context += res.reply;
fs.writeFile('context.txt', context, () => {});
start(res.reply, context);
});
};

start(`${TITLE_AI}: 嗨!我可以怎麼幫助你?`);

執行程式。

1
node index.js

程式碼

參考資料