Wednesday, May 20, 2026

RAG

Demystifying RAG: Build a Private AI Database Assistant in CodeIgniter 3

Have you ever asked an AI model (like ChatGPT or Gemini) a highly specific question about your private business data, only for it to confidently make up a completely false answer?

In the AI world, this is called hallucination.

Standard AI models are trained on public internet data up to a specific cutoff date. They don’t know about your active restaurant listings, your active coupon codes today, or your company's latest GST bills.

So how do we solve this? The answer is RAG (Retrieval-Augmented Generation).

In this comprehensive guide, we will break down exactly what RAG is, how it works in plain English, and how to implement it step-by-step inside a classic CodeIgniter 3 PHP application.

 

1. What on Earth is RAG? (The Open-Book Analogy)

Imagine you are sitting in a classroom taking a highly specialized history exam:

·     Traditional AI (Closed-Book): The teacher asks you: "What was the GST bill total for Restaurant X in May 2026?". You have to rely purely on your memory. If you don't know, you either fail or guess wildly.

·     RAG AI (Open-Book): Before you answer, the teacher allows you to walk over to a bookshelf, grab the specific folder marked "Restaurant X Invoices - May 2026", read it, and then write down the perfect answer based directly on that folder.

RAG turns the AI into an open-book exam taker. It retrieves relevant articles or database records first, hands them to the AI, and says, "Answer the user's question using ONLY this information."

 

2. The Three Steps of RAG

Every RAG system, from simple search bars to complex enterprise systems, operates in three phases:

graph TD
    A[Step 1: Data Ingestion] -->|Chunk & Embed| B[(Vector Database)]
    C[User Asks Question] -->|Step 2: Retrieval| D[Search Vector DB]
    D -->|Find Matches| E[Inject Context into Prompt]
    E -->|Step 3: Generation| F[LLM eg. Gemini/GPT]
    F -->|Accurate Answer| G[User Receives Response]




Phase A: Ingestion (Storing Knowledge)

Computers don't understand English the way humans do. To make text searchable by "meaning," we convert text paragraphs into a long list of numbers called Embeddings (or Vectors). We save these numbers into a Vector Database (like Pinecone, Qdrant, or PGVector).

Phase B: Retrieval (Finding Knowledge)

When a user asks: "What active coupons do we have today?", the system converts that question into a vector and searches the Vector Database for the most mathematically similar matches.

Phase C: Generation (Answering with Knowledge)

The system grabs those matching text snippets, pastes them into a prompt alongside the original question, and sends it to the AI. The AI reads the custom data and returns a perfectly accurate answer.

 

3. Implementing RAG in CodeIgniter 3

Let's build a fully functioning RAG assistant in CodeIgniter 3 using:

·     OpenAI API (to handle text generation and embeddings).

·     Pinecone API (a hosted cloud vector database with a free tier).

Step 1: Create the RAG Library (application/libraries/RagService.php)

