Sheller commited on
Commit
53c52df
·
verified ·
1 Parent(s): 2021762

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +228 -34
src/streamlit_app.py CHANGED
@@ -1,40 +1,234 @@
1
- import altair as alt
2
- import numpy as np
3
- import pandas as pd
4
  import streamlit as st
 
 
 
 
5
 
6
- """
7
- # Welcome to Streamlit!
8
 
9
- Edit `/streamlit_app.py` to customize this app to your heart's desire :heart:.
10
- If you have any questions, checkout our [documentation](https://docs.streamlit.io) and [community
11
- forums](https://discuss.streamlit.io).
12
 
13
- In the meantime, below is an example of what you can do with just a few lines of code:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  """
15
 
16
- num_points = st.slider("Number of points in spiral", 1, 10000, 1100)
17
- num_turns = st.slider("Number of turns in spiral", 1, 300, 31)
18
-
19
- indices = np.linspace(0, 1, num_points)
20
- theta = 2 * np.pi * num_turns * indices
21
- radius = indices
22
-
23
- x = radius * np.cos(theta)
24
- y = radius * np.sin(theta)
25
-
26
- df = pd.DataFrame({
27
- "x": x,
28
- "y": y,
29
- "idx": indices,
30
- "rand": np.random.randn(num_points),
31
- })
32
-
33
- st.altair_chart(alt.Chart(df, height=700, width=700)
34
- .mark_point(filled=True)
35
- .encode(
36
- x=alt.X("x", axis=None),
37
- y=alt.Y("y", axis=None),
38
- color=alt.Color("idx", legend=None, scale=alt.Scale()),
39
- size=alt.Size("rand", legend=None, scale=alt.Scale(range=[1, 150])),
40
- ))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import streamlit as st
2
+ import requests
3
+ from bs4 import BeautifulSoup
4
+ from sentence_transformers import SentenceTransformer, util
5
+ import numpy as np
6
 
 
 
7
 
 
 
 
8
 
