১. সংক্ষিপ্ত বিবরণ
এই কোডল্যাবে, আপনি ফায়ারস্টোর ভেক্টর সিমিলারিটি সার্চ ব্যবহার করে আপনার অ্যাপে শক্তিশালী সার্চ ফিচার যোগ করার পদ্ধতি শিখবেন। আপনি সুইফট এবং সুইফটইউআই-তে লেখা একটি নোট-টেকিং অ্যাপের জন্য একটি সিমান্টিক সার্চ ফিচার বাস্তবায়ন করবেন।

আপনি যা শিখবেন
- ভেক্টর এমবেডিং গণনা করার জন্য Vector Search with Firestore এক্সটেনশনটি কীভাবে ইনস্টল করবেন।
- সুইফট অ্যাপ্লিকেশন থেকে কীভাবে ফায়ারবেস ক্লাউড ফাংশন কল করবেন
- সাইন-ইন করা ব্যবহারকারীর উপর ভিত্তি করে ডেটা কীভাবে আগে থেকে ফিল্টার করবেন
আপনার যা যা প্রয়োজন হবে
- এক্সকোড ১৫.৩
- কোডল্যাবের নমুনা কোড। আপনি কোডল্যাবের পরবর্তী ধাপে এটি ডাউনলোড করবেন।
২. একটি ফায়ারবেস প্রজেক্ট তৈরি ও সেট আপ করুন।
ফায়ারবেস ভেক্টর সার্চ এক্সটেনশনটি ব্যবহার করার জন্য আপনার একটি ফায়ারবেস প্রজেক্ট প্রয়োজন। এই কোডল্যাবের এই অংশে, আপনি একটি নতুন ফায়ারবেস প্রজেক্ট তৈরি করবেন এবং ক্লাউড ফায়ারস্টোর ও ফায়ারবেস অথেনটিকেশনের মতো প্রয়োজনীয় সার্ভিসগুলো সক্রিয় করবেন।
একটি ফায়ারবেস প্রজেক্ট তৈরি করুন
- আপনার গুগল অ্যাকাউন্ট ব্যবহার করে ফায়ারবেস কনসোলে সাইন ইন করুন।
- নতুন প্রজেক্ট তৈরি করতে বাটনটিতে ক্লিক করুন, এবং তারপর একটি প্রজেক্টের নাম লিখুন (উদাহরণস্বরূপ,
Firestore Vector Search Codelab)। - চালিয়ে যান-এ ক্লিক করুন।
- অনুরোধ করা হলে, Firebase-এর শর্তাবলী পর্যালোচনা করে গ্রহণ করুন এবং তারপর 'চালিয়ে যান' (Continue ) বোতামে ক্লিক করুন।
- (ঐচ্ছিক) Firebase কনসোলে AI সহায়তা সক্রিয় করুন (Firebase-এ এটিকে "Gemini" বলা হয়)।
- এই কোডল্যাবের জন্য আপনার গুগল অ্যানালিটিক্স-এর প্রয়োজন নেই , তাই গুগল অ্যানালিটিক্স অপশনটি বন্ধ করে দিন ।
- Create project-এ ক্লিক করুন, আপনার প্রজেক্টটি প্রস্তুত হওয়া পর্যন্ত অপেক্ষা করুন, এবং তারপর Continue-তে ক্লিক করুন।
ফায়ারবেস প্রজেক্ট সম্পর্কে আরও জানতে, “ফায়ারবেস প্রজেক্ট বুঝুন” দেখুন।
আপনার ফায়ারবেস প্রাইসিং প্ল্যান আপগ্রেড করুন
Firebase এক্সটেনশন এবং এর অন্তর্নিহিত ক্লাউড পরিষেবাগুলি ব্যবহার করার জন্য, আপনার Firebase প্রজেক্টটিকে পে-অ্যাজ-ইউ-গো (Blaze) প্রাইসিং প্ল্যানে থাকতে হবে, যার অর্থ এটি একটি ক্লাউড বিলিং অ্যাকাউন্টের সাথে লিঙ্ক করা থাকে।
- ক্লাউড বিলিং অ্যাকাউন্টের জন্য ক্রেডিট কার্ডের মতো একটি পেমেন্ট পদ্ধতি প্রয়োজন।
- আপনি যদি Firebase এবং Google Cloud-এ নতুন হন, তাহলে যাচাই করে দেখুন আপনি $300 ক্রেডিট এবং একটি ফ্রি ট্রায়াল ক্লাউড বিলিং অ্যাকাউন্টের জন্য যোগ্য কিনা।
- আপনি যদি কোনো ইভেন্টের অংশ হিসেবে এই কোডল্যাবটি করে থাকেন, তাহলে আপনার আয়োজককে জিজ্ঞাসা করুন কোনো ক্লাউড ক্রেডিট পাওয়া যাবে কিনা।
আপনার প্রজেক্টটি ব্লেজ প্ল্যানে আপগ্রেড করতে, এই ধাপগুলো অনুসরণ করুন:
- Firebase কনসোলে, আপনার প্ল্যান আপগ্রেড করতে নির্বাচন করুন।
- ব্লেজ প্ল্যানটি নির্বাচন করুন। আপনার প্রোজেক্টের সাথে একটি ক্লাউড বিলিং অ্যাকাউন্ট লিঙ্ক করতে স্ক্রিনে দেওয়া নির্দেশাবলী অনুসরণ করুন।
এই আপগ্রেডের অংশ হিসেবে যদি আপনার একটি ক্লাউড বিলিং অ্যাকাউন্ট তৈরি করার প্রয়োজন হয়ে থাকে, তাহলে আপগ্রেডটি সম্পন্ন করার জন্য আপনাকে ফায়ারবেস কনসোলের আপগ্রেড ফ্লো-তে ফিরে যেতে হতে পারে।
কনসোলে Firebase প্রোডাক্টগুলো সক্রিয় ও সেট আপ করুন।
আপনি যে অ্যাপটি তৈরি করছেন, তাতে এমন বেশ কয়েকটি ফায়ারবেস প্রোডাক্ট ব্যবহার করা হয়েছে যা অ্যাপল অ্যাপের জন্য উপলব্ধ:
- আপনার ব্যবহারকারীদের অ্যাপে সহজে সাইন ইন করার জন্য ফায়ারবেস অথেনটিকেশন ব্যবহার করুন।
- ক্লাউডে স্ট্রাকচার্ড ডেটা সংরক্ষণ করতে এবং ডেটা পরিবর্তিত হলে তাৎক্ষণিক বিজ্ঞপ্তি পেতে ক্লাউড ফায়ারস্টোর ব্যবহার করুন।
- আপনার ডাটাবেস সুরক্ষিত করার জন্য ফায়ারবেস নিরাপত্তা নিয়মাবলী ।
এই পণ্যগুলোর কয়েকটির জন্য বিশেষ কনফিগারেশন প্রয়োজন হয় অথবা ফায়ারবেস কনসোল ব্যবহার করে সেগুলোকে সক্রিয় করতে হয়।
Firebase Authentication-এর জন্য অ্যানোনিমাস অথেন্টিকেশন সক্রিয় করুন
এই অ্যাপ্লিকেশনটি অ্যানোনিমাস অথেন্টিকেশন ব্যবহার করে, যার ফলে ব্যবহারকারীরা প্রথমে কোনো অ্যাকাউন্ট তৈরি না করেই অ্যাপটি ব্যবহার শুরু করতে পারেন। এর ফলে অনবোর্ডিং প্রক্রিয়াটি অত্যন্ত সহজ ও ঝামেলামুক্ত হয়। অ্যানোনিমাস অথেন্টিকেশন সম্পর্কে আরও জানতে (এবং কীভাবে একটি নেমড অ্যাকাউন্টে আপগ্রেড করতে হয়), অ্যানোনিমাস অথেন্টিকেশনের সেরা অনুশীলনসমূহ দেখুন।
- Firebase কনসোলের বাম দিকের প্যানেলে, Build > Authentication- এ ক্লিক করুন। তারপর Get started-এ ক্লিক করুন।

