التشغيل السريع: الدردشة مع نماذج Azure OpenAI باستخدام بياناتك الخاصة

نماذج حزمة التعليمات البرمجية | للمصدر المرجعي | (pypi) |

تشير الارتباطات أعلاه إلى OpenAI API ل Python. لا يوجد OpenAI Python SDK خاص ب Azure. تعرف على كيفية التبديل بين خدمات OpenAI وخدمات Azure OpenAI.

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

المتطلبات الأساسية

  • اشتراك Azure - أنشئ اشتراكاً مجاناً.

  • الوصول الممنوح إلى Azure OpenAI في اشتراك Azure المطلوب.

    يتطلب Azure OpenAI التسجيل وهو متاح حاليا فقط لعملاء وشركاء المؤسسة المعتمدين. راجع وصول محدود إلى خدمة Azure OpenAI لمزيد من المعلومات. يمكنك التقدم بطلب للوصول إلى Azure OpenAI عن طريق إكمال النموذج في https://aka.ms/oai/access. افتح مشكلة على هذا المستودع للاتصال بنا إذا كانت لديك مشكلة.

  • تم نشر مورد Azure OpenAI في منطقة مدعومة بنموذج مدعوم.

  • تأكد من تعيين دور المساهم في الخدمات المعرفية لمورد Azure OpenAI على الأقل.

  • قم بتنزيل بيانات المثال من GitHub إذا لم يكن لديك بياناتك الخاصة.

إضافة بياناتك باستخدام Azure OpenAI Studio

تلميح

يمكنك استخدام Azure Developer CLI لإنشاء الموارد اللازمة ل Azure OpenAI على بياناتك برمجيا

انتقل إلى Azure OpenAI Studio وسجل الدخول باستخدام بيانات الاعتماد التي لديها حق الوصول إلى مورد Azure OpenAI. أثناء سير عمل تسجيل الدخول أو بعده، حدد الدليل المناسب واشتراك Azure ومورد Azure OpenAI.

  1. حدد لوحة إحضار البيانات الخاصة بك

    لقطة شاشة للصفحة المنتقل إليها في Azure OpenAI Studio.

  2. في الجزء الذي يظهر، حدد تحميل الملفات (معاينة) ضمن تحديد مصدر البيانات. يحتاج Azure OpenAI إلى كل من مورد تخزين ومورد بحث للوصول إلى بياناتك وفهرستها.

    تلميح

    1. لكي يصل Azure OpenAI إلى حساب التخزين الخاص بك، ستحتاج إلى تشغيل مشاركة الموارد عبر المنشأ (CORS). إذا لم يكن CORS قيد التشغيل بالفعل لمورد Azure Blob Storage، فحدد تشغيل CORS.

    2. حدد مورد Azure الذكاء الاصطناعي Search، وحدد الإقرار الذي سيؤدي إلى توصيله بتحمل الاستخدام على حسابك. بعد ذلك حدد التالي.

    لقطة شاشة تعرض خيارات تحديد مصدر بيانات في Azure OpenAI Studio.

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

  4. في جزء إدارة البيانات، يمكنك اختيار ما إذا كنت تريد تمكين البحث الدلالي أو البحث المتجه عن الفهرس الخاص بك.

    هام

    • يخضع البحث الدلالي والبحث في المتجهات لتسعير إضافي. تحتاج إلى اختيار Basic أو أعلى SKU لتمكين البحث الدلالي أو البحث المتجه. راجع الفرق في مستوى التسعير وحدود الخدمة لمزيد من المعلومات.
    • للمساعدة في تحسين جودة استرداد المعلومات واستجابة النموذج، نوصي بتمكين البحث الدلالي عن اللغات التالية لمصدر البيانات: الإنجليزية والفرنسية والإسبانية والبرتغالية والإيطالية وألمانيا والصينية (Zh) واليابانية والكورية والروسية والعربية.
  5. راجع التفاصيل التي أدخلتها، وحدد حفظ وإغلاق. يمكنك الآن الدردشة مع النموذج وسيستخدم معلومات من بياناتك لإنشاء الاستجابة.

ملعب الدردشة

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

لقطة شاشة لصفحة ملعب Azure OpenAI Studio مع تمييز الأقسام.

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

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

  • تحدد الصرامة عدوانية النظام في تصفية مستندات البحث استنادا إلى درجات التشابه الخاصة بها. يشير تعيين التقييد إلى 5 إلى أن النظام سيقوم بتصفية المستندات بقوة، وتطبيق حد تشابه عال جدا. يمكن أن يكون البحث الدلالي مفيدا في هذا السيناريو لأن نماذج تحديد المرتبة تقوم بعمل أفضل للاستدلال على هدف الاستعلام. تنتج المستويات المنخفضة من الصرامة المزيد من الإجابات المطولة، ولكنها قد تتضمن أيضا معلومات غير موجودة في الفهرس. يتم تعيين هذا إلى 3 بشكل افتراضي.

  • المستندات التي تم استردادها عبارة عن عدد صحيح يمكن تعيينه إلى 3 أو 5 أو 10 أو 20، ويتحكم في عدد مجموعات المستندات المقدمة إلى نموذج اللغة الكبيرة لصياغة الاستجابة النهائية. بشكل افتراضي، يتم تعيين هذا إلى 5.

  • عند تمكين الحد من الاستجابات لبياناتك ، يحاول النموذج الاعتماد فقط على مستنداتك للاستجابات. يتم تعيين هذا إلى صحيح بشكل افتراضي.

لقطة شاشة للإعدادات المتقدمة.

إرسال الاستعلام الأول. تعمل نماذج الدردشة بشكل أفضل في تمارين الأسئلة والأجوبة. على سبيل المثال، "ما هي خططي الصحية المتوفرة؟" أو "ما هو خيار الصحة الإضافية؟".

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

يتم تقييد الدردشات بعدد المستندات (المجموعات) التي تم إرجاعها في الاستجابة (تقتصر على 3-20 في ملعب Azure OpenAI Studio). كما يمكنك أن تتخيل، فإن طرح سؤال حول "جميع العناوين" يتطلب فحصا كاملا لمتجر المتجهات بأكمله.

استخدام نموذجك

بمجرد أن تكون راضيا عن التجربة في استوديو Azure OpenAI، يمكنك نشر تطبيق ويب مباشرة من Studio عن طريق تحديد الزر Deploy to .

لقطة شاشة تعرض زر نشر النموذج في Azure OpenAI Studio.

يمنحك هذا الخيار إما النشر إلى تطبيق ويب مستقل، أو copilot في Copilot Studio (معاينة) إذا كنت تستخدم بياناتك الخاصة على النموذج.

على سبيل المثال، إذا اخترت نشر تطبيق ويب:

في المرة الأولى التي تقوم فيها بنشر تطبيق ويب، يجب عليك تحديد إنشاء تطبيق ويب جديد. اختر اسما للتطبيق، والذي سيصبح جزءا من عنوان URL للتطبيق. على سبيل المثال، https://<appname>.azurewebsites.net

حدد الاشتراك ومجموعة الموارد والموقع وخطة التسعير للتطبيق المنشور. لتحديث تطبيق موجود، حدد نشر إلى تطبيق ويب موجود واختر اسم التطبيق السابق من القائمة المنسدلة.

إذا اخترت نشر تطبيق ويب، فشاهد الاعتبارات المهمة لاستخدامه.

استرداد المتغيرات المطلوبة

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

اسم المتغير القيمة‬
AZURE_OPENAI_ENDPOINT يمكن العثور على هذه القيمة في قسم Keys & Endpoint عند فحص مورد Azure OpenAI من مدخل Microsoft Azure. بدلا من ذلك، يمكنك العثور على القيمة في طريقة عرض Azure الذكاء الاصطناعي studio>Chat playground>Code. مثال على نقطة النهاية هو: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY يمكن العثور على هذه القيمة في قسم مفاتيح إدارة>الموارد ونقطة النهاية عند فحص مورد Azure OpenAI من مدخل Microsoft Azure. يمكنك استخدام إما KEY1 أو KEY2. يسمح لك وجود مفتاحين دائماً بتدوير المفاتيح وإعادة إنشائها بأمان دون التسبب في تعطيل الخدمة.
AZURE_OPENAI_DEPLOYMENT_ID تتوافق هذه القيمة مع الاسم المخصص الذي اخترته للتوزيع عند نشر نموذج. يمكن العثور على هذه القيمة ضمن Resource Management>Deployments في مدخل Microsoft Azure أو بدلا من ذلك ضمن Management>Deployments في Azure الذكاء الاصطناعي studio.
AZURE_AI_SEARCH_ENDPOINT يمكن العثور على هذه القيمة في قسم نظرة عامة عند فحص مورد Azure الذكاء الاصطناعي Search من مدخل Microsoft Azure.
AZURE_AI_SEARCH_API_KEY يمكن العثور على هذه القيمة في قسم الإعدادات> Keys عند فحص مورد Azure الذكاء الاصطناعي Search من مدخل Microsoft Azure. يمكنك استخدام إما مفتاح المسؤول الأساسي أو مفتاح المسؤول الثانوي. يسمح لك وجود مفتاحين دائماً بتدوير المفاتيح وإعادة إنشائها بأمان دون التسبب في تعطيل الخدمة.
AZURE_AI_SEARCH_INDEX تتوافق هذه القيمة مع اسم الفهرس الذي أنشأته لتخزين بياناتك. يمكنك العثور عليه في قسم Overview عند فحص مورد Azure الذكاء الاصطناعي Search من مدخل Microsoft Azure.

متغيرات البيئة

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

إنشاء تطبيق .NET Core جديد

في نافذة وحدة تحكم (مثل cmd أو PowerShell أو Bash)، استخدم الأمر ⁧dotnet new⁩ لإنشاء تطبيق وحدة تحكم جديد بالاسم ⁧azure-openai-quickstart⁩. ينشئ هذا الأمر مشروع "Hello World" بسيطًا مع ملف مصدر C# واحد: Program.cs.

dotnet new console -n azure-openai-quickstart

غيّر دليلك إلى مجلد التطبيق المنشأ حديثاً. يمكنك إنشاء التطبيق باستخدام:

dotnet build

يجب ألا يحتوي إخراج البناء على تحذيرات أو أخطاء.

...
Build succeeded.
 0 Warning(s)
 0 Error(s)
...

تثبيت مكتبة عميل OpenAI .NET مع:

dotnet add package Azure.AI.OpenAI --prerelease

من دليل المشروع، افتح ملف Program.cs واستبدل محتوياته بالتعليمات البرمجية التالية:

دون تدفق الاستجابة

using Azure;
using Azure.AI.OpenAI;
using System.Text.Json;
using static System.Environment;

string azureOpenAIEndpoint = GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT");
string azureOpenAIKey = GetEnvironmentVariable("AZURE_OPENAI_API_KEY");
string deploymentName = GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_ID");
string searchEndpoint = GetEnvironmentVariable("AZURE_AI_SEARCH_ENDPOINT");
string searchKey = GetEnvironmentVariable("AZURE_AI_SEARCH_API_KEY");
string searchIndex = GetEnvironmentVariable("AZURE_AI_SEARCH_INDEX");


var client = new OpenAIClient(new Uri(azureOpenAIEndpoint), new AzureKeyCredential(azureOpenAIKey));

var chatCompletionsOptions = new ChatCompletionsOptions()
{
    Messages =
    {
        new ChatRequestUserMessage("What are my available health plans?"),
    },
    AzureExtensionsOptions = new AzureChatExtensionsOptions()
    {
        Extensions =
        {
            new AzureCognitiveSearchChatExtensionConfiguration()
            {
                SearchEndpoint = new Uri(searchEndpoint),
                Key = searchKey,
                IndexName = searchIndex,
            },
        }
    },
    DeploymentName = deploymentName
};

Response<ChatCompletions> response = client.GetChatCompletions(chatCompletionsOptions);

ChatResponseMessage responseMessage = response.Value.Choices[0].Message;

Console.WriteLine($"Message from {responseMessage.Role}:");
Console.WriteLine("===");
Console.WriteLine(responseMessage.Content);
Console.WriteLine("===");

Console.WriteLine($"Context information (e.g. citations) from chat extensions:");
Console.WriteLine("===");
foreach (ChatResponseMessage contextMessage in responseMessage.AzureExtensionsContext.Messages)
{
    string contextContent = contextMessage.Content;
    try
    {
        var contextMessageJson = JsonDocument.Parse(contextMessage.Content);
        contextContent = JsonSerializer.Serialize(contextMessageJson, new JsonSerializerOptions()
        {
            WriteIndented = true,
        });
    }
    catch (JsonException)
    {}
    Console.WriteLine($"{contextMessage.Role}: {contextContent}");
}
Console.WriteLine("===");

هام

للإنتاج، استخدم طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها مثل Azure Key Vault. لمزيد من المعلومات حول أمان بيانات الاعتماد، راجع مقالة أمان خدمات Azure الذكاء الاصطناعي.

dotnet run program.cs

المخرجات

Answer from assistant:
===
The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans [^1^].
===
Context information (e.g. citations) from chat extensions:
===
tool: {
  "citations": [
    {
      "content": "...",
      "id": null,
      "title": "...",
      "filepath": "...",
      "url": "...",
      "metadata": {
        "chunking": "orignal document size=1011. Scores=3.6390076 and None.Org Highlight count=38."
      },
      "chunk_id": "2"
    },
    ...
  ],
  "intent": "[\u0022What are my available health plans?\u0022]"
}
===

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

غير متزامن مع الدفق

using Azure;
using Azure.AI.OpenAI;
using System.Text.Json;
using static System.Environment;

string azureOpenAIEndpoint = GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT");
string azureOpenAIKey = GetEnvironmentVariable("AZURE_OPENAI_API_KEY");
string deploymentName = GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_ID");
string searchEndpoint = GetEnvironmentVariable("AZURE_AI_SEARCH_ENDPOINT");
string searchKey = GetEnvironmentVariable("AZURE_AI_SEARCH_API_KEY");
string searchIndex = GetEnvironmentVariable("AZURE_AI_SEARCH_INDEX");


