Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Redis

Tăng hiệu suất và cắt giảm chi phí:Lưu trữ phản hồi API OpenAI với Upstash Redis

Nếu đã sử dụng API OpenAI, bạn có thể nhận thấy rằng nó khá chậm và đôi khi thậm chí không phản hồi. Đặc biệt model GPT-4 có xu hướng phản hồi độ trễ cao. Ngoài ra, bạn phải trả tiền cho mỗi câu trả lời bạn nhận được. Đó là tất cả lý do để tránh gửi phản hồi trực tiếp.

Bạn có thể lưu trữ phản hồi của mình trong Upstash Redis để giải quyết những vấn đề này. Nếu bạn đang gửi cùng một phản hồi cho nhiều khách hàng, điều này có thể giúp bạn tiết kiệm khá nhiều tiền và với việc triển khai trên toàn cầu, bạn có thể chắc chắn rằng người dùng nhận được thông tin nhanh nhất có thể.

Bài viết này sẽ hướng dẫn bạn lưu các phản hồi API OpenAI vào bộ đệm vào cơ sở dữ liệu Upstash Redis.

Tính năng

Chúng tôi sẽ xây dựng một ứng dụng web hiển thị cho khách truy cập danh sách các câu chuyện cười trong lịch sử.

  1. Truy vấn API OpenAI hàng ngày để biết câu chuyện cười lịch sử liên quan đến ngày hiện tại
  2. Lưu câu chuyện cười vào bộ nhớ đệm để gửi trong tương lai
  3. Hiển thị tất cả các câu chuyện cười

Công nghệ

Chúng tôi sẽ sử dụng các công nghệ sau để xây dựng ứng dụng:

  • Node.js làm máy chủ HTTP
  • API OpenAI để tạo ra những câu chuyện cười lịch sử
  • Upstash QStash để kích hoạt yêu cầu trò đùa mới từ máy chủ HTTP tới API OpenAI
  • Upstash Redis để lưu trữ trò đùa để sử dụng sau

Điều kiện tiên quyết

  • Tài khoản OpenAI có quyền truy cập API để có quyền truy cập vào AI
  • Tài khoản Upstash để gửi yêu cầu tới API OpenAI và lưu vào bộ nhớ đệm các phản hồi AI trong Upstash Redis
  • Bản cài đặt Node.js để gọi API OpenAI và Upstash

Triển khai

Hãy bắt đầu bằng cách tạo máy chủ HTTP để tìm nạp các câu chuyện cười, lưu trữ chúng trong Upstash Redis và hiển thị chúng cho khách truy cập.

Thiết lập dự án

Đầu tiên, chúng ta tạo một dự án Node.js mới và cài đặt các phần phụ thuộc.

 $ mkdir history-jokes & cd history-jokes
 $ npm init -y
 $ npm i dotenv express axios @upstash/redis @upstash/qstash

Triển khai máy chủ

Để triển khai máy chủ, hãy tạo index.js tập tin và sao chép đoạn mã sau vào đó:

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);

Hãy cùng điểm qua các phần quan trọng của mã này.

Chúng tôi sử dụng redisClient để lưu phản hồi của chúng tôi vào Upstash Redis và tải chúng để hiển thị.

qstashReceiver chịu trách nhiệm xác minh các cuộc gọi hàng ngày từ Upstash QStash; bằng cách này, chúng tôi đảm bảo rằng chỉ QStash gọi /generate của chúng tôi điểm cuối.

Chúng tôi sử dụng Axios để tạo ứng dụng khách cho API OpenAI nên chúng tôi không cần phải chuyển baseUrlAuthentication tiêu đề bất cứ khi nào chúng tôi gọi API.

Tiếp theo, chúng tôi tạo một phần mềm trung gian Express sử dụng qstashReceiver để xác minh tất cả các yêu cầu tới /generate điểm cuối. Vì chúng tôi chỉ sử dụng QStash để kích hoạt điểm cuối và không chuyển bất kỳ giá trị nào nên chúng tôi có thể sử dụng một chuỗi trống làm body .

Lưu ý:Phần mềm trung gian cho phép tất cả các yêu cầu nếu bạn bỏ bình luận dòng có "// return next() ". Bạn có thể sử dụng điều này để kiểm tra /generate điểm cuối trên localhost .

/generate điểm cuối lắng nghe POST yêu cầu, tạo và lưu trữ những câu chuyện cười thực tế. Nó tính toán month hiện tại và day và sử dụng nó để tạo hai lời nhắc cho AI. Một người yêu cầu AI cư xử như một diễn viên hài và người thứ hai yêu cầu kể một câu chuyện cười lịch sử về ngày và tháng hiện tại.

Chúng tôi gọi API OpenAI bằng lời nhắc và lưu kết quả vào LIST trong Upstash Redis.

/ điểm cuối lắng nghe GET yêu cầu và hiển thị những câu chuyện cười đã lưu. Nó tải LIST từ Upstash Redis, định dạng nó dưới dạng thành phần danh sách HTML và gửi nó đến máy khách.

