برنامه نویسی

مدیریت برنامه جاوا مبتنی بر هوش مصنوعی با مدیریت API

در این مقاله، ما بررسی نحوه ادغام APIهای ChatGPT OpenAI با یک برنامه Spring Boot و مدیریت APIها با استفاده از Apache APISIX، دروازه API منبع باز. این ادغام به ما امکان می دهد از قدرت ChatGPT، یک مدل زبان پیشرفته که توسط OpenAI توسعه یافته است، در برنامه Spring Boot خود استفاده کنیم، در حالی که APISIX راهی قوی، مقیاس پذیر و ایمن برای مدیریت API ها ارائه می دهد.

APIهای OpenAI ChatGPT

ChatGPT API OpenAI یک ابزار قدرتمند است که می توانیم از آن استفاده کنیم قابلیت های مدل ChatGPT را یکپارچه کنید به برنامه ها یا خدمات خودمان. API به ما این امکان را می دهد که یک سری پیام ارسال کنیم و در پاسخ از طریق REST یک پیام تولید شده توسط هوش مصنوعی دریافت کنیم. مجموعه‌ای از APIها را برای ایجاد پاسخ‌های متنی در ربات چت، تکمیل کد، تولید تصاویر یا پاسخ به سؤالات در یک رابط مکالمه ارائه می‌دهد. در این آموزش، ما از API تکمیل چت برای ایجاد پاسخ به یک اعلان استفاده خواهیم کرد (اساساً ما می توانیم هر چیزی بپرسیم). قبل از شروع آموزش، می‌توانید API را بررسی کنید تا درک درستی از نحوه احراز هویت در API با استفاده از کلیدهای API، نحوه ظاهر پارامترهای درخواست API و پاسخ داشته باشید.

نمونه درخواست cURL برای تکمیل API چت به این شکل است. شما جایگزین کنید OPENAI_API_KEY با کلید API خود و قرار دادن آن در مجوز هدر هنگام فراخوانی API.

curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-3.5-turbo",
    "messages": [{"role": "user", "content": "What is Apache APISIX?"}]
}'
وارد حالت تمام صفحه شوید

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

در اینجا یک نمونه پاسخ JSON آمده است:

{
  "id": "chatcmpl-7PtycrYOTJGv4jw8FQPD7LCCw0tOE",
  "object": "chat.completion",
  "created": 1686407730,
  "model": "gpt-3.5-turbo-0301",
  "usage": {
    "prompt_tokens": 15,
    "completion_tokens": 104,
    "total_tokens": 119
  },
  "choices": [
    {
      "message": {
        "role": "assistant",
        "content": "Apache APISIX is a dynamic, real-time, high-performance API gateway designed to facilitate the management and routing of microservices and APIs. It provides features such as load balancing, rate limiting, authentication, authorization, and traffic control, all of which help to simplify the management of microservices and APIs. Apache APISIX is built on top of the Nginx server and can support high levels of traffic with low latency and high availability. It is open source and released under the Apache 2.0 license."
      },
      "finish_reason": "stop",
      "index": 0
    }
  ]
}
وارد حالت تمام صفحه شوید

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

نمونه کد پروژه

آموزش از دو بخش تشکیل شده است. بخش اول راه‌اندازی برنامه Spring Boot و ایجاد یک نقطه پایانی API جدید را پوشش می‌دهد که می‌تواند تماس‌های API ما برای تکمیل API را به صورت برنامه‌ریزی انجام دهد. در قسمت دوم به معرفی ویژگی های APISIX مانند امنیت و کنترل ترافیک به Spring Boot API می پردازیم. نمونه کدهای کامل این آموزش در مخزن GitHub به نام apisix-java-chatgpt-openaiapi موجود است.

پیش نیازها

قبل از شروع، مطمئن شوید که موارد زیر را دارید:

  • ایجاد یک کلید API OpenAI: برای دسترسی به OpenAI API، باید یک کلید API ایجاد کنید. می توانید این کار را با ورود به وب سایت OpenAI و رفتن به صفحه مدیریت کلید API انجام دهید.
  • Docker برای اجرای APISIX و Spring Boot روی دستگاه شما نصب شده است.

