কম্পিউটার টিউটোরিয়াল

Upstash Redis দিয়ে OpenAI API রেসপন্স ক্যাশ করুন: পারফরম্যান্স বাড়ান ও খরচ কমান

আপনি যদি OpenAI API ব্যবহার করেন, তবে আপনি লক্ষ্য করেছেন হতে পারেন যে এটি bastante ধীর এবং কখনও কখনও রেসপন্স দেয় না। বিশেষ করে GPT-4 মডেলটি উচ্চ লেটেন্সি রেসপন্সের জন্য প্রোন। এছাড়া, আপনি প্রতিটি উত্তর পাওয়ার জন্য টাকা দেন। এগুলো সব কারণ সরাসরি রেসপন্স সার্ভ করার থেকে বাঁচতে।

আপনি আপনার রেসপন্সগুলো Upstash Redis-এ সংরক্ষণ করে এই সমস্যাগুলো থেকে মুক্তি পেতে পারেন। যদি আপনি একই রেসপন্স অনেক ক্লায়েন্টকে সার্ভ করেন, তবে এটি আপনাকে 상당한 টাকা বাঁচাতে পারে, এবং গ্লোবাল ডিপ্লয়মেন্টের সাথে, আপনি নিশ্চিত হতে পারেন ব্যবহারকারীরা যত দ্রুত সম্ভব তথ্য পাচ্ছে।

এই আর্টিকেল আপনাকে গাইড করবে OpenAI API রেসপন্স Upstash Redis ডাটাবেসে ক্যাশ করার প্রক্রিয়ায়।

ফিচার

আমরা একটি ওয়েব অ্যাপ তৈরি করব যা ভিজিটরদের ইতিহাসের জোকসের একটি তালিকা দেখাবে।

  1. প্রতি দিন OpenAI API কোয়ারী করে বর্তমান তারিখের সাথে সম্পর্কিত একটি ইতিহাসের জোক পান
  2. ভবিষ্যতে ডেলিভারির জন্য জোকটি ক্যাশ করুন
  3. সব জোক প্রদর্শন করুন

প্রযুক্তি

অ্যাপটি তৈরির জন্য আমরা নিচের প্রযুক্তিগুলো ব্যবহার করব:

  • Node.js HTTP সার্ভার হিসেবে
  • OpenAI API ইতিহাসের জোক জেনারেট করার জন্য
  • Upstash QStash HTTP সার্ভার থেকে OpenAI API-এ একটি নতুন জোক রিকোয়েস্ট ট্রিগার করার জন্য
  • Upstash Redis AI রেসপন্স পরবর্তী ব্যবহারের জন্য সংরক্ষণ করার জন্য

পূর্বশর্ত

  • OpenAI API অ্যাক্সেস সহ একটি OpenAI অ্যাকাউন্ট
  • Upstash অ্যাকাউন্ট OpenAI API-এ রিকোয়েস্ট পাঠাতে এবং Upstash Redis-এ AI রেসপন্স ক্যাশ করার জন্য
  • Node.js ইনস্টলেশন OpenAI এবং Upstash API কল করার জন্য

ইমপ্লিমেন্টেশন

আসুন HTTP সার্ভার তৈরি করা শুরু করি যা জোক ফেচ করবে, সেগুলো Upstash Redis-এ সংরক্ষণ করবে, এবং ভিজিটরদের প্রদর্শন করবে।

প্রজেক্ট সেট আপ করা

প্রথমে, আমরা একটি নতুন 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 হেডার পাস করতে হয় না।

এরপর, আমরা একটি Express মিডলওয়্যার তৈরি করি যা qstashReceiver ব্যবহার করে /generate এন্ডপয়েন্টে সকল রিকোয়েস্ট যাচাই করে। যেহেতু আমরা QStash শুধু এন্ডপয়েন্ট ট্রিগার করার জন্য ব্যবহার করি এবং কোনো ভ্যালু পাস করি না, আমরা body হিসেবে একটি খালি স্ট্রিং ব্যবহার করতে পারি।

নোট: মিডলওয়্যারটি সকল রিকোয়েস্ট অনুমতি দেবে যদি আপনি "// return next()" লাইনটি আনকমেন্ট করেন। আপনি এটি ব্যবহার করতে পারেন /generate এন্ডপয়েন্ট localhost-এ টেস্ট করতে।

/generate এন্ডপয়েন্ট POST রিকোয়েস্ট শোনে এবং আসল জোকগুলো তৈরি ও সংরক্ষণ করে। এটি বর্তমান month এবং day ক্যালকুলেট করে এবং এটিকে ব্যবহার করে AI-র জন্য দুটি প্রম্পট তৈরি করে। একটি AI-কে বলে একজন কমেডিয়ানের মত আচরণ করতে, এবং অন্যটি বর্তমান মাস ও দিন সম্পর্কে একটি ইতিহাসের জোক বলতে বলে।

আমরা প্রম্পটগুলো দিয়ে OpenAI API কল করি এবং ফলাফলটি Upstash Redis-এ একটি LIST-এ সংরক্ষণ করি।

/ এন্ডপয়েন্ট GET রিকোয়েস্ট শোনে এবং সংরক্ষিত জোকগুলো প্রদর্শন করে। এটি Upstash Redis থেকে LIST লোড করে, এটিকে 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 টোকেন তৈরি করা

OpenAI API-র সাথে শুরু করি কারণ এখানে শুধু একটি কী দরকার বিদ্যমান API-র জন্য; আমাদের কিছু ডিপ্লয় করতে হবে না।

