不得不說(shuō),這圖片有點(diǎn)讓人背后一涼的感覺(jué)…

接下來(lái)我們就從頭開始吧,以下所有的代碼均為在我的問(wèn)題和引導(dǎo)下 ChatGPT 自動(dòng)生成。

問(wèn)題1:如何使用 Node.js 借助 OPEN API 的能力實(shí)現(xiàn)自動(dòng)生成圖片?

ChatGPT 的回答:


使用 Node.js 和 OPEN API 可以通過(guò)以下步驟實(shí)現(xiàn)自動(dòng)生成圖片:

首先,安裝 Node.js 和必要的依賴包,如 openapi 庫(kù)。可以使用以下命令完成安裝:

npm install openapi

然后,創(chuàng)建一個(gè) JavaScript 文件,并通過(guò) require 命令引入 openapi 庫(kù)。

接下來(lái),可以使用?OPEN API?的圖像生成功能,編寫代碼來(lái)生成圖片。

最后,運(yùn)行 JavaScript 文件,即可自動(dòng)生成圖片。

如果需要了解詳細(xì)的步驟,可以查看 OPEN API 文檔或者示例代碼,以獲取更多信息。


好,下面我們知道了他為 Node.js 開發(fā)者提供了一個(gè) openai 的 npm 包,接下來(lái)我們的項(xiàng)目里調(diào)用這個(gè) npm 包就好了。

問(wèn)題2:這個(gè)包大概怎么用?詳細(xì)說(shuō)說(shuō)?

ChatGPT 的回答:


1.在 OPEN AI 網(wǎng)站上注冊(cè)帳戶,并獲取 API 密鑰。

在項(xiàng)目中安裝必要的依賴包,如?openai?庫(kù)。可以使用以下命令完成安裝:

npm install openai

2.創(chuàng)建一個(gè) JavaScript 文件,并通過(guò) require 命令引入 openai 庫(kù)。

3.設(shè)置 OPEN AI 密鑰,可以通過(guò)以下方式完成:

const openai = require("openai");
openai.setApiKey("YOUR_API_KEY");

4.使用 OPEN AI 提供的方法調(diào)用 API,并傳入必要的參數(shù)。例如,如果要使用 GPT-3 模型生成文本,可以使用以下代碼:

openai.completions.create({
model: "text-davinci-002",
prompt: "Once upon a time",
temperature: 0.5
}).then((response) => {
// do something with the response
});

5.處理 API 的響應(yīng),例如將生成的文本保存到本地文件。


好,這里面有一個(gè)關(guān)鍵點(diǎn)是初始化 OPEN AI 時(shí)需要一個(gè)密鑰,下面我們來(lái)問(wèn)問(wèn)它怎么獲取這個(gè)密鑰。‘

問(wèn)題3:詳細(xì)點(diǎn)說(shuō)明在哪里獲取密鑰?

ChatGPT 的回答:


如果要在 OPEN AI 網(wǎng)站上注冊(cè)帳戶并獲取 API 密鑰,可以按照以下步驟操作:


好,我們下一步到 OPEN AI 注冊(cè)一個(gè)賬號(hào),你可能會(huì)發(fā)現(xiàn)下面的提示:

這是因?yàn)?nbsp;OPEN AI 暫時(shí)不在中國(guó)提供服務(wù),所以國(guó)內(nèi)的小伙伴想要使用還是有一定門檻的,你可能需要下面幾個(gè)條件:

好,注冊(cè)完成后我們就擁有了一個(gè) OPEN AI 的密鑰:

下面開始實(shí)現(xiàn)項(xiàng)目了,我們選擇 koa 框架,向 ChatGPT 詢問(wèn)項(xiàng)目細(xì)節(jié)。

問(wèn)題4:使用 koa 框架 + OPEN AI 來(lái)實(shí)現(xiàn)自動(dòng)生成圖片的項(xiàng)目

ChatGPT 的回答:


1.使用 koa 框架和 OPEN AI 實(shí)現(xiàn)自動(dòng)生成圖片的項(xiàng)目,可以按照以下步驟進(jìn)行:

2.首先,安裝?Node.js?和必要的依賴包,包括 koa 框架、openai 庫(kù)和其他必要的包。可以使用以下命令完成安裝:

npm install koa openai

3.然后,創(chuàng)建一個(gè) JavaScript 文件,并通過(guò) require 命令引入 koa 框架和 openai 庫(kù)。

4.接下來(lái),可以使用 koa 框架的中間件和路由功能,編寫代碼來(lái)實(shí)現(xiàn)服務(wù)器端的邏輯。

