OpenAI API를 사용했다면 꽤 느리고 때로는 응답하지 않는 경우도 있다는 것을 눈치챘을 것입니다. 특히 GPT-4 모델은 응답 지연 시간이 긴 경향이 있습니다. 또한, 귀하는 귀하가 얻은 모든 답변에 대해 비용을 지불합니다. 이것이 바로 응답을 직접 제공하는 것을 피하는 이유입니다.
이러한 문제를 해결하기 위해 Upstash Redis에 응답을 저장할 수 있습니다. 많은 클라이언트에게 동일한 응답을 제공하는 경우 상당한 비용을 절약할 수 있으며 글로벌 배포를 통해 사용자가 최대한 빨리 정보를 얻을 수 있습니다.
이 문서에서는 OpenAI API 응답을 Upstash Redis 데이터베이스에 캐싱하는 방법을 안내합니다.
기능
방문자에게 역사 농담 목록을 보여주는 웹 앱을 구축할 것입니다.
- 매일 OpenAI API를 쿼리하여 현재 날짜와 관련된 역사 농담을 받으세요
- 향후 전달을 위해 농담을 캐시
- 모든 농담 표시
기술
우리는 앱을 구축하기 위해 다음 기술을 사용할 것입니다:
- HTTP 서버로서의 Node.js
- 역사 농담을 생성하는 OpenAI API
- HTTP 서버에서 OpenAI API로 새로운 농담 요청을 트리거하는 Upstash QStash
- 나중에 사용하기 위해 농담을 저장하는 Upstash Redis
전제조건
- AI에 액세스할 수 있는 API 액세스 권한이 있는 OpenAI 계정
- OpenAI API에 요청을 보내고 Upstash Redis에 AI 응답을 캐시하는 Upstash 계정
- OpenAI 및 Upstash API를 호출하기 위한 Node.js 설치
구현
농담을 가져와서 Upstash Redis에 저장하고 방문자에게 표시하는 HTTP 서버를 만드는 것부터 시작하겠습니다.
프로젝트 설정
먼저 새로운 Node.js 프로젝트를 생성하고 종속성을 설치합니다.
$ mkdir history-jokes & cd history-jokes
$ npm init -y
$ npm i dotenv express axios @upstash/redis @upstash/qstash 서버 구현
서버를 구현하려면 index.js을 생성하세요. 파일을 만들고 다음 코드를 복사하세요.
require("dotenv").config();
const axios = require("axios");
const express = require("express");
const { Redis } = require("@upstash/redis");
const { Receiver } = require("@upstash/qstash");
const redisClient = new Redis({
url: process.env.UPSTASH_REDIS_URL,
token: process.env.UPSTASH_REDIS_TOKEN,
});
const qstashReceiver = new Receiver({
currentSigningKey: process.env.UPSTASH_QSTASH_CURRENT_SIGNING_KEY,
nextSigningKey: process.env.UPSTASH_QSTASH_CURRENT_NEXT_KEY,
});
const openaiApiClient = axios.create({
baseURL: "https://api.openai.com/v1",
headers: {
Authorization: "Bearer " + process.env.OPENAI_TOKEN,
"Content-Type": "application/json",
},
});
const server = express();
server.use("/generate", async (request, response, next) => {
// return next()
let validRequest = false;
try {
validRequest = await qstashReceiver.verify({
signature: request.headers["upstash-signature"],
body: "",
});
} catch (e) {}
if (!validRequest) return response.status(403).end("Forbidden");
return next();
});
server.post("/generate", async (_request, response) => {
const today = new Date();
const month = today.toLocaleString("default", { month: "long" });
let day = today.toLocaleString("default", { day: "numeric" });
day = day == 1 ? "1st" : day == 2 ? "2nd" : day == "3" ? "3rd" : day + "th";
const { data } = await openaiApiClient.post("/chat/completions", {
model: "gpt-3.5-turbo",
messages: [
{
role: "system",
content: "You are a comedian that tells short history jokes.",
},
{
role: "user",
content: `Please tell me a joke for ${month} the ${day}.`,
},
],
});
const joke = JSON.stringify({
date: month + " the " + day,
text: data.choices[0].message.content,
});
await redisClient.lpush("jokes", joke);
response.end();
});
server.get("/", async (_request, response) => {
let html = "<h1>History Jokes for Every Day</h1>";
const jokes = await redisClient.lrange("jokes", 0, -1);
html +=
"<ul>" +
jokes
.map(({ date, text }) => `<li><b>${date}</b><br><pre>${text}</pre></li>`)
.join("") +
"</ul>";
response.setHeader("Content-Type", "text/html");
response.end(html);
});
server.listen(3000); 이 코드의 중요한 부분을 살펴보겠습니다.
우리는 redisClient을 사용합니다 응답을 Upstash Redis에 저장하고 표시용으로 로드합니다.
qstashReceiver Upstash QStash의 일일 호출을 확인하는 일을 담당합니다. 이런 식으로 우리는 QStash만이 /generate을 호출하도록 보장합니다. 끝점.
우리는 Axios를 사용하여 OpenAI API용 클라이언트를 생성하므로 baseUrl를 전달할 필요가 없습니다. 및 Authentication API를 호출할 때마다 헤더가 표시됩니다.
다음으로 qstashReceiver을 사용하는 Express 미들웨어를 만듭니다. /generate에 대한 모든 요청을 확인하려면 끝점. QStash를 엔드포인트 트리거에만 사용하고 값을 전달하지 않으므로 body로 빈 문자열을 사용할 수 있습니다. .
참고:미들웨어는 "// return next() 줄의 주석 처리를 제거하면 모든 요청을 허용합니다. ". 이를 사용하여 /generate를 테스트할 수 있습니다. localhost의 엔드포인트 .
/generate 엔드포인트는 POST를 수신합니다. 실제 농담을 요청하고 생성하고 저장합니다. 현재 month를 계산합니다. 및 day 이를 사용하여 AI에 대한 두 개의 프롬프트를 만듭니다. 하나는 AI에게 코미디언처럼 행동하라고 지시하고, 두 번째는 이번 달과 날짜에 대한 역사 농담을 하라고 요청합니다.
프롬프트로 OpenAI API를 호출하고 결과를 LIST에 저장합니다. Upstash Redis에서.
/ 엔드포인트는 GET을 수신합니다. 저장된 농담을 요청하고 표시합니다. LIST을 로드합니다. Upstash Redis에서 HTML 목록 요소로 형식을 지정하고 클라이언트에 보냅니다.
배포
이제 서버가 설정되었으므로 클라우드 리소스를 생성하고 이에 액세스하려면 API 자격 증명을 입력해야 합니다.
자격증명 파일 생성
자격 증명을 저장하려면 .env를 생성하세요. 다음 내용을 포함하는 파일:
OPENAI_TOKEN=""
UPSTASH_REDIS_REST_URL=""
UPSTASH_REDIS_REST_TOKEN=""
UPSTASH_QSTASH_CURRENT_SIGNING_KEY=""
UPSTASH_QSTASH_NEXT_SIGNING_KEY="" 다음 단계에서는 이러한 빈 문자열을 각각 채울 것입니다.
OpenAI API 토큰 생성
기존 API에 대한 키만 필요하므로 OpenAI API부터 시작하겠습니다. 아무것도 배포할 필요가 없습니다.
OpenAI 웹 콘솔로 이동하여 “새 비밀 키 생성” 버튼을 클릭하세요. 키에 이름을 지정하고 "비밀 키 만들기"를 클릭한 후 새 키를 복사하고 OPENAI_TOKEN 값으로 .env 파일에 붙여넣습니다. .
QStash를 사용하여 반복 요청 배포
QStash에게 /generate에 요청을 보내야 한다고 알리려면 하루에 한 번 엔드포인트를 사용하려면 "요청 빌더"를 사용하세요. Upstash 콘솔에서 찾을 수 있습니다. 그림 1은 구성 세부정보를 보여줍니다.

