د دوو میاشتو مخکې، زه په اړه خبرې وکړم . دا ښه راغلاست او تازه ده چې کولی شي یو خبرې وکړي چې د ګرځنده اپلیکیشنونه کولی شي د ژور ژور ماډل استعمال څخه ګټه واخلئ. په اپلیکیشنونو کې د وسایلو SLMs پر چلول د خبرې کولو وروسته، زه د ګډون کونکو څخه ځینې پیژندنه ترلاسه کړ چې د "د RAG له خوا د SLM کارولو سره یو اپلیکیشن د مثال په لټه کې وي." دا عادلانه تبصرې دي. دلته ستونزه دا ده چې دا د یو ماډل جوړولو لپاره او په محدود وخت کې د پراختیا لپاره معنی لري. خوشحاله، دا د یو لوی بلاګ پست لپاره کار کوي! نو، دلته دا دی! که تاسو د RAG-powered زبان ماډل ستاسو د Android اپلیکیشن ته اضافه کولو لارښوونه وګورئ، دا ستاسو لپاره د پست دی! د RAG څه دی؟ که تاسو د اصطلاح په اړه نه پوهیږئ، RAG د دا یو تکنیک دی چې د ژور ماډلونو لپاره د غیرقانوني معلوماتو ته لاس رسیږي چې د روزنې وروسته په خپل ډاټاټاټ کې شتون نلري. دا ماډلونه اجازه ورکوي چې د وروستیو معلوماتو په اړه پوه شي چې دوی کولی شي د پوښتنو ته نور دقیق ځوابونه وړاندې کړي. Retrieval Augmented Generation بیا په چټک مثال وګورئ. تصور وکړئ چې تاسو د دوو ژور ماډلونه لري، یو ماډل د RAG په کارولو سره د اروپا د پایتختونو په اړه بهرني معلوماتو ترلاسه کوي، په داسې حال کې چې یو بل یوازې د خپل معلوماتو پر بنسټ دی. تاسو د دوو ماډلونو ته د لاندې لارښوونې ورکولو انتخاب وکړئ: You are an expert on the geography of Europe. Give me the name of 3 capital cities. Also give me an interesting fact for each of them. د پایلې کولای شي څنګه وي: لکه څنګه چې د ډیزاین ښيي، تاسو کولی شئ د RAG په کارولو سره د ژور ماډل څخه د ګټور ځواب ترلاسه کړئ، د ماډل د خپل معلوماتو پر بنسټ نه. تاسو کولی شئ د RAG د بریښنا د ماډل څخه لږ هالوژینونو وګورئ، ځکه چې دا د معلوماتو جوړولو ته اړتیا نلري. دا په حقیقت کې ټول هغه څه دی چې تاسو باید د RAG په لوړ کچه په اړه پوه شئ. په بل کې، چیرته، موږ په عمده توګه ونیسئ او ځینې کوډ جوړ کړئ ترڅو ستاسو د غوښتنلیک په داخله خپل RAG-powered زبان ماډل فعال کړئ! د Android اپلیکیشن جوړولو د مثال په توګه، تاسو غواړئ چې د Simon Says لوبه کولو لپاره د زبان ماډل په کارولو سره یو اپلیکیشن جوړ کړئ. تاسو غواړئ چې د ماډل د Simon وي، او د RAG کارولو سره د کارونو د ډاټا سرچینې ته لاس رسی ترڅو د کاروونکي سره څه پوهیږئ. څنګه تاسو به دا کار وکړئ؟ په Android کې د دې لپاره ترټولو ساده لاره د ، د وسایلو ټولګه چې ستاسو اپلیکیشن ته د AI او ماشین زده کړې تکنیکونو کارولو سره مرسته کوي. د پیل لپاره، ستاسو اپلیکیشن ته د MediaPipe تقاضا اضافه کړئ : د mediapipe build.gradle dependencies { implementation("com.google.mediapipe:tasks-genai:0.10.27") implementation("com.google.ai.edge.localagents:localagents-rag:0.3.0") } بل، تاسو به ستاسو د کمپیوټر له لارې ستاسو د ازمايښت وسايل ته د ژور ماډل اضافه کړئ. په دې مثال کې، موږ د Google ، یو رڼا لغوي ماډل چې د 1 میلیارده پارامترونو ارزښت معلومات لري. جیمما3-1B ناڅاپي یادونه: د نمونوي ډاونلوډ کولو مخکې، تاسو کولی شئ په Kaggle کې ثبت کړئ او د Google د AI شرایطو سره موافق شئ. Side Note: Before downloading the model, you may have to sign upto Kaggle and agree to Google’s AI Terms and Conditions. کله چې د نمونوي ډاونلوډ شوی، دا وخت دی چې د نمونوي په خپل وسایلو کې اضافه کړئ. تاسو کولی شئ دا د adb له لارې ترسره کړئ: $ adb shell mkdir -p /data/local/tmp/slm/ # Create a folder to store the model $ adb push output_path /data/local/tmp/slm/gemma3-1B-it-int4.task # Copy the model over to the file په بدیل ډول، تاسو کولی شئ د د Android Studio کارولو سره د پوښونو خپل ځان جوړ کړي او د موډل په خپل وسایلو کې ډک کړئ. د فایل Explorer د نمونوي اضافه کولو سره، تاسو کولی شئ د RAG پایپینټ جوړولو لپاره د Gemma سره معلومات ورکړي. بل، موږ به د معلوماتو اضافه کولو په اړه وګورئ چې Gemma به د پوښتنو ته ځواب ورکړي. د Embeddings جوړولو د معلوماتو ژور ماډلونه چې د RAG کارولو لپاره پر بنسټ دي د هغه معلوماتو نه دي چې تاسو ته انتقال کړئ. ماډلونه د معلوماتو ته اړتیا لري چې په ځانګړي فارم کې وي. . Embeddings دا د ریاضیاتو stringونو دي چې د متن د معنوي معنی وړاندې کوي. کله چې د نمونې ترلاسه کوي، دا به دا کاروي چې د دې سره مطابقت وړ معلومات په لټه کې وکاروي او دا د خپل معلوماتو سره هم کاروي ترڅو ځواب ورکوي. دا ریاضیاتو stringونه د یو وسایلو له خوا جوړ شوي دي چې د . Embedder د نښلیدو په ځان کې یو بشپړ موضوع دي؛ تاسو ته د دوی په اړه مطالعه کولو ته وده ورکړئ. د دې پست لپاره، تاسو یوازې باید پوه شئ چې څنګه یې جوړ کړئ. تاسو کولی شئ دا په وسایلو کې د کارولو سره کار واخلئ . د Gecko Embedder لومړی، download the Tokenizer او د د ماډل فایلونه ستاسو د کمپیوټر ته embedder کړئ. بیا دوی ته ستاسو د وسایلو ته فشارئ: sentencepiece.model Gecko_256_f32.tflite $ adb push sentencepiece.model /data/local/tmp/slm/sentencepiece.model # Push the tokenizer to the device $ adb push Gecko_256_f32.tflite /data/local/tmp/slm/Gecko_256_f32.tflite # Push the embedder model to the device کله چې د embedder ستاسو په وسایلو کې نصب شوی دی، دا وخت دی چې د نمونې فایل وړاندې کړئ ترڅو د embeddings جوړ کړئ. په Android Studio کې، ستاسو د غوښتنلیک ماډل کې فورمه، یو فایل جوړ کړئ چې د وروسته، په فایل کې، د لاندې متن اضافه کړئ: assets simon_says_responses.txt <chunk_splitter> Go for a walk <chunk_splitter> Jump and down 10 times <chunk_splitter> Sing your favourite song! <chunk_splitter> Text your best friend a funny meme <chunk_splitter> Do 10 press ups! <chunk_splitter> د فایل د دوو مختلفو ځوابونه لري چې تاسو کولی شئ د سیمون وايي په لوبه کې ورکړئ، په هر ډول سره د دا د انټرنټ لپاره یو سیگنال ورکوي ترڅو پوه شي چې کله چې د متن په انټرنټونو کې تقسیم کړئ د هر ځواب تفریح کړئ.This gives the embedder a signal to know how to separate each response when splitting the text into embeddings. <chunk_splitter> دا پروسه نومول کیږي او کولای شي د RAG له لارې د ژور ماډل له لارې څومره ښه اغېز لري. د مختلفو اندازو ټوټې او ځوابونو سره تجربې د خپل اړتیاوو لپاره د مناسب ترکیب په لټه کې دي! chunking یو څه چې تاسو باید فکر وکړئ د اپلیکیشن د ذخیره کولو ده. په یاد ولرئ، تاسو په خپل وسایلو کې یو ژوره ماډل او یو embedder نصب وکړئ. دا ګیګابایټونه فضا کولی شي، نو ډاډه وکړئ چې د ډیره لوی متن فایله کارولو له لارې یو وسایلو نور وده ورکړئ! تاسو غواړئ د نمونې فایل په سایټ کې ذخیره کول او دا د شبکې له لارې ډاونلوډ کړئ چې د ذخیره کولو سره ستونزو کم کړي. کله چې د متن فایل موقعیت لري، دا وخت دی چې د embedder پیل کړئ: private const val GeckoEmbedderPath = "/data/local/tmp/slm/gecko_256_f32.tflite" private const val TokenizerModelPath = "/data/local/tmp/slm/sentencepiece.model" private const val UseGpuForEmbeddings = true val embedder: Embedder<String> = GeckoEmbeddingModel( GeckoEmbedderPath, TokenizerModelPath, UseGpuForEmbeddings, ) د embedder درې پارامترونه لري: د embedder پړاو او په وسایلو کې د tokenizer، سره د پایلې پارامتر له دې چې آیا embedder کولی شي د وسایلو GPU کاروي کله چې د embeddings جوړ کړي. که د GPU شتون لري، دا به د انډولونو جوړولو په چټکۍ سره راټول شي. د دې ارزښت فعالولو لپاره فیصلہ کولو دمخه ډاډه وکړئ چې د وسایلو وړتیاوې وګورئ. وروسته، د زبان ماډل یو انډول جوړ کړئ: private const val GemmaModelPath = "/data/local/tmp/slm/gemma3-1B-it-int4.task" val llmInferenceOptions = LlmInferenceOptions.builder() .setModelPath(GemmaModelPath) .setPreferredBackend(LlmInference.Backend.CPU) // Change to GPU if you have a GPU powered device. .setMaxTokens(1200) .build() val llmInferenceSessionOptions = LlmInferenceSessionOptions.builder() .setTemperature(0.6f) .setTopK(5000) .setTopP(1f) .build() val languageModel = MediaPipeLlmBackend( context, // This is the application context languageModelOptions, languageModelSessionOptions) languageModel.initialize().get() ډیری پارامترونه شتون لري؛ اوس مهال د دې په اړه فکر نه وکړئ. موږ به د دوی په اوږدو کې راځي. د زبان ماډل له خوا جوړ شوی، تاسو کولی شئ د نندارتونونو پرته تمرکز وکړئ. د ماډل ته اړتيا لري چې د نندارتونونو ته هر وخت چې دا د لارښوونې ترلاسه کوي. MediaPipe د SQLite وړاندې کوي ، کوم چې د نښلیدو ذخیره کولو لپاره یو عام وسایلو دی. بیا یو جوړ کړئ: Vector Store private const val PromptTemplate: String = """ You are Simon in a game of Simon Says. Your task is to ask the player to perform a task from the following list: {0}. Your response must only contain the task that the player must do. Your response must be based on the players request: {1}. Do not ask the player to do the same thing twice. You must not ask the player to do anything that is dangerous, unethical or unlawful. """ val chainConfig = ChainConfig.create( languageModel, PromptBuilder(PromptTemplate), DefaultSemanticTextMemory( SqliteVectorStore(768), embedder ) ) دلته، هر څه په ګډه پیل کوي لکه څنګه چې د زبان ماډل او embedder په ChainConfig کې انتقال شوي دي. دی د هر "بکټور" اندازه چې د ډاټا کې کولی شي ذخیره کړي. د RAG پروسه ته مرسته کولو لپاره د پروګرام وړاندې کولو لپاره کارول کیږي. 786 PromptBuilder په پایله کې، موږ د متن فایله چې موږ په مخکښ کې جوړ شو په embedder کې لوستل شو. لومړی، د فایله د وسایلو څخه لوستل او د متن په رنګونو لیست کې تقسیم کړئ: // This is an extension function to read the file from disk. val gameResponses: List<String> = context.getTextFromFile("simon_says_responses.txt") وروسته، د ځوابونو ته د مخکښ جوړ chainConfig لوډ کړئ. chainConfig.semanticMemory.getOrNull() ?.recordBatchedMemoryItems(ImmutableList.copyOf(gameResponses)) ?.get() د خپل آله او د متن فایل اندازه پورې اړه لري، دا کولی شي د ځینې ثانیو څخه تر څو د ځینې دقیقې کې بشپړ شي. یو ښه ډک قانون دا ده چې د ژور ماډل د کارولو څخه مخنیوی شي کله چې دا ترسره کیږي. تاسو کولی شئ د دې عمل په یو IO ټریډ کې ترسره کړئ ترڅو د اصلي ټریډ بلاک کولو څخه مخنیوی شئ. د دې کولو سره، تاسو یوازې خپل متن فایبر ته د ویټور سټیشن کې ذخیره شوي انډولونو سیټ بدل کړئ. تاسو د خپل ژور ماډل به د سټیشن سره تړل کړئ نو دا اوس معلومات کولی شي ترلاسه کړي! په راتلونکي برخه کې به ښيي چې څنګه د دې نښلولونو کارولو له لارې د ژور ماډل ستاسو د نندارتونونو ته ورسیږي. په خپل RAG Powered موډل کې Prompts انتقال کله چې ډیری پیچلي نصب بشپړ شوی، د ژور ماډل کې د پاملرنې په حیرانتیا سره آسانه ده. لومړی، تاسو باید یو جوړ کړئ د چڼاسکه config کارول او دا ته ودلوئ. RetrievalAndInferenceChain val retrievalAndInferenceChain = RetrievalAndInferenceChain(chainConfig) وروسته، یو غوښتنلیک جوړ کړئ او دا په چټک کې انتقال کړئ. val prompt = "Tell me something to do Simon involving jumping!" val retrievalRequest = RetrievalRequest.create( prompt, RetrievalConfig.create( 50, // topK 0.1f, // minSimilarityScore RetrievalConfig.TaskType.RETRIEVAL_QUERY ) ) val response = retrievalAndInferenceChain!!.invoke(retrievalRequest).get().text د پروسس کولو په وخت کې، دا به ستاسو د وکتور سټیشن کې د انډولونو ته اشاره وکړي ترڅو وړاندې کړي چې هغه څه چې دا فکر کوي چې تر ټولو دقیق ځواب دی. لکه څنګه چې تاسو انتظار کولی شئ، هغه څه چې تاسو د ماډل ته پوښتنه به په مختلفو ځوابونو کې وده ورکړي. لکه څنګه چې د انډولونو کې د سیمون وايي ځوابونو لړ لري، دا احتمال لري چې تاسو به یو ښه ځواب ترلاسه کړئ! په دې وخت کې، تاسو اړتیا لرئ چې له مخکښ پایلې ترلاسه کړئ او د مخکښ برخه څخه ستاسو د اجزاو پارامترونو سره سمون کړئ. موږ به په راتلونکي برخه کې د دې کار وکړي. Fine-Tuning ستاسو د RAG Powered زبان ماډل که یو څه دی چې موږ د کلونو په اوږدو کې د Generative AI څخه زده کړې، دا دی چې دا د دقیق علم نه ده. تاسو به په هر ډول تاریخونه وګورئ چې د ژور ماډلونه "د غلطی" لري او د خواړه څخه کم پایلې تولید کوي، د شرکتونو لپاره شرم او شهرت زیان ورکوي. دا د کافی ټیسټ کولو پایله ده چې د يو ماډل څخه ځوابونه انتظار نه کوي. ټیسټ کولو نه یوازې د مخنیوی څخه مخنیوی کوي، دا کولی شي د خپل ژور ماډل تولید سره هم مرسته وکړي نو دا هم ښه کار کوي! چیرته چې موږ کولی شو چې زموږ د RAG powered زبان ماډل سره سمون کړي. له پیل سره : LLmInferenceOptions.Builder LlmInferenceOptions.builder() .setModelPath(GemmaModelPath) .setPreferredBackend(LlmInference.Backend.CPU) // Change to GPU if you have a GPU powered device. .setMaxTokens(1200) .build() لومړی پارامتر چې کولی شي بدل شي د parameter. دا ده چې د ژور ماډل کولی شي د "input" یا "output" مقدار. د ارزښت لوی، د ژور ماډل کولی شي د ډاټا په هر وخت کې د پروسس. د ښه ځوابونو پایلې. setMaxTokens() زموږ په مثال کې، دا معنی لري چې د ماډل کولی شي د متن د وارداتو په کارولو او د 1،200 ټوکن څخه جوړ شوي محصول تولید کړي. که موږ کولی شو د ټیکن د کمولو په کارولو او همدارنګه د کوچني ځواب تولید کړي، موږ کولی شو تنظیم کړي د کوچني ارزښت لپاره. MaxTokens د دې ارزښت په اړه احتیاط وکړئ، لکه څنګه چې تاسو کولی شئ ستاسو د نمونوي په ناڅاپي توګه د ډیری ټکینونو په کارولو سره ونیسئ چې دا انتظار کوي. د اپلیکیشن د بریښنا له امله. چیرته چې په : LlmInferenceSessionOptions.Builder() llmInferenceSessionOptions = LlmInferenceSessionOptions.builder() .setTemperature(0.6f) .setTopK(5000) .setTopP(1f) .build() دلته، تاسو کولی شئ دوه مختلف پارامترونه تنظیم کړئ. د او موږ به د دوی په هر ډول کې ډک کړئ. .setTemperature() .setTopK() .setTopP() کولی شي په فکر کې وي چې د ژور ماډل څخه ځوابونه کولی شي چې څومره "انصافي" وي. د ارزښت ټیټ تر ، د ماډل څخه ځوابونه کولی شي "پایه" وي. د ارزښت ټیټ تر ، د ځوابونه به "خوددار" وي ، د ناڅاپي ځوابونه زیات راځي. .setTemperature() د دې مثال لپاره، دا د په دې معنی کې، د ماډل به نږدې تخليقي، خو نه غیر قابل تصور ځوابونه برابر کړي. 0.6 د حرارت درجه د تجربو لپاره یو ښه ارزښت دی، لکه څنګه چې تاسو کولی شئ د مختلفو ارزښتونو سره د ستاسو د استعمال په صورت کې د ښه ځوابونو وړاندې کوي. په Simons Says لوبه کې، ځینې خلاقیت ښه راغلاست! دا یو لاره ده چې وايي "د غوره K پایلې یوازې د کاروونکي ته ورسیږي." د ژور ماډلونه، په داسې حال کې چې د پروسس کولو لپاره، د ځوابونو شمېر تولید کوي، احتمالا هزاران! .setTopK() د دغو ځوابونو په هر ډول کې د احتمال په اړه دی چې دوی د حق ځواب وي. د ځوابونو مقدار محدودولو لپاره، د د ارزښت کولی شي د ماډل تمرکز کې مرسته وکړي. که تاسو د کم احتمالي ځوابونو په اړه خوشحاله یاست، تاسو غواړئ دا ارزښت لوړ کړي. topK لکه څنګه چې د تودوخې ځانګړتیاوې، دا د تجربو لپاره یو ښه ځانګړتیا ده. تاسو کولی شئ د موډل په اړه ستاسو د اړتیاوو په اړه د کم یا زیات ځوابونو سره ښه کار کوي. د Simon Says لوبې لپاره، موږ غواړو چې د ماډل د مختلفو ځوابونو په اړه فکر کوي ترڅو د لوبې تازه کړي. نو ښکاري چې یو ښه ارزښت. 5000 د جوړولو په محدودیت کې جوړ شوی لکه څنګه چې مخکې ذکر شوي، د ژور ماډلونه د هر ځواب چې دا تولید کوي د احتمال په اړه یو احتمال ورکوي چې دا ممکن وي. معنی د نمونوي کولای شي په اسانۍ سره هر ځواب چې لږ تر لږه احتمال ته اړتيا نه لري له لاسه ورکړي. .setTopP() topK topP د مثال په توګه، که د ماډل لري د 2 او د لاندې ځوابونو په اړه فکر کوي: topP 0.4 Simons Says clap 5 times! = 0.7 // This response has a probablility of 0.7 of being correct Simons Says jump up and down! = 0.5 Find a car and drive it. = 0.3 د لومړي دوو ځوابونه به په پام کې وي ځکه چې احتمال د د موټر په اړه ځواب به له لاسه ورکړي، ځکه چې دا یوازې یو احتمال لري . 0.4 0.3 په څیر او د تاسو ته اجازه ورکوي چې تاسو د خپل ژور ماډل څومره تخنیکي وي. که تاسو غواړئ په کم احتمالي ځوابونه په پام کې ونیسئ، د ټیټ P ارزښت تنظیم کول به مرسته وکړي. temperature topK topP زموږ د مثال په توګه، دا د دا ځکه چې موږ غواړو چې د ماډل د خپلو ځوابونو په بشپړه توګه مطمئن وي. دا په پایله کې د ماشومانو لوبه کوي! 1.0 د دغو ارزښتونو سره تجربې به ستاسو د ژور ماډلونو څخه ډیری مختلفې پایلې تولید کړي. هڅه وکړئ او وګورئ چې څنګه وي! په راتلونکي کې چیرې؟ زه امیدوارم چې تاسو د دې څنګه چې ستاسو د Android اپلیکیشن ته د RAG powered زبان ماډل اضافه کړئ په دې لارښوونې څخه خوند واخلئ! که تاسو د RAG او Android په اړه نور پوه شئ، دلته ځینې لینکونه شتون لري: Clone and run the for this blog post to see it in action. It shows how to setup the RAG pipeline with Gemma using Android architecture best practices. Simons Says App: sample code : Check out the RAG section on the MediaPipe - Highly recommended reading. MediaPipe RAG Google Developer docs : Learn more about how setting the Temperature, TopK, and TopP values can the results from language models. Another highly recommended article. Setting Temperature, TopK, and TopP in LLMs help control