5.在服務(wù)器端代碼中,設(shè)置 OPEN AI 的 API 密鑰,并使用 openai 庫(kù)提供的方法調(diào)用 API,生成圖片。

6.最后,啟動(dòng) Node.js 程序,即可通過(guò)瀏覽器或其他客戶端訪問(wèn)服務(wù)器,實(shí)現(xiàn)自動(dòng)生成圖片的功能。


ChatGPT 告訴我們需要這六個(gè)步驟,但是沒(méi)有告訴我們具體的代碼怎么寫,我們嘗試?yán)^續(xù)追問(wèn):

問(wèn)題5:列出第3步的詳細(xì)代碼

ChatGPT 的回答:


第三步,使用 koa 框架的中間件和路由功能,編寫服務(wù)器端的邏輯。下面是一個(gè)簡(jiǎn)單的示例代碼,它可以處理來(lái)自客戶端的 POST 請(qǐng)求,并使用 openai 庫(kù)生成圖片:

const Koa = require("koa");
const openai = require("openai");

const app = new Koa();

// 設(shè)置 OPEN AI 的 API 密鑰
openai.apiKey = "your-api-key";

// 定義中間件,用于處理請(qǐng)求和響應(yīng)
app.use(async (ctx, next) => {
if (ctx.method === "POST") {
// 獲取請(qǐng)求中的參數(shù)
const { model, prompt } = ctx.request.body;

// 使用 openai 庫(kù)調(diào)用 API,生成圖片
const response = await openai.completions.create({
model,
prompt,
max_tokens: 2048,
temperature: 0.5,
});

// 將生成的圖片返回給客戶端
ctx.body = response.data.complete;
}
});

// 啟動(dòng)服務(wù)器
app.listen(3000);

看過(guò)代碼后我發(fā)現(xiàn)他調(diào)用了 openai.completions.create 方法,里面?zhèn)魅肓怂膫€(gè)參數(shù),這些參數(shù)都是啥意思呢?再問(wèn)問(wèn)他吧:

問(wèn)題6:completions.create 接收的四個(gè)參數(shù)的含義是什么

ChatGPT 的回答:


completions.create 是 openai 庫(kù)提供的方法,它用于調(diào)用 OPEN AI 的 API,生成圖片。該方法接收四個(gè)參數(shù),分別是:

例如,下面是一個(gè)調(diào)用 completions.create 方法的例子,它使用了預(yù)訓(xùn)練的 GPT-3 模型,生成了長(zhǎng)度為 100 個(gè)字符,隨機(jī)性為 0.5,詞頻懲罰為 0.0 的圖片:

openai.completions.create({
model: "text-davinci-002",
prompt: "The quick brown fox jumps over the lazy dog.",
max_tokens: 100,
temperature: 0.5,
frequency_penalty: 0.0,
})

回答中有名次解釋也有代碼示例,還是比較清晰的,第一個(gè)參數(shù)?model?代表模型,那么究竟有哪些模型,適合在什么場(chǎng)景使用呢?我們繼續(xù)追問(wèn):

問(wèn)題7:介紹下 openai.completions.create 中常見(jiàn) model 的特點(diǎn)和應(yīng)用場(chǎng)景

ChatGPT 的回答:


OPEN AI 提供了多種預(yù)訓(xùn)練的模型,用于滿足不同的應(yīng)用場(chǎng)景。例如,下面是一些常見(jiàn)的模型及其特點(diǎn)和應(yīng)用場(chǎng)景:

這些模型僅是 OPEN AI 提供的部分模型,實(shí)際應(yīng)用中還有更多模型可供選擇。


好了,API 的基本概念都了解清楚了,下面我們來(lái)繼續(xù)實(shí)現(xiàn),上面的代碼還是比較簡(jiǎn)陋的,把核心邏輯直接掛載在 koa 上了,沒(méi)有加任何路由,我們來(lái)優(yōu)化一下:

問(wèn)題8:優(yōu)化第三步的代碼,為服務(wù)端邏輯增加一個(gè)路由

ChatGPT 的回答:

const Koa = require("koa");
const openai = require("openai");
const Router = require("koa-router");

const app = new Koa();
const router = new Router();

// 設(shè)置 OPEN AI 的 API 密鑰
openai.apiKey = "your-api-key";

// 定義路由,處理 POST 請(qǐng)求
router.post("/", async (ctx, next) => {
// 獲取請(qǐng)求中的參數(shù)
const { model, prompt } = ctx.request.body;

// 使用 openai 庫(kù)調(diào)用 API,生成圖片
const response = await openai.completions.create({
model,
prompt,
max_tokens: 2048,
temperature: 0.5,
});

// 將生成的圖片返回給客戶端
ctx.body = response.data.complete;
});

// 啟用路由
app.use(router.routes());

// 啟動(dòng)服務(wù)器
app.listen(3000);

上述代碼中,我們首先引入了 koa-router 插件,并創(chuàng)建了一個(gè) Router 實(shí)例。然后,定義了一個(gè)路由,處理來(lái)自客戶端的 POST 請(qǐng)求。最后,啟用了路由,并啟動(dòng)服務(wù)器。

使用路由的優(yōu)點(diǎn)是可以對(duì)不同的請(qǐng)求方法和路徑分別處理,使得代碼更加清晰和維護(hù)方便。實(shí)際應(yīng)用中,可以根據(jù)需求和 API 文檔,添加更多路由處理不同的請(qǐng)求。


幫我們引入了  koa-router 插件,代碼看起來(lái)像點(diǎn)樣子了,接下來(lái)我們開始實(shí)現(xiàn)前端頁(yè)面,繼續(xù)提問(wèn):

問(wèn)題9: 創(chuàng)建一個(gè)HTML頁(yè)面,用戶輸入 model、prompt 參數(shù),然后調(diào)用上面的接口在頁(yè)面展示生成后的圖片

ChatGPT 的回答:


您可以創(chuàng)建一個(gè)前端頁(yè)面,用于給用戶輸入 model、prompt 參數(shù),然后通過(guò) AJAX 請(qǐng)求調(diào)用上面的接口生成圖片,并在頁(yè)面上展示生成的圖片。具體方法如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Generate Image</title>
</head>
<body>
<h1>Generate Image</h1>
<form id="form">
<label for="model">Model:</label>
<input type="text" id="model" name="model" value="text-davinci-002" />
<br />
<label for="prompt">Prompt:</label>
<input type="text" id="prompt" name="prompt" value="The quick brown fox jumps over the lazy dog." />
<br />
<button type="submit">Generate</button>
</form>
<div id="image"></div>
<script>
// 監(jiān)聽表單提交事件
document.querySelector("#form").addEventListener("submit", async (event) => {
// 阻止表單提交的默認(rèn)行為
event.preventDefault();

// 獲取表單中的參數(shù)
const model = document.querySelector("#model").value;
const prompt = document.querySelector("#prompt").value;

// 發(fā)送 AJAX 請(qǐng)求,生成圖片
const response = await fetch("http://localhost:3000", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ model, prompt }),
});
const data = await response.json();

// 在頁(yè)面上展示生成的圖片
const image = document.querySelector("#image");
image.innerHTML = <img src="data:image/jpeg;base64,${data}" />; }); </script> </body> </html>

好了,代碼生成出來(lái)了,我們要把他掛到服務(wù)器上,繼續(xù)提問(wèn):

問(wèn)題10: 將這個(gè) HTML 頁(yè)面綁定到 koa 的路由上

ChatGPT 的回答:


要將 HTML 頁(yè)面綁定到 koa 的路由上,需要在 koa 中使用 koa-static 插件,具體方法如下:

const Koa = require("koa");
const openai = require("openai");
const Router = require("koa-router");
const serve = require("koa-static");

const app = new Koa();
const router = new Router();

// 設(shè)置 OPEN AI 的 API 密鑰
openai.apiKey = "your-api-key";

// 定義路由,處理 POST 請(qǐng)求
router.post("/", async (ctx, next) => {
// 獲取請(qǐng)求中的參數(shù)
const { model, prompt } = ctx.request.body;

// 使用 openai 庫(kù)調(diào)用 API,生成圖片
const response = await openai.completions.create({
model,
prompt,
max_tokens: 2048,
temperature: 0.5,
});

// 將生成的圖片返回給客戶端
ctx.body = response.data.complete;
});

// 使用 koa-static 插件,綁定靜態(tài)文件目錄
app.use(serve("./public"));

// 啟用路由
app.use(router.routes());

// 啟動(dòng)服務(wù)器
app.listen(3000);

使用 koa-static 插件綁定靜態(tài)文件目錄時(shí),指定的目錄就是靜態(tài)文件目錄,所有需要訪問(wèn)的靜態(tài)文件,如 HTML、JavaScript 和 CSS 文件,都需要放到這個(gè)目錄下。

在上述代碼中,我們將靜態(tài)文件目錄設(shè)置為 public,因此需要把 HTML 文件放到 public 目錄下,才能被正確訪問(wèn)。

例如,如果你的 HTML 文件名為 index.html,則需要把它放到 public 目錄下,訪問(wèn)時(shí)的 URL 為 http://localhost:3000/index.html。這樣,當(dāng)瀏覽器訪問(wèn)該 URL 時(shí),就會(huì)返回 index.html 文件內(nèi)容。


代碼中幫我們引入了 koa-static 插件,并且指向了 public 文件夾,我們把 HTML 文件丟進(jìn)去。

下面我們嘗試啟動(dòng)項(xiàng)目:

然后點(diǎn)擊 Generate 后發(fā)現(xiàn)服務(wù)報(bào)錯(cuò)了:

這個(gè)報(bào)錯(cuò)是為啥,我們繼續(xù)問(wèn)問(wèn) ChatGPT

問(wèn)題11: 代碼報(bào)錯(cuò)了:Cannot destructure property ‘model’ of ‘ctx.request.body’ as it is undefined

ChatGPT 的回答:


在 koa 中,要獲取請(qǐng)求中的參數(shù),可以在中間件函數(shù)中使用 ctx.request.body 對(duì)象,但需要注意,默認(rèn)情況下,koa 不會(huì)對(duì)請(qǐng)求的數(shù)據(jù)進(jìn)行解析,因此 ctx.request.body 中是沒(méi)有參數(shù)的。

如果你想要獲取請(qǐng)求中的參數(shù),則需要在 koa 中使用 koa-bodyparser 插件,該插件能夠自動(dòng)對(duì)請(qǐng)求的數(shù)據(jù)進(jìn)行解析,并將解析后的結(jié)果放入 ctx.request.body 對(duì)象中。

const Koa = require("koa");
const openai = require("openai");
const Router = require("koa-router");
const serve = require("koa-static");
const bodyParser = require("koa-bodyparser");

const app = new Koa();
const router = new Router();

// 設(shè)置 OPEN AI 的 API 密鑰
openai.apiKey = "your-api-key";

// 使用 koa-bodyparser 插件,對(duì)請(qǐng)求數(shù)據(jù)進(jìn)行解析
app.use(bodyParser());

// 定義路由,處理 POST 請(qǐng)求
router.post("/", async (ctx, next) => {
// 獲取請(qǐng)求中的參數(shù)
const { model, prompt } = ctx.request.body;

// 使用 openai 庫(kù)調(diào)用 API,生成圖片
const response = await openai.completions.create({
model,
prompt,
max_tokens: 2048,
temperature: 0.5,
});

// 將生成的圖片返回給客戶端
ctx.body = response.data.complete;
});

// 使用 koa-static 插件,綁定靜態(tài)文件目錄
app.use(serve("./public"));

// 啟用路由
app.use(router.routes());

// 啟動(dòng)服務(wù)器
app.listen(3000);

上述代碼中,我們?cè)?nbsp;koa 應(yīng)用中使用了 koa-bodyparser 插件,對(duì)請(qǐng)求的數(shù)據(jù)進(jìn)行了解析。在路由處理函數(shù)中,通過(guò) ctx.request.body 獲取請(qǐng)求中的參數(shù),并調(diào)用 openai API 生成圖片。

在實(shí)際應(yīng)用中,可以根據(jù)需要,調(diào)整 koa-bodyparser 插件的配置,以滿足個(gè)性化的需求。


然后我們繼續(xù)運(yùn)行代碼,發(fā)現(xiàn)代碼又報(bào)錯(cuò)了:

這個(gè)報(bào)錯(cuò)繼續(xù)讓 ChatGPT 自己解決吧,于是我按照官方示例進(jìn)行引導(dǎo):

問(wèn)題12:使用 openai.createImage 改寫以上代碼

ChatGPT 的回答:

const Koa = require("koa");
const Router = require("koa-router");
const bodyParser = require("koa-bodyparser");
const serve = require("koa-static");
const { Configuration, OpenAIApi } = require("openai");

const app = new Koa();
const router = new Router();

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

app.use(bodyParser());

app.use(serve("public"));

router.post("/api/generate-image", async (ctx, next) => {
const { model, prompt } = ctx.request.body;

const response = await openai.createImage({
model: "image-alpha-001",
prompt,
});

const data = await response.json();

ctx.body = {
url: data.url,
};
});

app.use(router.routes()).use(router.allowedMethods());

app.listen(3000, () => {
console.log("Server is listening on port 3000");
});

這時(shí)候服務(wù)端代碼的基本邏輯已經(jīng)差不多了,我們?cè)僮?nbsp;ChatGPT 把我們的前端代碼美化一下:

問(wèn)題13:頁(yè)面太丑了,用 CSS 美化一下,加點(diǎn)動(dòng)畫效果

