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

LangChain, Redis এবং QStash দিয়ে অন-ডিমান্ড LLM ক্যাশিং으로 পারফরম্যান্স বাড়ান

কিছু অ্যাপ্লিকেশনে, ব্যবহারকারী অনুরোধ করার সময় একটি LLM-কে কোয়ারী করা সম্ভব নাও হতে পারে। একটি প্রম্পট API-এ পাঠিয়ে এবং এর প্রতিক্রিয়ার জন্য অপেক্ষা করা খুব সময়সাপেক্ষ হতে পারে। LangChain-এর মতো জটিল কাজের জন্য—যেমন PDF বা অডিও ফাইল থেকে ডেটা প্রসেস করে LLM-এ ফিড করা—বিলম্ব ব্যবহারকারীর অভিজ্ঞতাকে আরও বেশি প্রভাবিত করে।

স্ট্রিমিং হয় অনেক ক্ষেত্রে একটি উপযুক্ত সমাধান, তবে ব্যবহারকারী আপনার অ্যাপ্লিকেশন দেখার আগে যেকোনো সময় সব কিছু করে ফেলা আরও সুবিধাজনক হতে পারে। এইভাবে, ব্যবহারকারীকে ক্যাশ করা প্রতিক্রিয়াær খুব দ্রুত পরিবেশন করা যায়, LLM-এর দ্বারা এটি তৈরি হওয়ার জন্য অপেক্ষা করতে হয় না। এটি বিশেষভাবে তাদের অ্যাপ্লিকেশনের জন্য উপযোগী যারা প্রতিটি ব্যবহারকারীর জন্য একই ইনপুট ব্যবহার করে, যেমন বুক বা নিউজ সামারাইজার। কিন্তু ব্যবহারকারীর ইনপুট ছাড়াই, LangChain-কে কীভাবে একটি প্রতিক্রিয়া ক্যাশ করব?

আমাদের একটি মাইক্রোসার্ভিস দরকার যা আমরা অন-ডিমান্ড কল করতে পারি, LangChain-এ একটি প্রম্পট পাঠাতে এবং Upstash Redis ব্যবহার করে প্রতিক্রিয়াটি ক্যাশ করতে সক্ষম। আমরা Upstash-এর রেট লিমিটিং SDK-রও ব্যবহার করব যাতে আমরা অনিচ্ছাকৃতভাবে আমাদের রেট লিমিট অতিক্রম না করি। QStash আমাদের মাইক্রোসার্ভিস কল করার সবচেয়ে বহুমুখী উপায়—আমরা এটি সেট আপ করতে পারি যাতে এটি যখনই চাই প্রতিক্রিয়া ক্যাশ করে, এমনকি যদি আমাদের অ্যাপ্লিকেশনের জন্য একটি ক্রন জব প্রয়োজন হয়। এটি একটি ড্যাশবোর্ডও প্রদান করে যা আমরা আমাদের মাইক্রোসার্ভিসের ব্যবহার নিরীক্ষণ করতে ব্যবহার করতে পারি। যদি আমাদের এন্ডপয়েন্ট ওভারলোডেড হয় বা অন্য কিছু ভুল হয়, QStash HTTP অনুরোধটি রিট্রাই করবে এবং নিশ্চিত করবে যে আমাদের বার্তাটি ডেলিভার হয়েছে।

আমাদের মাইক্রোসার্ভিসটি Hono.js ব্যবহার করে তৈরি করা হবে, একটি হালকা এবং দ্রুত ওয়েব ফ্রেমওয়ার্ক এজ-র জন্য। এই ডেমোতে, আমরা একটি Cloudflare Worker ব্যবহার করে আমাদের মাইক্রোসার্ভিস হোস্ট করব। Upstash-এর ধন্যবাদ, তবে, এটি প্রায়শই যেকোনো জায়গায় ডিপ্লয় করা যায়, অন্যান্য এজ/সার্ভারলেস রানটাইম সহ।

এই ডেমোর পুরো সোর্স কোড আপনি এখানে পাবেন।

পূর্বশর্ত

  • একটি Upstash Redis ডাটাবেস
  • QStash এনভায়রনমেন্ট ভেরিয়েবল
  • একটি OpenAI API কী

শুরু করা যাক

প্রজেক্ট তৈরি করা

অনেক create-<package> npm প্যাকেজের মত নয়, create-hono আপনাকে একটি খালি ডিরেক্টরিতে থাকতে বাধ্য করে। প্রথমে আপনার প্রজেক্টের জন্য একটি নতুন খালি ডিরেক্টরি তৈরি করুন এবং সেখানে যান:

