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
Avalie esse Tutorial
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.
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.
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." }, ... ]
- Aplicativo App Services (por exemplo, aplicativo -0). Garanta a vinculação ao cluster com os dados do Airbnb.
- Conta OpenAI com acesso API.
- Navegue até seu aplicativo App Services.
- Em "Values (Valores de )," crie um segredo chamado
openAIKey
com sua chave de API da OPEN AI . - Crie um valor vinculado chamado OpenAIKey e vincule ao segredo.
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.
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:
1 listingsAndReviews.updateOne({"_id" : "1129303"}, { $push : { "reviews" : new_review } , $set : { "process" : false" }});
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:
1 function 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 }
A lógica de trigger principal é invocada quando um evento de alteração de atualização é detectado com um campo
"process" : false
.1 exports = 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 6 function 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>
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.