|
import streamlit as st |
|
import os |
|
from groq import Groq |
|
from transformers import ViTForImageClassification, ViTImageProcessor |
|
from sentence_transformers import SentenceTransformer |
|
from PIL import Image |
|
import torch |
|
import numpy as np |
|
from typing import List, Dict |
|
import faiss |
|
import json |
|
|
|
|
|
@st.cache_resource |
|
def init_embedding_model(): |
|
return SentenceTransformer('all-MiniLM-L6-v2') |
|
|
|
|
|
@st.cache_resource |
|
def init_groq_client(): |
|
return Groq(api_key=os.environ.get("GROQ_API_KEY")) |
|
class RAGSystem: |
|
def __init__(self): |
|
self.embedding_model = init_embedding_model() |
|
self.knowledge_base = self.load_knowledge_base() |
|
self.vector_store = self.create_vector_store() |
|
|
|
def load_knowledge_base(self) -> List[Dict]: |
|
"""Load and preprocess knowledge base into a list of documents""" |
|
|
|
kb = { |
|
"spalling": [ |
|
{ |
|
"severity": "Critical", |
|
"description": "Severe concrete spalling with exposed reinforcement and section loss", |
|
"repair_method": [ |
|
"Install temporary support", |
|
"Remove deteriorated concrete", |
|
"Clean and treat reinforcement", |
|
"Apply corrosion inhibitor", |
|
"Apply bonding agent", |
|
"High-strength repair mortar", |
|
"Surface treatment and waterproofing" |
|
], |
|
"estimated_cost": "Very High ($15,000+)", |
|
"timeframe": "3-4 weeks", |
|
"location": "Primary structural elements", |
|
"required_expertise": "Structural Engineer + Specialist Contractor", |
|
"immediate_action": "Evacuate area, install temporary support, prevent access", |
|
"prevention": "Regular inspections, waterproofing, chloride protection", |
|
"testing_required": ["Core testing", "Reinforcement scanning", "Chloride testing"], |
|
"common_causes": [ |
|
"Reinforcement corrosion", |
|
"Freeze-thaw cycles", |
|
"Poor concrete cover", |
|
"Chemical attack" |
|
], |
|
"safety_considerations": [ |
|
"Risk of structural failure", |
|
"Falling concrete hazard", |
|
"Worker safety during repairs" |
|
] |
|
}, |
|
{ |
|
"severity": "Moderate", |
|
"description": "Surface spalling without exposed reinforcement", |
|
"repair_method": [ |
|
"Remove loose concrete", |
|
"Surface preparation", |
|
"Apply repair mortar", |
|
"Surface treatment" |
|
], |
|
"estimated_cost": "Medium ($5,000-$10,000)", |
|
"timeframe": "1-2 weeks", |
|
"location": "Non-structural elements", |
|
"required_expertise": "Concrete Repair Specialist", |
|
"immediate_action": "Remove loose material, protect from water ingress", |
|
"prevention": "Surface sealers, proper drainage", |
|
"testing_required": ["Surface adhesion testing", "Moisture testing"], |
|
"common_causes": [ |
|
"Surface carbonation", |
|
"Impact damage", |
|
"Poor curing" |
|
], |
|
"safety_considerations": [ |
|
"Minor falling debris risk", |
|
"Dust control during repairs" |
|
] |
|
} |
|
], |
|
"reinforcement_corrosion": [ |
|
{ |
|
"severity": "Critical", |
|
"description": "Severe corrosion with >30% section loss", |
|
"repair_method": [ |
|
"Structural support installation", |
|
"Concrete removal around reinforcement", |
|
"Reinforcement replacement", |
|
"Corrosion protection application", |
|
"High-strength concrete repair", |
|
"Cathodic protection installation" |
|
], |
|
"estimated_cost": "Critical ($20,000+)", |
|
"timeframe": "4-6 weeks", |
|
"location": "Load-bearing elements", |
|
"required_expertise": "Senior Structural Engineer", |
|
"immediate_action": "Immediate evacuation, emergency shoring", |
|
"prevention": "Waterproofing, cathodic protection", |
|
"testing_required": [ |
|
"Half-cell potential survey", |
|
"Concrete resistivity testing", |
|
"Chloride analysis", |
|
"Carbonation testing" |
|
], |
|
"common_causes": [ |
|
"Chloride contamination", |
|
"Carbonation", |
|
"Stray electrical currents", |
|
"Poor concrete quality" |
|
], |
|
"safety_considerations": [ |
|
"Structural collapse risk", |
|
"Electrical hazards during testing", |
|
"Confined space entry" |
|
] |
|
} |
|
], |
|
"structural_cracks": [ |
|
{ |
|
"severity": "High", |
|
"description": "Active structural cracks >5mm width", |
|
"repair_method": [ |
|
"Structural analysis", |
|
"Crack monitoring", |
|
"Epoxy injection", |
|
"Carbon fiber reinforcement", |
|
"Load path modification" |
|
], |
|
"estimated_cost": "High ($10,000-$20,000)", |
|
"timeframe": "2-4 weeks", |
|
"location": "Primary structural elements", |
|
"required_expertise": "Structural Engineer", |
|
"immediate_action": "Install crack monitors, restrict loading", |
|
"prevention": "Proper design, joint maintenance", |
|
"testing_required": [ |
|
"Crack movement monitoring", |
|
"Load testing", |
|
"Concrete strength testing" |
|
], |
|
"common_causes": [ |
|
"Overloading", |
|
"Foundation settlement", |
|
"Thermal movements", |
|
"Design deficiencies" |
|
], |
|
"safety_considerations": [ |
|
"Structural stability", |
|
"Water infiltration", |
|
"Working at height" |
|
] |
|
} |
|
], |
|
"water_damage": [ |
|
{ |
|
"severity": "Medium", |
|
"description": "Active water infiltration with deterioration", |
|
"repair_method": [ |
|
"Water source identification", |
|
"Drainage improvement", |
|
"Waterproofing membrane installation", |
|
"Joint sealing", |
|
"Surface treatment" |
|
], |
|
"estimated_cost": "Medium ($5,000-$15,000)", |
|
"timeframe": "1-3 weeks", |
|
"location": "Various locations", |
|
"required_expertise": "Waterproofing Specialist", |
|
"immediate_action": "Water diversion, dehumidification", |
|
"prevention": "Regular maintenance, proper drainage", |
|
"testing_required": [ |
|
"Moisture mapping", |
|
"Drainage assessment", |
|
"Permeability testing" |
|
], |
|
"common_causes": [ |
|
"Failed waterproofing", |
|
"Poor drainage", |
|
"Joint failure", |
|
"Condensation" |
|
], |
|
"safety_considerations": [ |
|
"Slip hazards", |
|
"Electrical safety", |
|
"Mold growth" |
|
] |
|
} |
|
], |
|
"surface_deterioration": [ |
|
{ |
|
"severity": "Low", |
|
"description": "Surface scaling and deterioration", |
|
"repair_method": [ |
|
"Surface cleaning", |
|
"Repair material application", |
|
"Surface treatment", |
|
"Protective coating" |
|
], |
|
"estimated_cost": "Low ($2,000-$5,000)", |
|
"timeframe": "3-5 days", |
|
"location": "Exposed surfaces", |
|
"required_expertise": "Concrete Repair Technician", |
|
"immediate_action": "Clean and protect surface", |
|
"prevention": "Regular maintenance, surface protection", |
|
"testing_required": [ |
|
"Surface strength testing", |
|
"Coating adhesion tests" |
|
], |
|
"common_causes": [ |
|
"Freeze-thaw damage", |
|
"Chemical exposure", |
|
"Poor finishing", |
|
"Abrasion" |
|
], |
|
"safety_considerations": [ |
|
"Dust control", |
|
"Chemical handling", |
|
"PPE requirements" |
|
] |
|
} |
|
], |
|
"alkali_silica_reaction": [ |
|
{ |
|
"severity": "High", |
|
"description": "Concrete expansion and map cracking due to ASR", |
|
"repair_method": [ |
|
"Expansion monitoring", |
|
"Moisture control", |
|
"Crack sealing", |
|
"Surface treatment", |
|
"Structural strengthening" |
|
], |
|
"estimated_cost": "High ($15,000-$25,000)", |
|
"timeframe": "3-5 weeks", |
|
"location": "Concrete elements", |
|
"required_expertise": "Materials Engineer + Structural Engineer", |
|
"immediate_action": "Monitor expansion, control moisture", |
|
"prevention": "Proper aggregate selection, pozzolans", |
|
"testing_required": [ |
|
"Petrographic analysis", |
|
"Expansion testing", |
|
"Humidity monitoring" |
|
], |
|
"common_causes": [ |
|
"Reactive aggregates", |
|
"High alkali cement", |
|
"Moisture presence", |
|
"Temperature cycles" |
|
], |
|
"safety_considerations": [ |
|
"Progressive deterioration", |
|
"Structural integrity", |
|
"Long-term monitoring" |
|
] |
|
} |
|
] |
|
} |
|
|
|
|
|
documents = [] |
|
for category, items in kb.items(): |
|
for item in items: |
|
|
|
doc_text = f"Category: {category}\n" |
|
for key, value in item.items(): |
|
if isinstance(value, list): |
|
doc_text += f"{key}: {', '.join(value)}\n" |
|
else: |
|
doc_text += f"{key}: {value}\n" |
|
documents.append({ |
|
"text": doc_text, |
|
"metadata": {"category": category} |
|
}) |
|
|
|
return documents |
|
|
|
def create_vector_store(self): |
|
"""Create FAISS vector store from knowledge base""" |
|
|
|
texts = [doc["text"] for doc in self.knowledge_base] |
|
embeddings = self.embedding_model.encode(texts) |
|
|
|
|
|
dimension = embeddings.shape[1] |
|
index = faiss.IndexFlatL2(dimension) |
|
index.add(np.array(embeddings).astype('float32')) |
|
|
|
return index |
|
|
|
def create_vector_store(self): |
|
"""Create FAISS vector store from knowledge base""" |
|
|
|
texts = [doc["text"] for doc in self.knowledge_base] |
|
embeddings = self.embedding_model.encode(texts) |
|
|
|
|
|
dimension = embeddings.shape[1] |
|
index = faiss.IndexFlatL2(dimension) |
|
index.add(np.array(embeddings).astype('float32')) |
|
|
|
return index |
|
|
|
def get_relevant_context(self, query: str, k: int = 3) -> str: |
|
"""Retrieve relevant context based on query""" |
|
|
|
query_embedding = self.embedding_model.encode([query]) |
|
|
|
|
|
D, I = self.vector_store.search(np.array(query_embedding).astype('float32'), k) |
|
|
|
|
|
context = "\n\n".join([self.knowledge_base[i]["text"] for i in I[0]]) |
|
return context |
|
|
|
def get_groq_response(query: str, context: str) -> str: |
|
"""Get response from Groq LLM""" |
|
client = init_groq_client() |
|
try: |
|
prompt = f"""Based on the following context about construction defects, please answer the question. |
|
Context: |
|
{context} |
|
Question: {query} |
|
Please provide a detailed and specific answer based on the given context.""" |
|
|
|
response = client.chat.completions.create( |
|
messages=[ |
|
{ |
|
"role": "system", |
|
"content": "You are a construction defect analysis expert. Provide detailed, accurate answers based on the given context." |
|
}, |
|
{ |
|
"role": "user", |
|
"content": prompt |
|
} |
|
], |
|
model="llama-3.3-70b-versatile", |
|
) |
|
return response.choices[0].message.content |
|
except Exception as e: |
|
return f"Error: {str(e)}" |
|
|
|
ef main(): |
|
st.set_page_config( |
|
page_title="Construction Defect RAG Analyzer", |
|
page_icon="🏗️", |
|
layout="wide" |
|
) |
|
|
|
st.title("🏗️ Construction Defect RAG Analyzer") |
|
|
|
|
|
if 'rag_system' not in st.session_state: |
|
st.session_state.rag_system = RAGSystem() |
|
|
|
|
|
uploaded_file = st.file_uploader( |
|
"Upload a construction image", |
|
type=['jpg', 'jpeg', 'png'] |
|
) |
|
|
|
|
|
user_query = st.text_input("Ask a question about construction defects:") |
|
|
|
if user_query: |
|
with st.spinner("Processing query..."): |
|
|
|
context = st.session_state.rag_system.get_relevant_context(user_query) |
|
|
|
|
|
if st.checkbox("Show retrieved context"): |
|
st.subheader("Retrieved Context") |
|
st.text(context) |
|
|
|
|
|
st.subheader("AI Assistant Response") |
|
response = get_groq_response(user_query, context) |
|
st.write(response) |
|
|
|
if uploaded_file: |
|
image = Image.open(uploaded_file) |
|
st.image(image, caption="Uploaded Image") |
|
|
|
|
|
col1, col2 = st.columns(2) |
|
|
|
with col1: |
|
st.subheader("Image Analysis") |
|
|
|
st.info("Image analysis results would appear here") |
|
|
|
with col2: |
|
st.subheader("AI Assistant Response") |
|
if user_query: |
|
|
|
context = st.session_state.rag_system.get_relevant_context(user_query) |
|
|
|
|
|
with st.spinner("Getting AI response..."): |
|
response = get_groq_response(user_query, context) |
|
st.write(response) |
|
|
|
|
|
if st.checkbox("Show Knowledge Base"): |
|
st.subheader("Available Knowledge Base") |
|
kb_data = st.session_state.rag_system.knowledge_base |
|
for doc in kb_data: |
|
category = doc["metadata"]["category"] |
|
with st.expander(category.title()): |
|
st.text(doc["text"]) |
|
|
|
if __name__ == "__main__": |
|
main() |