diff --git a/dotnet/recommendation-service/Program.cs b/dotnet/recommendation-service/Program.cs index d746063c..6f8fe3ac 100644 --- a/dotnet/recommendation-service/Program.cs +++ b/dotnet/recommendation-service/Program.cs @@ -51,6 +51,12 @@ return kernel; }); +builder.Services.AddSingleton(provider => +{ + var memoryStore = new QdrantMemoryStore(Env.Var("QDRANT_ENDPOINT"), 1536, ConsoleLogger.Log); + return memoryStore; +}); + builder.Services.AddSingleton(provider => { var bingConnector = new BingConnector(Env.Var("BING_API_KEY")); diff --git a/java/user-service/src/main/java/com/microsoft/gbb/miyagi/userservice/service/OpenAIGeneratorService.java b/java/user-service/src/main/java/com/microsoft/gbb/miyagi/userservice/service/OpenAIGeneratorService.java index feb2efb9..56940cb8 100644 --- a/java/user-service/src/main/java/com/microsoft/gbb/miyagi/userservice/service/OpenAIGeneratorService.java +++ b/java/user-service/src/main/java/com/microsoft/gbb/miyagi/userservice/service/OpenAIGeneratorService.java @@ -1,9 +1,7 @@ package com.microsoft.gbb.miyagi.userservice.service; import com.azure.ai.openai.OpenAIClient; -import com.azure.ai.openai.models.Choice; -import com.azure.ai.openai.models.Completions; -import com.azure.ai.openai.models.CompletionsOptions; +import com.azure.ai.openai.models.*; import com.microsoft.gbb.miyagi.userservice.config.OpenAIConfig; import com.microsoft.gbb.miyagi.userservice.entity.Aspirations; import com.microsoft.gbb.miyagi.userservice.entity.FinancialProfile; @@ -22,6 +20,12 @@ @Service @Qualifier("openaigenerator") public class OpenAIGeneratorService implements ISyntheticGeneratorService { + private static final String META_PROMPT = """ + You are a synthetic data generator that only returns a + single response that is either a string or a number. + The number should be parsable as an integer or a double. + DO NOT RETURN ANYTHING ELSE. + """; private final OpenAIClient openAIClient; private final OpenAIConfig openAIConfig; @@ -37,7 +41,7 @@ public UserProfile generateFakeUserProfile() { userProfile.setFirstName(getCompletion("Generate a first name")); userProfile.setLastName(getCompletion("Generate a last name")); userProfile.setCity(getCompletion("Generate a city name")); - userProfile.setAge(Integer.parseInt(getCompletion("Generate a number between 18 and 65"))); + userProfile.setAge(Integer.parseInt(getCompletion("Generate a number between 18 and 65 that is parsable as integer"))); userProfile.setFinancialProfile(generateFakeFinancialProfile()); userProfile.setAspirations(generateFakeAspirations()); @@ -85,14 +89,34 @@ public List generateRandomCountryList(int count) { } private String getCompletion(String prompt) { - List promptList = new ArrayList<>(); + /* List promptList = new ArrayList<>(); + promptList.add(META_PROMPT); promptList.add(prompt); Completions completions = openAIClient.getCompletions(openAIConfig.getOpenAIModelId(), - new CompletionsOptions(promptList)); - - Choice choice = completions.getChoices().get(0); + new CompletionsOptions(promptList));*/ + List chatMessages = new ArrayList<>(); + chatMessages.add(new ChatMessage(ChatRole.SYSTEM).setContent(META_PROMPT)); + // one shot example + chatMessages.add(new ChatMessage(ChatRole.USER).setContent("Generate a name")); + chatMessages.add(new ChatMessage(ChatRole.ASSISTANT).setContent("John Doe")); + chatMessages.add(new ChatMessage(ChatRole.USER).setContent(prompt)); + + ChatCompletions chatCompletions = openAIClient.getChatCompletions(openAIConfig.getOpenAIModelId(), + new ChatCompletionsOptions(chatMessages)); + + System.out.printf("Model ID=%s is created at %d.%n", chatCompletions.getId(), chatCompletions.getCreated()); + ChatMessage message = null; + for (ChatChoice choice : chatCompletions.getChoices()) { + message = choice.getMessage(); + System.out.printf("Index: %d, Chat Role: %s.%n", choice.getIndex(), message.getRole()); + System.out.println("Message:"); + System.out.println(message.getContent()); + } +/* Choice choice = completions.getChoices().get(0); - return choice.getText().trim(); + return choice.getText().trim();*/ + assert message != null; + return message.getContent(); } } diff --git a/java/user-service/src/main/resources/application.yaml b/java/user-service/src/main/resources/application.yaml index 37fdc8d5..ad69e628 100644 --- a/java/user-service/src/main/resources/application.yaml +++ b/java/user-service/src/main/resources/application.yaml @@ -1,11 +1,6 @@ spring: application: name: user-service -openai: - key: ${AZURE_OPENAI_KEY} - endpoint: ${AZURE_OPENAI_ENDPOINT} - model: - id: ${AZURE_OPENAI_MODEL_ID} kafka: topic: name: ${KAFKATOPICNAME} @@ -43,6 +38,11 @@ openai: baseline-on-migrate: 'true' banner: location: static/banner.txt +openai: + key: ${AZURE_OPENAI_KEY} + endpoint: ${AZURE_OPENAI_ENDPOINT} + model: + id: ${AZURE_OPENAI_MODEL_ID} eureka: client: register-with-eureka: false