Spaces:
Runtime error
Runtime error
| title: KnowFlow AI RAG Document Chatbot | |
| emoji: 🧠 | |
| colorFrom: blue | |
| colorTo: purple | |
| sdk: streamlit | |
| sdk_version: "1.45.1" | |
| python_version: "3.11" | |
| app_file: app.py | |
| pinned: false | |
| # KnowFlow AI | |
| **KnowFlow AI** is a production-style RAG document chatbot demo built with Streamlit, ChromaDB, local CPU embeddings, Docker, and a cloud LLM API. | |
| The project is designed as a recruiter-facing AI engineering portfolio demo. It shows how a notebook-based RAG prototype can be converted into a modular, Dockerized, production-aware application structure. | |
| --- | |
| ## What It Does | |
| KnowFlow AI lets users upload or use local documents and ask questions about them. | |
| The system: | |
| 1. Loads documents from a knowledge base folder. | |
| 2. Extracts text from supported file types. | |
| 3. Cleans the text. | |
| 4. Splits the text into retrieval-friendly chunks. | |
| 5. Converts chunks into local embeddings. | |
| 6. Stores embeddings in ChromaDB. | |
| 7. Retrieves the most relevant chunks for a user question. | |
| 8. Sends retrieved context and the user question to a cloud LLM. | |
| 9. Returns a grounded answer with source traceability. | |
| --- | |
| ## Key Features | |
| - Document-based question answering | |
| - Text extraction from TXT, Markdown, CSV, and PDF | |
| - Local CPU embedding generation | |
| - ChromaDB vector search | |
| - Cloud LLM API integration | |
| - Source chunk transparency | |
| - RAG prompt guardrails | |
| - Dockerized development workflow | |
| - Modular backend architecture | |
| - CLI demo runner | |
| - Unit-test-ready structure | |
| - Logging and output persistence | |
| - Production-style secret handling | |
| - Hugging Face Spaces ready | |
| - Streamlit-ready architecture for the next phase | |
| --- | |
| ## Tech Stack | |
| - Python | |
| - Streamlit | |
| - ChromaDB | |
| - sentence-transformers | |
| - PyTorch CPU | |
| - Cloud LLM API | |
| - Docker | |
| - Docker Compose | |
| - pytest | |
| - Hugging Face Spaces ready | |
| --- | |
| ## Production Demonstrations | |
| This project demonstrates: | |
| - Modular RAG architecture | |
| - Secure environment configuration | |
| - Source-attributed answers | |
| - Retrieval debugging | |
| - Prompt guardrails | |
| - Local vector database usage | |
| - Dockerized development | |
| - Deployment-ready folder structure | |
| - Cloud API retry handling | |
| - Logging and observability foundations | |
| - Testable backend components | |
| - Separation of generated artifacts from source code | |
| --- | |
| ## Project Status | |
| ```text | |
| Phase 1: Repository and production skeleton setup completed. | |
| Phase 2: Modular RAG backend pipeline completed. | |
| Phase 3: Streamlit application interface planned. | |
| Phase 4: Hugging Face Spaces deployment planned. | |
| ```` | |
| --- | |
| ## Repository Name | |
| Recommended repository name: | |
| ```text | |
| knowflow-ai-rag-document-chatbot | |
| ``` | |
| Why this name is used: | |
| ```text | |
| knowflow-ai -> brand name | |
| rag -> explains the AI architecture | |
| document-chatbot -> explains the use case | |
| ``` | |
| --- | |
| ## Folder Structure | |
| ```text | |
| knowflow-ai-rag-document-chatbot/ | |
| ├── app/ | |
| │ └── streamlit_app.py | |
| ├── src/ | |
| │ ├── __init__.py | |
| │ ├── config.py | |
| │ ├── document_loader.py | |
| │ ├── text_cleaner.py | |
| │ ├── chunker.py | |
| │ ├── embeddings.py | |
| │ ├── vector_store.py | |
| │ ├── retriever.py | |
| │ ├── llm_client.py | |
| │ ├── rag_pipeline.py | |
| │ └── logging_utils.py | |
| ├── scripts/ | |
| │ ├── run_phase2_demo.py | |
| │ └── docker_manager.sh | |
| ├── tests/ | |
| │ ├── test_document_loader.py | |
| │ ├── test_chunker.py | |
| │ └── test_rag_pipeline.py | |
| ├── data/ | |
| │ ├── raw/ | |
| │ │ └── company_policy.txt | |
| │ └── sample/ | |
| │ └── company_policy_demo.txt | |
| ├── vector_db/ | |
| ├── outputs/ | |
| ├── logs/ | |
| ├── notebooks/ | |
| ├── docs/ | |
| │ ├── architecture.md | |
| │ ├── production_notes.md | |
| │ ├── prompt_design.md | |
| │ └── deployment_plan.md | |
| ├── assets/ | |
| │ └── screenshots/ | |
| ├── config/ | |
| │ └── sample_questions.json | |
| ├── Dockerfile | |
| ├── docker-compose.yml | |
| ├── requirements.txt | |
| ├── .env.example | |
| ├── .gitignore | |
| ├── .dockerignore | |
| └── README.md | |
| ``` | |
| --- | |
| ## Important Files | |
| ```text | |
| Dockerfile | |
| Builds the Docker image for KnowFlow AI. | |
| docker-compose.yml | |
| Runs the Jupyter development service and future Streamlit service. | |
| requirements.txt | |
| Contains clean project dependencies. | |
| .env.example | |
| Safe environment template without real secrets. | |
| .env | |
| Private local environment file. This must never be committed. | |
| src/ | |
| Contains the modular RAG backend code. | |
| scripts/run_phase2_demo.py | |
| Runs the complete modular RAG backend from the terminal. | |
| scripts/docker_manager.sh | |
| Provides simple Docker workflow commands. | |
| tests/ | |
| Contains basic tests for backend modules. | |
| data/raw/ | |
| Stores local knowledge base files. | |
| vector_db/ | |
| Generated ChromaDB vector database. This should not be committed. | |
| outputs/ | |
| Generated RAG output files. This should not be committed. | |
| logs/ | |
| Generated JSONL logs. This should not be committed. | |
| ``` | |
| --- | |
| ## Supported Document Types | |
| ```text | |
| .txt | |
| .md | |
| .csv | |
| ``` | |
| --- | |
| ## Environment Variables | |
| Create a private `.env` file from `.env.example`. | |
| ```bash | |
| cp .env.example .env | |
| ``` | |
| Edit `.env`: | |
| ```bash | |
| code .env | |
| ``` | |
| Example `.env.example`: | |
| ```env | |
| CLOUD_API_PROVIDER=clod | |
| CLOUD_API_FORMAT=openai_chat_completions | |
| CLOUD_API_BASE_URL=https://api.clod.io/v1 | |
| CLOUD_CHAT_COMPLETIONS_PATH=/chat/completions | |
| CLOUD_CHAT_COMPLETIONS_URL= | |
| CLOUD_API_KEY=replace_with_your_real_api_key | |
| CLOUD_AUTH_HEADER=Authorization | |
| CLOUD_AUTH_PREFIX=Bearer | |
| CLOUD_CHAT_MODEL=Gemma 4 31B IT | |
| CLOUD_TEMPERATURE=0.2 | |
| CLOUD_MAX_COMPLETION_TOKENS=700 | |
| CLOUD_TIMEOUT_SECONDS=60 | |
| CLOUD_MAX_RETRIES=3 | |
| CLOUD_RETRY_SLEEP_SECONDS=2 | |
| EMBEDDING_MODEL_NAME=sentence-transformers/all-MiniLM-L6-v2 | |
| EMBEDDING_DEVICE=cpu | |
| CHUNK_SIZE=900 | |
| CHUNK_OVERLAP=120 | |
| TOP_K=4 | |
| DATA_FOLDER=data/raw | |
| VECTOR_DB_FOLDER=vector_db/chroma | |
| COLLECTION_NAME=knowflow_ai_documents | |
| REQUIRE_CONTEXT_FOR_ANSWER=true | |
| PROMPT_TEMPLATE_VERSION=rag_v1.0 | |
| ``` | |
| --- | |
| ## Secret Handling | |
| Never commit this file: | |
| ```text | |
| .env | |
| ``` | |
| Commit only this file: | |
| ```text | |
| .env.example | |
| ``` | |
| Required ignore rules: | |
| ```gitignore | |
| .env | |
| .env.local | |
| .env.production | |
| vector_db/ | |
| outputs/ | |
| logs/ | |
| ``` | |
| Production secret options: | |
| ```text | |
| Hugging Face Spaces Secrets | |
| GitHub Actions Secrets | |
| Docker secrets | |
| Kubernetes secrets | |
| AWS Secrets Manager | |
| Azure Key Vault | |
| Google Secret Manager | |
| ``` | |
| --- | |
| ## Docker Workflow | |
| This project uses Docker as the main development environment. | |
| Do not install packages locally unless needed. | |
| Do not run: | |
| ```bash | |
| pip install -r requirements.txt | |
| ``` | |
| Use Docker instead. | |
| --- | |
| ## Build Docker Image | |
| ```bash | |
| docker compose build | |
| ``` | |
| Build from scratch: | |
| ```bash | |
| docker compose build --no-cache | |
| ``` | |
| --- | |
| ## Start JupyterLab in Docker | |
| ```bash | |
| docker compose up knowflow-dev | |
| ``` | |
| Open: | |
| ```text | |
| http://localhost:8888/lab | |
| ``` | |
| Kernel: | |
| ```text | |
| Python (KnowFlow AI Docker) | |
| ``` | |
| --- | |
| ## Start JupyterLab in Background | |
| ```bash | |
| docker compose up -d knowflow-dev | |
| ``` | |
| --- | |
| ## Stop Containers | |
| ```bash | |
| docker compose down | |
| ``` | |
| --- | |
| ## Restart Containers | |
| ```bash | |
| docker compose down | |
| docker compose up knowflow-dev | |
| ``` | |
| --- | |
| ## Run Phase 2 Demo Inside Docker | |
| ```bash | |
| docker compose run --rm knowflow-dev python scripts/run_phase2_demo.py | |
| ``` | |
| This command: | |
| 1. Loads configuration. | |
| 2. Validates environment variables. | |
| 3. Creates required folders. | |
| 4. Loads documents. | |
| 5. Cleans text. | |
| 6. Chunks documents. | |
| 7. Builds embeddings. | |
| 8. Stores vectors in ChromaDB. | |
| 9. Tests the cloud LLM connection. | |
| 10. Asks demo questions. | |
| 11. Saves outputs. | |
| 12. Writes logs. | |
| --- | |
| ## Run Tests Inside Docker | |
| ```bash | |
| docker compose run --rm knowflow-dev pytest tests/ | |
| ``` | |
| --- | |
| ## Open Shell Inside Docker | |
| ```bash | |
| docker compose run --rm knowflow-dev bash | |
| ``` | |
| --- | |
| ## Check Environment Variables Inside Docker | |
| ```bash | |
| docker compose run --rm knowflow-dev python -c "import os; print('MODEL:', os.getenv('CLOUD_CHAT_MODEL')); print('API KEY LOADED:', bool(os.getenv('CLOUD_API_KEY')))" | |
| ``` | |
| --- | |
| ## Check Python Import Path Inside Docker | |
| ```bash | |
| docker compose run --rm knowflow-dev python -c "import src.config; print('src import works')" | |
| ``` | |
| --- | |
| ## View Docker Logs | |
| ```bash | |
| docker compose logs -f | |
| ``` | |
| --- | |
| ## Docker Manager Script | |
| Make script executable: | |
| ```bash | |
| chmod +x scripts/docker_manager.sh | |
| ``` | |
| Available commands: | |
| ```bash | |
| ./scripts/docker_manager.sh build | |
| ./scripts/docker_manager.sh start | |
| ./scripts/docker_manager.sh stop | |
| ./scripts/docker_manager.sh restart | |
| ./scripts/docker_manager.sh rebuild | |
| ./scripts/docker_manager.sh test | |
| ./scripts/docker_manager.sh demo | |
| ./scripts/docker_manager.sh shell | |
| ./scripts/docker_manager.sh logs | |
| ./scripts/docker_manager.sh status | |
| ./scripts/docker_manager.sh clean | |
| ./scripts/docker_manager.sh streamlit | |
| ``` | |
| Recommended daily command: | |
| ```bash | |
| ./scripts/docker_manager.sh start | |
| ``` | |
| Run backend demo: | |
| ```bash | |
| ./scripts/docker_manager.sh demo | |
| ``` | |
| Run tests: | |
| ```bash | |
| ./scripts/docker_manager.sh test | |
| ``` | |
| Stop project: | |
| ```bash | |
| ./scripts/docker_manager.sh stop | |
| ``` | |
| --- | |
| ## Future Streamlit Command | |
| Phase 3 will implement: | |
| ```text | |
| app/streamlit_app.py | |
| ``` | |
| Then run: | |
| ```bash | |
| docker compose --profile streamlit up knowflow-streamlit | |
| ``` | |
| Open: | |
| ```text | |
| http://localhost:8501 | |
| ``` | |
| --- | |
| ## Docker Permission Fix | |
| If Docker shows permission denied: | |
| ```bash | |
| sudo usermod -aG docker $USER | |
| newgrp docker | |
| docker ps | |
| ``` | |
| If it still fails, restart the computer. | |
| Temporary command: | |
| ```bash | |
| sudo docker compose up knowflow-dev | |
| ``` | |
| --- | |
| ## Port Already in Use | |
| If port `8888` is already used, change `docker-compose.yml`: | |
| ```yaml | |
| ports: | |
| - "8890:8888" | |
| ``` | |
| Open: | |
| ```text | |
| http://localhost:8890/lab | |
| ``` | |
| If Streamlit port `8501` is used, change: | |
| ```yaml | |
| ports: | |
| - "8502:8501" | |
| ``` | |
| Open: | |
| ```text | |
| http://localhost:8502 | |
| ``` | |
| --- | |
| ## Clean Docker Cache | |
| Basic cleanup: | |
| ```bash | |
| docker system prune -f | |
| ``` | |
| Full cleanup: | |
| ```bash | |
| docker compose down -v --rmi all | |
| docker system prune -a -f | |
| ``` | |
| --- | |
| ## Phase 2 Backend Modules | |
| ### `src/config.py` | |
| Handles: | |
| ```text | |
| .env loading | |
| environment variables | |
| project root detection | |
| folder path creation | |
| configuration validation | |
| ``` | |
| ### `src/document_loader.py` | |
| Handles: | |
| ```text | |
| TXT loading | |
| Markdown loading | |
| CSV loading | |
| PDF loading | |
| source metadata | |
| ``` | |
| ### `src/text_cleaner.py` | |
| Handles: | |
| ```text | |
| line ending normalization | |
| space cleanup | |
| blank line cleanup | |
| ``` | |
| ### `src/chunker.py` | |
| Handles: | |
| ```text | |
| paragraph-aware chunking | |
| long paragraph splitting | |
| stable chunk IDs | |
| ``` | |
| ### `src/embeddings.py` | |
| Handles: | |
| ```text | |
| sentence-transformer loading | |
| CPU embedding generation | |
| query embedding | |
| ``` | |
| ### `src/vector_store.py` | |
| Handles: | |
| ```text | |
| ChromaDB client | |
| collection creation | |
| collection reset | |
| chunk storage | |
| vector search | |
| ``` | |
| ### `src/retriever.py` | |
| Handles: | |
| ```text | |
| question embedding | |
| top-k retrieval | |
| semantic search | |
| ``` | |
| ### `src/llm_client.py` | |
| Handles: | |
| ```text | |
| cloud API headers | |
| cloud API payload | |
| retry logic | |
| timeout handling | |
| response parsing | |
| connection testing | |
| ``` | |
| ### `src/rag_pipeline.py` | |
| Handles: | |
| ```text | |
| full RAG orchestration | |
| document loading | |
| cleaning | |
| chunking | |
| embedding | |
| indexing | |
| retrieval | |
| prompt creation | |
| LLM calling | |
| result saving | |
| ``` | |
| ### `src/logging_utils.py` | |
| Handles: | |
| ```text | |
| JSON output saving | |
| JSONL event logging | |
| ``` | |
| --- | |
| ## RAG Flow | |
| ```text | |
| User question | |
| ↓ | |
| Embed question | |
| ↓ | |
| Search ChromaDB | |
| ↓ | |
| Retrieve top-k chunks | |
| ↓ | |
| Build RAG prompt | |
| ↓ | |
| Call cloud LLM | |
| ↓ | |
| Return grounded answer | |
| ↓ | |
| Show sources | |
| ``` | |
| --- | |
| ## Prompt Guardrail | |
| The default prompt instructs the model: | |
| ```text | |
| Use only the provided context. | |
| If the answer is not in the context, say: | |
| "I do not know from the provided knowledge base." | |
| ``` | |
| This reduces hallucination and makes the app safer for document-based question answering. | |
| --- | |
| ## Demo Questions | |
| Example questions for `company_policy.txt`: | |
| ```text | |
| What is the refund policy? | |
| How long does standard shipping take? | |
| What does the warranty cover? | |
| Does the company sell customer data? | |
| How many days of annual leave do employees get? | |
| How much training support can employees receive? | |
| What is the company policy about quantum teleportation? | |
| ``` | |
| The last question is intentionally outside the knowledge base and should trigger the safe fallback response. | |
| --- | |
| ## Git Workflow | |
| Create feature branch: | |
| ```bash | |
| git checkout develop | |
| git pull origin develop | |
| git checkout -b feature/phase-2-modular-rag-pipeline | |
| ``` | |
| --- | |
| ## Phase 2 Commit Plan | |
| Configuration module: | |
| ```bash | |
| git add src/config.py | |
| git commit -m "Add configuration management for modular RAG pipeline" | |
| ``` | |
| Document loading and cleaning: | |
| ```bash | |
| git add src/document_loader.py src/text_cleaner.py | |
| git commit -m "Add document loading and text cleaning modules" | |
| ``` | |
| Chunking: | |
| ```bash | |
| git add src/chunker.py | |
| git commit -m "Add paragraph-aware chunking for document retrieval" | |
| ``` | |
| Embeddings: | |
| ```bash | |
| git add src/embeddings.py | |
| git commit -m "Add local embedding model wrapper for RAG retrieval" | |
| ``` | |
| Vector store: | |
| ```bash | |
| git add src/vector_store.py | |
| git commit -m "Add ChromaDB vector store integration" | |
| ``` | |
| Retriever: | |
| ```bash | |
| git add src/retriever.py | |
| git commit -m "Add semantic retriever for vector search" | |
| ``` | |
| Cloud LLM client: | |
| ```bash | |
| git add src/llm_client.py | |
| git commit -m "Add OpenAI-compatible cloud LLM client" | |
| ``` | |
| Logging utilities: | |
| ```bash | |
| git add src/logging_utils.py | |
| git commit -m "Add structured logging utilities for RAG events" | |
| ``` | |
| RAG orchestration: | |
| ```bash | |
| git add src/rag_pipeline.py | |
| git commit -m "Add modular RAG pipeline orchestration" | |
| ``` | |
| CLI demo: | |
| ```bash | |
| git add scripts/run_phase2_demo.py | |
| git commit -m "Add CLI demo runner for Phase 2 RAG pipeline" | |
| ``` | |
| Tests: | |
| ```bash | |
| git add tests/test_document_loader.py tests/test_chunker.py tests/test_rag_pipeline.py | |
| git commit -m "Add tests for modular RAG components" | |
| ``` | |
| Docker files: | |
| ```bash | |
| git add Dockerfile docker-compose.yml .dockerignore .gitignore .env.example requirements.txt scripts/docker_manager.sh | |
| git commit -m "Add Docker workflow for KnowFlow AI modular RAG pipeline" | |
| ``` | |
| Push feature branch: | |
| ```bash | |
| git push -u origin feature/phase-2-modular-rag-pipeline | |
| ``` | |
| Merge into develop: | |
| ```bash | |
| git checkout develop | |
| git pull origin develop | |
| git merge feature/phase-2-modular-rag-pipeline | |
| git push origin develop | |
| ``` | |
| --- | |
| ## Useful Git Commands | |
| Check status: | |
| ```bash | |
| git status | |
| ``` | |
| Check branch: | |
| ```bash | |
| git branch | |
| ``` | |
| Check recent commits: | |
| ```bash | |
| git log --oneline --decorate -10 | |
| ``` | |
| Unstage files: | |
| ```bash | |
| git reset | |
| ``` | |
| Check ignored files: | |
| ```bash | |
| git status --ignored | |
| ``` | |
| Check whether `.env` is tracked: | |
| ```bash | |
| git ls-files | grep ".env" | |
| ``` | |
| If `.env` is accidentally tracked: | |
| ```bash | |
| git rm --cached .env | |
| git commit -m "Remove local environment file from tracking" | |
| ``` | |
| --- | |
| ## What Should Not Be Committed | |
| Do not commit: | |
| ```text | |
| .env | |
| vector_db/ | |
| outputs/ | |
| logs/ | |
| .venv/ | |
| __pycache__/ | |
| .ipynb_checkpoints/ | |
| ``` | |
| These are secrets or generated artifacts. | |
| --- | |
| ## What Should Be Committed | |
| Commit: | |
| ```text | |
| src/ | |
| scripts/ | |
| tests/ | |
| app/ | |
| docs/ | |
| data/sample/ | |
| data/raw/company_policy.txt | |
| Dockerfile | |
| docker-compose.yml | |
| requirements.txt | |
| .env.example | |
| .gitignore | |
| .dockerignore | |
| README.md | |
| ``` | |
| --- | |
| ## Phase 2 Completion Checklist | |
| ```text | |
| Configuration: | |
| [ ] src/config.py loads environment variables | |
| [ ] config validation works | |
| [ ] required folders are created | |
| Document processing: | |
| [ ] TXT loading works | |
| [ ] Markdown loading works | |
| [ ] CSV loading works | |
| [ ] PDF loading works | |
| [ ] text cleaning works | |
| Chunking: | |
| [ ] paragraph-aware chunking works | |
| [ ] stable chunk IDs are generated | |
| Embeddings: | |
| [ ] CPU embedding model loads | |
| [ ] text chunks are embedded | |
| Vector database: | |
| [ ] ChromaDB collection is created | |
| [ ] vector database rebuild works | |
| [ ] top-k retrieval works | |
| Cloud LLM: | |
| [ ] API key loads from environment | |
| [ ] cloud API call works | |
| [ ] retry logic works | |
| [ ] timeout exists | |
| RAG: | |
| [ ] retrieved chunks are inserted into prompt | |
| [ ] answer is generated | |
| [ ] sources are returned | |
| [ ] unknown questions safely fallback | |
| Testing: | |
| [ ] docker demo command runs | |
| [ ] pytest runs | |
| [ ] output files are generated locally | |
| [ ] logs are generated locally | |
| Git: | |
| [ ] Phase 2 commits completed | |
| [ ] feature branch pushed | |
| [ ] develop branch updated | |
| ``` | |
| --- | |
| ## Current Best Command Sequence | |
| From project root: | |
| ```bash | |
| docker compose build --no-cache | |
| docker compose run --rm knowflow-dev python scripts/run_phase2_demo.py | |
| docker compose run --rm knowflow-dev pytest tests/ | |
| git status | |
| ``` | |
| --- | |
| ## Next Phase | |
| ```text | |
| Phase 3: Build the Streamlit application interface. | |
| ``` | |
| Phase 3 goals: | |
| ```text | |
| - Add document upload UI | |
| - Add question input | |
| - Add chat-style response area | |
| - Add retrieved source expanders | |
| - Add rebuild vector DB button | |
| - Add sample questions | |
| - Add model/config display | |
| - Prepare Hugging Face Spaces deployment | |
| ``` | |