Nilijenga Programu ya RAG, Kisha Nikauliza Ni Gari Gani Nalipenda. Haikujua.

Ninajenga zana ya mazungumzo ya hati inayoitwa Kenning. Inatumia RAG (Retrieval-Augmented Generation) ili kuwaruhusu watumiaji kuuliza maswali kuhusu mafaili yaliyopakiwa.

Nilijenga mfumo mzima (pipeline) kuanzia mwanzo nikitumia:

  • Java 21 na Spring Boot
  • Spring AI
  • PostgreSQL pamoja na pgvector
  • Ollama (inayojiendesha kwa kutumia llama3.2:3b na nomic-embed-text)
  • Docker Compose

Mfumo unafanya kazi hivi: Pakia faili → Chimbua maandishi → Gawanya maandishi katika vipande (chunks) → Badilisha vipande kuwa vekta (vectors) → Hifadhi kwenye pgvector → Tafuta vipande vinavyofanana → Tuma vipande + swali kwa modeli → Pata jibu pamoja na vyanzo.

Mfumo ulifanya kazi, lakini nilikumbana na hitilafu mbili tofauti. Zilivyoonekana zinafanana, lakini sababu zake zilikuwa tofauti.

Hitilafu ya 1: Model ilichanganyikiwa.

Niliuliza: "Ni modeli gani ya embedding inayotumika katika mradi huu?" Hati ilieleza jibu waziwazi. Model ilipata maandishi sahihi. Hata hivyo, ilijibu kwa kusema haijui, hata wakati ikirudia jina sahihi la modeli katika sentensi inayofuata.

Nadharia yangu: Model ya 3B ni ndogo mno. Ilipata data sahihi lakini haikuweza kutoa jibu la uhakika. Model kubwa zaidi pengine ingetatua hili.

Hitilafu ya 2: Model haikupata kitu.

Niliuliza: "Ni chapa gani ya gari ninayoipenda?" Hati ilitaja kuwa ninapenda BMW. Lakini mfumo ulirudisha matokeo sifuri. Alama ya ufanani (similarity score) ilikuwa ndogo mno kupita kiwango changu (threshold).

Nadharia yangu: Upungufu wa nguvu ya kipande (Chunk dilution). Hati yangu ya majaribio ilikuwa fupi. Ilichanganya mada nyingi kama Spring AI, OAuth2, na upendeleo wangu wa gari katika kipande kimoja. Vekta ya kipande hicho ilipungua nguvu (diluted) kutokana na mada hizo zote. Swali mahususi kuhusu magari yalipoteza nguvu yake dhidi ya kipande chenye mada pana. Mkakati bora wa kugawa maandishi (chunking strategy) ungetatua hili.

Mafunzo niliyopata:

  • Model ndogo zina mipaka ya uwezo wa kufikiri (reasoning).
  • Mbinu rahisi ya kugawa maandishi (naive chunking) huathiri usahihi wa upatikanaji wa taarifa.
  • Kutafuta sababu ya "kwa nini" (debugging the "why") ni muhimu zaidi kuliko kurekebisha tu hitilafu.

Muundo (architecture) una uimara. Ni wa polepole na wakati mwingine unakosea, lakini mzunguko (loop) umekamilika.

Source: https://dev.to/mido-dev/i-built-a-rag-app-then-asked-it-what-car-i-like-it-didnt-know-583n

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