{"id":15060677,"url":"https://github.com/ahbiels/chatbot_analize_avaliation","last_synced_at":"2026-01-02T18:03:56.118Z","repository":{"id":241168399,"uuid":"802209032","full_name":"Ahbiels/chatbot_analize_avaliation","owner":"Ahbiels","description":"Um bot feito no dialogflow cx que permite ao usuário avaliar um determinado produto da empresa. Após a avaliação, o bot ira fazer uma análise de sentimentos na avaliação do usuário, e armazenar o resultado da avaliação (juntamente com o texto da avaliação, nome do usuário e produto) dentro de um dataset no BigQuery","archived":false,"fork":false,"pushed_at":"2024-06-14T13:45:40.000Z","size":1758,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-22T13:52:29.263Z","etag":null,"topics":["bigquery","chatbot","dataset","dialogflow","dialogflow-cx","documentation","flask","gcp","google-cloud","iterator","language-model","nlu","nlu-chatbot","python","sql"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Ahbiels.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-05-17T18:26:21.000Z","updated_at":"2024-06-14T13:50:25.000Z","dependencies_parsed_at":"2024-06-14T15:04:09.223Z","dependency_job_id":"3eafced1-d0aa-44d6-95cd-023fadbfa7c5","html_url":"https://github.com/Ahbiels/chatbot_analize_avaliation","commit_stats":null,"previous_names":["ahbiels/chatbot_analize_avaliation"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ahbiels%2Fchatbot_analize_avaliation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ahbiels%2Fchatbot_analize_avaliation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ahbiels%2Fchatbot_analize_avaliation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ahbiels%2Fchatbot_analize_avaliation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Ahbiels","download_url":"https://codeload.github.com/Ahbiels/chatbot_analize_avaliation/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243809888,"owners_count":20351407,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bigquery","chatbot","dataset","dialogflow","dialogflow-cx","documentation","flask","gcp","google-cloud","iterator","language-model","nlu","nlu-chatbot","python","sql"],"created_at":"2024-09-24T23:02:36.850Z","updated_at":"2026-01-02T18:03:56.022Z","avatar_url":"https://github.com/Ahbiels.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Chatbot de análise de sentimentos\nEsse projeto se trata de um chatbot construído no Dialogflox CX que usa a ferramenta **Natural Language AI** para analisar a avaliação de um determinado produto da loja ficticia **FagTec**, uma loja de aparelhos eletronicos.\n\n## Arquitetura do projeto\n\u003cimg src=\"./images/architecture.png\"\u003e\n\n1. O usuário manda uma mensagem pelo prompt de um chat\n2. Essa mensagem é encaminhado para o Dialogflox CX, e responde com base nas intenções, entidades, páginas e fluxos configurados\n3. O Dialogflow envia a avaliação feita pelo usuário para a Cloud Function\n4. A Cloud Function passa a avaliação para a Natural Languagem API\n5. A Natural Languagem API retorna um objeto com a analise de sentimento (de -1 a 1) de volta para a Cloud Function\n6. A Cloud Function salva o nome, a avaliação, o produto avaliado e o score analisado em uma tabela no BigQuery\n7. A Cloud function retorna uma mensagem para o Dialogflow CX\n8. O Dialogflow CX exibe a mensagem ao chat do usuário \n\n## Etapas do desenvolvimento\n### Service Account\nPrimeiro, vamos criar uma service account para a nossa Cloud Function, para que ela possa ter acesso ao BigQuery\n- Para criar a Service Account, execute o seguinte comando\n```sh\ngcloud iam service-accounts create virtual-assistant \\\n  --description=\"Service account that will be used in the Cloud Function to access BigQuery\" \\\n  --display-name=\"Virtual Assistant\"\n```\n- Agora, para atribuir a permissão de **BigQuery Admin** a Service Account, execute o seguinte comando:\n```sh\ngcloud projects add-iam-policy-binding $DEVSHELL_PROJECT_ID \\\n  --member=\"serviceAccount:virtual-assistant@$DEVSHELL_PROJECT_ID.iam.gserviceaccount.com\" \\\n  --role=\"roles/bigquery.admin\"\n```\nAgora, na console da Google Cloud, vá para \u003ca href=\"https://console.cloud.google.com/iam-admin/iam?referrer=search\"\u003eiam \u0026 admin\u003c/a\u003e. Na seção IAM, podemos visualizar nossa Service account criada, com a permissão Bigquery Admin\n\n\u003cimg src=\"./images/doc/iam.png\"/\u003e\n\n### BigQuery\nAgora, para configurar o BigQuery, vamos:\n- No Cloud Shell, execute esse comando para criar um dataset no BigQuery chamado **evaluate_product**\n```sh\nbq mk evaluate_product\n```\n- Agora, execute o seguinte comando para criar uma tabela dentro do dataset criado\n```sh\nbq mk --table $DEVSHELL_PROJECT_ID:evaluate_product.evaluate Name:string,Product:string,Text:string,Score:float\n```\n  - Esse comando vai criar uma tabela com as seguintes schemas:\n    - Name do tipo string para armazenar o nome da pessoa que irá fazer a avaliação\n    - Product do tipo string para armazenar o produto avaliado\n    - Text do tipo string para armazenar a avaliação enviada pelo usuário\n    - Score como float que vai armazenar o valor de -1 a 1, referente a analise feita na avaliação enviada pelo usuário\n      - Quanto menor o número (mais próximo de -1), pior a avaliação\n  - O **$DEVSHELL_PROJECT_ID** é uma variável de ambiente que armazena do ID do seu projeto dentro da Google Cloud Platform\n\nAgora, na console da Google Cloud, vá para \u003ca href=\"https://console.cloud.google.com/bigquery\"\u003eBigQuery\u003c/a\u003e e visualize o dataset e tabela criado\n\n\u003cimg src=\"./images/doc/BigQuery.png\"/\u003e\n\n### Cloud Function\nAgora, vamos criar uma cloud function para servir como Webhook do nosso agente virtual\n\nPara criar uma cloud function, vamos executar o seguinte comando:\n```sh\ngcloud functions deploy webhook \\\n    --gen2 \\\n    --runtime=python312 \\\n    --region=us-east1 \\\n    --source=./cloud_function \\\n    --entry-point=analyze_webhook \\\n    --trigger-http \\\n    --service-account virtual-assistant@$DEVSHELL_PROJECT_ID.iam.gserviceaccount.com\n```\n- Esse comando irá criar uma cloud function com a runtime em Python3.12, com o entry-point analyze_webhook (nome da função principal do código python), e com a service account criado anteriormente. \nO código python que usaremos nesse projeto se encontra [nesse arquivo](./cloud_function/main.py) e as dependências utilizadas por esse código se encontra [nesse arquivo](./cloud_function/requirements.txt)\n\n### Criação do Agente Virtual\n- Primeiro, vamos nos serviços de \u003ca href=\"https://dialogflow.cloud.google.com/cx/\"\u003eDialogflow CX\u003c/a\u003e\n- Vamos em \"**Create agent**\" e depois em \"**Build your own**\"\n- Vamos colocar o Display Name como **Evaluator.io** e em Location vamos colocar como **Global**\n\n**\u003ca id=\"create_entity\"\u003e\u003c/a\u003eCriando as entidades (Entity Types)**\n- Vamos clicar em Manage na console do Dialogflow\n- Vamos na secão Entity Types\n- Clique em **Create** e coloque o nome como **products**\n- Em products, teremos as seguintes unidades:\n\u003cimg src=\"./images/Entidades.png\"/\u003e\n\n\n**Configuração das intenções (Intents)**\n- Vamos clicar em Manage na console do Dialogflow\n- Vamos na secão Intents\n- Clique em **Create**\n  - A primeira intenção vai ter o nome \"**confirmation.yes** com as seguintes frases:\n    - let's go\n    - Go\n    - Please\n    - I want to evaluate the product\n    - I want to evaluate\n    - y \n    - Of course\n    - Sure\n    - yes\n  - A Segunda intenção vai ter o nome \"**confirmation.no** com as seguintes frases:\n    - I don't want\n    - I don't\n    - no, thanks\n    - Never\n    - Do not\n    - Not \n    - No\n  - A Terceira intenção vai ter o nome \"**information.name** com as seguintes frases:\n    - You could call me Angelo Gabriel\n    - Angelo Gabriel\n    - Call me Angelo Gabriel\n    - I'm Angelo Gabriel\n    - My name is Angelo Gabriel\n    \u003cimg src=\"./images/intent_name.png\"\u003e\n    - Nesse caso, Podemos colocar qualquer nome\n    - OBSERVAÇÃO: Colocar a entidade dessa intenção como **@sys.person**\n  - A Quarta intenção vai ter o nome \"**information.products** com as seguintes frases:\n    - Drone\n    - Digital Camera\n    - WiFi router\n    - Play Station 5\n    - Play Station 4\n    - Play Station 3\n    - headphones\n    - Wireless headphones\n    - Smartwatch\n    - Laptop\n    \n      \u003cimg src=\"./images/intent_products.png\"/\u003e\n    \n    - OBSERVAÇÃO: Colocar a entidade dessa intenção como **@products**, entidade criada [aqui](#create_entity)\n  \n**Configurar o webhook**\n- Vamos clicar em Manage na console do Dialogflow\n- Vamos na secão **Webhooks**\n- Vamos clicar em **Create**\n  - Em Display name, vamos colocar qualquer nome (nesse caso, vou chamar de webhook)\n  - Em Webhook URL, vamos colocar a URL pública da Cloud Function\n  - Vamos clicar em Save\n    \u003cimg src=\"./images/cf.png\"/\u003e\n  \n  - Para \"pegar\" a url da cloud function, vá no serviço de Cloud Function e clique na função criada\n    \u003cimg src=\"./images/cf.png\"\u003e\n\n### Criando as páginas, fluxos e rotas\nA página inicial terá um mensagens de boas vindas, e dando a possibilidade ao usuário de responder se ele gostaria de avaliar algum produto ou não.\n- Se o usuário responder com um \"yes\", será direcionado para o fluxo \"Product Review\"\n- Se o usuário responder com um \"no\", será direcionado para o fim da sessão\n\nO fluxo Product review tem 4 páginas\n- A página inicial que vai capturar o nome do usuário\n- A página de seleção do produto para avaliar\n  - Nessa página, o usuário é obrigado a fornecer o nome do produto, caso o contrário o bot não irá prosseguir\n- A página de avaliacão do produto, onde o usuário vai fazer o review\n  - Nessa página, foi configurado um \"No-match 1\", para que não haja correspondência com nada que o usuário disser, e automaticamente acione o webhook.\n  - O Webhook irá retornar uma resposta automatica com base no nível de satisfação do usuário\n- A página End Session diz respeito ao fim da conversa\n\n### Explorando o código em python\n```py\nimport functions_framework\nfrom flask import jsonify\nfrom google.cloud import language_v1\nfrom google.cloud import bigquery\nfrom typing import Dict\n\ndef natural_language(name, text,product):\n    client = language_v1.LanguageServiceClient()\n    document = language_v1.types.Document(\n      content=text, type_=language_v1.types.Document.Type.PLAIN_TEXT\n    )\n    sentiment = client.analyze_sentiment(request={\"document\": document}).document_sentiment\n    analyze_iter = iter([\"name\", name ,\"product\", product, \"text\", text, \"sentiment_score\", f\"{sentiment.score:.2f}\", \"sentiment_magnitude\", f\"{sentiment.magnitude:.2f}\"])\n    analyze: Dict[str, str] = {}\n\n    for analyze_name in analyze_iter:\n        analyze[analyze_name] = next(analyze_iter)\n\n    response_user = \"\"\n    if float(analyze[\"sentiment_score\"]) \u003c -0.5:\n        response_user = \"We're sorry you didn't like it. We'll work to improve.\"\n    elif float(analyze[\"sentiment_score\"]) \u003e= -0.5 and float(analyze[\"sentiment_score\"]) \u003c 0:\n        response_user = \"We're sorry it wasn't a good experience for you. We'll work to improve.\"\n    elif float(analyze[\"sentiment_score\"]) \u003e= 0 and float(analyze[\"sentiment_score\"]) \u003c 0.6:\n        response_user = \"We're glad you enjoyed it! Your feedback is important for us to improve.\"\n    elif float(analyze[\"sentiment_score\"]) \u003e= 0.6:\n        response_user = \"We're happy to hear you had a great experience.\"\n    \n    return analyze,response_user\n\ndef write_data_bq(analyzed_text):\n    client = bigquery.Client()\n    dataset_id = \"projeto-estudos-415711.evaluate_product.evaluate\"\n    QUERY = f\"\"\"\n        INSERT INTO `{dataset_id}` (Name, Product, Text, Score) VALUES (\"{analyzed_text[\"name\"]}\",\"{analyzed_text[\"product\"]}\",\"{analyzed_text[\"text\"]}\",{analyzed_text[\"sentiment_score\"]})\n    \"\"\"\n    client.query_and_wait(QUERY)\n\n@functions_framework.http\ndef analyze_webhook(request):\n    data = request.get_json()\n\n    print(data)\n\n    tag = data[\"fulfillmentInfo\"][\"tag\"]\n    text = data[\"text\"]\n    name = data[\"sessionInfo\"][\"parameters\"][\"name\"][\"name\"]\n    product = data[\"sessionInfo\"][\"parameters\"][\"product\"]\n\n    analyzed_text, response_user = natural_language(name,text,product)\n    write_data_bq(analyzed_text)\n\n    return jsonify(\n        {\n            'fulfillment_response': {\n                'messages': [\n                    {\n                        'text': {\n                            'text': [response_user]\n                        }\n                    }\n                ]\n            }\n        }\n    )\n```\n\nEsse código em questão vai receber a avaliação do usuário, assim como o seu nome e o nome do produto que ele está avaliando. Após isso, ele vai realizar a análise do texto e retornar um score de -1 a 1, e também uma resposta ao usuário com base nesse score. A função **write_data_bq** vai escrever a avaliação, o nome do usuário, o nome do produto e o score em um dataset dentro do BigQuery. E, por fim, o código vai fornecer um texto de resposta com base na avaliação para o Bot no DialogFlow\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fahbiels%2Fchatbot_analize_avaliation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fahbiels%2Fchatbot_analize_avaliation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fahbiels%2Fchatbot_analize_avaliation/lists"}