File size: 9,310 Bytes
ac28b61
 
 
 
 
 
aadc235
 
 
 
ac28b61
 
 
185459e
6c24ba1
 
1c1cc62
 
 
 
 
 
ac28b61
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
aadc235
ac28b61
 
 
 
 
 
 
 
 
 
 
 
 
aadc235
ac28b61
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
031a2c1
ac28b61
031a2c1
ac28b61
031a2c1
ac28b61
031a2c1
ac28b61
031a2c1
ac28b61
031a2c1
ac28b61
031a2c1
ac28b61
031a2c1
ac28b61
031a2c1
ac28b61
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
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

# Load an embedding model
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)

    # Calculate overall scores
    scores["relevance"] = np.mean(scores["relevance"])
    scores["completeness"] = len(all_found_keywords) / len(keywords)
    scores["depth"] = np.mean(scores["depth"])

    # Regional completeness: Check for region-specific keyword coverage
    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

# Streamlit UI
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")

# Input for Wikipedia links
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 = []

    # Fetch and process content from each URL
    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)

         # Display scores and explanations
        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.")

        # Detailed feedback
        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.")