Opérations CRUD avec des entités dans DialogFlow (C #)

introduction


Plus récemment, j'ai commencé à travailler sur un nouveau projet, qui comprenait la collaboration avec le service déjà connu de Google (AI) - DialogFlow. L'essentiel, c'est que nous avions un bot (Telegram) qui fonctionnait avec l'API de plusieurs sites, et DialogFlow lui-même nous a aidés à structurer la communication même avec une personne, pour laquelle il a été essentiellement créé. Je dois dire que l'article est destiné aux personnes qui viennent de commencer à se familiariser avec le service ou qui ont déjà peu d'expérience, donc les termes suivants sont possibles: Intention, Context, Action, Event, et pour ce que nous avons rassemblé pour le bien de - Entités. J'espère que l'article sera utile à ceux qui n'ont pas compris un peu comment exactement à travers le code les opérations CRUD avec les entités peuvent être faites.

Entités dans DialogFlow


Dans les entités DialogFlow, certaines entités sont constituées de ReferenceValue et de synonymes. Quelque chose de similaire à une valeur-clé, à la seule différence qu'il peut y avoir de nombreux synonymes, et plus il y en a, mieux c'est, car cela "simplifie la vie du bot" et il est plus facile pour lui de comprendre quelle valeur est en question maintenant, et la coche La correspondance floue aidera le bot à comprendre également ce qui est en jeu, même si vous manquez une lettre ou un autre symbole. Cela ressemble à ceci:

Moscou - Moscou, Moscou, Moscou ...

En terminant une courte excursion, je voudrais ajouter que c'est avec Entity qu'il y a beaucoup de bruit. Bien sûr, je ne réduis pas le sens des intentions, etc., mais le fait demeure.

EntityTypes


Voici le premier, quoique petit, piège pour moi. Après tout, la documentation a des méthodes pour travailler avec Entity, et il existe des méthodes pour travailler avec EntityType - laquelle est quoi?

En fait, tout n'est pas si compliqué, juste la confusion vient du fait que dans DialogFlow lui-même, l'onglet avec EntityTypes s'appelle Entities:

image

EntityType: image

Entitie: image

Bien que DialogFlow lui-même pense qu'il existe une entité et qu'il a des entrées (c.-à-d. L'essence et les entrées en elle).

Allons-nous en.

Vous pouvez créer un EntityType manuellement directement sur DialoFlow, mais je vais montrer comment cela peut être fait via le code (après tout, pour créer des Entités, nous aurons besoin de savoir dans quel EntityType cela doit être fait).

Tout d'abord, activez le package NuGet Google.Cloud.Dialogflow.V2. Au moment de l'écriture, la version 1.1.0 était installée:

image

Nous créons d'abord une classe et nous l'appelons EntityTypeManagement qui contiendra les opérations de base:

using Google.Api.Gax;
using Google.Cloud.Dialogflow.V2;

public class EntityTypeManagement
    {
      //Create -   EntityType   Test1 (  ) 
      //projectId - Id    DialogFlow
      //displayName -         
        public async Task Create(string projectId, string displayName, EntityType.Types.Kind kind = 
      EntityType.Types.Kind.Map)
        {
            var client = await EntityTypesClient.CreateAsync();

            var entityType = new EntityType();
            entityType.DisplayName = displayName;
            entityType.Kind = kind;

            var createdEntityType = client.CreateEntityType(
                parent: new ProjectAgentName(projectId),
                entityType: entityType
            );

            Console.WriteLine($"Created EntityType: {createdEntityType.Name}");
        }
       
      //List -   EntityTypes   
      //projectId - Id    DialogFlow
        public async Task<PagedEnumerable<ListEntityTypesResponse,EntityType>> List(string projectId)
        {
            var client = await EntityTypesClient.CreateAsync();
            var response = client.ListEntityTypes(
                parent: new ProjectAgentName(projectId)
            );
            return response;
        }

       //GetEntityTypeId -  EntityType  
       //projectId - Id    DialogFlow
       //targetEventTypeName -  EntityType,    
        public async Task<string> GetEntityTypeId(string projectId,string targetEventTypeName)
        {
            var client = await EntityTypesClient.CreateAsync();
            var response = client.ListEntityTypes(
                parent: new ProjectAgentName(projectId)
            );
            string id = response.Where(x => x.DisplayName == targetEventTypeName).FirstOrDefault().Name;
            string returningId = id.Replace($"projects/{projectId}/agent/entityTypes/", "");
            return returningId;
        }

       //Delete  BatchDelete      EntityType
       //   entityTypeId
        public async Task Delete(string projectId, string entityTypeId)
        {
            var client = await EntityTypesClient.CreateAsync();

            client.DeleteEntityType(new EntityTypeName(projectId, entityTypeId: entityTypeId));

            Console.WriteLine($"Deleted EntityType: {entityTypeId}");

        }

        
        public async Task BatchDelete(string projectId, IEnumerable<string> entityTypeIds)
        {
            var client = await EntityTypesClient.CreateAsync();
            var entityTypeNames = entityTypeIds.Select(
                id => new EntityTypeName(projectId, id).ToString());
            client.BatchDeleteEntityTypes(new ProjectAgentName(projectId),
                entityTypeNames);
        }
    }

Ici, il faut dire tout de suite qu'il n'y a pas de fonction Update uniquement parce que Create remplit déjà sa fonction.

Maintenant que nous avons les méthodes de base pour travailler avec EntityTypes, passons à Entity et créons immédiatement une classe EntityManagement:

public class EntityManagement
    {
       using Google.Cloud.Dialogflow.V2;        


      //Create -    Entity
      //entityTypeId - Id EntityType      Entity
      //entityValue - ReferenceValue  Entity
      // synonyms -    Entity
        public async Task Create(string projectId,
                                 string entityTypeId,
                                 string entityValue,
                                 string[] synonyms)
        {
            var client = await EntityTypesClient.CreateAsync();
            var entity = new EntityType.Types.Entity() { Value = entityValue};
            entity.Synonyms.AddRange(synonyms);
            
            var operation = await client.BatchCreateEntitiesAsync(
                parent: new EntityTypeName(projectId, entityTypeId),
                entities: new[] { entity }
            ); 
            operation.PollUntilCompleted();
        }

       //CreateMany -   Entities 
       //entityTypeId - Id EntityType      Entity
       //entities -  Entities  
        public async Task CreateMany(string projectId,string entityTypeId, IEnumerable<Entity> entities)
        {
            var client = await EntityTypesClient.CreateAsync();
            List<EntityType.Types.Entity> results = new List<EntityType.Types.Entity>();
            foreach (var item in entities)
            {
                var entity = new EntityType.Types.Entity() { Value = item.value };
                entity.Synonyms.AddRange(item.synonyms);
                results.Add(entity);
            }
           
            var operation = await client.BatchCreateEntitiesAsync(
                parent: new EntityTypeName(projectId, entityTypeId),
                entities: results.ToArray());
            operation.PollUntilCompleted();
        }

      //Delete -    Entity,   "string entityValue"   
     //string[] entityValue      entityValues: entityValue
     //    .
        public async Task Delete(string projectId, string entityTypeId, string entityValue)
        {
            var client = await EntityTypesClient.CreateAsync();

            var operation = await client.BatchDeleteEntitiesAsync(
                parent: new EntityTypeName(projectId, entityTypeId),
                entityValues: new[] { entityValue }
            );

            Console.WriteLine("Waiting for the entity deletion operation to complete.");
            operation.PollUntilCompleted();

            Console.WriteLine($"Deleted Entity: {entityValue}");

        }
        
      //List -   Entities  EntityType 
     public async Task<List<Entity>> List(string projectId, string entityTypeId)
        {
            var client = await EntityTypesClient.CreateAsync();
            var entityType = await client.GetEntityTypeAsync(new EntityTypeName(
                projectId, entityTypeId
            ));
            List<Entity> EntitiesList = new List<Entity>();
            
            foreach (var entity in entityType.Entities)
            {
                List<string> Synonyms = new List<string>();
                foreach (var item in entity.Synonyms)
                {
                    Synonyms.Add(item);
                }
                EntitiesList.Add(new Entity { value = entity.Value, synonyms = Synonyms.ToArray() });
                Synonyms = null;
            }

            return EntitiesList;
        }
    }

Ajoutez notre modèle qui représentera l'entité:

public class Entity
    {
        public string value { get; set; }
        public string[] synonyms { get; set; }
    }

Terminé, toutes les fonctionnalités de base de CRUD sont prêtes. Encore une fois, en revenant à Update, il peut être implémenté séparément, mais il n'est tout simplement pas nécessaire, car Create fonctionne également comme Update.

Les exemples sont assez simples et, je dois en convenir, il existe toujours un "code dur", mais j'espère que l'article est utile à ceux qui, comme moi, n'ont pas pu comprendre comment effectuer correctement les opérations CRUD via le code.

static void Main(string[] args)
        {
      EntityTypesManagement entityTypesManagement = new EntityTypesManagement();
      EntityManagement entityManagement = new EntityManagement();
       string ProjectId = "Your Project`s id";
       string EntityName = "Your EntityName";
      var entityId = await entityTypesManagement.GetEntityTypeId(ProjectId, EntityName);
       Entity entity =  new Entity{value = "1", synonyms = new[]{"1","1"}};
      /*await*/ entityManagement.Create(ProjectId,entityId,entity);
 }

Source: https://habr.com/ru/post/undefined/


All Articles