معظم فرق .NET التي تضيف ميزات الذكاء الاصطناعي اليوم تنتهي بكتابة نفس البنية الأساسية: عميل HTTP، سياسة إعادة المحاولة، إدارة الأسرار لمفتاح API، وسطر الفوترة لكل رمز على بطاقة ائتمان شخص ما. Aspose.LLM تتخذ مسارًا مختلفًا. إنها حزمة NuGet تقوم بتشغيل استدلال نموذج اللغة الكبيرة داخل عمليتك الخاصة - لا خدمة للاتصال، لا مفتاح لتدويره، ولا طلب يغادر الجهاز.

هذه المقالة تُقدِّم المكتبة، وتشرح المفاهيم الثلاثة التي بُني عليها API الخاص بها، وتُرشدك خلال إنشاء تطبيق دردشة عملي. إذا كان بإمكانك إضافة إشارة إلى الحزمة، يمكنك إرسال المطالبات في بضع عشرات من السطور.

لماذا النموذج المحلي مهم

تشغيل النموذج داخل العملية يغيّر ما يمكنك بناؤه.

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

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

Aspose.LLM for .NET في ثلاثة مفاهيم

المساحة السطحية صغيرة عن قصد. تقريبًا كل ما تفعله مع Aspose.LLM يتضمن هذه الأنواع الثلاثة.

المفهومالنوعالدور
الترخيصAspose.LLM.Licenseيفعل المكتبة. استدعِ SetLicense قبل أي استخدام آخر لواجهة برمجة التطبيقات.
الإعداد المسبقe.g. Qwen25Presetيجمع ملفات النموذج مع معلمات التوليد مثل درجة حرارة العينة.
مثيل APIAsposeLLMApiنقطة الدخول. يتم إنشاؤه من إعداد مسبق، يحتفظ بالمحادثة، ويكشف عن SendMessageAsync.

الإعداد المسبق هو الأكثر إثارة للاهتمام. بدلاً من أن تضطر إلى ربط مسارات النموذج وإعدادات المُقسِّم وقيم العينة يدويًا، يجمع الإعداد المسبق مجموعة معروفة من القيم الجيدة. Qwen25Preset هو نقطة البداية الافتراضية، ويمكنك تعديل معاييره أو استبداله بإعداد مسبق مختلف لاحقًا دون لمس باقي الكود.

المتطلبات المسبقة

قبل كتابة أي كود:

  1. تثبيت الحزمة - Install-Package Aspose.LLM
  2. وضع الترخيص الخاص بك - ضع Aspose.LLM.lic في مكان يمكن للملف التنفيذي قراءته أثناء التشغيل.
  3. تحقق من ميزانية الذاكرة - إعداد Qwen25 يتطلب على الأقل 8 GB من الذاكرة العشوائية المتاحة.

للحصول على تفاصيل المنتج، راجع Aspose.LLM for .NET صفحة المنتج.

دردشتك الأولى

إليك أقصر برنامج يُجري محادثة حقيقية. لاحظ الاستدعاءات الثانية والثالثة: فإن كائن API يتتبع السياق بنفسه، لذا لا يزال النموذج يعرف من هي أليس.

ما يفعله الكود

  1. ينشئ License ويشير إلى ملف الترخيص الخاص بك.
  2. ينشئ كائن Qwen25Preset باستخدام التكوين الافتراضي له.
  3. ينشئ مثيلًا واحدًا من AsposeLLMApi من ذلك الإعداد المسبق.
  4. يرسل عدة مطالبات، جميعها تشترك في نفس المحادثة.
using Aspose.LLM;
using Aspose.LLM.Abstractions.Parameters.Presets;

var license = new Aspose.LLM.License();
license.SetLicense("Aspose.LLM.lic");

var preset = new Qwen25Preset();
using var api = AsposeLLMApi.Create(preset);

string reply = await api.SendMessageAsync("What is 2 + 2?");
Console.WriteLine(reply);
// Output: 2 + 2 equals 4.

await api.SendMessageAsync("My name is Alice.");
string reply2 = await api.SendMessageAsync("What is my name?");
Console.WriteLine(reply2);
// Output: Your name is Alice.