- আপনি এখন অথেনটিকেশন ড্যাশবোর্ডে আছেন, যেখানে আপনি নিবন্ধিত ব্যবহারকারীদের দেখতে, সাইন-ইন প্রদানকারী কনফিগার করতে এবং সেটিংস পরিচালনা করতে পারবেন।
- সাইন-ইন পদ্ধতি ট্যাবটি নির্বাচন করুন (অথবা সরাসরি ট্যাবে যেতে এখানে ক্লিক করুন )।
- প্রোভাইডার অপশনগুলো থেকে Anonymous-এ ক্লিক করুন, সুইচটি Enable- এ টগল করুন এবং তারপর Save-এ ক্লিক করুন।
ক্লাউড ফায়ারস্টোর সেট আপ করুন
এই সুইফট অ্যাপ্লিকেশনটি নোট সংরক্ষণের জন্য ক্লাউড ফায়ারস্টোর ব্যবহার করে।
আপনার Firebase প্রোজেক্টে Cloud Firestore সেট আপ করার পদ্ধতি নিচে দেওয়া হলো:
- Firebase কনসোলের বাম প্যানেলে, Build প্রসারিত করুন এবং তারপরে Firestore database নির্বাচন করুন।
- ডাটাবেস তৈরি করুন -এ ক্লিক করুন।
- ডাটাবেস আইডি
(default)হিসেবেই রাখুন। - আপনার ডেটাবেসের জন্য একটি অবস্থান নির্বাচন করুন, তারপর 'পরবর্তী' বোতামে ক্লিক করুন।
একটি বাস্তব অ্যাপের জন্য, আপনি এমন একটি অবস্থান বেছে নিতে চাইবেন যা আপনার ব্যবহারকারীদের কাছাকাছি। - টেস্ট মোডে স্টার্ট-এ ক্লিক করুন। নিরাপত্তা নিয়মাবলী সম্পর্কিত দাবিত্যাগটি পড়ুন।
এই কোডল্যাবের পরবর্তী অংশে, আপনি আপনার ডেটা সুরক্ষিত করার জন্য সিকিউরিটি রুলস যোগ করবেন। আপনার ডেটাবেসের জন্য সিকিউরিটি রুলস যোগ না করে কোনো অ্যাপ সর্বজনীনভাবে বিতরণ বা প্রকাশ করবেন না । - তৈরি করুন- এ ক্লিক করুন।
ফায়ারবেসের জন্য ক্লাউড স্টোরেজ সেট আপ করুন
ওয়েব অ্যাপটি ছবি সংরক্ষণ, আপলোড এবং শেয়ার করার জন্য ক্লাউড স্টোরেজ ফর ফায়ারবেস ব্যবহার করে।
আপনার Firebase প্রোজেক্টে Cloud Storage for Firebase সেট আপ করার পদ্ধতি নিচে দেওয়া হলো:
- Firebase কনসোলের বাম প্যানেলে, Build প্রসারিত করুন এবং তারপর Storage নির্বাচন করুন।
- শুরু করতে ক্লিক করুন।
- আপনার ডিফল্ট স্টোরেজ বাকেটের জন্য একটি অবস্থান নির্বাচন করুন।
US-WEST1,US-CENTRAL1, এবংUS-EAST1এর বাকেটগুলো গুগল ক্লাউড স্টোরেজের 'অলওয়েজ ফ্রি' টায়ারের সুবিধা নিতে পারবে। অন্য সব অবস্থানের বাকেটগুলো গুগল ক্লাউড স্টোরেজের মূল্য এবং ব্যবহারবিধি অনুসরণ করবে। - টেস্ট মোডে স্টার্ট-এ ক্লিক করুন। নিরাপত্তা নিয়মাবলী সম্পর্কিত দাবিত্যাগটি পড়ুন।
এই কোডল্যাবের পরবর্তী অংশে, আপনি আপনার ডেটা সুরক্ষিত করার জন্য নিরাপত্তা নিয়ম যোগ করবেন। আপনার স্টোরেজ বাকেটের জন্য নিরাপত্তা নিয়ম যোগ না করে কোনো অ্যাপ সর্বজনীনভাবে বিতরণ বা প্রকাশ করবেন না । - তৈরি করুন- এ ক্লিক করুন।
৩. মোবাইল অ্যাপটি সংযুক্ত করুন
কোডল্যাবের এই অংশে, আপনি একটি সাধারণ নোট-নেওয়ার অ্যাপের সোর্স কোড ডাউনলোড করবেন এবং সেটিকে আপনার সদ্য তৈরি করা ফায়ারবেস প্রজেক্টের সাথে সংযুক্ত করবেন।
নমুনা অ্যাপটি ডাউনলোড করুন
- https://github.com/FirebaseExtended/codelab-firestore-vectorsearch-ios -এ যান এবং রিপোজিটরিটি আপনার লোকাল মেশিনে ক্লোন করুন।
- Xcode-এ Notes.xcodeproj প্রজেক্টটি খুলুন।
অ্যাপটিকে আপনার ফায়ারবেস প্রজেক্টের সাথে সংযুক্ত করুন।
আপনার অ্যাপ যাতে ফায়ারবেস সার্ভিসগুলো অ্যাক্সেস করতে পারে, তার জন্য আপনাকে ফায়ারবেস কনসোলে অ্যাপটি সেট আপ করতে হবে। আপনি একই ফায়ারবেস প্রজেক্টের সাথে একাধিক ক্লায়েন্ট অ্যাপ্লিকেশন সংযুক্ত করতে পারেন; উদাহরণস্বরূপ, যদি আপনি একটি অ্যান্ড্রয়েড বা ওয়েব অ্যাপ তৈরি করেন, তবে সেগুলোকে একই ফায়ারবেস প্রজেক্টের সাথে সংযুক্ত করা উচিত।
ফায়ারবেস প্রজেক্ট সম্পর্কে আরও জানতে, “ফায়ারবেস প্রজেক্ট বুঝুন” দেখুন।
- ফায়ারবেস কনসোলে, আপনার ফায়ারবেস প্রজেক্টের ওভারভিউ পেজে যান।

