Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Junte-se a nós no Amazon Web Services re:Invent 2024! Saiba como usar o MongoDB para casos de uso de AI .
Desenvolvedor do MongoDB
Central de desenvolvedor do MongoDBchevron-right
Produtoschevron-right
MongoDBchevron-right

Usando os MongoDB Atlas Triggers para resumir as avaliações do Airbnb com OpenAI

Pavel Duchovny4 min read • Published Oct 31, 2023 • Updated Oct 31, 2023
IANode.jsFluxos de alteraçõesJavaScriptMongoDB
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
No domínio do aluguel de propriedades, as avaliações executam um papel fundamental. Ostriggers do MongoDB Atlas, combinados com o poder dos modelos do OpenAI, podem ajudar a resumir e analisar essas avaliações em tempo real. Neste artigo, exploraremos como utilizar os triggers do MongoDB Atlas para processar avaliações do Airbnb, gerando resumos concisos e marcações relevantes.
IU de revisão de IA e tags.
Este artigo é um recurso adicional adicionado ao aplicativo de pesquisa de sentimentos de hotéis e apartamentos desenvolvido em Leveraging OpenAI e MongoDB Atlas para melhoria da funcionalidade de pesquisa.

Introdução

Os triggers do MongoDB Atlas permitem que os usuários definam funções que são executadas em tempo real em resposta a operações de banco de dados. Esses triggers podem ser aproveitados para aprimorar os recursos de processamento e análise de dados. Neste exemplo, pretendemos gerar avaliações resumidas e marcações para um conjunto dedados de amostra do Airbnb.
Nosso modelo de dados original tem cada avaliação incorporada no documento de listagem como uma array:
1"reviews": [ { "_id": "2663437",
2"date": { "$date": "2012-10-20T04:00:00.000Z" }, \
3"listing_id": "664017",
4 "reviewer_id": "633940",
5"reviewer_name": "Patricia",
6"comments": "I booked the room at Marinete's apartment for my husband. He was staying in Rio for a week because he was studying Portuguese. He loved the place. Marinete was very helpfull, the room was nice and clean. \r\nThe location is perfect. He loved the time there. \r\n\r\n" },
7 { "_id": "2741592",
8"date": { "$date": "2012-10-28T04:00:00.000Z" },
9"listing_id": "664017",
10 "reviewer_id": "3932440",
11"reviewer_name": "Carolina",
12"comments": "Es una muy buena anfitriona, preocupada de que te encuentres cómoda y te sugiere que actividades puedes realizar. Disfruté mucho la estancia durante esos días, el sector es central y seguro." }, ... ]

Pré-requisitos

  • Aplicativo App Services (por exemplo, aplicativo -0). Garanta a vinculação ao cluster com os dados do Airbnb.
  • Conta OpenAI com acesso API.
Chave Open AI Chave Open AI

Segredos e valores

  1. Navegue até seu aplicativo App Services.
  2. Em "Values (Valores de )," crie um segredo chamado openAIKey com sua chave de API da OPEN AI .Segredos e valores
  3. Crie um valor vinculado chamado OpenAIKey e vincule ao segredo.

O código de trigger

