0 / 0
Zurück zur englischen Version der Dokumentation

Codierung eines AutoAI RAG-Experiments mit einem Chroma-Vektorspeicher

Letzte Aktualisierung: 21. Feb. 2025
Codierung eines AutoAI RAG-Experiments mit einem Chroma-Vektorspeicher

Schauen Sie sich die Richtlinien und Codebeispiele an, um zu lernen, wie man ein AutoAI RAG-Experiment mit der standardmäßigen In-Memory Chroma-Datenbank als Vektorspeicher programmiert.

Speicherung von vektorisierten Inhalten in einer Chroma-Datenbank

Wenn Sie Ihr AutoAI RAG-Experiment einrichten und keine Verbindung zu einem Vektorspeicher angeben, wird der vektorisierte Inhalt in der standardmäßigen, speicherinternen Chroma-Datenbank gespeichert. Der Inhalt bleibt nicht über das Experiment hinaus bestehen, daher ist dies keine praktikable Produktionsmethode für die Anwendung eines RAG-Musters. Sie bietet jedoch einen schnellen Weg zur Erstellung eines RAG-Musters.

In den folgenden Abschnitten wird der kommentierte Beispielcode aus dem Automatisierung von RAG-Mustern mit der Chroma-Datenbank-Notebook erläutert.

Das Notebook verwendet die watsonx.ai Python Client-Bibliothek (Version 1.1.11 oder höher).

Folgen Sie diesen Schritten, um ein AutoAI RAG-Experiment für Ihren Anwendungsfall zu programmieren.

  1. Vorbereitung der Voraussetzungen für die Datenaufbereitung und den Aufbau des Experiments
  2. Konfigurieren Sie das RAG-Experiment
  3. Experiment ausführen
  4. Prüfen Sie die Muster und wählen Sie das beste aus

Schritt 1: Vorbereiten der Voraussetzungen für die Datenaufbereitung und den Aufbau des Experiments

Bereiten Sie die Voraussetzungen für das Experiment vor.

  • Installieren und importieren Sie die erforderlichen Module und Abhängigkeiten. Beispiel:

    pip install 'ibm-watsonx-ai[rag]>=1.1.11'
    pip install langchain-community==0.2.4
    
  • Verwenden Sie diese, um den Client zu initialisieren. Beispiel:

    from ibm_watsonx_ai import APIClient, Credentials
    
    credentials = Credentials(
                    url = "https://us-south.ml.cloud.mydomain.com",
                    api_key = "***********"
                    )
    
    client = APIClient(credentials)
    
  • Schaffen Sie ein Projekt oder einen Raum für Ihre Arbeit. Siehe Erstellen eines Projekts oder Erstellen eines Bereichs.

  • Abrufen der ID für das Projekt oder den Bereich. Siehe Finden der Projekt-ID.

  • Legen Sie ein Standardprojekt oder einen Standardbereich fest:

client.set.default_project("<Project ID>")
client.set.default_space("<Space GUID>")

Dokumente zur Erdung

Bereiten Sie die Erdungsunterlagen, die Sie für das RAG-Experiment verwenden werden, vor und schließen Sie sie an. Einzelheiten finden Sie unter Daten in einem Projekt abrufen und vorbereiten.

  • Unterstützte Formate: PDF, HTML, DOCX, Markdown, Nur-Text
  • Stellen Sie eine Verbindung zu Daten in einem Cloud Object Storage Bucket oder einem Ordner in einem Bucket her, oder geben Sie bis zu 20 Dateien an.
  • AutoAI verwendet eine Auswahl von Dokumenten für die Durchführung des Experiments

Zum Beispiel, um eine Datenverbindung zu erstellen, wenn Dokumente in einem Cloud Object Storage Bucket gespeichert sind:

from ibm_watsonx_ai.helpers import DataConnection, S3Location