- আপনার iOS অ্যাপ যোগ করতে iOS+ আইকনে ক্লিক করুন।
- আপনার Apple অ্যাপে Firebase যোগ করার স্ক্রিনে, Xcode প্রজেক্ট থেকে বান্ডেল আইডি ( com.google.firebase.codelab.Notes ) প্রবেশ করান।
- আপনি চাইলে একটি অ্যাপের ডাকনাম লিখতে পারেন ( iOS-এর জন্য Notes )।
- পরবর্তী ধাপে যেতে 'Register app'-এ ক্লিক করুন।
- GoogleServices-Info.plist ফাইলটি ডাউনলোড করুন।
- GoogleServices-Info.plist ফাইলটি আপনার Xcode প্রজেক্টের Notes ফোল্ডারে ড্র্যাগ করুন। এটি করার একটি ভালো উপায় হলো ফাইলটিকে Assets.xcassets ফাইলের নিচে রাখা।

- প্রয়োজনে আইটেম কপি করুন নির্বাচন করুন, নিশ্চিত করুন যে ' লক্ষ্যগুলিতে যোগ করুন' -এ নোটস লক্ষ্যটি নির্বাচিত আছে, এবং 'সমাপ্ত'- এ ক্লিক করুন।

- ফায়ারবেস কনসোলে, আপনি এখন বাকি সেটআপ প্রক্রিয়াটি সম্পন্ন করতে পারেন: এই বিভাগের শুরুতে আপনি যে নমুনাটি ডাউনলোড করেছেন, তাতে ইতিমধ্যেই ফায়ারবেস অ্যাপল এসডিকে ইনস্টল করা আছে এবং ইনিশিয়ালাইজেশনও সেট আপ করা আছে। ‘Continue to console’ এ ক্লিক করে আপনি প্রক্রিয়াটি শেষ করতে পারেন।
অ্যাপটি চালান
এবার অ্যাপটি ব্যবহার করে দেখার পালা!
- Xcode-এ ফিরে এসে, iOS সিমুলেটরে অ্যাপটি চালান। 'Run Destinations' ড্রপ-ডাউন থেকে প্রথমে iOS সিমুলেটরগুলোর মধ্যে একটি বেছে নিন।

- এরপর, রান বাটনে ক্লিক করুন, অথবা ⌘ + R চাপুন।
- সিমুলেটরে অ্যাপটি সফলভাবে চালু হয়ে গেলে, কয়েকটি নোট যোগ করুন।
- Firebase কনসোলে, Firestore ডেটা ব্রাউজারে যান, যাতে আপনি অ্যাপটিতে নতুন নোট যোগ করার সাথে সাথে নতুন ডকুমেন্ট তৈরি হতে দেখতে পারেন।

৪. ভেক্টর সার্চ উইথ ফায়ারস্টোর এক্সটেনশনটি ইনস্টল করুন।
কোডল্যাবের এই অংশে, আপনি ‘Vector Search with Firestore’ এক্সটেনশনটি ইনস্টল করবেন এবং আপনার তৈরি করা নোট-টেকিং অ্যাপটির প্রয়োজন অনুযায়ী এটি কনফিগার করবেন।
এক্সটেনশনটি ইনস্টল করা শুরু করুন
- ফায়ারস্টোর সেকশনেই, এক্সটেনশন ট্যাবে ক্লিক করুন।

