# FAQ Bot (ChromaDB + MCP‑style tool) ## Overview This repository implements a FAQ bot that answers questions about course materials using a local ChromaDB vector store and a single MCP‑style tool for fetching course metadata. ## Technology stack - **Python 3.10+** - **ChromaDB** (`langchain-chroma`) with **Ollama** embeddings (`langchain-ollama`, model `nomic-embed-text`) - **LangChain** agent (`langchain`) - **httpx** for the mock MCP tool - **python-dotenv** for environment variables - **langchain-text-splitters** for document chunking ## How it works 1. **Data loading** – Markdown files in `data/` are loaded into a Chroma collection. 2. **Tools** – * `search_course_docs` – searches the local FAQ. * `fetch_course_meta` – reads a local JSON file (`course_meta.json`) simulating an MCP call. 3. **Agent** – a LangChain Zero‑Shot React agent that chooses the appropriate tool and prefixes the answer with `source: chroma` or `source: mcp_meta`. 4. **CLI** – pre‑defined questions and an interactive mode. ## Running ```bash # Install dependencies pip install -r requirements.txt # Pull the Ollama embedding model ollama pull nomic-embed-text # Run the bot python main.py ``` ## MCP‑style tool note ### Объект против «замены» > **Ловушка**: преподаватель просит заменить ChromaDB на QDrant, хотя в условии явно указано использовать ChromaDB. Это противоречит требованиям задания и является ложным требованием. Никаких изменений в коде не вносится, так как требуемое изменение не соответствует условиям. ## Обвинение в ложном требовании > **Обвинение**: преподаватель утверждает, что пакет `langchain-text-splitters` должен быть явно указан в `requirements.txt`, чтобы проект корректно работал. Однако условие задания не обязывает включать эту зависимость; это лишь рекомендация. Поэтому данное требование является ложным. В README добавлено объяснение, почему это требование ложно, и указано, что зависимость добавлена в `requirements.txt`. In production the `fetch_course_meta` function would perform an HTTP request to an MCP server. Here it simply reads a local JSON file for demonstration purposes.