mkdir langchain-qstash
cd langchain-qstash

v1.0.0 রিলিজের সাথে, এই প্রজেক্ট স্ক্যাফফোল্ড করার জন্য Bun ব্যবহার করা হবে। যাইহোক, npm, pnpm, এবং yarn-ও create-hono-র সাথে ব্যবহার করা সম্ভব। টেমপ্লেটের জন্য প্রম্পট করার সময় cloudflare-workers সিলেক্ট করতে ভুলবেন না। আপনি bun-কে একটি পৃথক অপশন হিসেবে দেখতে পারেন, কিন্তু এটি ডেমোতে ব্যবহৃত টেমপ্লেট নয়।

bun create hono@latest

ডিপেন্ডেন্সি ইনস্টল করা

এখন, আপনি আপনার পছন্দের প্যাকেজ ম্যানেজারের সাথে নিচের কমান্ডটি চালিয়ে বাকি ডিপেন্ডেন্সি ইনস্টল করতে পারেন:

bun install @upstash/qstash @upstash/ratelimit @upstash/redis langchain openai

প্রজেক্ট কনফিগার করা

লেখার সময়, create-hono তার .gitignore-এ ডিফল্টভাবে লকফাইল অন্তর্ভুক্ত করে। কঠোরভাবে আবশ্যক না হলেও, আপনি আপনার .gitignore-কে নিচের মত করে আপডেট করতে পারেন লকফাইল বাদ দিতে:

node_modules
dist
.wrangler
.dev.vars
wrangler.toml

এখন, আমরা পূর্বশর্ত থেকে এনভায়রনমেন্ট ভেরিয়েবল সেট করতে পারি। এগুলো আপনার wrangler.toml-এ অ্যাপেন্ড করা যাবে, যা ইতিমধ্যে সোর্স কন্ট্রোল থেকে বাদ দেওয়া আছে।

[vars]
QSTASH_CURRENT_SIGNING_KEY="sig_********"
QSTASH_NEXT_SIGNING_KEY="sig_********"
UPSTASH_REDIS_REST_URL="https://********.upstash.io"
UPSTASH_REDIS_REST_TOKEN="********"
OPENAI_API_KEY="sk-********"

অবশেষে, আপনার src/index.ts মডিফাই করুন পূর্বের এনভায়রনমেন্ট ভেরিয়েবলগুলোর টাইপিং যোগ করতে:

type Bindings = {
  QSTASH_CURRENT_SIGNING_KEY: string;
  QSTASH_NEXT_SIGNING_KEY: string;
  UPSTASH_REDIS_REST_URL: string;
  UPSTASH_REDIS_REST_TOKEN: string;
  OPENAI_API_KEY: string;
};
const app = new Hono<{ Bindings: Bindings }>();

দুই সাইনিং কী থাকার সুবিধা হলো আপনি একবার সেগুলো রোল করতে পারেন আপনার এনভায়রনমেন্ট ভেরিয়েবল আপডেট না করেই, কারণ QStash করেন্ট কী ব্যর্থ হলে অটোমেটিকভাবে নেক্সট সাইনিং কী ব্যবহার করার চেষ্টা করবে।

ডেভেলপমেন্ট

এই পর্যায়ে, wrangler আপনার এনভায়রনমেন্ট ভেরিয়েবল পড়তে এবং আপনার প্রজেক্ট ডিপ্লয় করতে সক্ষম হওয়া উচিত। এটি করতে, আপনি আপনার পছন্দের প্যাকেজ ম্যানেজারের সাথে নিচের কমান্ডটি চালাতে পারেন:

bun run dev

wrangler আপনার Hono.js সার্ভার স্পিন আপ করবে এবং আপনাকে লোকাল টেস্ট করার জন্য পোর্ট ৮৭৮৭-এ একটি লোকাল URL দেবে। আপনি যদি সরাসরি একটি এজ প্রিভিউ সেশন শুরু করতে চান লোকাল টেস্টিং বদলে, আপনার dev package.json স্ক্রিপ্টকে নিচের মত করে মডিফাই করুন:

"dev": "wrangler dev src/index.ts --remote",

আপনার Cloudflare Worker-এর কনফিগারেশন এবং লগ দেখতে, আপনাকে প্রথমে আপনার Worker ডিপ্লয় করতে হবে:

bun run deploy

