Frage-Antwort-Paare (QA) für Finetuning, Semantische Suche und RAG
- 1 Hintergründe
- 2 QA für Finetuning
- 2.1 Anwendungsgebiete von Finetuning
- 2.2 Struktur der QA Datensätze für Fine-Tuning
- 2.2.1 OpenAI
- 2.2.1.1 Beispiele
- 2.2.2 Opensource-KI
- 2.2.2.1 Beispiele
- 2.2.3 Empfehlungen
- 2.2.1 OpenAI
- 2.3 Gestaltung des Systemprompts (Finetuning)
- 3 QA für RAG
- 4 QA für Semantische Suche
- 5 QA-Paare generieren
- 5.1 Bisherige Dokumentation
- 5.1.1 Vorgeschlagener Prozess
- 5.1.2 Offene Punkte
- 5.2 Voll- bzw. Seitentexte abrufen
- 5.3 Themen bestimmen
- 5.4 Wissensquellen abrufen
- 5.4.1 Wikipedia
- 5.4.2 Wikidata
- 5.4.3 DBpedia
- 5.4.4 Deutsche Digitale Bibliothek (DDB)
- 5.4.5 Websuche mit DuckDuckGo
- 5.4.6 Tagesschau
- 5.4.7 GovData
- 5.4.8 Europeana
- 5.4.9 Weitere APIs für die Anreicherung
- 5.5 Satzerkennung (optional)
- 5.6 Generation der QA Paare
- 5.1 Bisherige Dokumentation
Hintergründe
Frage-Antwort-Paare (QA-Paare) sind in der KI und Suche von zentraler Bedeutung:
Feinabstimmung (Fine-Tuning): Durch Training mit QA-Paaren wird ein vortrainiertes Modell auf spezifische Aufgaben oder Domänen angepasst, um präzisere Antworten zu liefern.
Semantische Suche: QA-Paare dienen als Referenz, um semantisch ähnliche Anfragen zu identifizieren und relevante Antworten bereitzustellen.
Retrieval Augmented Generation (RAG): In RAG-Systemen werden QA-Paare genutzt, um generative Modelle mit spezifischem Wissen zu versorgen, wodurch kontextbezogene und genaue Antworten generiert werden.
QA für Finetuning
Anwendungsgebiete von Finetuning
Integration domänenspezifischen Wissens: Anpassung an Fachbereiche wie Bildung oder Medizin.
Training spezifischen Verhaltens: Optimierung von Chatbots für bestimmte Interaktionen.
Anpassung des Kommunikationsstils: Generierung von Antworten in gewünschten Stilen, z. B. förmlich oder humorvoll.
Formatierung der Ausgaben: Bereitstellung von Antworten in definierten Formaten, etwa JSON.
Verbesserte Klassifikationen: Präzisere Bewertung von Metadaten.
Optimierte Bildanalyse: Steigerung der Genauigkeit in multimodalen Modellen.
Erhöhung der Aufgabenpräzision: Verbesserte Leistung bei spezifischen Aufgaben.
Zum Weiterlesen: https://platform.openai.com/docs/guides/fine-tuning/create-a-fine-tuned-model
Struktur der QA Datensätze für Fine-Tuning
Dies hängt von KI-Model und der Art des Fine-Tunings ab.
OpenAI
Für das Fine-Tuning von OpenAI-Modellen sollten die Trainingsdaten im JSONL-Format (JSON Lines) vorliegen. Jede Zeile repräsentiert eine Konversation oder Einheit, die das Modell lernen soll und ist mit dem Schlüssel messages versehen. Der Wert ist eine Liste von Nachrichten (message-Objekten), die den Dialog darstellen.
role: In diesem Format gibt es verschiedene Rollen. Mögliche Werte sind:system: Setzt den Kontext des Modells.user: Repräsentiert eine Eingabe des Benutzers.assistant: Repräsentiert die Antwort des Modells.
content: Der Textinhalt der Nachricht.name(optional): Kann verwendet werden, um spezifische Sprecher innerhalb eines Dialogs zu kennzeichnen.weight(optional): Erlaubt es, Gewichtungen für bestimmte Antworten zu setzen. Werte:1: Antwort wird während des Trainings berücksichtigt.0: Antwort wird ignoriert (z. B. für alternative Varianten).
Beispiele
Sarkastischer Chatbot (für Chat Completions API z.B. mit gpt-4o)
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already."}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?"}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters."}]}Es sind jedoch auch Multiturn-Konversationen für Chatbot-Training mögich z.B.
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}Quellen:
Allgemeine Infos zu Finetuning bei OpenAI: https://platform.openai.com/docs/guides/fine-tuning
OpenAI Cookbook zur Datenvorbereitung: https://cookbook.openai.com/examples/chat_finetuning_data_prep
Opensource-KI
Beim Fine-Tuning von Open-Source-Modellen wie Meta Llama 3.1 ist es wichtig, die Trainingsdaten klar zu strukturieren, um die gewünschten Aufgaben und Anforderungen zu erfüllen. Ein typischer Aufbau umfasst:
System-Prompt: Bestimmt das Verhalten des Modells und steuert die Konversation.
User-Prompt: Die vom Benutzer gestellte Aufgabe oder Frage.
Assistant-Output: Die gewünschte Antwort oder Reaktion des Modells.
Beispiele
Einfacher Chatbot als Assistent.
{
"messages": [
{"role": "system", "content": "You are a helpful assistant who always explains concepts clearly."},
{"role": "user", "content": "What is the capital of France?"},
{"role": "assistant", "content": "The capital of France is Paris."}
]
}Multi-Turn-Konversationen. Spezielle Formate wie ShareGPT oder ChatML eignen sich besonders für solche komplexen Dialoge.
<|im_start|>system
You are a knowledgeable assistant.<|im_end|>
<|im_start|>user
Explain why the sky is blue.<|im_end|>
<|im_start|>assistant
The sky appears blue because of the scattering of sunlight by the atmosphere. This effect, called Rayleigh scattering, is more effective at shorter wavelengths, like blue.<|im_end|>Quelle: https://huggingface.co/blog/mlabonne/sft-llama3
Formate für Trainingsdaten
Verschiedene Datenformate bieten Flexibilität, um unterschiedliche Anwendungsfälle zu unterstützen:
Alpaca-Format: Simpler Aufbau, der direkt Anweisung und Antwortpaar enthält. Ideal für einfache Aufgaben.
ShareGPT-Format: Speziell für Dialoge mit mehreren Gesprächsrunden.
Custom Chat Templates: Erweiterungen wie ChatML oder Llama3 mit Tokens zur Markierung von Sprecherrollen und Nachrichtenabschnitten.
Anwendung von Templates
Templates erleichtern die Standardisierung von Trainingsdaten und verbessern die Modellleistung.
Tokens wie
<|im_start|>und<|im_end|>(z. B. bei ChatML) helfen, Konversationskontexte klar zu strukturieren.Templates können auch für domänenspezifische Anpassungen verwendet werden, z. B. bei technischen oder kreativen Anwendungsfällen.
Empfehlungen
Beachten Sie die Token-Limits der Modelle.
Für kleine Anpassungen werden mindestens 10 QA-Paare empfohlen; für moderate Anpassungen 50–100 Paare.
Teilen Sie den Datensatz in Trainings- und Testdaten auf, um die Ergebnisse zu validieren.
Schätzen Sie die Kosten des Fine-Tunings im Voraus ab.
Eine sorgfältige Strukturierung der Trainingsdaten ist entscheidend für ein erfolgreiches Fine-Tuning und die Anpassung des Modells an spezifische Anforderungen.
Gestaltung des Systemprompts (Finetuning)
Der System Prompt spielt eine entscheidende Rolle bei der Steuerung des Verhaltens eines KI-Modells während des Fine-Tunings und später beim Inferenzprozess. Er dient als übergeordnete Anweisung, um den generellen Kontext, den Stil und die Funktionalität des Modells festzulegen.
Funktion des System Prompts
Rahmen schaffen: Der System Prompt definiert die Persönlichkeit des Modells, seine Tonalität, seinen Wissenskontext und seine Aufgabenstellung.
Konsistenz sicherstellen: Durch klare Anweisungen wird das Verhalten des Modells über verschiedene Anwendungsfälle hinweg konsistent gehalten.
Feinabstimmung des Verhaltens: Er kann präzise steuern, wie das Modell auf Eingaben reagiert, z. B. sachlich, humorvoll, kreativ oder streng formal.
Beispiele:
Du bist ein sachlicher Assistent, der kurze und präzise Antworten liefert.Du bist ein kreativer Geschichtenerzähler, der humorvolle und unterhaltsame Geschichten in lockerer Sprache verfasst.Systemprompt für Bildungszwecke
Dieser sollte die speziellen Anforderungen, Bedürfnisse und Qualitätsrichtlinien für Bildung berücksichtigen. Hierzu kann man sich an bereits aufgestellten Qualitätskriterien orientieren.
Aspekte und Kriterien für Bildung
Infos zu Aspekten/Kriterien:
Kriterien/Aspekte der Eignung für Bildung
Strafrecht
Urheberrecht
Jugendschutz
Persönlichkeitsrechte
Anbietertransparenz
Kriterien/Aspekte für Qualität
Sachrichtigkeit
Relevanz
Zielgruppenorientierung
Sprachlich passend
Medial passend
Aktualität
Neutralität
Didaktik/Methodik
Kriterien/Aspekte der Zugänglichkeit
Offenheit
Auffindbarkeit
Barrierefreiheit
Werbefreiheit
Kostenfreiheit
Zugänglichkeit ohne Login
Datenschutz/DSGVO-Konformität
Formulierung des Systemprompts
Sofern es keine speziellen Anwendungsszenarien gibt, ist die Grundform ein hilfreicher Assistent.
Prompt-Vorschlag:
Du bist ein hilfreicher KI-Assistent für Lehr- und Lernsituationen, der sachlich korrekte und verständliche Antworten gibt, um Lernenden und Lehrenden komplexe Themen näherzubringen. Deine Antworten sind relevant, aktuell und fachlich fundiert, basieren auf vertrauenswürdigen Quellen und enthalten keine falschen oder spekulativen Aussagen. Du passt deine Sprache an die Zielgruppe an, bleibst klar und fachlich präzise, um den Lernerfolg zu fördern.
Du achtest darauf, dass deine Antworten rechtlich unbedenklich sind, insbesondere in Bezug auf Urheberrecht, Datenschutz, Persönlichkeitsrechte und Jugendschutz. Die Herkunft der Informationen wird bei Bedarf transparent gemacht. Du orientierst dich an anerkannten didaktischen Prinzipien, lieferst praxisorientierte Erklärungen und vermeidest unnötige Komplexität.
Neutralität und Objektivität stehen im Fokus. Persönliche Meinungen oder parteiische Bewertungen sind ausgeschlossen. Deine Inhalte werden regelmäßig überprüft, um den höchsten Qualitätsstandards zu genügen, unter anderem durch den Einsatz von LLM-gestützter Analyse. Dein Ziel ist es, sachliche, aktuelle und rechtlich wie didaktisch einwandfreie Informationen bereitzustellen.
QA für RAG
Frage-Antwort-Paare (QA-Paare) spielen eine zentrale Rolle bei der Optimierung von Retrieval Augmented Generation (RAG)-Pipelines. Sie dienen als strukturierte Wissensbasis, die es ermöglicht, generative KI-Modelle mit präzisen und kontextbezogenen Informationen zu versorgen.
Verbesserungen durch QA-Paare in RAG-Pipelines:
Erhöhung der Antwortgenauigkeit: Durch die Integration von QA-Paaren kann das System auf spezifische, vorab definierte Informationen zurückgreifen, was die Genauigkeit der generierten Antworten erhöht. Dies ist besonders nützlich, um faktische Fehler zu minimieren und konsistente Informationen bereitzustellen.
Reduktion von Halluzinationen: Generative Modelle neigen dazu, plausible, aber falsche Informationen zu erzeugen. QA-Paare bieten verlässliche Referenzpunkte, die das Modell nutzen kann, um solche Halluzinationen zu vermeiden und stattdessen auf verifizierte Daten zurückzugreifen.
Effiziente Informationsbeschaffung: In einer RAG-Pipeline dienen QA-Paare als leicht durchsuchbare Wissensquelle. Bei einer Benutzeranfrage kann das System relevante Paare schnell identifizieren und die enthaltenen Informationen in die Antwortgenerierung einfließen lassen.
Anpassung an spezifische Domänen: QA-Paare ermöglichen es, RAG-Pipelines auf bestimmte Fachgebiete oder Unternehmensbereiche zuzuschneiden. Durch die Bereitstellung domänenspezifischer Paare kann das System kontextuell relevante und präzise Antworten liefern.
Praktisches Beispiel:
Es soll ein Chatbot entwickelt werden, der Anfragen von Lernenden zu Bildungsinhalten beantwortet. Durch die Integration von QA-Paaren, die häufig gestellte Fragen und deren Antworten enthalten, kann der Chatbot:
Schnell auf Anfragen von Lernenden reagieren, indem er passende QA-Paare identifiziert.
Konsistente und genaue Informationen bereitstellen, da die Antworten auf verifizierten Daten basieren.
Den Umfang der generativen Modellantworten auf relevante Informationen beschränken, wodurch die Wahrscheinlichkeit von Halluzinationen reduziert wird.
Durch die Einbindung von Frage-Antwort-Paaren in RAG-Pipelines wird die Qualität der generierten Antworten signifikant verbessert, was zu einer höheren Zufriedenheit der Endnutzer führt
Beispiel: RAG-Pipeline mit QA Paaren
In diesem Beispiel wird eine Retrieval Augmented Generation (RAG)-Pipeline implementiert, die eine semantische Suche mit einem generativen Sprachmodell kombiniert. Zunächst werden vordefinierte Frage-Antwort-Paare mittels Sentence Transformers in Vektorrepräsentationen umgewandelt und in einem FAISS-Index gespeichert. Bei einer Benutzeranfrage wird die semantisch ähnlichste Frage im Index identifiziert, und die zugehörige Antwort wird zusammen mit der ursprünglichen Anfrage als Prompt an das generative Modell (z. B. GPT-4o) übergeben. Das Modell generiert daraufhin eine präzise und kontextbezogene Antwort, die sowohl die abgerufenen Informationen als auch die spezifische Benutzeranfrage berücksichtigt. Es kann zusätzlich auf die verwendeten Bildungsinhalte verwiesen werden, um eine Quellenangabe zu machen.
import os
from sentence_transformers import SentenceTransformer
import numpy as np
import faiss
from openai import OpenAI
# Initialisieren des OpenAI-Clients mit dem API-Schlüssel aus der Umgebungsvariable
client = OpenAI(api_key=os.environ.get('OPENAI_API_KEY'))
# Definieren der Frage-Antwort-Paare mit Inhalts-IDs
qa_pairs = [
{"id": 1, "question": "Was ist die Hauptstadt von Deutschland?", "answer": "Berlin"},
{"id": 2, "question": "Wer entwickelte die Relativitätstheorie?", "answer": "Albert Einstein"},
{"id": 3, "question": "Was ist die chemische Formel von Wasser?", "answer": "H₂O"},
{"id": 4, "question": "Wer schrieb 'Die Verwandlung'?", "answer": "Franz Kafka"},
{"id": 5, "question": "Was ist der Satz des Pythagoras?", "answer": "In einem rechtwinkligen Dreieck ist das Quadrat der Hypotenuse gleich der Summe der Quadrate der beiden Katheten."}
]
# Laden des vortrainierten Modells
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
# Extrahieren der Fragen
questions = [pair['question'] for pair in qa_pairs]
# Erstellen der Embeddings
question_embeddings = model.encode(questions, convert_to_tensor=False)
# Konvertieren der Embeddings in ein numpy-Array
question_embeddings_np = np.array(question_embeddings)
# Bestimmen der Dimension der Embeddings
embedding_dim = question_embeddings_np.shape[1]
# Erstellen des FAISS-Index
index = faiss.IndexFlatL2(embedding_dim)
index.add(question_embeddings_np)
def generate_response(prompt):
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "Du bist ein hilfreicher Assistent."},
{"role": "user", "content": prompt}
]
)
return response.choices[0].message.content
def answer_query(query, top_k=1):
# Erstellen des Embeddings für die Benutzeranfrage
query_embedding = model.encode([query], convert_to_tensor=False)
query_embedding_np = np.array(query_embedding)
# Durchführen der Ähnlichkeitssuche
distances, indices = index.search(query_embedding_np, top_k)
# Abrufen der besten Treffer
best_indices = indices[0]
best_distances = distances[0]
# Sammeln der relevanten Frage-Antwort-Paare und ihrer IDs
relevant_qa = []
used_ids = []
for idx, dist in zip(best_indices, best_distances):
result = qa_pairs[idx]
relevant_qa.append(f"Frage: {result['question']}\nAntwort: {result['answer']}")
used_ids.append(result['id'])
# Erstellen des Prompts für das generative Modell
prompt = (
f"Benutzeranfrage: {query}\n\n"
"Relevante Informationen:\n"
f"{'\n\n'.join(relevant_qa)}\n\n"
"Bitte nutze die oben genannten Informationen, um die Benutzeranfrage präzise zu beantworten."
)
# Generieren der Antwort mit dem generativen Modell
response = generate_response(prompt)
# Ausgabe der Ergebnisse
print(f"Benutzeranfrage: {query}\n")
print(f"Generierte Antwort: {response}\n")
print(f"Verwendete Inhalts-IDs: {used_ids}\n")
# Beispielanfrage
user_query = "Wer hat die Relativitätstheorie entwickelt?"
answer_query(user_query)QA für Semantische Suche
Frage-Antwort-Paare (Q&A-Paare) sind für die semantische Suche von großer Bedeutung, da sie helfen, die Intention hinter Nutzeranfragen besser zu verstehen und präzisere Suchergebnisse zu liefern.
Training von Suchalgorithmen: Durch die Verwendung von QA-Paaren können Suchmaschinen lernen, wie bestimmte Fragen formuliert werden und welche Antworten erwartet werden. Dies verbessert die Fähigkeit, ähnliche Anfragen zu erkennen und passende Ergebnisse bereitzustellen.
Erweiterung von Wissensdatenbanken: QA-Paare dienen als Grundlage für den Aufbau von Wissensgraphen, die Beziehungen zwischen verschiedenen Entitäten darstellen. Dies ermöglicht es der semantischen Suche, komplexe Anfragen zu verarbeiten und relevante Informationen bereitzustellen.
Verbesserung der Antwortgenauigkeit: Durch die Analyse von QA-Paaren können Suchsysteme Muster erkennen und ihre Antwortgenauigkeit erhöhen, insbesondere bei komplexen oder mehrdeutigen Fragen.
Personalisierung der Suchergebnisse: QA-Paare ermöglichen es, Suchergebnisse basierend auf früheren Anfragen und Präferenzen des Nutzers zu personalisieren.
Beispiel: Semantische Suche mit QA Paaren
Die Grundfunktion des bereitgestellten Codes besteht darin, Benutzeranfragen semantisch zu analysieren und mit einer vordefinierten Liste von Frage-Antwort-Paaren abzugleichen. Hierzu werden sowohl die gespeicherten Fragen als auch die Benutzeranfrage in Vektoren (Embeddings) umgewandelt, die ihre semantische Bedeutung repräsentieren. Anschließend wird die Ähnlichkeit zwischen dem Embedding der Benutzeranfrage und den Embeddings der gespeicherten Fragen berechnet, um die relevantesten Antworten mit den zugehörigen Inhalts-IDs zurückzugeben. Dies kann für Fragen zu Inhalten oder einen vordefinieren Gesprächsverlauf genutzt werden.
Dieses Beispiel kann auf WLO übertragen werden - auch wenn dort andere Tools genutzt werden.
from sentence_transformers import SentenceTransformer
import numpy as np
import faiss
# Definieren der Frage-Antwort-Paare mit Inhalts-IDs
qa_pairs = [
{"id": 1, "question": "Was ist die Hauptstadt von Frankreich?", "answer": "Paris"},
{"id": 2, "question": "Wer schrieb 'Faust'?", "answer": "Johann Wolfgang von Goethe"},
{"id": 3, "question": "Wie hoch ist der Eiffelturm?", "answer": "330 Meter"},
{"id": 4, "question": "Was ist die Währung in Japan?", "answer": "Yen"},
{"id": 5, "question": "Wer ist der CEO von Tesla?", "answer": "Elon Musk"}
]
# Laden des vortrainierten Modells
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
# Extrahieren der Fragen
questions = [pair['question'] for pair in qa_pairs]
# Erstellen der Embeddings
question_embeddings = model.encode(questions, convert_to_tensor=False)
# Konvertieren der Embeddings in ein numpy-Array
question_embeddings_np = np.array(question_embeddings)
# Bestimmen der Dimension der Embeddings
embedding_dim = question_embeddings_np.shape[1]
# Erstellen des FAISS-Index
index = faiss.IndexFlatL2(embedding_dim)
index.add(question_embeddings_np)
def answer_query(query, top_k=1):
# Erstellen des Embeddings für die Benutzeranfrage
query_embedding = model.encode([query], convert_to_tensor=False)
query_embedding_np = np.array(query_embedding)
# Durchführen der Ähnlichkeitssuche
distances, indices = index.search(query_embedding_np, top_k)
# Abrufen der besten Treffer
best_indices = indices[0]
best_distances = distances[0]
# Ausgabe der Ergebnisse
for idx, dist in zip(best_indices, best_distances):
result = qa_pairs[idx]
print(f"ID: {result['id']}")
print(f"Frage: {result['question']}")
print(f"Antwort: {result['answer']}")
print(f"Distanz: {dist}\n")
# Beispielanfrage
user_query = "Wie heißt die Hauptstadt von Frankreich?"
answer_query(user_query)
QA-Paare generieren
Bisherige Dokumentation
https://edu-sharing.atlassian.net/wiki/spaces/ESS/pages/353862035
Vorgeschlagener Prozess
Voll- bzw. Seitentexte der Originaldaten abrufen
Volltexte säubern
Themen bestimmen (wichtige Elemente/Entitäten extrahieren)
Auf Basis dieser Elemente Zusatzwissen von Wikidata, DBPedia und anderen Quellen abrufen
Originaltext + Zusatzwissen zur Generierung der QA nutzen
Optionaler Schritt: Zerlegung des Textkorpus in Sätze (falls erforderlich)
Ablage der QA Paare in der Datenbank (https://ai-prompt-service.staging.openeduhub.net/swagger-ui/index.html#/Question%20Answers/createQANode)
Offene Punkte
Welche Datenquellen kann man sinnvoll einbeziehen?
Wird auch aktuelles Wissen berücksichtigt (z.B. News, Internetsuche)?
Wie läuft der Prozessschritt der QA Generierung genau ab?
Welche Fragen können/sollen eingesetzt werden?
Was ist die optimale Formatierung der QA-Paare?
Wie kann ich die QA Paare technisch generieren?
Welcher Generierungsprompts ist notwendig?
Welcher Systemprompt ist notwendig, wenn ich die QA Paare für Finetuning verwenden will?
Wo kann man die QA Paare nutzen?
Voll- bzw. Seitentexte abrufen
Mit Volltexten der Webseiten kann man sich einen besseren Überblick zum Inhalt verschaffen, als mit kurzen Beschreibungstexten. Sie bilden eine gute Basis zur Themenbestimmung.
Der dafür vorgesehene Prozess ist:
Abruf der Volltexte mit dem headless Browser
Textextraktion mit Trafilatura
Daten im Repo speichern
Notwendige Voraussetzung
URL der Original-Webseite im Metadaten-Feld: ccm:wwwurl (unter properties zu finden)
Alternativen für diesen Prozess-Schritt:
Newspaper4k (Abruf und Bereinigung der Volltexte in einem Tool, weitere Funktionalitäten wie Keyword-Generierung, Suche nach Artikelbildern usw.)
Goose3 (gleiche Funktionalitäten wie Newspaper4K)
beide Lösungen arbeiten mit NLP und benötigen keine zeitaufwendige KI, haben jedoch mit Javascript Probleme
Beispiel-Code für Newspaper4k:
from newspaper import Article
# URL des Artikels
url = 'https://www.grundschulkoenig.de/mathe/2-klasse/addition-und-subtraktion/'
try:
# Artikel laden und parsen
article = Article(url)
article.download()
article.parse()
# Titel und Volltext anzeigen
print(f"Title: {article.title}")
print(f"Content: {article.text[:500]}...") # Zeigt die ersten 500 Zeichen des Volltextes
except Exception as e:
print(f"An error occurred: {e}")Beispiel-Code für Goose3:
from goose3 import Goose
url = 'https://www.grundschulkoenig.de/mathe/2-klasse/addition-und-subtraktion/'
try:
article = Goose().extract(url=url)
title = article.title or "No title found"
content = article.cleaned_text[:500] or "No content found" # Erste 500 Zeichen
print(f"Title: {title}")
print(f"Content: {content}...")
except Exception as e:
print(f"An error occurred: {e}")Gespeicherte Volltexte verwenden
Kibana Abfragen: Objekte aus den Sammlungen mit Volltext ohne Youtube / SODIS Objekte
Objekte mit Volltext aus Physik https://wirlernenonline.de/portal/physik-optik/
"query": {
"bool": {
"must": [],
"filter": [
{
"match_all": {}
},
{
"exists": {
"field": "content.fulltext"
}
},
{
"wildcard": {
"content.fulltext": "*"
}
},
{
"match_phrase": {
"collections.path.keyword": "3d2e9d02-348d-4f51-bb5c-6ed0fdeddcb6"
}
}
],
"should": [],
"must_not": [
{
"match_phrase": {
"content.fulltext": ""
}
},
{
"match_phrase": {
"content.fulltext": "1"
}
},
{
"bool": {
"should": [
{
"match_phrase": {
"properties.ccm:replicationsource.keyword": "youtube_spider"
}
},
{
"match_phrase": {
"properties.ccm:replicationsource.keyword": "oai_sodis_spider"
}
}
],
"minimum_should_match": 1
}
}
]
}
}Sammlungen:
"query": {
"bool": {
"must": [],
"filter": [
{
"match_all": {}
},
{
"match_phrase": {
"aspects": "ccm:collection"
}
},
{
"match_phrase": {
"path": "9e7ae956-e9df-430f-bace-f3db4b910013"
}
},
{
"exists": {
"field": "properties.cm:description"
}
}
],
"should": [],
"must_not": []
}
}Themen bestimmen
Bei der Ermittlung von Themen für den Wissensabruf stehen zwei Hauptansätze zur Verfügung: die Verwendung von Schlüsselwörtern (Keywords) und die Nutzung von Entitäten. Beide Methoden haben ihre spezifischen Vor- und Nachteile.
Schlüsselwörter (Keywords): Wörter oder Phrasen, die den Inhalt eines Dokuments oder Themas beschreiben.
Vorteile:
Einfachheit: Leicht zu identifizieren und zu implementieren.
Flexibilität: Können breit gefächert eingesetzt werden.
Nachteile:
Mehrdeutigkeit: Einzelne Wörter können mehrere Bedeutungen haben, was zu ungenauen Ergebnissen führen kann.
Kontextverlust: Ohne zusätzlichen Kontext können Schlüsselwörter die spezifische Bedeutung eines Themas nicht vollständig erfassen.
Entitäten: Spezifische, eindeutig identifizierbare Objekte oder Konzepte, wie Personen, Orte, Organisationen oder Ereignisse.
Vorteile:
Eindeutigkeit: Reduzieren Mehrdeutigkeiten durch klare Identifikation.
Strukturierte Daten: Ermöglichen präzisere Abfragen und Verknüpfungen in Wissensdatenbanken.
Nachteile:
Komplexität: Die Identifikation und Verarbeitung von Entitäten erfordert fortgeschrittene Techniken, wie Named Entity Recognition (NER).
Abdeckung: Nicht alle relevanten Informationen lassen sich als Entitäten klassifizieren.
Begrenzte Flexibilität: Relevante Entitätsklassen, wie beispielsweise Orte, Personen oder Organisationen müssen im Vorfeld definiert sein und durch die Modelle unterstützt werden. Klassen wie Unterrichtsmethoden usw. werden eventuell nicht von vortrainierten Modellen abgedeckt.
Beispiel zum praktischen Vergleich (jeweils mit Standard-Modellen)
Anna Schmidt, eine erfahrene Pädagogin aus Berlin, arbeitet bei der Organisation EduGlobal. Sie setzt verschiedene innovative Methoden ein, um das kritische Denken der Studierenden zu fördern. Dabei nutzt sie häufig Gruppenarbeit und Fallstudien als Unterrichtsmethoden.
Standard-Klassen werden bei Entitäten gut erkannt. Bildungsrelevante Aspekte wie z.B. Methoden benötigen neue Modelle. Keywords können diese z.T. erfassen, sind aber nicht ganz so präzise.
Keywords
Bei der Verwendung von Keywords kann man die möglichen Nachteile (Kontextverlust, Mehrdeutigkeit) reduzieren, in dem man ein Ranking erstellt, das diese in Beziehung zum Kontext setzt.
Optionen für die Generierung von Keywords
Neben der Generierung von Keywords mit großen KI-Modellen, gibt es auch verschiedene Optionen, die auf Statistik oder NLP basieren. Diese können individuelle Vor- und Nachteile haben. Ein Ausgleich kann z.B. durch den kombinierten Einsatz von mehreren Methoden realisiert werden. Ziel ist es, bestehende Keywords aus den Metadaten mit Keywords zu ergänzen, die basierend auf Volltexten generiert wurden.
Methode | Funktionsweise | Umsetzung in Python (Bibliotheken/Tools) | Vorteile | Nachteile |
|---|---|---|---|---|
Worthäufigkeitsanalyse | Identifiziert häufig vorkommende Wörter in einem Text. | - | + Einfache Implementierung | - Berücksichtigt nicht den Kontext |
TF-IDF (Term Frequency-Inverse Document Frequency) | Bewertet die Relevanz eines Wortes basierend auf seiner Häufigkeit im Dokument und seiner Seltenheit in einer Sammlung von Dokumenten. |
| + Berücksichtigt Dokument- und Korpus-Häufigkeit | - Erfordert einen umfangreichen Korpus |
RAKE (Rapid Automatic Keyword Extraction) | Nutzt Stopwörter und Ko-Vorkommen von Wörtern zur Gewichtung von Keywords. |
| + Liefert längere Phrasen | - Begrenzte Berücksichtigung semantischer Beziehungen |
Latent Semantic Analysis (LSA) | Analysiert Beziehungen zwischen Dokumenten und Begriffen, um verborgene semantische Strukturen zu identifizieren. |
| + Erkennt synonyme und verwandte Begriffe | - Rechenintensiv |
TextRank | Graph-basierter Algorithmus, der Wörter als Knoten und deren Co-Vorkommen als Kanten darstellt, um die Wichtigkeit von Wörtern im Text zu bestimmen. |
| + Berücksichtigt den Kontext | - Komplexe Implementierung |
Latent Dirichlet Allocation (LDA) | Generiert Themen aus einer Sammlung von Dokumenten, indem Wörter gruppiert werden, die häufig zusammen auftreten, und weist Dokumenten eine Mischung dieser Themen zu. |
| + Identifiziert thematische Strukturen | - Erfordert Feinabstimmung der Parameter |
spaCy | Extrahiert Nomen-Phrasen basierend auf linguistischen Regeln und POS-Tags. |
| + Nutzt grammatikalische Struktur | - Abhängig von der Qualität des Sprachmodells |
YAKE (Yet Another Keyword Extractor) | Bewertet Keywords basierend auf Erscheinungsmustern im Text. |
| + Sehr flexibel und anpassbar | - Begrenzte Unterstützung für längere Phrasen |
Maschinelles Lernen (ML) | Verwendet trainierte Modelle, um relevante Keywords basierend auf Merkmalen wie Wortembeddings, Kontext und semantischen Beziehungen zu identifizieren. |
| + Hohe Genauigkeit | - Benötigt umfangreiche Trainingsdaten |
Künstliche Intelligenz (KI) und NLP | Nutzt fortgeschrittene KI-Modelle, um den Kontext und die Bedeutung von Texten zu verstehen und relevante Keywords zu extrahieren. |
| + Erkennt subtile semantische Nuancen | - Hoher Rechenaufwand |
Optionen für das Ranking von Keywords
Aus den vorhandenen Keywords und den zusätzlich generierten Keywords aus den Volltexten kann eine dublettenbereinigte Liste erstellt werden, die gegen den Volltext gerankt wird, um eine max. Ähnlichkeit/Übereinstimmung sicherzustellen. Dafür bieten sich mehrere Verfahren an:
Methode | Beschreibung | Python-Umsetzung | Vorteile | Nachteile |
|---|---|---|---|---|
Term Frequency (TF) | Zählt, wie oft jedes Keyword im Text vorkommt. |
| Einfach, schnell, keine externen Ressourcen nötig | Ignoriert Kontext und Synonyme, anfällig für Stoppwörter |
TF-IDF | Kombiniert Häufigkeit im Text (TF) mit Seltenheit in anderen Texten (IDF). |
|