++C قسم - ابدأ الآن
مقدمة الوحدة
ينقسم الملحق إلى الوحدات التالية:
- AIChatPlusCommon: وحدة وقت التشغيل (Runtime)، مسؤولة عن معالجة طلبات إرسال واجهات برمجة التطبيقات المختلفة للذكاء الاصطناعي وتحليل محتوى الردود.
- AIChatPlusEditor: وحدة المحرر (Editor)، المسؤولة عن تنفيذ أداة الدردشة بالذكاء الاصطناعي في المحرر.
- AIChatPlusCllama: وحدة وقت التشغيل (Runtime)، مسؤولة عن تغليف واجهة وخصائص llama.cpp، لتنفيذ نموذج ذكاء اصطناعي كبير بدون اتصال بالإنترنت.
- طرف ثالث/إل إل إم أي سي بي بي: وحدة وقت التشغيل (Runtime)، تجمع بين المكتبة الديناميكية وملفات الرأس الخاصة بـ llama.cpp.
المفاهيم الأساسية
قبل استخدام الكود المصدري، يجب فهم بعض الفئات الرئيسية وعلاقاتها فيما بينها:
طلب (طلب)
UAIChatPlus_ChatRequestBase هي الفئة الأساسية لجميع طلبات الدردشة. كل موفر API لديه فئة فرعية مقابلة:
UAIChatPlus_OpenAIChatRequest- طلب دردشة OpenAIUAIChatPlus_AzureChatRequest- طلب دردشة AzureUAIChatPlus_ClaudeChatRequest- طلب دردشة كلودUAIChatPlus_GeminiChatRequest- طلب محادثة GeminiUAIChatPlus_OllamaChatRequest- طلب دردشة أولاماUAIChatPlus_CllamaChatRequest- طلب نموذج Cllama دون اتصالUAIChatPlus_CllamaServerChatRequest- طلب خادم CllamaServer المحلي
كائن Request مسؤول عن تكوين معلمات الطلب وإرسال الطلب واستقبال ردود النداء.
المعَالِج
UAIChatPlus_ChatHandlerBase هي فئة مُعالج اختيارية تستخدم لإدارة موحدة لاستدعاءات الطلبات.
يقدم Handler التفويضات التالية:
OnStarted- يتم تشغيله عند بدء الطلبOnMessage- يتم تشغيله عند استقبال رسالة تدفقية (إخراج تدفقي)OnUpdated- يتم تشغيله عند استلام تحديثOnFinished- يتم تشغيله عند اكتمال الطلبOnFailed- يتم تشغيله عند فشل الطلب
متى نستخدم Handler؟
- عند الحاجة إلى إدارة منطق الاستدعاءات المتعددة بشكل موحد
- عند الحاجة إلى مشاركة منطق رد الاتصال بين المخططات البرمجية (بلوبرينت) و++C
- يمكن أيضًا تحقيق استماع رد الاتصال باستخدام تفويض Request مباشرةً (مثل
OnStartedListeners)
خيارات
كل موفر API لديه بنية Options المقابلة، المستخدمة لتكوين معلمات API:
FAIChatPlus_OpenAIChatRequestOptions- خيارات OpenAI (مفتاح API، النموذج، درجة الحرارة، إلخ)FAIChatPlus_ClaudeChatRequestOptions- خيارات كلودFAIChatPlus_GeminiChatRequestOptions- خيارات Gemini- انتظر...
يشمل "Options" جميع التكوينات اللازمة لاتصال واجهة برمجة التطبيقات، مثل مفتاح API وعنوان URL للنقطة الطرفية واسم النموذج ومعلمات الإنشاء وغير ذلك.
الرسائل
FAIChatPlus_ChatRequestMessage هو بنية الرسالة المرسلة إلى الذكاء الاصطناعي، وتحتوي على:
المحتوى- نَصّ المُحْتَوَىالدور- دور الرسالة (النظام/المستخدم/المساعد/المطور/الأداة)Images- مصفوفة الصور (خاصية الرؤية)Audios- مجموعة الصوتيات (ميزة Audio)ToolCallUses- طلب استدعاء الأداةToolCallResults- نتائج استدعاء الأداة
الاستجابة
كل مزود لواجهة برمجة التطبيقات (API Provider) لديه هيكل ResponseBody خاص به:
FAIChatPlus_OpenAIChatResponseBodyFAIChatPlus_ClaudeChatResponseBody- انتظر...
يتضمن ResponseBody جميع المعلومات التي تم إرجاعها من الذكاء الاصطناعي، بما في ذلك: نص الرسالة، واستهلاك الرموز المميزة (Token)، واستدعاء الأدوات، وإخراج الصوت، وما إلى ذلك.
سير العمل الأساسي للاستخدام (نمط الخطوات الخمس)
الخطوات الأساسية لإرسال طلب باستخدام AIChatPlus هي كما يلي:
#include "Common_OpenAI/AIChatPlus_OpenAIChatRequest.h"
void SendChatRequest()
{
// ===== الخطوة 1: إنشاء معالج (اختياري) =====
يستخدم Handler لإدارة ردود النداء بشكل موحد، ويمكن أيضًا استخدام تفويض Request مباشرةً
TWeakObjectPtr<UAIChatPlus_ChatHandlerBase> Handler = UAIChatPlus_ChatHandlerBase::New();
// ===== الخطوة 2: تهيئة الخيارات =====
FAIChatPlus_OpenAIChatRequestOptions Options;
Options.ApiKey = TEXT("your-api-key");
Options.Model = TEXT("gpt-4o-mini");
Options.bStream = true; // تمكين الإخراج عبر التدفق
// ===== الخطوة 3: إنشاء الطلب =====
TArray<FAIChatPlus_ChatRequestMessage> Messages;
Messages.Add({TEXT("You are a helpful assistant."), EAIChatPlus_ChatRole::System});
Messages.Add({TEXT("Hello, who are you?"), EAIChatPlus_ChatRole::User});
auto Request = UAIChatPlus_OpenAIChatRequest::CreateWithOptionsAndMessages(Options, Messages);
// ===== الخطوة 4: ربط رد النداء =====
// الطريقة أ: استخدام Handler
Handler->BindChatRequest(Request);
Handler->OnMessage.AddLambda([](const FString& Message)
{
UE_LOG(LogTemp, Display, TEXT("Stream Message: %s"), *Message);
});
Handler->OnFinished.AddLambda([](const FAIChatPlus_ChatResponseBodyBase& Response)
{
UE_LOG(LogTemp, Display, TEXT("Request Finished"));
});
Handler->OnFailed.AddLambda([](const FAIChatPlus_ResponseErrorBase& Error)
{
UE_LOG(LogTemp, Error, TEXT("Request Failed: %s"), *Error.GetDescription());
});
// الطريقة ب: الاستخدام المباشر لتفويض الطلب (بدون الحاجة إلى المُعالج)
// Request->OnMessageListeners.AddDynamic(this, &UMyClass::OnMessageReceived);
// Request->OnFinishedListeners.AddDynamic(this, &UMyClass::OnRequestFinished);
// ===== الخطوة 5: إرسال الطلب =====
Request->SendRequest();
}
الكتابة المبسَّطة
إذا لم تكن بحاجة إلى تحكم دقيق في الاستدعاء، يمكنك استخدام صيغة أكثر إيجازًا:
void SendSimpleChatRequest()
{
FAIChatPlus_OpenAIChatRequestOptions Options;
Options.ApiKey = TEXT("your-api-key");
Options.Model = TEXT("gpt-4o-mini");
Options.bStream = true;
auto Request = UAIChatPlus_OpenAIChatRequest::CreateWithOptionsAndMessages(
Options,
{
{TEXT("You are a helpful assistant."), EAIChatPlus_ChatRole::System},
{TEXT("Hello!"), EAIChatPlus_ChatRole::User}
});
// ربط Lambda مباشرةً على Request
Request->OnMessageListeners.AddLambda([](const FString& Message)
{
UE_LOG(LogTemp, Display, TEXT("Message: %s"), *Message);
});
Request->OnFinishedListeners.AddLambda([](const FAIChatPlus_PointerWrapper& ResponseWrapper)
{
auto& Response = UAIChatPlus_OpenAIChatRequest::CastWrapperToResponse(ResponseWrapper);
UE_LOG(LogTemp, Display, TEXT("Final Message: %s"), *Response.GetMessage());
});
Request->SendRequest();
}
إنشاء طلب عبر تعداد موفر واجهة برمجة التطبيقات (API)
إذا كنت تحتاج إلى تحديد موفر واجهة برمجة التطبيقات (API Provider) ديناميكيًا بناءً على التكوين، فيمكنك استخدام طريقة المصنع (Factory Method):
void CreateRequestByProvider(EAIChatPlus_ChatApiProvider Provider)
{
// إنشاء Request المقابل وفقًا للتعداد
auto Request = UAIChatPlus_ChatRequestBase::CreateByApi(Provider);
// تعيين الخيارات بناءً على النوع الفعلي
switch (Provider)
{
case EAIChatPlus_ChatApiProvider::OpenAI:
{
auto OpenAIRequest = Cast<UAIChatPlus_OpenAIChatRequest>(Request);
FAIChatPlus_OpenAIChatRequestOptions Options;
Options.ApiKey = TEXT("your-api-key");
OpenAIRequest->SetOptions(Options);
}
break;
case EAIChatPlus_ChatApiProvider::Claude:
{
auto ClaudeRequest = Cast<UAIChatPlus_ClaudeChatRequest>(Request);
FAIChatPlus_ClaudeChatRequestOptions Options;
Options.ApiKey = TEXT("your-api-key");
ClaudeRequest->SetOptions(Options);
}
break;
// ... مزودون آخرون
}
// تعيين الرسالة وإرسالها
TArray<FAIChatPlus_ChatRequestMessage> Messages;
Messages.Add({TEXT("Hello!"), EAIChatPlus_ChatRole::User});
Request->SetMessages(Messages);
Request->SendRequest();
}
تعليمات الاسترجاع
المندوبون الأساسيون للاستدعاء الخلفي (الراجع)
| التفويض | توقيت التشغيل | المعاملات |
|---|---|---|
OnStarted |
عند بدء إرسال الطلب | لا شيء |
OnMessage |
عند استقبال رسالة متدفقة (كل رمز) | const FString& Message - المحتوى المتراكم للرسالة |
OnUpdated |
عند تلقي تحديث للاستجابة | const FAIChatPlus_ResponseBodyBase& Response |
OnFinished |
عند اكتمال الطلب بنجاح | const FAIChatPlus_ResponseBodyBase& Response |
OnFailed |
عند فشل الطلب | const FAIChatPlus_ResponseErrorBase& Error |
OnMessageFinished |
عند اكتمال استلام الرسالة | const FAIChatPlus_MessageFinishedPayload& Payload |
الإخراج المتدفق مقابل الإخراج غير المتدفق
- الإخراج المتدفق (
bStream = true): سيتم تشغيلOnMessageعدة مرات، حيث يُرجع في كل مرة المحتوى المتراكم للرسائل - الإخراج غير المتدفق (
bStream = false): يتم تشغيلOnMessageمرة واحدة فقط عند الانتهاء، ويعيد الرسالة كاملة.
التالي
لمزيد من الاستخدامات التفصيلية، يُرجى الرجوع إلى الوثائق المتخصصة لمقدمي واجهة برمجة التطبيقات (API Providers):
- استخدام OpenAI / Azure
- استخدام كلود
- استخدام جيميني
- استخدام أولاما
- نموذج Cllama دون اتصال
- خادم CllamaServer المحلي
- فئة الأدوات
Original: https://wiki.disenone.site/ar
This post is protected by CC BY-NC-SA 4.0 agreement, should be reproduced with attribution.
Visitors. Total Visits. Page Visits.
هذا المنشور مترجم باستخدام ChatGPT، يُرجى تقديم الملاحظات في التغذية الراجعةأشر إلى أي نقص محتمل في النص.