Nadezhda Komarova
first commit
4be6b01
---
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
1. [Übersicht](#übersicht)
2. [Anforderungen](#anforderungen)
3. [Einrichtung](#einrichtung)
4. [Vorbereitung der API-Schlüssel](#vorbereitung-der-api-schlüssel)
5. [Erstellung des Pinecone-Indexes](#erstellung-des-pinecone-indexes)
6. [Ausführung des RAG-Systems](#ausführung-des-rag-systems)
7. [Code-Struktur](#code-struktur)
8. [Prozessbeschreibung](#prozessbeschreibung)
9. [Evaluation](#evaluation)
---
## Übersicht
Dieses RAG-System arbeitet in drei Schritten:
1. **Dokumente einbetten**: Rohtextdateien in Chunks aufteilen und mit dem `llama-text-embed-v2` Embedding-Modell in Pinecone einbetten.
2. **Abruf (Retrieval)**: Semantische Suche in der Pinecone-Vektordatenbank durchführen, um die relevantesten Chunks für eine Anfrage abzurufen.
3. **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-community`
* `langchain-core`
* `langchain-text-splitters`
* `langchain-mistralai`
* `langchain-openai`
* `ragas`
* `datasets`
* `pinecone-client`
* `gradio`
* `python-dotenv`
* `pypdf`
* `pandas`
* `nbformat`
* `nbconvert`
* `unstructured` (mit Extras für `docx`, `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
1. Repository klonen.
2. Erstellen Sie eine `.env`-Datei im Hauptverzeichnis mit den folgenden Schlüsseln:
```dotenv
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 festen `context/`-Verzeichnisses.
* Wenn leer (`DIRNAME=`), werden alle Dokumente in `context/` verarbeitet.
* Beispiel: `DIRNAME=llm_context` verarbeitet nur `context/llm_context/`.
* `MODELNAME` – LLM-Modell, z. B. `gpt-5-nano` für OpenAI oder `mistral-large-latest` für Mistral.
---
## Vorbereitung der API-Schlüssel
### Mistral
1. Registrieren bei [Mistral AI](https://www.mistral.ai).
2. API-Schlüssel erstellen.
3. In `.env` unter `MISTRAL_API_KEY` eintragen.
### OpenAI
1. Registrieren bei [OpenAI](https://platform.openai.com/).
2. API-Schlüssel erstellen.
3. In `.env` unter `OPENAI_API_KEY` eintragen.
### Pinecone
1. Registrieren bei [Pinecone](https://www.pinecone.io/).
2. API-Schlüssel erstellen.
3. In `.env` unter `PINECONE_API` eintragen.
4. Einen **Index** erstellen (z. B. `use-cases-index`) mit dem Embedding-Modell `llama-text-embed-v2`.
---
## Erstellung des Pinecone-Indexes
Das RAG-Vorbereitungsskript (`rag_func.py`) führt automatisch folgende Schritte aus:
1. Verbindung zu Pinecone über den API-Schlüssel herstellen.
2. Dokumente aus dem Verzeichnis `DIRNAME` laden.
3. Dokumente in Chunks aufteilen mit `RecursiveCharacterTextSplitter` (Standard: 1800 Tokens pro Chunk, 200 Tokens Überlappung).
4. Chunks mit `llama-text-embed-v2` einbetten.
5. Einbettungen in Batches in den Pinecone-Index hochladen.
> **Tipp:** Wenn alle Dokumente bereits hochgeladen wurden, kann `DIRNAME` leer bleiben, und das System überspringt die Dokumentenverarbeitung.
---
## Ausführung des RAG-Systems
Hauptskript ausführen:
```bash
python rag_execute.py
```
Dies bewirkt:
1. Laden der Dokumente (falls vorhanden) und Vorbereitung des RAG-Systems.
2. Starten einer **Chat-Schnittstelle** mit Gradio, in der Sie Fragen stellen können.
3. Abrufen relevanter Chunks aus Pinecone.
4. 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
1. **LLM auswählen**: Mistral oder OpenAI.
2. **Dokumente vorbereiten**:
* Text- oder JSON-Dokumente in den Ordner `DIRNAME` legen.
* Wenn alle Dokumente bereits hochgeladen sind, kann der Ordner leer bleiben.
3. **Pinecone-Index erstellen**:
* Index in `.env` benennen (`INDEX_NAME`).
* Embedding-Modell `llama-text-embed-v2` verwenden.
4. **Dokumente aufteilen**: Mit `RecursiveCharacterTextSplitter`.
5. **Chunks einbetten**: Zur semantischen Suche an Pinecone senden.
6. **Relevante Chunks abrufen**: Bei einer Anfrage.
7. **Antwort generieren**: Anfrage + Kontext an LLM übergeben.
8. **Ergebnis zurückgeben**: Im Chat-Interface anzeigen.
---
## Evaluation
Das System unterstützt Evaluation mit **RAGAS**:
1. `generate_dataset()` ruft Kontext ab und generiert Antworten.
2. `evaluate_RAG()` berechnet **Faithfulness** und andere Metriken.
3. 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
```python
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)
```
---
## Referenzen
* [LangChain RAG Tutorial](https://python.langchain.com/docs/tutorials/rag/)
* [Pinecone Dokumentation](https://docs.pinecone.io)
* [RAGAS Evaluation](https://docs.ragas.io/en/stable/getstarted/evals/)