AI Edge RAG SDK, LLM Inference API ব্যবহার করে একটি Retrieval Augmented Generation (RAG) পাইপলাইন তৈরি করার জন্য প্রয়োজনীয় মৌলিক উপাদানসমূহ প্রদান করে। একটি RAG পাইপলাইন LLM-কে ব্যবহারকারীর দেওয়া ডেটা ব্যবহারের সুযোগ করে দেয়, যার মধ্যে হালনাগাদকৃত, সংবেদনশীল বা ডোমেন-নির্দিষ্ট তথ্য অন্তর্ভুক্ত থাকতে পারে। RAG থেকে প্রাপ্ত অতিরিক্ত তথ্য পুনরুদ্ধার ক্ষমতার সাহায্যে, LLM নির্দিষ্ট ব্যবহারের ক্ষেত্রগুলোর জন্য আরও নির্ভুল এবং প্রাসঙ্গিক-সচেতন প্রতিক্রিয়া তৈরি করতে পারে।
এই নির্দেশিকাটি আপনাকে AI Edge RAG SDK-এর সাথে LLM Inference API ব্যবহার করে একটি নমুনা অ্যাপ্লিকেশনের প্রাথমিক বাস্তবায়ন ধাপে ধাপে দেখাবে। এই নির্দেশিকাটি একটি RAG পাইপলাইন তৈরির উপর আলোকপাত করে। LLM Inference API ব্যবহারের বিষয়ে আরও তথ্যের জন্য, “LLM Inference for Android” নির্দেশিকাটি দেখুন।
আপনি সম্পূর্ণ নমুনা অ্যাপ্লিকেশনটি গিটহাবে খুঁজে পাবেন। শুরু করার জন্য, অ্যাপ্লিকেশনটি বিল্ড করুন, ব্যবহারকারীর দেওয়া ডেটা ( sample_context.txt ) পড়ুন এবং টেক্সট ফাইলে থাকা তথ্য সম্পর্কিত LLM-কে প্রশ্ন করুন।
উদাহরণ অ্যাপ্লিকেশনটি চালান
এই নির্দেশিকায় অ্যান্ড্রয়েডের জন্য RAG ব্যবহার করে তৈরি একটি সাধারণ টেক্সট জেনারেশন অ্যাপের উদাহরণ দেওয়া হয়েছে। আপনি এই নমুনা অ্যাপটি আপনার নিজের অ্যান্ড্রয়েড অ্যাপের জন্য একটি সূচনা বিন্দু হিসাবে ব্যবহার করতে পারেন, অথবা বিদ্যমান কোনো অ্যাপ পরিবর্তন করার সময় এটির সাহায্য নিতে পারেন।
অ্যাপ্লিকেশনটি পিক্সেল ৮, পিক্সেল ৯, এস২৩ এবং এস২৪-এর মতো উচ্চমানের ডিভাইসগুলোর জন্য অপ্টিমাইজ করা হয়েছে। আপনার ওয়ার্কস্টেশনে একটি অ্যান্ড্রয়েড ডিভাইস সংযুক্ত করুন এবং নিশ্চিত করুন যে আপনার কাছে অ্যান্ড্রয়েড স্টুডিও-র একটি সাম্প্রতিক সংস্করণ রয়েছে। আরও তথ্যের জন্য, অ্যান্ড্রয়েড সেটআপ গাইড দেখুন।
অ্যাপ্লিকেশন কোডটি ডাউনলোড করুন
নিম্নলিখিত নির্দেশাবলীতে দেখানো হয়েছে কীভাবে গিট কমান্ড লাইন টুল ব্যবহার করে উদাহরণ কোডের একটি স্থানীয় অনুলিপি তৈরি করতে হয়।
নিম্নলিখিত কমান্ডটি ব্যবহার করে গিট রিপোজিটরিটি ক্লোন করুন:
git clone https://github.com/google-ai-edge/ai-edge-apis
উদাহরণ কোডটির একটি স্থানীয় সংস্করণ তৈরি করার পর, আপনি প্রজেক্টটি অ্যান্ড্রয়েড স্টুডিওতে ইম্পোর্ট করে অ্যাপটি চালাতে পারবেন।
একটি মডেল ডাউনলোড করুন
নমুনা অ্যাপ্লিকেশনটি Gemma-3 1B ব্যবহার করার জন্য কনফিগার করা হয়েছে। Gemma-3 1B হলো Gemma পরিবারের একটি অংশ, যা Gemini মডেলগুলো তৈরিতে ব্যবহৃত একই গবেষণা ও প্রযুক্তি ব্যবহার করে নির্মিত হালকা ও অত্যাধুনিক ওপেন মডেল। এই মডেলে 1B প্যারামিটার এবং ওপেন ওয়েট রয়েছে।
Hugging Face থেকে Gemma-3 1B ডাউনলোড করার পর, মডেলটি আপনার ডিভাইসে পুশ করুন:
cd ~/Downloads
tar -xvzf gemma3-1b-it-int4.tar.gz
$ adb shell rm -r /data/local/tmp/llm/ # Remove any previously loaded models
$ adb shell mkdir -p /data/local/tmp/llm/
$ adb push output_path /data/local/tmp/llm/model_version.task
আপনি নমুনা অ্যাপ্লিকেশনটির সাথে অন্যান্য মডেলও ব্যবহার করতে পারেন, তবে এর জন্য অতিরিক্ত কনফিগারেশন পদক্ষেপের প্রয়োজন হতে পারে।
একটি এমবেডার সেট আপ করুন
এমবেডারটি ব্যবহারকারীর দেওয়া ডেটা থেকে টেক্সটের অংশবিশেষ গ্রহণ করে এবং সেগুলোকে ভেক্টরাইজড সাংখ্যিক উপস্থাপনায় রূপান্তরিত করে, যা এর শব্দার্থিক তাৎপর্যকে ধারণ করে। এলএলএম প্রাসঙ্গিক ভেক্টর শনাক্ত করার জন্য এই এমবেডিংগুলোকে ব্যবহার করে এবং উৎপাদিত আউটপুটে সবচেয়ে শব্দার্থগতভাবে প্রাসঙ্গিক অংশগুলোকে অন্তর্ভুক্ত করে।
নমুনা অ্যাপ্লিকেশনটি জেমিনি এমবেডার এবং গেকো এমবেডার—এই দুটি এমবেডারের সাথে কাজ করার জন্য ডিজাইন করা হয়েছে।
গেকো এমবেডার দিয়ে সেট আপ করুন
ডিফল্টরূপে, নমুনা অ্যাপটি গেকো এমবেডার ( GeckoEmbeddingModel ) ব্যবহার করার জন্য কনফিগার করা থাকে এবং মডেলটি সম্পূর্ণরূপে ডিভাইসেই চালায়।
গেকো এমবেডারটি ফ্লোট এবং কোয়ান্টাইজড মডেল হিসেবে পাওয়া যায়, এবং বিভিন্ন সিকোয়েন্স দৈর্ঘ্যের জন্য এর একাধিক সংস্করণ রয়েছে। আরও তথ্যের জন্য, গেকো মডেল কার্ডটি দেখুন।
মডেলের স্পেসিফিকেশন মডেল ফাইলের নামে পাওয়া যাবে। উদাহরণস্বরূপ:
-
Gecko_256_f32.tflite: ফ্লোট মডেল যা ২৫৬টি পর্যন্ত টোকেনের ক্রম সমর্থন করে। -
Gecko_1024_quant.tflite: কোয়ান্টাইজড মডেল যা ১০২৪টি পর্যন্ত টোকেনের অনুক্রম সমর্থন করে।
সিকোয়েন্স লেংথ হলো মডেলের এমবেড করতে পারার মতো সর্বোচ্চ চাঙ্ক সাইজ। উদাহরণস্বরূপ, Gecko_256_f32.tflite মডেলটিকে যদি সিকোয়েন্স লেংথের চেয়ে বড় কোনো চাঙ্ক দেওয়া হয়, তবে মডেলটি প্রথম ২৫৬টি টোকেন এমবেড করবে এবং চাঙ্কটির বাকি অংশ ছেঁটে ফেলবে।
টোকেনাইজার মডেল ( sentencepiece.model ) এবং গেকো এমবেডারটি আপনার ডিভাইসে পুশ করুন:
adb push sentencepiece.model /data/local/tmp/sentencepiece.model
adb push Gecko_256_f32.tflite /data/local/tmp/gecko.tflite
এমবেডিং মডেলটি সিপিইউ এবং জিপিইউ উভয়ের সাথেই সামঞ্জস্যপূর্ণ। ডিফল্টরূপে, স্যাম্পল অ্যাপটি জিপিইউ-তে গেকো মডেল ব্যবহার করে এমবেডিং এক্সট্র্যাক্ট করার জন্য কনফিগার করা থাকে।
companion object {
...
private const val USE_GPU_FOR_EMBEDDINGS = true
}
জেমিনি এমবেডার দিয়ে সেট আপ করুন
জেমিনি এমবেডার ( GeminiEmbedder ) জেমিনি ক্লাউড এপিআই (Gemini Cloud API) ব্যবহার করে এমবেডিং তৈরি করে। অ্যাপ্লিকেশনটি চালানোর জন্য একটি গুগল জেমিনি এপিআই কী (Google Gemini API key) প্রয়োজন, যা আপনি গুগল জেমিনি এপিআই সেটআপ পেজ (Google Gemini API setup page) থেকে পেতে পারেন।
Google AI Studio-তে একটি Gemini API কী পান
RagPipeline.kt- এ আপনার Gemini API কী যোগ করুন এবং COMPUTE_EMBEDDINGS_LOCALLY কে false-এ সেট করুন:
companion object {
...
private const val COMPUTE_EMBEDDINGS_LOCALLY = false
private const val GEMINI_API_KEY = "<API_KEY>"
}
এটি কীভাবে কাজ করে
এই বিভাগে অ্যাপ্লিকেশনটির RAG পাইপলাইন উপাদানগুলো সম্পর্কে আরও বিস্তারিত তথ্য দেওয়া হয়েছে। আপনি বেশিরভাগ কোড RagPipeline.kt- এ দেখতে পারেন।
নির্ভরশীলতা
RAG SDK com.google.ai.edge.localagents:localagents-rag লাইব্রেরিটি ব্যবহার করে। আপনার অ্যান্ড্রয়েড অ্যাপের build.gradle ফাইলে এই ডিপেন্ডেন্সিটি যোগ করুন:
dependencies {
...
implementation("com.google.ai.edge.localagents:localagents-rag:0.1.0")
implementation("com.google.mediapipe:tasks-genai:0.10.22")
}
ব্যবহারকারীর দেওয়া ডেটা
অ্যাপ্লিকেশনটিতে ব্যবহারকারীর দেওয়া ডেটা হলো sample_context.txt নামের একটি টেক্সট ফাইল, যা assets ডিরেক্টরিতে সংরক্ষিত থাকে। অ্যাপ্লিকেশনটি টেক্সট ফাইলটি থেকে খণ্ডাংশ গ্রহণ করে, সেই খণ্ডাংশগুলোর এমবেডিং তৈরি করে এবং আউটপুট টেক্সট তৈরি করার সময় সেই এমবেডিংগুলোকে ব্যবহার করে।
নিম্নলিখিত কোড স্নিপেটটি MainActivity.kt- তে পাওয়া যাবে:
class MainActivity : ComponentActivity() {
lateinit var chatViewModel: ChatViewModel
...
chatViewModel.memorizeChunks("sample_context.txt")
...
}
খণ্ড খণ্ড করা
সরলতার জন্য, sample_context.txt ফাইলে <chunk_splitter> ট্যাগ অন্তর্ভুক্ত করা হয়েছে, যা স্যাম্পল অ্যাপ্লিকেশনটি চাঙ্ক তৈরি করতে ব্যবহার করে। এরপর প্রতিটি চাঙ্কের জন্য এমবেডিং তৈরি করা হয়। প্রোডাকশন অ্যাপ্লিকেশনগুলিতে, চাঙ্কের আকার একটি গুরুত্বপূর্ণ বিবেচ্য বিষয়। যখন একটি চাঙ্ক খুব বড় হয়, তখন ভেক্টরটিতে ব্যবহারযোগ্য হওয়ার জন্য যথেষ্ট স্পেসিফিসিটি থাকে না; এবং যখন এটি খুব ছোট হয়, তখন এতে যথেষ্ট কনটেক্সট থাকে না।
নমুনা অ্যাপ্লিকেশনটি RagPipeline.kt- এর memorizeChunks ফাংশনের মাধ্যমে চাংকিং পরিচালনা করে।
এমবেডিং
অ্যাপ্লিকেশনটি টেক্সট এমবেড করার জন্য দুটি উপায় প্রদান করে:
- গেকো এমবেডার : গেকো মডেলের সাহায্যে স্থানীয় (ডিভাইস-ভিত্তিক) টেক্সট এমবেডিং নিষ্কাশন।
- জেমিনি এমবেডার : জেনারেটিভ ল্যাঙ্গুয়েজ ক্লাউড এপিআই ব্যবহার করে ক্লাউড-ভিত্তিক টেক্সট এমবেডিং নিষ্কাশন।
ব্যবহারকারী এমবেডিংগুলো স্থানীয়ভাবে নাকি গুগল ক্লাউডের মাধ্যমে গণনা করতে চান, তার উপর ভিত্তি করে নমুনা অ্যাপ্লিকেশনটি এমবেডার নির্বাচন করে। নিম্নলিখিত কোড স্নিপেটটি RagPipeline.kt- এ পাওয়া যাবে:
private val embedder: Embedder<String> = if (COMPUTE_EMBEDDINGS_LOCALLY) {
GeckoEmbeddingModel(
GECKO_MODEL_PATH,
Optional.of(TOKENIZER_MODEL_PATH),
USE_GPU_FOR_EMBEDDINGS,
)
} else {
GeminiEmbedder(
GEMINI_EMBEDDING_MODEL,
GEMINI_API_KEY
)
}
ডাটাবেস
নমুনা অ্যাপ্লিকেশনটি টেক্সট এমবেডিং সংরক্ষণের জন্য SQLite ( SqliteVectorStore ) ব্যবহার করে। আপনি অস্থায়ী ভেক্টর সংরক্ষণের জন্য DefaultVectorStore ডাটাবেসটিও ব্যবহার করতে পারেন।
নিম্নলিখিত কোড স্নিপেটটি RagPipeline.kt- এ পাওয়া যাবে:
private val config = ChainConfig.create(
mediaPipeLanguageModel, PromptBuilder(QA_PROMPT_TEMPLATE1),
DefaultSemanticTextMemory(
SqliteVectorStore(768), embedder
)
)
নমুনা অ্যাপটি এমবেডিং ডাইমেনশন ৭৬৮-এ সেট করে, যা ভেক্টর ডেটাবেসের প্রতিটি ভেক্টরের দৈর্ঘ্যকে নির্দেশ করে।
চেইন
RAG SDK চেইন প্রদান করে, যা একাধিক RAG উপাদানকে একটি একক পাইপলাইনে একত্রিত করে। আপনি রিট্রিভাল এবং কোয়েরি মডেল অর্কেস্ট্রেট করতে চেইন ব্যবহার করতে পারেন। এর API, চেইন ইন্টারফেসের উপর ভিত্তি করে তৈরি।
নমুনা অ্যাপ্লিকেশনটি রিট্রিভাল এবং ইনফারেন্স চেইন ব্যবহার করে। নিম্নলিখিত কোড স্নিপেটটি RagPipeline.kt- এ পাওয়া যাবে:
private val retrievalAndInferenceChain = RetrievalAndInferenceChain(config)
মডেলটি যখন প্রতিক্রিয়া তৈরি করে তখন এই চেইনটি চালু হয়:
suspend fun generateResponse(
prompt: String,
callback: AsyncProgressListener<LanguageModelResponse>?
): String =
coroutineScope {
val retrievalRequest =
RetrievalRequest.create(
prompt,
RetrievalConfig.create(2, 0.0f, TaskType.QUESTION_ANSWERING)
)
retrievalAndInferenceChain.invoke(retrievalRequest, callback).await().text
}