This reusable library handles communication between your server, OpenAI, and Pinecone using PHP cURL.

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class RagService {

    private $openai_key = 'YOUR_OPENAI_API_KEY';
    private $pinecone_key = 'YOUR_PINECONE_API_KEY';
    private $pinecone_host = 'https://your-index-url.pinecone.io'; // Your index host from Pinecone console

    /**
     * Convert plain text into list of numbers (Vector Embeddings)
     */
    public function get_embedding($text) {
        $url = 'https://api.openai.com/v1/embeddings';
        $data = [
            'input' => $text,
            'model' => 'text-embedding-3-small'
        ];

        $response = $this->call_api($url, $data, $this->openai_key);
        return isset($response['data'][0]['embedding']) ? $response['data'][0]['embedding'] : null;
    }

    /**
     * Search the Pinecone Vector DB for semantically similar text
     */
    public function query_vectors($vector, $top_k = 3) {
        $url = $this->pinecone_host . '/query';
        $data = [
            'vector' => $vector,
            'topK' => $top_k,
            'includeMetadata' => true
        ];

        $headers = [
            'Api-Key: ' . $this->pinecone_key,
            'Content-Type: application/json'
        ];

        $response = $this->call_api($url, $data, null, $headers);
       
        $context_chunks = [];
        if (isset($response['matches'])) {
            foreach ($response['matches'] as $match) {
                if (isset($match['metadata']['text'])) {
                    $context_chunks[] = $match['metadata']['text'];
                }
            }
        }
        return $context_chunks;
    }

    /**
     * Send context + question to GPT/Gemini for the final grounded answer
     */
    public function ask_llm($question, $context_array) {
        $url = 'https://api.openai.com/v1/chat/completions';
        $context_text = implode("\n\n---\n\n", $context_array);

        $prompt = "You are a helpful business assistant. Answer the user's question using ONLY the provided context below. "
                . "If the answer cannot be found in the context, say 'I do not have enough information to answer that.'\n\n"
                . "=== CONTEXT ===\n" . $context_text . "\n===============\n\n"
                . "=== QUESTION ===\n" . $question;

        $data = [
            'model' => 'gpt-4o-mini',
            'messages' => [
                ['role' => 'user', 'content' => $prompt]
            ],
            'temperature' => 0.3
        ];

        $response = $this->call_api($url, $data, $this->openai_key);
        return isset($response['choices'][0]['message']['content']) ? $response['choices'][0]['message']['content'] : 'Error generating response';
    }

    /**
     * Push new business knowledge into the Vector DB
     */
    public function insert_knowledge($id, $text, $metadata = []) {
        $embedding = $this->get_embedding($text);
        if (!$embedding) return false;

        $url = $this->pinecone_host . '/vectors/upsert';
        $metadata['text'] = $text;

        $data = [
            'vectors' => [
                [
                    'id' => (string)$id,
                    'values' => $embedding,
                    'metadata' => $metadata
                ]
            ]
        ];

        $headers = [
            'Api-Key: ' . $this->pinecone_key,
            'Content-Type: application/json'
        ];

        $response = $this->call_api($url, $data, null, $headers);
        return isset($response['upsertedCount']) && $response['upsertedCount'] > 0;
    }

    private function call_api($url, $post_data, $bearer_token = null, $custom_headers = []) {
        $ch = curl_init($url);
        $headers = [];
        if ($bearer_token) {
            $headers[] = 'Authorization: Bearer ' . $bearer_token;
            $headers[] = 'Content-Type: application/json';
        }
        if (!empty($custom_headers)) {
            $headers = $custom_headers;
        }

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

        $response = curl_exec($ch);
        curl_close($ch);
        return json_decode($response, true);
    }
}

 

Step 2: Create the Controller (application/controllers/Assistant.php)

This controller maps the incoming user web requests to the RAG service.

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Assistant extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->library('ragservice');
    }

    /**
     * Endpoint to ask a question
     * Route: /assistant/ask
     */
    public function ask() {
        $question = $this->input->post('question');

        if (empty($question)) {
            echo json_encode(['error' => 'Question is required']);
            return;
        }

        // 1. Get embedding for the user's question
        $vector = $this->ragservice->get_embedding($question);

        // 2. Query Vector DB for relevant context
        $context = $this->ragservice->query_vectors($vector, 3);

        // 3. Send to LLM to generate the grounded answer
        $answer = $this->ragservice->ask_llm($question, $context);

        // 4. Return results as JSON
        $this->output
            ->set_content_type('application/json')
            ->set_output(json_encode([
                'answer' => $answer,
                'retrieved_sources' => $context
            ]));
    }

    /**
     * Endpoint to upload/sync your restaurant database to Vector database
     * Route: /assistant/sync_db
     */
    public function sync_db() {
        // Example: Querying active coupons from MySQL to index in Pinecone
        // $coupons = $this->db->get_where('coupons', ['status' => 'active'])->result_array();
       
        $sample_records = [
            ['id' => 'coupon_1', 'text' => 'Coupon "SUMMER50" gives a 50% discount on food orders above $20. Valid until August 2026.'],
            ['id' => 'restaurant_1', 'text' => 'Bistro Hub is located at 123 Main St. It is currently active and open from 9 AM to 10 PM daily.'],
            ['id' => 'tax_1', 'text' => 'For the 2026-2027 Financial Year, GST bills accrued a total liability of $14,520.20 as of May 2026.']
        ];

        $count = 0;
        foreach ($sample_records as $record) {
            $success = $this->ragservice->insert_knowledge($record['id'], $record['text']);
            if ($success) $count++;
        }

        echo "Successfully indexed {$count} records into the AI's Vector DB!";
    }
}

 

