A newer version of the Gradio SDK is available: 6.14.0
title: RAG-LangChain-Gradio
app_file: rag_execute.py
sdk: gradio
sdk_version: 5.46.0
Retrieval-Augmented Generation (RAG)
Dieses Projekt implementiert ein Retrieval-Augmented Generation (RAG)-System unter Verwendung von LangChain, Mistral/OpenAI LLMs und Pinecone für die Vektordatenbanksuche. Das System ermöglicht es, Dokumente abzufragen und kontextbewusste Antworten über eine Chat-ähnliche Schnittstelle zu generieren.
Inhaltsverzeichnis
- Übersicht
- Anforderungen
- Einrichtung
- Vorbereitung der API-Schlüssel
- Erstellung des Pinecone-Indexes
- Ausführung des RAG-Systems
- Code-Struktur
- Prozessbeschreibung
- Evaluation
Übersicht
Dieses RAG-System arbeitet in drei Schritten:
- Dokumente einbetten: Rohtextdateien in Chunks aufteilen und mit dem
llama-text-embed-v2Embedding-Modell in Pinecone einbetten. - Abruf (Retrieval): Semantische Suche in der Pinecone-Vektordatenbank durchführen, um die relevantesten Chunks für eine Anfrage abzurufen.
- Generierung: Übergabe der Anfrage und des abgerufenen Kontexts an ein LLM (Mistral oder OpenAI), um die Antwort zu generieren.
Anforderungen
Python 3.10+ empfohlen.
Enthaltene Abhängigkeiten:
langchain-communitylangchain-corelangchain-text-splitterslangchain-mistralailangchain-openairagasdatasetspinecone-clientgradiopython-dotenvpypdfpandasnbformatnbconvertunstructured(mit Extras fürdocx,pptx,html,md)
Alle Abhängigkeiten sollten installiert werden, z. B. mit dem folgenden Befehl.
pip install langchain-mistralai langchain-community datasets ragas langchain-openai langchain-text-splitters langchain-core pinecone-client langgraph pypdf gradio python-dotenv nbformat nbconvert "unstructured[docx,pptx,html,md]"
Da eine requirements.txt-Datei vorhanden ist, kann die Installation auch durch folgenden Befehl durchgeführt werden:
pip install -r requirements.txt
Einrichtung
- Repository klonen.
- Erstellen Sie eine
.env-Datei im Hauptverzeichnis mit den folgenden Schlüsseln:
MISTRAL_API_KEY=<Ihr-mistral-api-schlüssel>
OPENAI_API_KEY=<Ihr-openai-api-schlüssel>
PINECONE_API=<Ihr-pinecone-api-schlüssel>
INDEX_NAME=<Ihr-pinecone-index-name>
DIRNAME=<Pfad-zu-Kontextdokumenten>
MODELNAME=<LLM-Modellname>
MISTRAL_API_KEY– Ihr API-Schlüssel für Mistral-Modelle.OPENAI_API_KEY– Ihr API-Schlüssel für OpenAI-Modelle. Es reicht aus, einen der OpenAI-/Mistral-Schlüssel (je nach ausgewähltem Modell) festzulegen.PINECONE_API– API-Schlüssel für Pinecone, um Vektoren zu speichern und abzufragen.INDEX_NAME– Name des Pinecone-Indexes, in dem die Dokumente abgelegt werden.DIRNAME– Unterordner innerhalb des festencontext/-Verzeichnisses.- Wenn leer (
DIRNAME=), werden alle Dokumente incontext/verarbeitet. - Beispiel:
DIRNAME=llm_contextverarbeitet nurcontext/llm_context/.
- Wenn leer (
MODELNAME– LLM-Modell, z. B.gpt-5-nanofür OpenAI odermistral-large-latestfür Mistral.
Vorbereitung der API-Schlüssel
Mistral
- Registrieren bei Mistral AI.
- API-Schlüssel erstellen.
- In
.envunterMISTRAL_API_KEYeintragen.
OpenAI
- Registrieren bei OpenAI.
- API-Schlüssel erstellen.
- In
.envunterOPENAI_API_KEYeintragen.
Pinecone
- Registrieren bei Pinecone.
- API-Schlüssel erstellen.
- In
.envunterPINECONE_APIeintragen. - Einen Index erstellen (z. B.
use-cases-index) mit dem Embedding-Modellllama-text-embed-v2.
Erstellung des Pinecone-Indexes
Das RAG-Vorbereitungsskript (rag_func.py) führt automatisch folgende Schritte aus:
- Verbindung zu Pinecone über den API-Schlüssel herstellen.
- Dokumente aus dem Verzeichnis
DIRNAMEladen. - Dokumente in Chunks aufteilen mit
RecursiveCharacterTextSplitter(Standard: 1800 Tokens pro Chunk, 200 Tokens Überlappung). - Chunks mit
llama-text-embed-v2einbetten. - Einbettungen in Batches in den Pinecone-Index hochladen.
Tipp: Wenn alle Dokumente bereits hochgeladen wurden, kann
DIRNAMEleer bleiben, und das System überspringt die Dokumentenverarbeitung.
Ausführung des RAG-Systems
Hauptskript ausführen:
python rag_execute.py
Dies bewirkt:
- Laden der Dokumente (falls vorhanden) und Vorbereitung des RAG-Systems.
- Starten einer Chat-Schnittstelle mit Gradio, in der Sie Fragen stellen können.
- Abrufen relevanter Chunks aus Pinecone.
- Generieren von Antworten mit dem ausgewählten LLM.
Chat-Schnittstelle
- Geben Sie eine Anfrage in das Textfeld ein.
- Das System ruft den Kontext ab und erstellt eine Antwort.
- Antworten werden im Chat-Format angezeigt.
Code-Struktur
├─ rag_execute.py # Hauptskript für RAG mit Gradio-Schnittstelle
├─ rag_func.py # Funktionen für RAG-Vorbereitung, Abruf und Generierung
├─ .env # Umgebungsvariablen (API-Schlüssel, Index, Modell, Verzeichnis)
├─ context/ # Ordner mit Rohdokumenten (kann leer sein, falls bereits hochgeladen)
Prozessbeschreibung
LLM auswählen: Mistral oder OpenAI.
Dokumente vorbereiten:
- Text- oder JSON-Dokumente in den Ordner
DIRNAMElegen. - Wenn alle Dokumente bereits hochgeladen sind, kann der Ordner leer bleiben.
- Text- oder JSON-Dokumente in den Ordner
Pinecone-Index erstellen:
- Index in
.envbenennen (INDEX_NAME). - Embedding-Modell
llama-text-embed-v2verwenden.
- Index in
Dokumente aufteilen: Mit
RecursiveCharacterTextSplitter.Chunks einbetten: Zur semantischen Suche an Pinecone senden.
Relevante Chunks abrufen: Bei einer Anfrage.
Antwort generieren: Anfrage + Kontext an LLM übergeben.
Ergebnis zurückgeben: Im Chat-Interface anzeigen.
Evaluation
Das System unterstützt Evaluation mit RAGAS:
generate_dataset()ruft Kontext ab und generiert Antworten.evaluate_RAG()berechnet Faithfulness und andere Metriken.- Ergebnisse werden zur Analyse ausgegeben.
Hinweise
- Retry-Logik für Pinecone-Operationen ist implementiert, um Netzwerkfehler abzufangen.
- Chunk-Größe und Überlappung können in
prepare_RAG()für größere oder kleinere Kontextgranularität angepasst werden.
Beispiel
from rag_func import prepare_RAG, retrieve_RAG, generate_RAG
import os
index, pc, llm = prepare_RAG(
pinecone_API=os.getenv("PINECONE_API"),
index_name=os.getenv("INDEX_NAME"),
llm_model=os.getenv("MODELNAME"),
dir_name=os.getenv("DIRNAME")
)
query = "Liste typische Anwendungsfälle von GenAI im Telekommunikationsbereich auf."
retrieved_chunks = retrieve_RAG(query, pc, index)
response = generate_RAG(query, llm, retrieved_chunks)
print(response.content)