|
import streamlit as st |
|
import requests |
|
from bs4 import BeautifulSoup |
|
from sentence_transformers import SentenceTransformer, util |
|
from itertools import combinations |
|
import numpy as np |
|
import torch |
|
import json |
|
import os |
|
import sys |
|
|
|
|
|
model = SentenceTransformer('mixedbread-ai/deepset-mxbai-embed-de-large-v1') |
|
ideal_embedding = torch.load("ideal_embedding.pt", weights_only=True, map_location=torch.device("cpu")) |
|
keywords = json.loads(os.getenv('KEYWORDS')) |
|
region_keywords = json.loads(os.getenv('REGION_KEYWORDS')) |
|
max_relevance = float(os.getenv("MAX_RELEVANCE")) |
|
min_relevance = float(os.getenv("MIN_RELEVANCE")) |
|
max_completeness = float(os.getenv("MAX_COMPLETENESS")) |
|
min_completeness = float(os.getenv("MIN_COMPLETENESS")) |
|
max_regional_completeness = float(os.getenv("MAX_REGIONAL_COMPLETENESS")) |
|
min_regional_completeness = float(os.getenv("MIN_REGIONAL_COMPLETENESS")) |
|
|
|
def fetch_wikipedia_content(url): |
|
try: |
|
response = requests.get(url) |
|
soup = BeautifulSoup(response.text, 'html.parser') |
|
paragraphs = soup.find_all('p') |
|
content = ' '.join([para.text for para in paragraphs]) |
|
return content |
|
except Exception as e: |
|
st.error(f"Error fetching article: {e}") |
|
return None |
|
|
|
def evaluate_contexts(student_texts): |
|
scores = {"relevance": [], "completeness": 0, "depth": [], "regional_completeness": None} |
|
|
|
all_found_keywords = set() |
|
regional_keyword_coverage = {region: 0 for region in region_keywords} |
|
combined_text = " ".join(student_texts) |
|
|
|
for text in student_texts: |
|
student_embedding = model.encode(text, convert_to_tensor=True) |
|
relevance_score = util.cos_sim(student_embedding, ideal_embedding).item() |
|
scores["relevance"].append(relevance_score) |
|
|
|
found_keywords = [keyword for keyword in keywords if keyword in text] |
|
unique_keyword_count = len(set(found_keywords)) |
|
all_found_keywords.update(found_keywords) |
|
|
|
|
|
scores["relevance"] = np.mean(scores["relevance"]) |
|
scores["completeness"] = len(all_found_keywords) / len(keywords) |
|
scores["depth"] = np.mean(scores["depth"]) |
|
|
|
|
|
for region, words in region_keywords.items(): |
|
regional_coverage = sum(1 for keyword in words if keyword in combined_text) / len(words) |
|
regional_keyword_coverage[region] = regional_coverage |
|
|
|
total_regional_keywords_found = sum(1 for region in region_keywords if any(keyword in combined_text for keyword in region_keywords[region])) |
|
total_regional_keywords = sum(len(words) for words in region_keywords.values()) |
|
|
|
scores["regional_completeness"] = np.mean(list(regional_keyword_coverage.values())) |
|
|
|
return scores |
|
|
|
|
|
st.title("🎄 Weihnachts-Traditionen: Kontextbewertung für KI") |
|
|
|
st.markdown(""" |
|
<style> |
|
.description-section { |
|
padding: 20px; |
|
border-radius: 5px; |
|
} |
|
</style> |
|
""", unsafe_allow_html=True) |
|
|
|
st.markdown( |
|
""" |
|
<div class="description-section"> |
|
<h2>📝 Hintergrund</h2> |
|
<p>In dieser Übung lernst du, wie du Informationen effektiv auswählst und auswertest, um eine abgerundete Antwort für ein KI-Modell zu erstellen. |
|
Diese Aufgabe hilft dir, die wichtigsten Informationsquellen zu einem Thema zu finden, und vertieft dein Verständnis dafür, wie du einer KI einen Kontext geben kannst, um bessere und relevantere Antworten zu erhalten.</p> |
|
|
|
<h3>🎄 Der Kontext der Weihnachtsfrage:</h3> |
|
<p>Weihnachten wird in Deutschland mit vielen Traditionen gefeiert, von denen einige allgemein bekannt und andere regionalspezifisch sind. |
|
Indem du recherchierst und relevante Inhalte auswählst, hilfst du der KI, eine Antwort zu formulieren, die den Charakter und die Vielfalt von Weihnachten in Deutschland einfängt.</p> |
|
|
|
<h3>🎯 Ziel der Aufgabe:</h3> |
|
<p>Die Aufgabe besteht darin, verschiedene Suchstrategien auszuprobieren und Links zu Wikipedia-Artikeln zu sammeln, die die folgende Frage optimal beantworten:</p> |
|
<blockquote><strong>„Welche unterschiedlichen Bräuche, Symbole und Traditionen prägen das Weihnachtsfest in Deutschland, und welche regionalen Unterschiede gibt es dabei?“</strong></blockquote> |
|
|
|
<h3>🔍 Schritt-für-Schritt-Anleitung:</h3> |
|
<ol> |
|
<li>Beginne mit einer einfachen Suchanfrage auf <a href="https://de.wikipedia.org">Wikipedia</a> (z.B. Weihnachten).</li> |
|
<li>Um spezifischere Artikel zu finden, nutze präzise Suchtechniken wie: |
|
<ul> |
|
<li><strong>Schlüsselwörter:</strong> Mach die Suchanfrage spezifischer oder allgemeiner.</li> |
|
<li><strong>Exakte Übereinstimmungen:</strong> Nutze Anführungszeichen für exakte Phrasen (z.B. „Weihnachtsbräuche in Norddeutschand“).</li> |
|
<li><strong>Textsuche:</strong> Suche nach Artikeln, die den Begriff im Text enthalten (z.B. intext: Weihnachten).</li> |
|
<li><strong>Artikelanzahl begrenzen:</strong> Konzentriere dich auf die besten Ergebnisse.</li> |
|
</ul> |
|
</li> |
|
</ol> |
|
|
|
<h3>📋 Kriterien für die Bewertung:</h3> |
|
<p>Nachdem du bis zu 8 Wikipedia-Links eingegeben hast, wird die Anwendung die Artikel anhand dieser Kriterien bewerten:</p> |
|
<ul> |
|
<li><strong>Relevanz:</strong> Passt der Artikelinhalt gut zur Frage?</li> |
|
<li><strong>Vollständigkeit:</strong> Werden alle wichtigen Begriffe erwähnt?</li> |
|
<li><strong>Regionale Abdeckung:</strong> Werden regionale Unterschiede beschrieben?</li> |
|
</ul> |
|
|
|
<h3>🎓 Warum ist dies wichtig?</h3> |
|
<p>Diese Aufgabe veranschaulicht, wie du eine künstliche Intelligenz unterstützen kannst, indem du sorgfältig ausgewählte Informationen bereitstellst, um eine detaillierte Antwort zu erstellen. |
|
Du erfährst auch, wie Weihnachten in Deutschland gefeiert wird und bekommst einen Einblick in die einzigartigen regionalen Bräuche. |
|
Die Auswahl der passenden Quellen ist wichtig, um sich ein vollständiges und genaues Bild von einem Thema zu machen.</p> |
|
</div> |
|
""", |
|
unsafe_allow_html=True |
|
) |
|
|
|
st.write("---") |
|
st.subheader("🔗 Gib die Artikel-Links ein") |
|
|
|
|
|
num_links = st.number_input("Wie viele Artikel willst du eingeben? (1-8)", min_value=1, max_value=8, value=1) |
|
urls = [] |
|
for i in range(num_links): |
|
url = st.text_input(f"Link zu Artikel {i + 1}", placeholder="Wikipedia URL") |
|
urls.append(url) |
|
|
|
if st.button("Bewertung durchführen"): |
|
student_texts = [] |
|
|
|
|
|
for url in urls: |
|
if url: |
|
content = fetch_wikipedia_content(url) |
|
if content: |
|
student_texts.append(content) |
|
|
|
if len(student_texts) >= 1: |
|
scores = evaluate_contexts(student_texts) |
|
|
|
|
|
st.write("---") |
|
st.subheader("📊 Bewertungsergebnisse") |
|
st.write(f"**Relevanz:** {scores['relevance']:.2f} - Übereinstimmung der Inhalte mit der Fragestellung.") |
|
st.write(f"**Vollständigkeit:** {scores['completeness']:.2f} - Abdeckung aller wichtigen Schlüsselbegriffe.") |
|
st.write(f"**Regionale Abdeckung:** {scores['regional_completeness']:.2f} - Traditionen aus verschiedenen Regionen abgedeckt.") |
|
|
|
|
|
feedback = [] |
|
if scores["relevance"] > max_relevance: |
|
feedback.append("Hohe Relevanz der gefundenen Artikel") |
|
if scores["relevance"] > min_relevance and scores["relevance"] <= max_relevance: |
|
feedback.append("Die Relevanz der gefundenen Artikel ist bereits gut aber könnte noch verbessert werden") |
|
if scores["relevance"] <=min_relevance: |
|
feedback.append("Die Relevanz der gefundenen Artikel ist nicht hoch und muss verbessert werden.") |
|
if scores["completeness"] > max_completeness: |
|
feedback.append("Hohe Vollständigkeit der gefundenen Artikel") |
|
if scores["completeness"] > min_completeness and scores["completeness"] <= max_completeness: |
|
feedback.append("Die Vollständigkeit ist bereits hoch aber einige wichtige Begriffe fehlen noch.") |
|
if scores["completeness"] <= min_completeness: |
|
feedback.append("Die Vollständigkeit gering; wichtige Begriffe fehlen.") |
|
if scores["regional_completeness"] > max_regional_completeness: |
|
feedback.append("Regionale Unterschiede sind ausreichend abgedeckt.") |
|
if scores["regional_completeness"] > min_regional_completeness and scores["regional_completeness"] <= max_regional_completeness: |
|
feedback.append("Regionale Unterschiede sind bereits gut abgedeckt aber könntent noch verbessert werden.") |
|
if scores["regional_completeness"] <= min_regional_completeness: |
|
feedback.append("Regionale Unterschiede sind nicht ausreichend abgedeckt.") |
|
|
|
if feedback: |
|
st.write("---") |
|
st.subheader("🔍 Feedback") |
|
for item in feedback: |
|
st.write("- " + item) |
|
if scores["relevance"] > 0.8 and scores["completeness"] > 0.8 and scores["regional_completeness"] > 0.7: |
|
st.write("🎉 Die Auswahl der Artikel ist sehr gut!") |
|
else: |
|
st.error("Bitte gib einen Link zu Wikipedia-Artikeln ein.") |