Migrieren Sie die Redis-Vector-Demos zu einem gemeinsamen Azure AI Search-Index.
Verlegen die LangGraph-Vektorabfrage von den Redis-Demos in einen gemeinsamen Azure AI Search-Index: Deklarieren Sie das Schema, filtern Sie nach Sitzung, löschen Sie mithilfe von Abfragen und behalten Sie die anderen Benutzer bei.
Warum Redis nicht das Endziel war
Die lokale Vektorsuche von Redis eignet sich hervorragend für Laptop-Demos. Geteilte Umgebungen, suchfunktionale SLAs sowie authentifizierende Mechanismen, die speziell für Azure entwickelt wurden, führen Teams zu Azure AI Search. Bei dieser Migration bleibt der LangGraph-Pipeline-Strang erhalten, während nur der Vektor-Backend ausgetauscht wird.
Klassische AI-Suche im Vergleich zu diesem Ansatz
Bei der klassischen Schlagwortsuche wird die lexikalische Überschneidung berücksichtigt. Der migrierte Ansatz speichert Embeddings neben dem Text und führt Suchanfragen anhand der semantischen Ähnlichkeit durch – gegebenenfalls in Kombination mit Filtern. Azure AI Search wird somit zur zentralen, verwalteten Plattform für diese Vektoren.
Die entscheidende Wahl: geteilter Index oder Index pro Sitzung
Redis-Demos erstellen oft einen einmaligen Index pro Sitzung. Azure AI Search bevorzugt einen gemeinsamen Index mit einem Filterfeld für Sitzung (oder Mieter). Ein ganzen Index zu löschen, um eine Sitzung „zu leeren“, ist das falsche Mittel; Löschen über Filter ist die richtige Methode.
uv add langgraph langchain-core langchain-openai langchain-text-splitters \
azure-ai-documentintelligence azure-core \
langchain-redis redisvl \
python-dotenv
def get_vector_store() -> AzureSearch:
global _vector_store
if _vector_store is None:
_vector_store = AzureSearch(
azure_search_endpoint=config.AZURE_SEARCH_ENDPOINT,
azure_search_key=config.AZURE_SEARCH_API_KEY,
index_name=config.AZURE_SEARCH_INDEX_NAME,
embedding_function=embeddings,
fields=_FIELDS,
vector_search_dimensions=config.EMBEDDING_DIMENSIONS,
)
return _vector_store
_FIELDS = [
SimpleField(name="id", type=SearchFieldDataType.String, key=True, filterable=True),
SearchableField(name="content", type=SearchFieldDataType.String),
SearchField(
name="content_vector",
type="Collection(Edm.Single)",
searchable=True,
vector_search_dimensions=config.EMBEDDING_DIMENSIONS,
vector_search_profile_name="myHnswProfile",
),
SearchableField(name="metadata", type=SearchFieldDataType.String),
SimpleField(name="session_id", type=SearchFieldDataType.String, filterable=True),
SimpleField(name="file_name", type=SearchFieldDataType.String, filterable=True),
SimpleField(name="chunk_index", type=SearchFieldDataType.Int32, filterable=True, sortable=True),
]
state["retrieved"] = vs.similarity_search(
state["query"],
k=config.TOP_K,
filters=f"session_id eq '{state['session_id']}'",
)
def clear_session(session_id: str) -> None:
vs = get_vector_store()
results = vs.client.search(
search_text="*",
filter=f"session_id eq '{session_id}'",
select=["id"],
)
ids = [r["id"] for r in results]
if ids:
vs.delete(ids=ids)
az search service create \
--name "$SEARCH_SERVICE_NAME" \
--resource-group "$RESOURCE_GROUP" \
--location "$LOCATION" \
--sku basic \
--partition-count 1 \
--replica-count 1
SEARCH_ADMIN_KEY=$(az search admin-key show \
--resource-group "$RESOURCE_GROUP" \
--service-name "$SEARCH_SERVICE_NAME" \
--query primaryKey -o tsv)
AZURE_OPENAI_ENDPOINT=https://aif-cus-aisearchegs-dev-01.cognitiveservices.azure.com/
AZURE_OPENAI_API_KEY=<<redacted>>
# AZURE_OPENAI_API_VERSION = os.environ.get("AZURE_OPENAI_API_VERSION", "2024-10-21")
AZURE_OPENAI_EMBEDDING_DEPLOYMENT=text-embedding-3-small
AZURE_OPENAI_CHAT_DEPLOYMENT="gpt-5-mini"
# --- Azure Document Intelligence (used for all file text extraction) ---
DOCUMENTINTELLIGENCE_ENDPOINT=https://adi-cus-aisearchegs-dev-01.cognitiveservices.azure.com/
DOCUMENTINTELLIGENCE_KEY=<<redacted>>
AZURE_SEARCH_ENDPOINT=https://ais-cus-aisearchegs-dev-01.search.windows.net
AZURE_SEARCH_API_KEY=<<redacted>>
AZURE_SEARCH_INDEX_NAME=chat-file-search-index
azure.core.exceptions.HttpResponseError: The vector field 'content_vector'
must have the properties 'dimensions' and 'vectorSearchConfiguration' set.
TypeError: Object of type float32 is not JSON serializable
from azure.search.documents._utils.model_base import SdkJSONEncoder
_original_default = SdkJSONEncoder.default
def _numpy_safe_default(self, o):
if isinstance(o, np.floating):
return float(o)
if isinstance(o, np.integer):
return int(o)
return _original_default(self, o)
SdkJSONEncoder.default = _numpy_safe_default
uv run python -m aisearchmanualvectorization.main \
--session demo1 \
--files ./source/sample_bank_statement.pdf ./source/sample_loan_agreement.pdf
uv run python -m aisearchmanualvectorization.main \
--session demo1 \
--query "What's the overdraft protection fee?"
A: The overdraft protection transfer fee is $10.00 per occurrence.
Sources:
- sample_bank_statement.pdf (chunk 7): Overdraft Protection...
- sample_bank_statement.pdf (chunk 8): Interest Rate & Annual Percentage Yield...
- sample_bank_statement.pdf (chunk 9): Monthly Maintenance Fee...
- sample_bank_statement.pdf (chunk 3): <td>-$10.44</td> <td>$8,096.52</td>...
Schritt für Schritt: Was hat sich im Code geändert
get_vector_store() – nicht mehr sessionspezifisch
Es wird ein Client zurückgegeben, der an einen gemeinsamen Indexnamen gebunden ist. Die Sitzungsisolation erfolgt über Metadatenfilter und nicht über separate Indexe.
Das Feldschema – explizit deklariert
Vektordimensionen, Inhaltselemente sowie filterbare Sitzungs IDs werden im Voraus definiert. Stille Standardwerte, die in Redis funktionierten, entsprechen nicht den Feldtypen von Azure AI Search.
retrieve_node – ein String-Filter anstelle eines Filter-Objekts
Verwenden Sie session_id eq '…' (oder den entsprechenden OData-Filter), damit die Daten eines Benutzers nicht in die Ergebnisse eines anderen gelangen.
clear_session() – Löschung per Abfrage, nicht durch Entfernen des Index
Führen Sie eine gefilterte Löschung für den Session-Schlüssel durch. Die Neuerstellung von Indizes pro Session überschreitet die Servicegrenzen und verlangsamt den Startvorgang.
Migrations-Checkliste
- Stellen Sie sicher, dass die Embedding-Dimension mit dem Index-Vektorfeld übereinstimmt
- Embedden Sie erneut nur, wenn sich das Embedding-Modell geändert hat; andernfalls fügen Sie die vorhandenen Daten erneut hinzu
- Führen Sie vor dem Umstieg Redis und Azure AI Search mit Beispielfragen gleichzeitig aus
- Verlegen Sie Geheimnisse soweit möglich in Key Vault oder verwaltete Identitäten
- aktualisieren Sie die Runbooks: Keine Annahmen mehr wie „docker restart redis clears state“
Ergebnisse und Kompromisse
Azure AI Search bietet verwaltete Skalierbarkeit, Portaltools sowie RBAC-Funktionen. Zudem kommen Vorlaufzeiten für die Bereitstellung sowie Einschränkungen durch das gemeinsame Indexdesign hinzu. Bei dem PDF-Q&A-Graphen blieb der Knotengraph stabil; nur der Store-Adapter und der Session-Lebenszyklus änderten sich.
Fazit
Betrachten Sie Redis als Hilfsräder und Azure AI Search als Straßenreifen. Bewahren Sie die Sitzungsisolation in den Filtern, deklarieren Sie das Schema explizit und löschen Sie Daten über Abfragen. Die LangGraph-Orchestrierung sollte kaum etwas bemerken – falls doch, war die Abstraktion zu undicht.
Tipp für den Umstieg: Lassen Sie Redis eine Woche lang nur zum Lesen zugänglich, während Azure AI Search den Produktivverkehr bedient, und vergleichen Sie die Top-3-Überschneidungen im Referenzfragenkatalog. Sinkt die Überschneidung, prüfen Sie zuerst die Filterklauseln und Feldnamen, bevor Sie das Embedding-Modell dafür verantwortlich machen. Die meisten Rückfälle bei dieser Migrationsmethode sind Filterfehler, keine Fehler in der Vektorrechnung.
Tipp zur Umstellung: Lassen Sie Redis eine Woche lang nur für Leszugriffe genutzt werden, während Azure AI Search den Produktivverkehr abwickelt, und vergleichen Sie dabei die Überschneidung der Top-3-Ergebnisse im Referenzfragenkatalog. Sinkt die Überschneidung, prüfen Sie zunächst die Filterklauseln und Feldnamen, bevor Sie das Embedding-Modell dafür verantwortlich machen. Die meisten Rückfälle bei dieser Migrationsmethode sind Filterfehler und keine Fehler in der Vektorrechnung.
Tipp zur Umstellung: Lassen Sie Redis eine Woche lang nur für Leszugriffe genutzt werden, während Azure AI Search den Produktivverkehr abwickelt, und vergleichen Sie dabei die Überschneidung der Top-3-Ergebnisse im Referenzfragenkatalog. Sinkt die Überschneidung, prüfen Sie zunächst die Filterklauseln und Feldnamen, bevor Sie das Embedding-Modell dafür verantwortlich machen. Die meisten Rückfälle bei dieser Migrationsmethode sind Filterfehler und keine Fehler in der Vektorrechnung.
Tipp zur Umstellung: Lassen Sie Redis eine Woche lang nur für Leszugriffe genutzt werden, während Azure AI Search den Produktivverkehr abwickelt, und vergleichen Sie dabei die Überschneidung der Top-3-Ergebnisse im Referenzfragenkatalog. Sinkt die Überschneidung, prüfen Sie zunächst die Filterklauseln und Feldnamen, bevor Sie das Embedding-Modell dafür verantwortlich machen. Die meisten Rückfälle bei dieser Migrationsmethode sind Filterfehler und keine Fehler in der Vektorrechnung.
Tipp zur Umstellung: Lassen Sie Redis eine Woche lang nur für Leszugriffe genutzt werden, während Azure AI Search den Produktivverkehr abwickelt, und vergleichen Sie dabei die Überschneidung der Top-3-Ergebnisse im Referenzfragenkatalog. Sinkt die Überschneidung, prüfen Sie zunächst die Filterklauseln und Feldnamen, bevor Sie das Embedding-Modell dafür verantwortlich machen. Die meisten Rückfälle bei dieser Migrationsmethode sind Filterfehler und keine Fehler in der Vektorrechnung.
Tipp zur Umstellung: Lassen Sie Redis eine Woche lang nur für Leszugriffe genutzt werden, während Azure AI Search den Produktivverkehr abwickelt, und vergleichen Sie dabei die Überschneidung der Top-3-Ergebnisse im Referenzfragenkatalog. Sinkt die Überschneidung, prüfen Sie zunächst die Filterklauseln und Feldnamen, bevor Sie das Embedding-Modell dafür verantwortlich machen. Die meisten Rückfälle bei dieser Migrationsmethode sind Filterfehler und keine Fehler in der Vektorrechnung.
Tipp zur Umstellung: Lassen Sie Redis eine Woche lang nur für Leszugriffe genutzt werden, während Azure AI Search den Produktivverkehr abwickelt, und vergleichen Sie dabei die Überschneidung der Top-3-Ergebnisse im Referenzfragenkatalog. Sinkt die Überschneidung, prüfen Sie zunächst die Filterklauseln und Feldnamen, bevor Sie das Embedding-Modell dafür verantwortlich machen. Die meisten Rückfälle bei dieser Migrationsmethode sind Filterfehler und keine Fehler in der Vektorrechnung.
Tipp zur Umstellung: Lassen Sie Redis eine Woche lang nur für Leszugriffe genutzt werden, während Azure AI Search den Produktivverkehr abwickelt, und vergleichen Sie dabei die Überschneidung der Top-3-Ergebnisse im Referenzfragenkatalog. Sinkt die Überschneidung, prüfen Sie zunächst die Filterklauseln und Feldnamen, bevor Sie das Embedding-Modell dafür verantwortlich machen. Die meisten Rückfälle bei dieser Migrationsmethode sind Filterfehler und keine Fehler in der Vektorrechnung.
Tipp zur Umstellung: Lassen Sie Redis eine Woche lang nur für Leszugriffe genutzt werden, während Azure AI Search den Produktivverkehr abwickelt, und vergleichen Sie dabei die Überschneidung der Top-3-Ergebnisse im Referenzfragenkatalog. Sinkt die Überschneidung, prüfen Sie zunächst die Filterklauseln und Feldnamen, bevor Sie das Embedding-Modell dafür verantwortlich machen. Die meisten Rückfälle bei dieser Migrationsmethode sind Filterfehler und keine Fehler in der Vektorrechnung.
Tipp zur Umstellung: Lassen Sie Redis eine Woche lang nur für Leszugriffe genutzt werden, während Azure AI Search den Produktivverkehr abwickelt, und vergleichen Sie dabei die Überschneidung der Top-3-Ergebnisse im Referenzfragenkatalog. Sinkt die Überschneidung, prüfen Sie zunächst die Filterklauseln und Feldnamen, bevor Sie das Embedding-Modell dafür verantwortlich machen. Die meisten Rückfälle bei dieser Migrationsmethode sind Filterfehler und keine Fehler in der Vektorrechnung.
Tipp zur Umstellung: Lassen Sie Redis eine Woche lang nur für Leszugriffe genutzt werden, während Azure AI Search den Produktivverkehr abwickelt, und vergleichen Sie dabei die Überschneidung der Top-3-Ergebnisse im Referenzfragenkatalog. Sinkt die Überschneidung, prüfen Sie zunächst die Filterklauseln und Feldnamen, bevor Sie das Embedding-Modell dafür verantwortlich machen. Die meisten Rückfälle bei dieser Migrationsmethode sind Filterfehler und keine Fehler in der Vektorrechnung.
Die Struktur der Disziplin ist zweimal wichtig: einmal bei der Erstellung des Azure AI Search-Index und erneut beim Aufrüsten des Embedding-Modells. Abweichungen in den Dimensionen führen zu offensichtlichen Fehlern; Abweichungen bei filterbaren Feldern zeigen sich nur als leere Ergebnismengen. Fügen Sie eine Startüberprüfung hinzu, die die Indexdefinition liest und die Vekordimensionen sowie die Namen der Sitzungsfelder mit der laufenden Konfiguration vergleicht.