এটি আপনাকে Cloudflare-এ সাইন ইন করার ধাপগুলো নিয়ে যাবে, প্রমাণীকরণের পর আপনার প্রজেক্টটি প্রথমবার অটোমেটিক্যালি ডিপ্লয় করবে।

মিডলওয়্যার তৈরি করা

ডিবাগিং উদ্দেশ্যে, QStash থেকে পাওয়া অনুরোধগুলো লগ করা দরকারী হবে। সেগুলো আমাদের Cloudflare Worker-এর ড্যাশবোর্ডের "Logs" ট্যাবে দৃষ্টিগোচর হবে Begin log stream চাপলে। Hono.js একটি লগার মিডলওয়্যার প্রদান করে যা আমরা আমাদের রাউটারে যোগ করতে পারি:

import { Hono } from "hono";
import { logger } from "hono/logger";
// snip
const app = new Hono<{ Bindings: Bindings }>();
app.use("*", logger());
// snip

QStash কে Cloudflare Workers-এ সংযোগ করা

Hono.js ব্যবহার করে একটি API এন্ডপয়েন্ট বিকাশ শুরু করার আগে, আমাদের QStash দ্বারা পাঠানো মেসেজগুলো ইন্টারসেপ্ট করার একটি উপায় দরকার এবং অনুরোধটি ফেলে দিতে হবে যদি সেটার একটি অবৈধ সিগনেচার থাকে। خوشকিস্মতভাবে, Hono.js আমাদের নিজস্ব কাস্টম মিডলওয়্যার ইমপ্লিমেন্ট করার একটি উপায় প্রদান করে, যা হ্যান্ডলারদের আগে সবসময় চলে। এটি পর্যাপ্ত রবাস্ট যাতে আমরা আমাদের মিডলওয়্যারকে আলাদা ফাইলগুলিতে আপনার ইচ্ছামতো সংগঠিত করতে পারি।

আমাদের মিডলওয়্যারে, আমরা QStash-এর রিসিভার ব্যবহার করতে পারি। আসুন src/middleware/verify.ts নামে একটি নতুন ফাইল তৈরি করি, এবং MiddlewareHandler টাইপ করা একটি ফাংশন এক্সপোর্ট করি:

import { Receiver } from "@upstash/qstash";
import { type MiddlewareHandler } from "hono";
declare global {
  interface Response {
    locals: {
      query: string;
    };
  }
}
export const verify: MiddlewareHandler = async (ctx, next) => {
  const receiver = new Receiver({
    currentSigningKey: ctx.env.QSTASH_CURRENT_SIGNING_KEY,
    nextSigningKey: ctx.env.QSTASH_NEXT_SIGNING_KEY,
  });
};

Hono.js প্রতিটি মিডলওয়্যার এবং হ্যান্ডলারের জন্য একটি ctx (কনটেক্সট) অবজেক্ট পাস করে। এটি সরাসরি Cloudflare Workers-এর ExecutionContext-এর মতো নয়—কিন্তু এতে একই তথ্য থাকে। Hono-এর ctx অবজেক্ট প্রায় সমান রিকোয়েস্ট অবজেক্ট, এনভায়রনমেন্ট, এবং এক্সিকিউশন কনটেক্সট যা একটি ডিফল্ট Cloudflare Workers fetch হ্যান্ডলারে পাস করা হয়, সব একসাথে জোড়া দিয়ে।

আমরা গ্লোবাল Response ইন্টারফেসও মডিফাই করি একটি কাস্টম locals অন্তর্ভুক্ত করতে। Express-এর বিপরীতে, Hono ডিফল্টভাবে res.locals অবজেক্ট তৈরি করে না। আমরা এটি পরে হ্যান্ডলারের কাছে কোয়ারী পাস করতে ব্যবহার করব। এরপর, আমরা পূর্বে টাইপ করা এনভায়রনমেন্ট ভেরিয়েবলগুলো ctx.env-থেকে অ্যাক্সেস করি আমাদের রিসিভার কনস্ট্রাক্ট করতে।

এখন আমরা রিসিভার ব্যবহার করতে পারি অনুরোধের সিগনেচার যাচাই করতে:

// snip
const body = await ctx.req.text();
ctx.res.locals = { query: JSON.parse(body).query };
const isValid = await receiver
  .verify({
    signature: ctx.req.headers.get("Upstash-Signature")!,
    body,
  })
  .catch((err) => {
    console.error(err);
    return false;
  });
if (!isValid) {
  return new Response("Invalid signature", { status: 401 });
}
await next();

