# shawon-aminul/diu_admission_chatbot architecture

> Architecture diagram of the GitHub repository shawon-aminul/diu_admission_chatbot, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-11). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/shawon-aminul/diu_admission_chatbot
- Repository: https://github.com/shawon-aminul/diu_admission_chatbot

## Overview

DIU Admission RAG turns approved, verified admission posts into searchable chunks and answers applicant questions with retrieved sources. The principal path is editorial verification → background ingestion → hybrid retrieval → grounded chat; applicants can also request retrieval-only results. The README additionally documents streaming answers and the ingestion dashboard. Relationships below follow shown calls or README statements; unsampled subsystems are represented only where documented.

Main entry points: [`app/rag/retriever.py`](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/rag/retriever.py) (Hybrid retriever), [`app/rag/chain.py`](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/rag/chain.py) (RAG chat chain), [`app/ingestion/pipeline.py`](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/ingestion/pipeline.py) (Ingest pipeline), [`app/api/documents.py`](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/api/documents.py) (Document workflow)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_editorial["Editorial and Ingestion"]
  node_document_api["Document workflow<br/>[documents.py]"]
  node_post_repo["Post repository<br/>[repositories.py]"]
  node_ingest["Ingest pipeline<br/>[pipeline.py]"]
  node_chunker["Text chunker<br/>[chunker.py]"]
end

subgraph group_retrieval["Hybrid Retrieval"]
  node_retriever["Hybrid retriever<br/>[retriever.py]"]
  node_vector_search["Cosine search<br/>[cosine_search.py]"]
  node_text_search["Full-text search<br/>[bm25_search.py]"]
  node_fusion["Rank fusion<br/>[hybrid_search.py]"]
  node_langchain_adapter["Retriever adapter"]
end

subgraph group_answer["Grounded Answers"]
  node_chat_api["Chat and search API<br/>[chat.py]"]
  node_rag_chain["RAG chat chain<br/>[chain.py]"]
  node_language["Language selection<br/>[language.py]"]
  node_prompts["Grounding prompts<br/>[prompts.py]"]
  node_llm["Local generation client<br/>[__init__.py]"]
  node_chat_ui["Chat interface<br/>[chat.html]"]
end

subgraph group_platform["Application Platform"]
  node_api["FastAPI routes<br/>[main.py]"]
  node_embedding_client["Embedding client<br/>[client.py]"]
  node_embedding_service["Local embedding service<br/>[service.py]"]
  node_database[("PostgreSQL + pgvector<br/>[connection.py]")]
  node_dependencies["Request dependencies<br/>[dependencies.py]"]
  node_dashboard["Ingestion dashboard<br/>[index.html]"]
end

node_editor(("Editorial staff"))
node_applicant(("Applicant"))
node_ollama["Ollama"]

node_editor -.->|"submits posts"| node_document_api
node_document_api -->|"updates workflow"| node_post_repo
node_document_api -->|"queues ingest"| node_ingest
node_ingest -->|"reads and writes"| node_database
node_ingest -->|"chunks text"| node_chunker
node_ingest -->|"embeds chunks"| node_embedding_client
node_embedding_client -->|"requests vectors"| node_embedding_service
node_post_repo -.->|"queries posts"| node_database
node_applicant -->|"asks or searches"| node_chat_api
node_chat_api -->|"resolves handlers"| node_dependencies
node_dependencies -->|"provides search"| node_retriever
node_dependencies -->|"provides chat"| node_rag_chain
node_retriever -->|"embeds query"| node_embedding_client
node_retriever -->|"loads candidates"| node_database
node_retriever -->|"runs vector branch"| node_vector_search
node_retriever -->|"runs text branch"| node_text_search
node_retriever -->|"fuses rankings"| node_fusion
node_rag_chain -->|"retrieves context"| node_langchain_adapter
node_langchain_adapter -->|"delegates search"| node_retriever
node_rag_chain -->|"selects language"| node_language
node_rag_chain -->|"builds prompt"| node_prompts
node_rag_chain -->|"generates answer"| node_llm
node_llm -->|"calls local model"| node_ollama
node_chat_api -.->|"serves chat page"| node_chat_ui
node_editor -.->|"uses dashboard"| node_dashboard
node_api -->|"mounts routes"| node_chat_api
node_api -->|"mounts routes"| node_document_api

