Update rag_utils.py
Browse files- rag_utils.py +39 -53
rag_utils.py
CHANGED
@@ -13,6 +13,7 @@ logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(
|
|
13 |
class RAGSystem:
|
14 |
def __init__(self):
|
15 |
try:
|
|
|
16 |
self.embeddings = HuggingFaceEmbeddings(
|
17 |
model_name="sentence-transformers/all-mpnet-base-v2"
|
18 |
)
|
@@ -39,34 +40,38 @@ class RAGSystem:
|
|
39 |
# Validate knowledge base
|
40 |
self._validate_knowledge_base(knowledge_base)
|
41 |
|
42 |
-
#
|
43 |
expert_insights = self._generate_expert_insights(knowledge_base)
|
44 |
case_studies = self._generate_case_studies()
|
45 |
|
46 |
for damage_type, cases in knowledge_base.items():
|
47 |
-
for case in cases:
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
|
|
|
|
|
|
|
|
70 |
|
71 |
splits = self.text_splitter.create_documents(documents)
|
72 |
self.vector_store = FAISS.from_documents(splits, self.embeddings)
|
@@ -89,10 +94,11 @@ class RAGSystem:
|
|
89 |
"""Validate the structure of the knowledge base."""
|
90 |
required_keys = ['severity', 'description', 'repair_method', 'estimated_cost', 'timeframe', 'location', 'required_expertise', 'immediate_action', 'prevention']
|
91 |
for damage_type, cases in knowledge_base.items():
|
92 |
-
for case in cases:
|
93 |
for key in required_keys:
|
94 |
if key not in case:
|
95 |
-
|
|
|
96 |
logging.info("Knowledge base validation passed.")
|
97 |
|
98 |
def _get_qa_prompt(self):
|
@@ -116,26 +122,12 @@ class RAGSystem:
|
|
116 |
input_variables=["context", "question"]
|
117 |
)
|
118 |
|
119 |
-
def _generate_expert_insights(self, knowledge_base):
|
120 |
-
"""Generate expert insights for each damage type"""
|
121 |
-
insights = {}
|
122 |
-
for damage_type in knowledge_base.keys():
|
123 |
-
insights[damage_type] = f"Expert analysis for {damage_type} including latest research findings and industry best practices."
|
124 |
-
return insights
|
125 |
-
|
126 |
-
def _generate_case_studies(self):
|
127 |
-
"""Generate relevant case studies for each damage type"""
|
128 |
-
return {
|
129 |
-
"spalling": "Case studies of successful spalling repairs in similar structures",
|
130 |
-
"reinforcement_corrosion": "Examples of corrosion mitigation in harsh environments",
|
131 |
-
"structural_crack": "Analysis of crack progression and successful interventions",
|
132 |
-
"dampness": "Case studies of effective moisture control solutions",
|
133 |
-
"no_damage": "Preventive maintenance success stories"
|
134 |
-
}
|
135 |
-
|
136 |
def get_enhanced_analysis(self, damage_type, confidence, custom_query=None):
|
137 |
"""Get enhanced analysis with dynamic content generation"""
|
138 |
try:
|
|
|
|
|
|
|
139 |
if not custom_query:
|
140 |
base_query = f"""
|
141 |
Provide a comprehensive analysis for {damage_type} damage with {confidence}% confidence level.
|
@@ -146,6 +138,9 @@ class RAGSystem:
|
|
146 |
|
147 |
# Get relevant documents
|
148 |
results = self.qa_chain.run(base_query)
|
|
|
|
|
|
|
149 |
|
150 |
# Process and categorize the response
|
151 |
enhanced_info = {
|
@@ -156,13 +151,4 @@ class RAGSystem:
|
|
156 |
return enhanced_info
|
157 |
except Exception as e:
|
158 |
logging.error(f"Failed to generate enhanced analysis: {str(e)}")
|
159 |
-
return
|
160 |
-
|
161 |
-
def _extract_technical_details(self, results, damage_type):
|
162 |
-
return [f"Detailed technical analysis for {damage_type}", results]
|
163 |
-
|
164 |
-
def _extract_safety_considerations(self, results):
|
165 |
-
return [f"Safety analysis based on current conditions", results]
|
166 |
-
|
167 |
-
def _extract_recommendations(self, results, confidence):
|
168 |
-
return [f"Prioritized recommendations based on {confidence}% confidence", results]
|
|
|
13 |
class RAGSystem:
|
14 |
def __init__(self):
|
15 |
try:
|
16 |
+
# Initialize embeddings
|
17 |
self.embeddings = HuggingFaceEmbeddings(
|
18 |
model_name="sentence-transformers/all-mpnet-base-v2"
|
19 |
)
|
|
|
40 |
# Validate knowledge base
|
41 |
self._validate_knowledge_base(knowledge_base)
|
42 |
|
43 |
+
# Generate insights and case studies
|
44 |
expert_insights = self._generate_expert_insights(knowledge_base)
|
45 |
case_studies = self._generate_case_studies()
|
46 |
|
47 |
for damage_type, cases in knowledge_base.items():
|
48 |
+
for idx, case in enumerate(cases):
|
49 |
+
try:
|
50 |
+
# Combine insights into document text
|
51 |
+
relevant_insight = expert_insights.get(damage_type, "")
|
52 |
+
relevant_cases = case_studies.get(damage_type, "")
|
53 |
+
|
54 |
+
doc_text = f"""
|
55 |
+
Damage Type: {damage_type}
|
56 |
+
Severity: {case['severity']}
|
57 |
+
Description: {case['description']}
|
58 |
+
Technical Details: {case['description']}
|
59 |
+
Expert Insight: {relevant_insight}
|
60 |
+
Case Studies: {relevant_cases}
|
61 |
+
Repair Methods: {', '.join(case['repair_method'])}
|
62 |
+
Cost Considerations: {case['estimated_cost']}
|
63 |
+
Implementation Timeline: {case['timeframe']}
|
64 |
+
Location Specifics: {case['location']}
|
65 |
+
Required Expertise Level: {case['required_expertise']}
|
66 |
+
Emergency Protocol: {case['immediate_action']}
|
67 |
+
Preventive Measures: {case['prevention']}
|
68 |
+
"""
|
69 |
+
documents.append(doc_text)
|
70 |
+
except KeyError as e:
|
71 |
+
logging.warning(f"Missing key {str(e)} in {damage_type}, case {idx + 1}. Skipping.")
|
72 |
+
|
73 |
+
if not documents:
|
74 |
+
raise ValueError("No valid documents to process.")
|
75 |
|
76 |
splits = self.text_splitter.create_documents(documents)
|
77 |
self.vector_store = FAISS.from_documents(splits, self.embeddings)
|
|
|
94 |
"""Validate the structure of the knowledge base."""
|
95 |
required_keys = ['severity', 'description', 'repair_method', 'estimated_cost', 'timeframe', 'location', 'required_expertise', 'immediate_action', 'prevention']
|
96 |
for damage_type, cases in knowledge_base.items():
|
97 |
+
for idx, case in enumerate(cases):
|
98 |
for key in required_keys:
|
99 |
if key not in case:
|
100 |
+
logging.error(f"Missing required field '{key}' in {damage_type}, case {idx + 1}")
|
101 |
+
raise ValueError(f"Missing required field '{key}' in {damage_type}, case {idx + 1}")
|
102 |
logging.info("Knowledge base validation passed.")
|
103 |
|
104 |
def _get_qa_prompt(self):
|
|
|
122 |
input_variables=["context", "question"]
|
123 |
)
|
124 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
125 |
def get_enhanced_analysis(self, damage_type, confidence, custom_query=None):
|
126 |
"""Get enhanced analysis with dynamic content generation"""
|
127 |
try:
|
128 |
+
if not self.vector_store:
|
129 |
+
raise ValueError("Vector store is not initialized.")
|
130 |
+
|
131 |
if not custom_query:
|
132 |
base_query = f"""
|
133 |
Provide a comprehensive analysis for {damage_type} damage with {confidence}% confidence level.
|
|
|
138 |
|
139 |
# Get relevant documents
|
140 |
results = self.qa_chain.run(base_query)
|
141 |
+
if not results:
|
142 |
+
logging.warning("No results returned for query.")
|
143 |
+
return {"technical_details": [], "safety_considerations": [], "expert_recommendations": []}
|
144 |
|
145 |
# Process and categorize the response
|
146 |
enhanced_info = {
|
|
|
151 |
return enhanced_info
|
152 |
except Exception as e:
|
153 |
logging.error(f"Failed to generate enhanced analysis: {str(e)}")
|
154 |
+
return {"technical_details": [], "safety_considerations": [], "expert_recommendations": []}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|