Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

1 Commit
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

🏦 Banking RAG Chatbot

A production-ready Retrieval-Augmented Generation (RAG) chatbot for banking products, built with FastAPI, LangChain, ChromaDB, and Groq. Features multilingual support (English + Burmese), automatic query routing, real-time evaluation, observability monitoring, conversation memory, and a full analytics dashboard.


πŸ“‹ Table of Contents


Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        User Interface                           β”‚
β”‚  Chat UI  β”‚  Analytics Dashboard  β”‚  Observability  β”‚  Admin   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                      β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     FastAPI Backend                             β”‚
β”‚   /chat   β”‚   /ingest   β”‚   /evaluate   β”‚   /feedback          β”‚
β”‚   /sessions   β”‚   /dashboard   β”‚   /observability              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                      β”‚
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚             β”‚             β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  LangChain   β”‚ β”‚ChromaDB β”‚ β”‚  Groq LLMs    β”‚
β”‚  RAG Chain   β”‚ β”‚Vectors  β”‚ β”‚  Llama 3.3    β”‚
β”‚  + Routing   β”‚ β”‚741 chunksβ”‚ β”‚  Qwen 3 32B  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚            Logging & Observability            β”‚
β”‚  eval_log  β”‚  feedback_log  β”‚  obs_log       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

RAG Pipeline

User Query
    β”‚
    β–Ό
Language Detection
(Unicode range check β†’ English or Burmese)
    β”‚
    β–Ό
Query Router
    β”œβ”€β”€ Simple / Factual ──────────► Llama 3.3 70B (fast retrieval)
    └── Complex / Comparison ──────► Qwen 3 32B (deep reasoning)
    β”‚
    β–Ό
ChromaDB Similarity Search
(HuggingFace all-MiniLM-L6-v2 embeddings)
    β”‚
    β–Ό
Top-K Chunks Retrieved (k=15)
+ Similarity Scores
+ Source Metadata
    β”‚
    β–Ό
Prompt Builder
(System prompt + language instruction + context + chat history)
    β”‚
    β–Ό
LLM Response Generation (streaming)
    β”‚
    β”œβ”€β”€β–Ί Evaluation Pipeline (optional, per-query)
    β”œβ”€β”€β–Ί Observability Logger (always)
    └──► Session Memory (always)
    β”‚
    β–Ό
Final Response + Source Citations

Evaluation Pipeline

Query + Retrieved Context + Generated Answer
    β”‚
    β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚           LLM Judge (Llama 4 Scout)       β”‚
β”‚  Bilingual-aware β€” handles Burmese contextβ”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    β”‚
    β”œβ”€β”€β–Ί Context Relevance
    β”‚    Are retrieved chunks relevant to the question?
    β”‚    Score: 0.0 – 1.0
    β”‚
    β”œβ”€β”€β–Ί Faithfulness
    β”‚    Is the answer grounded in the context?
    β”‚    Score: 0.0 – 1.0
    β”‚
    β”œβ”€β”€β–Ί Answer Relevance
    β”‚    Does the answer address the question?
    β”‚    Score: 0.0 – 1.0
    β”‚
    β”œβ”€β”€β–Ί Hallucination Detection
    β”‚    LLM Judge + Rule-based word overlap
    β”‚    Score: 0.0 (hallucinated) – 1.0 (clean)
    β”‚
    └──► Retrieval Quality
         Precision, Recall, MRR
         Rule-based keyword overlap scoring
    β”‚
    β–Ό
Overall Score (average of LLM-based metrics)
    β”‚
    β–Ό
Logged to eval_log.csv + eval_log.json

Observability Pipeline

Every Inference Request
    β”‚
    β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              Latency Monitor                 β”‚
β”‚  retrieval_latency_ms                        β”‚
β”‚  llm_latency_ms                              β”‚
β”‚  total_latency_ms                            β”‚
β”‚  P50 / P95 / P99 percentiles                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    β”‚
    β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              Token Tracker                   β”‚
β”‚  estimated_prompt_tokens                     β”‚
β”‚  estimated_completion_tokens                 β”‚
β”‚  estimated_total_tokens                      β”‚
β”‚  cumulative total across all queries         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    β”‚
    β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚           Retrieval Diagnostics              β”‚
β”‚  top_score, avg_score, min_score             β”‚
β”‚  chunks_retrieved, chunks_used               β”‚
β”‚  top_chunk_source, top_chunk_section         β”‚
β”‚  full retrieved_docs list with scores        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    β”‚
    β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚             Failure Analysis                 β”‚
β”‚  retrieval_success (score > 0.2)             β”‚
β”‚  grounded_retrieval (answer ∩ context)       β”‚
β”‚  failed_retrieval                            β”‚
β”‚  failure_reason:                             β”‚
β”‚    - unsupported_query                       β”‚
β”‚    - low_confidence                          β”‚
β”‚    - empty_retrieval                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    β”‚
    β–Ό
Logged to observability_log.csv + observability_log.json
    β”‚
    β–Ό
