Erstellen Sie einen Wikipedia-RAG-Chat-Assistenten mit LlamaIndex und ReAct
Indexieren Sie Wikipedia-Seiten auf Anfrage, fügen Sie Abschnitte mit einem kleinen Encoder ein und lassen Sie einen ReAct-Agenten ein Abfragemaschinen-Tool aufrufen, damit die Antworten von Chainlit auf den abgerufenen Beweisen beruhen.
Einführung
Große Sprachmodelle sind fließend im Sprechen, doch Flüssigkeit bedeutet nicht automatisch, dass sie wissen, ob eine Antwort korrekt oder aktuell ist. Sie können plausibel klingende Falschinformationen erfinden, wenn eine Frage außerhalb der Trainingsdaten liegt oder wenn das Selbstvertrauen den Beweisen vorausgeht.
Ein praktischer Wikipedia-RAG-Chat-Assistent schließt diese Lücke, indem er auf Anfrage erfolgende Seitenindexierung, semantische Suche, Zusammenfassung von Beweismitteln, einen ReAct-Agenten, der entscheidet, wann gesucht werden soll, sowie eine konversationelle Benutzeroberfläche nutzt, die aus den gefundenen Texten antwortet. Die Quellmaterialien für diese Entwicklung sind im agentic-ai wiki RAG Sample des GitHub-Repositoriums data-etl-ml verfügbar.
Warum RAG?
Ohne Suchfunktion ist der Weg kurz, aber anfällig:
User Question
↓
LLM
↓
Answer
Alles hängt davon ab, was das Modell während des Trainings gelernt hat.
Mit RAG werden die Beweismittel vor der Erstellung der Antwort herangezogen:
User Question
↓
Retriever
↓
Relevant Documents
↓
LLM
↓
Grounded Answer
Das Modell antwortet anhand von ausgewählten Abschnitten. Das bedeutet in der Regel weniger Halluzinationen, aktuellere Fakten, keinen Feintuningsprozess zur Aktualisierung des Wissens sowie einen einfachen Weg, das Korpus auszutauschen oder zu erweitern.
Ziel des Projekts
Einen Chat-Assistenten entwickeln, der von den von dem Benutzer ausgewählten Wikipedia-Seiten antwortet. Beispielanfrage:
Please index:
2023 United States banking crisis
Dann fragen:
Which bank experienced the fastest bank run
in US history during 2023?
Die Antwort sollte auf den Inhalt der abgerufenen Seite verweisen und nicht auf das ununterstützte Modellgedächtnis.
Überblick über die Architektur
Auf höherer Ebene sieht das System so aus:
Wikipedia Pages
│
▼
WikipediaReader
│
▼
SentenceSplitter
│
▼
Embeddings
BAAI/bge-small-en
│
▼
VectorStoreIndex
│
▼
Query Engine
│
▼
QueryEngineTool
│
▼
ReAct Agent
│
▼
Chainlit UI
Zwei Abläufe sind wichtig: ein Indexierungsprozess, der den suchbaren Vektor-Speicher erstellt, und ein Abfragesystem, das Datenblöcke abruft und Antworten generiert.
Schritt 1: Lesen der OpenAI-API-Schlüssel
Anmeldeinformationen sollten nicht in der Quelle enthalten sein. Vermeiden Sie das Härtecodieren:
api_key = "xxxxx"
Laden Sie stattdessen aus einer Konfigurationsdatei:
def get_apikey():
with open("apikeys.yml") as file:
config = yaml.safe_load(file)
return config["OPENAI_API_KEY"]
Geheime Informationen bleiben von der Anwendungslogik getrennt.
Schritt 2: Verständnis der Codestruktur
Das Projekt besteht aus drei Python-Modulen:
utils.py
index_wikipages.py
chat_agent.py
utils.py lädt API-Schlüssel und Konfigurationen. index_wikipages.py analysiert Seitenanfragen, lädt Wikipedia-Texte herunter, fügt Abschnitte ein und erstellt Indizes. chat_agent.py verbindet den ReAct-Agenten, das Abfragemaschinen-Tool und die Chainlit-Oberfläche miteinander.
Schritt 3: Extrahieren von Wikipedia-Seiten mithilfe strukturierter Ausgaben
Benutzer können freie Liste eingeben:
Please index:
London, Birmingham, New York
Der Indexierer benötigt ein sauberes Array:
[
"London",
"Birmingham",
"New York"
]
Anstelle einer anfälligen String-Trennung erfasst ein Pydantic-Modell die strukturierte Ausgabe:
class WikiPageList(BaseModel):
pages: List[str]
Das Modell wandelt natürliche Sprache automatisch in eine typisierte Seitenliste um.
Schritt 4: Laden von Wikipedia-Seiten
LlamaIndex stellt einen praktischen Lader bereit:
WikipediaReader
Die Einpflege erfolgt in wenigen Zeilen:
loader = WikipediaReader()
documents = loader.load_data(
pages=["2023 United States banking crisis"]
)
Zu diesem Zeitpunkt enthält der Pipeline die rohen Seitendokumente.
Schritt 5: Aufteilen der Dokumente in Blöcke
Modelle können große Seiten als einzelne Datensätze nur unzureichend verarbeiten. Sie werden in überschneidende Teile aufgeteilt:
SentenceSplitter(
chunk_size=150,
chunk_overlap=45
)
Durch die Überschneidung bleiben Ideen, die mehrere Grenzen berühren, erhalten:
Chunk A:
---------------------
Paragraph 1
Paragraph 2
Chunk B:
---------------------
Paragraph 2
Paragraph 3
Schritt 6: Erstellen von Embeddings
Roter Text reicht nicht aus für eine semantische Suche. Jeder Block wird zu einem Vektor. Das hier verwendete Embedding-Modell ist:
BAAI/bge-small-en
Eine Abfrage wie etwa:
"What is Databricks?"
wird in einen dichten Vektor umgewandelt:
[0.21, -0.44, 0.87 ...]
Semantisch verwandte Blöcke gruppieren sich in diesem Raum in der Nähe voneinander.
Schritt 7: Erstellen des Vektorindex
LlamaIndex übernimmt die Erstellung der Speicherstruktur:
index = VectorStoreIndex(nodes)
Das Ergebnis ist ein im Speicher gehaltener Vektorindex, der Ähnlichkeitsabfragen wie folgt beantworten kann:
Find chunks similar to:
"fastest bank run in history"
Schritt 8: Erstellung des Suchengines
Stellen Sie den Index als Abfragesystem zur Verfügung:
query_engine = index.as_query_engine(
response_mode="compact",
similarity_top_k=10,
verbose=True
)
similarity_top_k = 10
Return 10 most relevant chunks
similarity_top_k bestimmt, wie viele benachbarte Blöcke zur Antwort beitragen.
Schritt 9: Erstellung des ReAct-Agenten
ReAct bedeutet:
Reason + Act
Ein naiver Bot springt direkt von der Frage zur Antwort:
Question
→ Answer
Ein ReAct-Agent fügt Schlussfolgerungen und Werkzeugnutzung ein:
Question
↓
Reason
↓
Choose Tool
↓
Observe Output
↓
Answer
Die Informationsabrufung wird dynamisch statt ständig oder nie aktiv.
Erstellung von Werkzeugen
Umhüllen Sie das Abfragesystem als Werkzeug, das der Agent aufrufen kann:
QueryEngineTool(
query_engine=query_engine,
metadata=ToolMetadata(
name="Wikipedia"
)
)
Dann weiß der Agent, dass eine Wikipedia-Suchfunktion vorhanden ist.
ReAct Loop
The agent internally performs:
Intern sieht der Zyklus wie folgt aus:
Thought:
Need information about the banking crisis.
Action:
Wikipedia Tool
Observation:
Found relevant passages.
Answer:
Grounded response.
Dieses Muster ist zuverlässiger als eine einfache Chat-Vervollständigung ohne Tools.
Schritt 10: Erstellung der Benutzeroberfläche mit Chainlit
Chainlit bietet eine Chat-Oberfläche mit minimalem Boilerplate. Ein Einstellungspanel zeigt Folgendes an:
Model
Wikipedia Pages
Beispielkonfiguration:
MODEL:
gpt-5-nano
Wikipedia Pages:
Please index:
2023 United States banking crisis
Die Einstellungen initialisieren den Vektorindex vor Beginn der Konversation.
Demo
Nach dem Indexieren:
2023 United States banking crisis
eine Frage wie zum Beispiel:
Which bank experienced the fastest
bank run in US history?
ergibt eine fundierte Antwort wie:
Silicon Valley Bank (SVB)
Approximately $42 billion
was withdrawn in 10 hours.
Die Zahlen stammen aus den abgerufenen Belegen, nicht aus freier Erfindung.
Gelernte Lektionen
Was gut funktioniert hat
LlamaIndex hält den Indexierungsweg kurz:
Documents
→ Nodes
→ Index
ReAct-Agenten verbessern die Entscheidungen darüber, wann Daten abgerufen werden sollen, sodass die Suche nur dann ausgeführt wird, wenn sie benötigt wird. Chainlit bleibt weiterhin einer der schnellsten Wege zu einer nutzbaren AI-Chat-Oberfläche.
Herausforderungen
Kompatibilität mit Python 3.13 stellte mehrere Technologiekombinationen vor Probleme – Kombinationen aus Chainlit, Pydantic und LlamaIndex waren instabil. Das Festlegen bestimmter Versionen:
Python 3.11
war weitaus zuverlässiger.
Qualität der Datenabfrage bestimmt maßgeblich die Qualität der Antworten. Schlechte Datenblöcke führen zu schlechten Ergebnissen, was wiederum zu schlechten Antworten führt. Die wichtige Lektion: Die Qualität der Datenabfrage ist oft wichtiger als das verwendete Chat-Modell.
Zukünftige Verbesserungen
Natürliche nächste Schritte umfassen hybride Suchverfahren:
Keyword Search
+
Semantic Search
Neubewertung der Ergebnisse nach einer ersten umfassenden Abfrage – anschließende Datenabfrage:
Top 50
Dann komprimieren auf die besten wenigen. Zitate, die die Absätze hinter jeder Behauptung zeigen. Und eine persistente Vektordatenbank anstelle einer vorübergehenden:
VectorStoreIndex
mit Optionen wie Chroma, Pinecone, Weaviate oder Milvus.
Fazit
Das Projekt bietet eine kompakte Übersicht über moderne agierende Muster: RAG, Embeddings, Vektorsuche, ReAct-Tools, Chainlit-UI sowie LlamaIndex-Orchestrierung. Der strategische Vorteil liegt in der Kombination mehrerer Komponenten – nicht allein im Einsatz immer größerer Modellparameter. Klonen Sie das Beispiel 6_wiki_rag_react_project unter dem Ordner agentic-ai des GitHub-Projekts data-etl-ml, um das gesamte Konzept auszuprobieren.