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

পারফরম্যান্স বুস্ট করুন:ল্যাংচেইন, রেডিস এবং কিউস্ট্যাশের সাথে অন-ডিমান্ড এলএলএম ক্যাশিং

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

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

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

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

আপনি এখানে এই ডেমোর জন্য সম্পূর্ণ সোর্স কোড খুঁজে পেতে পারেন।

পূর্বশর্ত

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

শুরু করা

প্রকল্প তৈরি করা হচ্ছে

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

mkdir langchain-qstash
cd langchain-qstash

v1.0.0-এর সাম্প্রতিক প্রকাশের সাথে, এই প্রকল্পটিকে ভারা দিতে Bun ব্যবহার করা হবে। যাইহোক, create-hono ব্যবহার করাও সম্ভব npm সহ , pnpm , এবং yarn . 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 সার্ভার স্পিন আপ করবে এবং আপনার প্রোজেক্ট পরীক্ষা করার জন্য পোর্ট 8787-এ আপনাকে একটি স্থানীয় URL প্রদান করবে। আপনি স্থানীয়ভাবে পরীক্ষা করার পরিবর্তে সরাসরি একটি প্রান্ত পূর্বরূপ সেশন শুরু করতে চাইলে, আপনার ডেভ package.json পরিবর্তন করুন নিম্নরূপ স্ক্রিপ্ট:

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

আপনার ক্লাউডফ্লেয়ার ওয়ার্কারের কনফিগারেশন এবং লগগুলি দেখার জন্য, আপনাকে প্রথমে আপনার কর্মীকে মোতায়েন করতে হবে:

bun run deploy

এটি আপনাকে ক্লাউডফ্লেয়ারে সাইন ইন করার ধাপগুলির মধ্য দিয়ে যেতে হবে, প্রমাণীকরণের পরে স্বয়ংক্রিয়ভাবে প্রথমবারের জন্য আপনার প্রকল্প স্থাপন করে৷

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

ডিবাগিং উদ্দেশ্যে, আমরা QStash থেকে প্রাপ্ত অনুরোধগুলি লগ করতে এটি কার্যকর হবে। আপনি 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 সংযোগ করা হচ্ছে

আমরা 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 পাস করে (প্রসঙ্গ) প্রতিটি মিডলওয়্যার এবং হ্যান্ডলারের প্রতি অবজেক্ট। এটি সরাসরি ক্লাউডফ্লেয়ার ওয়ার্কার্সের ExecutionContext এর মত নয় —কিন্তু এতে একই তথ্য রয়েছে। হোনোর ctx অবজেক্টটি ডিফল্ট ক্লাউডফ্লেয়ার ওয়ার্কারদের কাছে পাঠানো রিকোয়েস্ট অবজেক্ট, এনভায়রনমেন্ট এবং এক্সিকিউশন কনটেক্সটের প্রায় সমতুল্য fetch হ্যান্ডলার, সব একটি বস্তুতে মিলিত।

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

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

// 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 . যদিও আমরা এই ডেমোতে ক্লাউডফ্লেয়ার ওয়ার্কারদের জন্য এটি ব্যবহার করছি, এটি প্রান্ত/সার্ভারহীন পরিবেশ সহ অগণিত অন্যান্য পরিবেশে চালানোর জন্য এটিকে সক্ষম করে৷

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

যেহেতু আমরা অনুরোধের মূল অংশটি ব্যবহার করছি, তাই আমাদের প্রকৃত হ্যান্ডলারে পরে এটিতে অ্যাক্সেস থাকবে না। এর কারণ হল শরীর একটি ReadableStream যা শুধুমাত্র একবার খাওয়া যেতে পারে। পরিবর্তে, হ্যান্ডলারের কাছে ক্যোয়ারী পাস করার জন্য, আমরা এটিকে locals এ যোগ করতে পারি প্রতিক্রিয়া উপর আপত্তি. অবশেষে, যদি স্বাক্ষরটি অবৈধ হয়, আমরা একটি 401 অননুমোদিত প্রতিক্রিয়া ফিরিয়ে দিই। অন্যথায়, আমরা next() কল করি পরবর্তী মিডলওয়্যার বা হ্যান্ডলারে চালিয়ে যেতে।

হার-সীমা যোগ করা হচ্ছে

