𝗜 𝗕𝘂𝗶𝗹𝘁 𝗥𝗔𝗚 𝗙𝗿𝗼𝗺 𝗦𝗰𝗿𝗮𝘁𝗰𝗵 𝗶𝗻 𝗣𝘆𝘁𝗵𝗼𝗻 𝘁𝗼 𝗨𝗻𝗱𝗲𝗿𝘀𝘁𝗮𝗻𝗱 𝗜𝘁

నేను ఆరు నెలల పాటు ప్రొడక్షన్‌లో LangChain ఉపయోగించాను. అది ఎలా పనిచేస్తుందో నేను వివరించలేకపోయాను. నేను నిర్దిష్ట మెట్రిక్స్‌ను ఎందుకు ఎంచుకున్నానో లేదా టెక్స్ట్ వెక్టర్స్‌గా ఎలా మారుతుందో నాకు తెలియదు. ఆ లైబ్రరీ లోపల ఉన్న లాజిక్‌ను దాచిపెట్టింది.

దీనిని సరిదిద్దడానికి, నేను ఆ ఫ్రేమ్‌వర్క్‌ను తొలగించాను. కేవలం 500 లైన్ల ప్లెయిన్ Python ఉపయోగించి ఒక RAG పైప్‌లైన్‌ను మొదటి నుండి రాశాను.

ఈ స్టాక్‌ను మాన్యువల్‌గా నిర్మించడం ద్వారా నేను నేర్చుకున్న విషయాలు ఇక్కడ ఉన్నాయి.

బ్లాక్ బాక్స్‌లతో ఉన్న సమస్య

మీరు హై-లెవల్ లైబ్రరీలను ఉపయోగించినప్పుడు, మీ నియంత్రణను కోల్పోతారు. మోడల్స్ తప్పుడు నిజాలను సృష్టించడం (hallucinate) లేదా తప్పు సైటేషన్లను ఇవ్వడం నేను చూశాను. ఆ లోపం చంకర్ (chunker) లో ఉందా, ఎంబెడ్డింగ్ మోడల్‌లో ఉందా లేదా ప్రాంప్ట్‌లో ఉందా అనేది నేను చెప్పలేకపోయాను.

మీరు స్వయంగా నిర్మించినప్పుడు, ప్రతి లేయర్ (layer) ను పరిశీలించవచ్చు. LLMకి పంపిన ఖచ్చితమైన చంక్స్‌ను మీరు ప్రింట్ చేయవచ్చు. ఒక వాక్యం ఎక్కడ విచ్ఛిన్నమవుతుందో కూడా మీరు స్పష్టంగా చూడవచ్చు.

RAG యొక్క ఐదు లేయర్‌లు

RAG అనేది ఒకే ఒక అల్గారిథమ్ కాదు. ఇది ఒకదానిపై ఒకటి అమర్చబడిన ఐదు వేర్వేరు ప్రక్రియల కలయిక:

  • Chunking: టెక్స్ట్‌ను ఎలా విభజించాలో నిర్ణయించడం.
  • Embedding: టెక్స్ట్‌ను గణిత రూపంలోకి మార్చడం.
  • Retrieval: సరైన భాగాలను కనుగొనడం.
  • Prompt Construction: మోడల్ ఎలా ప్రవర్తించాలో చెప్పడం.
  • Generation: తుది సమాధానాన్ని పొందడం.

నిర్మాణ ప్రక్రియ నుండి నేర్చుకున్న పాఠాలు

1. Chunking అనేది అత్యంత ముఖ్యమైన దశ చాలా ట్యుటోరియల్స్ దీనిని వదిలేస్తాయి. మీరు ఓవర్‌ల్యాప్ (overlap) ఉపయోగించకపోతే, సరిహద్దుల వద్ద సందర్భాన్ని (context) కోల్పోతారు. నేను క్యారెక్టర్-లెవల్ ఓవర్‌ల్యాప్‌తో స్లైడింగ్ విండోను ఉపయోగించాను. ఇది రెండు చంక్స్‌ల మధ్య ఉన్న సంబంధాన్ని మోడల్ గుర్తించేలా చేస్తుంది.

2. డిస్టెన్స్ మెట్రిక్స్ (Distance metrics) ముఖ్యం తప్పుడు సెర్చ్ రిజల్ట్స్‌ను సరిదిద్దడానికి (debugging) నేను గంటల కొద్దీ సమయం వృధా చేశాను. సమస్య డేటాలో లేదు, మెట్రిక్‌లో ఉంది. ChromaDB డిఫాల్ట్‌గా L2 డిస్టెన్స్‌ను ఉపయోగిస్తుంది. సెమాంటిక్ సెర్చ్ కోసం, మీకు Cosine similarity అవసరం. కేవలం ఒక లైన్ కోడ్ అంతా మార్చేసింది.

3. ప్రాంప్ట్‌లకు పరిమితులు (constraints) అవసరం LLM అనేది ఒక సమాచారాన్ని పూర్తి చేసే సాధనం మాత్రమే, అది దైవం కాదు. మీరు అస్పష్టమైన ప్రశ్న అడిగితే, అది ఒక సమాధానాన్ని సృష్టించి చెబుతుంది. నేను ఒక కఠినమైన రిఫ్యూజల్ టెంప్లేట్‌ను (refusal template) ఉపయోగించడం నేర్చుకున్నాను. నేను మోడల్‌కు ఇలా చెప్పాను: "సందర్భంలో (context) సమాధానం లేకపోతే, మీకు తెలియదని చెప్పండి." దీనివల్ల హాలూసినేషన్స్ (hallucinations) 40% నుండి 5%కి తగ్గాయి.

4. మీ రిక్వెస్ట్‌లను బ్యాచ్‌లుగా పంపండి ప్రతి చంక్‌కు ఒక HTTP రిక్వెస్ట్ పంపడం నెమ్మదిగా ఉంటుంది. వాటిని బ్యాచ్‌లుగా పంపడం చాలా వేగంగా ఉంటుంది. ఇది లోకల్ మోడల్ పనులను పైప్‌లైన్ చేయడానికి అనుమతిస్తుంది.

5. కింద నుండి పైకి టెస్ట్ చేయండి చివరలో టెస్ట్‌లు రాయకండి. మొదట మీ చంకర్ (chunker) ను టెస్ట్ చేయండి. తర్వాత మీ ఎంబెడర్‌ను (embedder) టెస్ట్ చేయండి. ఆపై మీ స్టోర్‌ను టెస్ట్ చేయండి. మీరు చివరగా టెస్ట్ చేస్తే, లాజిక్‌ను కాకుండా బగ్స్‌ను మాత్రమే టెస్ట్ చేసినట్లు అవుతుంది.

మీ AI స్టాక్ గురించి మీకు నిజంగా అవగాహన లేదని అనిపిస్తే, దానిని మీరే స్వయంగా నిర్మించండి. కోడ్ అనేది లక్ష్యం కాదు. ఆలోచనా విధానమే అసలైన లక్ష్యం.

Source: https://dev.to/avinash_zala_1c6f5e7c4af9/i-built-rag-from-scratch-in-python-to-understand-it-heres-what-i-learned-33kf

Optional learning community: https://t.me/GyaanSetuAi