Personnalisez la recherche optimiste avec Azure AI et personnaliseur / blogs / perficient

Dans le dernier blog, nous avons discuté Intégration du site Web Optimizely CMS avec une recherche Azure AI. Prenons maintenant un sujet un peu plus avancé pour servir une expérience de personnalisation avec la recherche Azure AI avec Azure Personalizer. Ensemble, ils vous permettent de servir du contenu personnalisé dynamique et des résultats de recherche sur le comportement, les préférences et le contexte des utilisateurs.
Qu’est-ce que la personnalisation Azure?
Azure Personalizer Service cognitif pour une association en temps réel à l’aide d’apprentissage par renforcement. Il vous donne la possibilité de servir du contenu ou des expériences les plus pertinentes pour un utilisateur – informé par le comportement passé et le contexte actuel.
Avantages de la personnalisation de l’IA:
- Il peut donc étudier et évoluer à mesure que les gens s’engagent avec.
- Étonnamment utile pour classer les résultats de recherche.
- Peut personnaliser les appels directs à l’action, les articles mis en évidence ou les marchandises.
Comment cela fonctionne avec la recherche Azure AI et Optimizely
- L’utilisateur effectue une recherche sur votre site Optimizely.
- La recherche Azure AI donne simplement une liste de documents correspondants
- Ces documents sont envoyés à Azure Personalizer comme «actions à noter.«
- Les ordres personnalisés résultent en utilisant le contexte de l’utilisateur.
- Votre application sert des résultats personnalisés et les commentaires de l’utilisateur aident à apprendre et à évoluer davantage.
Configurer Personalizer Azure
- Accédez à Azure Portal → Création de ressources de personnalisation
- Enregistrez votre point de terminaison et votre clé API.
- À l’étape 3, spécifiez le contenu que vous souhaitez être classé (c’est-à-dire les résultats de recherche)
Code d’intégration
Modèle d’action rangable
public class RankableDocument { public string Id { get; set; } public string Title { get; set; } public string Summary { get; set; } public string Category { get; set; } }
Envoyez des informations à la personnalisation avec le contexte:
private object GetUserContext(HttpRequestBase request) { return new { timeOfDay = DateTime.Now.Hour, device = request.Browser.IsMobileDevice ? "mobile" : "desktop", userAgent = request.UserAgent, language = request.UserLanguages?.FirstOrDefault() ?? "en" }; } public async Task<List<RankableDocument>> GetPersonalizedResultsAsync(List<RankableDocument> documents, string userId) { var contextFeatures = new[] { GetUserContext(Request) }; var actions = documents.Select(doc => new { id = doc.Id, features = new[] { new { category = doc.Category }, new { title = doc.Title } } }); _eventId = Guid.NewGuid().ToString(); var request = new { contextFeatures = contextFeatures, actions = actions, excludedActions = new string[] {}, eventId = _eventId, deferActivation = false }; var client = new HttpClient(); client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "--YOUR API KEY ---"); var response = await client.PostAsync("--Endpoint--/personalizer/v1.0/rank", new StringContent(JsonSerializer.Serialize(request), Encoding.UTF8, "application/json")); var result = JsonDocument.Parse(await response.Content.ReadAsStringAsync()); var topActionId = result.RootElement.GetProperty("rewardActionId").GetString(); return documents.OrderByDescending(d => d.Id == topActionId).ToList(); }
Examinons maintenant notre exemple précédent de contrôleur de page de recherche et de voir et de l’étendre
Contrôleur de recherche
public class AzureSearchPageController : PageController<AzureSearchPage> { private static string _eventId; public async Task<ActionResult> Index(AzureSearchPage currentPage, string q = "") { var results = new List<RankableDocument>(); if (!string.IsNullOrEmpty(q)) { var url = $"https://<search-service>.search.windows.net/indexes/<index-name>/docs?api-version=2021-04-30-Preview&search={q}"; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("api-key", "<your-query-key>"); var response = await client.GetStringAsync(url); var doc = JsonDocument.Parse(response); results = doc.RootElement.GetProperty("value") .EnumerateArray() .Select(x => new RankableDocument { Id = x.GetProperty("id").GetString(), Title = x.GetProperty("name").GetString(), Category = x.GetProperty("type").GetString(), Summary = x.GetProperty("content").GetString() }).ToList(); results = await GetPersonalizedResultsAsync(results, "user123"); } ViewBag.Results = results; ViewBag.Query = q; ViewBag.EventId = _eventId; return View(currentPage); } [HttpPost] public async Task<ActionResult> Reward(string eventId, double rewardScore) { using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "<your-api-key>"); var rewardUrl = $"<your-endpoint>/personalizer/v1.0/events/{eventId}/reward"; var result = await client.PostAsync(rewardUrl, new StringContent(rewardScore.ToString(), Encoding.UTF8, "application/json")); return Json(new { success = result.IsSuccessStatusCode }); } }
Affichage de la page de recherche
@model AzureSearchPage <h1>Personalized Search Results</h1> <form method="get"> <input type="text" name="q" value="@ViewBag.Query" placeholder="Search..." /> <button type="submit">Search</button> </form> <ul> @foreach (var result in ViewBag.Results as List<RankableDocument>) { <li> <h4>@result.Title</h4> <p>@result.Summary</p> <button onclick="sendReward('@ViewBag.EventId', 1.0)">Like</button> <button onclick="sendReward('@ViewBag.EventId', 0.0)">Not Relevant</button> </li> } </ul> <script> function sendReward(eventId, score) { fetch('/AzureSearchPage/Reward', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ eventId: eventId, rewardScore: score }) }).then(r => { if (r.ok) alert("Thanks! Your feedback was recorded."); }); } </script>
Avec Azure AI Search Livrant des résultats pertinents et les personnaliseurs Azure les recommandant en fonction du contexte en temps réel, votre site Optimizely devient un moteur d’expérience intelligent.
Ce blog a également été publié ici.
Source link