conn_meta_props= {
    client.connections.ConfigurationMetaNames.NAME: f"Connection to input data - {datasource_name} ",
    client.connections.ConfigurationMetaNames.DATASOURCE_TYPE: client.connections.get_datasource_type_id_by_name(datasource_name),
    client.connections.ConfigurationMetaNames.DESCRIPTION: "ibm-watsonx-ai SDK documentation",
    client.connections.ConfigurationMetaNames.PROPERTIES: {
        'bucket': <BUCKET_NAME>,
        'access_key': <ACCESS_KEY>,
        'secret_key': <SECRET_ACCESS_KEY>,
        'iam_url': 'https://iam.cloud.ibm.com/identity/token',
        'url': <ENDPOINT_URL>
    }
}

conn_details = client.connections.create(meta_props=conn_meta_props)
cos_connection_id = client.connections.get_id(conn_details)

input_data_references = [DataConnection(
    connection_asset_id=cos_connection_id,
    location=S3Location(
        bucket=<BACKET_NAME>,
        path=<BACKET_PATH>
    )
)]

Das folgende Beispiel zeigt, wie Sie das im Projekt erstellte (oder in den Bereich verschobene) Daten-Asset verwenden können.

Hinweis:

core_api.html ist ein Beispiel für eine Grundlagendokumentdatei, die in den Beispiel-Notizbüchern verwendet wird.

import os, wget
from ibm_watsonx_ai.helpers import DataConnection

input_data_filename = "core_api.html"
input_data_path = f"https://ibm.github.io/watsonx-ai-python-sdk/{input_data_filename}"

if not os.path.isfile(input_data_filename): 
    wget.download(input_data_path, out=input_data_filename)
    
asset_details = client.data_assets.create(input_data_filename, input_data_filename)
asset_id = client.data_assets.get_id(asset_details)
asset_id

input_data_references = [DataConnection(data_asset_id=asset_id)]
Tipp:

input_data_references unterstützt bis zu 20 DataConnection Instanzen.

Evaluierungsdatum

  • Die Auswertungsdaten müssen im JSON-Format mit einem festen Schema mit diesen Feldern vorliegen: question, correct_answer, correct_answer_document_ids

Beispiel:

[
    {
        "question": "What is the purpose of get_token()?",
        "correct_answer": "get_token() is used to retrieve an authentication token for secure API access.",
        "correct_answer_document_ids": [
            "core_api.html"
        ]
    },
    {
        "question": "How does the delete_model() function operate?",
        "correct_answer": "delete_model() method allows users to delete models they've created or managed.",
        "correct_answer_document_ids": [
            "core_api.html"
        ]
    }
]

Zur Vorbereitung der Bewertungsdaten:

import os, wget
from ibm_watsonx_ai.helpers import DataConnection

test_data_filename = "benchmarking_data_core_api.json"
test_data_path = f"https://github.com/IBM/watsonx-ai-samples/blob/master/cloud/data/autoai_rag/{test_data_filename}"

if not os.path.isfile(test_data_filename): 
    wget.download(test_data_path, out=test_data_filename)

test_asset_details = client.data_assets.create(name=test_data_filename, file_path=test_data_filename)
test_asset_id = client.data_assets.get_id(test_asset_details)

test_data_references = [DataConnection(data_asset_id=test_asset_id)]

Schritt 2: Konfigurieren Sie den RAG-Optimierer

Das rag_optimizer Objekt bietet eine Reihe von Methoden für die Arbeit mit dem AutoAI RAG Experiment. In diesem Schritt geben Sie die Details ein, um das Experiment zu definieren. Dies sind die verfügbaren Konfigurationsoptionen:

Parameter Beschreibung Werte
Name Geben Sie einen gültigen Namen ein Name des Experiments
Beschreibung Experimentbeschreibung Optional können Sie das Experiment beschreiben
einbetten_models Modelle zum Ausprobieren einbetten ibm/slate-125m-english-rtrvr
intfloat/multilingual-e5-large
abruf_methodik Zu verwendende Abrufmethoden simple Abruf und Einstufung aller relevanten Dokumente
window Abruf und Einstufung einer festen Anzahl von relevanten Dokumenten
grundlagen_modelle Stiftungsmodelle zum Ausprobieren Siehe Stiftungsmodelle nach Aufgabe
max_number_of_rag_patterns Maximale Anzahl der zu erstellenden RAG-Muster 4-20
optimierung_metriken Name(n) der Metrik(en), die für die Optimierung verwendet werden sollen faithfulness
answer_correctness

