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.
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
- Anmeldeinformationen für die Aufgabe hinzufügen. Siehe Hinzufügen von Anmeldeinformationen für Aufgaben.
- Fügen Sie den watsonx.ai Runtime-Dienst hinzu. Siehe Dienste erstellen.
- Geben Sie Ihren API-Schlüssel ein. Siehe Verwalten des Benutzer-API-Schlüssels.
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.
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)]
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 Dokumentewindow 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]
)
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.
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.
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.
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