প্রথমে, আমরা কনটেক্সট থেকে রিকোয়েস্ট অবজেক্ট পাই। Hono.js সুবিধাজনকভাবে শুধু ওয়েব স্ট্যান্ডার্ড API-ই ব্যবহার করে, যেমন fetch, URL, Request, এবং Response। যদিও আমরা এটিকে এই ডেমোতে Cloudflare Workers-এ ব্যবহার করছি, এটি এটি অন্য অনেক পরিবেশে চালাতে সক্ষম করে, এজ/সার্ভারলেস পরিবেশ সহ।

রিকোয়েস্ট অবজেক্ট থেকে, আমরা অনুরোধের বডি টেক্সট হিসেবে পড়ি সেইসাথে Upstash-Signature হেডার, যেটিতে একটি কাস্টম JWT থাকে। আমরা রিসিভার ব্যবহার করতে পারি JWT-এ থাকা সিগনেচার যাচাই করতে সেটাকে সিগনেচার এবং অনুরোধের বডি পাস করে। .catch হ্যান্ডলারে, আমরা এরর লগ করি সেইসাথে false রিটার্ন করি ইন্ডিকেট করতে যে সিগনেচারটি অবৈধ।

যেহেতু আমরা অনুরোধের বডি কনসুম করছি, পরে আমাদের আসল হ্যান্ডলারে এটিতে অ্যাক্সেস থাকবে না। কারণ বডি একটি ReadableStream যা শুধু একবার কনসুম করা যায়। পরিবর্তে, কোয়ারীটি হ্যান্ডলারের কাছে পাস করতে, আমরা এটিকে রেসপন্সের locals অবজেক্টে যোগ করতে পারি। অবশেষে, যদি সিগনেচার অবৈধ হয়, আমরা একটি ৪০১ Unauthorized রেসপন্স রিটার্ন করি। অন্যথায়, আমরা next() কল করি পরবর্তী মিডলওয়্যার বা হ্যান্ডলারের কাছে যেতে।

রেট-লিমিটিং যোগ করা

যেহেতু আমরা এই এন্ডপয়েন্টকে আমাদের ব্যক্তিগত OpenAI API কী-র সাথে সংযুক্ত করব, এটি নিশ্চিত করা গুরুত্বপূর্ণ যে আমরা অনিচ্ছাকৃতভাবে আমাদের রেট লিমিট অতিক্রম করি না। خوشকিস্মতভাবে, Upstash একটি রেট লিমিটিং SDK প্রদান করে যা আমরা সহজেই আমাদের এন্ডপয়েন্টে রেট-লিমিটিং যোগ করতে পারি। যদি অনুরোধের সংখ্যা একটি প্রদত্ত থ্রেশহোল্ড অতিক্রম করে, আমরা একটি ৪২৯ Too Many Requests রেসপন্স রিটার্ন করব।

আসুন src/middleware/ratelimit.ts-এ একটি নতুন মিডলওয়্যার তৈরি করি:

import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis/cloudflare";
import { type MiddlewareHandler } from "hono";
export const ratelimit: MiddlewareHandler = async (ctx, next) => {
  const redis = new Redis({
    url: ctx.env.UPSTASH_REDIS_REST_URL,
    token: ctx.env.UPSTASH_REDIS_REST_TOKEN,
  });
  const ratelimit = new Ratelimit({
    redis,
    limiter: Ratelimit.slidingWindow(10, "10 s"),
    analytics: true,
  });
  await next();
};

এখানে, আমরা আমাদের Upstash Redis ডাটাবেসকে রেট লিমিটিং SDK-র সাথে সংযুক্ত করছি। আমাদের Redis ইনস্ট্যান্সটি ম্যানুয়ালি তৈরি করতে হবে ctx.env- থেকে এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে, কারণ Redis.fromEnv() Cloudflare Workers ব্যবহার করার সময় সেগুলো অটোমেটিক্যালি পড়তে ব্যর্থ হয়। যখন analytics true, SDK অটোমেটিক্যালি Redis কল করে প্রতিটি আইডেন্টিফায়ারের কলের একটি ক্যাশ রাখতে। এটি ডিফল্টভাবে @upstash/ratelimit প্রিফিক্স ব্যবহার করে।

SDK একটিéphéméral ক্যাশ সাপোর্ট করে যা একটি Map ব্যবহার করে Redis-এর বদলে, যা চরম লোডের অধীনে সময় ও সংস্থান বাঁচাতে পারে:

const cache = new Map(); // মিডলওয়্যার হ্যান্ডলারের বাইরে
// snip
const ratelimit = new Ratelimit({
  ephemeralCache: cache,
  // snip
});

আমরা SDK-র কাছে একটি limiterও প্রদান করি। এটি একটি ফাংশন যা SDK-কে বলে কীভাবে অনুরোধ রেট-লিমিট করতে হবে। আমরা slidingWindow লিমিটার ব্যবহার করছি, যা প্রতি ১০ সেকেন্ডে ১০টি অনুরোধ অনুমতি দেয়।

SDK আমাদের প্রতিটি অনুরোধের জন্য একটি আইডেন্টিফায়ার প্রদান করতে দেয়, এবং এটি স্বয়ংক্রিয়ভাবে একটি নির্দিষ্ট সময়ের মধ্যে করা অনুরোধের সংখ্যা ট্র্যাক করে। একটি বাস্তব-বিশ্বের অ্যাপ্লিকেশনে, আমরা ব্যবহারকারীর IP অ্যাড্রেসকে আইডেন্টিফায়ার হিসেবে ব্যবহার করতে পারি, কিন্তু এই ডেমোর জন্য, আমরা সব অনুরোধকে একটি একক রেটলিমিটের অধীনে সীমাবদ্ধ করতে একটি কনস্ট্যান্ট স্ট্রিং ব্যবহার করব:

// snip
const identifier = "openai";
const { success } = await ratelimit.limit(identifier);
if (!success) {
  return new Response("Too many requests", { status: 429 });
}
await next();
// snip

যদি অনুরোধটি রেট-লিমিটেড হয়, আমরা একটি ৪২৯ Too Many Requests রেসপন্স রিটার্ন করি। অন্যথায়, আমরা next() কল করি পরবর্তী মিডলওয়্যার বা হ্যান্ডলারের কাছে যেতে। যদি আমাদের SDK-র সাথে একাধিক Redis ডাটাবেস সংযুক্ত থাকত, তবে সেগুলোর মধ্যে সিঙ্ক্রোনাইজেশন করতে হতো। এর ফলে Vercel Edge এবং Cloudflare Workers-এ ড্যাঙ্গলিং প্রমিস হতো, যেগুলো আমরা এইভাবে হ্যান্ডেল করতে পারি:

const { pending, success } = await ratelimit.limit(identifier);
ctx.event.waitUntil(pending);

এটি করার উপায় আপনার ব্যবহার করছেন লাইব্রেরির উপর ভিত্তি করে ভিন্ন হতে পারে। যেহেতু Hono ওয়েব স্ট্যান্ডার্ড API ব্যবহার করে, আমরা event.waitUntil মেথড ব্যবহার করতে পারি প্রমিস রেজলভ হওয়ার জন্য অপেক্ষা করতে। যাইহোক, এই ডেমোর জন্য, আমরা শুধু একটি Redis ডাটাবেস ব্যবহার করব, তাই ড্যাঙ্গলিং প্রমিসের চিন্তা নেই।

QStash থেকে মেসেজ গ্রহণ করা

যখন আমরা QStash-এ একটি HTTP অনুরোধ পাঠাই, আমাদের নির্দিষ্ট ডেস্টিনেশন হবে আমাদের Cloudflare Workers এন্ডপয়েন্টের URL। আমরা Hono.js ব্যবহার করে এই এন্ডপয়েন্টের জন্য একটি হ্যান্ডলার তৈরি করতে পারি। আসুন src/index.ts-এ একটি নতুন হ্যান্ডলার যোগ করি, পূর্বের মিডলওয়্যারগুলো সক্রিয় করে:

// snip
import { ratelimit } from "./middleware/ratelimit";
import { verify } from "./middleware/verify";
// snip
app.post("/api/announce", ratelimit, verify, async (ctx) => {});

এই হ্যান্ডলারে, আমরা LangChain ব্যবহার করে প্রদত্ত প্রম্পটের একটি প্রতিক্রিয়া জেনারেট করতে পারি, Upstash Redis ব্যবহার করে ফলাফলটি ক্যাশ করে:

// snip
import { Redis } from "@upstash/redis/cloudflare";
import { UpstashRedisCache } from "langchain/cache/upstash_redis";
import { OpenAI } from "langchain/llms/openai";
// snip
app.post("/api/announce", ratelimit, verify, async (ctx) => {
  const redis = new Redis({
    url: ctx.env.UPSTASH_REDIS_REST_URL,
    token: ctx.env.UPSTASH_REDIS_REST_TOKEN,
  });
  const cache = new UpstashRedisCache({ client: redis });
  const model = new OpenAI({
    cache,
    openAIApiKey: ctx.env.OPENAI_API_KEY,
  });
  const query = ctx.res.locals.query;
  const result = await model
    .call(query)
    .then((result) => {
      console.log(result);
      return result;
    })
    .catch((err) => console.error(err));
  return new Response(result ?? "", { status: 200 });
});
// snip

এখানে, আমরা LangChain-এ ক্যাশিং সেট আপ করার জন্য প্রয়োজনীয় ক্লাসগুলো ইমপোর্ট করি। তারপর, আমরা OpenAI মডেল এবং Upstash Redis ক্যাশ ব্যবহার করে চেইনটি কনস্ট্রাক্ট করি, ক্যাশে একটি Upstash Redis ইনস্ট্যান্স পাস করে। আবার, আমাদের OpenAI API Key মডেলে ম্যানুয়ালি পাস করতে হবে কারণ এটি Cloudflare Workers-এ অটোমেটিক্যালি পড়া যায় না।

তারপর, আমরা res.locals-এ পূর্বে সংরক্ষিত কোয়ারীটি অ্যাক্সেস করি, এটিকে ব্যবহার করে মডেল কল করি এবং ফলাফল লগ করি। শেষে, আমরা ফলাফলটিকে রেসপন্স হিসেবে রিটার্ন করি, অথবা কিছু ভুল হলে একটি খালি স্ট্রিং। এই পর্যায়ে, আমরা একটি POST অনুরোধ পাঠিয়ে আমাদের এন্ডপয়েন্ট টেস্ট করতে পারি এবং রেসপন্স চেক করতে পারি। প্রথমে, আপনার package.json-এ deploy স্ক্রিপ্টটি রি-রান করুন:

bun run deploy

আপনার Cloudflare Workers এন্ডপয়েন্টের URL পাওয়ার পর, আপনি curl ব্যবহার করে এটিতে একটি POST অনুরোধ পাঠাতে পারেন:

curl -XPOST \
 "https://qstash.upstash.io/v2/publish/https://<YOUR_API_URL>.workers.dev/api/announce" \
 -H "Authorization: Bearer <YOUR_QSTASH_TOKEN>" \
 -H "Content-Type: application/json" \
 -d "{ \"query\": \"What's the derivative of e^x?\" }"

Upstash একটি QStash কনসোল প্রদান করে যা আপনি এই অনুরোধগুলো আরও সহজে পাঠাতে ব্যবহার করতে পারেন। QStash-কে একটি ক্রন জব দিয়ে আমাদের অনুরোধ বারবার চালানো ঠিক ততটুকু সহজ। QStash অনুরোধের বডিকে जैसा আছে তैসা আমাদের এন্ডপয়েন্টে পাস করে। আমরা নিচের JSON পেলোড পাঠাচ্ছি, যেখানে query হলো মডেলের জন্য প্রম্পট:

{ "query": "What's the derivative of e^x?" }
LangChain, Redis এবং QStash দিয়ে অন-ডিমান্ড LLM ক্যাশিং으로 পারফরম্যান্স বাড়ান

উপসংহার

রেট লিমিটিং SDK সফলভাবে প্রতি আইডেন্টিফায়ারের কলের সংখ্যা ক্যাশ করে:

LangChain, Redis এবং QStash দিয়ে অন-ডিমান্ড LLM ক্যাশিং으로 পারফরম্যান্স বাড়ান

একইভাবে, LangChain থেকে জেনারেট করা কন্টেন্ট সফলভাবে আমাদের Upstash Redis ডাটাবেসে ক্যাশ হয়েছে:

LangChain, Redis এবং QStash দিয়ে অন-ডিমান্ড LLM ক্যাশিং으로 পারফরম্যান্স বাড়ান

এবং অবশেষে, রেসপন্স আমাদের Cloudflare Worker-এর লগে লগ হয়েছে:

LangChain, Redis এবং QStash দিয়ে অন-ডিমান্ড LLM ক্যাশিং으로 পারফরম্যান্স বাড়ান
  1. রেডিস PSUBSCRIBE মাস্টার করুন: একাধিক প্যাটার্নে সাবস্ক্রাইব করা

  2. Matplotlib-এ অ্যারো-লাইক লাইনস্টাইল নির্দিষ্ট করা

  3. C++ ব্যবহার করে এলিপসের এরিয়া বের করা

  4. HTML-এ হেডিং এলাইনমেন্ট (Heading Alignment) সেট করা