Triển khai

Bây giờ máy chủ đã được thiết lập, chúng ta phải tạo tài nguyên đám mây và điền thông tin xác thực API để truy cập chúng.

Tạo tệp thông tin xác thực

Để lưu trữ thông tin xác thực, hãy tạo .env tập tin có nội dung sau:

OPENAI_TOKEN=""
UPSTASH_REDIS_REST_URL=""
UPSTASH_REDIS_REST_TOKEN=""
UPSTASH_QSTASH_CURRENT_SIGNING_KEY=""
UPSTASH_QSTASH_NEXT_SIGNING_KEY=""

Trong các bước tiếp theo, chúng ta sẽ điền vào từng chuỗi trống này.

Tạo mã thông báo API OpenAI

Hãy bắt đầu với API OpenAI vì chúng tôi chỉ cần khóa cho API hiện có; chúng tôi không phải triển khai bất cứ điều gì.

Đi tới bảng điều khiển web OpenAI và nhấp vào nút “tạo khóa bí mật mới”. Đặt tên cho khóa, nhấp vào “Tạo khóa bí mật”, sao chép khóa mới và dán vào tệp .env làm giá trị của OPENAI_TOKEN .

Triển khai yêu cầu định kỳ bằng QStash

Để báo cho QStash rằng nó nên gửi yêu cầu tới /generate điểm cuối mỗi ngày một lần, bạn sử dụng “Trình tạo yêu cầu”. Bạn tìm thấy nó trong bảng điều khiển Upstash. Hình 1 hiển thị chi tiết cấu hình.

Tăng hiệu suất và cắt giảm chi phí:Lưu trữ phản hồi API OpenAI với Upstash Redis

Hình 1:Trình tạo yêu cầu QStash

Thay thế <HOSTNAME> với miền lưu trữ máy chủ của bạn. Bạn cần có tên máy chủ có thể truy cập công khai để QStash hoạt động.

Bạn tìm thấy các phím hát mà QStash sử dụng trong bảng điều khiển Upstash trong phần “Trình tạo yêu cầu”. Nhấp vào trình đơn thả xuống “Phím hát” màu xám, sao chép từng phím và dán chúng vào đúng vị trí của .env tập tin.

Triển khai cơ sở dữ liệu Upstash Redis

Để tạo cơ sở dữ liệu Upstash Redis, hãy chuyển tới bảng điều khiển Upstash và nhấp vào nút “Tạo cơ sở dữ liệu”.

Thao tác này sẽ nhắc bạn bằng hộp thoại để điền cấu hình cơ sở dữ liệu. Hình 2 hiển thị các giá trị bạn nên sử dụng.

Tăng hiệu suất và cắt giảm chi phí:Lưu trữ phản hồi API OpenAI với Upstash Redis

Hình 2:Cấu hình Upstash Redis

Sau khi quá trình tạo hoàn tất, bạn có thể cuộn xuống phần “REST API”, phần này có hai nút “UPSTASH_REDIS_REST_URL” và “UPSTASH_REDIS_REST_TOKEN”. Nhấp vào từng nút này để sao chép thông tin xác thực tương ứng và dán chúng vào đúng vị trí trong .env tập tin.

Kiểm tra trang web

Để kiểm tra trang web trên máy cục bộ của bạn, hãy tắt phần mềm trung gian xác thực QStash bằng cách bỏ nhận xét “// return next() ” dòng trong index.js tập tin.

Chạy máy chủ bằng lệnh sau:

 $ node .

Nếu bạn mở / lộ trình trong trình duyệt, bạn sẽ chỉ thấy “Truyện cười lịch sử mỗi ngày” vì không có câu chuyện cười nào được tạo.

Bạn phải gửi POST yêu cầu tới /generate điểm cuối để tạo ra một trò đùa. Bạn có thể làm như vậy bằng lệnh này:

 $ curl -X POST http://localhost/generate

Nếu bạn làm mới trang trình duyệt, bạn sẽ thấy một trò đùa như trong Hình 3.

Tăng hiệu suất và cắt giảm chi phí:Lưu trữ phản hồi API OpenAI với Upstash Redis

Hình 3:Trang web trò đùa

Trò đùa này hiện được lưu vào bộ nhớ đệm trong Upstash Redis, vì vậy sẽ không có yêu cầu API OpenAI nào xảy ra khi ai đó truy cập trang web. Điều này mang lại cho bạn thời gian phản hồi dưới giây đồng thời giúp bạn tiết kiệm khá nhiều tiền.

Tóm tắt

API AI là những công cụ linh hoạt sẽ biến đổi Internet như chúng ta biết, nhưng hiện tại, chúng chậm và đắt tiền. Bộ nhớ đệm rất quan trọng khi sử dụng các API này và Upstash Redis là cách dễ nhất để thêm nó vào ngăn xếp của bạn chỉ bằng vài cú nhấp chuột.