مرحله 1: برنامه Spring Boot خود را راه اندازی کنید

ابتدا باید یک برنامه Spring Boot جدید راه اندازی کنیم. می توانید از Spring Initializr برای ایجاد یک پروژه جدید Maven با وابستگی های لازم استفاده کنید. برای این آموزش، به وابستگی Spring Boot Starter Web نیاز داریم. برای ادغام ChatGPT API، از OpenAI Java Client استفاده می کنیم. یک کتابخانه جاوا جامعه منبع باز وجود دارد. کلاس‌های خدماتی را ارائه می‌کند که مشتری APIهای GPT OpenAI را در جاوا ایجاد و فراخوانی می‌کند. البته، می‌توانید پیاده‌سازی خود را در Spring بنویسید که با APIهای OpenAI نیز تعامل داشته باشد. برای زبان های برنامه نویسی مختلف به کتابخانه های مشتری دیگر مراجعه کنید.

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.theokanning.openai-gpt3-java</groupId>
            <artifactId>service</artifactId>
            <version>0.12.0</version>
        </dependency>
</dependencies>
وارد حالت تمام صفحه شوید

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

مرحله 2: یک کلاس Controller ایجاد کنید

در کلاس ChatCompletionController.java، می توانید از سرویس OpenAI برای ارسال درخواست به ChatGPT API استفاده کنید.

import com.theokanning.openai.completion.chat.ChatCompletionChoice;
import com.theokanning.openai.completion.chat.ChatCompletionRequest;
import com.theokanning.openai.completion.chat.ChatMessage;
import com.theokanning.openai.completion.chat.ChatMessageRole;
import com.theokanning.openai.service.OpenAiService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
public class ChatCompletionController {

    @Value("${openai.model}")
    private String model;

    @Value("${openai.api.key}")
    private String openaiApiKey;

    @PostMapping("/ai-chat")
    public String chat(@RequestBody String prompt) {
        OpenAiService service = new OpenAiService(openaiApiKey);

        final List<ChatMessage> messages = new ArrayList<>();
        final ChatMessage systemMessage = new ChatMessage(
                         ChatMessageRole.USER.value(), prompt);
        messages.add(systemMessage);

        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest
            .builder()
            .model(model)
            .messages(messages)
            .maxTokens(250)
            .build();

        List<ChatCompletionChoice> choices = service
                        .createChatCompletion(chatCompletionRequest).getChoices();

        if (choices == null || choices.isEmpty()) {
            return "No response";
        }

        return choices.get(0).getMessage().getContent();
    }
}
وارد حالت تمام صفحه شوید

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

نقطه پایانی Chat API /ai-chat رسیدگی به درخواست‌های POST، یک درخواست چت ایجاد می‌کند و آن را به OpenAI API ارسال می‌کند. سپس، اولین پیام از پاسخ API را برمی گرداند.

مرحله 3: ویژگی های برنامه را تعریف کنید

در مرحله بعد، ویژگی هایی را برای API مانند ارائه می دهیم model و API key در کاربرد.خواص فایل:

openai.model=gpt-3.5-turbo
openai.api.key=YOUR_OPENAI_API_TOKEN
وارد حالت تمام صفحه شوید

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

مرحله 4: برنامه Spring Boot را اجرا کنید

اکنون می توانیم Application.java را اجرا کرده و با Postman یا دستور cURL آن را آزمایش کنیم.

پاسخ هوش مصنوعی از Spring Boot

همانطور که می بینیم، برنامه پاسخی به سوال ما در بدنه درخواست سریع ایجاد کرد.

مرحله 5: یک Dockerfile ایجاد کنید