var client = new OpenAIClient(new Uri(azureOpenAIEndpoint), new AzureKeyCredential(azureOpenAIKey));

var chatCompletionsOptions = new ChatCompletionsOptions()
{
    DeploymentName = deploymentName,
    Messages =
    {
        new ChatRequestUserMessage("What are my available health plans?"),
    },
    AzureExtensionsOptions = new AzureChatExtensionsOptions()
    {
        Extensions =
        {
            new AzureCognitiveSearchChatExtensionConfiguration()
            {
                SearchEndpoint = new Uri(searchEndpoint),
                Key = searchKey,
                IndexName = searchIndex,
            },
        }
    }
};
await foreach (StreamingChatCompletionsUpdate chatUpdate in client.GetChatCompletionsStreaming(chatCompletionsOptions))
{
    if (chatUpdate.Role.HasValue)
    {
        Console.Write($"{chatUpdate.Role.Value.ToString().ToUpperInvariant()}: ");
    }
    if (!string.IsNullOrEmpty(chatUpdate.ContentUpdate))
    {
        Console.Write(chatUpdate.ContentUpdate);
    }
}

استرداد المتغيرات المطلوبة

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

اسم المتغير القيمة‬
AZURE_OPENAI_ENDPOINT يمكنك العثور على هذه القيمة في قسم Keys & Endpoint عند فحص مورد Azure OpenAI من مدخل Microsoft Azure. بدلا من ذلك، يمكنك العثور على القيمة في طريقة عرض Azure الذكاء الاصطناعي studio>Chat playground>Code. مثال على نقطة النهاية هو: https://my-resource.openai.azure.com.
AZURE_OPENAI_API_KEY يمكنك العثور على هذه القيمة في قسم مفاتيح إدارة>الموارد ونقطة النهاية عند فحص مورد Azure OpenAI من مدخل Microsoft Azure. يمكنك استخدام إما KEY1 أو KEY2. يسمح لك وجود مفتاحين دائماً بتدوير المفاتيح وإعادة إنشائها بأمان دون التسبب في تعطيل الخدمة.
AZURE_OPEN_AI_DEPLOYMENT_ID تتوافق هذه القيمة مع الاسم المخصص الذي اخترته للتوزيع عند نشر نموذج. يمكنك العثور على هذه القيمة ضمن Resource Management>Deployments في مدخل Microsoft Azure أو بدلا من ذلك ضمن Management>Deployments في Azure الذكاء الاصطناعي studio.
AZURE_AI_SEARCH_ENDPOINT يمكنك العثور على هذه القيمة في قسم Overview عند فحص مورد Azure الذكاء الاصطناعي Search من مدخل Microsoft Azure.
AZURE_AI_SEARCH_API_KEY يمكنك العثور على هذه القيمة في قسم الإعدادات> Keys عند فحص مورد Azure الذكاء الاصطناعي Search من مدخل Microsoft Azure. يمكنك استخدام إما مفتاح المسؤول الأساسي أو مفتاح المسؤول الثانوي. يسمح لك وجود مفتاحين دائماً بتدوير المفاتيح وإعادة إنشائها بأمان دون التسبب في تعطيل الخدمة.
AZURE_AI_SEARCH_INDEX تتوافق هذه القيمة مع اسم الفهرس الذي أنشأته لتخزين بياناتك. يمكنك العثور عليه في قسم Overview عند فحص مورد Azure الذكاء الاصطناعي Search من مدخل Microsoft Azure.

متغيرات البيئة

إشعار

يقوم Spring الذكاء الاصطناعي افتراضيا بتسمية النموذج إلى gpt-35-turbo. من الضروري فقط توفير SPRING_AI_AZURE_OPENAI_MODEL القيمة إذا قمت بنشر نموذج باسم مختلف.

export SPRING_AI_AZURE_OPENAI_ENDPOINT=REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
export SPRING_AI_AZURE_OPENAI_API_KEY=REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
export SPRING_AI_AZURE_COGNITIVE_SEARCH_ENDPOINT=REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
export SPRING_AI_AZURE_COGNITIVE_SEARCH_API_KEY=REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
export SPRING_AI_AZURE_COGNITIVE_SEARCH_INDEX=REPLACE_WITH_YOUR_INDEX_NAME_HERE
export SPRING_AI_AZURE_OPENAI_MODEL=REPLACE_WITH_YOUR_MODEL_NAME_HERE

إنشاء تطبيق Spring جديد

لا يدعم AzureCognitiveSearchChatExtensionConfiguration Spring الذكاء الاصطناعي حاليا الخيارات التي تسمح لاستعلام Azure الذكاء الاصطناعي بتغليف أسلوب Retrieval Augmented Generation (RAG) وإخفاء التفاصيل عن المستخدم. كبديل، لا يزال بإمكانك استدعاء أسلوب RAG مباشرة في التطبيق الخاص بك للاستعلام عن البيانات في فهرس Azure الذكاء الاصطناعي Search واستخدام المستندات المستردة لزيادة الاستعلام.

يدعم Spring الذكاء الاصطناعي تجريد VectorStore، ويمكنك تضمين Azure الذكاء الاصطناعي Search يمكن التفافه في تطبيق Spring الذكاء الاصطناعي VectorStore للاستعلام عن بياناتك المخصصة. ينفذ المشروع التالي VectorStore مخصصا مدعوما ب Azure الذكاء الاصطناعي Search وينفذ عمليات RAG مباشرة.

في نافذة Bash، قم بإنشاء دليل جديد لتطبيقك، وانتقل إليه.

mkdir ai-custom-data-demo && cd ai-custom-data-demo

بادر بتشغيل الأمر spring init من دليل العمل خاصتك. ينشئ هذا الأمر بنية دليل قياسية لمشروع Spring الخاص بك بما في ذلك ملف مصدر فئة Java الرئيسي وملف pom.xml المستخدم لإدارة المشاريع المستندة إلى Maven.

spring init -a ai-custom-data-demo -n AICustomData --force --build maven -x

تشبه الملفات والمجلدات التي تم إنشاؤها البنية التالية:

ai-custom-data-demo/
|-- pom.xml
|-- mvn
|-- mvn.cmd
|-- HELP.md
|-- src/
    |-- main/
    |   |-- resources/
    |   |   |-- application.properties
    |   |-- java/
    |       |-- com/
    |           |-- example/
    |               |-- aicustomdatademo/
    |                   |-- AiCustomDataApplication.java
    |-- test/
        |-- java/
            |-- com/
                |-- example/
                    |-- aicustomdatademo/
                        |-- AiCustomDataApplicationTests.java

تحرير تطبيق Spring

  1. تحرير ملف pom.xml.

    من جذر دليل المشروع، افتح ملف pom.xml في المحرر المفضل لديك أو IDE واستبدل الملف بالمحتوى التالي:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>3.2.0</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.example</groupId>
        <artifactId>ai-custom-data-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>AICustomData</name>
        <description>Demo project for Spring Boot</description>
        <properties>
            <java.version>17</java.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.experimental.ai</groupId>
                <artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId>
                <version>0.7.0-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>com.azure</groupId>
                <artifactId>azure-search-documents</artifactId>
                <version>11.6.0-beta.10</version>
                <exclusions>
                    <!-- exclude this to avoid changing the default serializer and the null-value behavior -->
                    <exclusion>
                        <groupId>com.azure</groupId>
                        <artifactId>azure-core-serializer-json-jackson</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
        <repositories>
            <repository>
                <id>spring-snapshots</id>
                <name>Spring Snapshots</name>
                <url>https://repo.spring.io/snapshot</url>
                <releases>
                    <enabled>false</enabled>
                </releases>
            </repository>
        </repositories>
    </project>
    
  2. من المجلد src/main/java/com/example/aicustomdatademo، افتح AiCustomDataApplication.java في المحرر المفضل لديك أو IDE والصقها في التعليمات البرمجية التالية:

    package com.example.aicustomdatademo;
    
    import java.util.Collections;
    import java.util.List;
    import java.util.Map;
    import java.util.Optional;
    import java.util.stream.Collectors;
    
    import org.springframework.ai.client.AiClient;
    import org.springframework.ai.document.Document;
    import org.springframework.ai.embedding.EmbeddingClient;
    import org.springframework.ai.prompt.Prompt;
    import org.springframework.ai.prompt.SystemPromptTemplate;
    import org.springframework.ai.prompt.messages.MessageType;
    import org.springframework.ai.prompt.messages.UserMessage;
    import org.springframework.ai.vectorstore.VectorStore;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    
    import com.azure.core.credential.AzureKeyCredential;
    import com.azure.core.util.Context;
    import com.azure.search.documents.SearchClient;
    import com.azure.search.documents.SearchClientBuilder;
    import com.azure.search.documents.models.IndexingResult;
    import com.azure.search.documents.models.SearchOptions;
    import com.azure.search.documents.models.RawVectorQuery;
    
    import lombok.AllArgsConstructor;
    import lombok.NoArgsConstructor;
    import lombok.Builder;
    import lombok.Data;
    import lombok.extern.jackson.Jacksonized;
    
    @SpringBootApplication
    public class AiCustomDataApplication implements CommandLineRunner
    {
        private static final String ROLE_INFO_KEY = "role";
    
        private static final String template = """
                You are a helpful assistant. Use the information from the DOCUMENTS section to augment answers.
    
                DOCUMENTS:
                {documents}
                """;
    
        @Value("${spring.ai.azure.cognitive-search.endpoint}")
        private String acsEndpoint;
    
        @Value("${spring.ai.azure.cognitive-search.api-key}")
        private String acsApiKey;
    
        @Value("${spring.ai.azure.cognitive-search.index}")
        private String acsIndexName;
    
        @Autowired
        private AiClient aiClient;
    
        @Autowired
        private EmbeddingClient embeddingClient;
    
        public static void main(String[] args) {
            SpringApplication.run(AiCustomDataApplication.class, args);
        }
    
        @Override
        public void run(String... args) throws Exception
        {
            System.out.println(String.format("Sending custom data prompt to AI service. One moment please...\r\n"));
    
            final var store = vectorStore(embeddingClient);
    
            final String question = "What are my available health plans?";
    
            final var candidateDocs = store.similaritySearch(question);
    
            final var userMessage = new UserMessage(question);
    
            final String docPrompts =
                    candidateDocs.stream().map(entry -> entry.getContent()).collect(Collectors.joining("\n"));
    
            final SystemPromptTemplate promptTemplate = new SystemPromptTemplate(template);
            final var systemMessage = promptTemplate.createMessage(Map.of("documents", docPrompts));
    
            final var prompt = new Prompt(List.of(systemMessage, userMessage));
    
            final var resps = aiClient.generate(prompt);
    
            System.out.println(String.format("Prompt created %d generated response(s).", resps.getGenerations().size()));
    
            resps.getGenerations().stream()
              .forEach(gen -> {
                  final var role = gen.getInfo().getOrDefault(ROLE_INFO_KEY, MessageType.ASSISTANT.getValue());
    
                  System.out.println(String.format("Generated respose from \"%s\": %s", role, gen.getText()));
              });
    
        }
    
        @Bean
        public VectorStore vectorStore(EmbeddingClient embeddingClient)
        {
            final SearchClient searchClient = new SearchClientBuilder()
                    .endpoint(acsEndpoint)
                    .credential(new AzureKeyCredential(acsApiKey))
                    .indexName(acsIndexName)
                    .buildClient();
            return new AzureCognitiveSearchVectorStore(searchClient, embeddingClient);
        }
    
        public static class AzureCognitiveSearchVectorStore implements VectorStore
        {
            private static final int DEFAULT_TOP_K = 4;
    
            private static final Double DEFAULT_SIMILARITY_THRESHOLD = 0.0;
    
            private SearchClient searchClient;
    
            private final EmbeddingClient embeddingClient;
    
            public AzureCognitiveSearchVectorStore(SearchClient searchClient, EmbeddingClient embeddingClient)
            {
                this.searchClient = searchClient;
                this.embeddingClient = embeddingClient;
            }
    
            @Override
            public void add(List<Document> documents)
            {
                final var docs = documents.stream().map(document -> {
    
                    final var embeddings = embeddingClient.embed(document);
    
                    return new DocEntry(document.getId(), "", document.getContent(), embeddings);
    
                }).toList();
    
                searchClient.uploadDocuments(docs);
            }
    
            @Override
            public Optional<Boolean> delete(List<String> idList)
            {
                final List<DocEntry> docIds = idList.stream().map(id -> DocEntry.builder().id(id).build())
                    .toList();
    
                var results = searchClient.deleteDocuments(docIds);
    
                boolean resSuccess = true;
    
                for (IndexingResult result : results.getResults())
                    if (!result.isSucceeded()) {
                        resSuccess = false;
                        break;
                    }
    
                return Optional.of(resSuccess);
            }
    
            @Override
            public List<Document> similaritySearch(String query)
            {
                return similaritySearch(query, DEFAULT_TOP_K);
            }
    
            @Override
            public List<Document> similaritySearch(String query, int k)
            {
                return similaritySearch(query, k, DEFAULT_SIMILARITY_THRESHOLD);
            }
    
            @Override
            public List<Document> similaritySearch(String query, int k, double threshold)
            {
                final var searchQueryVector = new RawVectorQuery()
                        .setVector(toFloatList(embeddingClient.embed(query)))
                        .setKNearestNeighborsCount(k)
                        .setFields("contentVector");
    
                final var searchResults = searchClient.search(null,
                        new SearchOptions().setVectorQueries(searchQueryVector), Context.NONE);
    
                return searchResults.stream()
                        .filter(r -> r.getScore() >= threshold)
                        .map(r -> {
    
                            final DocEntry entry = r.getDocument(DocEntry.class);
    
                            final Document doc = new Document(entry.getId(), entry.getContent(), Collections.emptyMap());
                            doc.setEmbedding(entry.getContentVector());
    
                            return doc;
                        })
                        .collect(Collectors.toList());
            }
    
            private List<Float> toFloatList(List<Double> doubleList)
            {
                return doubleList.stream().map(Double::floatValue).toList();
            }
    
        }
    
        @Data
        @Builder
        @Jacksonized
        @AllArgsConstructor
        @NoArgsConstructor
        static class DocEntry
        {
            private String id;
    
            private String hash;
    
            private String content;
    
            private List<Double> contentVector;
        }
    
    }
    

    هام

    للإنتاج، استخدم طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها مثل Azure Key Vault. لمزيد من المعلومات حول أمان بيانات الاعتماد، راجع مقالة أمان خدمات Azure الذكاء الاصطناعي.

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

    ./mvnw spring-boot:run
    

