materialmind2 / README.md
Azizahalq's picture
Upload 20 files
201d38b verified
MaterialMind
Decisions, not summaries. MaterialMind is an LLM-powered materials-selection assistant that turns engineering requirements into an evidence-backed, ranked shortlist with page-level citations. It runs locally (Flask + Ollama) and searches your own PDF corpus via a lightweight RAG index.
What MaterialMind does
• Retrieves → Ranks → Explains: finds the most relevant pages, scores candidate materials against your constraints, and explains trade-offs with citations.
• Local and private: your PDFs never leave your machine.
• Robust ingestion: handles real-world PDFs (papers, standards, reports, textbooks); incremental updates.
• Friendly UI: clean dark theme, background tiles, live weight controls (accepts 40/30/20/10 or 0.4/0.3/0.2/0.1).
• Exact math: backend normalizes weights to sum to exactly 1.0000.
Repository layout
materialmind/ (your corpus lives here)
├─ sources/ (drop your PDFs here)
└─ index/ (vector DB; auto-created)
rag_mini.py (RAG: index/search/ask/answer/export)
app_user.py (Flask app for end users)
templates/ (base.html, index.html, results.html)
static/ (styles.css and images: 11.png, 22.jpg)
Note: We work with PDFs you drop into materialmind/sources (papers, standards, reports). You don’t need vendor datasheets; if you have them as PDFs, drop them in like any other PDF.
Prerequisites
• Python 3.10+
• pip and a virtual environment
• Ollama (for model-generated answers). Example model: qwen2.5:7b-instruct
• Optional: ocrmypdf + tesseract (only for scanned PDFs with no selectable text)
Installation
Create and activate a virtual environment.
macOS / Linux:
python3 -m venv .venv
source .venv/bin/activate
Windows (PowerShell):
python -m venv .venv
.venv\Scripts\Activate.ps1
Install dependencies.
Apple Silicon (macOS):
pip install -U fastembed onnxruntime-silicon chromadb pypdf pymupdf markdown filelock flask flask-cors
Linux/Windows:
pip install -U fastembed onnxruntime chromadb pypdf pymupdf markdown filelock flask flask-cors
Install and start Ollama; pull a local model.
macOS (example):
brew install ollama
ollama serve &
ollama pull qwen2.5:7b-instruct
Confirm paths.
rag_mini.py uses a folder named “materialmind” next to the script:
BASE_DIR = Path(file).resolve().parent / "materialmind"
Ensure the folder exists:
materialmind/sources (create this and drop PDFs here)
Add your PDFs
Drop research papers, standards, reports, and textbooks into:
materialmind/sources
Tips:
• Prefer publisher PDFs (selectable text).
• If a PDF is scanned (no text), OCR it:
ocrmypdf input.pdf output_ocr.pdf
then place output_ocr.pdf in materialmind/sources
Build or update the index
First time (full index):
python rag_mini.py --rebuild
Later (only changed/new PDFs):
python rag_mini.py --update
Optional backup:
python rag_mini.py --backup
Optional export to JSONL (for inspection):
python rag_mini.py --export-json ./materialmind_dump.jsonl
Quick retrieval check (no model required)
Example:
python rag_mini.py --ask "Which alloys resist pitting in seawater better than 316L?"
You will see top-k snippets with file:page citations from your PDFs.
Run the UI
Start the Flask app:
python app_user.py
Open:
http://127.0.0.1:5000/
Usage:
• Fill environment/temperature/constraints.
• Set weights as percentages (e.g., 40/30/20/10) or fractions (0.4/0.3/0.2/0.1). The form enables the button only when the sum equals 100% (or 1.0).
• Click “Get ranked shortlist” to see the ranked table, material cards, and page-level citations.
How it works
• Retrieval: FastEmbed (ONNX) creates embeddings; Chroma stores and retrieves chunks with file + page metadata.
• Decision layer: your constraints and weights guide the model to produce a structured shortlist JSON (name, score, reasons, trade-offs, citations).
• Local LLM: by default qwen2.5:7b-instruct via Ollama; you can swap models freely.
CLI reference (rag_mini.py)
--rebuild rebuild the entire index from PDFs in materialmind/sources
--update incremental index of only changed/new PDFs
--backup copy the current index to a timestamped folder
--export-json PATH dump records to JSONL (optional)
--ask "question" retrieval only with citations
--answer "question" --model NAME --k N --show
retrieval plus local LLM answer (Ollama required)
Customization
Change model (Ollama):
ollama pull mistral:7b-instruct
then set “Model” in the UI to mistral:7b-instruct
Tune retrieval (rag_mini.py):
CHUNK_CHARS, CHUNK_OVERLAP, DEFAULT_TOPK
Swap embedding model (rag_mini.py):
EMB_MODEL = "BAAI/bge-small-en-v1.5" (good default). Other FastEmbed models also work.
Theme colors:
Edit CSS variables in static/styles.css (:root { … }).
Troubleshooting
“Get ranked shortlist” button disabled:
Enter weights as 40/30/20/10 or 0.4/0.3/0.2/0.1 until the sum reads 100%.
Ollama not found / model errors:
Install/start/pull as above. Retrieval still works without Ollama; only model-generated answers require it.
Chroma lock / mutex errors:
Close other processes using the index. If stuck:
python rag_mini.py --backup
rm -rf materialmind/index/chroma_v3
python rag_mini.py --rebuild
No text in a PDF:
OCR it with ocrmypdf, then re-index.
Port already in use:
Change the host/port in app_user.py.
Privacy
Everything runs locally by default. Your PDFs are indexed on disk and never uploaded. Remove PDFs from materialmind/sources and run --update to de-index.
Roadmap
Team/on-prem sharing, rule/property packs (e.g., PREN/oxidation windows/standards checks), uploads & tagging UI, LoRA adapter for stricter JSON, evaluation harness for grounding and JSON validity.
License
MIT (or your chosen permissive license). Add a LICENSE file to the repository.
One-minute demo
Drop a few corrosion or seawater PDFs into materialmind/sources.
Build: python rag_mini.py --rebuild
Run UI: python app_user.py
Query seawater at 20–25 °C, UTS ≥ 600 MPa, weights 50/30/10/10.
Show ranked shortlist, open a citation (file:page).
Add another PDF, run --update, rerun the query, and show the new citation.