هل تريد أن يحلّل تطبيقك النصوص، يكتب ملخصات، يجيب على الأسئلة، أو يقترح قرارات؟ بإمكانك فعل ذلك الآن في ساعات—not شهور. هذا الدليل العملي يريك أسرع مسارين: عبر واجهات API سحابية (مثل OpenAI/Azure) أو عبر ML.NET محليًا—مع كود جاهز.
الخريطة السريعة
- حدّد السيناريو (تلخيص/أسئلة وأجوبة/تصنيف/استخراج كيانات…).
- اختر المسار:
- API سحابية: أفضل دقة وأسهل بداية.
- ML.NET: محلي/أوفلاين أو بياناتك لا تخرج من جهازك.
- اكتب طبقة خدمة Service بسيطة تستدعي الذكاء.
- اربطها بالواجهة (WinForms/WPF/ASP.NET).
- أضِف حماية المفاتيح، حدود الاستهلاك، والتسجيل (Logging).
المسار 1: الذكاء عبر API سحابية
المتطلبات:
- .NET 8 أو 7
- مفتاح API من مزودك (OpenAI/Azure/OpenRouter…)
- حزمة System.Net.Http.Json
طبقة خدمة عامة:
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json;
public sealed class AiClient {
private readonly HttpClient _http;
public AiClient(string apiKey) {
_http = new HttpClient();
_http.BaseAddress = new Uri("https://api.openai.com/v1/");
_http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", apiKey);
}
public async Task<string> GenerateAsync(string instruction, CancellationToken ct = default) {
var payload = new {
model = "gpt-4o-mini",
messages = new[] {
new { role = "system", content = "You are a helpful assistant." },
new { role = "user", content = instruction }
}
};
using var res = await _http.PostAsJsonAsync("chat/completions", payload, ct);
res.EnsureSuccessStatusCode();
using var stream = await res.Content.ReadAsStreamAsync(ct);
using var doc = await JsonDocument.ParseAsync(stream, cancellationToken: ct);
return doc.RootElement.GetProperty("choices")[0]
.GetProperty("message")
.GetProperty("content")
.GetString() ?? string.Empty;
}
}
مثال ربط (WinForms)
private AiClient _ai = new AiClient(Environment.GetEnvironmentVariable("AI_API_KEY")!);
private async void btnAsk_Click(object sender, EventArgs e) {
btnAsk.Enabled = false;
try {
var prompt = txtPrompt.Text.Trim();
if (string.IsNullOrWhiteSpace(prompt)) return;
txtAnswer.Text = "جارٍ التفكير...";
var answer = await _ai.GenerateAsync(prompt);
txtAnswer.Text = answer;
}
catch (Exception ex) {
txtAnswer.Text = "حدث خطأ: " + ex.Message;
}
finally {
btnAsk.Enabled = true;
}
}
ملاحظات: خزّن مفتاحك في Environment Variables أو UserSecrets. أضِف Timeout وRetry وحدودًا على المدخلات.
المسار 2: الذكاء محليًا باستخدام ML.NET
يُستخدم عندما تريد أوفلاين أو بياناتك لا تغادر جهازك.
dotnet add package Microsoft.ML
dotnet add package Microsoft.ML.FastTree
using Microsoft.ML;
using Microsoft.ML.Data;
public class SentimentData { public string Text { get; set; } = ""; public bool Label { get; set; } }
public class SentimentPrediction { [ColumnName("PredictedLabel")] public bool Prediction { get; set; } public float Probability { get; set; } }
var ml = new MLContext();
var samples = new[] {
new SentimentData{ Text="الخدمة ممتازة", Label=true},
new SentimentData{ Text="التجربة سيئة جدا", Label=false},
};
var data = ml.Data.LoadFromEnumerable(samples);
var pipeline = ml.Transforms.Text.FeaturizeText("Features", nameof(SentimentData.Text))
.Append(ml.BinaryClassification.Trainers.SdcaLogisticRegression());
var model = pipeline.Fit(data);
var engine = ml.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(model);
var result = engine.Predict(new SentimentData{ Text="المنتج رائع" });
أفضل الممارسات
- تصميم الـPrompt: وضّح الدور والهدف.
- الأداء: استخدم Caching وChunking.
- الأمان: فلترة المدخلات وإخفاء المفاتيح.
- المتابعة: سجّل الطلبات والردود لمراقبة الجودة.
قالب Prompt سريع
الدور: أنت مساعد برمجي مختصر.
المهمة: لخص النص التالي في 4 نقاط تنفيذية موجهة لمدير منتج.
الإخراج: نقاط معدودة فقط.
{{TEXT}}
ماذا تبني اليوم؟
- ملخصات فواتير/تقارير يومية
- بحث دلالي داخل مستندات الشركة
- تصنيف رسائل العملاء
- مولّد مقترحات بريد/وصف منتجات
#CSharp #dotnet #ذكاء_اصطناعي #AI #MLNET #OpenAI #Azure #برمجة #تطبيقات #WinForms #WPF #ASPNetCore #Blazor
تعليقات
إرسال تعليق