المخرجات

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.1.5)

2023-11-07T14:40:45.250-06:00  INFO 18557 --- [           main] c.e.a.AiCustomDataApplication            : No active profile set, falling back to 1 default profile: "default"
2023-11-07T14:40:46.035-06:00  INFO 18557 --- [           main] c.e.a.AiCustomDataApplication            : Started AiCustomDataApplication in 1.095 seconds (process running for 1.397)
Sending custom data prompt to AI service. One moment please...

Prompt created 1 generated response(s).
Generated response from "assistant": The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans.

استرداد المتغيرات المطلوبة

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

اسم المتغير القيمة‬
AZURE_OPENAI_ENDPOINT يمكن العثور على هذه القيمة في قسم Keys & Endpoint عند فحص مورد Azure OpenAI من مدخل Microsoft Azure. بدلا من ذلك، يمكنك العثور على القيمة في طريقة عرض Azure الذكاء الاصطناعي studio>Chat playground>Code. مثال على نقطة النهاية هو: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY يمكن العثور على هذه القيمة في قسم مفاتيح إدارة>الموارد ونقطة النهاية عند فحص مورد Azure OpenAI من مدخل Microsoft Azure. يمكنك استخدام إما KEY1 أو KEY2. يسمح لك وجود مفتاحين دائماً بتدوير المفاتيح وإعادة إنشائها بأمان دون التسبب في تعطيل الخدمة.
AZURE_OPENAI_DEPLOYMENT_ID تتوافق هذه القيمة مع الاسم المخصص الذي اخترته للتوزيع عند نشر نموذج. يمكن العثور على هذه القيمة ضمن Resource Management>Deployments في مدخل Microsoft Azure أو بدلا من ذلك ضمن Management>Deployments في Azure الذكاء الاصطناعي studio.
AZURE_AI_SEARCH_ENDPOINT يمكن العثور على هذه القيمة في قسم نظرة عامة عند فحص مورد Azure الذكاء الاصطناعي Search من مدخل Microsoft Azure.
AZURE_AI_SEARCH_API_KEY يمكن العثور على هذه القيمة في قسم الإعدادات> Keys عند فحص مورد Azure الذكاء الاصطناعي Search من مدخل Microsoft Azure. يمكنك استخدام إما مفتاح المسؤول الأساسي أو مفتاح المسؤول الثانوي. يسمح لك وجود مفتاحين دائماً بتدوير المفاتيح وإعادة إنشائها بأمان دون التسبب في تعطيل الخدمة.
AZURE_AI_SEARCH_INDEX تتوافق هذه القيمة مع اسم الفهرس الذي أنشأته لتخزين بياناتك. يمكنك العثور عليه في قسم Overview عند فحص مورد Azure الذكاء الاصطناعي Search من مدخل Microsoft Azure.

متغيرات البيئة

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

إنشاء تطبيق عقدة

في إطار نافذة وحدة التحكم (مثل cmd أو PowerShell أو Bash)، يمكنك إنشاء دليل جديد لتطبيقك وانتقل إليه. ثم قم بتشغيل npm init الأمر لإنشاء تطبيق عقدة مع ملف package.json .

npm init

تثبيت مكتبة العميل

تثبيت عميل Azure OpenAI ومكتبات هوية Azure ل JavaScript باستخدام npm:

npm install @azure/openai @azure/identity

سيتم تحديث ملف package.json الخاص بتطبيقك بالتبعيات.

إنشاء نموذج تطبيق

افتح موجه الأوامر حيث تريد المشروع الجديد، وأنشئ ملفا جديدا باسم ChatWithOwnData.js. انسخ التعليمات البرمجية التالية في ملف ChatWithOwnData.js.

const { OpenAIClient, AzureKeyCredential } = require("@azure/openai");

// Set the Azure and AI Search values from environment variables
const endpoint = process.env["AZURE_OPENAI_ENDPOINT"];
const azureApiKey = process.env["AZURE_OPENAI_API_KEY"];
const deploymentId = process.env["AZURE_OPENAI_DEPLOYMENT_ID"];
const searchEndpoint = process.env["AZURE_AI_SEARCH_ENDPOINT"];
const searchKey = process.env["AZURE_AI_SEARCH_API_KEY"];
const searchIndex = process.env["AZURE_AI_SEARCH_INDEX"];


async function main(){
  const client = new OpenAIClient(endpoint, new AzureKeyCredential(azureApiKey));

  const messages = [
    { role: "user", content: "What are my available health plans?" },
  ];

  console.log(`Message: ${messages.map((m) => m.content).join("\n")}`);

  const events = await client.streamChatCompletions(deploymentId, messages, { 
    maxTokens: 128,
    azureExtensionOptions: {
      extensions: [
        {
          type: "AzureCognitiveSearch",
          endpoint: searchEndpoint,
          key: searchKey,
          indexName: searchIndex,
        },
      ],
    },
  });
  let response = "";
  for await (const event of events) {
    for (const choice of event.choices) {
      const newText = choice.delta?.content;
      if (!!newText) {
        response += newText;
        // To see streaming results as they arrive, uncomment line below
        // console.log(newText);
      }
    }
  }
  console.log(response);
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
});



module.exports = { main };

هام

للإنتاج، استخدم طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها مثل Azure Key Vault. لمزيد من المعلومات حول أمان بيانات الاعتماد، راجع مقالة أمان خدمات Azure الذكاء الاصطناعي.

node.exe ChatWithOwnData.js

المخرجات

Message: What are my available health plans?
The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans.

استرداد المتغيرات المطلوبة

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