OpenAI ওয়েব কনসোলে যান এবং "create new secret key" বাটনে ক্লিক করুন। কীটি একটি নাম দিন, "Create secret key"-এ ক্লিক করুন, নতুন কীটি কপি করুন, এবং .env ফাইলে OPENAI_TOKEN-এর ভ্যালু হিসেবে পেস্ট করুন।

QStash-এ রিকারিং রিকোয়েস্ট ডিপ্লয় করা

QStash-কে বলতে হবে যে এটি একদিনে একবার /generate এন্ডপয়েন্টে একটি রিকোয়েস্ট পাঠাবে, তার জন্য আপনি "Request Builder" ব্যবহার করবেন। আপনি এটিকে Upstash কনসোলে পাবেন। Figure 1 কনফিগারেশন ডিটেইল দেখাচ্ছে।

Upstash Redis দিয়ে OpenAI API রেসপন্স ক্যাশ করুন: পারফরম্যান্স বাড়ান ও খরচ কমান

Figure 1: QStash Request Builder

<HOSTNAME>-কে আপনার সার্ভার হোস্ট করার ডোমেন দিয়ে রিপ্লেস করুন। QStash কাজ করার জন্য আপনার একটি পাবলিকলি অ্যাক্সেসযোগ্য হোস্টনেম দরকার।

QStash যে সাইনিং কীগুলো ব্যবহার করে সেগুলো Upstash কনসোলে "Request Builder" সেকশনে পাওয়া যাবে। স্লেটি "Signing Keys" ড্রপ-ডাউনে ক্লিক করুন, প্রতিটি কী কপি করুন এবং .env ফাইলের সঠিক জায়গায় পেস্ট করুন।

Upstash Redis ডাটাবেস ডিপ্লয় করা

Upstash Redis ডাটাবেস তৈরি করতে, Upstash কনসোলে যান এবং "Create Database" বাটনে ক্লিক করুন।

এটি আপনাকে ডেটাবেস কনফিগারেশন পূরণ করার জন্য একটি ডায়লগ দেখাবে। Figure 2 দেখাচ্ছে আপনাকে কী মান ব্যবহার করা উচিত।

Upstash Redis দিয়ে OpenAI API রেসপন্স ক্যাশ করুন: পারফরম্যান্স বাড়ান ও খরচ কমান

Figure 2: Upstash Redis কনফিগারেশন

সৃষ্টি hoàn료 হলে, আপনি নিচে স্ক্রোল করে "REST API" সেকশনে যেতে পারেন, যাতে দুটি বাটন আছে, "UPSTASH_REDIS_REST_URL" এবং "UPSTASH_REDIS_REST_TOKEN"। এই বাটনগুলোতে ক্লিক করে সংশ্লিষ্ট শংসাপত্র কপি করুন এবং .env ফাইলে সঠিক জায়গায় পেস্ট করুন।

ওয়েবসাইট টেস্ট করা

আপনার লোকাল মেশিনে ওয়েবসাইট টেস্ট করতে, QStash যাচাইকরণ মিডলওয়্যার নিষ্ক্রিয় করুন index.js ফাইলে "// return next()" লাইনটি আনকমেন্ট করে।

নিচের কমান্ড দিয়ে সার্ভার চালান:

$ node .

আপনি ব্রাউজারে / রুট খোললে, আপনি শুধু "History Jokes for Every Day" দেখবেন কারণ কোনো জোক জেনারেট হয়নি।

আপনাকে /generate এন্ডপয়েন্টে একটি POST রিকোয়েস্ট পাঠাতে হবে একটি জোক জেনারেট করতে। আপনি এই কমান্ড দিয়ে করতে পারেন:

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

আপনি ব্রাউজার পেজ রিফ্রেশ করলে, আপনি Figure 3-এ দেখানো মত একটি জোক দেখতে পাবেন।

Upstash Redis দিয়ে OpenAI API রেসপন্স ক্যাশ করুন: পারফরম্যান্স বাড়ান ও খরচ কমান

Figure 3: জোক ওয়েবসাইট

এই জোকটি এখন Upstash Redis-এ ক্যাশ হয়েছে, তাই কেউ ওয়েবসাইট ভিজিট করলে OpenAI API রিকোয়েস্ট হবে না। এটি আপনাকে সাব-সেকেন্ড রেসপন্স টাইম দেবে এবং আপনাকে যথেষ্ট টাকা বাঁচাবে।

সারসংক্ষেপ

AI API হলো ভרסেটাইল টুল যা ইন্টারনেটকে যেন আমরা জানি সেটাকে রূপান্তর করবে, কিন্তু এখনো, সেগুলো ধীর এবং ব্যয়বহুল। এই API গুলো ব্যবহার করার সময় ক্যাশিং অত্যন্ত জরুরি, এবং Upstash Redis একদম সহজে এটিকে আপনার স্ট্যাকে শুধু কয়েক ক্লিকের মাধ্যমে যোগ করার পথ।

  1. C-তে বর্ণমালার ত্রিভুজাকার প্যাটার্ন প্রিন্ট করার প্রোগ্রাম

  2. Swift-এ UIImageView রিসাইজ করা

  3. জাভাস্ক্রিপ্ট Void 0 এরর সংক্রান্ত সমস্যা সমাধানের পদ্ধতি

  4. কি HTML শিখা সহজ? একটি বিগিনার গাইড