এই ব্লগ পোস্টে, আমি আপনাকে ভেক্টর ডেটাবেস, ভেক্টর অনুসন্ধান, এবং পাইথনের ল্যাংচেইন প্যাকেজের মৌলিক বিষয়গুলির মাধ্যমে গাইড করব, যা তুলনামূলক ভেক্টরগুলির সঞ্চয় এবং পুনরুদ্ধারের সুবিধা দেয়।
আমাদের যাত্রা শুরু করার জন্য, আমরা "এম্বেডিংস" নামে পরিচিত একটি গুরুত্বপূর্ণ ধারণা দিয়ে শুরু করব।
এই নিবন্ধে, আমরা এমবেডিংয়ের ধারণাটি অন্বেষণ করব – মেশিন লার্নিংয়ের একটি মৌলিক দিক যা আমাদেরকে এমন একটি বিন্যাসে পাঠ্য ডেটা উপস্থাপন করতে দেয় যা মেশিনগুলি সহজেই বুঝতে পারে।
মূলত, এমবেডিংগুলি পাঠ্যের ভেক্টর উপস্থাপনা হিসাবে কাজ করে, শব্দ, বাক্য এবং প্যাসেজের জটিল ওয়েবকে একটি সংখ্যাসূচক বিন্যাসে রূপান্তর করে যা মেশিনগুলি প্রক্রিয়া করতে পারে।
একটি চাপা সমস্যা দেখা দেয়: মানুষ কি এই এমবেডিংগুলি বোঝাতে পারে? উত্তর হল না। এমবেডিংগুলি মূলত সংখ্যার ক্রম যা পাঠ্য তথ্যকে এনক্যাপসুলেট করে।
ফলস্বরূপ, এম্বেডিং ভেক্টরের সাথে বোঝা এবং কাজ করা মানুষের জন্য একটি কঠিন কাজ হতে পারে, যখন মেশিনগুলি সহজেই এটি পরিচালনা করে।
পাঠ্য থেকে এমবেডিং তৈরি করার জন্য অগণিত কৌশল বিদ্যমান। উল্লেখযোগ্য পদ্ধতির মধ্যে রয়েছে TF-IDF, Word2Vec, Glove, এবং BERT ইত্যাদি। মেশিন লার্নিং এর সমসাময়িক পরিমন্ডলে, শব্দ এমবেডিং এর তুলনায় বাক্য এম্বেডিং জনপ্রিয়তা পেয়েছে।
এই বাক্য এমবেডিংগুলি, একটি পাঠ্যের সারমর্মকে উপস্থাপন করে, "অল-মিনিএলএম-এল6-ভি2" এবং "অল-এমপিনেট-বেস-ভি2" এর মতো প্রাক-প্রশিক্ষিত বাক্য ট্রান্সফরমার মডেলগুলি থেকে প্রাপ্ত করা যেতে পারে।
এই মডেলগুলি একটি নির্দিষ্ট পাঠ্যের জন্য নির্দিষ্ট মাত্রা, সাধারণত 384 বা 768 মাত্রা সহ এমবেডিং তৈরি করে।
এখন যেহেতু আমরা তাদের প্রজন্মের জন্য এম্বেডিংয়ের মৌলিক বিষয়গুলি এবং বিভিন্ন কৌশলগুলি অন্বেষণ করেছি, আসুন একটি ভেক্টর স্টোরে এই উচ্চ-মাত্রিক এমবেডিং ভেক্টরগুলি সংরক্ষণ করার চ্যালেঞ্জের দিকে আমাদের ফোকাস স্থানান্তর করা যাক।
একটি ভেক্টর ডেটা স্টোর হল একটি বিশেষ ডাটাবেস যা অডিও, ভিডিও, চিত্র, পাঠ্য এবং আরও অনেক কিছু সহ বিভিন্ন ধরণের ডেটার উচ্চ-মাত্রিক এমবেডিং উপস্থাপনা সংরক্ষণ করার জন্য ডিজাইন করা হয়েছে।
এর মূল কার্যকারিতাগুলির মধ্যে একটি হল স্টোরের মধ্যে এমন ভেক্টরগুলির জন্য দক্ষতার সাথে অনুসন্ধান করার ক্ষমতা যা একটি প্রদত্ত ক্যোয়ারী ভেক্টরের সাথে ঘনিষ্ঠভাবে সাদৃশ্যপূর্ণ।
ভেক্টর স্টোরগুলি এম্বেডিংগুলি সংরক্ষণ করার এবং এই ভেক্টরগুলির মধ্যে সাদৃশ্য অনুসন্ধান পরিচালনা করার প্রক্রিয়াকে প্রবাহিত করে, উচ্চ-মাত্রিক ডেটা উপস্থাপনাগুলির পরিচালনা এবং পুনরুদ্ধারকে সহজ করে।
ভেক্টর এমবেডিংয়ের ক্ষেত্রে, সাদৃশ্য অনুসন্ধানের মধ্যে দুই বা ততোধিক এম্বেডিংয়ের মধ্যে প্রক্সিমিটি বা সম্পর্কিততা পরিমাপ করা জড়িত। সাধারণত, এটি বিভিন্ন দূরত্ব মেট্রিক্স ব্যবহার করে সাদৃশ্য গণনা করে সম্পন্ন করা হয়। কিছু সাধারণভাবে ব্যবহৃত এবং ব্যাপকভাবে স্বীকৃত দূরত্বের মেট্রিক্সের মধ্যে রয়েছে ইউক্লিডীয় দূরত্ব, ম্যানহাটান দূরত্ব এবং কোসাইন দূরত্ব, অন্যদের মধ্যে। এই মেট্রিকগুলি আমাদের ভেক্টরের মধ্যে সাদৃশ্য বা বৈষম্যের মাত্রা পরিমাপ করতে সাহায্য করে, ডেটার মধ্যে কার্যকর মিল অনুসন্ধানের সুবিধা দেয়।
একটি উদাহরণ হিসাবে, একটি গ্রাফের দুটি বিন্দুর মধ্যে সাদৃশ্য বা ঘনিষ্ঠতা নির্ধারণ করার সময়, ইউক্লিডীয় দূরত্ব সাধারণত ব্যবহার করা হয়। এই দূরত্ব নিম্নলিখিত সূত্র ব্যবহার করে গণনা করা যেতে পারে:
ইউক্লিডীয় দূরত্ব = [(x2 - x1)^2 + (y2 - y1)^2]^0.5
এখানে, (x1, y1) প্রথম বিন্দুর স্থানাঙ্কের প্রতিনিধিত্ব করে এবং (x2, y2) গ্রাফের দ্বিতীয় বিন্দুর স্থানাঙ্কগুলিকে উপস্থাপন করে। এই গণনার ফলাফল দুটি বিন্দুর মধ্যে স্থানিক বিচ্ছিন্নতার একটি পরিমাপ প্রদান করে, যা গ্রাফের মধ্যে তাদের অবস্থানের পরিপ্রেক্ষিতে তাদের মিল বা অসাম্য নির্দেশ করে।
একইভাবে, সাদৃশ্য অনুসন্ধানে, এম্বেডিংগুলিকে একটি উচ্চ-মাত্রিক স্থানের মধ্যে চিত্রিত করা হয়, প্রতিটি রেকর্ড একটি ডেটা পয়েন্ট হিসাবে পরিবেশন করে।
নীচের কোডের লাইনটি দেখায় কিভাবে একটি প্রদত্ত ইনপুট ডেটার জন্য শীর্ষ 5টি অনুরূপ এম্বেডিং পুনরুদ্ধার করতে হয়:
distance, n = vector_store.search(input_embedding, k=5)
এই কোডটি শীর্ষ 5টি এমবেডিংয়ের একটি তালিকা ফিরিয়ে দেবে যা ইনপুট ডেটার সাথে ঘনিষ্ঠভাবে সাদৃশ্যপূর্ণ, এটিকে বিভিন্ন অ্যাপ্লিকেশন যেমন সুপারিশ সিস্টেম, বিষয়বস্তু পুনরুদ্ধার এবং আরও অনেক কিছুর জন্য একটি মূল্যবান হাতিয়ার করে তোলে৷
vector_store.search() ফাংশন আউটপুট ইনপুট_এম্বেডিং থেকে তাদের নিজ নিজ দূরত্ব সহ শীর্ষ-কে অনুরূপ এম্বেডিং নিয়ে গঠিত। প্যারামিটার "k" হল একটি কনফিগারযোগ্য মান যা সাদৃশ্য অনুসন্ধানে পুনরুদ্ধারের জন্য নিকটতম এম্বেডিংয়ের সংখ্যা নির্ধারণ করে। আপনি অনুসন্ধান অপারেশন দ্বারা ফিরে ফলাফলের পছন্দসই সংখ্যা নিয়ন্ত্রণ করতে "k" সেট করতে পারেন.
এখন যেহেতু আমরা ভেক্টর স্টোরগুলির একটি ভিত্তিগত বোঝাপড়া প্রতিষ্ঠা করেছি, আসুন ল্যাংচেইন প্যাকেজ এবং FAISS-এর দিকে এগিয়ে যাই। এই সরঞ্জামগুলি উচ্চ-মাত্রিক এম্বেডিংয়ের সাথে কাজ করার এবং দক্ষ মিল অনুসন্ধানগুলি সম্পাদন করার ক্ষমতাকে আরও বাড়িয়ে তুলবে৷
সহজ ভাষায় বললে, ল্যাংচেইন হল এমন একটি কাঠামো যা অ্যাপ্লিকেশন তৈরির জন্য ডিজাইন করা হয়েছে যা লার্জ ল্যাঙ্গুয়েজ মডেলের (LLMs) ক্ষমতাকে কাজে লাগায়। আরো বিস্তারিত তথ্য এবং সম্পদের জন্য, আপনি অফিসিয়াল ল্যাংচেইন ডকুমেন্টেশন উল্লেখ করতে পারেন।
বিপরীতভাবে, FAISS, যার অর্থ হল "Facebook AI Similarity Search," হল একটি পাইথন লাইব্রেরি যা ডেভেলপারদেরকে প্রচলিত হ্যাশ-ভিত্তিক পন্থা থেকে সরে এসে একই ধরনের এমবেডিং অনুসন্ধান করার দ্রুত এবং কার্যকর উপায় প্রদান করে।
এই লাইব্রেরিটি Facebook AI টিম দ্বারা তৈরি করা হয়েছে এবং উচ্চ-মাত্রিক স্থানগুলিতে সাদৃশ্য অনুসন্ধানের জন্য শক্তিশালী ক্ষমতা প্রদান করে।
FAISS হল একটি ওপেন সোর্স লাইব্রেরি যা আপনার নিজের সার্ভারে হোস্ট করা যায়।
LangChain এবং FAISS এর অন্বেষণে, আমরা এখন LangChain কাঠামোর মধ্যে FAISS বাস্তবায়নের লক্ষ্য রাখব। নিচে LangChain-এর FAISS ইন্টিগ্রেশনের কিছু মূল API রয়েছে যা আমরা এই নিবন্ধে ফোকাস করব:
add_documents() : এই ফাংশনটি আমাদের ভেক্টর স্টোরে অতিরিক্ত নথি অন্তর্ভুক্ত করতে দেয়।
add_embeddings() : এটি ভেক্টর স্টোরে আরও এম্বেডিং যোগ করতে সক্ষম করে।
from_documents() : এই API প্রদত্ত নথির উপর ভিত্তি করে একটি ভেক্টরস্টোর প্রদান করে।
from_embeddings() : এই ফাংশনটি প্রদত্ত এমবেডিং থেকে তৈরি একটি FAISS সূচক প্রদান করে।
load_local() : ডিস্ক থেকে FAISS সূচক লোড করতে এটি ব্যবহার করুন।
save_local() : এটি আপনাকে ডিস্কে একটি FAISS সূচক সংরক্ষণ করতে দেয়।
similarity_search() : এই ফাংশনটি এমন নথি উদ্ধার করে যা প্রদত্ত প্রশ্নের সাথে সবচেয়ে বেশি মিল।
similarity_search_by_vector() : এটি এমন নথি উদ্ধার করে যা প্রদত্ত এম্বেডিংয়ের সাথে সবচেয়ে বেশি মিল।
এই APIগুলি FAISS-এর সাথে LangChain-এর ক্ষমতাগুলিকে একত্রিত করার ভিত্তি তৈরি করে, আপনাকে এমবেডিংয়ের সাথে কাজ করতে এবং আপনার অ্যাপ্লিকেশনগুলির মধ্যে দক্ষ মিল অনুসন্ধান করতে সক্ষম করে৷
মেটা-ফিল্টারিং একটি মূল্যবান কৌশল যা LangChain FAISS-এ একটি অনুসন্ধান প্রশ্নের ফলাফলকে পরিমার্জন করতে ব্যবহৃত হয়। সাধারণত দুই ধরনের মেটা-ফিল্টারিং আছে: প্রি-ফিল্টারিং এবং পোস্ট-ফিল্টারিং। আমাদের কাঠামোতে, আমরা বিশেষভাবে সার্চ কোয়েরির জন্য পোস্ট-ফিল্টারিং সমর্থন করি।
এটি লক্ষ্য করা গুরুত্বপূর্ণ যে অনুসন্ধান ফলাফলের জন্য মেটা-ফিল্টারিংয়ের ধারণাটি FAISS-এর LangChain সংস্করণে উপলব্ধ একটি বৈশিষ্ট্য এবং এটি FAISS-এর মূল বাস্তবায়নে উপস্থিত নয়। এই পোস্ট-ফিল্টারিং ক্ষমতা ব্যবহারকারীদের জন্য আরও উপযোগী ফলাফল অফার করে অনুসন্ধান ফলাফলের নির্ভুলতা এবং প্রাসঙ্গিকতা বাড়ায়।
LangChain FAISS API-এর জ্ঞানে সজ্জিত, আসুন LangChain FAISS-এর পাইথন বাস্তবায়নে ডুব দেওয়া যাক। এই বাস্তবায়ন আপনাকে এমবেডিংয়ের সাথে কাজ করতে, মিল অনুসন্ধান করতে এবং LangChain ফ্রেমওয়ার্কের মধ্যে আপনার অনুসন্ধান ফলাফলগুলিকে সূক্ষ্ম-টিউন করতে পোস্ট-ফিল্টারিং কৌশল প্রয়োগ করতে সক্ষম করবে৷
FAISS-এর সাথে বৃহৎ ভাষার মডেল এবং উন্নত সাদৃশ্য অনুসন্ধানের শক্তিকে কাজে লাগাতে পারে এমন অ্যাপ্লিকেশন তৈরি করতে এই ক্ষমতাগুলি অন্বেষণ এবং লাভ করতে নির্দ্বিধায়৷
এই নির্দেশমূলক নির্দেশিকায়, আমরা স্ট্যানফোর্ড ডেটাসেটকে বেস ডেটাসেট হিসেবে বেছে নিয়েছি এবং LangChain FAISS-এ মেটা-ফিল্টারিংয়ের কাজ দেখানোর জন্য কয়েকটি কলাম যোগ করেছি।
আমরা প্রয়োজনীয় প্যাকেজগুলি ইনস্টল এবং আমদানির সাথে শুরু করব
!pip install langchain[all] !pip3 install Langchain[FAISS] !pip install faiss-cpu # WARNING: langchain 0.0.74 does not provide the extra 'faiss'
from langchain import FAISS import pandas as pd import numpy as np import os import time import pickle
এখন, আমরা ডেটাসেট আমদানি করব:
passage_data = pd.read_csv("/Users/shyam/Python_Programs/Text Similarity Codes/Standford_Edited.csv") passage_data.drop(columns=["Unnamed: 0"],axis=1, inplace=True) passage_data
ডেটাসেট থাকার কারণে, পাঠ্য ডেটাকে ভেক্টরে রূপান্তর করতে আমাদের একটি এমবেডিং ফাংশন শুরু করতে হবে। আমরা "বাক্য-ট্রান্সফরমার/অল-মিনিএলএম-এল6-ভি2" ব্যবহার করেছি যা 384 মাত্রায় এম্বেডিং তৈরি করে,
from langchain.embeddings import SentenceTransformerEmbeddings embedding_function = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")
আমরা মেটাডেটা তথ্য সেট করব। মেটাডেটাতে, আমরা প্রতিটি এম্বেডিংয়ের (সামগ্রী) জন্য নথি আইডি এবং নথির ভাষা যোগ করেছি,
start=time.time() metadatas = [] for index, row in passage_data.iterrows(): doc_meta = { "id": row['Id'], "language": row['Language'] } metadatas.append(doc_meta)
এটাই... আমরা এখন আমাদের FAISS সূচক তৈরি করব,
faiss = FAISS.from_texts(passage_data['Content'].tolist(), embedding_function, metadatas) print("Time Taken --> ", time.time()-start)
এখন, আমরা FAISS সূচকটিকে ডিস্কে সংরক্ষণ করার চেষ্টা করব এবং এটিকে আবার লোড করব:
faiss.save_local("/Users/shyam/Python_Programs/LangChain_FAISS", "Standford") loaded_faiss = faiss.load_local("/Users/shyam/Python_Programs/LangChain_FAISS",embedding_function, "Standford")
আমরা FAISS সূচক তৈরি, সংরক্ষণ এবং লোড করার কাজ সম্পন্ন করেছি। এটি অনুমান করার সময়। আমরা কিছু প্রশ্ন অনুসন্ধান করার চেষ্টা করব এবং FAISS সূচক পরীক্ষা করব।
প্রথমত, আমরা "নাস্তিকতা" সম্পর্কিত শীর্ষ পাঁচটি অনুরূপ নথি পাব৷
start=time.time() loaded_faiss.similarity_search_with_score("What is atheism?",5)
ভাল, ফলাফল বিশ্বাসযোগ্য হয়. তবে এখনও, আমরা আরও অন্বেষণ করব...
এই সময়, আমরা কিছু মেটা-ফিল্টারিং সহ একটি ভিন্ন ভাষা ক্যোয়ারী চেষ্টা করব। ফিল্টার করার মানদণ্ড {lang: 'ru_RU'} হওয়া উচিত বলে আমরা একটি রাশিয়ান প্রশ্ন জিজ্ঞাসা করব৷
#Что такое атеизм? - Russian loaded_faiss.similarity_search_with_score("Что такое атеизм?",5, {"language":"ru_RU"}, 10)
এখানে, আমরা ভেক্টর স্টোর থেকে দশটি অনুরূপ নথি নেওয়ার কথা উল্লেখ করেছি, এবং তারপর আমাদের প্রশ্নের জন্য সেরা পাঁচটি নথি পেতে আমাদের ফিল্টারিং শর্ত প্রয়োগ করছি।
এই নিবন্ধটি শেষ করার পরে, আমি বিশ্বাস করি আপনি ভেক্টর স্টোর এবং ভেক্টর অনুসন্ধানের একটি কঠিন উপলব্ধি অর্জন করেছেন। আমরা এর কার্যকারিতা চিত্রিত করার জন্য LangChain FAISS-এর একটি প্রদর্শনও প্রদান করেছি।
আমি দৃঢ়ভাবে আপনাকে অন্যান্য ভেক্টর স্টোর যেমন ChromaDb, Qdrant, Milvus, এবং আরও অনেক কিছু অন্বেষণ করতে উত্সাহিত করি।
প্রতিটি ভেক্টর স্টোর তার অনন্য সুবিধা এবং অসুবিধাগুলির সাথে আসে, তাই আপনার ব্যবহারের ক্ষেত্রে নির্দিষ্ট প্রয়োজনীয়তার উপর ভিত্তি করে আপনার নির্বাচন করুন।
আপনার একটি আনন্দদায়ক এবং ফলপ্রসূ শেখার যাত্রা কামনা করছি!