يتيح LLM for Unity التكامل السلس لنماذج اللغات الكبيرة (LLMs) داخل محرك Unity.
فهو يسمح بإنشاء شخصيات ذكية يمكن للاعبين التفاعل معها للحصول على تجربة غامرة.
تتميز الحزمة أيضًا بنظام توليد الاسترجاع المعزز (RAG) الذي يسمح بإجراء بحث دلالي عبر بياناتك، والذي يمكن استخدامه لتعزيز معرفة الشخصية. تم إنشاء LLM for Unity أعلى مكتبة llama.cpp الرائعة.
؟ تم اختباره على Unity: 2021 LTS، 2022 LTS، 2023
؟ الإصدارات القادمة
تواصل معنا لإضافة مشروعك!
الطريقة الأولى: التثبيت باستخدام مخزن الأصول
Add to My Assets
Window > Package Manager
Packages: My Assets
من القائمة المنسدلةLLM for Unity
، وانقر فوق Download
ثم Import
الطريقة الثانية: التثبيت باستخدام GitHub repo:
Window > Package Manager
+
وحدد Add package from git URL
https://github.com/undreamai/LLMUnity.git
وانقر فوق Add
أولاً ستقوم بإعداد LLM للعبتك؟:
Add Component
وحدد البرنامج النصي LLM.Download Model
(~جيجابايت).Load model
(راجع إدارة نموذج LLM).ثم يمكنك إعداد كل شخصية من شخصياتك على النحو التالي؟♀️:
Add Component
وحدد البرنامج النصي LLMCharacter.Prompt
. يمكنك تحديد اسم الذكاء الاصطناعي ( AI Name
) واللاعب ( Player Name
).LLM
إذا كان لديك أكثر من LLM GameObjects.يمكنك أيضًا ضبط إعدادات LLM والشخصيات وفقًا لتفضيلاتك (انظر الخيارات).
في البرنامج النصي الخاص بك يمكنك بعد ذلك استخدامه على النحو التالي؟:
using LLMUnity ;
public class MyScript {
public LLMCharacter llmCharacter ;
void HandleReply ( string reply ) {
// do something with the reply from the model
Debug . Log ( reply ) ;
}
void Game ( ) {
// your game function
.. .
string message = " Hello bot! " ;
_ = llmCharacter . Chat ( message , HandleReply ) ;
.. .
}
}
يمكنك أيضًا تحديد وظيفة للاتصال بها عند اكتمال الرد النموذجي.
يعد هذا مفيدًا إذا تم تمكين خيار Stream
للإخراج المستمر من النموذج (السلوك الافتراضي):
void ReplyCompleted ( ) {
// do something when the reply from the model is complete
Debug . Log ( " The AI replied " ) ;
}
void Game ( ) {
// your game function
.. .
string message = " Hello bot! " ;
_ = llmCharacter . Chat ( message , HandleReply , ReplyCompleted ) ;
.. .
}
لإيقاف الدردشة دون انتظار اكتمالها يمكنك استخدام:
llmCharacter . CancelRequests ( ) ;
هذا كل شيء ✨!
يمكنك أيضًا:
لإنشاء تطبيق Android، يتعين عليك تحديد الواجهة الخلفية للبرمجة النصية IL2CPP
و ARM64
كبنية مستهدفة في إعدادات المشغل.
يمكن الوصول إلى هذه الإعدادات من قائمة Edit > Project Settings
داخل قسم " Player > Other Settings
.
إنها فكرة جيدة أيضًا تمكين خيار Download on Build
في LLM GameObject لتنزيل النموذج عند الإطلاق من أجل الحفاظ على حجم التطبيق صغيرًا.
لحفظ/تحميل سجل الدردشة تلقائيًا، يمكنك تحديد معلمة Save
LLMCharacter إلى اسم الملف (أو المسار النسبي) الذي تختاره. يتم حفظ الملف في المجلد المستمرDataPath الخاص بـ Unity. يؤدي هذا أيضًا إلى حفظ حالة LLM مما يعني أن المطالبة المخزنة مؤقتًا مسبقًا لا تحتاج إلى إعادة حسابها.
لحفظ سجل الدردشة يدويًا، يمكنك استخدام:
llmCharacter . Save ( " filename " ) ;
و لتحميل التاريخ:
llmCharacter . Load ( " filename " ) ;
حيث اسم الملف هو اسم الملف أو المسار النسبي الذي تختاره.
void WarmupCompleted ( ) {
// do something when the warmup is complete
Debug . Log ( " The AI is nice and ready " ) ;
}
void Game ( ) {
// your game function
.. .
_ = llmCharacter . Warmup ( WarmupCompleted ) ;
.. .
}
الوسيطة الأخيرة لوظيفة Chat
هي قيمة منطقية تحدد ما إذا كنت تريد إضافة الرسالة إلى السجل (الافتراضي: صحيح):
void Game ( ) {
// your game function
.. .
string message = " Hello bot! " ;
_ = llmCharacter . Chat ( message , HandleReply , ReplyCompleted , false ) ;
.. .
}
void Game ( ) {
// your game function
.. .
string message = " The cat is away " ;
_ = llmCharacter . Complete ( message , HandleReply , ReplyCompleted ) ;
.. .
}
لهذا يمكنك استخدام وظيفة async
/ await
:
async void Game ( ) {
// your game function
.. .
string message = " Hello bot! " ;
string reply = await llmCharacter . Chat ( message , HandleReply , ReplyCompleted ) ;
Debug . Log ( reply ) ;
.. .
}
using UnityEngine ;
using LLMUnity ;
public class MyScript : MonoBehaviour
{
LLM llm ;
LLMCharacter llmCharacter ;
async void Start ( )
{
// disable gameObject so that theAwake is not called immediately
gameObject . SetActive ( false ) ;
// Add an LLM object
llm = gameObject . AddComponent < LLM > ( ) ;
// set the model using the filename of the model.
// The model needs to be added to the LLM model manager (see LLM model management) by loading or downloading it.
// Otherwise the model file can be copied directly inside the StreamingAssets folder.
llm . SetModel ( " Phi-3-mini-4k-instruct-q4.gguf " ) ;
// optional: you can also set loras in a similar fashion and set their weights (if needed)
llm . AddLora ( " my-lora.gguf " ) ;
llm . SetLoraWeight ( 0.5f ) ;
// optional: you can set the chat template of the model if it is not correctly identified
// You can find a list of chat templates in the ChatTemplate.templates.Keys
llm . SetTemplate ( " phi-3 " ) ;
// optional: set number of threads
llm . numThreads = - 1 ;
// optional: enable GPU by setting the number of model layers to offload to it
llm . numGPULayers = 10 ;
// Add an LLMCharacter object
llmCharacter = gameObject . AddComponent < LLMCharacter > ( ) ;
// set the LLM object that handles the model
llmCharacter . llm = llm ;
// set the character prompt
llmCharacter . SetPrompt ( " A chat between a curious human and an artificial intelligence assistant. " ) ;
// set the AI and player name
llmCharacter . AIName = " AI " ;
llmCharacter . playerName = " Human " ;
// optional: set streaming to false to get the complete result in one go
// llmCharacter.stream = true;
// optional: set a save path
// llmCharacter.save = "AICharacter1";
// optional: enable the save cache to avoid recomputation when loading a save file (requires ~100 MB)
// llmCharacter.saveCache = true;
// optional: set a grammar
// await llmCharacter.SetGrammar("json.gbnf");
// re-enable gameObject
gameObject . SetActive ( true ) ;
}
}
يمكنك استخدام خادم بعيد لتنفيذ المعالجة وتنفيذ الشخصيات التي تتفاعل معه.
إنشاء الخادم
لإنشاء الخادم:
LLM
كما هو موضح أعلاهRemote
الخاص بـ LLM
وقم بتكوين معلمات الخادم بشكل اختياري: المنفذ ومفتاح API وشهادة SSL ومفتاح SSLوبدلاً من ذلك، يمكنك استخدام خادم ثنائي لتسهيل النشر:
windows-cuda-cu12.2.0
. إنشاء الشخصيات
أنشئ مشروعًا ثانيًا بشخصيات اللعبة باستخدام البرنامج النصي LLMCharacter
كما هو موضح أعلاه. قم بتمكين الخيار Remote
وقم بتكوين المضيف بعنوان IP (يبدأ بـ "http://") ومنفذ الخادم.
يمكن استخدام وظيفة Embeddings
للحصول على إضافات العبارة:
List < float > embeddings = await llmCharacter . Embeddings ( " hi, how are you? " ) ;
يمكن العثور على وثائق مفصلة عن مستوى الوظيفة هنا:
تطبق LLM for Unity وظيفة بحث تشابه فائقة السرعة باستخدام نظام الاسترجاع المعزز (RAG).
يعتمد ذلك على وظيفة LLM والبحث التقريبي لأقرب الجيران (ANN) من مكتبة userarch.
البحث الدلالي يعمل على النحو التالي.
بناء البيانات يمكنك توفير مدخلات نصية (عبارة، فقرة، مستند) لإضافتها إلى البيانات.
يتم تقسيم كل إدخال إلى أجزاء (اختياري) ويتم ترميزه في التضمينات باستخدام LLM.
البحث يمكنك بعد ذلك البحث عن إدخال نص الاستعلام.
يتم تشفير الإدخال مرة أخرى ويتم استرداد المدخلات النصية أو الأجزاء الأكثر تشابهًا في البيانات.
لاستخدام البحث الدلالي:
Add Component
وحدد البرنامج النصي RAG
.SimpleSearch
هو بحث بسيط يعتمد على القوة الغاشمة، في حين أن DBSearch
هو أسلوب ANN سريع ينبغي تفضيله في معظم الحالات.وبدلاً من ذلك، يمكنك إنشاء RAG من التعليمات البرمجية (حيث يكون llm هو LLM الخاص بك):
RAG rag = gameObject . AddComponent < RAG > ( ) ;
rag . Init ( SearchMethods . DBSearch , ChunkingMethods . SentenceSplitter , llm ) ;
في البرنامج النصي الخاص بك يمكنك بعد ذلك استخدامه على النحو التالي؟:
using LLMUnity ;
public class MyScript : MonoBehaviour
{
RAG rag ;
async void Game ( ) {
.. .
string [ ] inputs = new string [ ] {
" Hi! I'm a search system. " ,
" the weather is nice. I like it. " ,
" I'm a RAG system "
} ;
// add the inputs to the RAG
foreach ( string input in inputs ) await rag . Add ( input ) ;
// get the 2 most similar inputs and their distance (dissimilarity) to the search query
( string [ ] results , float [ ] distances ) = await rag . Search ( " hello! " , 2 ) ;
// to get the most similar text parts (chnuks) you can enable the returnChunks option
rag . ReturnChunks ( true ) ;
( results , distances ) = await rag . Search ( " hello! " , 2 ) ;
.. .
}
}
يمكنك حفظ حالة RAG (المخزنة في مجلد Assets/StreamingAssets
):
rag . Save ( " rag.zip " ) ;
وتحميله من القرص:
await rag . Load ( " rag.zip " ) ;
يمكنك استخدام RAG لتغذية LLM بالبيانات ذات الصلة بناءً على رسالة المستخدم:
string message = " How is the weather? " ;
( string [ ] similarPhrases , float [ ] distances ) = await rag . Search ( message , 3 ) ;
string prompt = " Answer the user query based on the provided data. n n " ;
prompt += $" User query: { message } n n " ;
prompt += $" Data: n " ;
foreach ( string similarPhrase in similarPhrases ) prompt += $" n - { similarPhrase } " ;
_ = llmCharacter . Chat ( prompt , HandleReply , ReplyCompleted ) ;
تشتمل عينة RAG
على مثال لتطبيق RAG بالإضافة إلى مثال لتكامل RAG-LLM.
هذا كل شيء ✨!
يستخدم LLM for Unity مدير نماذج يسمح بتحميل أو تنزيل LLMs وشحنها مباشرة في لعبتك.
يمكن العثور على مدير النموذج كجزء من LLM GameObject:
يمكنك تنزيل النماذج باستخدام زر Download model
.
يتضمن LLM for Unity نماذج مختلفة ومتطورة مدمجة لأحجام مختلفة من النماذج، والتي تم قياسها باستخدام طريقة Q4_K_M.
يمكن تنزيل النماذج البديلة من HuggingFace بتنسيق .gguf.
يمكنك تنزيل نموذج محليًا وتحميله باستخدام زر Load model
، أو نسخ عنوان URL في حقل Download model > Custom URL
لتنزيله مباشرةً.
إذا كان نموذج HuggingFace لا يوفر ملف gguf، فيمكن تحويله إلى gguf باستخدام هذا المحول عبر الإنترنت.
يتم تحديد قالب الدردشة المستخدم لإنشاء المطالبات تلقائيًا من النموذج (في حالة وجود إدخال ذي صلة) أو من اسم النموذج.
إذا تم تحديده بشكل غير صحيح، فيمكنك تحديد قالب آخر من القائمة المنسدلة لقالب الدردشة.
يتم نسخ النماذج المضافة في مدير النماذج إلى اللعبة أثناء عملية البناء.
يمكنك حذف نموذج من الإنشاء عن طريق إلغاء تحديد خانة الاختيار "إنشاء".
لإزالة النموذج (ولكن ليس حذفه من القرص)، يمكنك النقر فوق زر سلة المهملات.
يتم عرض المسار وعنوان URL (إذا تم تنزيله) لكل نموذج مضاف في العرض الموسع لوصول مدير النموذج باستخدام الزر >>
:
يمكنك إنشاء تصميمات أخف عن طريق تحديد خيار Download on Build
.
باستخدام هذا الخيار، سيتم تنزيل النماذج في المرة الأولى التي تبدأ فيها اللعبة بدلاً من نسخها في الإصدار.
إذا قمت بتحميل نموذج محليًا، فستحتاج إلى تعيين عنوان URL الخاص به من خلال العرض الموسع، وإلا فسيتم نسخه في الإنشاء.
❕ قبل استخدام أي موديل تأكد من التحقق من الترخيص الخاص به ❕
يحتوي المجلد Samples~ على عدة أمثلة للتفاعل؟:
لتثبيت العينة:
Window > Package Manager
LLM for Unity
. من علامة التبويب Samples
"، انقر فوق Import
بجوار النموذج الذي تريد تثبيته. يمكن تشغيل العينات باستخدام المشهد Scene.unity
الموجود داخل المجلد الخاص بها.
في المشهد، حدد LLM
GameObject وانقر فوق زر Download Model
لتنزيل نموذج افتراضي أو Load model
لتحميل النموذج الخاص بك (راجع إدارة نموذج LLM).
احفظ المشهد، اركض واستمتع!
Show/Hide Advanced Options
قم بالتبديل لإظهار/إخفاء الخيارات المتقدمة من الأسفلLog Level
حدد مدى تفصيل رسائل السجلUse extras
لتحديد التثبيت والسماح باستخدام الميزات الإضافية (انتباه الفلاش وكميات الذكاء) حدد Remote
لتوفير الوصول عن بعد إلى LLM
منفذ Port
لتشغيل خادم LLM (إذا تم ضبط Remote
)
Num Threads
عدد المواضيع المراد استخدامها (الافتراضي: -1 = الكل)
Num GPU Layers
هو عدد طبقات النموذج التي سيتم تحميلها إلى وحدة معالجة الرسومات (GPU). إذا تم التعيين على 0، فلن يتم استخدام وحدة معالجة الرسومات. استخدم رقمًا كبيرًا، أي > 30 للاستفادة من وحدة معالجة الرسومات قدر الإمكان. لاحظ أن القيم الأعلى لحجم السياق ستستخدم المزيد من VRAM. إذا لم يتم دعم وحدة معالجة الرسومات (GPU) الخاصة بالمستخدم، فسوف يعود LLM إلى وحدة المعالجة المركزية (CPU).
حدد Debug
لتسجيل إخراج النموذج في محرر الوحدة
Parallel Prompts
بعدد المطالبات/الفتحات التي يمكن أن تحدث بالتوازي (الافتراضي: -1 = عدد كائنات LLMCharacter). لاحظ أن حجم السياق مقسم بين الفتحات. على سبيل المثال، فإن تعيين Parallel Prompts
على 1 والفتحة 0 لجميع كائنات LLMCharacter سوف يستخدم السياق الكامل، ولكن يجب حساب الموجه بالكامل (بدون تخزين مؤقت) عند استخدام كائن LLMCharacter للدردشة.
Dont Destroy On Load
حدد عدم تدمير LLM GameObject عند تحميل مشهد جديد API key
مفتاح API الذي سيتم استخدامه للسماح بالوصول إلى الطلبات من كائنات LLMCharacter (إذا تم تعيين Remote
)
Load SSL certificate
بتحميل شهادة SSL للتشفير الشامل للطلبات (إذا تم تعيين Remote
). يتطلب مفتاح SSL أيضًا.Load SSL key
بتحميل مفتاح SSL لتشفير الطلبات من طرف إلى طرف (إذا تم ضبط Remote
). يتطلب شهادة SSL كذلك.SSL certificate path
شهادة SSL المستخدمة لتشفير الطلبات من طرف إلى طرف (إذا تم تعيين Remote
).SSL key path
هو مفتاح SSL المستخدم لتشفير الطلبات من طرف إلى طرف (إذا تم تعيين Remote
). Download model
انقر لتنزيل أحد النماذج الافتراضية
Load model
انقر لتحميل النموذج الخاص بك بتنسيق gguf
يتيح Download on Start
إمكانية تنزيل نماذج LLM في المرة الأولى التي تبدأ فيها اللعبة. وبدلاً من ذلك، سيتم نسخ نماذج LLM مباشرة في الإنشاء
Context Size
للسياق الفوري (0 = حجم سياق النموذج)Download lora
انقر لتنزيل نموذج LoRA بتنسيق .ggufLoad lora
انقر لتحميل نموذج LoRA بتنسيق .ggufBatch Size
حجم الدفعة للمعالجة السريعة (الافتراضي: 512)Model
مسار النموذج المستخدم (بالنسبة إلى مجلد الأصول/StreamingAssets)Chat Template
هو قالب الدردشة المستخدم في LLMLora
مسار LoRAs المستخدم (نسبة إلى مجلد الأصول/StreamingAssets)Lora Weights
أوزان LoRAs المستخدمةFlash Attention
لاستخدام انتباه Flash في النموذج (إذا تم تمكين Use extras
) Base Prompt
موجه أساسي مشترك لاستخدامه عبر جميع كائنات LLMCharacter باستخدام LLM
Show/Hide Advanced Options
قم بالتبديل لإظهار/إخفاء الخيارات المتقدمة من الأسفلLog Level
حدد مدى تفصيل رسائل السجلUse extras
لتحديد التثبيت والسماح باستخدام الميزات الإضافية (انتباه الفلاش وكميات الذكاء) Remote
سواء كان LLM المستخدم بعيدًا أو محليًاLLM
the LLM GameObject (إذا لم يتم تعيين Remote
)Hort
IP لخادم LLM (إذا تم تعيين Remote
)Port
لخادم LLM (إذا تم ضبط Remote
)Num Retries
إعادة المحاولة لطلب HTTP من خادم LLM (إذا تم تعيين Remote
)API key
مفتاح API لخادم LLM (إذا تم تعيين Remote
)Save
حفظ اسم الملف أو المسار النسبيSave Cache
لحفظ حالة LLM مع سجل الدردشة. تبلغ حالة LLM عادةً حوالي 100 ميجا بايت +.Debug Prompt
لتسجيل المطالبات التي تم إنشاؤها في Unity Editor Player Name
اسم اللاعبAI Name
اسم AIPrompt
لدور الذكاء الاصطناعي حدد Stream
لتلقي الرد من النموذج فور إنتاجه (مستحسن!).
إذا لم يتم تحديده، فسيتم استلام الرد الكامل من النموذج دفعة واحدة
Num Predict
الحد الأقصى لعدد الرموز المميزة للتنبؤ بها (الافتراضي: 256، -1 = ما لا نهاية، -2 = حتى يتم ملء السياق)Load grammar
انقر لتحميل القواعد النحوية بتنسيق .gbnfGrammar
مسار القواعد النحوية المستخدمة (بالنسبة إلى مجلد الأصول/StreamingAssets)Cache Prompt
بحفظ المطالبة المستمرة من الدردشة (الافتراضي: صحيح)Slot
لاستخدامها في الحساب. يمكن تعيين القيمة من 0 إلى Parallel Prompts
-1 (الافتراضي: -1 = فتحة جديدة لكل حرف)Seed
للتكاثر. للحصول على نتائج عشوائية في كل مرة استخدم -1Temperature
درجة الحرارة LLM، القيم المنخفضة تعطي إجابات أكثر حتمية (الافتراضي: 0.2)Top K
top-k (الافتراضي: 40، 0 = معطل)Top P
-P (الافتراضي: 0.9، 1.0 = معطل)Min P
لاحتمال استخدام الرمز المميز (الافتراضي: 0.05)Repeat Penalty
بتكرار تسلسلات الرمز المميز في النص الذي تم إنشاؤه (الافتراضي: 1.1)Presence Penalty
المتكررة عقوبة الحضور المميز (الافتراضي: 0.0، 0.0 = معطل)Frequency Penalty
عقوبة تكرار الرمز المميز (الافتراضي: 0.0، 0.0 = معطل)Tfs_z
: تمكين أخذ العينات الحرة باستخدام المعلمة z (الافتراضي: 1.0، 1.0 = معطل).Typical P
: تمكين أخذ العينات النموذجي محليًا باستخدام المعلمة p (الافتراضي: 1.0، 1.0 = معطل).Repeat Last N
: آخر رموز N التي يجب مراعاتها لمعاقبة التكرار (الافتراضي: 64، 0 = معطل، -1 = ctx-size).Penalize Nl
: معاقبة رموز السطر الجديد عند تطبيق عقوبة التكرار (الافتراضي: صحيح).Penalty Prompt
: موجه لغرض تقييم العقوبة. يمكن أن تكون إما null
أو سلسلة أو مجموعة من الأرقام التي تمثل الرموز المميزة (الافتراضي: null
= استخدم prompt
الأصلي ).Mirostat
: تمكين أخذ عينات Mirostat، والتحكم في الارتباك أثناء إنشاء النص (الافتراضي: 0، 0 = معطل، 1 = Mirostat، 2 = Mirostat 2.0).Mirostat Tau
: قم بتعيين إنتروبيا هدف Mirostat، المعلمة tau (الافتراضي: 5.0).Mirostat Eta
: قم بتعيين معدل تعلم Mirostat، المعلمة eta (الافتراضي: 0.1).N Probs
: إذا كانت أكبر من 0، فإن الاستجابة تحتوي أيضًا على احتمالات أعلى N من الرموز المميزة لكل رمز مميز تم إنشاؤه (الافتراضي: 0)Ignore Eos
: تمكين تجاهل الرموز المميزة لنهاية الدفق ومواصلة الإنشاء (الافتراضي: خطأ). ترخيص LLM for Unity هو MIT (LICENSE.md) ويستخدم برامج خارجية مع تراخيص MIT وApache. تحدد بعض النماذج المضمنة في الأصل شروط الترخيص الخاصة بها، يرجى مراجعتها قبل استخدام كل نموذج. يمكن العثور على تراخيص الطرف الثالث في (Third Party notifications.md).