برنامه نویسی

نحوه ساخت و استقرار یک ربات چت هوش مصنوعی مانند ChatGPT بدون کارت اعتباری

بررسی اجمالی

  • ما از این الگوی ارائه شده توسط vercel شروع می کنیم که با NextJs 13 App Directory با فعال کردن عملکردهای سرور و Vercel AI SDK برای رابط کاربری چت استریم ساخته شده است.
  • تمام خدمات لازم را مرحله به مرحله پیکربندی کنید.
  • همه خدمات دارای یک طرح رایگان بدون نیاز به روش پرداخت هستند.
  • محدودیت نرخ قابل تنظیم را برای جلوگیری از سوء استفاده در استقرار خود اعمال کنید.
  • ما از پلتفرم vercel استفاده خواهیم کرد، اما آشنایی با vercel پیش نیاز نیست.
  • کد در github موجود است

فهرست مطالب

پیکربندی خدمات

ارائه دهنده مدل

ما از صورت در آغوش گرفتن برای مدل خود استفاده خواهیم کرد.

چرا به جای OpenAI از صورت در آغوش گرفتن استفاده کنیم؟ صرفاً به این دلیل که یک طرح رایگان دارد و نیازی به پیوست کردن هیچ روش پرداختی ندارید.

  1. ایجاد یک حساب کاربری در صورت در آغوش گرفتن
  2. به تنظیمات حساب بروید و یک توکن ایجاد کنید.
  3. توکن را به عنوان ذخیره کنید HUGGINGFACE_API_KEY در فایل env.

احراز هویت

ما از github oauth برای احراز هویت از طریق NextAuth استفاده خواهیم کرد.

  1. از اینجا یک برنامه oauth جدید در github ثبت کنید
  2. یک نام برای برنامه بگذارید و بقیه را به این صورت پر کنید:نحوه ساخت و استقرار یک ربات چت هوش مصنوعی مانند
  3. توجه داشته باشید که این برای توسعه محلی است، برای استقرار یک برنامه جدید را ثبت کنید و همه نمونه های آن را جایگزین کنید http://localhost:3000 با آدرس اینترنتی آن استقرار.
  4. یک راز مشتری جدید ایجاد کنید.
  5. شناسه مشتری را به عنوان کپی کنید AUTH_GITHUB_ID و راز مشتری به عنوان AUTH_GITHUB_SECRET در فایل env.
  6. برای ایجاد یک رشته تصادفی امن به این لینک بروید و آن را به عنوان ذخیره کنید AUTH_SERCRET در فایل env. این برای NextAuth برای کار در تولید مورد نیاز است.

پایگاه داده

برای ذخیره چت ها از پایگاه داده KV vercel استفاده می کنیم.

  1. در vercel ثبت نام کنید یا وارد شوید.

  2. اگر با ایمیل ثبت نام کرده اید، حساب github خود را از تنظیمات متصل کنید.
  3. به ذخیره سازی بروید و یک پایگاه داده KV ایجاد کنید. توجه داشته باشید که شما فقط می توانید یک پایگاه داده KV در پلن رایگان داشته باشید.
  4. پایگاه داده ای را که ایجاد کرده اید انتخاب کنید و روی تب .env.local کلیک کنید. محتویات را در فایل env خود کپی کنید.

بالادست

ما از upstash برای محدود کردن نرخ استفاده خواهیم کرد. اگر به محدودیت نرخ نیاز ندارید، می توانید از این مرحله صرف نظر کنید.

  1. به کنسول upstash بروید.
  2. بر روی Create Database کلیک کنید، منطقه مورد نظر خود را انتخاب کرده و آن را فعال کنید Eviction گزینه.
  3. در جزئیات، به REST API بخش و روی تب env. کلیک کنید.
  4. مقادیر را کپی کرده و در فایل env خود قرار دهید.

محدود کردن نرخ

در هر حساب

app/api/chat/route.ts:

const ratelimit = new Ratelimit({
  redis: redis,
  limiter: Ratelimit.slidingWindow(15, '1 d')
})

