𝗕𝘂𝗶𝗹𝗱𝗶𝗻𝗴 𝗔 𝗥𝗔𝗚 𝗙𝗿𝗼𝗺 𝗦𝗰𝗿𝗮𝘁𝗰𝗵

எனது முதல் AI பதிப்பு, நான் ஒரு ஹைட்ராலிக் எக்ஸ்கவேட்டரை (hydraulic excavator) விற்கிறேன் என்று கூறியது. நான் எக்ஸ்கவேட்டர்களை விற்பதில்லை. அது மிகுந்த நம்பிக்கையுடன் ஒரு போலி விலையையும் போலி விளக்கத்தையும் எனக்கு வழங்கியது.

அந்தத் தருணத்தில்தான் நான் வெறும் ப்ராம்ப்ட்களை (prompts) மட்டும் நம்புவதை நிறுத்தினேன். ஒரு விதியுடன் நான் அந்த அமைப்பை மீண்டும் உருவாக்கினேன்: அது கேட்டலாக்கில் (catalog) இருந்து மட்டுமே பதிலளிக்க வேண்டும், இல்லையெனில் பதிலளிக்கவே கூடாது.

Postgres மற்றும் Python பயன்படுத்தி ஒரு நம்பகமான RAG (Retrieval-Augmented Generation) அமைப்பை நான் எவ்வாறு உருவாக்கினேன் என்பது இதோ.

𝗧𝗵𝗲 𝗗𝗮𝘁𝗮 𝗣𝗿𝗲𝗽 பெரும்பாலான பயிற்சிகள் கடினமான பகுதியைத் தவிர்த்துவிடுகின்றன: தரவைச் சுத்தப்படுத்துதல் (cleaning data). நான் எனது செயல்முறையை இரண்டு நிலைகளாகப் பிரித்துள்ளேன்:

  • நிலை 1: HTML கோப்புகளை டிஸ்க்கிற்கு (disk) பதிவிறக்குதல். ஒவ்வொரு கோப்பின் மேலேயும் ஒரு கமெண்ட்டாக (comment) மெட்டாடேட்டாவை (metadata) சேமிக்கிறேன். இது செயல்முறையை ஐடெம்போடென்ட் (idempotent) ஆக்குகிறது. ஒரு கோப்பு ஏற்கனவே இருந்தால், நான் அதைத் தவிர்த்துவிடுவேன்.
  • நிலை 2: அந்த கோப்புகளை ஆஃப்லைனில் (offline) பார்ஸ் (parse) செய்தல். இது HTML-ஐ ஒரு சுத்தமான JSON கேட்டலாக்காக மாற்றுகிறது.

பார்ஸ் செய்த பிறகு நான் ஃபீல்ட் கவரேஜை (field coverage) சரிபார்க்கிறேன். எடை அல்லது விலை போன்ற ஒரு ஃபீல்ட் காலியாக இருந்தால், அதை நான் உடனடியாகக் கண்டறிந்துவிடுவேன். சுத்தமான தரவில்தான் உண்மையான வேலை நடக்கிறது.

𝗧𝗵𝗲 𝗔𝗜 𝗣𝗮𝗿𝘁 ஒவ்வொரு தயாரிப்பையும் ஒரு உரைத் தொகுப்பாக (block of text) மாற்றி, bge-m3 மாடலைப் பயன்படுத்தி அதை ஒரு வெக்டராக (vector) மாற்றுகிறேன். இந்த வெக்டர்களை pgvector விரிவாக்கத்தைப் (extension) பயன்படுத்தி Postgres-இல் சேமிக்கிறேன்.

தயாரிப்புகளைக் கண்டறிய நான் ஒரு ஹைப்ரிட் தேடல் (hybrid search) அணுகுமுறையைப் பயன்படுத்துகிறேன்:

  • Semantic Search: உங்கள் கேள்வியின் பொருளுக்குப் பொருந்தும் தயாரிப்புகளைக் கண்டறிய வெக்டர்களைப் பயன்படுத்துகிறது.
  • Structured Filters: "Siemens motors under €2000" போன்ற ஒரு வினவலை (query) JSON ஆக மாற்ற நான் ஒரு LLM-ஐப் பயன்படுத்துகிறேன். இது பிராண்ட் மற்றும் விலைக்கான துல்லியமான ஃபில்டர்களுடன் (filters) ஒரு SQL வினவலை இயக்க எனக்கு அனுமதிக்கிறது.

ஒரே ஒரு SQL கூற்று (statement) தெளிவற்ற தேடல் (fuzzy search) மற்றும் கடினமான ஃபில்டர்கள் (hard filters) ஆகிய இரண்டையும் கையாள்கிறது. இது அனைத்தையும் ஒருங்கிணைந்து (in sync) வைத்திருக்க உதவுகிறது.

𝗧𝗵𝗲 𝗚𝘂𝗮𝗿𝗱𝗿𝗮𝗶𝗹𝘀 ஒரு சிறந்த RAG எப்போது மௌனமாக இருக்க வேண்டும் என்பதைத் தெரிந்திருக்க வேண்டும். மாயத்தோற்றங்களைத் (hallucinations) தடுக்க நான் இரண்டு அடுக்குகளைப் பயன்படுத்துகிறேன்:

  • Similarity Threshold: ஒவ்வொரு பொருத்தத்திற்கும் ஒரு மதிப்பெண் (score) வழங்கப்படும். அந்த மதிப்பெண் நிர்ணயிக்கப்பட்ட வரம்பிற்கு கீழே இருந்தால், நான் முடிவுகளைத் தவிர்த்துவிடுவேன். எந்த முடிவும் வரம்பைத் தாண்டவில்லை என்றால், LLM-ஐ அழைக்காமலேயே சிஸ்டம் "கண்டறியப்படவில்லை" (not found) என்று கூறும். மாடல் தரவைக் காணவே இல்லை என்றால், அது மாயத்தோற்றங்களை (hallucinate) உருவாக்க முடியாது.
  • Strict System Prompt: வழங்கப்பட்ட தயாரிப்புகளில் இருந்து மட்டுமே பதிலளிக்குமாறு நான் மாடலிடம் கூறுகிறேன். தயாரிப்புகள் பொருத்தமற்றதாக இருந்தால், அது பதிலளிக்க மறுக்க வேண்டும்.

வரம்பு (threshold) தவறான நடத்தையைச் சாத்தியமற்றதாக்குகிறது. ப்ராம்ப்ட் (prompt) நல்ல நடத்தையை மட்டுமே கோருகிறது. இரண்டையும் பயன்படுத்துங்கள்.

𝗧𝗵𝗿𝗼𝘂𝗴𝗵𝗽𝘂𝘁 𝗦𝘂𝗺𝗺𝗮𝗿𝘆

  • கவனமாகச் சேகரிக்கவும்.
  • நேர்மையாகச் சுத்தப்படுத்தவும்.
  • எளிமையாக எம்பெட் (Embed) செய்யவும்.
  • வடிவமைப்பிலேயே மறுக்கவும்.

இந்த மறுப்புதான் அமைப்பை நம்பகமானதாக மாற்றுகிறது. நம்பிக்கை என்பது கட்டமைப்பிலிருந்து (architecture) வருகிறது, மாடலைத் தயவு செய்யச் சொல்வதிலிருந்து வருவதல்ல.

மூலம்: https://dev.to/utku_catal/building-a-rag-from-scratch-collect-clean-embed-refuse-20ob

விருப்பத்தேர்வு கற்றல் சமூகம்: https://t.me/GyaanSetuAi