البرنامج التعليمي: إضافة تلميحات إكمال نص Azure OpenAI إلى وظائفك في Visual Studio Code

توضح لك هذه المقالة كيفية استخدام Visual Studio Code لإضافة نقطة نهاية HTTP إلى تطبيق الوظائف الذي أنشأته في مقالة التشغيل السريع السابقة. عند تشغيلها، تستخدم نقطة نهاية HTTP الجديدة هذه ربط إدخال إكمال نص Azure OpenAI للحصول على تلميحات إكمال النص من نموذج البيانات الخاص بك.

خلال هذا البرنامج التعليمي، ستتعلم كيفية إنجاز هذه المهام:

  • إنشاء موارد في Azure OpenAI.
  • نشر نموذج في OpenAI المورد.
  • تعيين أذونات الوصول إلى مورد النموذج.
  • تمكين تطبيق الوظائف للاتصال ب OpenAI.
  • أضف روابط OpenAI إلى الدالة التي تم تشغيلها بواسطة HTTP.

1. التحقق من المتطلبات الأساسية

  • احصل على حق الوصول إلى Azure OpenAI في اشتراك Azure الخاص بك. إذا لم يكن قد تم منحك حق الوصول بالفعل، فأكمل هذا النموذج لطلب الوصول.
  • محاكي تخزين Azurite. بينما يمكنك أيضا استخدام حساب Azure Storage فعلي، تفترض المقالة أنك تستخدم هذا المحاكي.

2. إنشاء موارد Azure OpenAI

توضح الخطوات التالية كيفية إنشاء نموذج بيانات Azure OpenAI في مدخل Microsoft Azure.

  1. سجل الدخول باستخدام اشتراك Azure في مدخل Microsoft Azure.

  2. حدد Create a resource وابحث عن Azure OpenAI. عند تحديد موقع الخدمة، حدد إنشاء.

  3. في صفحة Create Azure OpenAI ، قم بتوفير المعلومات التالية للحاويات في علامة التبويب Basics :

    الحقل ‏‏الوصف
    الاشتراك اشتراكك، الذي تم إعداده لاستخدام Azure OpenAI.
    مجموعة الموارد مجموعة الموارد التي أنشأتها لتطبيق الوظائف في المقالة السابقة. يمكنك العثور على اسم مجموعة الموارد هذا بالنقر بزر الماوس الأيمن فوق تطبيق الوظائف في مستعرض موارد Azure، وتحديد الخصائص، ثم البحث عن resourceGroup الإعداد في ملف مورد JSON الذي تم إرجاعه.
    المنطقة من الناحية المثالية، نفس موقع تطبيق الوظائف.
    الاسم اسم وصفي لمورد خدمة Azure OpenAI، مثل mySampleOpenAI.
    مستوى التسعير مستوى التسعير للمورد. حاليا، يتوفر المستوى القياسي فقط لخدمة Azure OpenAI. لمزيد من المعلومات حول التسعير، تفضل بزيارة صفحة تسعير Azure OpenAI

    لقطة شاشة توضح كيفية تكوين مورد Azure OpenAI في مدخل Microsoft Azure.

  4. حدد Next مرتين لقبول القيم الافتراضية لكل من علامات التبويب Network و Tags . لا تحتوي الخدمة التي تقوم بإنشائها على أي قيود على الشبكة، بما في ذلك من الإنترنت.

  5. حدد Next a final time للانتقال إلى المرحلة النهائية في العملية: Review + submit.

  6. قم بتأكيد إعدادات التكوين، وحدد إنشاء.

    يعرض مدخل Microsoft Azure إعلاما عند توفر المورد الجديد. حدد Go to resource في الإعلام أو ابحث عن مورد Azure OpenAI الجديد بالاسم.

  7. في صفحة مورد Azure OpenAI للمورد الجديد، حدد انقر هنا لعرض نقاط النهاية ضمن Essentials>Endpoints. انسخ عنوان URL لنقطة النهاية والمفاتيح. احفظ هذه القيم، ستحتاج إليها لاحقا.

الآن بعد أن أصبح لديك بيانات الاعتماد للاتصال بالنموذج الخاص بك في Azure OpenAI، تحتاج إلى تعيين بيانات اعتماد الوصول هذه في إعدادات التطبيق.

3. نشر نموذج

الآن يمكنك نشر نموذج. يمكنك الاختيار من بين أحد النماذج المتوفرة المتعددة في Azure OpenAI Studio.

لنشر نموذج، اتبع الخطوات التالية:

  1. سجل الدخول إلى Azure OpenAI Studio.

  2. اختر الاشتراك ومورد Azure OpenAI الذي أنشأته، وحدد استخدام المورد.

  3. ضمن Management حدد Deployments.

  4. حدد Create new deployment وقم بتكوين الحقول التالية:

    الحقل ‏‏الوصف
    اسم النشر اختر الاسم بعناية. يتم استخدام اسم النشر في التعليمات البرمجية لاستدعاء النموذج باستخدام مكتبات العميل وواجهات برمجة تطبيقات REST، لذلك يجب الحفظ للاستخدام لاحقا.
    تحديد نموذج يختلف توفر النموذج حسب المنطقة. للحصول على قائمة بالنماذج المتوفرة لكل منطقة، راجع جدول ملخص النموذج وتوافر المنطقة.

    هام

    عند الوصول إلى النموذج عبر واجهة برمجة التطبيقات، تحتاج إلى الرجوع إلى اسم النشر بدلا من اسم النموذج الأساسي في استدعاءات واجهة برمجة التطبيقات، وهو أحد الاختلافات الرئيسية بين OpenAI وAzure OpenAI. يتطلب OpenAI اسم النموذج فقط. يتطلب Azure OpenAI دائما اسم النشر، حتى عند استخدام معلمة النموذج. في مستنداتنا، غالبا ما يكون لدينا أمثلة حيث يتم تمثيل أسماء النشر على أنها مطابقة لأسماء النماذج للمساعدة في الإشارة إلى النموذج الذي يعمل مع نقطة نهاية API معينة. في نهاية المطاف، يمكن أن تتبع أسماء النشر الخاصة بك أي اصطلاح تسمية هو الأفضل لحالة الاستخدام الخاصة بك.

  5. اقبل القيم الافتراضية لبقية الإعداد وحدد Create.

    يعرض جدول عمليات التوزيع إدخالا جديدا يتوافق مع النموذج الذي تم إنشاؤه حديثا.

لديك الآن كل ما تحتاجه لإضافة إكمال النص المستند إلى Azure OpenAI إلى تطبيق الوظائف.

4. تحديث إعدادات التطبيق

  1. في Visual Studio Code، افتح مشروع التعليمات البرمجية المحلية الذي قمت بإنشائه عند إكمال المقالة السابقة.

  2. في ملف local.settings.json في المجلد الجذر للمشروع، قم بتحديث AzureWebJobsStorage الإعداد إلى UseDevelopmentStorage=true. يمكنك تخطي هذه الخطوة إذا تم AzureWebJobsStorage تعيين الإعداد في local.settings.json إلى سلسلة الاتصال لحساب Azure Storage موجود بدلا من UseDevelopmentStorage=true.

  3. في ملف local.settings.json، أضف قيم الإعدادات التالية:

    • AZURE_OPENAI_ENDPOINT: مطلوب بواسطة ملحق الربط. قم بتعيين هذه القيمة إلى نقطة نهاية مورد Azure OpenAI الذي قمت بإنشائه سابقا.
    • AZURE_OPENAI_KEY: مطلوب بواسطة ملحق الربط. تعيين هذه القيمة إلى المفتاح لمورد Azure OpenAI.
    • CHAT_MODEL_DEPLOYMENT_NAME: يستخدم لتعريف ربط الإدخال. قم بتعيين هذه القيمة إلى الاسم الذي اخترته لنشر النموذج الخاص بك.
  4. حفظ الملف. عند النشر إلى Azure، يجب أيضا إضافة هذه الإعدادات إلى تطبيق الوظائف.

5. تسجيل ملحقات الربط

نظرا لأنك تستخدم ربط إخراج Azure OpenAI، يجب أن يكون لديك ملحق الارتباطات المقابل مثبتا قبل تشغيل المشروع.

باستثناء HTTP والمشغلات الموقتة، يتم تنفيذ الارتباطات كحزم ملحقة. لإضافة حزمة ملحق Azure OpenAI إلى مشروعك، قم بتشغيل أمر إضافة حزمة dotnet هذا في نافذة Terminal:

dotnet add package Microsoft.Azure.Functions.Worker.Extensions.OpenAI --prerelease

5. تحديث مجموعة الملحقات

للوصول إلى روابط معاينة Azure OpenAI، يجب استخدام إصدار معاينة من مجموعة الملحقات التي تحتوي على هذا الملحق.

استبدل الإعداد في extensionBundle الملف الحالي host.json ب JSON هذا:

 "extensionBundle": {
   "id": "Microsoft.Azure.Functions.ExtensionBundle.Preview",
   "version": "[4.*, 5.0.0)"
 }

الآن، يمكنك استخدام ربط إخراج Azure OpenAI في مشروعك.

6. إرجاع إكمال النص من النموذج

تنشئ التعليمات البرمجية التي تضيفها نقطة نهاية دالة whois HTTP في مشروعك الحالي. في هذه الدالة، يتم استخدام البيانات التي تم تمريرها في معلمة URL name لطلب GET لإنشاء مطالبة إكمال ديناميكيا. ترتبط هذه المطالبة الديناميكية بربط إدخال إكمال النص، والذي يقوم بإرجاع استجابة من النموذج استنادا إلى المطالبة. يتم إرجاع الإكمال من النموذج في استجابة HTTP.

  1. في ملف الفئة الموجود HttpExample ، أضف هذه using العبارة:

    using Microsoft.Azure.Functions.Worker.Extensions.OpenAI.TextCompletion;
    
  2. في نفس الملف، أضف هذه التعليمة البرمجية التي تحدد نقطة نهاية مشغل HTTP جديدة تسمى whois:

    [Function(nameof(WhoIs))]
    public IActionResult WhoIs([HttpTrigger(AuthorizationLevel.Function, Route = "whois/{name}")] HttpRequest req,
    [TextCompletionInput("Who is {name}?", Model = "%CHAT_MODEL_DEPLOYMENT_NAME%")] TextCompletionResponse response)
    {
        if(!String.IsNullOrEmpty(response.Content))
        {
            return new OkObjectResult(response.Content);
        }
        else
        {
            return new NotFoundObjectResult("Something went wrong.");
        }
    }
    
  1. pom.xml تحديث ملف المشروع لإضافة هذا المرجع إلى properties المجموعة:

    <azure-functions-java-library-openai>0.3.0-preview</azure-functions-java-library-openai>
    
  2. في نفس الملف، أضف هذه التبعية إلى dependencies المجموعة:

    <dependency>
        <groupId>com.microsoft.azure.functions</groupId>
        <artifactId>azure-functions-java-library-openai</artifactId>
        <version>${azure-functions-java-library-openai}</version>
    </dependency>
    
  3. في ملف المشروع الموجود Function.java ، أضف عبارات التالية import :

    import com.microsoft.azure.functions.openai.annotation.textcompletion.TextCompletion;
    import com.microsoft.azure.functions.openai.annotation.textcompletion.TextCompletionResponse;
    
  4. في نفس الملف، أضف هذه التعليمة البرمجية التي تحدد نقطة نهاية مشغل HTTP جديدة تسمى whois:

    @FunctionName("WhoIs")
    public HttpResponseMessage whoIs(
        @HttpTrigger(
            name = "req", 
            methods = {HttpMethod.GET},
            authLevel = AuthorizationLevel.ANONYMOUS, 
            route = "whois/{name}") 
            HttpRequestMessage<Optional<String>> request,
        @BindingName("name") String name,
        @TextCompletion(prompt = "Who is {name}?", model = "%CHAT_MODEL_DEPLOYMENT_NAME%", name = "response") TextCompletionResponse response,
        final ExecutionContext context) {
        return request.createResponseBuilder(HttpStatus.OK)
            .header("Content-Type", "application/json")
            .body(response.getContent())
            .build();
    }
    
  1. في Visual Studio Code، اضغط على F1 وفي نوع Azure Functions: Create Function...لوحة الأوامر ، حدد مشغل HTTP، واكتب اسم whoisالدالة ، واضغط على مفتاح الإدخال Enter.

  2. في ملف التعليمات البرمجية الجديد whois.js ، استبدل محتويات الملف بهذه التعليمة البرمجية:

    const { app, input } = require("@azure/functions");
    
    // This OpenAI completion input requires a {name} binding value.
    const openAICompletionInput = input.generic({
        prompt: 'Who is {name}?',
        maxTokens: '100',
        type: 'textCompletion',
        model: '%CHAT_MODEL_DEPLOYMENT_NAME%'
    })
    
    app.http('whois', {
        methods: ['GET'],
        route: 'whois/{name}',
        authLevel: 'function',
        extraInputs: [openAICompletionInput],
        handler: async (_request, context) => {
            var response = context.extraInputs.get(openAICompletionInput)
            return { body: response.content.trim() }
        }
    });
    
  1. في Visual Studio Code، اضغط على F1 وفي نوع Azure Functions: Create Function...لوحة الأوامر ، حدد مشغل HTTP، واكتب اسم whoisالدالة ، واضغط على مفتاح الإدخال Enter.

  2. في ملف التعليمات البرمجية الجديد whois.ts ، استبدل محتويات الملف بهذه التعليمة البرمجية:

    import { app, input } from "@azure/functions";
    
    // This OpenAI completion input requires a {name} binding value.
    const openAICompletionInput = input.generic({
        prompt: 'Who is {name}?',
        maxTokens: '100',
        type: 'textCompletion',
        model: '%CHAT_MODEL_DEPLOYMENT_NAME%'
    })
    
    app.http('whois', {
        methods: ['GET'],
        route: 'whois/{name}',
        authLevel: 'function',
        extraInputs: [openAICompletionInput],
        handler: async (_request, context) => {
            var response: any = context.extraInputs.get(openAICompletionInput)
            return { body: response.content.trim() }
        }
    });
    
  1. في ملف المشروع الموجود function_app.py ، أضف هذه import العبارة:

    import json
    
  2. في نفس الملف، أضف هذه التعليمة البرمجية التي تحدد نقطة نهاية مشغل HTTP جديدة تسمى whois:

    @app.route(route="whois/{name}", methods=["GET"])
    @app.text_completion_input(arg_name="response", prompt="Who is {name}?", max_tokens="100", model = "%CHAT_MODEL_DEPLOYMENT_NAME%")
    def whois(req: func.HttpRequest, response: str) -> func.HttpResponse:
        response_json = json.loads(response)
        return func.HttpResponse(response_json["content"], status_code=200)
    
    
    @app.route(route="genericcompletion", methods=["POST"])
    @app.text_completion_input(arg_name="response", prompt="{Prompt}", model = "%CHAT_MODEL_DEPLOYMENT_NAME%")
    def genericcompletion(req: func.HttpRequest, response: str) -> func.HttpResponse:
        response_json = json.loads(response)
        return func.HttpResponse(response_json["content"], status_code=200)
    
  1. في Visual Studio Code، اضغط على F1 وفي نوع Azure Functions: Create Function...لوحة الأوامر ، حدد مشغل HTTP، واكتب اسم whoisالدالة ، وحدد مجهول، واضغط على مفتاح الإدخال Enter.

  2. افتح ملف التعليمات البرمجية الجديد whois/function.json واستبدل محتوياته بهذه التعليمة البرمجية، والتي تضيف تعريفا لربط TextCompletionResponse الإدخال:

    {
      "bindings": [
        {
          "authLevel": "function",
          "type": "httpTrigger",
          "direction": "in",
          "name": "Request",
          "route": "whois/{name}",
          "methods": [
            "get"
          ]
        },
        {
          "type": "http",
          "direction": "out",
          "name": "Response"
        },
        {
          "type": "textCompletion",
          "direction": "in",
          "name": "TextCompletionResponse",
          "prompt": "Who is {name}?",
          "maxTokens": "100",
          "model": "%CHAT_MODEL_DEPLOYMENT_NAME%"
        }
      ]
    }
    
  3. استبدل محتوى ملف التعليمات البرمجية whois/run.ps1 بهذه التعليمة البرمجية، والتي ترجع استجابة ربط الإدخال:

    using namespace System.Net
    
    param($Request, $TriggerMetadata, $TextCompletionResponse)
    
    Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
            StatusCode = [HttpStatusCode]::OK
            Body       = $TextCompletionResponse.Content
        })
    

