إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
في هذا البرنامج التعليمي، ستقوم بإنشاء تطبيق ذكي الذكاء الاصطناعي من خلال دمج Azure OpenAI مع تطبيق Java Spring Boot ونشره في Azure App Service. ستقوم بإنشاء وحدة تحكم Spring Boot ترسل استعلاما إلى Azure OpenAI وترسل الاستجابة إلى المتصفح.
تلميح
بينما يستخدم هذا البرنامج التعليمي Spring Boot، تنطبق المفاهيم الأساسية لبناء تطبيق دردشة باستخدام Azure OpenAI على أي تطبيق ويب Java. إذا كنت تستخدم خيار استضافة مختلف على App Service، مثل Tomcat أو JBoss EAP، يمكنك تكييف أنماط المصادقة واستخدام Azure SDK الموضح هنا مع إطار العمل المفضل لديك.
في هذا البرنامج التعليمي، تتعلم كيفية:
- إنشاء مورد Azure OpenAI ونشر نموذج لغة.
- إنشاء تطبيق Spring Boot يتصل ب Azure OpenAI.
- استخدم إدخال التبعية لتكوين عميل Azure OpenAI.
- نشر التطبيق إلى Azure App Service.
- تنفيذ المصادقة الآمنة بدون كلمة مرور في كل من بيئة التطوير وفي Azure.
المتطلبات الأساسية
- حساب Azure مع اشتراك نشط
- حساب GitHub لاستخدام GitHub Codespaces
1. إنشاء مورد Azure OpenAI
في هذا القسم، تستخدم Azure CLI في GitHub Codespaces لإنشاء مورد Azure OpenAI.
سجل الدخول إلى GitHub Codespaces باستخدام حسابك في GitHub.
اختر استخدام هذا القالب في بلاطة الفراغ لإنشاء مساحة كود فارغة جديدة.
في محطة كود سبيس، قم بتثبيت واجهة الأزرار (CLI).
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bashسجل الدخول إلى حسابك في Azure.
az loginاتبع الإرشادات الموجودة في المحطة الطرفية للمصادقة.
حدد متغيرات البيئة عن طريق توفير أسماء لمجموعة الموارد الخاصة بك وخدمة Azure OpenAI وتعيين منطقة Azure مناسبة كموقعك.
export RESOURCE_GROUP="<group-name>" export OPENAI_SERVICE_NAME="<azure-openai-name>" export APPSERVICE_NAME="<app-name>" export LOCATION="<azure-region>"هام
الموقع مرتبط بتوفر النموذج المختار على مستوى المنطقة. تختلف توفر النماذج وأنواع النشر بين مناطق Azure ومستويات الفوترة. يستخدم
gpt-4o-miniهذا الدرس ، وهو متاح في عدة مناطق تحت نوع النشر القياسي.قبل اختيار الموقع، راجع ملخص النموذج وجدول توفر المنطقة للتحقق من دعم النموذج في منطقتك المفضلة.
أنشئ مجموعة موارد ومورد Azure OpenAI مع نطاق مخصص، ثم أضف نموذجا
gpt-4o-mini:# Resource group az group create --name $RESOURCE_GROUP --location $LOCATION # Azure OpenAI resource az cognitiveservices account create \ --name $OPENAI_SERVICE_NAME \ --resource-group $RESOURCE_GROUP \ --location $LOCATION \ --custom-domain $OPENAI_SERVICE_NAME \ --kind OpenAI \ --sku s0 # gpt-4o-mini model az cognitiveservices account deployment create \ --name $OPENAI_SERVICE_NAME \ --resource-group $RESOURCE_GROUP \ --deployment-name gpt-4o-mini \ --model-name gpt-4o-mini \ --model-version 2024-07-18 \ --model-format OpenAI \ --sku-name Standard \ --sku-capacity 1 # Cognitive Services OpenAI User role that lets the signed in Azure user read models from Azure OpenAI az role assignment create \ --assignee $(az ad signed-in-user show --query id -o tsv) \ --role "Cognitive Services OpenAI User" \ --scope /subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.CognitiveServices/accounts/$OPENAI_SERVICE_NAME
الآن بعد أن أصبح لديك مورد Azure OpenAI، يمكنك إنشاء تطبيق ويب للتفاعل معه.
2. إنشاء وإعداد تطبيق ويب Spring Boot
في محطة Codespace الطرفية، انسخ عينة Spring Boot REST إلى مساحة العمل وحاول تشغيلها في المرة الأولى.
git clone https://github.com/rd-1-2022/rest-service . mvn spring-boot:runيجب أن تشاهد إعلاما في GitHub Codespaces يشير إلى أن التطبيق متاح في منفذ معين. حدد فتح في المستعرض لتشغيل التطبيق في علامة تبويب مستعرض جديدة. عندما ترى صفحة خطأ التسمية البيضاء، يعمل تطبيق Spring Boot.
مرة أخرى في محطة Codespace الطرفية، أوقف التطبيق باستخدام Ctrl+C.
افتح pom.xml وأضف التبعيات التالية:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>com.azure</groupId> <artifactId>azure-ai-openai</artifactId> <version>1.0.0-beta.16</version> </dependency> <dependency> <groupId>com.azure</groupId> <artifactId>azure-core</artifactId> <version>1.55.3</version> </dependency> <dependency> <groupId>com.azure</groupId> <artifactId>azure-identity</artifactId> <version>1.16.0</version> <scope>compile</scope> </dependency>في نفس الدليل مثل Application.java (src/main/java/com/example/restservice) أضف ملف Java يسمى ChatController.java وانسخ المحتوى التالي فيه:
package com.example.restservice; import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import com.azure.ai.openai.OpenAIAsyncClient; import com.azure.ai.openai.models.ChatChoice; import com.azure.ai.openai.models.ChatCompletionsOptions; import com.azure.ai.openai.models.ChatRequestMessage; import com.azure.ai.openai.models.ChatRequestUserMessage; import com.azure.ai.openai.models.ChatResponseMessage; import com.azure.core.credential.TokenCredential; import com.azure.identity.DefaultAzureCredentialBuilder; @Configuration class AzureConfig { // Reads the endpoint from environment variable AZURE_OPENAI_ENDPOINT @Value("${azure.openai.endpoint}") private String openAiEndpoint; // Provides a credential for local dev and production @Bean public TokenCredential tokenCredential() { return new DefaultAzureCredentialBuilder().build(); } // Configures the OpenAIAsyncClient bean @Bean public OpenAIAsyncClient openAIClient(TokenCredential tokenCredential) { return new com.azure.ai.openai.OpenAIClientBuilder() .endpoint(openAiEndpoint) .credential(tokenCredential) .buildAsyncClient(); } } @Controller public class ChatController { private final OpenAIAsyncClient openAIClient; // Inject the OpenAIAsyncClient bean public ChatController(OpenAIAsyncClient openAIClient) { this.openAIClient = openAIClient; } @RequestMapping(value = "/", method = RequestMethod.GET) public String chatFormOrWithMessage(Model model, @RequestParam(value = "userMessage", required = false) String userMessage) { String aiResponse = null; if (userMessage != null && !userMessage.isBlank()) { // Create a list of chat messages List<ChatRequestMessage> chatMessages = new ArrayList<>(); chatMessages.add(new ChatRequestUserMessage(userMessage)); // Send the chat completion request String deploymentName = "gpt-4o-mini"; StringBuilder serverResponse = new StringBuilder(); var chatCompletions = openAIClient.getChatCompletions( deploymentName, new ChatCompletionsOptions(chatMessages) ).block(); if (chatCompletions != null) { for (ChatChoice choice : chatCompletions.getChoices()) { ChatResponseMessage message = choice.getMessage(); serverResponse.append(message.getContent()); } } aiResponse = serverResponse.toString(); } model.addAttribute("aiResponse", aiResponse); return "chat"; } }تلميح
لتقليل الملفات في هذا البرنامج التعليمي، تجمع التعليمات البرمجية بين Spring
@Configurationوالفئات@Controllerفي ملف واحد. في الإنتاج، يمكنك عادة فصل التكوين ومنطق العمل لقابلية الصيانة.ضمن src/main/resources، أنشئ دليل قوالب ، وأضف chat.html بالمحتوى التالي لواجهة الدردشة:
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Azure OpenAI Chat</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container py-4"> <h2 class="mb-4">Azure OpenAI Chat</h2> <form action="/" method="get" class="d-flex mb-3"> <input name="userMessage" class="form-control me-2" type="text" placeholder="Type your message..." autocomplete="off" required /> <button class="btn btn-primary" type="submit">Send</button> </form> <div class="mb-3"> <div th:if="${aiResponse}" class="alert alert-info">AI: <span th:text="${aiResponse}"></span></div> </div> </div> </body> </html>في المحطة الطرفية، قم باسترداد نقطة نهاية OpenAI:
az cognitiveservices account show \ --name $OPENAI_SERVICE_NAME \ --resource-group $RESOURCE_GROUP \ --query properties.endpoint \ --output tsvقم بتشغيل التطبيق مرة أخرى عن طريق إضافة
AZURE_OPENAI_ENDPOINTبقيمته من إخراج CLI:AZURE_OPENAI_ENDPOINT=<output-from-previous-cli-command> mvn spring-boot:runحدد فتح في المستعرض لتشغيل التطبيق في علامة تبويب مستعرض جديدة.
اكتب رسالة في مربع النص واختر إرسال، وأعط التطبيق بضع ثوان للرد بالرسالة من Azure OpenAI.
يستخدم التطبيق DefaultAzureCredential، والذي يستخدم تلقائيا مستخدم Azure CLI الذي قام بتسجيل الدخول لمصادقة الرمز المميز. لاحقا في هذا البرنامج التعليمي، ستقوم بنشر تطبيق الويب الخاص بك إلى Azure App Service وتكوينه للاتصال بأمان بمورد Azure OpenAI باستخدام الهوية المدارة. نفس الشيء DefaultAzureCredential في التعليمات البرمجية الخاصة بك يمكن الكشف عن الهوية المدارة واستخدامها للمصادقة. لا توجد حاجة إلى تعليمة برمجية إضافية.
3. النشر إلى Azure App Service وتكوين اتصال OpenAI
الآن بعد أن يعمل تطبيقك محليا، دعنا ننشره في Azure App Service ونعد اتصال خدمة إلى Azure OpenAI باستخدام الهوية المدارة.
إنشاء حزمة توزيع باستخدام Maven.
mvn clean packageأولا، انشر تطبيقك في Azure App Service باستخدام أمر
az webapp upAzure CLI . ينشئ هذا الأمر تطبيق ويب جديدا وينشر التعليمات البرمجية الخاصة بك إليه:az webapp up \ --resource-group $RESOURCE_GROUP \ --location $LOCATION \ --name $APPSERVICE_NAME \ --plan $APPSERVICE_NAME \ --sku B1 \ --runtime "JAVA:21" \ --os-type Linux \ --track-status falseقد يستغرق هذا الأمر بضع دقائق لإكماله. يقوم بإنشاء تطبيق ويب جديد في نفس مجموعة الموارد مثل مورد OpenAI الخاص بك.
بعد نشر التطبيق، أنشئ اتصال خدمة بين تطبيق الويب الخاص بك ومورد Azure OpenAI باستخدام الهوية المدارة:
az webapp connection create cognitiveservices \ --resource-group $RESOURCE_GROUP \ --name $APPSERVICE_NAME \ --target-resource-group $RESOURCE_GROUP \ --account $OPENAI_SERVICE_NAME \ --system-identityينشئ هذا الأمر اتصالا بين تطبيق الويب الخاص بك ومورد Azure OpenAI من خلال:
- إنشاء هوية مدارة معينة من قبل النظام لتطبيق الويب.
- إضافة دور مساهم OpenAI للخدمات المعرفية إلى الهوية المدارة لمورد Azure OpenAI.
-
AZURE_OPENAI_ENDPOINTإضافة إعداد التطبيق إلى تطبيق الويب الخاص بك.
افتح تطبيق الويب المنشور في المستعرض.
az webapp browseاكتب رسالة في مربع النص وحدد "إرسال، وامنح التطبيق بضع ثوان للرد بالرسالة من Azure OpenAI.
يتم الآن نشر تطبيقك وتوصيمه ب Azure OpenAI بهوية مدارة. لاحظ أنه يتم الوصول إلى AZURE_OPENAI_ENDPOINT إعداد التطبيق من خلال حقن @Configuration .
الأسئلة الشائعة
-
لماذا تستخدم
@Configurationالعينة وحبوب الربيع لعميل OpenAI؟ - ماذا لو أردت الاتصال ب OpenAI بدلا من Azure OpenAI؟
- هل يمكنني الاتصال ب Azure OpenAI باستخدام مفتاح API بدلا من ذلك؟
- كيف يعمل DefaultAzureCredential في هذا البرنامج التعليمي؟
لماذا تستخدم @Configuration العينة وحبوب الربيع لعميل OpenAI؟
يضمن استخدام زنبرك بون ل OpenAIAsyncClient ما يلي:
- يتم تحميل جميع خصائص التكوين (مثل نقطة النهاية) وحقنها بواسطة Spring.
- يتم إنشاء بيانات الاعتماد والعميل بعد تهيئة سياق التطبيق بالكامل.
- يتم استخدام إدخال التبعية، وهو النمط القياسي والأكثر قوة في تطبيقات Spring.
العميل غير المتزامن أكثر قوة، خاصة عند استخدام DefaultAzureCredential مع مصادقة Azure CLI. يمكن أن يواجه المتزامن OpenAIClient مشكلات في الحصول على الرمز المميز في بعض سيناريوهات التطوير المحلية. يؤدي استخدام العميل غير المتزامن إلى تجنب هذه المشكلات وهو النهج الموصى به.
ماذا لو أردت الاتصال ب OpenAI بدلا من Azure OpenAI؟
للاتصال ب OpenAI بدلا من ذلك، استخدم التعليمات البرمجية التالية:
OpenAIClient client = new OpenAIClientBuilder()
.credential(new KeyCredential(<openai-api-key>))
.buildClient();
لمزيد من المعلومات، راجع مصادقة OpenAI API.
عند العمل مع أسرار الاتصال في App Service، يجب عليك استخدام مراجع Key Vault بدلا من تخزين الأسرار مباشرة في قاعدة التعليمات البرمجية الخاصة بك. وهذا يضمن بقاء المعلومات الحساسة آمنة وتدار مركزيا.
هل يمكنني الاتصال ب Azure OpenAI باستخدام مفتاح API بدلا من ذلك؟
نعم، يمكنك الاتصال ب Azure OpenAI باستخدام مفتاح API بدلا من الهوية المدارة. يتم دعم هذا الأسلوب من قبل Azure OpenAI SDKs وKernel الدلالي.
- للحصول على تفاصيل حول استخدام مفاتيح API مع Kernel الدلالي: Kernel الدلالي C# Quickstart.
- للحصول على تفاصيل حول استخدام مفاتيح API مع مكتبة عميل Azure OpenAI: التشغيل السريع: بدء استخدام إكمال الدردشة باستخدام خدمة Azure OpenAI.
عند العمل مع أسرار الاتصال في App Service، يجب عليك استخدام مراجع Key Vault بدلا من تخزين الأسرار مباشرة في قاعدة التعليمات البرمجية الخاصة بك. وهذا يضمن بقاء المعلومات الحساسة آمنة وتدار مركزيا.
كيف يعمل DefaultAzureCredential في هذا البرنامج التعليمي؟
يبسط DefaultAzureCredential المصادقة عن طريق تحديد أفضل طريقة مصادقة متوفرة تلقائيا:
-
أثناء التطوير المحلي: بعد تشغيل
az login، فإنه يستخدم بيانات اعتماد Azure CLI المحلية. - عند نشره في Azure App Service: يستخدم هوية التطبيق المدارة للمصادقة الآمنة بدون كلمة مرور.
يتيح هذا الأسلوب تشغيل التعليمات البرمجية الخاصة بك بشكل آمن وسلس في كل من البيئات المحلية والسحابية دون تعديل.
الخطوات التالية
- البرنامج التعليمي: إنشاء جيل معزز للاسترداد باستخدام Azure OpenAI وAzure الذكاء الاصطناعي Search (Spring Boot)
- البرنامج التعليمي: تشغيل روبوت الدردشة في App Service مع ملحق sidecar Phi-4 (Spring Boot)
- إنشاء مورد خدمة Azure OpenAI ونشره
- تكوين Azure App Service
- تمكين الهوية المدارة لتطبيقك
- تكوين Java على Azure App Service