إدارة تطبيق Java المدعوم بالذكاء الاصطناعي باستخدام API Management
June 22, 2023
في هذه المقالة، سنستكشف كيفية دمج واجهة برمجة تطبيقات ChatGPT من OpenAI مع تطبيق Spring Boot وإدارة واجهات برمجة التطبيقات باستخدام Apache APISIX، وهو بوابة واجهات برمجة التطبيقات مفتوحة المصدر. سيسمح لنا هذا التكامل بالاستفادة من قوة ChatGPT، وهو نموذج لغوي متطور طورته OpenAI، في تطبيق Spring Boot الخاص بنا، بينما ستوفر APISIX طريقة قوية وقابلة للتوسيع وآمنة لإدارة واجهات برمجة التطبيقات.
واجهات برمجة تطبيقات OpenAI ChatGPT
واجهة برمجة تطبيقات ChatGPT من OpenAI هي أداة قوية يمكننا استخدامها لدمج إمكانيات نموذج ChatGPT في تطبيقاتنا أو خدماتنا الخاصة. تسمح لنا الواجهة بإرسال سلسلة من الرسائل واستقبال رسالة تم إنشاؤها بواسطة نموذج الذكاء الاصطناعي كرد عبر REST. توفر الواجهة مجموعة من واجهات برمجة التطبيقات لإنشاء ردود نصية في روبوت محادثة، إكمال التعليمات البرمجية، إنشاء صور، أو الإجابة على الأسئلة في واجهة محادثة. في هذا البرنامج التعليمي، سنستخدم واجهة برمجة تطبيقات إكمال المحادثة لإنشاء ردود على مطالبة (بشكل أساسي يمكننا أن نسأل أي شيء). قبل البدء في البرنامج التعليمي، يمكنك استكشاف الواجهة لفهم كيفية المصادقة على الواجهة باستخدام مفاتيح واجهة برمجة التطبيقات، وكيف تبدو معلمات طلب الواجهة والاستجابة.
سيبدو طلب cURL نموذجي إلى واجهة برمجة تطبيقات إكمال المحادثة كما يلي. يمكنك استبدال OPENAI_API_KEY
بمفتاح واجهة برمجة التطبيقات الخاص بك ووضعه في رأس Authorization عند استدعاء الواجهة.
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": "ما هو 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 هي بوابة واجهات برمجة تطبيقات ديناميكية وفورية وعالية الأداء مصممة لتسهيل إدارة وتوجيه الخدمات المصغرة وواجهات برمجة التطبيقات. توفر ميزات مثل موازنة الحمل، الحد من المعدل، المصادقة، التفويض، والتحكم في حركة المرور، وكلها تساعد في تبسيط إدارة الخدمات المصغرة وواجهات برمجة التطبيقات. تم بناء Apache APISIX على خادم Nginx ويمكنها دعم مستويات عالية من حركة المرور مع زمن انتقال منخفض وتوفر عالي. وهي مفتوحة المصدر وتم إصدارها تحت ترخيص Apache 2.0."
},
"finish_reason": "stop",
"index": 0
}
]
}
مثال على كود المشروع
يتكون البرنامج التعليمي من جزأين. يغطي الجزء الأول إعداد تطبيق Spring Boot وإنشاء نقطة نهاية واجهة برمجة تطبيقات جديدة يمكنها التعامل مع استدعاءات واجهة برمجة التطبيقات إلى واجهة برمجة تطبيقات إكمال المحادثة برمجيًا. في الجزء الثاني، سنقدم ميزات APISIX مثل الأمان والتحكم في حركة المرور إلى واجهة برمجة تطبيقات Spring Boot. تتوفر أمثلة الكود الكاملة لهذا البرنامج التعليمي في مستودع GitHub المسمى apisix-java-chatgpt-openaiapi.
المتطلبات الأساسية
قبل أن نبدأ، تأكد من أن لديك ما يلي:
- إنشاء مفتاح واجهة برمجة تطبيقات OpenAI: للوصول إلى واجهة برمجة تطبيقات OpenAI، ستحتاج إلى إنشاء مفتاح واجهة برمجة تطبيقات. يمكنك القيام بذلك عن طريق تسجيل الدخول إلى موقع OpenAI والانتقال إلى صفحة إدارة مفاتيح واجهة برمجة التطبيقات.
- تثبيت Docker على جهازك لتشغيل APISIX وSpring Boot.
الخطوة 1: إعداد تطبيق Spring Boot الخاص بك
أولاً، نحتاج إلى إعداد تطبيق Spring Boot جديد. يمكنك استخدام Spring Initializr لإنشاء مشروع Maven جديد مع التبعيات اللازمة. بالنسبة لهذا البرنامج التعليمي، سنحتاج إلى تبعية Spring Boot Starter Web. لدمج واجهة برمجة تطبيقات ChatGPT، سنستخدم عميل OpenAI Java. هناك مكتبة مجتمعية مفتوحة المصدر تسمى https://github.com/TheoKanning/openai-java. توفر فئات خدمية تقوم بإنشاء واستدعاء واجهات برمجة تطبيقات GPT من OpenAI في Java. بالطبع، يمكنك كتابة تنفيذك الخاص في Spring الذي يتفاعل مع واجهات برمجة تطبيقات 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.
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();
}
}
نقطة نهاية واجهة برمجة التطبيقات /ai-chat
تتعامل مع طلبات POST، تقوم بإنشاء طلب محادثة وإرساله إلى واجهة برمجة تطبيقات OpenAI. ثم تقوم بإرجاع الرسالة الأولى من استجابة الواجهة.
الخطوة 3: تحديد خصائص التطبيق
بعد ذلك، نقدم الخصائص للواجهة مثل model
وAPI key
في ملف application.properties:
openai.model=gpt-3.5-turbo
openai.api.key=YOUR_OPENAI_API_TOKEN
الخطوة 4: تشغيل تطبيق Spring Boot
يمكننا الآن تشغيل Application.java واختباره باستخدام Postman أو أمر cURL.
كما نرى، قام التطبيق بإنشاء استجابة لسؤالنا في نص طلب المطالبة.
الخطوة 5: إنشاء Dockerfile
نستخدم حاوية Docker لتغليف تطبيق Spring Boot الخاص بنا واستخدامه مع حاويات APISIX الأخرى في docker-compose.yml. للقيام بذلك، يمكننا إنشاء Dockerfile لبناء JAR وتنفيذه. راجع برنامج تعليمي حول تغليف تطبيق Spring Boot باستخدام Docker. ثم قم بتسجيل الخدمة في ملف docker compose yaml.
openaiapi:
build: openaiapi
ports:
- "8080:8080"
networks:
apisix:
الخطوة 6: إعداد Apache APISIX
لإعداد APISIX، يمكننا ببساطة تشغيل أمر docker compose up
. لأننا قمنا بالفعل بتعريف جميع الخدمات اللازمة في docker-compose.yml. يحدد هذا الملف حاويتين فقط واحدة لـ APISIX، والأخرى لتطبيق Spring Boot الذي قمنا بتنفيذه في الخطوات السابقة. في هذا المشروع النموذجي، نقوم بتشغيل APISIX في وضع standalone. هناك خيارات أخرى لتركيب APISIX وأوضاع النشر أيضًا. الآن APISIX كخدمة منفصلة يعمل على localhost:9080
وتطبيق Spring Boot على localhost:8080
الخطوة 7: تأمين واجهة برمجة التطبيقات باستخدام APISIX
بمجرد إعداد APISIX، يمكننا إضافة ميزات أمان إلى واجهة برمجة التطبيقات الحالية لتطبيق Spring Boot /ai-chat
بحيث يمكن فقط للمستهلكين المسموح لهم الوصول إلى هذه الواجهة. توفر APISIX العديد من الإضافات لتأمين واجهات برمجة التطبيقات الخاصة بك. على سبيل المثال، يمكنك استخدام إضافة 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، routes، وكائنات المستهلكين وقواعد التوجيه في تكوين APISIX، يتم تحميل ملف التكوين في الذاكرة مباشرة بعد بدء خدمة عقدة APISIX في Docker. تحاول APISIX بشكل دوري اكتشاف ما إذا كان محتوى الملف قد تم تحديثه، وإذا كان هناك تحديث، فإنها تعيد تحميل التغييرات تلقائيًا.
مع هذا التكوين، أضفنا upstream واحدًا، مسارين، وكائن مستهلك واحد. في المسار الأول، يجب أن تتضمن جميع الطلبات إلى /ask-me-anything
(وهو مسار URI مخصص، يمكنك تحديد أي URI هناك) Authorization: JWT_TOKEN
في الرأس. ثم تقوم APISIX بإعادة كتابة مسار URI المخصص إلى واجهة برمجة التطبيقات الفعلية /ai-chat
تلقائيًا بمساعدة إضافة proxy-rewrite وتوجيه الطلبات إلى تطبيق Spring Boot الذي يعمل على localhost:8080
.
إذا حاولت طلب مسار APISIX، فسوف يرفض طلباتنا بإرجاع خطأ غير مصرح به:
curl -i http://localhost:9080/ask-me-anything -X POST -d '
{
"prompt":"ما هو Apache APISIX؟"
}'
نتيجة الطلب أعلاه:
HTTP/1.1 401 Unauthorized
{"message":"Missing JWT token in request"}
في تكوين المسار الثاني، قمنا بتمكين إضافة public-api لتعريض نقطة نهاية جديدة /login
لتوقيع رموز JWT جديدة. لأن APISIX يمكن أن تعمل كموفر هوية لإنشاء والتحقق من رمز جديد من مستهلك واجهة برمجة التطبيقات أو التطبيقات العميلة. راجع الخطوة 8، كيف يمكننا المطالبة برمز جديد لمستهلك واجهة برمجة التطبيقات الخاص بنا.
- uri: /login
plugins:
public-api:
uri: /apisix/plugin/jwt/sign
إذا لاحظت في نفس ملف التكوين، قمنا بتسجيل مستهلك واجهة برمجة التطبيقات لاستخدام واجهة برمجة التطبيقات المدعومة بالذكاء الاصطناعي /ask-me-anything
ويمكن لمستخدمينا المطالبة بـ APISIX باستخدام سرهم لإنشاء رمز JWT للوصول إلى الواجهة:
consumers:
- username: appsmithuser
plugins:
jwt-auth:
key: appsmithuser@gmail.com
secret: my-secret-key
الخطوة 8: المطالبة برمز JWT جديد
الآن يمكننا المطالبة برمز JWT جديد لمستهلك واجهة برمجة التطبيقات الحالي باستخدام المفتاح:
curl -i http://127.0.0.1:9080/login?key=user-key -i
سنحصل على الرمز الجديد كاستجابة من APISIX:
Server: APISIX/3.0.0
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJrZXkiOiJ1c2VyLWtleSIsImV4cCI6MTY4NjU5MjE0NH0.4Kn9c2DBYKthyUx824Ah97-z0Eu2Ul9WGO2WB3IfURA
الخطوة 9: طلب واجهة برمجة التطبيقات باستخدام رمز JWT
أخيرًا، يمكننا إرسال طلب إلى واجهة برمجة التطبيقات /ask-me-anything
مع رمز JWT في الرأس الذي حصلنا عليه في الخطوة السابقة.
curl -i http://localhost:9080/ask-me-anything -H 'Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ1c2VyLWtleSIsImV4cCI6MTY4NjU5Mjk4N30.lhom9db3XMkcVd86ScpM6s4eP1_YzR-tfmXPckszsYo' -X POST -d '
{
"prompt":"ما هو Apache APISIX؟"
}'
أو باستخدام Postman، سنحصل على استجابة الذكاء الاصطناعي ولكن هذه المرة تأتي الاستجابة عبر بوابة APISIX:
الخلاصة
في هذا البرنامج التعليمي، استكشفنا واجهة برمجة تطبيقات OpenAI ChatGPT لإنشاء ردود على المطالبات. قمنا بإنشاء تطبيق Spring Boot يستدعي الواجهة لإنشاء ردود على المطالبات. بعد ذلك، يمكنك إدخال ميزات إضافية إلى تكاملك عن طريق تحديث ملف apisix.yml الحالي. أيضًا، يمكنك التحقق من الفرع المسمى with-frontend وتشغيل المشروع لرؤية واجهة المستخدم التي تم بناؤها باستخدام Appsmith والتي تعمل مع APISIX.