그림 1:QStash 요청 빌더
<HOSTNAME>를 교체하세요 귀하의 서버를 호스팅하는 도메인으로. QStash가 작동하려면 공개적으로 액세스 가능한 호스트 이름이 필요합니다.
"요청 작성기" 섹션의 Upstash 콘솔에서 QStash가 사용하는 노래 키를 찾을 수 있습니다. 회색의 "Singing Keys" 드롭다운을 클릭하고 각 키를 복사하여 .env의 올바른 위치에 붙여넣습니다. 파일입니다.
Upstash Redis 데이터베이스 배포
Upstash Redis 데이터베이스를 생성하려면 Upstash 콘솔로 이동하여 "데이터베이스 생성" 버튼을 클릭하세요.
데이터베이스 구성을 입력하라는 대화 상자가 표시됩니다. 그림 2는 사용해야 하는 값을 보여줍니다.

그림 2:Upstash Redis 구성
생성이 완료되면 "UPSTASH_REDIS_REST_URL" 및 "UPSTASH_REDIS_REST_TOKEN"이라는 두 개의 버튼이 있는 "REST API" 섹션까지 아래로 스크롤할 수 있습니다. 각 버튼을 클릭하여 해당 자격 증명을 복사하고 .env의 올바른 위치에 붙여넣습니다. 파일입니다.
웹사이트 테스트
로컬 컴퓨터에서 웹 사이트를 테스트하려면 “// return next() 주석을 제거하여 QStash 유효성 검사 미들웨어를 비활성화하십시오. index.js의 ” 줄 파일입니다.
다음 명령을 사용하여 서버를 실행하십시오:
$ node . 브라우저에서 / 경로를 열면 농담이 생성되지 않았기 때문에 "매일의 역사 농담"만 표시됩니다.
POST을 보내야 합니다. /generate에 요청하세요 농담을 생성하는 엔드포인트입니다. 다음 명령을 사용하면 됩니다:
$ curl -X POST http://localhost/generate 브라우저 페이지를 새로 고치면 그림 3과 같은 농담이 표시됩니다.

그림 3:농담 웹사이트
이 농담은 이제 Upstash Redis에 캐시되므로 누군가가 웹 사이트를 방문할 때 OpenAI API 요청이 발생하지 않습니다. 이를 통해 1초 미만의 응답 시간을 제공하는 동시에 상당한 비용을 절약할 수 있습니다.
요약
AI API는 우리가 알고 있는 인터넷을 변화시킬 수 있는 다용도 도구이지만 현재로서는 속도가 느리고 비용이 많이 듭니다. 이러한 API를 사용할 때 캐싱은 매우 중요하며 Upstash Redis는 단 몇 번의 클릭만으로 이를 스택에 추가할 수 있는 가장 쉬운 방법입니다.