Chat com Assistente IA
O Chat com Assistente é a funcionalidade principal do APAH Assistant, permitindo interações conversacionais inteligentes sobre Hipertensão Arterial Pulmonar.
Visão Geral
O assistente utiliza modelos de linguagem de última geração (LLMs) combinados com técnica de RAG (Retrieval-Augmented Generation) para fornecer respostas precisas e contextualizadas.
Funcionalidades
💬 Conversação Natural
- Interação em linguagem natural
- Suporte a múltiplos idiomas (PT, EN, FR)
- Contexto de conversa mantido
- Histórico de conversas persistido
📚 RAG (Retrieval-Augmented Generation)
O assistente pesquisa na biblioteca de documentos para enriquecer as respostas:
Utilizador: "Quais são os tratamentos para HAP?"
│
▼
┌───────────────┐
│ Embedding │
│ da pergunta │
└───────┬───────┘
│
▼
┌───────────────┐
│ Vector │
│ Search │
└───────┬───────┘
│
▼
┌───────────────┐
│ Documentos │
│ relevantes │
└───────┬───────┘
│
▼
┌───────────────┐
│ LLM gera │
│ resposta │
└───────────────┘
🔄 Streaming de Respostas
As respostas são transmitidas em tempo real para uma experiência fluida:
const { textStream } = await streamText({
model: azure("gpt-4o"),
messages: conversationHistory,
system: systemPrompt,
});
for await (const chunk of textStream) {
// Enviar chunk ao cliente
}
📝 Histórico de Conversas
Todas as conversas são guardadas e podem ser retomadas:
- Lista de conversas anteriores
- Possibilidade de continuar conversas
- Renomear conversas
- Eliminar conversas
Arquitetura do Chat
Componentes Frontend
src/app/_components/chat/
├── chat-interface.tsx # Interface principal
├── chat-input.tsx # Input de mensagens
├── chat-messages.tsx # Lista de mensagens
├── chat-message.tsx # Mensagem individual
├── chat-history.tsx # Sidebar com histórico
└── chat-actions.tsx # Ações (copiar, feedback)
Fluxo de Mensagem
// 1. Utilizador envia mensagem
const handleSend = async (message: string) => {
// 2. Adicionar mensagem do utilizador
addMessage({ role: "user", content: message });
// 3. Chamar API de chat
const response = await fetch("/api/chat", {
method: "POST",
body: JSON.stringify({
messages: conversation,
chatId,
}),
});
// 4. Processar stream de resposta
const reader = response.body?.getReader();
while (true) {
const { done, value } = await reader.read();
if (done) break;
appendToLastMessage(decode(value));
}
};
API de Chat
// src/app/api/chat/route.ts
export async function POST(request: Request) {
const { messages, chatId } = await request.json();
// Buscar documentos relevantes (RAG)
const relevantDocs = await searchDocuments(messages[messages.length - 1].content);
// Construir contexto
const systemPrompt = buildSystemPrompt(relevantDocs);
// Gerar resposta com streaming
const result = await streamText({
model: azure("gpt-4o"),
messages,
system: systemPrompt,
});
// Retornar stream
return result.toDataStreamResponse();
}
Configuração do Modelo
Azure OpenAI
import { azure } from "@ai-sdk/azure";
const model = azure("gpt-4o", {
resourceName: process.env.AZURE_OPENAI_RESOURCE,
apiKey: process.env.AZURE_OPENAI_API_KEY,
});
System Prompt
O system prompt define o comportamento do assistente:
const systemPrompt = `Você é o APAH Assistant, um assistente especializado
em Hipertensão Arterial Pulmonar (HAP).
Diretrizes:
- Forneça informações precisas baseadas em evidência científica
- Sempre recomende consultar um profissional de saúde
- Use linguagem clara e acessível
- Cite fontes quando disponíveis
Contexto dos documentos:
${relevantDocuments.map((doc) => doc.content).join("\n\n")}
`;
Embeddings e Busca Vetorial
Geração de Embeddings
import { CohereEmbeddings } from "@langchain/cohere";
const embeddings = new CohereEmbeddings({
model: "embed-multilingual-v3.0",
});
const vector = await embeddings.embedQuery(query);
Busca por Similaridade
const results = await db
.select()
.from(documentChunks)
.orderBy(cosineDistance(documentChunks.embedding, queryEmbedding))
.limit(5);
Interface do Utilizador
Layout do Chat
┌─────────────────────────────────────────────────────────────────┐
│ APAH Assistant [☰] [⚙️] [👤] │
├─────────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────────────────────────────────────┐ │
│ │ Histórico │ │ │ │
│ │ │ │ 👤 Utilizador: │ │
│ │ • Conversa 1│ │ Quais são os sintomas da HAP? │ │
│ │ • Conversa 2│ │ │ │
│ │ • Conversa 3│ │ 🤖 Assistente: │ │
│ │ │ │ Os principais sintomas da Hipertensão │ │
│ │ │ │ Arterial Pulmonar incluem: │ │
│ │ │ │ • Falta de ar progressiva │ │
│ │ │ │ • Fadiga │ │
│ │ │ │ • Dor no peito │ │
│ │ │ │ ... │ │
│ │ │ │ │ │
│ └─────────────┘ │ │ │
│ ├─────────────────────────────────────────────┤ │
│ │ [📎] Escreva uma mensagem... [➤] │ │
│ └─────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
Feedback de Mensagens
Os utilizadores podem avaliar as respostas:
- 👍 Resposta útil
- 👎 Resposta não útil
- 📝 Comentário adicional
Os feedbacks são guardados para melhorar o assistente.
Boas Práticas
Para Utilizadores
- Seja específico nas perguntas
- Forneça contexto quando relevante
- Divida perguntas complexas em partes
- Use o feedback para melhorar o assistente
Para Desenvolvedores
- Mantenha o system prompt atualizado
- Monitore a qualidade das respostas
- Atualize a biblioteca de documentos regularmente
- Analise os feedbacks negativos