Azure RAG-App: Inkonsistente Abfrageergebnisse mithilfe der JSON-Array-Analyse mit Azure Cognitive SearchJava

Java-Forum
Guest
 Azure RAG-App: Inkonsistente Abfrageergebnisse mithilfe der JSON-Array-Analyse mit Azure Cognitive Search

Post by Guest »

Ich erstelle eine Azure Retrieval-Augmented Generation (RAG)-Anwendung mit Azure Cognitive Search, um in JSON-Dateien gespeicherte Daten zu Auszubildenden zu verarbeiten. Hier ist der allgemeine Arbeitsablauf:
  • Datenstruktur: Jede JSON-Datei stellt einen Plan dar (z. B. free-trainees-project-data. json, premium-trainees-project-data.json). Unten finden Sie eine Beispielstruktur:

Code: Select all

[
{
"overview": "The user John Doe (UUID: 00000000-0000-0000-0000-000000000001) has subscribed to the plan 'Free' starting from 2024-07-08 00:00:00.0. The user isn't associated with any tracks or projects.",
"user_name": "John Doe",
"user_uuid": "00000000-0000-0000-0000-000000000001",
"plan_start_date": "2024-07-08 00:00:00.0",
"plan_name": "Free",
"tracks": []
},
{
"overview": "The user Jane Smith (UUID: 00000000-0000-0000-0000-000000000002) has subscribed to the plan 'Free' starting from 2024-02-21 00:00:00.0. The user is associated with the following skill tracks: Track 'Quality Assurance' includes the following projects: [Project 'Sample Project A' (UUID: 00000000-0000-0000-0000-000000000003) has tags [[\"TESTNG\",\"Postman\"]], difficulty level 'intermediate', and is currently 'In Progress'. It is led by Team Lead ABC, started on 2024-06-06 08:14:06.758, and ended on Ongoing. ]",
"user_name": "Jane Smith",
"user_uuid": "00000000-0000-0000-0000-000000000002",
"plan_start_date": "2024-02-21 00:00:00.0",
"plan_name": "Free",
"tracks": [
{
"track_name": "Quality Assurance",
"projects": [
{
"project_name": "Sample Project A",
"project_uuid": "00000000-0000-0000-0000-000000000003",
"project_tags": "[\"TESTNG\",\"Postman\"]",
"team_lead": "Team Lead ABC",
"joining_date": "2024-06-06 08:14:06.758",
"project_difficulty": "intermediate",
"project_status": "In Progress",
"updated_by": "Team Lead ABC",
"exit_date": "Ongoing"
}
]
}
]
},
...

]
  • Azure-Workflow:
  • Laden Sie JSON-Dateien in einen Azure Storage-Container hoch.
  • Konfigurieren Sie Azure Cognitive Search so, dass das JSON-Array im JSON-Array-Analysemodus analysiert wird.< /p>
  • Übersicht vektorisieren Feld unter Verwendung des Modells text-embedding-ada-003.
  • Problem: Abfragen geben unzuverlässige Ergebnisse zurück Ergebnisse. Beispiel:
  • Abfrage: „Benutzer im Starter-Plan ohne Tracks oder Projekte auflisten“
  • Erwartet: Eine Liste von Benutzern, die diese Bedingung erfüllen.
  • Tatsächlich: Falsche Benutzer oder eine unvollständige Liste.
  • Abfrage: „Zählen Sie die Anzahl der Benutzer, die den kostenlosen Plan abonniert haben.“
  • Erwartet: Genaue Zählung.

    Tatsächlich: Es wird eine falsche Anzahl zurückgegeben.
Schritte Aufgenommen:
  • Überprüfte JSON-Struktur und -Analyse Modus.
  • Verwendete Übersicht als Vektorisierungsziel.
  • Überprüfte die Verbindung zwischen Azure Search und OpenAI-Diensten.
Fragen:
  • Strukturiere ich meine JSON-Daten oder den Vektorisierungsprozess? falsch?
  • Wie kann ich die Abfragegenauigkeit für solche Anwendungsfälle verbessern?
Umgebungsdetails:
3. Azure Cognitive Search mit OpenAI-Integration.
4. Modell: text-embedding-ada-003.
Mein Code:

Code: Select all

 @Override
public Flux getOpenAIAsyncClientChatStream(
ModelConfiguration modelConfiguration, List  messages) {

AIChatModel aiChatModel = modelConfiguration.getModel();

OpenAIAsyncClient openAIAsyncClient =
new OpenAIClientBuilder()
.credential(new AzureKeyCredential(aiChatModel.getApiKey()))
.endpoint(aiChatModel.getEndpoint())
.buildAsyncClient();

ChatCompletionsOptions chatCompletionsOptions = new ChatCompletionsOptions(messages);
chatCompletionsOptions.setMaxTokens(aiChatModel.getMaxTokens());
chatCompletionsOptions.setTemperature(Double.valueOf(aiChatModel.getTemperature()));

if (modelConfiguration.getDataIngestion()) {
AzureSearchChatExtensionParameters searchParameters =
getAzureSearchChatExtensionParameters(modelConfiguration);
AzureSearchChatExtensionConfiguration searchChatExtension =
new AzureSearchChatExtensionConfiguration(searchParameters);
chatCompletionsOptions.setDataSources(List.of(searchChatExtension));
}

return openAIAsyncClient.getChatCompletionsStream(
aiChatModel.getDeploymentName(), chatCompletionsOptions);
}

private AzureSearchChatExtensionParameters getAzureSearchChatExtensionParameters(
ModelConfiguration modelConfiguration) {
AzureIndex index = modelConfiguration.getIndex();
OnYourDataApiKeyAuthenticationOptions authenticationOptions =
new OnYourDataApiKeyAuthenticationOptions(searchApiKey);
AzureSearchChatExtensionParameters searchParameters =
new AzureSearchChatExtensionParameters(searchEndpoint, index.getIndexName());
searchParameters.setAuthentication(authenticationOptions);
searchParameters.setTopNDocuments(index.getTopNDocuments());
searchParameters.setSemanticConfiguration(index.getSemanticConfiguration());
searchParameters.setQueryType(AzureSearchQueryType.VECTOR_SEMANTIC_HYBRID);
searchParameters.setInScope(index.getInScope());
OnYourDataDeploymentNameVectorizationSource embeddingSource =
new OnYourDataDeploymentNameVectorizationSource(index.getTextEmbeddingModel());
searchParameters.setEmbeddingDependency(embeddingSource);
return searchParameters;
}
Mein Azure Index JSON:

Code: Select all

 {
"name": "all-trainees-json-index-production",
"fields": [
{
"name": "chunk_id",
"type": "Edm.String",
"key": true,
"retrievable": true,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": true,
"facetable": false,
"analyzer": "keyword",
"synonymMaps": []
},
{
"name": "parent_id",
"type": "Edm.String",
"key": false,
"retrievable": true,
"stored": true,
"searchable": false,
"filterable": true,
"sortable": false,
"facetable": false,
"synonymMaps": []
},
{
"name": "chunk",
"type": "Edm.String",
"key": false,
"retrievable": true,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
},
{
"name": "title",
"type": "Edm.String",
"key": false,
"retrievable": true,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
},
{
"name": "text_vector",
"type": "Collection(Edm.Single)",
"key": false,
"retrievable": true,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": [],
"dimensions": 3072,
"vectorSearchProfile":  "all-trainees-json-index-production-azureOpenAi-text-profile"
},
{
"name": "user_name",
"type": "Edm.String",
"key": false,
"retrievable": true,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
},
{
"name": "user_uuid",
"type": "Edm.String",
"key": false,
"retrievable": true,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
},
{
"name": "plan_start_date",
"type": "Edm.DateTimeOffset",
"key": false,
"retrievable": true,
"stored": true,
"searchable": false,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
},
{
"name": "plan_name",
"type": "Edm.String",
"key": false,
"retrievable": true,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
},
{
"name": "tracks",
"type": "Collection(Edm.ComplexType)",
"fields": [
{
"name": "track_name",
"type": "Edm.String",
"key": false,
"retrievable": true,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
},
{
"name": "projects",
"type": "Collection(Edm.ComplexType)",
"fields": [
{
"name": "project_name",
"type": "Edm.String",
"key": false,
"retrievable": true,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
},
{
"name": "project_uuid",
"type": "Edm.String",
"key": false,
"retrievable": true,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
},
{
"name": "project_tags",
"type": "Edm.String",
"key": false,
"retrievable": true,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
},
{
"name": "team_lead",
"type": "Edm.String",
"key": false,
"retrievable": true,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
},
{
"name":  "joining_date",
"type": "Edm.String",
"key": false,
"retrievable": true,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
},
{
"name": "project_difficulty",
"type": "Edm.String",
"key": false,
"retrievable": true,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
},
{
"name": "project_status",
"type": "Edm.String",
"key": false,
"retrievable": true,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
},
{
"name": "updated_by",
"type": "Edm.String",
"key": false,
"retrievable": true,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
},
{
"name": "exit_date",
"type": "Edm.String",
"key": false,
"retrievable": true,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
}
]
}
]
},
{
"name": "AzureSearch_DocumentKey",
"type": "Edm.String",
"key": false,
"retrievable": false,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
},
{
"name": "metadata_storage_content_type",
"type": "Edm.String",
"key": false,
"retrievable": false,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
},
{
"name": "metadata_storage_size",
"type": "Edm.Int64",
"key": false,
"retrievable": false,
"stored": true,
"searchable": false,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
},
{
"name": "metadata_storage_last_modified",
"type": "Edm.DateTimeOffset",
"key": false,
"retrievable": false,
"stored": true,
"searchable": false,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
},
{
"name": "metadata_storage_content_md5",
"type": "Edm.String",
"key": false,
"retrievable": false,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": false,
"facetable":  false,
"synonymMaps": []
},
{
"name": "metadata_storage_name",
"type": "Edm.String",
"key": false,
"retrievable": false,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
},
{
"name": "metadata_storage_path",
"type": "Edm.String",
"key": false,
"retrievable": false,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
},
{
"name": "metadata_storage_file_extension",
"type": "Edm.String",
"key": false,
"retrievable": false,
"stored": true,
"searchable": true,
"filterable": false,
"sortable": false,
"facetable": false,
"synonymMaps": []
}
],
"scoringProfiles": [],
"suggesters": [],
"analyzers": [],
"tokenizers": [],
"tokenFilters": [],
"charFilters": [],
"normalizers": [],
"similarity": {
"@odata.type": "#Microsoft.Azure.Search.BM25Similarity"
},
"semantic": {
"defaultConfiguration": "all-trainees-json-index-production-semantic-configuration",
"configurations": [
{
"name": "all-trainees-json-index-production-semantic-configuration",
"prioritizedFields": {
"titleField": {
"fieldName": "title"
},
"prioritizedContentFields": [
{
"fieldName": "chunk"
}
],
"prioritizedKeywordsFields": []
}
}
]
},
"vectorSearch": {
"algorithms": [
{
"name": "all-trainees-json-index-production-algorithm",
"kind": "hnsw",
"hnswParameters": {
"m": 4,
"efConstruction": 400,
"efSearch": 500,
"metric": "cosine"
}
}
],
"profiles": [
{
"name": "all-trainees-json-index-production-azureOpenAi-text-profile",
"algorithm": "all-trainees-json-index-production-algorithm",
"vectorizer": "all-trainees-json-index-production-azureOpenAi-text-vectorizer"
}
],
"vectorizers": [
{
"name": "all-trainees-json-index-production-azureOpenAi-text-vectorizer",
"kind": "azureOpenAI",
"azureOpenAIParameters": {
"resourceUri": "https://custom-test-sample-openai.openai.azure.com",
"deploymentId": "text-embedding-3-large",
"apiKey": "",
"modelName": "text-embedding-3-large"
}
}
],
"compressions": []
},
"@odata.etag": "\"0x8DD28A373EA1D3C\""
}
Daten importieren und vektorisieren
Ich verwende den Parsing-Modus als JSON-Array
Image

Ich verwende die Übersichtsspalte für die Vektorisierung
Image

Wie meine Indextabelle aussieht
Image

Jeder Einblick oder Vorschlag ist sehr willkommen!

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post