Sfoglia il codice sorgente

transport_context parsimise täiendus

Ardo Kubjas 3 mesi fa
parent
commit
8742af95ff
2 ha cambiato i file con 92 aggiunte e 12 eliminazioni
  1. 69 10
      src/deepseek_client.py
  2. 23 2
      src/weaviate_client.py

+ 69 - 10
src/deepseek_client.py

@@ -163,7 +163,7 @@ Palun tuvasta kasutatud meetodid. Tagasta VAID komadega eraldatud nimekiri.
         
         methods = [m.strip() for m in response.split(',') if m.strip()]
         return methods
-    
+
     def analyze_transport_context(self, summary: str) -> Dict:
         """Analüüsi artikli tähtsus transpordiplaneerimise kontekstis"""
         self.logger.info("Analüüsin transpordi konteksti...")
@@ -176,6 +176,21 @@ Hinda järgmisi aspekte:
 2. Praktiline rakendatavus
 3. Reaalsete probleemide lahendamine
 4. Piirangud ja edasised vajadused
+
+**OLULINE JUHIS:**
+1. Kasuta JSON struktuuri jaoks ALATI topeltjutumärke (") nagu JSON standard nõuab
+2. Kasuta stringide SISU jaoks ÜHEKORDSEID jutumärke (') kui vaja jutumärke kasutada
+3. Ära kasuta stringide sees topeltjutumärke, sest need segavad JSON parsingut
+4. Ära kasuta JSON stringi sees teist JSON struktuuri
+
+Näide õigest kasutamisest:
+{
+"theoretical_contribution": "Autor toob välja, et formaalsed meetodid kannavad analüütikute 'väärtushinnanguid'",
+"practical_applicability": "Rakendatav 'reisiplaneerimise' kontekstis",
+"problem_solving": "Lahendab 'kompleksseid' probleeme",
+"limitations": "Piiratud 'andmete' kvaliteediga",
+"relevance_score": 8
+}
 """
         
         user_prompt = f"""Artikli kokkuvõte:
@@ -183,12 +198,14 @@ Hinda järgmisi aspekte:
 
 Palun analüüsi artikli tähtsust transpordiplaneerimise kontekstis. Tagasta JSON formaadis:
 {{
-  "theoretical_contribution": "lühikirjeldus",
-  "practical_applicability": "lühikirjeldus",
-  "problem_solving": "lühikirjeldus",
-  "limitations": "lühikirjeldus",
-  "relevance_score": 1-10 (kus 10 on kõige relevantsem)
+"theoretical_contribution": "lühikirjeldus",
+"practical_applicability": "lühikirjeldus", 
+"problem_solving": "lühikirjeldus",
+"limitations": "lühikirjeldus",
+"relevance_score": 1-10 (kus 10 on kõige relevantsem)
 }}
+
+**MEELDEJÄÄVUS:** Kasuta stringide sees ühekordseid jutumärke ('), mitte topeltjutumärke (").
 """
         
         messages = [
@@ -199,14 +216,56 @@ Palun analüüsi artikli tähtsust transpordiplaneerimise kontekstis. Tagasta JS
         response = self.call_api(messages, temperature=0.5)
         
         try:
+            # Puhasta vastus enne JSON parsingut
+            # Eemalda koodibloki markerid
+            response = response.replace('```json', '').replace('```', '').strip()
+            
             # Proovi parsida JSON vastust
             if response.startswith('{') and response.endswith('}'):
-                return json.loads(response)
-        except:
-            pass
+                # Asenda stringide sees olevad topeltjutumärgid ühekordsetega
+                # See lihtsustab hilisemat parsingut
+                cleaned_response = self._clean_json_response(response)
+                return json.loads(cleaned_response)
+        except Exception as e:
+            self.logger.warning(f"JSON parsimine ebaõnnestus, kasutan tekstina: {str(e)}")
         
         # Kui JSON parsimine ei õnnestu, tagasta struktureeritud tekst
         return {
             "analysis": response,
             "relevance_score": 5  # Vaikimisi skoor
-        }
+        }
+
+    def _clean_json_response(self, json_str: str) -> str:
+        """Puhasta JSON vastus, et vältida escape probleeme"""
+        try:
+            # Esmalt proovi parsida otse
+            parsed = json.loads(json_str)
+            # Serializeeri tagasi, asendades stringide sees olevad jutumärgid
+            return json.dumps(parsed, ensure_ascii=False)
+        except json.JSONDecodeError:
+            # Kui ei õnnestu, proovi käsitsi korrigeerida
+            # Asenda \" -> " (eemalda escape'd)
+            json_str = json_str.replace('\\"', '"')
+            # Proovi uuesti
+            try:
+                parsed = json.loads(json_str)
+                return json.dumps(parsed, ensure_ascii=False)
+            except:
+                # Kui ikka ei tööta, tagasta originaal (või puhasta rohkem)
+                return json_str
+
+    def encode_string_for_weaviate(self, text: str) -> str:
+        """Kodeeri string Weaviate'i jaoks, et vältida JSON probleeme"""
+        if not isinstance(text, str):
+            text = str(text)
+        
+        # Asenda stringi sees olevad topeltjutumärgid ühekordsetega
+        text = text.replace('"', "'")
+        
+        # Asenda \\" -> ' (eemalda double escape)
+        text = text.replace('\\"', "'")
+        
+        # Asenda liigsed tühikud
+        text = ' '.join(text.split())
+        
+        return text

+ 23 - 2
src/weaviate_client.py

@@ -260,6 +260,27 @@ class WeaviateClient:
                 self.logger.info(f"Artikkel {article_id} on juba olemas, jätan vahele")
                 return False
             
+            # Puhasta transport_context enne salvestamist
+            transport_context = article_data.get('transport_context', {})
+            
+            # Kui on dict, puhasta kõik stringiväljad
+            if isinstance(transport_context, dict):
+                cleaned_context = {}
+                for key, value in transport_context.items():
+                    if isinstance(value, str):
+                        # Asenda stringi sees olevad topeltjutumärgid
+                        cleaned_value = value.replace('"', "'")
+                        cleaned_value = cleaned_value.replace('\\"', "'")
+                        cleaned_context[key] = cleaned_value
+                    else:
+                        cleaned_context[key] = value
+                transport_context_str = json.dumps(cleaned_context, ensure_ascii=False)
+            else:
+                # Kui on string, puhasta see
+                transport_context_str = str(transport_context)
+                transport_context_str = transport_context_str.replace('\\"', "'")
+                transport_context_str = transport_context_str.replace('"', "'")
+            
             # Valmistame andmed ette
             properties = {
                 "article_id": article_id,
@@ -272,7 +293,7 @@ class WeaviateClient:
                 "summary_et": article_data.get('summary_et', ''),
                 "key_concepts": article_data.get('key_concepts', []),
                 "methods_used": article_data.get('methods_used', []),
-                "transport_context": json.dumps(article_data.get('transport_context', {}), ensure_ascii=False),
+                "transport_context": transport_context_str,  # Kasuta puhastatud stringi
                 "relevance_score": article_data.get('relevance_score', 5),
                 "processing_date": article_data.get('processing_date', ''),
                 "source_file": article_data.get('source_file', ''),
@@ -297,7 +318,7 @@ class WeaviateClient:
         except Exception as e:
             self.logger.error(f"Viga artikli salvestamisel: {str(e)}")
             return False
-    
+
     def search_articles(self, query: str, limit: int = 10) -> List[Dict]:
         """Otsi artikleid"""
         try: