
使用這些基本 REST API 最佳實踐構建出色的 API
不得不說,這圖片有點讓人背后一涼的感覺…
接下來我們就從頭開始吧,以下所有的代碼均為在我的問題和引導下 ChatGPT
自動生成。
ChatGPT
的回答:
使用 Node.js
和 OPEN API
可以通過以下步驟實現自動生成圖片:
首先,安裝 Node.js
和必要的依賴包,如 openapi
庫。可以使用以下命令完成安裝:
npm install openapi
然后,創建一個 JavaScript
文件,并通過 require
命令引入 openapi
庫。
接下來,可以使用?OPEN API
?的圖像生成功能,編寫代碼來生成圖片。
最后,運行 JavaScript
文件,即可自動生成圖片。
如果需要了解詳細的步驟,可以查看 OPEN API
文檔或者示例代碼,以獲取更多信息。
好,下面我們知道了他為 Node.js
開發者提供了一個 openai
的 npm
包,接下來我們的項目里調用這個 npm
包就好了。
ChatGPT
的回答:
1.在 OPEN AI
網站上注冊帳戶,并獲取 API
密鑰。
在項目中安裝必要的依賴包,如?openai
?庫。可以使用以下命令完成安裝:
npm install openai
2.創建一個 JavaScript
文件,并通過 require
命令引入 openai
庫。
3.設置 OPEN AI
密鑰,可以通過以下方式完成:
const openai = require("openai");
openai.setApiKey("YOUR_API_KEY");
4.使用 OPEN AI
提供的方法調用 API
,并傳入必要的參數。例如,如果要使用 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
的響應,例如將生成的文本保存到本地文件。
好,這里面有一個關鍵點是初始化 OPEN AI
時需要一個密鑰,下面我們來問問它怎么獲取這個密鑰。‘
ChatGPT
的回答:
如果要在 OPEN AI
網站上注冊帳戶并獲取 API
密鑰,可以按照以下步驟操作:
OPEN AI
網站,在首頁上方點擊“Sign In”按鈕。好,我們下一步到 OPEN AI
注冊一個賬號,你可能會發現下面的提示:
這是因為 OPEN AI
暫時不在中國提供服務,所以國內的小伙伴想要使用還是有一定門檻的,你可能需要下面幾個條件:
OPEN AI
可能會根據你本地緩存的信息判斷你的國家)outlook
,無需海外手機號驗證,隨便申請)sms-activate
,租個印度手機號只需要1塊錢)好,注冊完成后我們就擁有了一個 OPEN AI
的密鑰:
下面開始實現項目了,我們選擇 koa
框架,向 ChatGPT
詢問項目細節。
ChatGPT
的回答:
1.使用 koa
框架和 OPEN AI
實現自動生成圖片的項目,可以按照以下步驟進行:
2.首先,安裝?Node.js
?和必要的依賴包,包括 koa 框架、openai 庫和其他必要的包。可以使用以下命令完成安裝:
npm install koa openai
3.然后,創建一個 JavaScript
文件,并通過 require
命令引入 koa 框架和 openai
庫。
4.接下來,可以使用 koa 框架的中間件和路由功能,編寫代碼來實現服務器端的邏輯。
5.在服務器端代碼中,設置 OPEN AI
的 API 密鑰,并使用 openai
庫提供的方法調用 API
,生成圖片。
6.最后,啟動 Node.js
程序,即可通過瀏覽器或其他客戶端訪問服務器,實現自動生成圖片的功能。
ChatGPT
告訴我們需要這六個步驟,但是沒有告訴我們具體的代碼怎么寫,我們嘗試繼續追問:
ChatGPT
的回答:
第三步,使用 koa
框架的中間件和路由功能,編寫服務器端的邏輯。下面是一個簡單的示例代碼,它可以處理來自客戶端的 POST
請求,并使用 openai
庫生成圖片:
const Koa = require("koa");
const openai = require("openai");
const app = new Koa();
// 設置 OPEN AI 的 API 密鑰
openai.apiKey = "your-api-key";
// 定義中間件,用于處理請求和響應
app.use(async (ctx, next) => {
if (ctx.method === "POST") {
// 獲取請求中的參數
const { model, prompt } = ctx.request.body;
// 使用 openai 庫調用 API,生成圖片
const response = await openai.completions.create({
model,
prompt,
max_tokens: 2048,
temperature: 0.5,
});
// 將生成的圖片返回給客戶端
ctx.body = response.data.complete;
}
});
// 啟動服務器
app.listen(3000);
看過代碼后我發現他調用了 openai.completions.create
方法,里面傳入了四個參數,這些參數都是啥意思呢?再問問他吧:
ChatGPT
的回答:
completions.create
是 openai
庫提供的方法,它用于調用 OPEN AI 的 API,生成圖片。該方法接收四個參數,分別是:
model
:指定要使用的模型。OPEN AI 有多種模型可供選擇,每種模型都具有不同的特點和功能。使用時需要根據需求和 API 文檔選擇適當的模型。prompt
:指定要生成的圖片的文本內容。此參數指定的文本內容會作為模型的輸入,模型會根據文本內容生成圖片。max_tokens
:指定生成圖片的最大長度。此參數指定生成圖片的最大長度,單位為字符。如果超過指定長度,模型會按照指定長度截斷。temperature
:指定生成圖片的隨機性。此參數指定生成圖片的隨機性,取值范圍為 0 到 1。如果設為 0,則模型會按照原文內容生成圖片,不會有隨機性;例如,下面是一個調用 completions.create
方法的例子,它使用了預訓練的 GPT-3
模型,生成了長度為 100
個字符,隨機性為 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,
})
回答中有名次解釋也有代碼示例,還是比較清晰的,第一個參數?model
?代表模型,那么究竟有哪些模型,適合在什么場景使用呢?我們繼續追問:
ChatGPT
的回答:
OPEN AI 提供了多種預訓練的模型,用于滿足不同的應用場景。例如,下面是一些常見的模型及其特點和應用場景:
text-davinci-002
:這是一種大型模型,可以完成各種自然語言處理任務。它具有非常強大的語言理解能力,可以用于文本生成、問答、機器翻譯等應用。image-alpha-001
:這是一種圖像生成模型,可以根據文本內容生成對應的圖像。它具有非常高的生成質量,可以用于圖像生成、圖像修復、圖像分類等應用。dialogue-babi-001
:這是一種對話生成模型,可以根據上下文生成相應的對話。它具有較高的語言流暢性和邏輯性,可以用于對話生成、聊天機器人、問答系統等應用。這些模型僅是 OPEN AI 提供的部分模型,實際應用中還有更多模型可供選擇。
好了,API
的基本概念都了解清楚了,下面我們來繼續實現,上面的代碼還是比較簡陋的,把核心邏輯直接掛載在 koa
上了,沒有加任何路由,我們來優化一下:
ChatGPT
的回答:
const Koa = require("koa");
const openai = require("openai");
const Router = require("koa-router");
const app = new Koa();
const router = new Router();
// 設置 OPEN AI 的 API 密鑰
openai.apiKey = "your-api-key";
// 定義路由,處理 POST 請求
router.post("/", async (ctx, next) => {
// 獲取請求中的參數
const { model, prompt } = ctx.request.body;
// 使用 openai 庫調用 API,生成圖片
const response = await openai.completions.create({
model,
prompt,
max_tokens: 2048,
temperature: 0.5,
});
// 將生成的圖片返回給客戶端
ctx.body = response.data.complete;
});
// 啟用路由
app.use(router.routes());
// 啟動服務器
app.listen(3000);
上述代碼中,我們首先引入了 koa-router
插件,并創建了一個 Router
實例。然后,定義了一個路由,處理來自客戶端的 POST
請求。最后,啟用了路由,并啟動服務器。
使用路由的優點是可以對不同的請求方法和路徑分別處理,使得代碼更加清晰和維護方便。實際應用中,可以根據需求和 API
文檔,添加更多路由處理不同的請求。
幫我們引入了 koa-router
插件,代碼看起來像點樣子了,接下來我們開始實現前端頁面,繼續提問:
ChatGPT
的回答:
您可以創建一個前端頁面,用于給用戶輸入 model、prompt
參數,然后通過 AJAX
請求調用上面的接口生成圖片,并在頁面上展示生成的圖片。具體方法如下:
<!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>
// 監聽表單提交事件
document.querySelector("#form").addEventListener("submit", async (event) => {
// 阻止表單提交的默認行為
event.preventDefault();
// 獲取表單中的參數
const model = document.querySelector("#model").value;
const prompt = document.querySelector("#prompt").value;
// 發送 AJAX 請求,生成圖片
const response = await fetch("http://localhost:3000", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ model, prompt }),
});
const data = await response.json();
// 在頁面上展示生成的圖片
const image = document.querySelector("#image");
image.innerHTML = <img src="data:image/jpeg;base64,${data}" />
;
});
</script>
</body>
</html>
好了,代碼生成出來了,我們要把他掛到服務器上,繼續提問:
ChatGPT
的回答:
要將 HTML
頁面綁定到 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();
// 設置 OPEN AI 的 API 密鑰
openai.apiKey = "your-api-key";
// 定義路由,處理 POST 請求
router.post("/", async (ctx, next) => {
// 獲取請求中的參數
const { model, prompt } = ctx.request.body;
// 使用 openai 庫調用 API,生成圖片
const response = await openai.completions.create({
model,
prompt,
max_tokens: 2048,
temperature: 0.5,
});
// 將生成的圖片返回給客戶端
ctx.body = response.data.complete;
});
// 使用 koa-static 插件,綁定靜態文件目錄
app.use(serve("./public"));
// 啟用路由
app.use(router.routes());
// 啟動服務器
app.listen(3000);
使用 koa-static
插件綁定靜態文件目錄時,指定的目錄就是靜態文件目錄,所有需要訪問的靜態文件,如 HTML、JavaScript
和 CSS
文件,都需要放到這個目錄下。
在上述代碼中,我們將靜態文件目錄設置為 public
,因此需要把 HTML
文件放到 public
目錄下,才能被正確訪問。
例如,如果你的 HTML 文件名為 index.html
,則需要把它放到 public
目錄下,訪問時的 URL
為 http://localhost:3000/index.html
。這樣,當瀏覽器訪問該 URL
時,就會返回 index.html
文件內容。
代碼中幫我們引入了 koa-static
插件,并且指向了 public
文件夾,我們把 HTML
文件丟進去。
然后點擊 Generate
后發現服務報錯了:
這個報錯是為啥,我們繼續問問 ChatGPT
ChatGPT
的回答:
在 koa
中,要獲取請求中的參數,可以在中間件函數中使用 ctx.request.body
對象,但需要注意,默認情況下,koa
不會對請求的數據進行解析,因此 ctx.request.body
中是沒有參數的。
如果你想要獲取請求中的參數,則需要在 koa
中使用 koa-bodyparser
插件,該插件能夠自動對請求的數據進行解析,并將解析后的結果放入 ctx.request.body
對象中。
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();
// 設置 OPEN AI 的 API 密鑰
openai.apiKey = "your-api-key";
// 使用 koa-bodyparser 插件,對請求數據進行解析
app.use(bodyParser());
// 定義路由,處理 POST 請求
router.post("/", async (ctx, next) => {
// 獲取請求中的參數
const { model, prompt } = ctx.request.body;
// 使用 openai 庫調用 API,生成圖片
const response = await openai.completions.create({
model,
prompt,
max_tokens: 2048,
temperature: 0.5,
});
// 將生成的圖片返回給客戶端
ctx.body = response.data.complete;
});
// 使用 koa-static 插件,綁定靜態文件目錄
app.use(serve("./public"));
// 啟用路由
app.use(router.routes());
// 啟動服務器
app.listen(3000);
上述代碼中,我們在 koa
應用中使用了 koa-bodyparser
插件,對請求的數據進行了解析。在路由處理函數中,通過 ctx.request.body
獲取請求中的參數,并調用 openai API
生成圖片。
在實際應用中,可以根據需要,調整 koa-bodyparser
插件的配置,以滿足個性化的需求。
然后我們繼續運行代碼,發現代碼又報錯了:
這個報錯繼續讓 ChatGPT
自己解決吧,于是我按照官方示例進行引導:
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");
});
這時候服務端代碼的基本邏輯已經差不多了,我們再讓 ChatGPT
把我們的前端代碼美化一下:
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);
}
/* 圖片展示區域樣式 */
#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>
好家伙,分分鐘就寫完了,下面我們來看看效果:
我們只問了 ChatGPT
13
個問題,他就幫我們寫出了一個簡單的圖片生成程序,我在用的過程中就一直在感嘆實在是再強大了,后續其實還可以問更多的問題來不斷完善這個程序,比如:生成圖片的過程中生成 loading
效果、為網站添加一些背景動畫效果 … 你可以在極短的時間里構建出一個出色的網站。
當然,它現階段還有一些不太完善的地方,比如他并不能直接給你一段非常完美的代碼,而是需要你持續引導。另外寫出的代碼也有一些 Bug
,但是他也可以靠你的引導來找到這些 Bug
,這個表現其實真的很像是一個真的程序員,而不是一個冷血的機器。
或許你會覺得,以上代碼不就是啟動了一個 Node.js
服務、調用了一些 API
,然后在前端把結果展示出來么,但是這可能是因為你對開發已經有一定經驗了,覺得這些代碼沒什么難度。但是如果是作為一個剛步入職場的新同學,或者開發經驗為零的人,讓他去自己寫出這些代碼并且成功運行可能要花上一天的時間。但是現在有了 ChatGPT
的輔助或許只需要花上一個小時,這是一個質的飛躍,未來可能徹底改變軟件開發這個行業。
根據我們的實驗結果來看,他或許現在并不能完全替代一個完整的程序員,但卻能讓一個人程序員 1.5
個人的活,也可以幫助低級工程師快速成長,讓排查 Bug
、重構代碼變得更簡單。這不可避免的會影響到未來市場上對程序員數量的需求…
本項目的源碼在下面,感興趣的可以玩一玩,另外你也可以按照我的問題去引導 ChatGPT
幫你實現這個程序。
https://github.com/ConardLi/openai-nodejs-demo
我讓他幫我列了一下本文的大綱,另外項目的 readme.md
文件也是 ChatGPT
自動生成的 ~
本文章轉載微信公眾號@code秘密花園