30 മിനിറ്റിനുള്ളിൽ ഒരു ലോക്കൽ RAG ചാറ്റ്ബോട്ട് നിർമ്മിക്കാം
ഞാൻ 40 പേജുകളുള്ള ഒരു API സ്പെസിഫിക്കേഷൻ എന്റെ ലോക്കൽ ചാറ്റ്ബോട്ടിലേക്ക് അപ്ലോഡ് ചെയ്തു. ഒരു പ്രത്യേക എൻഡ്പോയിന്റിന്റെ (endpoint) റേറ്റ് ലിമിറ്റിനെക്കുറിച്ച് ഞാൻ അതിനോട് ചോദിച്ചു.
വെറും മൂന്ന് സെക്കൻഡിനുള്ളിൽ ബോട്ട് മറുപടി നൽകി. ഡോക്യുമെന്റിലെ കൃത്യമായ ഭാഗം അത് ഉദ്ധരിച്ചു.
ഇതിലെ ഏറ്റവും മികച്ച കാര്യം എന്താണെന്നോ? ഇതിന് ഒരു രൂപ പോലും ചിലവില്ല ($0). .NET 8, Ollama, React എന്നിവ ഉപയോഗിച്ച് എല്ലാം എന്റെ ലാപ്ടോപ്പിൽ തന്നെ പ്രവർത്തിക്കുന്നു. എന്റെ മെഷീനിൽ നിന്ന് ഒരു ഡാറ്റയും പുറത്തേക്ക് പോകുന്നില്ല.
മിക്ക ട്യൂട്ടോറിയലുകളും OpenAI ഉപയോഗിക്കാൻ നിർദ്ദേശിക്കുന്നു. ഡെമോകൾക്ക് അത് നല്ലതാണ്, എന്നാൽ യഥാർത്ഥ ജോലികൾക്ക് അത് പരാജയപ്പെടാൻ കാരണങ്ങൾ ഇവയാണ്:
- പ്രൈവസി (Privacy): കമ്പനിയുടെ സെൻസിറ്റീവ് ആയ ഡാറ്റ ക്ലൗഡ് ട്രെയിനിംഗ് പൈപ്പ്ലൈനുകളിൽ ഉൾപ്പെടുത്താൻ നിങ്ങൾ ആഗ്രഹിക്കില്ല.
- ചിലവ് (Cost): വലിയ ഫയലുകൾ ഒരു LLM-ലേക്ക് അയക്കുന്നത് പെട്ടെന്ന് വലിയ ചിലവിലേക്ക് നയിക്കും.
- ഹാലൂസിനേഷൻസ് (Hallucinations): നീളമുള്ള ഡോക്യുമെന്റുകളുടെ മധ്യഭാഗം മോഡലുകൾ പലപ്പോഴും മറന്നുപോകാറുണ്ട്.
ഇതിനുള്ള പരിഹാരം RAG (Retrieval-Augmented Generation) ആണ്. ഒരു മുഴുവൻ PDF-ഉം അയക്കുന്നതിന് പകരം, പ്രസക്തമായ ഭാഗങ്ങൾ (chunks) മാത്രം നിങ്ങൾ അയക്കുന്നു.
ഞാൻ ഈ പൈപ്പ്ലൈൻ നിർമ്മിച്ച രീതി ഇതാ:
• ടെക്സ്റ്റ് എക്സ്ട്രാക്ഷൻ (Text Extraction): PDF-കളിൽ നിന്ന് ടെക്സ്റ്റ് വേർതിരിച്ചെടുക്കാൻ ഞാൻ PdfPig ഉപയോഗിച്ചു. • ചങ്കിംഗ് (Chunking): ഞാൻ ടെക്സ്റ്റിനെ 500 വാക്കുകളുള്ള ഭാഗങ്ങളായി വിഭജിച്ചു, കൂടാതെ 50 വാക്കുകളുടെ ഓവർലാപ്പ് (overlap) നൽകുകയും ചെയ്തു. രണ്ട് ചങ്കുകൾക്കിടയിൽ കിടക്കുന്ന ഉത്തരങ്ങൾ മോഡൽ വിട്ടുപോകാതിരിക്കാൻ ഈ ഓവർലാപ്പ് സഹായിക്കുന്നു. • എംബെഡിംഗ്സ് (Embeddings): ടെക്സ്റ്റിനെ വെക്റ്ററുകളാക്കി മാറ്റാൻ ഞാൻ Ollama വഴി nomic-embed-text മോഡൽ ഉപയോഗിച്ചു. • വെക്റ്റർ സ്റ്റോർ (Vector Store): ഏറ്റവും അനുയോജ്യമായവ കണ്ടെത്താൻ കോസൈൻ സിമിലാരിറ്റി (cosine similarity) ഉപയോഗിച്ച് ഒരു ലളിതമായ ഇൻ-മെമ്മറി ലിസ്റ്റ് ഞാൻ നിർമ്മിച്ചു. • ജനറേഷൻ (Generation): കണ്ടെത്തിയ ചങ്കുകൾ മാത്രം ഉപയോഗിച്ച് ചോദ്യങ്ങൾക്ക് മറുപടി നൽകാൻ ഞാൻ llama3.2 ഉപയോഗിച്ചു.
നിർമ്മാണ വേളയിൽ ഞാൻ പഠിച്ച മൂന്ന് പാഠങ്ങൾ:
- കൂടുതൽ ടൈമൗട്ട് (Timeout) ഉപയോഗിക്കുക: ലോക്കൽ മോഡലുകൾ മെമ്മറിയിലേക്ക് ലോഡ് ചെയ്യാൻ സമയമെടുക്കും. കോൾഡ് സ്റ്റാർട്ടുകൾ (cold starts) സമയത്ത് പിശകുകൾ ഒഴിവാക്കാൻ ഞാൻ HttpClient ടൈമൗട്ട് 5 മിനിറ്റായി നിശ്ചയിച്ചു.
- പ്രോംപ്റ്റ് എഞ്ചിനീയറിംഗ് (Prompt engineering) പ്രധാനമാണ്: നൽകിയിട്ടുള്ള കോൺടെക്സ്റ്റ് (context) മാത്രം ഉപയോഗിച്ച് മറുപടി നൽകാൻ ഞാൻ മോഡലിനോട് ആവശ്യപ്പെടുന്നു. ഇത് ഹാലൂസിനേഷൻസ് 80% വരെ കുറയ്ക്കുന്നു.
- ചങ്കിംഗ് (Chunking) പ്രധാനമാണ്: ഞാൻ ക്യാരക്ടറുകൾക്ക് പകരം വാക്കുകൾ ഉപയോഗിച്ചാണ് ചങ്കിംഗ് ചെയ്യുന്നത്. ഇത് വലിപ്പം കൃത്യമായിരിക്കാനും മോഡൽ പരിധിക്കുള്ളിൽ നിൽക്കാനും സഹായിക്കുന്നു.
നിങ്ങൾക്ക് ഈ മുഴുവൻ സ്റ്റാക്കും ലോക്കലായി പ്രവർത്തിപ്പിക്കാം. പൂജ്യം ഡോളർ ബജറ്റിൽ നിർമ്മിക്കാവുന്ന പ്രൊഫഷണൽ നിലവാരമുള്ള ഒരു ടൂളാണിത്.
മുഴുവൻ ബിൽഡ് ലോഗും കോഡും ഇവിടെ പരിശോധിക്കാം:
Optional learning community: https://t.me/GyaanSetuAi