export async function POST(req: NextRequest) {
    const { userId } = auth()

    const { success, reset } = await ratelimit.limit(userId!)
    if (!success) {
        return new Response(
            `Your rate limit has been exceeded. You can chat again from ${new Date(
                reset
            ).toLocaleString()} GMT`
        )
    }
    .
    .
    .
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این بخشی از کد است که مسئول محدود کردن نرخ است. شما می توانید مقادیر را مطابق با نیازهای خود انتخاب کنید. در اینجا، من آن را روی 15 درخواست در روز تنظیم کرده ام. می‌توانید از «m» برای دقیقه، «s» برای ثانیه استفاده کنید. همچنین می‌توانید پیامی را که در صورت تجاوز از حد مجاز نشان داده می‌شود، تغییر دهید. را reset متغیر یک مهر زمانی یونیکس را در میلی ثانیه از زمانی که محدودیت نرخ برای این کاربر بازنشانی می‌شود، برمی‌گرداند که به رشته‌ای مانند تبدیل می‌شود. 7/18/2023, 6:00:00 AM

به ازای IP

همچنین می توانید به ازای هر آدرس IP به محدودیت امتیاز دهید. به جای استفاده از userId، ip را به عنوان پارامتر به ratelimit.limit منتقل کنید.

export async function POST(req: NextRequest) {
    const ip = req.ip ?? "127.0.0.1"
    const { success, reset } = await ratelimit.limit(ip)
    .
    .
    .
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

req.ip در لوکال هاست تعریف نشده است، به همین دلیل است که ما قرار می دهیم 127.0.0.1 به عنوان مقدار بازگشتی

اگر محدود کردن نرخ نمی‌خواهید، واردات redis و RateLimit را در بالای فایل حذف کنید و تمام خطوط را که به آن‌ها اشاره می‌کنند حذف کنید.

گسترش

قبل از ادامه، مطمئن شوید که مقادیر تمام متغیرهای محیط ضروری را در فایل env. پر کرده اید. اگر می خواهید به صورت محلی اجرا کنید، مخزن را شبیه سازی کنید و بسته ها را با آن نصب کنید pnpm install. سپس سرور توسعه دهنده را با اجرا کنید pnpm dev

یک پروژه جدید در vercel راه اندازی کنید

  1. مخزن را چنگال کنید.
  2. یک پروژه جدید در vercel ایجاد کنید.
  3. مخزن فورک شده را وارد کنید.
  4. تنظیم Environment Variables با توجه به فایل env شما. توجه داشته باشید که نیازی به کپی کردن جفت های مقادیر کلیدی یک به یک نیست، فقط کل فایل را کپی کنید، مکان نما را در قسمت Name و Ctrl-v قرار دهید.
  5. روی deploy کلیک کنید

اما هنوز کارمان تمام نشده است. ما deploy را می زنیم تا یک پروژه جدید ایجاد شود. Vercel دامنه های منحصر به فردی را به استقرارها اختصاص می دهد. برای کار کردن github oauth باید از یک دامنه ثابت استفاده کنید.

برنامه Github OAuth را پیکربندی کنید

  1. به داشبورد vercel بروید. و پروژه خود را انتخاب کنید.
  2. کلیک کنید روی Settings را برگه و به Domains بخش.
  3. دامنه را به دلخواه خود تنظیم کنید و URL کامل را کپی کنید.
  4. یک برنامه جدید سوگند github را از اینجا ثبت کنید.
  5. URL Homapage را به عنوان دامنه ای که قبلاً کپی کرده اید تنظیم کنید.
  6. URL بازگشت به تماس مجوز را به عنوان تنظیم کنید your-domain-url/api/auth/callback.
  7. حالا به قسمت project Settings در vercel بروید و سپس به Environment Variables بخش.
  8. ویرایش کنید AUTH_GITHUB_ID و AUTH_GITHUB_SECRET و مانند قبل آن را با مقدار برنامه جدید github oauth جایگزین کنید.
  9. در حالت ایده آل، شما باید از موارد مختلف استفاده کنید AUTH_SERCRET در محیط داخلی و تولیدی برای امنیت بهتر. یک رشته تصادفی از اینجا بگیرید و ویرایش کنید AUTH_SERCRET.

LLM را تغییر دهید

با تغییر پارامتر مدل به راحتی می توانید مدل ها را تغییر دهید Hf.textGenerationStream() بر /api/chat/rout.ts. صورت در آغوش گرفتن امکان دسترسی به مدل های زیادی را فراهم می کند. اگر مدلی از استریم پشتیبانی می‌کند و اندازه کوچکی دارد، می‌توانید بدون تغییر کد عمده از مدلی استفاده کنید. شما باید اصلاح کنید buildOpenAssistantPrompt روش prompt برای قالب بندی درخواست ها با توجه به مشخصات مدل. مدلی که ما استفاده می کنیم، دستور کاربر را به عنوان دریافت می کند <|prompter|>${prompt}<|endoftext|> و پاسخ های قبلی مدل در این قالب انتظار می رود <|assistant|>${content}<|endoftext|>. این قالب بسته به مدل متفاوت خواهد بود.

می توانید از ارائه دهندگان LLM به غیر از چهره در آغوش گرفته مانند Anthropic، Langchain و OpenAI نیز استفاده کنید. این سند را دنبال کنید تا کنترل کننده مسیر (/api/chat/route.ts) را تغییر دهید و به بخش ارائه دهنده LLM انتخابی خود مراجعه کنید.

منو پیدا کن
💻 Github
🔘 لینکدین
توییتر

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا