Finish-him commited on
Commit
903b13c
·
verified ·
1 Parent(s): 3c6f59c

Upload app.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. app.py +220 -31
app.py CHANGED
@@ -1,50 +1,239 @@
 
 
 
 
 
 
 
1
  import gradio as gr
 
 
 
 
2
 
3
  # Configuração
4
- SYSTEM_PROMPT = """Você é o assistente virtual da MSC Marketing, uma empresa especializada em Marketing Digital e SEO.
5
- Você ajuda com:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  - Estratégias de SEO e Marketing Digital
7
  - Informações sobre serviços da MSC
8
  - Dúvidas sobre projetos e processos
9
  - Suporte técnico básico
10
 
11
- Seja sempre profissional, amigável e objetivo nas respostas.
12
- Idiomas suportados: Português, Inglês, Espanhol e Alemão."""
13
-
14
- def respond(message, history):
15
- """Processa mensagens do chat."""
16
- response = f"""Olá! Sou o assistente da MSC Marketing.
17
 
18
- Recebi sua mensagem: "{message}"
19
 
20
- Este Space está em fase de configuração inicial. Em breve teremos:
21
- - Integração com RAG para busca na documentação
22
- - Modelo fine-tuned para respostas especializadas
23
- - Suporte multilíngue completo
24
 
25
- Por enquanto, visite https://mscmarketing.group para mais informações.
26
 
27
  ---
28
- **Datasets disponíveis:**
29
- - msc-knowledge-base: Base de conhecimento
30
- - msc-qa-pairs: Pares Q&A para fine-tuning
31
- - msc-embeddings: Chunks para RAG
32
- - msc-instructions: Instruções para agentes
33
- """
34
  return response
35
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  # Interface Gradio
37
- demo = gr.ChatInterface(
38
- respond,
39
- title="🤖 MSC Marketing Assistant",
40
- description="Assistente inteligente da MSC Marketing - Em desenvolvimento",
41
- examples=[
42
- "O que é a MSC Marketing?",
43
- "Como funciona SEO multilíngue?",
44
- "Quais serviços vocês oferecem?"
45
- ],
46
- cache_examples=False
47
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
 
49
  if __name__ == "__main__":
50
  demo.launch()
 
1
+ """
2
+ MSC Marketing Chatbot com RAG
3
+ Assistente inteligente com busca semântica na base de conhecimento.
4
+ """
5
+
6
+ import os
7
+ import json
8
  import gradio as gr
9
+ import numpy as np
10
+ from sentence_transformers import SentenceTransformer
11
+ import faiss
12
+ from huggingface_hub import hf_hub_download
13
 
14
  # Configuração
15
+ MODEL_NAME = "intfloat/multilingual-e5-base"
16
+ DATASET_REPO = "Finish-him/msc-embeddings"
17
+ TOP_K = 5
18
+
19
+ # Variáveis globais
20
+ model = None
21
+ index = None
22
+ metadata = None
23
+
24
+ def load_rag_components():
25
+ """Carrega modelo, índice e metadata."""
26
+ global model, index, metadata
27
+
28
+ print("🔄 Carregando componentes RAG...")
29
+
30
+ # Carregar modelo de embeddings
31
+ print(" 📦 Carregando modelo de embeddings...")
32
+ model = SentenceTransformer(MODEL_NAME)
33
+
34
+ # Baixar arquivos do dataset
35
+ print(" 📥 Baixando índice FAISS...")
36
+ try:
37
+ index_path = hf_hub_download(
38
+ repo_id=DATASET_REPO,
39
+ filename="rag_data/msc_faiss.index",
40
+ repo_type="dataset"
41
+ )
42
+ index = faiss.read_index(index_path)
43
+ print(f" ✓ Índice carregado: {index.ntotal} vetores")
44
+ except Exception as e:
45
+ print(f" ⚠️ Erro ao carregar índice: {e}")
46
+ # Criar índice vazio se não existir
47
+ index = faiss.IndexFlatIP(768)
48
+
49
+ print(" 📥 Baixando metadata...")
50
+ try:
51
+ metadata_path = hf_hub_download(
52
+ repo_id=DATASET_REPO,
53
+ filename="rag_data/msc_metadata.json",
54
+ repo_type="dataset"
55
+ )
56
+ with open(metadata_path, 'r', encoding='utf-8') as f:
57
+ metadata = json.load(f)
58
+ print(f" ✓ Metadata carregado: {len(metadata)} documentos")
59
+ except Exception as e:
60
+ print(f" ⚠️ Erro ao carregar metadata: {e}")
61
+ metadata = []
62
+
63
+ print("✅ Componentes RAG carregados!")
64
+
65
+ def search_knowledge_base(query: str, top_k: int = TOP_K) -> list:
66
+ """Busca documentos relevantes na base de conhecimento."""
67
+ if model is None or index is None or index.ntotal == 0:
68
+ return []
69
+
70
+ # Formato E5 para query
71
+ query_text = f"query: {query}"
72
+ query_embedding = model.encode([query_text], normalize_embeddings=True)
73
+
74
+ # Buscar no índice
75
+ scores, indices = index.search(query_embedding.astype('float32'), min(top_k, index.ntotal))
76
+
77
+ results = []
78
+ for score, idx in zip(scores[0], indices[0]):
79
+ if idx < len(metadata):
80
+ doc = metadata[idx]
81
+ results.append({
82
+ "score": float(score),
83
+ "title": doc.get("title", "Documento MSC"),
84
+ "domain": doc.get("domain", "general"),
85
+ "text": doc.get("full_text", doc.get("text", ""))
86
+ })
87
+
88
+ return results
89
+
90
+ def format_context(results: list) -> str:
91
+ """Formata os resultados da busca como contexto."""
92
+ if not results:
93
+ return ""
94
+
95
+ context_parts = []
96
+ for i, doc in enumerate(results, 1):
97
+ context_parts.append(f"[Documento {i}] {doc['title']}\n{doc['text'][:800]}")
98
+
99
+ return "\n\n---\n\n".join(context_parts)
100
+
101
+ def generate_response(query: str, context: str) -> str:
102
+ """Gera resposta baseada no contexto."""
103
+ if not context:
104
+ return f"""Olá! Sou o assistente da MSC Marketing.
105
+
106
+ Recebi sua pergunta: "{query}"
107
+
108
+ Infelizmente, não encontrei informações específicas na base de conhecimento sobre esse tema.
109
+
110
+ **O que posso ajudar:**
111
  - Estratégias de SEO e Marketing Digital
112
  - Informações sobre serviços da MSC
113
  - Dúvidas sobre projetos e processos
114
  - Suporte técnico básico
115
 
116
+ Visite https://mscmarketing.group para mais informações."""
 
 
 
 
 
117
 
118
+ response = f"""**Sua pergunta:** {query}
119
 
120
+ **Baseado na documentação da MSC Marketing:**
 
 
 
121
 
122
+ {context[:2000]}
123
 
124
  ---
125
+
126
+ *Esta resposta foi gerada com base na documentação oficial da MSC Marketing.*
127
+ *Para mais informações, visite https://mscmarketing.group*"""
128
+
 
 
129
  return response
130
 
131
+ def chat(message: str, history: list) -> str:
132
+ """Processa mensagem do chat com RAG."""
133
+ if not message.strip():
134
+ return "Por favor, digite uma mensagem."
135
+
136
+ # Buscar contexto relevante
137
+ results = search_knowledge_base(message, TOP_K)
138
+ context = format_context(results)
139
+
140
+ # Gerar resposta
141
+ response = generate_response(message, context)
142
+
143
+ return response
144
+
145
+ def search_api(query: str, top_k: int = 5) -> dict:
146
+ """API endpoint para busca semântica."""
147
+ results = search_knowledge_base(query, top_k)
148
+ return {
149
+ "query": query,
150
+ "results": results,
151
+ "count": len(results)
152
+ }
153
+
154
+ # Carregar componentes ao iniciar
155
+ load_rag_components()
156
+
157
  # Interface Gradio
158
+ with gr.Blocks(
159
+ title="MSC Marketing Assistant",
160
+ theme=gr.themes.Soft()
161
+ ) as demo:
162
+ gr.Markdown("""
163
+ # 🤖 MSC Marketing Assistant
164
+
165
+ **Assistente inteligente com RAG (Retrieval-Augmented Generation)**
166
+
167
+ Este chatbot utiliza busca semântica na base de conhecimento da MSC Marketing
168
+ para fornecer respostas precisas e contextualizadas.
169
+
170
+ ---
171
+ """)
172
+
173
+ with gr.Tab("💬 Chat"):
174
+ chatbot = gr.ChatInterface(
175
+ chat,
176
+ examples=[
177
+ "O que é SEO multilíngue?",
178
+ "Como funciona marketing digital?",
179
+ "Quais são os serviços da MSC Marketing?",
180
+ "O que é a MSC Academy?",
181
+ "Como otimizar um site para SEO?"
182
+ ],
183
+ cache_examples=False
184
+ )
185
+
186
+ with gr.Tab("🔍 Busca Semântica"):
187
+ gr.Markdown("### Busque diretamente na base de conhecimento")
188
+
189
+ with gr.Row():
190
+ search_input = gr.Textbox(
191
+ label="Sua busca",
192
+ placeholder="Digite sua busca...",
193
+ scale=4
194
+ )
195
+ search_k = gr.Slider(1, 10, value=5, step=1, label="Resultados", scale=1)
196
+
197
+ search_btn = gr.Button("🔍 Buscar", variant="primary")
198
+ search_output = gr.JSON(label="Resultados")
199
+
200
+ search_btn.click(
201
+ search_api,
202
+ inputs=[search_input, search_k],
203
+ outputs=search_output
204
+ )
205
+
206
+ with gr.Tab("📊 Status"):
207
+ gr.Markdown(f"""
208
+ ### Status do Sistema
209
+
210
+ | Componente | Status |
211
+ |------------|--------|
212
+ | Modelo de Embeddings | `{MODEL_NAME}` |
213
+ | Vetores no Índice | `{index.ntotal if index else 0}` |
214
+ | Documentos | `{len(metadata) if metadata else 0}` |
215
+ | Dataset | `{DATASET_REPO}` |
216
+
217
+ ### Endpoints de API
218
+
219
+ Este Space expõe endpoints para integração com N8N e outros sistemas:
220
+
221
+ - **Chat:** `/api/predict` (POST)
222
+ - **Busca:** `/api/search` (POST)
223
+
224
+ ### Links
225
+
226
+ - [MSC Marketing](https://mscmarketing.group)
227
+ - [Dataset Knowledge Base](https://huggingface.co/datasets/Finish-him/msc-knowledge-base)
228
+ - [Dataset Q&A](https://huggingface.co/datasets/Finish-him/msc-qa-pairs)
229
+ - [Dataset Embeddings](https://huggingface.co/datasets/Finish-him/msc-embeddings)
230
+ """)
231
+
232
+ gr.Markdown("""
233
+ ---
234
+
235
+ **MSC Marketing** | Assistente de IA com RAG | Powered by Hugging Face
236
+ """)
237
 
238
  if __name__ == "__main__":
239
  demo.launch()