- এক্সপ্লোর এক্সটেনশন হাব-এ ক্লিক করুন।

- 'vector' টাইপ করুন।
- ‘Vector Search with Firestore extension’-এ ক্লিক করুন।
এটি আপনাকে এক্সটেনশনটির বিস্তারিত পাতায় নিয়ে যাবে, যেখানে আপনি এক্সটেনশনটি সম্পর্কে আরও পড়তে পারবেন, এটি কীভাবে কাজ করে, এর জন্য কোন কোন ফায়ারবেস পরিষেবা প্রয়োজন এবং কীভাবে এটি কনফিগার করতে পারেন। - Firebase কনসোলে Install- এ ক্লিক করুন।

- আপনাকে আপনার সমস্ত প্রকল্পের একটি তালিকা দেখানো হবে।
- এই কোডল্যাবের প্রথম ধাপে আপনার তৈরি করা প্রজেক্টটি বেছে নিন।

এক্সটেনশনটি কনফিগার করুন
- সক্রিয় করা API এবং তৈরি করা রিসোর্সগুলো পর্যালোচনা করুন।

- প্রয়োজনীয় পরিষেবাগুলো সক্রিয় করুন।

- সব পরিষেবা চালু হয়ে গেলে, Next- এ ক্লিক করুন।

- এই এক্সটেনশনে প্রদত্ত অ্যাক্সেস পর্যালোচনা করুন।
- এক্সটেনশনটি কনফিগার করুন:
- ভার্টেক্স AI-কে LLM হিসেবে নির্বাচন করুন
- সংগ্রহের পথ : নোট
- ডিফল্ট কোয়েরি সীমা : ৩
- ইনপুট ফিল্ডের নাম : টেক্সট
- আউটপুট ফিল্ডের নাম: এমবেডিং
- স্ট্যাটাস ফিল্ডের নাম: * স্ট্যাটাস
- বিদ্যমান নথি সংযুক্ত করুন : হ্যাঁ
- বিদ্যমান নথি আপডেট করুন : হ্যাঁ
- ক্লাউড ফাংশনের অবস্থান : us-central1
- ইনস্টলেশন সম্পন্ন করতে 'Install extension'- এ ক্লিক করুন।
এতে কয়েক মিনিট সময় লাগতে পারে। ইনস্টলেশন সম্পূর্ণ হওয়ার জন্য অপেক্ষা করার সময়, আপনি নির্দ্বিধায় টিউটোরিয়ালের পরবর্তী অংশে চলে যেতে পারেন এবং ভেক্টর এমবেডিং সম্পর্কে কিছু প্রাথমিক তথ্য পড়ে নিতে পারেন।
৫. পটভূমি
ইনস্টলেশন শেষ হওয়ার জন্য অপেক্ষা করার সময়ে, ভেক্টর সার্চ উইথ ফায়ারস্টোর এক্সটেনশনটি কীভাবে কাজ করে সে সম্পর্কে এখানে কিছু প্রাথমিক তথ্য দেওয়া হলো।
ভেক্টর, এমবেডিং এবং ভেক্টর ডেটাবেস বলতে কী বোঝায়?
- ভেক্টর হলো এমন গাণিতিক বস্তু যা কোনো রাশির মান ও দিক প্রকাশ করে। ডেটা তুলনা ও অনুসন্ধান সহজ করার জন্য এটি ব্যবহার করা যেতে পারে।
- এমবেডিং হলো এমন ভেক্টর যা কোনো শব্দ বা বাক্যাংশের অর্থকে উপস্থাপন করে। একটি বৃহৎ টেক্সট কর্পাসের উপর নিউরাল নেটওয়ার্ককে প্রশিক্ষণ দিয়ে এবং শব্দগুলোর মধ্যকার সম্পর্ক শিখিয়ে এগুলো তৈরি করা হয়।
- ভেক্টর ডেটাবেস হলো এমন ডেটাবেস যা ভেক্টর ডেটা সংরক্ষণ এবং অনুসন্ধানের জন্য বিশেষভাবে তৈরি। এগুলি কার্যকর নিকটতম প্রতিবেশী অনুসন্ধানের সুযোগ দেয়, যা হলো একটি প্রদত্ত কোয়েরি ভেক্টরের সবচেয়ে অনুরূপ ভেক্টরগুলি খুঁজে বের করার প্রক্রিয়া।
ভেক্টর সার্চ কীভাবে কাজ করে?
ভেক্টর সার্চ ডাটাবেসে থাকা সমস্ত ভেক্টরের সাথে কোয়েরি ভেক্টরকে তুলনা করার মাধ্যমে কাজ করে। যে ভেক্টরগুলো কোয়েরি ভেক্টরের সাথে সবচেয়ে বেশি সাদৃশ্যপূর্ণ, সেগুলোকে সার্চের ফলাফল হিসেবে ফেরত দেওয়া হয়।
দুটি ভেক্টরের মধ্যে সাদৃশ্য বিভিন্ন দূরত্ব মেট্রিক ব্যবহার করে পরিমাপ করা যায়। সবচেয়ে প্রচলিত দূরত্ব মেট্রিক হলো কোসাইন সাদৃশ্য, যা দুটি ভেক্টরের মধ্যবর্তী কোণ পরিমাপ করে।
৬. ফায়ারস্টোর এক্সটেনশনের সাথে ভেক্টর সার্চ ব্যবহার করে দেখুন
এই কোডল্যাবে আগে ডাউনলোড করা iOS অ্যাপটিতে ‘ Vector Search with Firestore’ এক্সটেনশনটি ব্যবহার করার আগে, আপনি Firebase কনসোলে এক্সটেনশনটি পরীক্ষা করে দেখতে পারেন।
ডকুমেন্টেশন পড়ুন
ফায়ারবেস এক্সটেনশনগুলো কীভাবে কাজ করে, সে সম্পর্কে ডকুমেন্টেশন অন্তর্ভুক্ত থাকে।
- এক্সটেনশনটি ইনস্টল হয়ে গেলে, ' Get started' বোতামে ক্লিক করুন।

