શૂન્યથી RAG બનાવવું
મારા પહેલા AI વર્ઝને મને કહ્યું કે હું હાઇડ્રોલિક એક્સકેવેટર વેચું છું. હું એક્સકેવેટર વેચતો નથી. તેણે પૂરા આત્મવિશ્વાસ સાથે મને ખોટી કિંમત અને ખોટું વર્ણન આપ્યું.
તે ક્ષણ હતી જ્યારે મેં માત્ર પ્રોમ્પ્ટ્સ પર વિશ્વાસ કરવાનું બંધ કરી દીધું. મેં એક નિયમ સાથે સિસ્ટમ ફરીથી બનાવી: તે કેટેલોગમાંથી જ જવાબ આપશે, અથવા તો તે બિલકુલ જવાબ આપશે નહીં.
Postgres અને Python નો ઉપયોગ કરીને મેં એક વિશ્વસનીય RAG (Retrieval-Augmented Generation) સિસ્ટમ કેવી રીતે બનાવી તે અહીં છે.
ડેટાની તૈયારી મોટાભાગના ટ્યુટોરિયલ્સ અઘરો ભાગ છોડી દે છે: ડેટા ક્લીનિંગ. મેં મારી પ્રક્રિયાને બે તબક્કામાં વહેંચી છે:
- તબક્કો 1: HTML ફાઇલોને ડિસ્ક પર ડાઉનલોડ કરો. હું દરેક ફાઇલની ટોચ પર કોમેન્ટ તરીકે મેટાડેટા સેવ કરું છું. આ પ્રક્રિયાને 'idempotent' બનાવે છે. જો ફાઇલ પહેલેથી અસ્તિત્વમાં હોય, તો હું તેને સ્કીપ કરી દઉં છું.
- તબક્કો 2: તે ફાઇલોને ઓફલાઇન પાર્સ કરો. આ HTML ને ક્લીન JSON કેટેલોગમાં ફેરવે છે.
પાર્સિંગ પછી હું ફિલ્ડ કવરેજ તપાસું છું. જો વજન અથવા કિંમત જેવું કોઈ ફિલ્ડ ખાલી હોય, તો મને તરત જ ખબર પડી જાય છે. સાચું કામ ક્લીન ડેટા સાથે જ થાય છે.
AI નો ભાગ હું દરેક પ્રોડક્ટને ટેક્સ્ટના બ્લોકમાં ફેરવું છું અને bge-m3 મોડલનો ઉપયોગ કરીને તેને વેક્ટરમાં રૂપાંતરિત કરું છું. હું આ વેક્ટર્સને pgvector એક્સટેન્શનનો ઉપયોગ કરીને Postgres માં સ્ટોર કરું છું.
પ્રોડક્ટ્સ શોધવા માટે હું હાઇબ્રિડ સર્ચ એપ્રોચનો ઉપયોગ કરું છું:
- Semantic Search: તમારા પ્રશ્નના અર્થ સાથે મેળ ખાતી પ્રોડક્ટ્સ શોધવા માટે વેક્ટર્સનો ઉપયોગ કરે છે.
- Structured Filters: હું 'Siemens motors under €2000' જેવી ક્વેરીને JSON માં ફેરવવા માટે LLM નો ઉપયોગ કરું છું. આનાથી મને બ્રાન્ડ અને કિંમત માટે ચોક્કસ ફિલ્ટર્સ સાથે SQL ક્વેરી ચલાવવાની મંજૂરી મળે છે.
એક જ SQL સ્ટેટમેન્ટ ફઝી સર્ચ (fuzzy search) અને હાર્ડ ફિલ્ટર્સ બંનેને હેન્ડલ કરે છે. આનાથી બધું સિંક (sync) રહે છે.
ગાર્ડરેલ્સ એક સારા RAG ને ખબર હોવી જોઈએ કે ક્યારે ચૂપ રહેવું. હેલ્યુસિનેશન (hallucinations) રોકવા માટે હું બે લેયરનો ઉપયોગ કરું છું:
- Similarity Threshold: દરેક મેચને એક સ્કોર મળે છે. જો સ્કોર નિર્ધારિત મર્યાદાથી ઓછો હોય, તો હું પરિણામોને કાઢી નાખું છું. જો કોઈ પરિણામ પાસ ન થાય, તો સિસ્ટમ LLM ને કોલ કર્યા વગર જ "not found" કહે છે. જો મોડલ ડેટા જોતું જ નથી, તો તે હેલ્યુસિનેટ કરી શકતું નથી.
- Strict System Prompt: હું મોડલને ફક્ત આપેલ પ્રોડક્ટ્સમાંથી જ જવાબ આપવા કહું છું. જો પ્રોડક્ટ્સ અપ્રસ્તુત હોય, તો તેણે ના પાડવી જોઈએ.
થ્રેશોલ્ડ ખરાબ વર્તનને અશક્ય બનાવે છે. પ્રોમ્પ્ટ ફક્ત સારા વર્તનની માંગ કરે છે. બંનેનો ઉપયોગ કરો.
થ્રુપુટ સારાંશ
- કાળજીપૂર્વક એકત્રિત કરો.
- પ્રમાણિકતાથી ક્લીન કરો.
- સરળતાથી એમ્બેડ કરો.
- ડિઝાઈન દ્વારા જ નકારતા શીખો.
નકારવાની ક્ષમતા જ સિસ્ટમને વિશ્વસનીય બનાવે છે. વિશ્વાસ આર્કિટેક્ચરથી આવે છે, મોડલને 'સારું બનવા' કહેવાથી નહીં.
સ્ત્રોત: https://dev.to/utku_catal/building-a-rag-from-scratch-collect-clean-embed-refuse-20ob
વૈકલ્પિક લર્નિંગ કોમ્યુનિટી: https://t.me/GyaanSetuAi