اسم المتغير القيمة‬
AZURE_OPENAI_ENDPOINT يمكن العثور على هذه القيمة في قسم Keys & Endpoint عند فحص مورد Azure OpenAI من مدخل Microsoft Azure. بدلا من ذلك، يمكنك العثور على القيمة في طريقة عرض Azure الذكاء الاصطناعي studio>Chat playground>Code. مثال على نقطة النهاية هو: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY يمكن العثور على هذه القيمة في قسم مفاتيح إدارة>الموارد ونقطة النهاية عند فحص مورد Azure OpenAI من مدخل Microsoft Azure. يمكنك استخدام إما KEY1 أو KEY2. يسمح لك وجود مفتاحين دائماً بتدوير المفاتيح وإعادة إنشائها بأمان دون التسبب في تعطيل الخدمة.
AZURE_OPENAI_DEPLOYMENT_ID تتوافق هذه القيمة مع الاسم المخصص الذي اخترته للتوزيع عند نشر نموذج. يمكن العثور على هذه القيمة ضمن Resource Management>Deployments في مدخل Microsoft Azure أو بدلا من ذلك ضمن Management>Deployments في Azure الذكاء الاصطناعي studio.
AZURE_AI_SEARCH_ENDPOINT يمكن العثور على هذه القيمة في قسم نظرة عامة عند فحص مورد Azure الذكاء الاصطناعي Search من مدخل Microsoft Azure.
AZURE_AI_SEARCH_API_KEY يمكن العثور على هذه القيمة في قسم الإعدادات> Keys عند فحص مورد Azure الذكاء الاصطناعي Search من مدخل Microsoft Azure. يمكنك استخدام إما مفتاح المسؤول الأساسي أو مفتاح المسؤول الثانوي. يسمح لك وجود مفتاحين دائماً بتدوير المفاتيح وإعادة إنشائها بأمان دون التسبب في تعطيل الخدمة.
AZURE_AI_SEARCH_INDEX تتوافق هذه القيمة مع اسم الفهرس الذي أنشأته لتخزين بياناتك. يمكنك العثور عليه في قسم Overview عند فحص مورد Azure الذكاء الاصطناعي Search من مدخل Microsoft Azure.

متغيرات البيئة

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

قم بإنشاء بيئة Python

  1. أنشئ مجلدا جديدا باسم openai-python لمشروعك وملف تعليمة Python البرمجية الجديد المسمى main.py. التغيير إلى هذا الدليل:
mkdir openai-python
cd openai-python
  1. تثبيت مكتبات Python التالية:
pip install openai
pip install python-dotenv

إنشاء تطبيق Python

  1. من دليل المشروع، افتح ملف main.py وأضف التعليمات البرمجية التالية:
import os
import openai
import dotenv

dotenv.load_dotenv()

endpoint = os.environ.get("AZURE_OPENAI_ENDPOINT")
api_key = os.environ.get("AZURE_OPENAI_API_KEY")
deployment = os.environ.get("AZURE_OPENAI_DEPLOYMENT_ID")

client = openai.AzureOpenAI(
    azure_endpoint=endpoint,
    api_key=api_key,
    api_version="2024-02-01",
)

completion = client.chat.completions.create(
    model=deployment,
    messages=[
        {
            "role": "user",
            "content": "What are my available health plans?",
        },
    ],
    extra_body={
        "data_sources":[
            {
                "type": "azure_search",
                "parameters": {
                    "endpoint": os.environ["AZURE_AI_SEARCH_ENDPOINT"],
                    "index_name": os.environ["AZURE_AI_SEARCH_INDEX"],
                    "authentication": {
                        "type": "api_key",
                        "key": os.environ["AZURE_AI_SEARCH_API_KEY"],
                    }
                }
            }
        ],
    }
)

print(completion.model_dump_json(indent=2))

هام

للإنتاج، استخدم طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها مثل Azure Key Vault. لمزيد من المعلومات حول أمان بيانات الاعتماد، راجع مقالة أمان خدمات Azure الذكاء الاصطناعي.

  1. تنفيذ الأمر التالي:
python main.py

يطبع التطبيق الاستجابة بتنسيق JSON مناسب للاستخدام في العديد من السيناريوهات. يتضمن كلا من إجابات الاستعلام والاقتباسات من الملفات التي تم تحميلها.

استرداد المتغيرات المطلوبة

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

اسم المتغير القيمة‬
AZURE_OPENAI_ENDPOINT يمكن العثور على هذه القيمة في قسم Keys & Endpoint عند فحص مورد Azure OpenAI من مدخل Microsoft Azure. بدلا من ذلك، يمكنك العثور على القيمة في طريقة عرض Azure الذكاء الاصطناعي studio>Chat playground>Code. مثال على نقطة النهاية هو: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY يمكن العثور على هذه القيمة في قسم مفاتيح إدارة>الموارد ونقطة النهاية عند فحص مورد Azure OpenAI من مدخل Microsoft Azure. يمكنك استخدام إما KEY1 أو KEY2. يسمح لك وجود مفتاحين دائماً بتدوير المفاتيح وإعادة إنشائها بأمان دون التسبب في تعطيل الخدمة.
AZURE_OPENAI_DEPLOYMENT_ID تتوافق هذه القيمة مع الاسم المخصص الذي اخترته للتوزيع عند نشر نموذج. يمكن العثور على هذه القيمة ضمن Resource Management>Deployments في مدخل Microsoft Azure أو بدلا من ذلك ضمن Management>Deployments في Azure الذكاء الاصطناعي studio.
AZURE_AI_SEARCH_ENDPOINT يمكن العثور على هذه القيمة في قسم نظرة عامة عند فحص مورد Azure الذكاء الاصطناعي Search من مدخل Microsoft Azure.
AZURE_AI_SEARCH_API_KEY يمكن العثور على هذه القيمة في قسم الإعدادات> Keys عند فحص مورد Azure الذكاء الاصطناعي Search من مدخل Microsoft Azure. يمكنك استخدام إما مفتاح المسؤول الأساسي أو مفتاح المسؤول الثانوي. يسمح لك وجود مفتاحين دائماً بتدوير المفاتيح وإعادة إنشائها بأمان دون التسبب في تعطيل الخدمة.
AZURE_AI_SEARCH_INDEX تتوافق هذه القيمة مع اسم الفهرس الذي أنشأته لتخزين بياناتك. يمكنك العثور عليه في قسم Overview عند فحص مورد Azure الذكاء الاصطناعي Search من مدخل Microsoft Azure.

متغيرات البيئة

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

مثال على أوامر PowerShell

تم تحسين نماذج دردشة Azure OpenAI للعمل مع المدخلات المنسقة كمحادثة. يمرر messages المتغير صفيفا من القواميس بأدوار مختلفة في المحادثة التي يحددها النظام والمستخدم والأداة والمساعد. dataSources يتصل المتغير بفهرس Azure Cognitive Search الخاص بك، ويمكن نماذج Azure OpenAI من الاستجابة باستخدام بياناتك.

لتشغيل استجابة من النموذج، يجب أن تنتهي برسالة مستخدم تشير إلى أنه دور المساعد للاستجابة.

تلميح

هناك العديد من المعلمات التي يمكنك استخدامها لتغيير استجابة النموذج، مثل temperature أو top_p. راجع الوثائق المرجعية لمزيد من المعلومات.