O trigger fornecido escuta alterações na collection sample_airbnb.listingsAndReviews. Ao detectar uma nova revisão, ele faz uma amostra de até 50 avaliações, as envia para a API do OpenAI para resumo e atualiza o documento original com o conteúdo resumido e as tags. Configuração do Atlas Trigger
Observe que o trigger reage a atualizações que foram marcadas com o sinalizador "process" : false. Este campo indica que ainda não foi criado nenhum resumo para este lote de revisões.
Exemplo de uma operação de atualização de revisão que acionará este trigger:
1listingsAndReviews.updateOne({"_id" : "1129303"}, { $push : { "reviews" : new_review } , $set : { "process" : false" }});

Função de avaliações de amostra

Para evitar a sobrecarga da API com um grande número de avaliações, uma função sampleReviews é definida para amostrar aleatoriamente até 50 avaliações:
1function sampleReviews(reviews) {
2 if (reviews.length <= 50) {
3 return reviews;
4 }
5
6 const sampledReviews = [];
7 const seenIndices = new Set();
8
9 while (sampledReviews.length < 50) {
10 const randomIndex = Math.floor(Math.random() * reviews.length);
11 if (!seenIndices.has(randomIndex)) {
12 seenIndices.add(randomIndex);
13 sampledReviews.push(reviews[randomIndex]);
14 }
15 }
16
17 return sampledReviews;
18}

Lógica principal do trigger

A lógica de trigger principal é invocada quando um evento de alteração de atualização é detectado com um campo"process" : false.
1exports = async function(changeEvent) {
2 // A Database Trigger will always call a function with a changeEvent.
3 // Documentation on ChangeEvents: https://www.mongodb.com/pt-br/docs/manual/reference/change-events
4
5 // This sample function will listen for events and replicate them to a collection in a different Database
6function sampleReviews(reviews) {
7// Logic above...
8 if (reviews.length <= 50) {
9 return reviews;
10 }
11 const sampledReviews = [];
12 const seenIndices = new Set();
13
14 while (sampledReviews.length < 50) {
15 const randomIndex = Math.floor(Math.random() * reviews.length);
16 if (!seenIndices.has(randomIndex)) {
17 seenIndices.add(randomIndex);
18 sampledReviews.push(reviews[randomIndex]);
19 }
20 }
21
22 return sampledReviews;
23}
24
25 // Access the _id of the changed document:
26 const docId = changeEvent.documentKey._id;
27 const doc= changeEvent.fullDocument;
28
29
30 // Get the MongoDB service you want to use (see "Linked Data Sources" tab)
31 const serviceName = "mongodb-atlas";
32 const databaseName = "sample_airbnb";
33 const collection = context.services.get(serviceName).db(databaseName).collection(changeEvent.ns.coll);
34
35 // This function is the endpoint's request handler.
36 // URL to make the request to the OpenAI API.
37 const url = 'https://api.openai.com/v1/chat/completions';
38
39 // Fetch the OpenAI key stored in the context values.
40 const openai_key = context.values.get("openAIKey");
41
42 const reviews = doc.reviews.map((review) => {return {"comments" : review.comments}});
43
44 const sampledReviews= sampleReviews(reviews);
45
46 // Prepare the request string for the OpenAI API.
47 const reqString = `Summerize the reviews provided here: ${JSON.stringify(sampledReviews)} | instructions example:\n\n [{"comment" : "Very Good bed"} ,{"comment" : "Very bad smell"} ] \nOutput: {"overall_review": "Overall good beds and bad smell" , "neg_tags" : ["bad smell"], pos_tags : ["good bed"]}. No explanation. No 'Output:' string in response. Valid JSON. `;
48 console.log(`reqString: ${reqString}`);
49
50 // Call OpenAI API to get the response.
51
52 let resp = await context.http.post({
53 url: url,
54 headers: {
55 'Authorization': [`Bearer ${openai_key}`],
56 'Content-Type': ['application/json']
57 },
58 body: JSON.stringify({
59 model: "gpt-4",
60 temperature: 0,
61 messages: [
62 {
63 "role": "system",
64 "content": "Output json generator follow only provided example on the current reviews"
65 },
66 {
67 "role": "user",
68 "content": reqString
69 }
70 ]
71 })
72 });
73
74 // Parse the JSON response
75 let responseData = JSON.parse(resp.body.text());
76
77 // Check the response status.
78 if(resp.statusCode === 200) {
79 console.log("Successfully received code.");
80 console.log(JSON.stringify(responseData));
81
82 const code = responseData.choices[0].message.content;
83 // Get the required data to be added into the document
84 const updateDoc = JSON.parse(code)
85 // Set a flag that this document does not need further re-processing
86 updateDoc.process = true
87 await collection.updateOne({_id : docId}, {$set : updateDoc});
88
89
90 } else {
91 console.error("Failed to generate filter JSON.");
92 console.log(JSON.stringify(responseData));
93 return {};
94 }
95};
As principais etapas incluem:
  • Preparação de solicitação de API: as avaliações do documento alterado são amostradas e preparadas em uma string para a API OpenAI. O formato e as instruções são personalizados para garantir que a API retorne um JSON válido com conteúdo e tags resumidos.
  • Interação da API: usando o context.http.post método, o trigger envia os dados preparados para a API OpenAI.
  • Atualizando o documento original: após uma resposta bem-sucedida da API, o trigger atualiza o documento original com o conteúdo resumido, tags negativas (neg_tags), tags positivos (pos_tags) e um sinalizador de processo definido como true.
Aqui está um exemplo de resultado que é adicionado ao documento de listagem processado:
1"process": true,
2"overall_review": "Overall, guests had a positive experience at Marinete's apartment. They praised the location, cleanliness, and hospitality. However, some guests mentioned issues with the dog and language barrier.",
3"neg_tags": [ "language barrier", "dog issues" ],
4"pos_tags": [ "great location", "cleanliness", "hospitality" ]
Depois que os dados são adicionados aos nossos documentos, fornecer essas informações em nosso aplicativo VUE é tão simples quanto adicionar esse modelo HTML:
1<div v-if="listing.overall_review" class="overall-review" >
2 <b>Overall Review (ai based) :</b> {{ listing.overall_review }}
3 <div v-for="tag in listing.pos_tags" >
4 <span class="badge-pos">{{tag}}</span>
5 </div>
6 <div v-for="tag in listing.neg_tags" >
7 <span class="badge-neg">{{tag}}</span>
8 </div>
9 </div>

Conclusão

Ao integrar os triggers do MongoDB Atlas com os modelos poderosos da OpenAI, podemos processar e analisar com eficiência grandes volumes de avaliações em tempo real. Essa configuração não apenas fornece resumos concisos das avaliações, mas também as categoriza em etiquetas positivas e negativas, oferecendo informações valiosas para anfitriões e possíveis locatários.
Dúvidas? Comentários? Vamos continuar a conversa em nossos fóruns da comunidade.

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Tutorial

Criar um pipeline de dados para o fluxo de alterações do MongoDB usando a assinatura Pub/Sub do BigQuery


Apr 02, 2024 | 5 min read
Tutorial

Design de esquema do MongoDB: melhores práticas de modelagem de dados


Oct 01, 2024 | 11 min read
Início rápido

Introdução a pipelines de agregação em Rust


Oct 01, 2024 | 15 min read
Tutorial

Como importar dados no MongoDB com o mongoimport


Jun 12, 2024 | 15 min read
Sumário
  • Introdução