in gemini/sample-apps/fixmycar/backend/src/main/java/com/cpet/fixmycarbackend/FixMyCarBackendController.java [77:126]
public ChatMessage ragVertexAISearch(ChatMessage message) {
// ⭐ Step 1 - Search
logger.info("⭐ project Id: " + projectId);
String location = "global";
String collectionId = "default_collection";
logger.info("⭐ Datastore ID is: " + datastoreId);
String servingConfigId = "default_search";
String searchQuery = message.getPrompt();
logger.info("⭐ Datastore query: " + searchQuery);
// Note - discoveryengine is the underlying API for Vertex AI Search
String endpoint = String.format("discoveryengine.googleapis.com:443", location);
String vectorSearchResults = "";
try {
SearchServiceSettings settings = SearchServiceSettings.newBuilder().setEndpoint(endpoint).build();
SearchServiceClient searchServiceClient = SearchServiceClient.create(settings);
SearchRequest request = SearchRequest.newBuilder()
.setServingConfig(
ServingConfigName.formatProjectLocationCollectionDataStoreServingConfigName(
projectId, location, collectionId, datastoreId, servingConfigId))
.setQuery(searchQuery)
.setPageSize(10)
.build();
SearchResponse response = searchServiceClient.search(request).getPage().getResponse();
// Note - the Vertex AI Search API response is tricky to parse because
// it's a
// proto-based object (not JSON / REST response)
List<SearchResult> resultsList = response.getResultsList();
logger.info("🔍 Found " + resultsList.size() + " results.");
for (SearchResponse.SearchResult element : resultsList) {
Struct derivedStructData = element.getDocument().getDerivedStructData();
Map<String, Value> fields = derivedStructData.getFieldsMap();
Value extractiveAnswersValue = fields.get("extractive_answers");
ListValue listValue = extractiveAnswersValue.getListValue();
Value firstValue = listValue.getValues(0);
Struct structValue = firstValue.getStructValue();
Map<String, Value> innerFields = structValue.getFieldsMap();
Value contentValue = innerFields.get("content");
String stringValue = contentValue.getStringValue();
vectorSearchResults += stringValue;
}
} catch (Exception e) {
logger.error("⚠️ Vertex AI Search Error: " + e);
}
// ⭐ Step 2 - Inference w/ augmented prompt
logger.info("🔍 Vertex AI Search results: " + vectorSearchResults);
String result = geminiInference(message.getPrompt(), vectorSearchResults);
message.setResponse(result);
return message;
}