Dieser Beispielcode zeigt die Konfigurationsoptionen für die Ausführung des Experiments mit der ibm-watsonx-ai SDK Dokumentation:

from ibm_watsonx_ai.experiment import AutoAI

experiment = AutoAI(credentials, project_id=project_id)

rag_optimizer = experiment.rag_optimizer(
    name='DEMO - AutoAI RAG ibm-watsonx-ai SDK documentation',
    description="AutoAI RAG experiment grounded with the ibm-watsonx-ai SDK documentation",
    max_number_of_rag_patterns=5,
    optimization_metrics=[AutoAI.RAGMetrics.ANSWER_CORRECTNESS]
)
Tipp: Sie können die Konfiguration mit den in der Konfigurationstabelle beschriebenen unterstützten Werten ändern.
rag_optimizer = experiment.rag_optimizer(
    name='DEMO - AutoAI RAG ibm-watsonx-ai SDK documentation',
    description="AutoAI RAG experiment grounded with the ibm-watsonx-ai SDK documentation",
    embedding_models=["ibm/slate-125m-english-rtrvr"],
    foundation_models=["ibm/granite-13b-chat-v2","mistralai/mixtral-8x7b-instruct-v01"],
    max_number_of_rag_patterns=5,
    optimization_metrics=[AutoAI.RAGMetrics.ANSWER_CORRECTNESS]
)

Schritt 3: Durchführung des Experiments

Führen Sie den Optimierer aus, um die RAG-Muster unter Verwendung der angegebenen Konfigurationsoptionen zu erstellen. In diesem Codebeispiel für die Durchführung eines Chroma-Experiments wird die Aufgabe im interaktiven Modus ausgeführt. Sie können die Aufgabe im Hintergrund laufen lassen, indem Sie das background_mode auf True setzen.

run_details = rag_optimizer.run(
    input_data_references=input_data_references,
    test_data_references=test_data_references,
    background_mode=False
)

Schritt 4: Prüfen Sie die Muster und wählen Sie das beste aus

Nachdem das AutoAI RAG-Experiment erfolgreich abgeschlossen wurde, können Sie die Muster überprüfen. Verwenden Sie die Methode " summary, um abgeschlossene Muster und Informationen zu den Bewertungsmetriken in Form eines Pandas DataFrame aufzulisten, so dass Sie die Muster in einer Rangfolge nach Leistung gegenüber der optimierten Metrik überprüfen können.

summary = rag_optimizer.summary()
summary

Die Ergebnisse werden beispielsweise wie folgt angezeigt:

Muster mittlere_Antwort_korrektheit mittlere_Treue mittlere_Kontext_Korrektheit chunking.chunk_size embeddings.model_id vector_store.distance_metric retrieval.method retrieval.number_of_chunks generation.model_id
Pattern1 0.6802 0.5407 1.0000 512 ibm/slate-125m-english-rtrvr euclidean Fenster 5 meta-llama/llama-3-70b-instruct
Pattern2 0.7172 0.5950 1.0000 1024 Zeichen. intfloat/multilingual-e5-large euclidean Fenster 5 ibm/granite-13b-chat-v2
Pattern3 0.6543 0.5144 1.0000 1024 Zeichen. intfloat/multilingual-e5-large euclidean einfach 5 ibm/granite-13b-chat-v2
Pattern4 0.6216 0.5030 1.0000 1024 Zeichen. intfloat/multilingual-e5-large Kosinus Fenster 5 meta-llama/llama-3-70b-instruct
Pattern5 0.7369 0.5630 1.0000 1024 Zeichen. intfloat/multilingual-e5-large Kosinus Fenster 3 mistralai/mixtral-8x7b-instruct-v01