4. How the Magic Happens Under the Hood

Let's test our new CodeIgniter RAG assistant:

1.   Ingestion: You hit /assistant/sync_db. This uploads your restaurant and tax knowledge into Pinecone as embeddings.

2.   User Query: A user types: "Is Bistro Hub open right now, and what discount codes can I use?"

3.   Retrieval: The RagService looks up Pinecone. It retrieves:

·     Match 1: "Bistro Hub is located at 123 Main St. It is currently active..."

·     Match 2: "Coupon 'SUMMER50' gives a 50% discount..."

4.   Generation: GPT/Gemini reads this information and crafts a beautiful response:

"Yes, Bistro Hub is currently active and open daily from 9 AM to 10 PM. You can use the coupon code SUMMER50 to get a 50% discount on orders above $20!"

 

5. Key Best Practices for a Great RAG System

·     Automatic Syncing (CRON Jobs): Instead of manually syncing data, set up a CI3 CLI Command or CRON job to read updated rows from your MySQL database every night and sync them into the Vector DB.

·     Keep Data Chunks Small: Don't throw a whole 100-page manual into one vector. Break it down into paragraphs or sentences (chunks) so the search matches are exact and the LLM prompts remain small and cheap.

·     Clean Metadata: Always attach metadata tags (like restaurant_id, date, category) to your vectors. This allows you to filter search results by date or category before querying.

Conclusion

RAG is a game-changer for building intelligent, context-aware web apps. By connecting your legacy CodeIgniter 3 database to modern AI and Vector DB APIs, you can build incredibly powerful chatbot assistants, invoice analyzers, or automated customer support systems that never hallucinate.

Best of all, you can start building it entirely for free today!

0 comments:

Post a Comment

Labels

.htaccess (5) 2step verification in php (1) 404 Page (1) Address Autocomplete (1) Admin (1) Ajax (3) alias key generation (1) All Browsers Testing (1) Android (19) Android 5.0 (2) Android Life Cycle (1) Android webview media capture (1) angular js (7) Angular Js ebook (1) AngularJS (23) Apache and mysql start up automatically once system boot (1) array_combine() (1) array_merge() (1) array_search() (1) async css and js (1) auto generate url slug in codeginiter (1) Auto reload (1) Autocomplete (1) automation code for php and mysql (1) AWS (1) AWS EC2 Hosting (6) AWS EC2 Hosting Connect with notepad++ (1) AWS ECS Hosting (1) base_url() (1) Basic php example on this keyword use (1) Best Practices to write jquery (1) Bootstrap (2) Bootstrap form tag problem (1) Bootstrap Modal (1) Bootstrap Modals (1) Breadcrumb (1) Broad band usage meter (1) Business Thoughts (1) Can't connect to MySQL server on (1) Cannot retrieve metalink for repository (1) Career Guidance (1) Carousel (1) Categories of websites (1) Cent OS (2) CI (1) Ci Errors (1) ckeditor (3) Clear Browser Cache Trick (1) Client IP Address (1) Code completion for codeigniter (1) Codehint for CodeIgniter (1) CodeIgniter (54) Codeigniter Controllers (1) Codeigniter email (1) Codeigniter file upload (2) Codeigniter send grid integration (1) CodeIgniter with Dreamweaver (1) Codigniter4 (1) color replace function in jquery (1) colorReplace function (1) configuration files locations (1) Controllers in controllers angular js (1) Cookies (1) Coolify VPS (1) core php file upload (1) count down timer in seconds in jquery (1) Countries Table in mysql (1) cPanel (2) Create User in mysql Db (1) CryptoJS (1) CSS (3) CSS tricks (2) curl parallel calls (1) Currency API (1) Customize date format in php (1) Data dictionary (1) data of birth validation and generation codeigniter (1) Database backup in php (1) date (1) Date Difference (2) date difference in jquery (1) Date format in php (1) Date functions (1) datepicker date format jquery (1) Datetime Picker (1) datewise mysql backup (1) DBFunctions (1) Default Image in html (1) Desktop tricks (1) Detect Android Mobile (1) Detect Iphone using javascript (1) Disadvantages of Joomla (1) Disadvantages of Wordpress (1) Distance Calculation (2) document printing (1) Document submit (1) dreamweaver (1) Drupal CMS (2) Drupal Components (1) Drupal Update (1) Dynamic jQuery (21) Dynamic websites building (1) echo (1) editor for html interface (1) Email (2) Email extract in php (1) email php configuration (1) EMAILS (1) empty() and is_null() difference (1) error handling in php (1) event.PreventDefault() (1) execution time in javascript (1) extract numbers php (1) Facebook Link Posting (1) Facebook Login Error Javascript (1) Facebook Page Likes (1) Fancybox (1) Fastpanel (2) Features of Joomla (1) Features of Wordpress (1) File Security (1) file upload (1) File upload in jquery (1) File upload through URL with php script (1) file_get_contents (1) Files listing from folders in php (1) FileUpload (2) fileupload in jquery with preview (1) filezilla (1) Filter to top (1) Find the Framework of a website (1) Firewall Configuration in Centos (1) FOR php developers (2) Form_validation form with codeigniter (1) FTP (1) Full calendar (1) Geo API (4) Geo Code (2) Geo complete (1) Geo Location (1) GeoLocation (4) get ipaddress (1) gmail contacts api (1) Google Chrome Install (1) Google Map (1) Google Maps (10) Grant all privileges in mysql db (1) Grocery Crud (5) Guess CMS (1) hashtag (1) History Clear (1) HMVC (1) Host is not allowed to connect to MySQL Server (1) how to include header and footer html in html (1) How to prevent sql injection in php (1) how to zip file in linux (1) HTML (4) HTML CSS JS compression (1) HTML Typography (1) HTML5 (4) httpd.conf Configurations (1) Huge IT Silder (1) Hybrid App (1) Hyperlinks (1) image resize in codeigniter (1) Image with preview and remove html (1) Include() and include_once Difference (2) India States (1) Interfaces in PHP (1) Internal server error solution (1) Invoice Templates (1) ionic (13) ionic ios (1) iOS (3) iTunes (1) Javascript (45) javascript countdown timer (1) javascript email validation (1) Javascript Object properties view (1) Javascript UNIX time stamp converter (1) jmeter (3) Jquery (40) jquery datepicker (2) jquery detect idle state (1) jquery list sort (1) Jquery OWL Carousel (1) Jquery UI (1) jquery username validation (1) jquery validation (1) JS (1) JSON (3) Laravel (4) Laravel Tutorials (2) Latest Android Version (1) Linux commands (5) LINUX Ftp Configuration (1) Linux Server IP Address (1) List Sortable in Jquery UI (1) Lollipop (1) Magento (1) mail in php (1) main controller and child controller and another child controller (1) Malware Removal (2) Malware Scan (1) Marketing (1) maximum execution time in php code (1) Media Capture in HTML5 (1) method overloading in php (1) method overriding in php (1) mod_rewrite (1) MongoDB (1) Mouse Deselection Javascript (1) Multidimensinal Array sort (1) multiple comparisons in php (1) Multiple file upload in Angular JS (1) Multiple file upload in jquery (1) multiple file upload in php (1) multiselect (1) Mysql (21) mysql and apache start up automatically once system boot (1) mysql connect (1) mysql connect in windows os (1) mysql database backup (1) mysql datatypes (1) Mysql DB (1) mysql Db connection program (1) Mysql Errors (1) mysql functions (1) MySQL HostName (1) mysql query tricks (1) MySQL server at 'reading initial communication packet' (1) mysql_real_escape_string() (1) mysql_secure_installation (1) mysql.sock (2) Error (1) mysqli (2) Native App (1) Netbeans for linux (1) Network usage monitor (1) NextJS (1) ng-bind (1) ng-click (1) Node js (1) NodeJS (1) Notepad++ (1) onchange display images (1) Online UNIX Timestamp to human readble format converter (1) OOPS in php (1) Pagination in Codeigniter (1) Pagination in php (1) Password encryption and decryption in php (1) Payment Gateways (1) Paypal (1) PayU Form (1) PDF (1) PDO (2) Pendrive Data Recovery (1) php (62) PHP 5.4.0 (2) php abstract class example (1) PHP ajax file upload (2) PHP ajax request detection (1) PHP Basic Login and logout (1) PHP Codeigniter database backup code (1) PHP Contact us email form code (1) PHP corn jobs (1) php database backup script (1) php email validation (1) PHP Environment Setup (1) PHP Errors (1) PHP Extension and Application Repository) (1) php file upload (1) PHP File Uploading (1) PHP fileupload helper in codeigniter (1) PHP interview questions (4) PHP lamda functions examples (1) PHP Login (1) PHP pdo (1) PHP PDO script to insert data inside mysql db (1) PHP Random Password generation Script (2) php script execution limit (1) php script to display months (1) php script to print years as dropdown (1) PHP Storm (2) PHP Storm license key (1) PHP strong encryption and decryption (1) php timeslot generator (1) php-mysql Modules (1) phpmyadmin (2) phpMyAdmin install (1) Pin-code finder (1) Pincode (1) Play youtube video in angular JS (1) Popup (2) POPUP in javascript (1) POST and GET Difference (1) POST DATA IN PHP (1) Postfix sendmail (1) preview of selected file (1) Print content with jquery (1) print() (1) Push Notifications (1) query string based pagination in codeigniter (1) Random key (1) ratings (1) regular expressions (1) remote validation (1) remove query string (1) Remove Sale Tag or Logo of woocommerce (1) Repository (1) require_once() (1) require() (1) Resize Image Dynamically (1) result_array() (1) rpmdb open fail (1) Salaries (1) SCP Command syntax (1) select images display in webbrowser (1) Selected values in javascript (1) Send free sms (1) Send Grid (1) Send Grid Email integration (1) SEO PHP (1) Session Management in PHP (1) show active class in the url automatically php (1) Show alternate image (1) simple ajax php script (1) Simple Login in PHP (1) Simple registraion (1) single file upload (1) site2sms script (1) Slideshow (1) SMTP Configuration (2) Socketio fastpanel (1) SOFTWARE TECHNOLOGY TIPS (1) Sort list items by Mouse in jquery (1) SPAM EMAILS (1) sprintf in php (1) SQL Injection in php (1) States Countries API (1) static variable in javascript (1) store date in php (1) stripslashes() (1) strtotime (1) sum of array values (1) sumo select (1) system error: 113 (1) Talk To Camera (1) Text to ASCII Generator (1) this keyword (1) Time ago function in javascript (1) Time ago Plugin (1) Time in PHP (1) time picker in grocery crud admin (1) Timeslot Generation in PHP (1) Tooltips using css (1) trigger in mysql (1) ubuntu (1) UNIX timestamp to HUMan readable converter (1) use full tutorials (1) user ur domain inseted of localhost (1) validation in javascript (1) Version Controls for PHP (1) Voice Over Prompts (1) Webmin (1) What CMS (1) Why Drupal CMS (1) Windows 10 (1) Windows Commands (1) Wordpress (2) Xampp (2) Xampp Localhost (1) Xampp Security (1) Yii Framework configuration (1) Yii framework installation (1) ZipArchive (1) ZipArchive php aws (1)
 
TOP