Anpassung Verify Wiki Article
This commit is contained in:
105
helpers.py
105
helpers.py
@@ -812,6 +812,32 @@ def summarize_website_content(raw_text):
|
|||||||
logger.error(f"FEHLER bei Website Zusammenfassung nach Retries: {e}")
|
logger.error(f"FEHLER bei Website Zusammenfassung nach Retries: {e}")
|
||||||
return f"k.A. (Fehler Zusammenfassung: {str(e)[:50]}...)"
|
return f"k.A. (Fehler Zusammenfassung: {str(e)[:50]}...)"
|
||||||
|
|
||||||
|
@retry_on_failure
|
||||||
|
def summarize_wikipedia_article(full_text, company_name):
|
||||||
|
"""
|
||||||
|
Fasst den Rohtext eines Wikipedia-Artikels gezielt für den Geschäftskontext zusammen.
|
||||||
|
"""
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
if not full_text or len(full_text) < 100:
|
||||||
|
logger.debug("Wikipedia-Rohtext zu kurz für eine Zusammenfassung.")
|
||||||
|
return "k.A. (Text zu kurz)"
|
||||||
|
|
||||||
|
prompt = (
|
||||||
|
f"Du bist ein Wirtschaftsanalyst. Fasse den folgenden Wikipedia-Artikel über das Umfeld des Unternehmens '{company_name}' zusammen.\n"
|
||||||
|
"Fokus: Geschäftsmodell, Hauptprodukte, bediente Märkte und die jüngere Unternehmensgeschichte.\n"
|
||||||
|
"Erstelle eine prägnante Zusammenfassung von maximal 150 Wörtern, die die Kernaussagen auf den Punkt bringt.\n\n"
|
||||||
|
"--- Artikeltext ---\n"
|
||||||
|
f"{full_text[:8000]}\n" # Begrenzung auf ca. 8k Zeichen zur Kostenkontrolle
|
||||||
|
"--- Zusammenfassung ---"
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
summary = call_openai_chat(prompt, temperature=0.3, model="gpt-4o-mini")
|
||||||
|
return summary if summary else "k.A. (Zusammenfassung fehlgeschlagen)"
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Fehler bei der Wikipedia-Zusammenfassung für {company_name}: {e}")
|
||||||
|
return "FEHLER (API-Fehler bei Zusammenfassung)"
|
||||||
|
|
||||||
|
|
||||||
@retry_on_failure
|
@retry_on_failure
|
||||||
def summarize_batch_openai(tasks_data):
|
def summarize_batch_openai(tasks_data):
|
||||||
@@ -1000,55 +1026,56 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg
|
|||||||
|
|
||||||
|
|
||||||
@retry_on_failure
|
@retry_on_failure
|
||||||
def verify_wiki_article_chatgpt(company_name, website, wiki_url):
|
def verify_wiki_article_chatgpt(company_name, parent_name, website, wiki_title, wiki_summary):
|
||||||
|
"""
|
||||||
|
Verifiziert faktenbasiert, ob ein Wikipedia-Artikel zum Unternehmen passt,
|
||||||
|
indem der notwendige Kontext direkt im Prompt mitgeliefert wird.
|
||||||
|
"""
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
logger.info(f"Starte ChatGPT-Verifizierung für '{company_name}' und URL '{wiki_url[:50]}'...")
|
logger.info(f"Starte kontextbasierte KI-Verifizierung für '{company_name}'...")
|
||||||
|
|
||||||
|
prompt_template = """
|
||||||
prompt = """Aufgabe: Bewerte als erfahrener Datenanalyst, ob der Wikipedia-Artikel die relevanteste verfügbare Seite für das angegebene Unternehmen ist.
|
Aufgabe: Bewerte als erfahrener Datenanalyst, ob der Wikipedia-Artikel die relevanteste Seite für das angegebene Unternehmen ist.
|
||||||
|
|
||||||
Deine Bewertungsregeln:
|
Deine Bewertungsregeln:
|
||||||
1. Muttergesellschaft ist OK: Der Artikel darf auch die Muttergesellschaft beschreiben (z.B. für "ABB Automation GmbH" ist der Artikel "ABB (Unternehmen)" korrekt).
|
1. **Muttergesellschaft prüfen:** Wird der Name des Zielunternehmens oder des Mutterkonzerns im Titel oder in der Zusammenfassung erwähnt? Das ist ein sehr starkes positives Signal.
|
||||||
2. Rechtsform ist sekundär: Ignoriere kleine Abweichungen im NAmen, insbesondere fehlende REchtsformen wie "GmbH", "AG" etc. (z.B. für "1&1 Versatel GmbH" ist der Artikel "1&1 Versatel" korrekt).
|
2. **Inhalt prüfen:** Vergleiche den Geschäftszweck aus der Artikel-Zusammenfassung mit der Website. Gibt es eine plausible Übereinstimmung?
|
||||||
3. Inhalt zählt: Prüfe, ob die Website des Unternehmens im Artikel erwähnt wird oder ob der beschriebene Geschäftszweck übereinstimmt. Das ist wichtiger als der exakte Name.
|
3. **Irrelevanz erkennen:** Ist der Artikel über etwas völlig anderes (z.B. eine Stadt, eine Person, ein allgemeines Konzept)? Dann ist er falsch.
|
||||||
|
|
||||||
Unternehmen:
|
--- Unternehmensdaten ---
|
||||||
Name: {company_name}
|
Name des Zielunternehmens: {company_name}
|
||||||
Website: {website}
|
Website des Zielunternehmens: {website}
|
||||||
|
Mutterkonzern (falls bekannt): {parent_name}
|
||||||
|
|
||||||
Vorgegebener Wikipedia-Artikel:
|
--- Vorgegebener Wikipedia-Artikel ---
|
||||||
Artikel: {wiki_url}
|
Titel: {wiki_title}
|
||||||
|
Zusammenfassung: {wiki_summary}
|
||||||
|
|
||||||
Antwortformat:
|
--- Antwortformat (strikt einhalten!) ---
|
||||||
Konsistenz: <OK, wenn relevant, sonst X>
|
Konsistenz: <OK oder X>
|
||||||
Begründung: <Sehr kurze Begründung. Welche Regel traf zu?>
|
Begründung: <Sehr kurze Begründung. Welche Regel traf zu?>
|
||||||
Vorschlag URL: <Bessere URL oder leer>
|
"""
|
||||||
""".strip()
|
prompt = prompt_template.format(
|
||||||
|
company_name=company_name,
|
||||||
|
website=website,
|
||||||
|
parent_name=parent_name if parent_name else "Nicht bekannt",
|
||||||
|
wiki_title=wiki_title,
|
||||||
|
wiki_summary=wiki_summary[:1500]
|
||||||
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
chat_response = call_openai_chat(prompt, temperature=0.0)
|
response = call_openai_chat(prompt, temperature=0.0, model="gpt-4o-mini")
|
||||||
if not chat_response:
|
lines = response.strip().lower().split('\n')
|
||||||
raise APIError("Keine Antwort von OpenAI für Wiki-Verifizierung erhalten.")
|
result = {'consistency': 'X', 'justification': 'Fehler: KI-Antwort unvollständig'}
|
||||||
|
for line in lines:
|
||||||
|
if line.startswith('konsistenz:'):
|
||||||
# Robustes Parsing
|
result['consistency'] = line.split(':', 1)[1].strip().upper()
|
||||||
parsed = {"consistency": "FEHLER PARSING", "justification": "", "suggested_url": ""}
|
elif line.startswith('begründung:'):
|
||||||
for line in chat_response.strip().splitlines():
|
result['justification'] = line.split(':', 1)[1].strip().capitalize()
|
||||||
if ":" in line:
|
return result
|
||||||
key, val = line.split(":", 1)
|
|
||||||
key = key.strip().lower().replace(" ", "_")
|
|
||||||
parsed[key] = val.strip()
|
|
||||||
|
|
||||||
|
|
||||||
return {
|
|
||||||
"consistency": parsed.get("konsistenz", "FEHLER PARSING").upper(),
|
|
||||||
"justification": parsed.get("begründung", ""),
|
|
||||||
"suggested_url": parsed.get("vorschlag_url", ""),
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Fehler bei der ChatGPT Wiki-Verifizierung: {e}")
|
logger.error(f"Fehler bei der Verarbeitung der ChatGPT-Antwort für Wiki-Verifizierung: {e}")
|
||||||
return {"consistency": "FEHLER API", "justification": str(e), "suggested_url": ""}
|
return {'consistency': 'X', 'justification': 'Fehler: KI-Antwort konnte nicht geparst werden'}
|
||||||
|
|
||||||
|
|
||||||
@retry_on_failure
|
@retry_on_failure
|
||||||
|
|||||||
Reference in New Issue
Block a user