chatbot-cascata / app.py
iceman45's picture
V6 fixed
4a22358 verified
import gradio as gr
from huggingface_hub import InferenceClient
import os
# Initialize client with token from environment
client = InferenceClient(token=os.environ.get("HF_TOKEN"))
def chat(message, history):
"""
Cascading chat function with multiple AI models
Args:
message: Current user message (string)
history: Previous conversation
Returns:
Combined response from cascaded models (streaming)
"""
# Build messages in chat format
messages = []
# Add conversation history
if history:
for msg in history:
if isinstance(msg, dict):
messages.append(msg)
elif isinstance(msg, (list, tuple)) and len(msg) == 2:
messages.append({"role": "user", "content": msg[0]})
messages.append({"role": "assistant", "content": msg[1]})
# Add current message
messages.append({"role": "user", "content": message})
try:
# ===== MODELO 1: Llama 3.2 (Processamento Inicial) =====
yield "🔄 **[Modelo 1/3]** Processando com Llama 3.2...\n\n"
response1 = client.chat_completion(
model="meta-llama/Llama-3.2-3B-Instruct",
messages=messages,
max_tokens=300,
stream=False
)
first_response = response1.choices[0].message.content
yield f"✅ **[Modelo 1: Llama 3.2 3B]**\n{first_response}\n\n---\n\n🔄 **[Modelo 2/3]** Refinando com Qwen 2.5...\n\n"
# ===== MODELO 2: Qwen 2.5 (Refinamento/Análise) =====
# Criar prompt para o segundo modelo analisar/refinar a resposta
refinement_prompt = f"""Analise e refine a seguinte resposta, tornando-a mais clara e completa:
Pergunta original: {message}
Resposta para refinar:
{first_response}
Forneça uma versão melhorada e mais detalhada:"""
response2 = client.chat_completion(
model="Qwen/Qwen2.5-72B-Instruct",
messages=[{"role": "user", "content": refinement_prompt}],
max_tokens=400,
stream=False
)
second_response = response2.choices[0].message.content
yield f"✅ **[Modelo 1: Llama 3.2 3B]**\n{first_response}\n\n---\n\n✅ **[Modelo 2: Qwen 2.5 72B]**\n{second_response}\n\n---\n\n🔄 **[Modelo 3/3]** Gerando síntese final com Gemma 2...\n\n"
# ===== MODELO 3: Gemma 2 (Síntese Final) =====
# Criar prompt para o terceiro modelo fazer síntese das respostas anteriores
synthesis_prompt = f"""Com base nas duas respostas abaixo, crie uma síntese final clara e completa:
Pergunta original: {message}
Resposta 1 (Llama 3.2):
{first_response}
Resposta 2 (Qwen 2.5):
{second_response}
Crie uma resposta final que combine os melhores pontos de ambas, de forma clara e estruturada:"""
response3 = client.chat_completion(
model="google/gemma-2-9b-it",
messages=[{"role": "user", "content": synthesis_prompt}],
max_tokens=500,
stream=False
)
third_response = response3.choices[0].message.content
# Resposta final combinada com os 3 modelos
final_response = f"""✅ **[Modelo 1: Llama 3.2 3B Instruct]**
{first_response}
---
✅ **[Modelo 2: Qwen 2.5 72B Instruct]**
{second_response}
---
✅ **[Modelo 3: Gemma 2 9B IT]**
{third_response}
---
💡 **Modelos utilizados na cascata:**
1. **meta-llama/Llama-3.2-3B-Instruct** - Resposta inicial rápida
2. **Qwen/Qwen2.5-72B-Instruct** - Refinamento e análise detalhada
3. **google/gemma-2-9b-it** - Síntese final combinando ambas respostas"""
yield final_response
except Exception as e:
yield f"❌ Erro ao processar: {str(e)}"
# Create the Gradio interface
demo = gr.ChatInterface(
fn=chat,
title="🤖 Chatbot em Cascata - 3 Modelos de IA",
description="""**Arquitetura em Cascata com 3 Modelos:**
1️⃣ **Llama 3.2 3B Instruct** (Meta) - Processa a pergunta inicial
2️⃣ **Qwen 2.5 72B Instruct** (Alibaba) - Refina e expande a resposta
3️⃣ **Gemma 2 9B IT** (Google) - Sintetiza uma resposta final combinada
Você verá as respostas dos 3 modelos trabalhando em cascata!""",
examples=[
"Explique o que é machine learning",
"O que é inteligência artificial?",
"Como funciona uma rede neural?"
]
)
if __name__ == "__main__":
demo.launch()