paint-brush
আপনার নিজস্ব RAG অ্যাপ তৈরি করুন: Ollama, Python, এবং ChromaDB ব্যবহার করে স্থানীয়ভাবে LLM সেটআপ করার জন্য একটি ধাপে ধাপে নির্দেশিকাদ্বারা@nassermaronie
6,499 পড়া
6,499 পড়া

আপনার নিজস্ব RAG অ্যাপ তৈরি করুন: Ollama, Python, এবং ChromaDB ব্যবহার করে স্থানীয়ভাবে LLM সেটআপ করার জন্য একটি ধাপে ধাপে নির্দেশিকা

দ্বারা Nasser Maronie13m2024/07/04
Read on Terminal Reader

অতিদীর্ঘ; পড়তে

এই টিউটোরিয়ালটি আপনাকে [Ollama], [Python 3, এবং [ChromaDB] ব্যবহার করে একটি কাস্টম চ্যাটবট তৈরি করার প্রক্রিয়ার মাধ্যমে গাইড করবে আপনার নিজস্ব পুনরুদ্ধার-অগমেন্টেড জেনারেশন (RAG) অ্যাপ্লিকেশন স্থানীয়ভাবে হোস্ট করার অর্থ হল সেটআপ এবং কাস্টমাইজেশনের উপর আপনার সম্পূর্ণ নিয়ন্ত্রণ রয়েছে।
featured image - আপনার নিজস্ব RAG অ্যাপ তৈরি করুন: Ollama, Python, এবং ChromaDB ব্যবহার করে স্থানীয়ভাবে LLM সেটআপ করার জন্য একটি ধাপে ধাপে নির্দেশিকা
Nasser Maronie HackerNoon profile picture
0-item
1-item

এমন একটি যুগে যেখানে ডেটা গোপনীয়তা সর্বাগ্রে, আপনার নিজস্ব স্থানীয় ভাষা মডেল (LLM) সেট আপ করা কোম্পানি এবং ব্যক্তিদের জন্য একইভাবে একটি গুরুত্বপূর্ণ সমাধান প্রদান করে৷ এই টিউটোরিয়ালটি আপনার সিস্টেমে স্থানীয়ভাবে হোস্ট করা Ollama , Python 3 এবং ChromaDB ব্যবহার করে একটি কাস্টম চ্যাটবট তৈরি করার প্রক্রিয়ার মাধ্যমে আপনাকে গাইড করার জন্য ডিজাইন করা হয়েছে। আপনার এই টিউটোরিয়ালটি কেন প্রয়োজন তা এখানে মূল কারণ রয়েছে:


  • সম্পূর্ণ কাস্টমাইজেশন: স্থানীয়ভাবে আপনার নিজস্ব পুনরুদ্ধার-অগমেন্টেড জেনারেশন (RAG) অ্যাপ্লিকেশন হোস্ট করার অর্থ হল সেটআপ এবং কাস্টমাইজেশনের উপর আপনার সম্পূর্ণ নিয়ন্ত্রণ রয়েছে। আপনি বাহ্যিক পরিষেবার উপর নির্ভর না করে আপনার নির্দিষ্ট প্রয়োজনের সাথে মানানসই মডেলটি সূক্ষ্ম-টিউন করতে পারেন।
  • উন্নত গোপনীয়তা: স্থানীয়ভাবে আপনার এলএলএম মডেল সেট আপ করার মাধ্যমে, আপনি ইন্টারনেটে সংবেদনশীল ডেটা পাঠানোর সাথে সম্পর্কিত ঝুঁকিগুলি এড়াতে পারেন। গোপনীয় তথ্য পরিচালনা করে এমন কোম্পানিগুলির জন্য এটি বিশেষভাবে গুরুত্বপূর্ণ। স্থানীয়ভাবে ব্যক্তিগত ডেটা দিয়ে আপনার মডেলকে প্রশিক্ষণ দেওয়া নিশ্চিত করে যে আপনার ডেটা আপনার নিয়ন্ত্রণের মধ্যে থাকবে।
  • ডেটা সুরক্ষা: তৃতীয় পক্ষের এলএলএম মডেলগুলি ব্যবহার করে আপনার ডেটা সম্ভাব্য লঙ্ঘন এবং অপব্যবহারের জন্য প্রকাশ করতে পারে। স্থানীয় স্থাপনা আপনার প্রশিক্ষণের ডেটা, যেমন পিডিএফ নথি, আপনার নিরাপদ পরিবেশের মধ্যে রেখে এই ঝুঁকিগুলি হ্রাস করে।
  • ডেটা প্রক্রিয়াকরণের উপর নিয়ন্ত্রণ: আপনি যখন আপনার নিজের এলএলএম হোস্ট করেন, তখন আপনি যেভাবে চান ঠিক সেইভাবে আপনার ডেটা পরিচালনা এবং প্রক্রিয়া করার ক্ষমতা থাকে। এর মধ্যে রয়েছে আপনার ChromaDB ভেক্টর স্টোরে আপনার ব্যক্তিগত ডেটা এম্বেড করা, আপনার ডেটা প্রক্রিয়াকরণ আপনার মান এবং প্রয়োজনীয়তা পূরণ করে তা নিশ্চিত করা।
  • ইন্টারনেট সংযোগ থেকে স্বাধীনতা: স্থানীয়ভাবে আপনার চ্যাটবট চালানো মানে আপনি ইন্টারনেট সংযোগের উপর নির্ভরশীল নন। এটি নিরবচ্ছিন্ন পরিষেবা এবং আপনার চ্যাটবটে অ্যাক্সেসের গ্যারান্টি দেয়, এমনকি অফলাইন পরিস্থিতিতেও।


এই টিউটোরিয়ালটি আপনাকে গোপনীয়তা বা নিয়ন্ত্রণের সাথে আপস না করে আপনার প্রয়োজন অনুসারে একটি শক্তিশালী এবং সুরক্ষিত স্থানীয় চ্যাটবট তৈরি করতে সক্ষম করবে।

ফাইন টিউনিং মডেল


পুনরুদ্ধার-অগমেন্টেড জেনারেশন (RAG)

Retrieval-Augmented Generation (RAG) হল একটি উন্নত কৌশল যা তথ্য পুনরুদ্ধার এবং টেক্সট জেনারেশনের শক্তিগুলিকে আরও সঠিক এবং প্রাসঙ্গিকভাবে প্রাসঙ্গিক প্রতিক্রিয়া তৈরি করতে একত্রিত করে। এখানে RAG কীভাবে কাজ করে এবং কেন এটি উপকারী তার একটি ব্রেকডাউন রয়েছে:

RAG কি?

RAG হল একটি হাইব্রিড মডেল যা একটি বাহ্যিক জ্ঞানের ভিত্তি বা নথির দোকানকে অন্তর্ভুক্ত করে ভাষার মডেলগুলির ক্ষমতা বাড়ায়। প্রক্রিয়া দুটি প্রধান উপাদান জড়িত:

  • পুনরুদ্ধার: এই পর্যায়ে, মডেলটি ইনপুট প্রশ্নের উপর ভিত্তি করে একটি বাহ্যিক উত্স, যেমন একটি ডাটাবেস বা একটি ভেক্টর স্টোর থেকে প্রাসঙ্গিক নথি বা তথ্যের টুকরো পুনরুদ্ধার করে।
  • জেনারেশন: পুনরুদ্ধার করা তথ্য একটি সুসংগত এবং প্রাসঙ্গিকভাবে উপযুক্ত প্রতিক্রিয়া তৈরি করতে একটি জেনারেটিভ ভাষা মডেল দ্বারা ব্যবহার করা হয়।

কিভাবে RAG কাজ করে?

  • কোয়েরি ইনপুট: ব্যবহারকারী একটি প্রশ্ন বা প্রশ্ন ইনপুট করে।
  • নথি পুনরুদ্ধার: সিস্টেমটি একটি বাহ্যিক জ্ঞানের ভিত্তি অনুসন্ধান করতে, সবচেয়ে প্রাসঙ্গিক নথি বা তথ্যের স্নিপেটগুলি পুনরুদ্ধার করতে ক্যোয়ারী ব্যবহার করে।
  • রেসপন্স জেনারেশন: জেনারেটিভ মডেল পুনরুদ্ধার করা তথ্যকে প্রক্রিয়া করে, এটিকে তার নিজস্ব জ্ঞানের সাথে একীভূত করে বিস্তারিত এবং সঠিক প্রতিক্রিয়া তৈরি করে।
  • আউটপুট: চূড়ান্ত প্রতিক্রিয়া, জ্ঞানের ভিত্তি থেকে নির্দিষ্ট এবং প্রাসঙ্গিক বিবরণ দিয়ে সমৃদ্ধ, ব্যবহারকারীর কাছে উপস্থাপন করা হয়।

RAG এর সুবিধা

  • বর্ধিত নির্ভুলতা: বাহ্যিক ডেটা ব্যবহার করে, RAG মডেলগুলি আরও সুনির্দিষ্ট এবং বিস্তারিত উত্তর প্রদান করতে পারে, বিশেষ করে ডোমেন-নির্দিষ্ট প্রশ্নের জন্য।
  • প্রাসঙ্গিক প্রাসঙ্গিকতা: পুনরুদ্ধারের উপাদানটি নিশ্চিত করে যে উত্পন্ন প্রতিক্রিয়া প্রাসঙ্গিক এবং আপ-টু-ডেট তথ্যে ভিত্তি করে, প্রতিক্রিয়ার সামগ্রিক গুণমানকে উন্নত করে।
  • পরিমাপযোগ্যতা: RAG সিস্টেমগুলিকে বিপুল পরিমাণে ডেটা অন্তর্ভুক্ত করার জন্য সহজেই স্কেল করা যেতে পারে, তাদের বিস্তৃত প্রশ্ন এবং বিষয়গুলি পরিচালনা করতে সক্ষম করে।
  • নমনীয়তা: এই মডেলগুলিকে কেবলমাত্র বাহ্যিক জ্ঞানের ভিত্তি আপডেট বা প্রসারিত করার মাধ্যমে বিভিন্ন ডোমেনে অভিযোজিত করা যেতে পারে, তাদের অত্যন্ত বহুমুখী করে তোলে।

কেন স্থানীয়ভাবে RAG ব্যবহার করবেন?

  • গোপনীয়তা এবং নিরাপত্তা: স্থানীয়ভাবে একটি RAG মডেল চালানো নিশ্চিত করে যে সংবেদনশীল ডেটা সুরক্ষিত এবং ব্যক্তিগত থাকে, কারণ এটি বহিরাগত সার্ভারে পাঠানোর প্রয়োজন হয় না।
  • কাস্টমাইজেশন: আপনি মালিকানাধীন ডেটা উত্সগুলিকে একীভূত করা সহ আপনার নির্দিষ্ট প্রয়োজন অনুসারে পুনরুদ্ধার এবং প্রজন্মের প্রক্রিয়াগুলিকে টেইলর করতে পারেন।
  • স্বাধীনতা: একটি স্থানীয় সেটআপ নিশ্চিত করে যে আপনার সিস্টেমটি ইন্টারনেট সংযোগ ছাড়াই সচল থাকে, সামঞ্জস্যপূর্ণ এবং নির্ভরযোগ্য পরিষেবা প্রদান করে।

Ollama, Python, এবং ChromaDB-এর মতো সরঞ্জামগুলির সাথে একটি স্থানীয় RAG অ্যাপ্লিকেশন সেট আপ করে, আপনি আপনার ডেটা এবং কাস্টমাইজেশন বিকল্পগুলির উপর নিয়ন্ত্রণ বজায় রেখে উন্নত ভাষার মডেলগুলির সুবিধাগুলি উপভোগ করতে পারেন৷

RAG অ্যাপ


জিপিইউ

Retrieval-Augmented Generation (RAG)-এ ব্যবহৃত বৃহৎ ভাষার মডেল (LLM) চালানোর জন্য উল্লেখযোগ্য কম্পিউটেশনাল শক্তি প্রয়োজন। এই মডেলগুলিতে দক্ষ প্রক্রিয়াকরণ এবং ডেটা এমবেডিং সক্ষম করে এমন মূল উপাদানগুলির মধ্যে একটি হল গ্রাফিক্স প্রসেসিং ইউনিট (GPU)। এই কাজের জন্য কেন জিপিইউ অপরিহার্য এবং তারা কীভাবে আপনার স্থানীয় LLM সেটআপের কার্যকারিতাকে প্রভাবিত করে তা এখানে রয়েছে:

একটি GPU কি?

একটি GPU হল একটি বিশেষ প্রসেসর যা ছবি এবং ভিডিওর রেন্ডারিংকে ত্বরান্বিত করার জন্য ডিজাইন করা হয়েছে। সেন্ট্রাল প্রসেসিং ইউনিট (সিপিইউ) থেকে ভিন্ন, যেগুলি অনুক্রমিক প্রক্রিয়াকরণ কাজের জন্য অপ্টিমাইজ করা হয়, জিপিইউগুলি সমান্তরাল প্রক্রিয়াকরণে উৎকর্ষ লাভ করে। এটি মেশিন লার্নিং এবং ডিপ লার্নিং মডেলের জন্য প্রয়োজনীয় জটিল গাণিতিক গণনার জন্য বিশেষভাবে উপযুক্ত করে তোলে।

এলএলএম-এর জন্য কেন জিপিইউ গুরুত্বপূর্ণ

  • সমান্তরাল প্রসেসিং পাওয়ার: জিপিইউ একই সাথে হাজার হাজার অপারেশন পরিচালনা করতে পারে, উল্লেখযোগ্যভাবে LLM-তে প্রশিক্ষণ এবং অনুমানের মতো কাজগুলিকে দ্রুততর করে। বড় ডেটাসেট প্রক্রিয়াকরণ এবং রিয়েল-টাইমে প্রতিক্রিয়া তৈরি করার সাথে যুক্ত ভারী গণনামূলক লোডগুলির জন্য এই সমান্তরালতা অত্যন্ত গুরুত্বপূর্ণ।
  • বড় মডেলগুলি পরিচালনার দক্ষতা: RAG তে ব্যবহৃত এলএলএমগুলির জন্য যথেষ্ট মেমরি এবং কম্পিউটেশনাল রিসোর্স প্রয়োজন। GPU গুলি উচ্চ-ব্যান্ডউইথ মেমরি (HBM) এবং একাধিক কোর দিয়ে সজ্জিত, যা তাদের এই মডেলগুলির জন্য প্রয়োজনীয় বৃহৎ-স্কেল ম্যাট্রিক্স গুণন এবং টেনসর অপারেশনগুলি পরিচালনা করতে সক্ষম করে তোলে।
  • দ্রুত ডেটা এমবেডিং এবং পুনরুদ্ধার: একটি স্থানীয় RAG সেটআপে, ChromaDB-এর মতো ভেক্টর স্টোরে ডেটা এম্বেড করা এবং প্রাসঙ্গিক নথিগুলি দ্রুত পুনরুদ্ধার করা কার্যক্ষমতার জন্য অপরিহার্য। উচ্চ-কার্যক্ষমতা সম্পন্ন GPU গুলি এই প্রক্রিয়াগুলিকে ত্বরান্বিত করতে পারে, এটি নিশ্চিত করে যে আপনার চ্যাটবট দ্রুত এবং নির্ভুলভাবে সাড়া দেয়৷
  • উন্নত প্রশিক্ষণের সময়: একটি LLM প্রশিক্ষণের জন্য লক্ষ লক্ষ (বা এমনকি বিলিয়ন) প্যারামিটার সামঞ্জস্য করা জড়িত। আপনার মডেলে আরও ঘন ঘন আপডেট এবং পরিমার্জন সক্ষম করে, CPU-এর তুলনায় GPUs এই প্রশিক্ষণ পর্বের জন্য প্রয়োজনীয় সময়কে ব্যাপকভাবে হ্রাস করতে পারে।

সঠিক GPU নির্বাচন করা হচ্ছে

একটি স্থানীয় LLM সেট আপ করার সময়, GPU এর পছন্দ উল্লেখযোগ্যভাবে কর্মক্ষমতা প্রভাবিত করতে পারে। এখানে বিবেচনা করার জন্য কিছু কারণ রয়েছে:

  • মেমরির ক্ষমতা: বড় মডেলের জন্য আরও GPU মেমরির প্রয়োজন হয়। বিস্তৃত ডেটাসেট এবং মডেলের পরামিতিগুলিকে মিটমাট করার জন্য উচ্চতর VRAM (ভিডিও RAM) সহ GPU গুলি সন্ধান করুন৷
  • কম্পিউট করার ক্ষমতা: একটি জিপিইউতে যত বেশি CUDA কোর থাকে, এটি সমান্তরাল প্রক্রিয়াকরণের কাজগুলিকে আরও ভালভাবে পরিচালনা করতে পারে। উচ্চতর গণনা ক্ষমতা সহ GPU গুলি গভীর শিক্ষার কাজগুলির জন্য আরও দক্ষ।
  • ব্যান্ডউইথ: উচ্চতর মেমরি ব্যান্ডউইথ GPU এবং এর মেমরির মধ্যে দ্রুত ডেটা স্থানান্তর করতে দেয়, সামগ্রিক প্রক্রিয়াকরণের গতি উন্নত করে।

এলএলএম-এর জন্য উচ্চ-পারফরম্যান্স জিপিইউ-এর উদাহরণ

  • NVIDIA RTX 3090: এর উচ্চ VRAM (24 GB) এবং শক্তিশালী CUDA কোরের জন্য পরিচিত, এটি গভীর শিক্ষার কাজগুলির জন্য একটি জনপ্রিয় পছন্দ।
  • NVIDIA A100: AI এবং মেশিন লার্নিং এর জন্য বিশেষভাবে ডিজাইন করা হয়েছে, এটি বৃহৎ মেমরি ক্ষমতা এবং উচ্চ গণনা শক্তি সহ ব্যতিক্রমী কর্মক্ষমতা প্রদান করে।
  • AMD Radeon Pro VII: উচ্চ মেমরি ব্যান্ডউইথ এবং দক্ষ প্রক্রিয়াকরণ ক্ষমতা সহ আরেকটি শক্তিশালী প্রতিযোগী।

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


পূর্বশর্ত

সেটআপে ডুব দেওয়ার আগে, নিশ্চিত করুন যে আপনার কাছে নিম্নলিখিত পূর্বশর্তগুলি রয়েছে:

  • পাইথন 3: পাইথন একটি বহুমুখী প্রোগ্রামিং ভাষা যা আপনি আপনার RAG অ্যাপের কোড লিখতে ব্যবহার করবেন।
  • ChromaDB: একটি ভেক্টর ডাটাবেস যা আমাদের ডেটার এম্বেডিং সংরক্ষণ এবং পরিচালনা করবে।
  • ওল্লামা: আমাদের স্থানীয় মেশিনে কাস্টম এলএলএম ডাউনলোড এবং পরিবেশন করতে।

ধাপ 1: পাইথন 3 ইনস্টল করুন এবং আপনার পরিবেশ সেটআপ করুন

আমাদের পাইথন 3 পরিবেশ ইনস্টল এবং সেটআপ করতে, এই পদক্ষেপগুলি অনুসরণ করুন: আপনার মেশিনে পাইথন 3 ডাউনলোড এবং সেটআপ করুন । তারপর নিশ্চিত করুন যে আপনার পাইথন 3 ইনস্টল করা এবং সফলভাবে চালানো হচ্ছে:

 $ python3 --version # Python 3.11.7

আপনার প্রকল্পের জন্য একটি ফোল্ডার তৈরি করুন, উদাহরণস্বরূপ, local-rag :

 $ mkdir local-rag $ cd local-rag

venv নামে একটি ভার্চুয়াল পরিবেশ তৈরি করুন:

 $ python3 -m venv venv

ভার্চুয়াল পরিবেশ সক্রিয় করুন:

 $ source venv/bin/activate # Windows # venv\Scripts\activate

ধাপ 2: ChromaDB এবং অন্যান্য নির্ভরতা ইনস্টল করুন

পিপ ব্যবহার করে ChromaDB ইনস্টল করুন:

 $ pip install --q chromadb

আপনার মডেলের সাথে নির্বিঘ্নে কাজ করার জন্য ল্যাংচেইন সরঞ্জামগুলি ইনস্টল করুন:

 $ pip install --q unstructured langchain langchain-text-splitters $ pip install --q "unstructured[all-docs]"

আপনার অ্যাপটিকে HTTP পরিষেবা হিসাবে পরিবেশন করতে ফ্লাস্ক ইনস্টল করুন:

 $ pip install --q flask

ধাপ 3: ওল্লামা ইনস্টল করুন

ওল্লামা ইনস্টল করতে, এই পদক্ষেপগুলি অনুসরণ করুন: ওল্লামা ডাউনলোড পৃষ্ঠায় যান এবং আপনার অপারেটিং সিস্টেমের জন্য ইনস্টলারটি ডাউনলোড করুন। চালিয়ে আপনার ওল্লামা ইনস্টলেশন যাচাই করুন:

 $ ollama --version # ollama version is 0.1.47

আপনার প্রয়োজনীয় এলএলএম মডেলটি টানুন। উদাহরণস্বরূপ, মিস্ট্রাল মডেল ব্যবহার করতে:

 $ ollama pull mistral

টেক্সট এমবেডিং মডেল টানুন. উদাহরণস্বরূপ, Nomic এম্বেড টেক্সট মডেল ব্যবহার করতে:

 $ ollama pull nomic-embed-text

তারপর আপনার ওল্লামা মডেলগুলি চালান:

 $ ollama serve

RAG অ্যাপ তৈরি করুন

এখন আপনি Python, Ollama, ChromaDB এবং অন্যান্য নির্ভরতাগুলির সাথে আপনার পরিবেশ সেট আপ করেছেন, এটি আপনার কাস্টম স্থানীয় RAG অ্যাপ তৈরি করার সময়। এই বিভাগে, আমরা হ্যান্ডস-অন পাইথন কোডের মধ্য দিয়ে হেঁটে যাব এবং কীভাবে আপনার অ্যাপ্লিকেশন গঠন করতে হবে তার একটি ওভারভিউ প্রদান করব।

app.py

এটি প্রধান ফ্লাস্ক অ্যাপ্লিকেশন ফাইল। এটি ভেক্টর ডাটাবেসে ফাইল এম্বেড করার এবং মডেল থেকে প্রতিক্রিয়া পুনরুদ্ধারের জন্য রুটগুলি সংজ্ঞায়িত করে।

 import os from dotenv import load_dotenv load_dotenv() from flask import Flask, request, jsonify from embed import embed from query import query from get_vector_db import get_vector_db TEMP_FOLDER = os.getenv('TEMP_FOLDER', './_temp') os.makedirs(TEMP_FOLDER, exist_ok=True) app = Flask(__name__) @app.route('/embed', methods=['POST']) def route_embed(): if 'file' not in request.files: return jsonify({"error": "No file part"}), 400 file = request.files['file'] if file.filename == '': return jsonify({"error": "No selected file"}), 400 embedded = embed(file) if embedded: return jsonify({"message": "File embedded successfully"}), 200 return jsonify({"error": "File embedded unsuccessfully"}), 400 @app.route('/query', methods=['POST']) def route_query(): data = request.get_json() response = query(data.get('query')) if response: return jsonify({"message": response}), 200 return jsonify({"error": "Something went wrong"}), 400 if __name__ == '__main__': app.run(host="0.0.0.0", port=8080, debug=True)

embed.py

এই মডিউলটি আপলোড করা ফাইল সংরক্ষণ, ডেটা লোড করা এবং বিভক্ত করা এবং ভেক্টর ডাটাবেসে নথি যোগ করা সহ এমবেডিং প্রক্রিয়া পরিচালনা করে।

 import os from datetime import datetime from werkzeug.utils import secure_filename from langchain_community.document_loaders import UnstructuredPDFLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from get_vector_db import get_vector_db TEMP_FOLDER = os.getenv('TEMP_FOLDER', './_temp') # Function to check if the uploaded file is allowed (only PDF files) def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in {'pdf'} # Function to save the uploaded file to the temporary folder def save_file(file): # Save the uploaded file with a secure filename and return the file path ct = datetime.now() ts = ct.timestamp() filename = str(ts) + "_" + secure_filename(file.filename) file_path = os.path.join(TEMP_FOLDER, filename) file.save(file_path) return file_path # Function to load and split the data from the PDF file def load_and_split_data(file_path): # Load the PDF file and split the data into chunks loader = UnstructuredPDFLoader(file_path=file_path) data = loader.load() text_splitter = RecursiveCharacterTextSplitter(chunk_size=7500, chunk_overlap=100) chunks = text_splitter.split_documents(data) return chunks # Main function to handle the embedding process def embed(file): # Check if the file is valid, save it, load and split the data, add to the database, and remove the temporary file if file.filename != '' and file and allowed_file(file.filename): file_path = save_file(file) chunks = load_and_split_data(file_path) db = get_vector_db() db.add_documents(chunks) db.persist() os.remove(file_path) return True return False

query.py

এই মডিউলটি প্রশ্নের একাধিক সংস্করণ তৈরি করে, প্রাসঙ্গিক নথি পুনরুদ্ধার করে এবং প্রসঙ্গের উপর ভিত্তি করে উত্তর প্রদান করে ব্যবহারকারীর প্রশ্নগুলি প্রক্রিয়া করে।

 import os from langchain_community.chat_models import ChatOllama from langchain.prompts import ChatPromptTemplate, PromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough from langchain.retrievers.multi_query import MultiQueryRetriever from get_vector_db import get_vector_db LLM_MODEL = os.getenv('LLM_MODEL', 'mistral') # Function to get the prompt templates for generating alternative questions and answering based on context def get_prompt(): QUERY_PROMPT = PromptTemplate( input_variables=["question"], template="""You are an AI language model assistant. Your task is to generate five different versions of the given user question to retrieve relevant documents from a vector database. By generating multiple perspectives on the user question, your goal is to help the user overcome some of the limitations of the distance-based similarity search. Provide these alternative questions separated by newlines. Original question: {question}""", ) template = """Answer the question based ONLY on the following context: {context} Question: {question} """ prompt = ChatPromptTemplate.from_template(template) return QUERY_PROMPT, prompt # Main function to handle the query process def query(input): if input: # Initialize the language model with the specified model name llm = ChatOllama(model=LLM_MODEL) # Get the vector database instance db = get_vector_db() # Get the prompt templates QUERY_PROMPT, prompt = get_prompt() # Set up the retriever to generate multiple queries using the language model and the query prompt retriever = MultiQueryRetriever.from_llm( db.as_retriever(), llm, prompt=QUERY_PROMPT ) # Define the processing chain to retrieve context, generate the answer, and parse the output chain = ( {"context": retriever, "question": RunnablePassthrough()} | prompt | llm | StrOutputParser() ) response = chain.invoke(input) return response return None

get_vector_db.py

এই মডিউলটি ডকুমেন্ট এম্বেডিং সংরক্ষণ এবং পুনরুদ্ধারের জন্য ব্যবহৃত ভেক্টর ডাটাবেস উদাহরণটি শুরু করে এবং ফেরত দেয়।

 import os from langchain_community.embeddings import OllamaEmbeddings from langchain_community.vectorstores.chroma import Chroma CHROMA_PATH = os.getenv('CHROMA_PATH', 'chroma') COLLECTION_NAME = os.getenv('COLLECTION_NAME', 'local-rag') TEXT_EMBEDDING_MODEL = os.getenv('TEXT_EMBEDDING_MODEL', 'nomic-embed-text') def get_vector_db(): embedding = OllamaEmbeddings(model=TEXT_EMBEDDING_MODEL,show_progress=True) db = Chroma( collection_name=COLLECTION_NAME, persist_directory=CHROMA_PATH, embedding_function=embedding ) return db

আপনার অ্যাপ চালান!

আপনার পরিবেশ ভেরিয়েবল সংরক্ষণ করতে .env ফাইল তৈরি করুন:

 TEMP_FOLDER = './_temp' CHROMA_PATH = 'chroma' COLLECTION_NAME = 'local-rag' LLM_MODEL = 'mistral' TEXT_EMBEDDING_MODEL = 'nomic-embed-text'

আপনার অ্যাপ সার্ভার শুরু করতে app.py ফাইলটি চালান:

 $ python3 app.py

একবার সার্ভার চালু হলে, আপনি নিম্নলিখিত শেষ পয়েন্টগুলিতে অনুরোধ করা শুরু করতে পারেন:

  • একটি PDF ফাইল এম্বেড করার উদাহরণ কমান্ড (যেমন, resume.pdf):
 $ curl --request POST \ --url http://localhost:8080/embed \ --header 'Content-Type: multipart/form-data' \ --form file=@/Users/nassermaronie/Documents/Nasser-resume.pdf # Response { "message": "File embedded successfully" }
  • আপনার মডেলকে একটি প্রশ্ন জিজ্ঞাসা করার উদাহরণ কমান্ড:
 $ curl --request POST \ --url http://localhost:8080/query \ --header 'Content-Type: application/json' \ --data '{ "query": "Who is Nasser?" }' # Response { "message": "Nasser Maronie is a Full Stack Developer with experience in web and mobile app development. He has worked as a Lead Full Stack Engineer at Ulventech, a Senior Full Stack Engineer at Speedoc, a Senior Frontend Engineer at Irvins, and a Software Engineer at Tokopedia. His tech stacks include Typescript, ReactJS, VueJS, React Native, NodeJS, PHP, Golang, Python, MySQL, PostgresQL, MongoDB, Redis, AWS, Firebase, and Supabase. He has a Bachelor's degree in Information System from Universitas Amikom Yogyakarta." }

উপসংহার

এই নির্দেশাবলী অনুসরণ করে, আপনি কার্যকরভাবে আপনার প্রয়োজন অনুযায়ী Python, Ollama, এবং ChromaDB ব্যবহার করে আপনার কাস্টম স্থানীয় RAG অ্যাপ চালাতে এবং ইন্টারঅ্যাক্ট করতে পারেন। আপনার অ্যাপ্লিকেশনের ক্ষমতা বাড়ানোর জন্য প্রয়োজনীয় কার্যকারিতা সামঞ্জস্য করুন এবং প্রসারিত করুন।

স্থানীয় স্থাপনার ক্ষমতা ব্যবহার করে, আপনি শুধুমাত্র সংবেদনশীল তথ্য রক্ষা করেন না কিন্তু কর্মক্ষমতা এবং প্রতিক্রিয়াশীলতাকেও অপ্টিমাইজ করেন। আপনি গ্রাহকের ইন্টারঅ্যাকশন বাড়াচ্ছেন বা অভ্যন্তরীণ প্রক্রিয়াগুলিকে স্ট্রিমলাইন করছেন না কেন, একটি স্থানীয়ভাবে মোতায়েন করা RAG অ্যাপ্লিকেশন আপনার প্রয়োজনীয়তার সাথে খাপ খাইয়ে নিতে এবং বাড়াতে নমনীয়তা এবং দৃঢ়তা প্রদান করে।

এই রেপোতে সোর্স কোড চেক করুন:

https://github.com/firstpersoncode/local-rag


শুভ কোডিং!