9
+ # Load an embedding model
10
+ @st.cache_resource
11
+ def load_model():
12
+ return SentenceTransformer('mixedbread-ai/deepset-mxbai-embed-de-large-v1')
13
+
14
+ # Ideal answer for comparison
15
+ IDEAL_ANSWER = """
16
+ Das Weihnachtsfest in Deutschland ist geprägt von einer Vielzahl an Bräuchen, Symbolen und Traditionen, die regional unterschiedliche Ausprägungen haben.
17
+ Neben allgemeinen, landesweiten Traditionen existieren in den einzelnen Regionen eigene Bräuche, die das Weihnachtsfest besonders machen.
18
+
19
+ Allgemeine Bräuche und Symbole
20
+ Zu den bekanntesten Symbolen und Bräuchen, die landesweit verbreitet sind, zählen der Adventskranz, der Weihnachtsbaum, der Nikolaustag, der Weihnachtsmarkt sowie bestimmte kulinarische Spezialitäten.
21
+ Diese Traditionen schaffen eine festliche Atmosphäre und symbolisieren für viele Deutsche die Weihnachtszeit.
22
+
23
+ Advent und Adventskranz: Der Advent, die Vorbereitungszeit auf Weihnachten, beginnt am vierten Sonntag vor Weihnachten.
24
+ In dieser Zeit wird oft ein Adventskranz mit vier Kerzen aufgestellt, von denen jeden Sonntag eine weitere angezündet wird.
25
+ Dieser Brauch ist besonders im ganzen Land verbreitet und symbolisiert die wachsende Vorfreude auf das Fest.
26
+
27
+ Weihnachtsbaum: Der Weihnachtsbaum ist das zentrale Symbol des Weihnachtsfestes in Deutschland.
28
+ Meistens wird er am Heiligen Abend aufgestellt und mit Kerzen, Kugeln und manchmal auch selbstgebasteltem Schmuck dekoriert.
29
+ Der Brauch stammt ursprünglich aus dem Elsass und verbreitete sich im 19. Jahrhundert über ganz Deutschland.
30
+
31
+ Nikolaustag: Am 6. Dezember wird der Nikolaustag gefeiert. Kinder stellen am Abend vorher ihre Stiefel vor die Tür, die über Nacht vom „Nikolaus“ mit Süßigkeiten und kleinen Geschenken gefüllt werden.
32
+ Dieser Brauch ist in vielen Regionen verbreitet, zeigt jedoch in einigen Gebieten, besonders in Süddeutschland, Abweichungen, da dort oft der „Knecht Ruprecht“ oder „Krampus“ den Nikolaus begleitet.
33
+
34
+ Weihnachtsmärkte: Weihnachtsmärkte sind in Deutschland besonders beliebt und gehören zur Adventszeit.
35
+ Sie bieten regionale Spezialitäten, Weihnachtsdekoration und handgemachte Geschenke. Bekannte Weihnachtsmärkte gibt es in Städten wie Nürnberg, Dresden und München.
36
+ Diese Märkte variieren in ihrem Angebot und Charakter je nach Region, was besonders für Touristen attraktiv ist.
37
+
38
+ Weihnachtsessen: Traditionell wird am Heiligen Abend oft eine einfache Mahlzeit wie Kartoffelsalat mit Würstchen serviert, während das Festessen am ersten Weihnachtstag stattfindet.
39
+ Gänsebraten, Rotkohl und Klöße sind typische Speisen für das Weihnachtsessen. Auch hier gibt es regionale Unterschiede: Im Süden Deutschlands werden oft Bratwürste serviert, während im Norden Fischgerichte beliebter sind.
40
+
41
+ Regionale Unterschiede
42
+ Die regionalen Unterschiede beim Weihnachtsfest in Deutschland zeigen sich nicht nur in der Art der Bräuche, sondern auch in speziellen Traditionen:
43
+
44
+ Bayern und der Alpenraum: In Bayern und im Alpenraum gibt es besonders reichhaltige Bräuche. Hier ist das „Krippenspiel“ weit verbreitet, bei dem die Geburt Jesu in einem kleinen Theaterstück nachgestellt wird.
45
+ In vielen Dörfern und Städten findet auch das „Christkindl-Anschießen“ statt, bei dem Schützenvereine am Heiligen Abend Böllerschüsse abfeuern, um das Christkind willkommen zu heißen.
46
+
47
+ Norddeutschland: In Norddeutschland sind Weihnachtslieder und das Singen von Shanties, also traditionellen Seemannsliedern, häufig Teil der Festlichkeiten.
48
+ Auch die Dekoration unterscheidet sich leicht, mit einem stärkeren Fokus auf maritime Symbole. Der Weihnachtsmann braven Kindern am Heiligen Abend Geschenke.
49
+
50
+ Sachsen und das Erzgebirge: Sachsen, insbesondere das Erzgebirge, ist bekannt für seinen reich verzierten Weihnachtsschmuck und das Kunsthandwerk.
51
+ Schwibbögen, Räuchermännchen und Nussknacker sind Symbole dieser Region und stammen ursprünglich aus der Bergbaugeschichte des Erzgebirges, in der Licht eine besondere Rolle spielte.
52
+
53
+ Rheinland: Im Rheinland ist die Tradition des Sternsingens weit verbreitet. Kinder ziehen als „Heilige Drei Könige“ verkleidet von Haus zu Haus und singen Lieder, um Spenden für wohltätige Zwecke zu sammeln.
54
+ Diese Tradition wird zwar auch in anderen Teilen Deutschlands gepflegt, hat jedoch im Rheinland eine besonders lange Geschichte.
55
  """
56
 
