Spaces:
Sleeping
Sleeping
File size: 4,145 Bytes
7fdcd7c c2295d1 5ea6795 c2295d1 5ea6795 7fdcd7c 0cd7d19 7fdcd7c 0cd7d19 7fdcd7c 0cd7d19 5ea6795 7fdcd7c 5ea6795 6141da1 c2295d1 7fdcd7c c2295d1 7fdcd7c c2295d1 6141da1 7fdcd7c 5ea6795 b365915 5ea6795 7fdcd7c c2295d1 0cd7d19 7fdcd7c 0cd7d19 7fdcd7c ff73cbe 7fdcd7c ff73cbe 7fdcd7c ff73cbe 7fdcd7c ff73cbe 7fdcd7c ff73cbe 0cd7d19 ff73cbe 0cd7d19 ff73cbe 6141da1 7fdcd7c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# app.py - FactoryRAG+: AI Assistant with Real-Time Functional Status by Role
import streamlit as st
import pandas as pd
import numpy as np
from sentence_transformers import SentenceTransformer
from transformers import pipeline
from sklearn.ensemble import IsolationForest
# Page config
st.set_page_config(page_title="FactoryRAG+ Assistant", page_icon="π§ ", layout="wide")
# Custom dark theme styling
st.markdown("""
<style>
html, body, [class*="css"] {
font-family: 'Segoe UI', sans-serif;
background-color: #0f1117;
color: #f0f0f0;
}
.stTextInput>div>div>input,
.stSelectbox>div>div>div>div {
background-color: #1a1c23;
color: #fff;
}
.stDataFrame .blank {
background-color: #0f1117 !important;
}
</style>
""", unsafe_allow_html=True)
# Header
st.markdown("""
<div style='text-align: center;'>
<h1 style='color: #58a6ff;'>π FactoryRAG+ Assistant</h1>
<p style='color: #bbb;'>AI-Powered Digital Twin | Real-Time Sensor Health</p>
<hr style='border-top: 2px solid #888;'>
</div>
""", unsafe_allow_html=True)
# Load models
EMBED_MODEL = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
GEN_MODEL = pipeline('text2text-generation', model='google/flan-t5-base')
# File upload
uploaded_file = st.sidebar.file_uploader("π Upload your sensor CSV", type=["csv"])
if uploaded_file:
df = pd.read_csv(uploaded_file)
numeric_cols = df.select_dtypes(include=np.number).columns.tolist()
st.success("β
Sensor log loaded!")
st.markdown("### π§Ύ Sensor Log Preview")
st.dataframe(df.head(), use_container_width=True)
def convert_to_chunks(df):
return [f"[Log {i}] " + ", ".join([f"{col}: {row[col]:.2f}" for col in numeric_cols]) for i, row in df.iterrows()]
if 'chunks' not in st.session_state or 'embeddings' not in st.session_state:
chunks = convert_to_chunks(df)
embeddings = EMBED_MODEL.encode(chunks)
st.session_state.chunks = chunks
st.session_state.embeddings = embeddings
# Condition status based on Isolation Forest
st.markdown("### βοΈ Equipment Condition Status")
iso = IsolationForest(contamination=0.02)
labels = iso.fit_predict(df[numeric_cols])
df['status'] = ['β No Function' if x == -1 else 'β
Functional' for x in labels]
df['maintenance'] = ['π§ Needs Maintenance' if x == -1 else 'π’ Stable' for x in labels]
st.dataframe(df[['status', 'maintenance'] + numeric_cols].head(), use_container_width=True)
# Role-based chatbot
st.markdown("### π¬ Real-Time Role-Based Chat Assistant")
roles = {
"Operator": "You are a machine operator. Check if equipment is running properly. If not, flag it immediately.",
"Maintenance": "You are a maintenance technician. Assess faulty logs and provide service insights.",
"Engineer": "You are a systems engineer. Offer data-backed advice and failure diagnostics."
}
role = st.selectbox("π· Choose your role", list(roles.keys()))
if 'chat_history' not in st.session_state:
st.session_state.chat_history = []
user_input = st.text_input("π¨οΈ Ask FactoryGPT about machine status or maintenance needs")
if user_input:
query_vec = EMBED_MODEL.encode([user_input])[0]
sims = np.dot(st.session_state.embeddings, query_vec)
top_idxs = np.argsort(sims)[-3:][::-1]
context = "\n".join([st.session_state.chunks[i] for i in top_idxs])
system_prompt = roles[role]
full_prompt = f"{system_prompt}\n\nSensor Log Context:\n{context}\n\nUser Question: {user_input}"
reply = GEN_MODEL(full_prompt, max_length=256)[0]['generated_text']
st.session_state.chat_history.append((f"π€ You ({role})", user_input))
st.session_state.chat_history.append(("π€ FactoryGPT", reply))
for speaker, msg in st.session_state.chat_history[-10:]:
st.markdown(f"<div style='margin-bottom: 10px;'><b>{speaker}:</b> {msg}</div>", unsafe_allow_html=True)
else:
st.info("π Upload a CSV file with sensor logs to begin.")
|