# Azure OpenAI metadata variables
   $openai = @{
       api_key     = $Env:AZURE_OPENAI_API_KEY
       api_base    = $Env:AZURE_OPENAI_ENDPOINT # your endpoint should look like the following https://YOUR_RESOURCE_NAME.openai.azure.com/
       api_version = '2023-07-01-preview' # this may change in the future
       name        = 'YOUR-DEPLOYMENT-NAME-HERE' #This will correspond to the custom name you chose for your deployment when you deployed a model.
   }

   $acs = @{
       search_endpoint     = 'YOUR ACS ENDPOINT' # your endpoint should look like the following https://YOUR_RESOURCE_NAME.search.windows.net/
       search_key    = 'YOUR-ACS-KEY-HERE' # or use the Get-Secret cmdlet to retrieve the value
       search_index = 'YOUR-INDEX-NAME-HERE' # the name of your ACS index
   }

   # Completion text
   $body = @{
    dataSources = @(
        @{
            type = 'AzureCognitiveSearch'
            parameters = @{
                    endpoint = $acs.search_endpoint
                    key = $acs.search_key
                    indexName = $acs.search_index
                }
        }
    )
    messages = @(
            @{
                role = 'user'
                content = 'What are my available health plans?'
            }
    )
   } | convertto-json -depth 5

   # Header for authentication
   $headers = [ordered]@{
       'api-key' = $openai.api_key
   }

   # Send a completion call to generate an answer
   $url = "$($openai.api_base)/openai/deployments/$($openai.name)/extensions/chat/completions?api-version=$($openai.api_version)"

   $response = Invoke-RestMethod -Uri $url -Headers $headers -Body $body -Method Post -ContentType 'application/json'
   return $response.choices.messages[1].content

مثال على الإخراج

The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans.

هام

للإنتاج، استخدم طريقة آمنة لتخزين بيانات الاعتماد الخاصة بك والوصول إليها مثل إدارة PowerShell السرية باستخدام Azure Key Vault. لمزيد من المعلومات حول أمان بيانات الاعتماد، راجع مقالة أمان خدمات Azure الذكاء الاصطناعي.

الدردشة مع النموذج الخاص بك باستخدام تطبيق ويب

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

استرداد المتغيرات المطلوبة

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

اسم المتغير القيمة‬
AZURE_OPENAI_ENDPOINT يمكن العثور على هذه القيمة في قسم Keys & Endpoint عند فحص مورد Azure OpenAI من مدخل Microsoft Azure. بدلا من ذلك، يمكنك العثور على القيمة في طريقة عرض Azure الذكاء الاصطناعي studio>Chat playground>Code. مثال على نقطة النهاية هو: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY يمكن العثور على هذه القيمة في قسم مفاتيح إدارة>الموارد ونقطة النهاية عند فحص مورد Azure OpenAI من مدخل Microsoft Azure. يمكنك استخدام إما KEY1 أو KEY2. يسمح لك وجود مفتاحين دائماً بتدوير المفاتيح وإعادة إنشائها بأمان دون التسبب في تعطيل الخدمة.
AZURE_OPENAI_DEPLOYMENT_ID تتوافق هذه القيمة مع الاسم المخصص الذي اخترته للتوزيع عند نشر نموذج. يمكن العثور على هذه القيمة ضمن Resource Management>Deployments في مدخل Microsoft Azure أو بدلا من ذلك ضمن Management>Deployments في Azure الذكاء الاصطناعي studio.
AZURE_AI_SEARCH_ENDPOINT يمكن العثور على هذه القيمة في قسم نظرة عامة عند فحص مورد Azure الذكاء الاصطناعي Search من مدخل Microsoft Azure.
AZURE_AI_SEARCH_API_KEY يمكن العثور على هذه القيمة في قسم الإعدادات> Keys عند فحص مورد Azure الذكاء الاصطناعي Search من مدخل Microsoft Azure. يمكنك استخدام إما مفتاح المسؤول الأساسي أو مفتاح المسؤول الثانوي. يسمح لك وجود مفتاحين دائماً بتدوير المفاتيح وإعادة إنشائها بأمان دون التسبب في تعطيل الخدمة.
AZURE_AI_SEARCH_INDEX تتوافق هذه القيمة مع اسم الفهرس الذي أنشأته لتخزين بياناتك. يمكنك العثور عليه في قسم Overview عند فحص مورد Azure الذكاء الاصطناعي Search من مدخل Microsoft Azure.

متغيرات البيئة

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

إنشاء بيئة Go

  1. أنشئ مجلدا جديدا باسم openai-go لمشروعك وملف التعليمات البرمجية Go الجديد المسمى sample.go. التغيير إلى هذا الدليل:

    mkdir openai-go
    cd openai-go
    
  2. تثبيت حزم Go التالية:

    go get github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai
    
  3. تمكين تتبع التبعية للتعليمات البرمجية الخاصة بك.

    go mod init example/azure-openai
    

إنشاء تطبيق Go

  1. من دليل المشروع، افتح ملف sample.go وأضف التعليمات البرمجية التالية:

    package main
    
    import (
     "context"
     "fmt"
     "log"
     "os"
    
     "github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai"
     "github.com/Azure/azure-sdk-for-go/sdk/azcore"
     "github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
    )
    
    func main() {
     azureOpenAIKey := os.Getenv("AZURE_OPENAI_API_KEY")
     modelDeploymentID := os.Getenv("AZURE_OPENAI_DEPLOYMENT_ID")
    
     // Ex: "https://<your-azure-openai-host>.openai.azure.com"
     azureOpenAIEndpoint := os.Getenv("AZURE_OPENAI_ENDPOINT")
    
     // Azure AI Search configuration
     searchIndex := os.Getenv("AZURE_AI_SEARCH_INDEX")
     searchEndpoint := os.Getenv("AZURE_AI_SEARCH_ENDPOINT")
     searchAPIKey := os.Getenv("AZURE_AI_SEARCH_API_KEY")
    
     if azureOpenAIKey == "" || modelDeploymentID == "" || azureOpenAIEndpoint == "" || searchIndex == "" || searchEndpoint == "" || searchAPIKey == "" {
     	fmt.Fprintf(os.Stderr, "Skipping example, environment variables missing\n")
     	return
     }
    
     keyCredential := azcore.NewKeyCredential(azureOpenAIKey)
    
     // In Azure OpenAI you must deploy a model before you can use it in your client. For more information
     // see here: https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource
     client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, nil)
    
     if err != nil {
     	//  TODO: Update the following line with your application specific error handling logic
     	log.Fatalf("ERROR: %s", err)
     }
    
     resp, err := client.GetChatCompletions(context.TODO(), azopenai.ChatCompletionsOptions{
     	Messages: []azopenai.ChatRequestMessageClassification{
     		&azopenai.ChatRequestUserMessage{Content: azopenai.NewChatRequestUserMessageContent("What are my available health plans?")},
     	},
     	MaxTokens: to.Ptr[int32](512),
     	AzureExtensionsOptions: []azopenai.AzureChatExtensionConfigurationClassification{
     		&azopenai.AzureCognitiveSearchChatExtensionConfiguration{
     			// This allows Azure OpenAI to use an Azure AI Search index.
     			//
     			// > Because the model has access to, and can reference specific sources to support its responses, answers are not only based on its pretrained knowledge
     			// > but also on the latest information available in the designated data source. This grounding data also helps the model avoid generating responses
     			// > based on outdated or incorrect information.
     			//
     			// Quote from here: https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/use-your-data
     			Parameters: &azopenai.AzureCognitiveSearchChatExtensionParameters{
     				Endpoint:  &searchEndpoint,
     				IndexName: &searchIndex,
     				Authentication: &azopenai.OnYourDataAPIKeyAuthenticationOptions{
     					Key: &searchAPIKey,
     				},
     			},
     		},
     	},
     	DeploymentName: &modelDeploymentID,
     }, nil)
    
     if err != nil {
     	//  TODO: Update the following line with your application specific error handling logic
     	log.Fatalf("ERROR: %s", err)
     }
    
     // Contains contextual information from your Azure chat completion extensions, configured above in `AzureExtensionsOptions`
     msgContext := resp.Choices[0].Message.Context
    
     fmt.Fprintf(os.Stderr, "Extensions Context Role: %s\nExtensions Context (length): %d\n",
     	*msgContext.Messages[0].Role,
     	len(*msgContext.Messages[0].Content))
    
     fmt.Fprintf(os.Stderr, "ChatRole: %s\nChat content: %s\n",
     	*resp.Choices[0].Message.Role,
     	*resp.Choices[0].Message.Content,
     )
    }
    

    هام

    للإنتاج، استخدم طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها مثل Azure Key Vault. لمزيد من المعلومات حول أمان بيانات الاعتماد، راجع مقالة أمان خدمات Azure الذكاء الاصطناعي.

  2. تنفيذ الأمر التالي:

    go run sample.go
    

    يطبع التطبيق الاستجابة بما في ذلك إجابات الاستعلام والاقتباسات من الملفات التي تم تحميلها.

استرداد المتغيرات المطلوبة

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

اسم المتغير القيمة‬
AZURE_OPENAI_ENDPOINT يمكن العثور على هذه القيمة في قسم Keys & Endpoint عند فحص مورد Azure OpenAI من مدخل Microsoft Azure. بدلا من ذلك، يمكنك العثور على القيمة في طريقة عرض Azure الذكاء الاصطناعي studio>Chat playground>Code. مثال على نقطة النهاية هو: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY يمكن العثور على هذه القيمة في قسم مفاتيح إدارة>الموارد ونقطة النهاية عند فحص مورد Azure OpenAI من مدخل Microsoft Azure. يمكنك استخدام إما KEY1 أو KEY2. يسمح لك وجود مفتاحين دائماً بتدوير المفاتيح وإعادة إنشائها بأمان دون التسبب في تعطيل الخدمة.
AZURE_OPENAI_DEPLOYMENT_ID تتوافق هذه القيمة مع الاسم المخصص الذي اخترته للتوزيع عند نشر نموذج. يمكن العثور على هذه القيمة ضمن Resource Management>Deployments في مدخل Microsoft Azure أو بدلا من ذلك ضمن Management>Deployments في Azure الذكاء الاصطناعي studio.
AZURE_AI_SEARCH_ENDPOINT يمكن العثور على هذه القيمة في قسم نظرة عامة عند فحص مورد Azure الذكاء الاصطناعي Search من مدخل Microsoft Azure.
AZURE_AI_SEARCH_API_KEY يمكن العثور على هذه القيمة في قسم الإعدادات> Keys عند فحص مورد Azure الذكاء الاصطناعي Search من مدخل Microsoft Azure. يمكنك استخدام إما مفتاح المسؤول الأساسي أو مفتاح المسؤول الثانوي. يسمح لك وجود مفتاحين دائماً بتدوير المفاتيح وإعادة إنشائها بأمان دون التسبب في تعطيل الخدمة.
AZURE_AI_SEARCH_INDEX تتوافق هذه القيمة مع اسم الفهرس الذي أنشأته لتخزين بياناتك. يمكنك العثور عليه في قسم Overview عند فحص مورد Azure الذكاء الاصطناعي Search من مدخل Microsoft Azure.

متغيرات البيئة

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

مثال على أوامر cURL

تم تحسين نماذج دردشة Azure OpenAI للعمل مع المدخلات المنسقة كمحادثة. يمرر messages المتغير صفيفا من القواميس بأدوار مختلفة في المحادثة التي يحددها النظام والمستخدم والأداة والمساعد. dataSources يتصل المتغير بفهرس Azure الذكاء الاصطناعي Search الخاص بك، ويمكن نماذج Azure OpenAI من الاستجابة باستخدام بياناتك.

لتشغيل استجابة من النموذج، يجب أن تنتهي برسالة مستخدم تشير إلى أنه دور المساعد للاستجابة.

تلميح

هناك العديد من المعلمات التي يمكنك استخدامها لتغيير استجابة النموذج، مثل temperature أو top_p. راجع الوثائق المرجعية لمزيد من المعلومات.

curl -i -X POST $AZURE_OPENAI_ENDPOINT/openai/deployments/$AZURE_OPENAI_DEPLOYMENT_ID/chat/completions?api-version=2024-02-15-preview \
-H "Content-Type: application/json" \
-H "api-key: $AZURE_OPENAI_API_KEY" \
-d \
'
{
    "data_sources": [
        {
            "type": "AzureCognitiveSearch",
            "parameters": {
                "endpoint": "'$AZURE_AI_SEARCH_ENDPOINT'",
                "key": "'$AZURE_AI_SEARCH_API_KEY'",
                "index_name": "'$AZURE_AI_SEARCH_INDEX'"
            }
        }
    ],
    "messages": [
        {
            "role": "user",
            "content": "What are my available health plans?"
        }
    ]
}
'

مثال على الإخراج

{
    "id": "12345678-1a2b-3c4e5f-a123-12345678abcd",
    "model": "gpt-4",
    "created": 1709835345,
    "object": "extensions.chat.completion",
    "choices": [
        {
            "index": 0,
            "finish_reason": "stop",
            "message": {
                "role": "assistant",
                "content": "The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans. [doc1].",
                "end_turn": true,
                "context": {
                    "citations": [
                        {
                            "content": "...",
                            "title": "...",
                            "url": "https://mysearch.blob.core.windows.net/xyz/001.txt",
                            "filepath": "001.txt",
                            "chunk_id": "0"
                        }
                    ],
                    "intent": "[\"Available health plans\"]"
                }
            }
        }
    ],
    "usage": {
        "prompt_tokens": 3779,
        "completion_tokens": 105,
        "total_tokens": 3884
    }
}

الدردشة مع النموذج الخاص بك باستخدام تطبيق ويب

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

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

إذا كنت ترغب في تنظيف مورد Azure OpenAI أو Azure الذكاء الاصطناعي Search وإزالته، يمكنك حذف المورد أو مجموعة الموارد. يؤدي حذف مجموعة الموارد إلى حذف أية موارد أخرى مقترنة بها أيضًا.

الخطوات التالية