Quintanda/intent-detection
0
1from fastapi import FastAPI2from pydantic import BaseModel3import requests4import numpy as np5from sklearn.metrics.pairwise import cosine_similarity6 7app = FastAPI()8 9# URL do serviço de embeddings10EMBEDDINGS_SERVICE_URL = "https://quintanda-embedding.hf.space/embedding"11 12# Estrutura das intenções e exemplos13intents = {14 "greeting": ["Olá", "Oi", "Tudo bem?", "Bom dia", "Boa tarde", "Boa noite", "E aí?", "Oi, tudo bom?", "Oi, como você está?", "Saudações"],15 "farewell": ["Tchau", "Até logo", "Até mais", "Falamos depois", "Obrigado, até a próxima", "Tenha um bom dia", "Nos vemos em breve", "Até a próxima", "Tchau, boa noite", "Vou nessa"],16 "help": ["Preciso de ajuda", "Pode me ajudar?", "Como funciona?", "O que posso fazer aqui?", "Pode explicar?", "Estou com dúvidas", "Me ajuda, por favor", "Quero saber como fazer", "Não sei o que fazer", "Preciso de informações"],17 "gratitude": ["Obrigado", "Muito obrigado", "Valeu", "Agradeço pela ajuda", "Você foi muito útil", "Obrigadão", "Agradeço muito", "Fico muito grato", "Gratidão", "Valeu mesmo"],18}19 20# Pré-calcula os embeddings para todas as frases representativas21def get_all_intent_embeddings():22 embeddings = {}23 for intent, examples in intents.items():24 embeddings[intent] = []25 for example in examples:26 response = requests.post(EMBEDDINGS_SERVICE_URL, json={"text": example})27 response.raise_for_status()28 embedding = np.array(response.json()["embedding"])29 embeddings[intent].append(embedding) # Armazena o embedding da frase30 return embeddings31 32# Calcula os embeddings ao iniciar a API33intent_embeddings = get_all_intent_embeddings()34 35# Modelo de entrada do usuário36class UserInput(BaseModel):37 text: str38 39@app.post("/intent")40def get_intent(input: UserInput):41 """42 Recebe o texto do usuário e retorna a intenção mais próxima.43 """44 # Obter o embedding do texto do usuário45 response = requests.post(EMBEDDINGS_SERVICE_URL, json={"text": input.text})46 response.raise_for_status()47 user_embedding = np.array(response.json()["embedding"])48 49 # Comparar o embedding do usuário com os embeddings de todas as frases50 best_intent = None51 best_score = -152 53 for intent, example_embeddings in intent_embeddings.items():54 for example_embedding in example_embeddings:55 score = cosine_similarity([user_embedding], [example_embedding]).flatten()[0]56 if score > best_score:57 best_score = score58 best_intent = intent59 60 return {"intent": best_intent, "confidence": best_score}61 62@app.get("/")63def home():64 return {"message": "API de Intents está funcionando!"}65 