ما از یک ظرف Docker برای بسته بندی برنامه Spring Boot خود استفاده می کنیم و از آن همراه با سایر کانتینرهای APISIX در docker-compose.yml استفاده می کنیم. برای انجام این کار، می توانیم یک Dockerfile ایجاد کنیم تا یک JAR بسازیم و آن را اجرا کنیم. نحوه Dockerize کردن آموزش برنامه Spring Boot را ببینید. سپس سرویس را در فایل docker compose yaml ثبت کنید.

openaiapi:
    build: openaiapi
    ports:
      - "8080:8080"
    networks:
      apisix:
وارد حالت تمام صفحه شوید

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

مرحله 6: راه اندازی Apache APISIX

برای راه اندازی APISIX، به سادگی می توانیم اجرا کنیم docker compose up فرمان زیرا ما قبلاً تمام سرویس های لازم را در docker-compose.yml تعریف کرده ایم. این فایل تنها 2 کانتینر یکی برای APISIX و دیگری برای برنامه بوت Spring که در مراحل قبل پیاده سازی کردیم، تعریف می کند. در این پروژه نمونه، ما APISIX را در حالت مستقل اجرا می کنیم. گزینه های نصب APISIX و حالت های استقرار دیگری نیز وجود دارد. اکنون APISIX به عنوان یک سرویس جداگانه در حال اجرا است localhost:9080 و برنامه Spring Boot روشن است localhost:8080

مرحله 7: ایمن سازی API با APISIX

هنگامی که APISIX راه اندازی شد، می توانیم ویژگی های امنیتی را به API بوت Spring موجود خود اضافه کنیم /ai-chat به طوری که فقط مصرف کنندگان API مجاز می توانند به این API دسترسی داشته باشند. APISIX چندین پلاگین برای ایمن سازی API های شما ارائه می دهد. به عنوان مثال، می‌توانید از افزونه jwt-auth استفاده کنید تا برای همه درخواست‌ها به یک توکن JWT نیاز داشته باشید. در اینجا مثالی از نحوه اضافه کردن یک مسیر با upstream و افزونه ها با استفاده از apisix.yml فایل:

upstreams:
  - id: 1
    type: roundrobin
    nodes:
      "openaiapi:8080": 1
routes:
  - uri: /ask-me-anything
    upstream_id: 1
    plugins:
      proxy-rewrite:
        uri: /ai-chat
      jwt-auth: {}
  - uri: /login
    plugins:
      public-api:
        uri: /apisix/plugin/jwt/sign
consumers:
  - username: appsmithuser
    plugins:
        jwt-auth:
            key: appsmithuser@gmail.com
            secret: my-secret-key
وارد حالت تمام صفحه شوید

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

پس از تعیین upstreams، مسیرها، و اشیاء مصرف کننده و قوانین مسیریابی در پیکربندی APISIX، فایل پیکربندی بلافاصله پس از شروع سرویس گره APISIX در Docker در حافظه بارگذاری می شود. Apisix به صورت دوره‌ای سعی می‌کند تشخیص دهد که آیا محتوای فایل به‌روزرسانی شده است یا خیر، در صورت بروز رسانی، آن را تشخیص دهد بارگذاری مجدد به طور خودکار تغییر می کند.

با این پیکربندی، یک بالادست، دو مسیر و یک شی مصرف کننده اضافه کردیم. در مسیر اول، تمام درخواست ها به /ask-me-anything (که یک مسیر URI سفارشی است، می توانید هر URI را در آنجا تعریف کنید) باید شامل این باشد Authorization: JWT_TOKEN در سربرگ سپس، APISIX مسیر URI سفارشی را به API واقعی بازنویسی می‌کند /ai-chat به طور خودکار با کمک افزونه بازنویسی پروکسی و ارسال درخواست ها به برنامه Spring Boot در حال اجرا localhost:8080.

اگر سعی کنید مسیر APISIX را درخواست کنید، با برگرداندن یک خطای مجاز، درخواست های ما را رد می کند:

curl -i http://localhost:9080/ask-me-anything -X POST -d '
{
   "prompt":"What is Apache APISIX?"
}'
وارد حالت تمام صفحه شوید

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

نتیجه درخواست فوق:

HTTP/1.1 401 Unauthorized
{"message":"Missing JWT token in request"}
وارد حالت تمام صفحه شوید

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

در پیکربندی مسیر دوم، افزونه public-api را فعال کردیم تا یک نقطه پایانی جدید را نشان دهد /login برای امضای توکن های جدید JWT. زیرا APISIX می‌تواند به عنوان یک ارائه‌دهنده هویت برای تولید و تأیید یک توکن جدید از مصرف‌کننده API یا برنامه‌های مشتری عمل کند. دیدن مرحله 8، چگونه ما یک توکن جدید برای مصرف کننده API خود ادعا می کنیم.

  - uri: /login
    plugins:
      public-api:
        uri: /apisix/plugin/jwt/sign
وارد حالت تمام صفحه شوید

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

اگر در همان فایل پیکربندی متوجه شدید، ما یک مصرف کننده API را برای استفاده ثبت کرده ایم /ask-me-anything API مبتنی بر هوش مصنوعی و کاربران ما می‌توانند APISIX را با استفاده از راز خود برای تولید یک توکن JWT برای دسترسی به API ادعا کنند:

consumers:
  - username: appsmithuser
    plugins:
        jwt-auth:
            key: appsmithuser@gmail.com
            secret: my-secret-key
وارد حالت تمام صفحه شوید

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

مرحله 8: یک توکن JWT جدید درخواست کنید

اکنون می‌توانیم یک توکن JWT جدید برای مصرف‌کننده API موجود خود با کلید زیر ادعا کنیم:

curl -i http://127.0.0.1:9080/login?key=user-key -i
وارد حالت تمام صفحه شوید

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

ما توکن جدید را به عنوان پاسخی از APISIX دریافت خواهیم کرد:

Server: APISIX/3.0.0
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJrZXkiOiJ1c2VyLWtleSIsImV4cCI6MTY4NjU5MjE0NH0.4Kn9c2DBYKthyUx824Ah97-z0Eu2Ul9WGO2WB3IfURA
وارد حالت تمام صفحه شوید

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

مرحله 9: API را با توکن JWT درخواست کنید

در نهایت می توانیم درخواستی را به API ارسال کنیم /ask-me-anything با توکن JWT در هدر که در مرحله قبل به دست آوردیم.

curl -i http://localhost:9080/ask-me-anything -H 'Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ1c2VyLWtleSIsImV4cCI6MTY4NjU5Mjk4N30.lhom9db3XMkcVd86ScpM6s4eP1_YzR-tfmXPckszsYo' -X POST -d '
{
   "prompt":"What is Apache APISIX?"
}'
وارد حالت تمام صفحه شوید

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

یا با استفاده از Postman، پاسخ هوش مصنوعی را دریافت خواهیم کرد، اما این بار پاسخ از طریق APISIX Gateway می آید:

پاسخ هوش مصنوعی از APISIX

نتیجه

در این آموزش، OpenAI ChatGPT API را بررسی کردیم تا پاسخ‌هایی به درخواست‌ها ایجاد کنیم. ما یک برنامه Spring Boot ایجاد کردیم که API را برای ایجاد پاسخ به درخواست‌ها فراخوانی می‌کند. در مرحله بعد، می توانید با به روز رسانی فایل apisix.yml موجود، ویژگی های اضافی را به ادغام خود معرفی کنید. همچنین، نام شعبه ای به نام with-frontend را بررسی کنید و پروژه را اجرا کنید تا رابط UI ساخته شده با استفاده از Appsmith که با APISIX کار می کند را ببینید.

منابع مرتبط

محتوای پیشنهادی

انجمن

🙋 به انجمن آپاچی APISIX بپیوندید
🐦 ما را در توییتر دنبال کنید
📝 ما را در Slack پیدا کنید
💁 صفحه نحوه مشارکت

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

از وبلاگ من دیدن کنید: www.iambobur.com

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

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

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

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