7. تشغيل الدالة

  1. في Visual Studio Code، اضغط على F1 وفي نوع Azurite: Start لوحة الأوامر واضغط على Enter لبدء تشغيل محاكي تخزين Azurite.

  2. اضغط على F5 لبدء مشروع تطبيق الوظائف والأدوات الأساسية في وضع التصحيح.

  3. مع تشغيل Core Tools، أرسل طلب GET إلى دالة whois نقطة النهاية، مع اسم في المسار، مثل عنوان URL هذا:

    http://localhost:7071/api/whois/<NAME>

    <NAME> استبدل السلسلة بالقيمة التي تريد تمريرها إلى المطالبة"Who is {name}?". <NAME> يجب أن يكون الاسم المشفر بعنوان URL لشخصية عامة، مثل Abraham%20Lincoln.

    الاستجابة التي تراها هي استجابة إكمال النص من نموذج Azure OpenAI.

  4. بعد إرجاع الاستجابة، اضغط Ctrl + C لإيقاف Core Tools.

8- تنظيف الموارد

تشير الموارد في Azure إلى التطبيقات الخاصة بالوظيفة والوظائف وحسابات التخزين وما إلى ذلك. يتم تجميعها في مجموعات الموارد،ويمكنك حذف كل شيء في مجموعة بحذف المجموعة.