ChatGPT 的回答:

<style>
/* 居中布局 */
body {
display: flex;
align-items: center;
justify-content: center;
min-height: 100vh;
font-family: sans-serif;
}

/* 表單樣式 */
form {
display: flex;
flex-direction: column;
align-items: center;
width: 50%;
min-width: 300px;
padding: 1em;
border-radius: 10px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
background-color: white;
}

form > div {
margin-bottom: 0.5em;
display: flex;
align-items: center;
}

label {
font-weight: bold;
margin-right: 0.5em;
}

input[type="text"] {
width: 100%;
padding: 0.5em;
border: 1px solid #ccc;
border-radius: 5px;
}

button {
margin-top: 1em;
padding: 0.5em 1em;
border: none;
border-radius: 5px;
background-color: #0070f3;
color: white;
font-size: 1em;
font-weight: bold;
cursor: pointer;
transition: all 0.3s;
}

button:hover {
box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
}

/* 圖片展示區(qū)域樣式 */
#image-container {
margin-top: 1em;
display: none;
width: 100%;
max-width: 500px;
height: auto;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
animation: fadeIn 0.5s;
}

#image {
width: 100%;
height: auto;
}

@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
</style>

好家伙,分分鐘就寫完了,下面我們來(lái)看看效果:

我們只問(wèn)了 ChatGPT  13 個(gè)問(wèn)題,他就幫我們寫出了一個(gè)簡(jiǎn)單的圖片生成程序,我在用的過(guò)程中就一直在感嘆實(shí)在是再?gòu)?qiáng)大了,后續(xù)其實(shí)還可以問(wèn)更多的問(wèn)題來(lái)不斷完善這個(gè)程序,比如:生成圖片的過(guò)程中生成 loading 效果、為網(wǎng)站添加一些背景動(dòng)畫效果 … 你可以在極短的時(shí)間里構(gòu)建出一個(gè)出色的網(wǎng)站。

當(dāng)然,它現(xiàn)階段還有一些不太完善的地方,比如他并不能直接給你一段非常完美的代碼,而是需要你持續(xù)引導(dǎo)。另外寫出的代碼也有一些 Bug,但是他也可以靠你的引導(dǎo)來(lái)找到這些 Bug,這個(gè)表現(xiàn)其實(shí)真的很像是一個(gè)真的程序員,而不是一個(gè)冷血的機(jī)器。

或許你會(huì)覺(jué)得,以上代碼不就是啟動(dòng)了一個(gè) Node.js 服務(wù)、調(diào)用了一些 API ,然后在前端把結(jié)果展示出來(lái)么,但是這可能是因?yàn)槟銓?duì)開發(fā)已經(jīng)有一定經(jīng)驗(yàn)了,覺(jué)得這些代碼沒(méi)什么難度。但是如果是作為一個(gè)剛步入職場(chǎng)的新同學(xué),或者開發(fā)經(jīng)驗(yàn)為零的人,讓他去自己寫出這些代碼并且成功運(yùn)行可能要花上一天的時(shí)間。但是現(xiàn)在有了 ChatGPT 的輔助或許只需要花上一個(gè)小時(shí),這是一個(gè)質(zhì)的飛躍,未來(lái)可能徹底改變軟件開發(fā)這個(gè)行業(yè)。

根據(jù)我們的實(shí)驗(yàn)結(jié)果來(lái)看,他或許現(xiàn)在并不能完全替代一個(gè)完整的程序員,但卻能讓一個(gè)人程序員 1.5 個(gè)人的活,也可以幫助低級(jí)工程師快速成長(zhǎng),讓排查 Bug、重構(gòu)代碼變得更簡(jiǎn)單。這不可避免的會(huì)影響到未來(lái)市場(chǎng)上對(duì)程序員數(shù)量的需求…

本項(xiàng)目的源碼在下面,感興趣的可以玩一玩,另外你也可以按照我的問(wèn)題去引導(dǎo) ChatGPT 幫你實(shí)現(xiàn)這個(gè)程序。

https://github.com/ConardLi/openai-nodejs-demo

最后

我讓他幫我列了一下本文的大綱,另外項(xiàng)目的 readme.md 文件也是 ChatGPT 自動(dòng)生成的 ~

本文章轉(zhuǎn)載微信公眾號(hào)@code秘密花園

上一篇:

一文徹底搞懂機(jī)器學(xué)習(xí) - 端到端機(jī)器學(xué)習(xí)

下一篇:

圖神經(jīng)網(wǎng)絡(luò)(GNN)的數(shù)學(xué)原理
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)