Wählen Sie ein Muster für den lokalen Test

Der nächste Schritt besteht darin, ein Muster auszuwählen und es lokal zu testen. Da Chroma speicherorientiert ist, müssen Sie den Dokumentindex neu erstellen.

Tipp:

Im folgenden Codebeispiel wird der Index mit den Dokumenten core_api.html und fm_embeddings.html erstellt.

from langchain_community.document_loaders import WebBaseLoader

best_pattern = rag_optimizer.get_pattern()

urls = [
    "https://ibm.github.io/watsonx-ai-python-sdk/core_api.html",
    "https://ibm.github.io/watsonx-ai-python-sdk/fm_embeddings.html",
]
docs_list = WebBaseLoader(urls).load()
doc_splits = best_pattern.chunker.split_documents(docs_list)
best_pattern.indexing_function(doc_splits)

Das RAG-Muster lokal abfragen.

payload = {
    client.deployments.ScoringMetaNames.INPUT_DATA: [
        {
            "values": ["How to use new approach of providing credentials to APIClient?"],
        }
    ]
}

best_pattern.query(payload)

Die Antwort des Modells sieht folgendermaßen aus:

According to the document, the new approach to provide credentials to APIClient is by using the Credentials class. Here's an example:


from ibm_watsonx_ai import APIClient
from ibm_watsonx_ai import Credentials

credentials = Credentials(
                   url = "https://us-south.ml.cloud.ibm.com",
                   token = "***********",
                  )

client = APIClient(credentials)


This replaces the old approach of passing a dictionary with credentials to the APIClient constructor.
Tipp:

Um ein bestimmtes Muster abzurufen, übergeben Sie die Musternummer an rag_optimizer.get_pattern().

Überprüfung von Versuchsergebnissen in Cloud Object Storage

Wenn der endgültige Status des Experiments "fehlgeschlagen" oder "Fehler" lautet, verwenden Sie rag_optimizer.get_logs() oder lesen Sie die Ergebnisse des Experiments, um zu verstehen, was falsch gelaufen ist. Experimentergebnisse und Protokolle werden in der mit Ihrem Konto verknüpften Standardinstanz Cloud Object Storage gespeichert. Standardmäßig werden die Ergebnisse im Verzeichnis default_autoai_rag_out gespeichert.

Die Ergebnisse sind nach Mustern geordnet. Beispiel:

|-- Pattern1
|      | -- evaluation_results.json
|      | -- indexing_inference_notebook.ipynb (Chroma)
|-- Pattern2
|    ...
|-- training_status.json

Jedes Muster enthält diese Ergebnisse:

  • Die Datei evaluation_results.json enthält die Bewertungsergebnisse für jede Benchmark-Frage.
  • Der indexing_inference_notebook.ipynb enthält den Python-Code für den Aufbau des Index der Vektordatenbank sowie für die Abfrage- und Generierungsfunktion. Das Notizbuch stellt Befehle zum Abrufen von Daten, zum Chunking und zur Erstellung von Einbettungen sowie zum Abrufen von Chunks, zum Erstellen von Prompts und zum Generieren von Antworten vor.
Hinweis:

Das Ergebnisnotizbuch indexing_notebook.ipynb enthält den Code für die Einbettung und Indizierung der Dokumente. Sie können die Indizierung der Dokumente beschleunigen, indem Sie vector_store.add_documents() in vector_store.add_documents_async() ändern.

Inferenz- und Indizierungsnotizbuch abrufen

Um ein bestimmtes Inferenz-Notizbuch herunterzuladen, verwenden Sie die get_inference_notebook(). Wenn Sie pattern_name leer lassen, lädt die Methode das Notizbuch des besten berechneten Musters herunter.

rag_optimizer.get_inference_notebook(pattern_name='Pattern3')

Übergeordnetes Thema: Automatisierung eines RAG-Musters mit dem AutoAI SDK