أنشأت موارد لإنجاز قوالب التشغيل السريع هذه. يمكن أن تتم محاسبتك على هذه الموارد، اعتمادا على حالة حسابك وأسعار الخدمة. إذا لم تعد بحاجة إلى الموارد على الإطلاق، فإليك كيفية حذفها:

  1. لفتح لوحة الأوامر في تعليمة Visual Studio البرمجية، اضغط على F1. في لوحة الأوامر، ابحث عن Azure: Open in portal واختره.

  2. اختر التطبيق الخاص بالوظائف، واضغط زر Enter. تفتح صفحة تطبيق الوظيفة في مدخل Microsoft Azure.

  3. في علامة التبويب نظرة عامة حدد الارتباط المسمى بجوار Resource group.

    لقطة شاشة تعرض تحديد مجموعة الموارد لحذفها من صفحة تطبيق الوظائف.

  4. في صفحة مجموعة الموارد، راجع قائمة الموارد المدرجة وتحقق من أنها هي التي تريد حذفها.

  5. حدد حذف مجموعة الموارد، واتبع الإرشادات.

    قد يستغرق الحذف دقيقتين. عند الانتهاء من ذلك، يظهر تنبيه لبضع ثوان. يمكنك أيضا تحديد رمز الجرس في أعلى الصفحة لعرض التنبيه.