যেহেতু আমরা এই এন্ডপয়েন্টটিকে আমাদের ব্যক্তিগত OpenAI API কীগুলির সাথে সংযুক্ত করতে যাচ্ছি, এটি নিশ্চিত করা গুরুত্বপূর্ণ যে আমরা ভুলবশত আমাদের হারের সীমা অতিক্রম না করি। সৌভাগ্যক্রমে, Upstash একটি রেট লিমিটিং SDK প্রদান করে যা আমরা সহজেই আমাদের এন্ডপয়েন্টে রেট-লিমিটিং যোগ করতে ব্যবহার করতে পারি। যদি অনুরোধের সংখ্যা একটি প্রদত্ত থ্রেশহোল্ড অতিক্রম করে, আমরা একটি 429 অনেক বেশি অনুরোধের প্রতিক্রিয়া ফেরত দেব৷

চলুন শুরু করা যাক 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 সত্য, প্রতিটি শনাক্তকারীর জন্য কলের ক্যাশে রাখার জন্য SDK স্বয়ংক্রিয়ভাবে Redis-কে কল করবে। এটি @upstash/ratelimit ব্যবহার করে ডিফল্টরূপে উপসর্গ হিসেবে।

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

const cache = new Map(); // outside of the middleware handler
 
// snip
 
const ratelimit = new Ratelimit({
 ephemeralCache: cache,
 // snip
});

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

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

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

যদি অনুরোধটি রেট-সীমিত হয়, আমরা একটি 429 অনেক বেশি অনুরোধের প্রতিক্রিয়া ফিরিয়ে দিই। অন্যথায়, আমরা next() কল করি পরবর্তী মিডলওয়্যার বা হ্যান্ডলারে চালিয়ে যেতে। যে ক্ষেত্রে আমরা একাধিক Redis ডাটাবেস SDK এর সাথে সংযুক্ত করেছি, এটি তাদের মধ্যে সিঙ্ক্রোনাইজেশন করতে হবে। এটি ভার্সেল এজ এবং ক্লাউডফ্লেয়ার ওয়ার্কারদের উপর ঝুলে থাকা প্রতিশ্রুতিগুলির দিকে পরিচালিত করবে, যা আমরা এইভাবে যত্ন নিতে পারি:

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

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

QStash থেকে বার্তা গ্রহণ করা হচ্ছে

যখন আমরা QStash-এ একটি HTTP অনুরোধ পাঠাই, তখন আমরা যে গন্তব্যটি নির্দিষ্ট করি সেটি হবে আমাদের Cloudflare Workers endpoint এর 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) => {});
 
// snip

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

// 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

এখানে, আমরা ল্যাংচেইনের জন্য ক্যাশিং সেট আপ করার জন্য প্রয়োজনীয় ক্লাসগুলি আমদানি করি। তারপর, আমরা ওপেনএআই মডেল এবং আপস্ট্যাশ রেডিস ক্যাশে ব্যবহার করে চেইন তৈরি করি, ক্যাশে একটি আপস্ট্যাশ রেডিস উদাহরণ পাস করি। আবার, আমাদের ওপেনএআই এপিআই কী মডেলটিতে ম্যানুয়ালি পাস করতে হবে কারণ এটি ক্লাউডফ্লেয়ার ওয়ার্কারদের স্বয়ংক্রিয়ভাবে পড়া যায় না।

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

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?"
}

পারফরম্যান্স বুস্ট করুন:ল্যাংচেইন, রেডিস এবং কিউস্ট্যাশের সাথে অন-ডিমান্ড এলএলএম ক্যাশিং

উপসংহার

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

পারফরম্যান্স বুস্ট করুন:ল্যাংচেইন, রেডিস এবং কিউস্ট্যাশের সাথে অন-ডিমান্ড এলএলএম ক্যাশিং

একইভাবে, LangChain থেকে উৎপন্ন বিষয়বস্তু সফলভাবে আমাদের Upstash Redis ডাটাবেসে ক্যাশে করা হয়:

পারফরম্যান্স বুস্ট করুন:ল্যাংচেইন, রেডিস এবং কিউস্ট্যাশের সাথে অন-ডিমান্ড এলএলএম ক্যাশিং

এবং অবশেষে, প্রতিক্রিয়াটি আমাদের ক্লাউডফ্লেয়ার ওয়ার্কারের লগগুলিতে লগ করা হয়েছে:

পারফরম্যান্স বুস্ট করুন:ল্যাংচেইন, রেডিস এবং কিউস্ট্যাশের সাথে অন-ডিমান্ড এলএলএম ক্যাশিং


  1. জাভাস্ক্রিপ্টে ডট নোটেশন

  2. রেডিসে হ্যাশ ব্যবহার করা

  3. নতুনদের জন্য কমান্ড লাইন - কিভাবে একটি প্রো মত টার্মিনাল ব্যবহার করবেন [সম্পূর্ণ হ্যান্ডবুক]

  4. কিভাবে ম্যাটপ্লটলিবে একটি পোলার প্লটের জন্য ছোটখাট টিক তৈরি করবেন?