57
+ KEYWORDS = [
58
+ "Advent", "Adventskranz", "Weihnachtsbaum", "Nikolaus", "Weihnachtsmarkt", "Weihnachtsessen",
59
+ "Weihnachtslieder", "Weihnachtsschmuck", "Krippenspiel", "Weihnachtsgebäck", "Bescherung", "Wichteln"
60
+ ]
61
+
62
+ REGION_KEYWORDS = {
63
+ "Süddeutschland": ["Christkind", "Krampus", "Böllerschüsse"],
64
+ "Norddeutschland": ["Weihnachtsmann", "Weihnachtslieder"],
65
+ "Ostdeutschland": ["Schwibbogen", "Weihnachtspyramide", "Nussknacker"],
66
+ "Westdeutschland": ["Sternsingen", "Adventskalender"]
67
+ }
68
+
69
+ @st.cache_data
70
+ def get_ideal_embedding():
71
+ model = load_model()
72
+ return model.encode(IDEAL_ANSWER, convert_to_tensor=True)
73
+
74
+ # --- HELPER FUNCTIONS ---
75
+ def fetch_wikipedia_content(url):
76
+ if "wikipedia.org" not in url:
77
+ return None
78
+ headers = {'User-Agent': 'EducationalSchoolProject/1.0'}
79
+ try:
80
+ response = requests.get(url, headers=headers, timeout=5)
81
+ if response.status_code != 200:
82
+ return None
83
+
84
+ soup = BeautifulSoup(response.text, 'html.parser')
85
+
86
+ content_div = soup.find('div', {'id': 'mw-content-text'})
87
+ if content_div:
88
+ paragraphs = content_div.find_all('p')
89
+ content = ' '.join([para.text for para in paragraphs])
90
+ return content
91
+ return None
92
+ except Exception as e:
93
+ return None
94
+
95
+ def evaluate_contexts(student_texts):
96
+ model = load_model()
97
+ ideal_embedding = get_ideal_embedding()
98
+
99
+ scores = {"relevance": [], "completeness": 0, "regional_completeness": 0}
100
+ all_found_keywords = set()
101
+ combined_text = " ".join(student_texts)
102
+
103
+ for text in student_texts:
104
+ student_embedding = model.encode(text, convert_to_tensor=True)
105
+ relevance_score = util.cos_sim(student_embedding, ideal_embedding).item()
106
+ scores["relevance"].append(relevance_score)
107
+
108
+ found = [k for k in KEYWORDS if k.lower() in text.lower()]
109
+ all_found_keywords.update(found)
110
+
111
+ scores["relevance"] = np.mean(scores["relevance"]) if scores["relevance"] else 0
112
+ scores["completeness"] = len(all_found_keywords) / len(KEYWORDS)
113
+
114
+ regions_covered = 0
115
+ total_regions = len(REGION_KEYWORDS)
116
+ for region, words in REGION_KEYWORDS.items():
117
+ if any(word.lower() in combined_text.lower() for word in words):
118
+ regions_covered += 1
119
+ scores["regional_completeness"] = regions_covered / total_regions
120
+
121
+ return scores
122
+
123
+ # --- STREAMLIT UI ---
124
+ st.set_page_config(page_title="Weihnachts-Elf Trainer", page_icon="🎅")
125
+
126
+ st.title("🎄 Weihnachts-Traditionen: Kontextbewertung für KI")
127
+
128
+ st.markdown("""
129
+ <div style="background-color: #262730; padding: 20px; border-radius: 10px; border: 1px solid #4B4B4B; margin-bottom: 20px;">
130
+ <h3>🎅 Aufgabe: Trainiere den Weihnachts-Elf</h3>
131
+ <p>Wir bauen einen KI-Agenten, der Touristen Fragen zu Weihnachten in Deutschland beantwortet.
132
+ Aber: <strong>Der Elf weiß nur das, was DU ihm zu lesen gibst!</strong></p>
133
+ <p>Finde Wikipedia-Artikel, die diese Frage perfekt beantworten:</p>
134
+ <blockquote style="background-color: #3e3e3e; color: white;"><em>„Welche unterschiedlichen Bräuche, Symbole und Traditionen prägen das Weihnachtsfest in Deutschland, und welche regionalen Unterschiede gibt es dabei?“</em></blockquote>
135
+ </div>
136
+ """, unsafe_allow_html=True
137
+ )
138
+
139
+ with st.expander("📜 Anleitung für Wissens-Trainer (Hier klicken)", expanded=True):
140
+ st.markdown("""
141
+ ### 1. Deine Mission
142
+ Deine Aufgabe ist es, **Quellen auszuwählen**, die dem Elf helfen, eine **vollständige** und **richtige** Antwort zu geben. Du lernst dabei, wie man einer KI Kontext gibt (Prompt Engineering / RAG).
143
+
144
+ ### 2. Werkzeugkiste: Suchstrategien
145
+ Der Elf akzeptiert nur **Wikipedia-Links**. Nutze Google clever, um die besten Artikel zu finden:
146
+
147
+ * **Der Basis-Trick:** Suche nur auf Wikipedia.
148
+ * `site:de.wikipedia.org Weihnachten`
149
+ * **Der Präzisions-Laser (Exakte Suche):** Finde genaue Phrasen.
150
+ * `"Weihnachtsbräuche in Norddeutschland"` (in Anführungszeichen!)
151
+ * **Der Inhalt-Scanner (Intext):** Suche Wörter, die im Text vorkommen müssen.
152
+ * `intext:Erzgebirge intext:Weihnachten`
153
+ * **Qualität vor Quantität:** Wähle max. 8 Artikel aus, die *wirklich* die Frage beantworten.
154
+
155
+ ### 3. So bewertet der Elf dein Training
156
+ Sobald du die Links eingibst, prüft der Elf dein Trainingsmaterial auf drei Werte:
157
+
158
+ * 🧠 **Relevanz:** Passt der Artikel wirklich zum Thema "Weihnachten in Deutschland"? (Semantic Similarity)
159
+ * 📚 **Vollständigkeit:** Kennt der Elf danach die wichtigsten Begriffe (Adventskranz, Nikolaus, etc.)?
160
+ * 🌍 **Regionale Abdeckung:** Weiß der Elf, dass man in Bayern anders feiert als an der Ostsee?
161
+ """)
162
+
163
+ st.write("---")
164
+ st.subheader("🔗 Füttere den Elf mit Wissen")
165
+
166
+ with st.form("training_form"):
167
+ num_links = st.number_input("Wie viele Artikel hast du gefunden? (1-8)", min_value=1, max_value=8, value=1)
168
+
169
+ urls = []
170
+ st.caption("Füge hier deine Wikipedia-Links ein:")
171
+ for i in range(num_links):
172
+ urls.append(st.text_input(f"Link {i + 1}", placeholder="https://de.wikipedia.org/wiki/..."))
173
+
174
+ submitted = st.form_submit_button("🚀 Training starten & Auswerten")
175
+
176
+ if submitted:
177
+ student_texts = []
178
+
179
+ with st.spinner("Der Elf liest deine Artikel... 📖"):
180
+ # Fetch content
181
+ for url in urls:
182
+ if url.strip():
183
+ content = fetch_wikipedia_content(url)
184
+ if content:
185
+ student_texts.append(content)
186
+
187
+ if len(student_texts) >= 1:
188
+ scores = evaluate_contexts(student_texts)
189
+
190
+ st.write("---")
191
+ st.subheader("📊 Trainings-Ergebnis")
192
+
193
+ # Metrics Columns
194
+ col1, col2, col3 = st.columns(3)
195
+ col1.metric("🧠 Relevanz", f"{scores['relevance']:.2f}", help="> 0.6 ist gut")
196
+ col2.metric("📚 Vollständigkeit", f"{int(scores['completeness']*100)}%", help="Wie viele Keywords gefunden?")
197
+ col3.metric("🌍 Regional", f"{int(scores['regional_completeness']*100)}%", help="Wie viele Regionen abgedeckt?")
198
+
199
+ # Feedback Logic (Rewritten Tone)
200
+ feedback = []
201
+
202
+ # Relevance Feedback
203
+ if scores["relevance"] > 0.65:
204
+ feedback.append("✅ **Super Fokus:** Die Artikel passen perfekt zum Thema.")
205
+ elif scores["relevance"] > 0.4:
206
+ feedback.append("⚠️ **Geht so:** Die Artikel passen grob, aber es ist viel unwichtiges Zeug dabei.")
207
+ else:
208
+ feedback.append("❌ **Thema verfehlt:** Der Elf ist verwirrt. Die Artikel handeln kaum von Weihnachten.")
209
+
210
+ # Completeness Feedback
211
+ if scores["completeness"] > 0.8:
212
+ feedback.append("✅ **Weihnachts-Profi:** Du hast fast alle wichtigen Traditionen abgedeckt!")
213
+ elif scores["completeness"] > 0.5:
214
+ feedback.append("⚠️ **Lückenhaft:** Einige Klassiker fehlen (vielleicht Essen oder Nikolaus?).")
215
+ else:
216
+ feedback.append("❌ **Anfänger-Wissen:** Da fehlen sehr viele Grundlagen.")
217
+
218
+ # Regional Feedback
219
+ if scores["regional_completeness"] > 0.7:
220
+ feedback.append("✅ **Deutschlandreise:** Von den Alpen bis zur See ist alles dabei!")
221
+ elif scores["regional_completeness"] > 0.4:
222
+ feedback.append("⚠️ **Lokalpatriot:** Du hast manche Regionen gut abgedeckt, aber andere fehlen.")
223
+ else:
224
+ feedback.append("❌ **Zu allgemein:** Der Elf kennt keine regionalen Unterschiede. Suche nach spezifischen Bundesländern!")
225
+
226
+ # Display Feedback
227
+ st.info("\n\n".join(feedback))
228
+
229
+ # Victory Condition
230
+ if scores["relevance"] > 0.6 and scores["completeness"] > 0.6 and scores["regional_completeness"] > 0.7:
231
+ st.balloons()
232
+ st.success("🎉 HERVORRAGEND! Der Elf ist bereit für seinen Einsatz! Die Auswahl der Artikel ist sehr gut!")
233
+ else:
234
+ st.error("⚠️ Hoppla! Der Elf konnte die Links nicht lesen. Sind es echte Wikipedia-Links? (Beginnend mit https://de.wikipedia.org...)")