- 'এই এক্সটেনশনটি কীভাবে কাজ করে' ট্যাবটি দেখুন - সেখানে ব্যাখ্যা করা আছে:
-
notesকালেকশনে ডকুমেন্ট যোগ করার মাধ্যমে সেগুলোর এমবেডিং কীভাবে গণনা করতে হয়, -
ext-firestore-vector-search-queryCallableকলযোগ্য ফাংশনটি কল করে কীভাবে ইনডেক্স কোয়েরি করতে হয়, - অথবা
_firestore-vector-search/index/queriesকালেকশনে একটি কোয়েরি ডকুমেন্ট যোগ করে কীভাবে ইনডেক্স কোয়েরি করতে হয়। - এটি একটি কাস্টম এমবেডিং ফাংশন কীভাবে সেট আপ করতে হয় তাও ব্যাখ্যা করে — এটি তখন কাজে আসে যখন এক্সটেনশন দ্বারা সমর্থিত কোনো LLM-ই আপনার প্রয়োজনীয়তা পূরণ করে না এবং আপনি এমবেডিং গণনা করার জন্য একটি ভিন্ন LLM ব্যবহার করতে চান।

-
- আপনার ফায়ারস্টোর ইনস্ট্যান্সে যেতে ক্লাউড ফায়ারস্টোর ড্যাশবোর্ড লিঙ্কে ক্লিক করুন।
-
_firestore-vector-search/indexডকুমেন্টটিতে যান। সেখানে দেখা যাবে যে, এই কোডল্যাবের পূর্ববর্তী ধাপে আপনার তৈরি করা সমস্ত নোটস ডকুমেন্টের জন্য এক্সটেনশনটি এমবেডিং গণনা করা শেষ করেছে।
- এটি যাচাই করার জন্য, নোটস ডকুমেন্টগুলোর মধ্যে একটি খুলুন, এবং আপনি
vector<768>টাইপেরembeddingনামের একটি অতিরিক্ত ফিল্ডের পাশাপাশি একটিstatusফিল্ডও দেখতে পাবেন।
একটি নমুনা নথি তৈরি করুন
এক্সটেনশনটি বাস্তবে দেখতে আপনি ফায়ারবেস কনসোলে একটি নতুন ডকুমেন্ট তৈরি করতে পারেন।
- ফায়ারস্টোর ডেটা ব্রাউজারে থাকা অবস্থায়,
notesকালেকশনে যান এবং মাঝের কলামে থাকা ‘+ অ্যাড ডকুমেন্ট’- এ ক্লিক করুন।
- একটি নতুন অনন্য ডকুমেন্ট আইডি তৈরি করতে অটো-আইডি-তে ক্লিক করুন।
- '
textনামে একটি স্ট্রিং টাইপের ফিল্ড যোগ করুন এবং এর 'value' ফিল্ডে কিছু টেক্সট পেস্ট করুন। এটা গুরুত্বপূর্ণ যে টেক্সটটি যেন লরেম ইপসাম বা অন্য কোনো এলোমেলো টেক্সট না হয়। উদাহরণস্বরূপ, একটি সংবাদ নিবন্ধ বেছে নিন।
- সংরক্ষণ করুন- এ ক্লিক করুন।
- লক্ষ্য করুন, এক্সটেনশনটি ডেটা প্রসেস করার বিষয়টি বোঝাতে একটি স্ট্যাটাস ফিল্ড যোগ করে।
- কিছুক্ষণ পর, আপনি
vector<768>মান সহ একটি নতুন ফিল্ডembeddingদেখতে পাবেন।

একটি কোয়েরি সম্পাদন করুন
Vector Search with Firestore এক্সটেনশনটিতে একটি চমৎকার ছোট বৈশিষ্ট্য রয়েছে যা আপনাকে কোনো অ্যাপ সংযোগ না করেই ডকুমেন্ট ইনডেক্স কোয়েরি করার সুযোগ দেয়।
- Firebase কনসোলের Firestore বিভাগে,
_firestore-vector-search/indexডকুমেন্টটিতে যান। - + সংগ্রহ শুরু করতে ক্লিক করুন

-
queriesনামে একটি নতুন উপ-সংগ্রহ তৈরি করুন - একটি নতুন ডকুমেন্ট তৈরি করুন এবং
queryফিল্ডটিকে আপনার ডকুমেন্টগুলোর কোনো একটিতে থাকা কোনো টেক্সটে সেট করুন। এটি সিমান্টিক কোয়েরির জন্য সবচেয়ে ভালো কাজ করে, যেমন "আমি কীভাবে সুইফট দিয়ে ফায়ারস্টোর ডকুমেন্ট ম্যাপ করতে পারি" (যদি আপনার যোগ করা নোটগুলোর মধ্যে অন্তত একটিতে এই বিষয়টি নিয়ে আলোচনা করা টেক্সট থাকে)।
- আপনি স্ট্যাটাসে একটি ত্রুটি দেখতে পারেন।

- ইনডেক্স অনুপস্থিত থাকার কারণে এমনটি হয়েছে। অনুপস্থিত ইনডেক্স কনফিগারেশনটি সেট আপ করতে, এই লিঙ্কে গিয়ে আপনার প্রোজেক্টের গুগল ক্লাউড কনসোলে যান এবং তারপর তালিকা থেকে আপনার প্রোজেক্টটি নির্বাচন করুন।

- ক্লাউড লগ এক্সপ্লোরারে, আপনি এখন একটি ত্রুটির বার্তা দেখতে পাবেন যেখানে লেখা থাকবে "FAILED_PRECONDITION: Missing vector index configuration. Please create the required index with following gcloud command: ..."

- ত্রুটির বার্তায় একটি
gcloudকমান্ডও রয়েছে, যা অনুপস্থিত ইনডেক্সটি কনফিগার করার জন্য আপনাকে চালাতে হবে। - আপনার কমান্ড লাইন থেকে নিম্নলিখিত কমান্ডটি চালান। যদি আপনার মেশিনে
gcloudCLI ইনস্টল করা না থাকে, তবে এটি ইনস্টল করার জন্য এখানকার নির্দেশাবলী অনুসরণ করুন। ইনডেক্স তৈরি হতে কয়েক মিনিট সময় লাগে। আপনি Firebase কনসোলের Firestore বিভাগের Indexes ট্যাবে এর অগ্রগতি দেখতে পারেন।gcloud alpha firestore indexes composite create --project=INSERT-YOUR=PROJECT-ID-HERE --collection-group=notes --query-scope=COLLECTION --field-config=vector-config='{"dimension":"768","flat": "{}"}',field-path=embedding
- ইনডেক্সটি সেট আপ হয়ে গেলে, আপনি একটি নতুন কোয়েরি ডকুমেন্ট তৈরি করতে পারবেন।
- এখন আপনি ফলাফল ক্ষেত্রে মিলে যাওয়া নথি আইডিগুলির একটি তালিকা দেখতে পাবেন।

- ওই আইডিগুলোর মধ্যে একটি কপি করুন এবং
notesসংগ্রহে ফিরে যান। - আপনার কপি করা ডকুমেন্ট আইডিটি খুঁজতে ⌘+F ব্যবহার করুন - এই ডকুমেন্টটিই আপনার অনুসন্ধানের সাথে সবচেয়ে ভালোভাবে মেলে।

৭. শব্দার্থিক অনুসন্ধান বাস্তবায়ন করুন
অবশেষে আপনার মোবাইল অ্যাপটিকে ভেক্টর সার্চ উইথ ফায়ারস্টোর এক্সটেনশনের সাথে সংযুক্ত করার এবং একটি সিম্যান্টিক সার্চ ফিচার প্রয়োগ করার সময় এসেছে, যা আপনার ব্যবহারকারীদের স্বাভাবিক ভাষার কোয়েরি ব্যবহার করে তাদের নোট অনুসন্ধান করার সুযোগ দেবে।
কোয়েরি সম্পাদনের জন্য কলযোগ্য ফাংশনটি সংযুক্ত করুন।
ফায়ারস্টোর এক্সটেনশনের ভেক্টর সার্চ-এ একটি ক্লাউড ফাংশন রয়েছে, যা আপনি এই কোডল্যাবে আগে তৈরি করা ইনডেক্সটি কোয়েরি করার জন্য আপনার মোবাইল অ্যাপ থেকে কল করতে পারেন। এই ধাপে, আপনি আপনার মোবাইল অ্যাপ এবং এই কলযোগ্য ফাংশনটির মধ্যে একটি সংযোগ স্থাপন করবেন। ফায়ারবেসের সুইফট এসডিকে-তে এমন এপিআই রয়েছে যা রিমোট ফাংশন কল করাকে নির্বিঘ্ন করে তোলে।
- Xcode-এ ফিরে যান এবং নিশ্চিত করুন যে আপনি এই কোডল্যাবের পূর্ববর্তী ধাপে ক্লোন করা প্রজেক্টটিতে আছেন।
-
NotesRepository.swiftফাইলটি খুলুন। -
private lazy var vectorSearchQueryCallable: Callableসম্বলিত লাইনটি খুঁজুন।= functions.httpsCallable("") private lazy var vectorSearchQueryCallable: Callable= functions.httpsCallable("")
একটি কলযোগ্য ক্লাউড ফাংশন চালু করতে, আপনাকে যে ফাংশনটি কল করতে চান তার নাম প্রদান করতে হবে।
- আপনার প্রোজেক্টের Firebase কনসোলে যান এবং Build সেকশনের Functions মেনু আইটেমটি খুলুন।
- আপনি এক্সটেনশনটির মাধ্যমে ইনস্টল করা ফাংশনগুলোর একটি তালিকা দেখতে পাবেন।
-
ext-firestore-vector-search-queryCallableনামের ফাইলটি খুঁজুন এবং এর নামটি কপি করুন। - আপনার কোডে নামটি পেস্ট করুন। এটি এখন দেখতে এমন হবে
private lazy var vectorSearchQueryCallable: Callable<String, String> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
কোয়েরি ফাংশনটি কল করুন
-
performQueryপদ্ধতিটি খুঁজুন। - আপনার কলযোগ্য ফাংশনটিকে কল করুন
let result = try await vectorSearchQueryCallable(searchTerm)
যেহেতু এটি একটি রিমোট কল, তাই এটি ব্যর্থ হতে পারে।
- যেকোনো ত্রুটি ধরতে এবং সেগুলোকে এক্সকোডের কনসোলে লগ করতে কিছু প্রাথমিক ত্রুটি হ্যান্ডলিং যোগ করুন।
private func performQuery(searchTerm: String) async -> [String] { do { let result = try await vectorSearchQueryCallable(searchTerm) return [result] } catch { print(error.localizedDescription) return [] } }
UI সংযুক্ত করুন
ব্যবহারকারীদের নোট অনুসন্ধান করার সুযোগ দিতে, আপনাকে নোট তালিকা স্ক্রিনে একটি সার্চ বার যুক্ত করতে হবে। যখন ব্যবহারকারী কোনো সার্চ টার্ম টাইপ করবে, তখন আপনাকে পূর্ববর্তী ধাপে ইমপ্লিমেন্ট করা performQuery মেথডটি কল করতে হবে। SwiftUI-এর searchable এবং task view মডিফায়ারগুলোর কল্যাণে, এর জন্য মাত্র কয়েক লাইনের কোডই যথেষ্ট।
- প্রথমে,
NotesListScreen.swiftখুলুন। - লিস্ট ভিউতে একটি সার্চ বক্স যোগ করতে,
.navigationTitle("Notes")লাইনটির ঠিক উপরে.searchable(text: $searchTerm, prompt: "Search")ভিউ মডিফায়ারটি যোগ করুন। - তারপর, ঠিক নিচে নিম্নলিখিত কোডটি যোগ করে সার্চ ফাংশনটি চালু করুন:
.task(id: searchTerm, debounce: .milliseconds(800)) {
await notesRepository.semanticSearch(searchTerm: searchTerm)
}
এই কোড স্নিপেটটি আপনার semanticSearch মেথডকে অ্যাসিঙ্ক্রোনাসভাবে কল করে। ৮০০ মিলিসেকেন্ডের একটি টাইমআউট দেওয়ার মাধ্যমে, আপনি টাস্ক মডিফায়ারকে ব্যবহারকারীর ইনপুটকে ০.৮ সেকেন্ড ধরে ডিবাউন্স করতে নির্দেশ দেন। এর মানে হলো, ব্যবহারকারী ০.৮ সেকেন্ডের বেশি সময় ধরে টাইপ করা থামালে তবেই semanticSearch কল করা হবে।
আপনার কোডটি এখন দেখতে এইরকম হবে:
...
List(repository.notes) { note in
NavigationLink(value: note) {
NoteRowView(note: note)
}
.swipeActions {
Button(role: .destructive, action: { deleteNote(note: note) }) {
Label("Delete", systemImage: "trash")
}
}
}
.searchable(text: $searchTerm, prompt: "Search")
.task(id: searchTerm, debounce: .milliseconds(800)) {
await notesRepository.semanticSearch(searchTerm: searchTerm)
}
.navigationTitle("Notes")
...
অ্যাপটি চালান
- iOS সিমুলেটরে অ্যাপটি চালু করতে ⌘ + R চাপুন (অথবা রান বাটনে ক্লিক করুন)।
- এই কোডল্যাবের শুরুতে অ্যাপে যোগ করা নোটগুলো, সেইসাথে ফায়ারবেস কনসোলের মাধ্যমে যোগ করা নোটগুলোও আপনি দেখতে পাবেন।
- আপনি নোট তালিকার শীর্ষে একটি অনুসন্ধান ক্ষেত্র দেখতে পাবেন।
- আপনার যোগ করা ডকুমেন্টগুলোর মধ্যে কোনো একটিতে থাকা একটি শব্দ টাইপ করুন। আবারও বলছি, এটি শব্দার্থগত প্রশ্নের জন্য সবচেয়ে ভালো কাজ করে, যেমন "আমি কীভাবে সুইফট থেকে অ্যাসিঙ্ক্রোনাস ফায়ারবেস এপিআই কল করতে পারি" (যদি আপনার যোগ করা নোটগুলোর মধ্যে অন্তত একটিতে এই বিষয়টি নিয়ে আলোচনা করা লেখা থাকে)।
- আপনি সম্ভবত সার্চের ফলাফল দেখতে আশা করছেন, কিন্তু তার পরিবর্তে লিস্ট ভিউটি খালি থাকে এবং Xcode কনসোলে একটি এরর মেসেজ দেখায়: "The function was called with an invalid argument" (ফাংশনটিকে একটি অবৈধ আর্গুমেন্ট দিয়ে কল করা হয়েছিল)।

এর মানে হলো আপনি ডেটা ভুল ফরম্যাটে পাঠিয়েছেন।
ত্রুটির বার্তাটি বিশ্লেষণ করুন
- সমস্যাটি জানতে, Firebase কনসোলে যান।
- ফাংশন বিভাগে যান
-
ext-firestore-vector-search-queryCallableফাংশনটি খুঁজুন, তিনটি উল্লম্ব ডটে ক্লিক করে ওভারফ্লো মেনুটি খুলুন। - লগ এক্সপ্লোরারে যেতে 'ভিউ লগস' নির্বাচন করুন।
- আপনি একটি ত্রুটি দেখতে পাবেন।
Unhandled error ZodError: [
{
"code": "invalid_type",
"expected": "object",
"received": "string",
"path": [],
"message": "Expected object, received string"
}
]
এর মানে হলো আপনি ডেটা ভুল ফরম্যাটে পাঠিয়েছেন।
সঠিক ডেটা টাইপ ব্যবহার করুন
এক্সটেনশনটি প্যারামিটারগুলো কোন ফরম্যাটে আশা করে, তা জানতে এক্সটেনশনটির ডকুমেন্টেশন দেখুন।
- Firebase কনসোলের এক্সটেনশন বিভাগে যান
- ম্যানেজ-এ ক্লিক করুন ->

- “এই এক্সটেনশনটি কীভাবে কাজ করে” অংশে আপনি ইনপুট এবং আউটপুট প্যারামিটারগুলোর বিবরণ পাবেন।

- Xcode-এ ফিরে যান এবং
NotesRepository.swiftএ নেভিগেট করুন। - ফাইলের শুরুতে নিম্নলিখিত কোডটি যোগ করুন:
এক্সটেনশনের ডকুমেন্টেশন অনুযায়ী,private struct QueryRequest: Codable { var query: String var limit: Int? var prefilters: [QueryFilter]? } private struct QueryFilter: Codable { var field: String var `operator`: String var value: String } private struct QueryResponse: Codable { var ids: [String] }QueryRequestএক্সটেনশনটির প্রত্যাশিত ইনপুট প্যারামিটারের কাঠামোর সাথে মেলে। এতে একটি নেস্টেডprefilterঅ্যাট্রিবিউটও থাকে যা আপনার পরে প্রয়োজন হবে।QueryResponseএক্সটেনশনটির রেসপন্সের কাঠামোর সাথে মেলে। - কলযোগ্য ফাংশন স্পেসিফিকেশনটি খুঁজুন এবং ইনপুট ও আউটপুট টাইপ আপডেট করুন।
private lazy var vectorSearchQueryCallable: Callable<QueryRequest, QueryResponse> = functions.httpsCallable("ext-firestore-vector-search-queryCallable") performQueryতে কলযোগ্য ফাংশনের আহ্বান আপডেট করুন।private func performQuery(searchTerm: String) async -> [String] { do { let queryRequest = QueryRequest(query: searchTerm, limit: 2) let result = try await vectorSearchQueryCallable(queryRequest) print(result.ids) return result.ids } catch { print(error.localizedDescription) return [] } }
অ্যাপটি আবার চালান
- অ্যাপটি আবার চালান
- আপনার নোটগুলোর কোনো একটিতে অন্তর্ভুক্ত শব্দগুলো দিয়ে একটি অনুসন্ধান প্রশ্ন টাইপ করুন।
- এখন আপনি নোটগুলির একটি ফিল্টার করা তালিকা দেখতে পাবেন।

ব্যবহারকারীর ডেটা প্রি-ফিল্টার করুন
উদযাপন করে নাচতে শুরু করার আগে জেনে রাখুন - অ্যাপটির বর্তমান সংস্করণে একটি সমস্যা রয়েছে: ফলাফল সেটে সকল ব্যবহারকারীর ডেটা অন্তর্ভুক্ত রয়েছে।
আপনি অন্য একটি সিমুলেটরে অ্যাপটি চালিয়ে এবং আরও ডকুমেন্ট যোগ করে এটি যাচাই করতে পারেন। নতুন ডকুমেন্টগুলো শুধুমাত্র সেই সিমুলেটরেই দেখা যাবে; আপনি যদি অন্য সিমুলেটরে অ্যাপটি আবার চালান, তবে আপনি কেবল প্রথমবার তৈরি করা ডকুমেন্টগুলোই দেখতে পাবেন।
অনুসন্ধান করলে আপনি লক্ষ্য করবেন যে, vectorSearchQueryCallable কলটি এমন ডকুমেন্ট আইডি ফেরত দেয় যা অন্য ব্যবহারকারীর হতে পারে। এটি রোধ করতে, আমাদের একটি প্রিফিল্টার ব্যবহার করতে হবে।
performQuery তে আপনার কোডটি নিম্নরূপভাবে আপডেট করুন:
let prefilters: [QueryFilter] = if let uid = user?.uid {
[QueryFilter(field: "userId", operator: "==", value: uid)]
}
else {
[]
}
let queryRequest = QueryRequest(query: searchTerm,
limit: 2,
prefilters: prefilters)
এটি লগ-ইন করা ব্যবহারকারীর আইডির উপর ভিত্তি করে ডেটা প্রি-ফিল্টার করবে। যেমনটা আপনি আশা করতে পারেন, এর জন্য ফায়ারস্টোর ইনডেক্স আপডেট করা প্রয়োজন।
embedding ফিল্ডে userId এবং ভেক্টর এমবেডিং উভয়ই অন্তর্ভুক্ত করে একটি নতুন ফায়ারস্টোর ইনডেক্স তৈরি করতে কমান্ড লাইন থেকে নিম্নলিখিত কমান্ডটি চালান।
gcloud alpha firestore indexes composite create --project=INSERT-YOUR-PROJECT-ID-HERE --collection-group=notes --query-scope=COLLECTION --field-config=order=ASCENDING,field-path=userId --field-config=vector-config='{"dimension":"768","flat": "{}"}',field-path=embedding
ইনডেক্স তৈরি হয়ে গেলে, অ্যাপটি প্রত্যাশা অনুযায়ী কাজ করছে কিনা তা যাচাই করতে আবার চালান।

৮. অভিনন্দন
এই কোডল্যাবটি সফলভাবে সম্পন্ন করার জন্য অভিনন্দন!
এই কোডল্যাবে, আপনি শিখেছেন কীভাবে:
- সিমান্টিক সার্চ সক্রিয় করে একটি ক্লাউড ফায়ারস্টোর ডেটাবেস সেট আপ করুন।
- ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করার জন্য একটি সহজ SwiftUI অ্যাপ তৈরি করুন।
- SwiftUI-এর সার্চেবল ভিউ মডিফায়ার এবং টাস্ক মডিফায়ার ব্যবহার করে একটি সার্চ বার তৈরি করুন।
- Firestore SDK-এর Callable ইন্টারফেস ব্যবহার করে ডাটাবেসে একটি সিম্যান্টিক সার্চ চালানোর জন্য একটি ক্লাউড ফাংশন কল করুন।
এই কোডল্যাবে অর্জিত জ্ঞান ব্যবহার করে, আপনি এখন ক্লাউড ফায়ারস্টোরের সিমান্টিক সার্চ সক্ষমতাকে কাজে লাগিয়ে শক্তিশালী অ্যাপ্লিকেশন তৈরি করতে পারবেন, যা ব্যবহারকারীদের আরও স্বজ্ঞামূলক এবং কার্যকর অনুসন্ধানের অভিজ্ঞতা প্রদান করবে।
Firestore-এর নতুন ভেক্টর ফিল্ড এবং ভেক্টর এমবেডিং গণনা করার পদ্ধতি সম্পর্কে আরও জানতে, ডকুমেন্টেশন দেখুন।