Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 124 additions & 0 deletions ai-rag-project/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
# Endee AI Knowledge Assistant

## Project Overview
Endee AI Knowledge Assistant is an AI-powered question answering system built using Retrieval-Augmented Generation (RAG). The system allows users to ask natural language questions and receive context-aware answers by retrieving relevant information from a knowledge base.

The system integrates semantic search, vector databases, and language models to provide intelligent responses.
![Project](image.png)

---

## Problem Statement

Organizations store large amounts of information across documents and databases. Traditional search systems rely on keyword matching and often fail to understand the meaning of user queries.

Challenges include:

- Fragmented information sources
- Slow knowledge retrieval
- Inefficient keyword-based search
- Difficulty extracting insights from large datasets

This project solves these challenges using an AI-powered semantic retrieval system.

---

## System Design and Technical Approach

The project follows a Retrieval-Augmented Generation (RAG) pipeline.

### Workflow

1. User submits a question through the interface
2. Question is converted into embeddings
3. Vector database performs similarity search
4. Relevant knowledge is retrieved
5. AI model generates the final response

### Architecture

User
Frontend (Streamlit)
Backend API (FastAPI)
Embedding Model (Sentence Transformers)
Vector Database (FAISS)
Context Retrieval
AI Response Generation

---

## How Endee is Used

The project demonstrates Endee-style AI architecture principles including:

- Semantic embedding generation
- Vector database indexing
- Context-based retrieval
- AI-powered reasoning using retrieved knowledge

This allows the system to generate accurate answers grounded in actual information.

---

## Technology Stack

Frontend
- Streamlit

Backend
- FastAPI

AI Models
- Sentence Transformers

Vector Database
- FAISS

Programming Language
- Python

---

## Setup Instructions

### 1 Clone Repository
### 2 Create Virtual Environment
### 3 Install Dependencies


---

## Running the Project
Start backend - uvicorn backend.api:app --reload

Start frontend - streamlit run frontend/app.py

Open browser - http://localhost:8501
---

## Example Questions

- What is Retrieval Augmented Generation?
- Explain vector databases
- What is semantic search?

---

## Future Improvements

- Chat memory
- Multi-document knowledge ingestion
- Scalable vector databases
- Improved answer citations

---

## Conclusion

This project demonstrates how AI-powered retrieval systems can improve knowledge discovery and enable intelligent question answering using modern machine learning techniques.
Empty file.
77 changes: 77 additions & 0 deletions ai-rag-project/backend/api.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import logging
import os

from fastapi import FastAPI, HTTPException
from backend.retriever import load_knowledge, retrieve
import openai

logger = logging.getLogger(__name__)
app = FastAPI()

openai_api_key = os.getenv("OPENAI_API_KEY")
if openai_api_key:
openai.api_key = openai_api_key


@app.on_event("startup")
def startup_event():
try:
load_knowledge()
except Exception:
logger.exception("Failed to load knowledge base")


@app.get("/")
def home():

return {"status": "Endee-style RAG assistant ready"}


@app.get("/ask")

def ask(question: str):

if not openai_api_key:
# Return a harmless response so the frontend can render an error message
# instead of showing "Backend not running" when no API key is configured.
return {
"answer": "OPENAI_API_KEY is not set. Set the environment variable to enable OpenAI API calls.",
"sources": [],
}

try:
docs = retrieve(question)
except Exception as e:
raise HTTPException(
status_code=500,
detail=f"Failed to retrieve knowledge: {e}",
) from e

context = "\n".join(docs)

prompt = f"""
Use the following knowledge to answer the question.

Knowledge:
{context}

Question:
{question}

Provide a clear answer and reference the knowledge used.
"""

try:
response = openai.ChatCompletion.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}]
)
except Exception as e:
raise HTTPException(status_code=502, detail=str(e)) from e

answer = response["choices"][0]["message"]["content"]

return {
"answer": answer,
"sources": docs
}
41 changes: 41 additions & 0 deletions ai-rag-project/backend/knowledge_base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
from sentence_transformers import SentenceTransformer
from pypdf import PdfReader
import numpy as np
from backend.vector_store import VectorStore

model = SentenceTransformer("all-MiniLM-L6-v2")

vector_db = None


def load_pdf(file_path):

global vector_db

reader = PdfReader(file_path)

text = ""

for page in reader.pages:
text += page.extract_text()

chunks = text.split("\n")

chunks = [c.strip() for c in chunks if len(c) > 40]

embeddings = model.encode(chunks)

dimension = embeddings.shape[1]

vector_db = VectorStore(dimension)

vector_db.add(embeddings, chunks)


def retrieve(query):

query_vec = model.encode([query])

results = vector_db.search(query_vec)

return results
38 changes: 38 additions & 0 deletions ai-rag-project/backend/retriever.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
from pathlib import Path

from sentence_transformers import SentenceTransformer
from backend.vector_store import VectorStore

MODEL_NAME = "all-MiniLM-L6-v2"
KNOWLEDGE_FILE = Path(__file__).resolve().parents[1] / "data" / "knowledge.txt"

model = SentenceTransformer(MODEL_NAME)
vector_db = None


def load_knowledge():

global vector_db

if not KNOWLEDGE_FILE.exists():
raise FileNotFoundError(f"Knowledge file not found at: {KNOWLEDGE_FILE}")

with open(KNOWLEDGE_FILE, encoding="utf-8") as f:
docs = [line.strip() for line in f if line.strip()]

embeddings = model.encode(docs)

dim = embeddings.shape[1]

vector_db = VectorStore(dim)

vector_db.add(embeddings, docs)


def retrieve(query):

query_vec = model.encode([query])

results = vector_db.search(query_vec)

return results
17 changes: 17 additions & 0 deletions ai-rag-project/backend/vector_store.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import faiss
import numpy as np


class VectorStore:

def __init__(self, dimension):
self.index = faiss.IndexFlatL2(dimension)
self.documents = []

def add(self, embeddings, docs):
self.index.add(np.array(embeddings))
self.documents.extend(docs)

def search(self, query_embedding, k=3):
D, I = self.index.search(np.array(query_embedding), k)
return [self.documents[i] for i in I[0]]
Binary file added ai-rag-project/image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions ai-rag-project/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
fastapi
uvicorn
streamlit
sentence-transformers
faiss-cpu
numpy
requests
openai