from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS from langchain.text_splitter import RecursiveCharacterTextSplitter import streamlit as st class RAGSystem: def __init__(self): self.embeddings = HuggingFaceEmbeddings( model_name="sentence-transformers/all-mpnet-base-v2" ) self.vector_store = None self.text_splitter = RecursiveCharacterTextSplitter( chunk_size=500, chunk_overlap=50 ) def initialize_knowledge_base(self, knowledge_base): """Initialize vector store with construction knowledge""" documents = [] for damage_type, cases in knowledge_base.items(): for case in cases: doc_text = f""" Damage Type: {damage_type} Severity: {case['severity']} Description: {case['description']} Repair Methods: {', '.join(case['repair_method'])} Cost: {case['estimated_cost']} Timeframe: {case['timeframe']} Location: {case['location']} Required Expertise: {case['required_expertise']} Immediate Action: {case['immediate_action']} Prevention: {case['prevention']} """ documents.append(doc_text) splits = self.text_splitter.create_documents(documents) self.vector_store = FAISS.from_documents(splits, self.embeddings) def query_knowledge_base(self, query, k=3): """Query the vector store for relevant information""" if not self.vector_store: raise ValueError("Vector store not initialized") results = self.vector_store.similarity_search(query, k=k) return results def get_enhanced_analysis(self, damage_type, confidence, custom_query=None): """Get enhanced analysis based on damage type and confidence""" if not custom_query: query = f"What are the key considerations and recommendations for {damage_type} with {confidence}% confidence?" else: query = custom_query relevant_docs = self.query_knowledge_base(query) enhanced_info = { "technical_details": [], "safety_considerations": [], "expert_recommendations": [] } for doc in relevant_docs: content = doc.page_content if "severity" in content.lower() or "description" in content.lower(): enhanced_info["technical_details"].append(content) elif "immediate action" in content.lower() or "prevention" in content.lower(): enhanced_info["safety_considerations"].append(content) elif "repair" in content.lower() or "expertise" in content.lower(): enhanced_info["expert_recommendations"].append(content) return enhanced_info