મોટા પાયે પ્રોડક્શન RAG: દરરોજ 10,000+ લિસ્ટિંગ્સમાંથી મળેલા પાઠ
મેં એક જોબ બોર્ડ માટે RAG પાઇપલાઇન બનાવી હતી. તે સ્ટેજિંગમાં કામ કરતી હતી પરંતુ વાસ્તવિક લોડ હેઠળ સંઘર્ષ કરતી હતી. દરરોજ હજારો લિસ્ટિંગ્સ પ્રોસેસ કરવા માટે માત્ર એક સારા વેક્ટર સ્ટોર કરતાં વધુની જરૂર હોય છે. તમારે સમજવું પડશે કે સિસ્ટમ ક્યાં નિષ્ફળ જાય છે.
અહીં ચંકિંગ (chunking), એમ્બેડિંગ્સ (embeddings), ખર્ચ અને ઓબ્ઝર્વેબિલિટી (observability) પરના મારા અનુભવો છે.
1. તમારી ચંકિંગ વ્યૂહરચનાનો અંદાજ ન લગાવો
મોટાભાગના ટ્યુટોરિયલ્સ ચંકિંગને એક સાદી સેટિંગ તરીકે ગણે છે. પ્રોડક્શનમાં, તમારી વ્યૂહરચના ચોકસાઈ અને ખર્ચ નક્કી કરે છે.
મેં જોબ લિસ્ટિંગ માટે ત્રણ પદ્ધતિઓનું પરીક્ષણ કર્યું:
- Fixed-size chunks: આ નિષ્ફળ રહ્યા. તેઓ "requirements" અને "benefits" જેવા વિભાગોને રેન્ડમ પોઈન્ટ્સ પર વિભાજિત કરે છે. આનાથી નોઈઝી રિટ્રીવલ (noisy retrieval) થાય છે.
- Semantic chunking: આ વધુ સારું હતું પરંતુ અસંગત હતું. કેટલાક ચંક્સ ખૂબ લાંબા હતા અને અન્ય ખૂબ ટૂંકા હતા.
- Recursive character splitting with overlap: આ સૌથી વધુ અસરકારક રહ્યું. મેં ન્યૂલાઇન (newlines) અને વાક્યો પર વિભાજન કર્યું. મેં 50 ટોકન ઓવરલેપ સાથે 400 ટોકન સાઈઝનો ઉપયોગ કર્યો. આ સુનિશ્ચિત કરે છે કે બે ચંક્સમાં વહેંચાયેલા વાક્યો જોડાયેલા રહે.
પ્રો ટિપ: ચંકિંગ કરતા પહેલા તમારા ડેટાને નોર્મલાઈઝ (normalize) કરો. Greenhouse અથવા Lever જેવા વિવિધ સ્ત્રોતો અલગ-અલગ ફોર્મેટ રિટર્ન કરે છે. ટેક્સ્ટને પહેલા ક્લીન કરો જેથી તમારું ચંકર એક સુસંગત માળખું જોઈ શકે.
2. એમ્બેડિંગ્સ: ખર્ચ વિરુદ્ધ ચોકસાઈ
મેં Ollama દ્વારા Llama 3.1 નું OpenAI text-embedding-3-small સાથે પરીક્ષણ કર્યું. લોકલ મોડલ મફત હતું પરંતુ "equity compensation" જેવા ડોમેન-સ્પેસિફિક શબ્દો સાથે સંઘર્ષ કરતું હતું. તે નોઈઝી પરિણામો આપતું હતું. OpenAI નો ખર્ચ વધુ હતો પરંતુ તે સચોટ મેચિંગ પૂરું પાડતું હતું. મેં OpenAI પસંદ કર્યું કારણ કે ખરાબ રિટ્રીવલને કારણે પાછળથી LLM કોલ્સમાં વધુ ખર્ચ થાય છે.
સમય બચાવવા માટે, હું મારી વિનંતીઓને બેચ (batch) કરું છું. હું એક જ કોલમાં 100 જેટલા ચંક્સ મોકલું છું. આ લેટન્સી (latency) ઘટાડે છે અને પાઇપલાઇનને ઝડપી રાખે છે.
3. વેક્ટર સ્ટોરનો ટ્રેડ-ઓફ (Trade-off)
મેં પ્રોટોટાઇપિંગ માટે Pinecone નો ઉપયોગ કર્યો કારણ કે તે સેટઅપ કરવામાં ઝડપી છે. જોકે, મોટા પાયે ખર્ચ ખૂબ વધી ગયો.
હું PostgreSQL ની અંદર pgvector પર સ્વિચ થયો.
- તેને સેટઅપ કરવામાં વધુ મહેનત લાગી.
- તેનાથી મોટા પ્રમાણમાં પૈસા બચ્યા.
- તેણે ટ્રાન્ઝેક્શનલ કન્સિસ્ટન્સી (transactional consistency) પૂરી પાડી. કારણ કે એમ્બેડિંગ્સ જોબ ડેટાની જેમ જ એક જ ડેટાબેઝમાં રહે છે, તેથી તમારી પાસે એક જ 'સોર્સ ઓફ ટ્રુથ' (source of truth) છે. તમારે બે અલગ-અલગ સિસ્ટમ્સને સિંક કરવાની જરૂર નથી.
4. LLM ખર્ચનું નિયંત્રણ
દરેક લિસ્ટિંગને GPT-4o સાથે સ્કોરિંગ કરવું મોંઘું છે. ખર્ચ ઘટાડવા માટે મેં ત્રણ યુક્તિઓનો ઉપયોગ કર્યો:
- OpenAI Batch API: હું સ્કોરિંગના કામ રાતોરાત પ્રોસેસ કરું છું. આનાથી મોટું ડિસ્કાઉન્ટ મળે છે.
- Caching: હું વારંવાર આવતા કેન્ડિડેટ પ્રોફાઇલ્સ માટે પરિણામો કેશ (cache) કરું છું.
- Model tiering: હું "Sales Representative" જેવા સામાન્ય રોલ્સ માટે GPT-4o-mini નો ઉપયોગ કરું છું. હું GPT-4o નો ઉપયોગ ફક્ત એવા નિશ (niche) રોલ્સ માટે જ કરું છું જ્યાં ચોકસાઈ અત્યંત મહત્વપૂર્ણ હોય.
5. પહેલા ઓબ્ઝર્વેબિલિટી (Observability) બનાવો
મારી પાઇપલાઇન એકવાર સાયલન્ટલી (silently) નિષ્ફળ ગઈ હતી. ખોટા ડેટાને કારણે ખાલી ચંક્સ બન્યા, જેને સિસ્ટમે ભૂલ વગર સ્કીપ કરી દીધા.
મેં કોરિલેશન ID (correlation ID) સાથે સ્ટ્રક્ચર્ડ લોગિંગ ઉમેરીને આ સમસ્યા સુધારી. આનાથી મને ઇન્જેશન (ingestion) થી સ્કોરિંગ સુધીના એક લિસ્ટિંગને ટ્રેસ કરવાની મંજૂરી મળી. હું આખરે જોઈ શક્યો કે કયા ડેટા સોર્સ નિષ્ફળતાનું કારણ બની રહ્યા હતા.
સૌથી મોટો પાઠ: મોટાભાગની સમસ્યાઓ મેસી (messy) ડેટામાંથી આવે છે, AI માંથી નહીં. પહેલા તમારા ડેટા પ્લમ્બિંગને ઠીક કરો.
વૈકલ્પિક લર્નિંગ કોમ્યુનિટી: https://t.me/GyaanSetuAi