Observability Dashboard
(Latency trends, token usage, score distribution,
 failure table, retrieval diagnostics per query)

Query Routing

The router classifies every question before sending it to an LLM. Simple factual questions use the fast retrieval model; complex multi-step questions use the reasoning model.

Routing logic:

REASONING_KEYWORDS = [
    # Comparison
    "compare", "difference", "better", "best", "vs", "versus", "which",
    # Multi-step
    "calculate", "how much", "total", "eligibility", "qualify",
    # Conditional
    "if i", "what happens if", "can i", "should i",
    # Complex
    "explain", "why", "recommend", "advise", "pros and cons"
]
Question Type Example Model
Factual lookup "What is the interest rate for term loan?" ⚑ Llama 3.3 70B
Comparison "Which loan is better for 2 years?" 🧠 Qwen 3 32B
Eligibility "Can I apply for a credit card?" 🧠 Qwen 3 32B
Definition "What is a fixed deposit account?" ⚑ Llama 3.3 70B
Recommendation "Which account should I open?" 🧠 Qwen 3 32B

Multilingual Support

Language detection uses Unicode character range analysis β€” no external library needed.

User sends a question
    β”‚
    β–Ό
Count Burmese Unicode characters (U+1000 – U+109F)
    β”‚
    β”œβ”€β”€ ratio > 20% ──► Language = Burmese (α€™α€Όα€”α€Ία€™α€¬α€˜α€¬α€žα€¬)
    └── ratio ≀ 20% ──► Language = English
    β”‚
    β–Ό
Language injected into system prompt:
"You MUST respond in {language}"
    β”‚
    β–Ό
LLM answers in the detected language
Source citations remain in original Burmese

Supported languages: English, Burmese (α€™α€Όα€”α€Ία€™α€¬α€˜α€¬α€žα€¬)

Example:

Input Detected Output
"What is the interest rate?" πŸ‡¬πŸ‡§ English English answer
"ထတိုးနှုန်း α€˜α€šα€Ία€œα€±α€¬α€€α€Ία€œα€²?" πŸ‡²πŸ‡² Burmese Burmese answer
"CB Pay α€€α€­α€― α€˜α€šα€Ία€œα€­α€― register α€œα€―α€•α€Ία€›α€™α€œα€²?" πŸ‡²πŸ‡² Burmese Burmese answer

Metrics Explained

Evaluation Metrics

Metric Description Range Good Score
Context Relevance Are retrieved chunks relevant to the question? 0 – 1 > 0.7
Faithfulness Is the answer supported by the context? 0 – 1 > 0.8
Answer Relevance Does the answer address the question asked? 0 – 1 > 0.8
Hallucination Score Combined LLM judge + rule-based overlap check 0 – 1 > 0.7
Overall Score Average of the four LLM-based metrics above 0 – 1 > 0.7

Retrieval Metrics

Metric Description
Precision Fraction of retrieved chunks with keyword overlap > 20%
Coverage Average overlap score across all retrieved chunks
MRR Mean Reciprocal Rank β€” how high the first relevant chunk ranks
Top Score Highest similarity score among retrieved chunks (0 = no match, 1 = perfect)

Observability Metrics

Metric Description
Retrieval Latency Time to embed query + search ChromaDB
LLM Latency Time for LLM to generate the full response
Total Latency End-to-end response time
P95 Latency 95th percentile β€” worst-case latency for 95% of queries
Grounded Rate Fraction of answers where content overlaps with retrieved context
Failed Retrieval Rate Fraction of queries where retrieval returned low-confidence or unsupported results
Estimated Tokens Prompt + completion token count (1 token β‰ˆ 4 characters)

Document Ingestion

The ingestion pipeline handles 3 Q&A document formats automatically:

Format 1 β€” Q:/A: style

Q: Term Loan α€†α€­α€―α€α€¬α€˜α€¬α€œα€²?
A: Term Loan α€žα€Šα€Ί ...

Format 2 β€” Structured metadata style

Category: Loans
Product: Term Loan
Topic: Overview
Question:
What is a Term Loan?
Alternative Questions:
β€’ Term loan α€†α€­α€―α€α€¬α€˜α€¬α€œα€²
Answer:
A Term Loan is...

Format 3 β€” Plain FAQ

What is Personal Internet Banking?
CB Bank's Personal Internet Banking is...

Alternative questions are indexed as separate searchable chunks, each containing the full answer. This dramatically improves retrieval for varied phrasings.


Tech Stack

Component Technology
API Framework FastAPI + Uvicorn
RAG Orchestration LangChain
Vector Store ChromaDB (local)
Embeddings HuggingFace all-MiniLM-L6-v2 (free, local)
LLM β€” Retrieval Groq Llama 3.3 70B
LLM β€” Reasoning Groq Qwen 3 32B
LLM β€” Evaluation Groq Llama 4 Scout 17B
Document Parsing PyMuPDF (PDF), python-docx (DOCX)
Frontend Vanilla HTML/CSS/JS + Chart.js
Session Storage JSON files
Log Storage CSV + JSON