AsposeLLMApi.Create(preset) يُعيد عميلًا واعيًا للجلسة. كل استدعاء لـ SendMessageAsync يضيف النص إلى المحادثة الجارية، وبالتالي تحصل على سلوك متعدد الأدوار دون الحاجة لإدارة أي حالة بنفسك. إعلان using مهم - فالكائن يمتلك موارد أصلية ويحتاج إلى تحريرها.

ملاحظة: هذه العينات تتبع الوثائق الرسمية لـ Aspose ولم يتم تنفيذها في بيئة تجريبية. تحقق منها في بيئتك الخاصة قبل النشر.

ضبط سلوك طلب واحد

تستفيد الإجابات الحوارية من بعض العشوائية. أما الحسابية فلا تستفيد. بدلاً من إعادة تكوين المثيل، قم بإنشاء إعداد مسبق ثانٍ ومرره إلى الاستدعاء الوحيد الذي يحتاج إليه.

ماذا يفعل الكود

  1. ينشئ الإعداد الافتراضي ومثيل API كالمعتاد.
  2. يبني strictPreset بدرجة حرارة منخفضة للعينات.
  3. يمرره إلى SendMessageAsync عبر معامل preset.
  4. يترك الاستدعاءات اللاحقة على الإعداد الافتراضي الأصلي.
using Aspose.LLM.Abstractions.Parameters.Presets;

// Default preset used by the API instance
var defaultPreset = new Qwen25Preset();
using var api = AsposeLLMApi.Create(defaultPreset);

// A more deterministic preset, for this question only
var strictPreset = new Qwen25Preset();
strictPreset.SamplerParameters.Temperature = 0.1f;

string reply = await api.SendMessageAsync(
    "What is the square root of 144?",
    preset: strictPreset);

Console.WriteLine(reply);
// Output: The square root of 144 is 12.

SamplerParameters.Temperature يتحكم في مقدار العشوائية التي يضيفها العينة. القيم القريبة من 0.1 تنتج مخرجات شبه حتمية؛ القيم الأعلى تنتج عبارات أكثر تنوعًا. لأن الإعداد المسبق محصور على الاستدعاء، فإن التجاوز لا يتسرب إلى باقي المحادثة.

الإلغاء والمهلات

طول التوليد غير قابل للتنبؤ بالكامل، وأي طلب يستغرق وقتًا طويلاً سيحجب ما ينتظره. SendMessageAsync يقبل CancellationToken، لذا قدِّم له واحدًا.

ما يفعله الكود

  1. ينشئ CancellationTokenSource بميزانية 30 ثانية.
  2. يمرّر cts.Token إلى SendMessageAsync.
  3. يلتقط OperationCanceledException ويتعامل بانخفاض سلس.
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));

try
{
    string reply = await api.SendMessageAsync(
        "Write a 500-word essay about migration patterns of the Arctic tern.",
        cancellationToken: cts.Token);
    Console.WriteLine(reply);
}
catch (OperationCanceledException)
{
    Console.WriteLine("Generation timed out.");
}

يترك الإلغاء حالة الجلسة كما هي، لذا تستمر المحادثة بشكل طبيعي في المكالمة التالية. في معالج ASP.NET Core، قم بتمرير رمز RequestAborted الخاص بالطلب هنا أيضًا - لا يوجد سبب للاستمرار في الإنشاء لعميل قد انقطع بالفعل.

تطبيق وحدة تحكم كامل

تجميع كل ذلك: REPL يبقي جلسة واحدة نشطة طوال عمر العملية ويتعافى من فشل كل رسالة.

ماذا يفعل الكود

  1. يقوم بإعداد الترخيص والإعداد المسبق الافتراضي مرة واحدة عند بدء التشغيل.
  2. ينشئ نسخة واحدة من AsposeLLMApi للبرنامج بأكمله.
  3. يكرر طلب إدخال المستخدم حتى يكتب المستخدم quit.
  4. يرسل كل سطر ويطبع الرد.
  5. يلتقط الاستثناءات لكل رسالة بحيث لا يؤدي فشل واحد إلى إنهاء الجلسة.
using Aspose.LLM;
using Aspose.LLM.Abstractions.Parameters.Presets;

internal class SimpleChatDemo
{
    public static async Task Main()
    {
        var license = new Aspose.LLM.License();
        license.SetLicense("Aspose.LLM.lic");

var preset = new Qwen25Preset();
        using var api = AsposeLLMApi.Create(preset);

Console.WriteLine("Ask me anything. Type 'quit' to exit.");
        while (true)
        {
            Console.Write("> ");
            string? line = Console.ReadLine();
            if (line == null || line.Equals("quit", StringComparison.OrdinalIgnoreCase))
                break;

try
            {
                string reply = await api.SendMessageAsync(line);
                Console.WriteLine(reply);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error: {ex.Message}");
            }
        }
    }
}

نقطتا تصميم تستحقان النقل إلى التطبيقات الفعلية. أولاً، يتم إنشاء الكائن مرة واحدة وإعادة استخدامه - الإنشاء مكلف، وكما يوضح القسم التالي، لا يُسمح بوجود كائنات متزامنة. ثانياً، يقع كتلة try‑catch داخل الحلقة بدلاً من حولها، لذا فإن رسالة واحدة سيئة تكلفك دورة واحدة بدلاً من الجلسة بأكملها.

قيّم المكتبة باستخدام ترخيص مؤقت من صفحة ترخيص Aspose المؤقتة.

الأخطاء التي من المحتمل أن تصادفها أولاً

الخطأالسبب الشائعالحل
Not licensed for this methodملف الترخيص مفقود أو المسار غير صحيحتأكد من أن Aspose.LLM.lic قابل للقراءة من دليل العمل وأن SetLicense يتم تشغيله قبل أي استدعاء API آخر.
Only one AsposeLLMApi instance can be created at a timeوجود مثيلين نشطين في نفس الوقت، غالبًا من مصنع لكل طلبسجّل المثيل كـ singleton، أو حرّر المثيل السابق قبل إنشاء آخر.
First response takes minutesالمحرك يقوم بتنزيل الثنائيات الأصلية ووزن النموذجتوقع 5-15 دقيقة على جهاز نظيف. شغّل Create أثناء بدء التشغيل حتى لا يتحمل المستخدم التكلفة.

تستحق الصف الثاني التأكيد في سيناريوهات الخدمة. إذا كنت تقوم بربط Aspose.LLM في حاوية DI، سجّل AsposeLLMApi ككائن مفرد (singleton) وسلسلة الوصول إليه - سيفشل التسجيل كـ scoped أو transient بمجرد تداخل طلبين.

موارد إضافية

الخلاصة

Aspose.LLM يقلل “add an LLM to this .NET application” إلى ثلاثة أنواع وطريقة واحدة. الترخيص يُفعّل المكتبة، والإعداد المسبق يحدد النموذج وكيفية توليده، ونسخة AsposeLLMApi تحمل المحادثة. من هناك، SendMessageAsync يتعامل مع سؤال واحد، جلسة متعددة الأدوار، تجاوز معلمة لكل استدعاء، وتوليد طويل الأمد يمكن إلغاؤه.

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

FAQs

1. ما هو Aspose.LLM for .NET؟

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

2. هل أحتاج إلى اتصال بالإنترنت لاستخدامه؟

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

3. ما هي المتطلبات المسبقة لعينات الشيفرة؟

حزمة NuGet الخاصة بـ Aspose.LLM، ملف Aspose.LLM.lic صالح، وذاكرة RAM مجانية كافية للإعداد المختار - خطط للحصول على ما لا يقل عن 8 جيجابايت لـ Qwen25.

4. كيف يمكنني تغيير سلوك النموذج لطلب واحد؟

قم بإنشاء إعداد مسبق ثانٍ، واضبط معاييره (مثل SamplerParameters.Temperature)، ومرره إلى SendMessageAsync عبر وسيط preset. تُعيد المكالمات اللاحقة الضبط إلى الإعداد المسبق الافتراضي للنسخة.

5. كيف يمكنني إيقاف عملية توليد تستغرق وقتًا طويلاً؟

مرّر CancellationToken إلى SendMessageAsync والتقط OperationCanceledException. يبقى حالة الجلسة صامدةً بعد الإلغاء، لذا تستمر المحادثة بشكل طبيعي.

6. لماذا يكون الرد الأول بطيئًا جدًا؟

المكالمة الأولى Create تقوم بتنزيل الثنائيات الأصلية وأوزان النموذج، والتي قد تستغرق 5-15 دقيقة على جهاز نظيف. قم بتسخين المثيل عند بدء تشغيل التطبيق بدلاً من طلب المستخدم الأول.

اقرأ المزيد