click node_api "https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/main.py"
click node_document_api "https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/api/documents.py"
click node_post_repo "https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/database/repositories.py"
click node_ingest "https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/ingestion/pipeline.py"
click node_chunker "https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/ingestion/chunker.py"
click node_embedding_client "https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/embeddings/client.py"
click node_embedding_service "https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/embeddings/service.py"
click node_database "https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/database/connection.py"
click node_chat_api "https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/api/chat.py"
click node_dependencies "https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/api/dependencies.py"
click node_retriever "https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/rag/retriever.py"
click node_vector_search "https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/rag/cosine_search.py"
click node_text_search "https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/rag/bm25_search.py"
click node_fusion "https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/rag/hybrid_search.py"
click node_langchain_adapter "https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/rag/langchain_retriever.py"
click node_rag_chain "https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/rag/chain.py"
click node_language "https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/rag/language.py"
click node_prompts "https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/rag/prompts.py"
click node_llm "https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/llm/__init__.py"
click node_dashboard "https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/static/index.html"
click node_chat_ui "https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/static/chat.html"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_document_api,node_post_repo,node_ingest,node_chunker toneBlue
class node_retriever,node_vector_search,node_text_search,node_fusion,node_langchain_adapter toneAmber
class node_chat_api,node_rag_chain,node_language,node_prompts,node_llm,node_chat_ui toneMint
class node_api,node_embedding_client,node_embedding_service,node_database,node_dependencies,node_dashboard toneRose
class node_editor,node_applicant,node_ollama toneIndigo
```

## Components

### Editorial and Ingestion

- [Document workflow](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/api/documents.py): `app/api/documents.py`
- [Post repository](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/database/repositories.py): `app/database/repositories.py`
- [Ingest pipeline](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/ingestion/pipeline.py): `app/ingestion/pipeline.py`
- [Text chunker](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/ingestion/chunker.py): `app/ingestion/chunker.py`

### Hybrid Retrieval

- [Hybrid retriever](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/rag/retriever.py): `app/rag/retriever.py`
- [Cosine search](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/rag/cosine_search.py): `app/rag/cosine_search.py`
- [Full-text search](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/rag/bm25_search.py): `app/rag/bm25_search.py`
- [Rank fusion](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/rag/hybrid_search.py): `app/rag/hybrid_search.py`
- [Retriever adapter](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/rag/langchain_retriever.py): `app/rag/langchain_retriever.py`

### Grounded Answers

- [Chat and search API](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/api/chat.py): `app/api/chat.py`
- [RAG chat chain](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/rag/chain.py): `app/rag/chain.py`
- [Language selection](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/rag/language.py): `app/rag/language.py`
- [Grounding prompts](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/rag/prompts.py): `app/rag/prompts.py`
- [Local generation client](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/llm/__init__.py): `app/llm/__init__.py`
- [Chat interface](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/static/chat.html): `app/static/chat.html`

### Application Platform

- [FastAPI routes](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/main.py): `app/main.py`
- [Embedding client](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/embeddings/client.py): `app/embeddings/client.py`
- [Local embedding service](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/embeddings/service.py): `app/embeddings/service.py`
- [PostgreSQL + pgvector](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/database/connection.py): `app/database/connection.py`
- [Request dependencies](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/api/dependencies.py): `app/api/dependencies.py`
- [Ingestion dashboard](https://github.com/shawon-aminul/diu_admission_chatbot/blob/main/app/static/index.html): `app/static/index.html`

### Other components

- **Editorial staff**
- **Applicant**
- **Ollama**

## Connections

- Editorial staff → Document workflow: submits posts (evidence: `README.md`)
- Document workflow → Post repository: updates workflow (evidence: `app/api/documents.py`)
- Document workflow → Ingest pipeline: queues ingest (evidence: `app/api/documents.py`)
- Ingest pipeline → PostgreSQL + pgvector: reads and writes (evidence: `app/ingestion/pipeline.py`)
- Ingest pipeline → Text chunker: chunks text (evidence: `app/ingestion/pipeline.py`)
- Ingest pipeline → Embedding client: embeds chunks (evidence: `app/ingestion/pipeline.py`)
- Embedding client → Local embedding service: requests vectors (evidence: `app/embeddings/client.py`)
- Post repository → PostgreSQL + pgvector: queries posts
- Applicant → Chat and search API: asks or searches (evidence: `README.md`)
- Chat and search API → Request dependencies: resolves handlers (evidence: `app/api/chat.py`)
- Request dependencies → Hybrid retriever: provides search (evidence: `app/api/dependencies.py`)
- Request dependencies → RAG chat chain: provides chat (evidence: `app/api/dependencies.py`)
- Hybrid retriever → Embedding client: embeds query (evidence: `app/rag/retriever.py`)
- Hybrid retriever → PostgreSQL + pgvector: loads candidates (evidence: `app/rag/retriever.py`)
- Hybrid retriever → Cosine search: runs vector branch (evidence: `app/rag/retriever.py`)
- Hybrid retriever → Full-text search: runs text branch (evidence: `app/rag/retriever.py`)
- Hybrid retriever → Rank fusion: fuses rankings (evidence: `app/rag/retriever.py`)
- RAG chat chain → Retriever adapter: retrieves context (evidence: `app/rag/chain.py`)
- Retriever adapter → Hybrid retriever: delegates search (evidence: `app/rag/langchain_retriever.py`)
- RAG chat chain → Language selection: selects language (evidence: `app/rag/chain.py`)
- RAG chat chain → Grounding prompts: builds prompt (evidence: `app/rag/chain.py`)
- RAG chat chain → Local generation client: generates answer (evidence: `app/rag/chain.py`)
- Local generation client → Ollama: calls local model (evidence: `README.md`)
- Chat and search API → Chat interface: serves chat page
- Editorial staff → Ingestion dashboard: uses dashboard (evidence: `README.md`)
- FastAPI routes → Chat and search API: mounts routes (evidence: `app/main.py`)
- FastAPI routes → Document workflow: mounts routes (evidence: `app/main.py`)