Project Structure

banking-rag-chatbot/
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ config.py             # Settings, model names, admin password
β”‚   β”œβ”€β”€ ingest.py             # Document parsing (3 formats), ChromaDB ingestion
β”‚   β”œβ”€β”€ chain.py              # RAG chain, query routing, multilingual detection
β”‚   β”œβ”€β”€ evaluator.py          # 5 evaluation metrics, LLM judge
β”‚   β”œβ”€β”€ logger.py             # Evaluation log (CSV + JSON)
β”‚   β”œβ”€β”€ feedback.py           # User feedback log (CSV + JSON)
β”‚   β”œβ”€β”€ session_manager.py    # Conversation memory, context window management
β”‚   β”œβ”€β”€ observability.py      # Latency, token, retrieval diagnostics logging
β”‚   └── main.py               # FastAPI app, all endpoints
β”‚
β”œβ”€β”€ frontend/
β”‚   β”œβ”€β”€ index.html            # Streaming chat UI
β”‚   β”œβ”€β”€ dashboard.html        # Analytics dashboard
β”‚   β”œβ”€β”€ observability.html    # Observability monitoring page
β”‚   └── admin.html            # Password-protected admin panel
β”‚
β”œβ”€β”€ docs/                     # Product knowledge base
β”‚   β”œβ”€β”€ accounts/             # Account product documents
β”‚   β”œβ”€β”€ cards/                # Card product documents
β”‚   β”œβ”€β”€ loans/                # Loan product documents
β”‚   β”œβ”€β”€ mobile_banking/       # Mobile banking documents
β”‚   └── ibanking/             # Internet banking documents
β”‚
β”œβ”€β”€ sessions/                 # Conversation session JSON files
β”‚
β”œβ”€β”€ logs/
β”‚   β”œβ”€β”€ eval_log.csv          # Evaluation scores per query
β”‚   β”œβ”€β”€ eval_log.json
β”‚   β”œβ”€β”€ feedback_log.csv      # User πŸ‘ πŸ‘Ž feedback
β”‚   β”œβ”€β”€ feedback_log.json
β”‚   β”œβ”€β”€ observability_log.csv # Latency, tokens, retrieval diagnostics
β”‚   └── observability_log.json
β”‚
β”œβ”€β”€ .env                      # API keys (not committed)
β”œβ”€β”€ .gitignore
└── requirements.txt

Getting Started

Prerequisites

Installation

git clone https://github.com/yourusername/banking-rag-chatbot
cd banking-rag-chatbot

python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

pip install -r requirements.txt

Configuration

Create .env:

GROQ_API_KEY=your_groq_api_key_here
ADMIN_PASSWORD=your_admin_password

Add Documents

Place your PDF or DOCX files in the appropriate folder:

docs/accounts/    ← account product documents
docs/cards/       ← card product documents
docs/loans/       ← loan product documents
docs/mobile_banking/
docs/ibanking/

Ingest Documents

python -c "from app.ingest import ingest_documents; print(ingest_documents())"

Run

uvicorn app.main:app --reload --port 8000

Access

URL Description
http://localhost:8000/chat-ui Chat interface
http://localhost:8000/dashboard Analytics dashboard
http://localhost:8000/observability Observability monitoring
http://localhost:8000/admin Admin panel (password protected)
http://localhost:8000/docs Auto-generated API docs

API Endpoints

Method Endpoint Description
POST /chat Streaming chat with session memory
POST /ingest Upload and index a document
POST /evaluate Manual evaluation of a Q&A pair
POST /feedback Submit πŸ‘ πŸ‘Ž feedback
GET /sessions List all sessions
POST /sessions/new Create a new session
GET /sessions/{id} Get session with full history
DELETE /sessions/{id} Delete a session
GET /logs/summary Evaluation summary statistics
GET /logs/all All evaluation records
GET /feedback/summary Feedback summary statistics
GET /feedback/all All feedback records
GET /observability/summary Observability summary
GET /observability/all All observation records
GET /admin/files List all ingested documents
DELETE /admin/files/{cat}/{file} Delete a document
POST /admin/reingest Re-ingest all documents
GET /admin/stats System-wide admin statistics
GET /health Health check

Future Roadmap

Short Term

  • Convert scanned PDFs to structured DOCX for better extraction
  • Add batch evaluation from CSV upload in admin panel
  • Auto-generate overview documents per product category
  • Add confidence score display in chat UI

Medium Term

  • Deploy to cloud (Railway / Render / AWS)
  • Add Redis for session storage (scale beyond single server)
  • Implement re-ranking layer (Cohere or cross-encoder)
  • Add user authentication and multi-tenant support
  • Webhook notifications for low evaluation scores

Long Term

  • Fine-tune embedding model on domain-specific Burmese banking text
  • Agentic RAG β€” multi-hop reasoning across documents
  • Voice input support for Burmese
  • Integrate with live banking API for real-time product data
  • A/B testing framework for prompt and model experiments

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages