rmayormartins commited on
Commit
cd60cf1
·
1 Parent(s): 5f1d896
Files changed (3) hide show
  1. README.md +61 -7
  2. app.py +309 -0
  3. requirements.txt +5 -0
README.md CHANGED
@@ -1,14 +1,68 @@
1
  ---
2
- title: Ai Multiagents Committee
3
- emoji: 🐠
4
- colorFrom: red
5
  colorTo: purple
6
  sdk: gradio
7
- sdk_version: 5.12.0
8
  app_file: app.py
9
  pinned: false
10
- license: ecl-2.0
11
- short_description: AI Multiagents Committee
12
  ---
13
 
14
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: ai-multiagents-committee
3
+ emoji: 🖥️🤖🤖🤖
4
+ colorFrom: blue
5
  colorTo: purple
6
  sdk: gradio
7
+ sdk_version: "4.8.0"
8
  app_file: app.py
9
  pinned: false
 
 
10
  ---
11
 
12
+ # Multi-Agent IA System
13
+ Um sistema interativo de múltiplos agentes de IA que trabalham em conjunto para análise de texto, classificação de imagens e perguntas e respostas.
14
+
15
+ ## Como Usar
16
+ O sistema oferece três funcionalidades principais:
17
+
18
+ 1. **Análise de Sentimento**:
19
+ - Digite um texto
20
+ - Selecione os agentes (BERT, RoBERTa, DistilBERT)
21
+ - Receba uma análise consolidada do sentimento
22
+
23
+ 2. **Classificação de Imagens**:
24
+ - Faça upload de uma imagem
25
+ - Selecione os agentes (ResNet, ViT, BEiT)
26
+ - Obtenha classificações detalhadas
27
+
28
+ 3. **Perguntas e Respostas**:
29
+ - Digite uma pergunta e forneça um contexto
30
+ - Selecione os agentes (RoBERTa-SQuAD, BERT-SQuAD, DistilBERT-SQuAD)
31
+ - Receba respostas baseadas no contexto
32
+
33
+ ## Detalhes Técnicos
34
+ O projeto utiliza diversos modelos de IA de última geração:
35
+
36
+ ### Análise de Texto:
37
+ - **BERT**: Modelo base multilingual para análise de sentimento
38
+ - **RoBERTa**: Versão otimizada do BERT para melhor performance
39
+ - **DistilBERT**: Versão compacta e rápida do BERT
40
+
41
+ ### Classificação de Imagens:
42
+ - **ResNet**: Rede neural convolucional profunda
43
+ - **ViT**: Vision Transformer para processamento de imagens
44
+ - **BEiT**: BERT for Image Transformation
45
+
46
+ ### Sistema de Perguntas e Respostas:
47
+ - **RoBERTa-SQuAD**: Otimizado para compreensão de texto
48
+ - **BERT-SQuAD**: Treinado no dataset SQuAD
49
+ - **DistilBERT-SQuAD**: Versão eficiente para QA
50
+
51
+ ## Métricas e Avaliação
52
+ - Confiança média dos agentes
53
+ - Taxa de concordância entre agentes
54
+ - Distribuição dos resultados
55
+ - Análise detalhada por agente
56
+
57
+ ## Informações Adicionais
58
+ - Desenvolvido por Ramon Mayor Martins (2025)
59
+ - E-mail: [[email protected]](mailto:[email protected])
60
+ - Homepage: [https://rmayormartins.github.io/](https://rmayormartins.github.io/)
61
+ - Twitter: [@rmayormartins](https://twitter.com/rmayormartins)
62
+ - GitHub: [https://github.com/rmayormartins](https://github.com/rmayormartins)
63
+
64
+ ## Notas
65
+ - O sistema utiliza uma abordagem de comitê, onde múltiplos agentes trabalham juntos
66
+ - As decisões são baseadas em votação majoritária e média de confiança
67
+ - Implementado em Python usando Transformers e Gradio
68
+ - Hospedado no Hugging Face Spaces
app.py ADDED
@@ -0,0 +1,309 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from transformers import pipeline
3
+ import torch
4
+ from PIL import Image
5
+ import numpy as np
6
+ from collections import Counter
7
+
8
+ # Definição dos modelos disponíveis
9
+ MODELS = {
10
+ 'texto': [
11
+ {'name': 'BERT', 'model': 'nlptown/bert-base-multilingual-uncased-sentiment', 'framework': 'pt'},
12
+ {'name': 'RoBERTa', 'model': 'cardiffnlp/twitter-roberta-base-sentiment', 'framework': 'pt'},
13
+ {'name': 'DistilBERT', 'model': 'distilbert-base-uncased-finetuned-sst-2-english', 'framework': 'pt'}
14
+ ],
15
+ 'imagem': [
16
+ {'name': 'ResNet', 'model': 'microsoft/resnet-50', 'framework': 'pt'},
17
+ {'name': 'ViT', 'model': 'google/vit-base-patch16-224', 'framework': 'pt'},
18
+ {'name': 'BEiT', 'model': 'microsoft/beit-base-patch16-224', 'framework': 'pt'}
19
+ ],
20
+ 'qa': [
21
+ {'name': 'RoBERTa-SQuAD', 'model': 'deepset/roberta-base-squad2', 'framework': 'pt'},
22
+ {'name': 'BERT-SQuAD', 'model': 'deepset/bert-base-cased-squad2', 'framework': 'pt'},
23
+ {'name': 'DistilBERT-SQuAD', 'model': 'distilbert-base-cased-distilled-squad', 'framework': 'pt'}
24
+ ]
25
+ }
26
+
27
+ # Carregar agentes
28
+ def load_agents():
29
+ agents = {
30
+ 'texto': {},
31
+ 'imagem': {},
32
+ 'qa': {}
33
+ }
34
+
35
+ print("Carregando agentes... Isso pode demorar alguns minutos.")
36
+
37
+ for tipo in MODELS:
38
+ for model_info in MODELS[tipo]:
39
+ try:
40
+ agents[tipo][model_info['name']] = pipeline(
41
+ 'sentiment-analysis' if tipo == 'texto' else
42
+ 'image-classification' if tipo == 'imagem' else
43
+ 'question-answering',
44
+ model=model_info['model'],
45
+ framework=model_info['framework']
46
+ )
47
+ print(f"✓ Carregado {model_info['name']} para {tipo}")
48
+ except Exception as e:
49
+ print(f"✗ Erro ao carregar {model_info['name']} para {tipo}: {str(e)}")
50
+
51
+ return agents
52
+
53
+ # Funções de processamento
54
+ def analise_texto(texto, bert, roberta, distilbert):
55
+ if not texto:
56
+ return "Por favor, digite algum texto para análise."
57
+ if not any([bert, roberta, distilbert]):
58
+ return "Por favor, selecione pelo menos um agente."
59
+
60
+ try:
61
+ resultados = []
62
+ confianças = []
63
+ detalhes_agentes = []
64
+
65
+ agents_selecionados = [
66
+ ('BERT', bert),
67
+ ('RoBERTa', roberta),
68
+ ('DistilBERT', distilbert)
69
+ ]
70
+
71
+ for agent_name, is_selected in agents_selecionados:
72
+ if is_selected:
73
+ resultado = agents['texto'][agent_name](texto)
74
+
75
+ # Padronização dos rótulos
76
+ sentimento = resultado[0]['label']
77
+ # Convertendo diferentes formatos para POSITIVO/NEGATIVO
78
+ if sentimento in ['POSITIVE', 'LABEL_4', 'LABEL_5', '5 stars', '4 stars']:
79
+ sentimento = "POSITIVO"
80
+ elif sentimento in ['NEGATIVE', 'LABEL_1', 'LABEL_2', '1 star', '2 stars']:
81
+ sentimento = "NEGATIVO"
82
+ elif sentimento in ['LABEL_3', '3 stars']:
83
+ # Para casos neutros, decidimos baseado na confiança
84
+ sentimento = "POSITIVO" if resultado[0]['score'] > 0.5 else "NEGATIVO"
85
+
86
+ confiança = float(resultado[0]['score'])
87
+
88
+ resultados.append(sentimento)
89
+ confianças.append(confiança)
90
+ detalhes_agentes.append(f"{agent_name}: {sentimento} ({confiança:.2%})")
91
+
92
+ # Análise dos resultados
93
+ sentimento_final = max(set(resultados), key=resultados.count)
94
+ confianca_media = np.mean(confianças)
95
+ concordancia = resultados.count(sentimento_final) / len(resultados)
96
+ distribuicao = dict(Counter(resultados))
97
+
98
+ return (
99
+ "📊 Resultado Final:\n"
100
+ f"Sentimento: {sentimento_final}\n"
101
+ f"Confiança média: {confianca_media:.2%}\n"
102
+ f"Taxa de concordância: {concordancia:.2%}\n\n"
103
+ "🤖 Detalhes por Agente:\n"
104
+ f"{chr(10).join(detalhes_agentes)}\n\n"
105
+ "📈 Distribuição dos votos:\n"
106
+ f"{', '.join(f'{k}: {v}' for k, v in distribuicao.items())}"
107
+ )
108
+ except Exception as e:
109
+ return f"Erro na análise: {str(e)}"
110
+
111
+ def classifica_imagem(imagem, resnet, vit, beit):
112
+ if imagem is None:
113
+ return "Por favor, faça upload de uma imagem."
114
+ if not any([resnet, vit, beit]):
115
+ return "Por favor, selecione pelo menos um agente."
116
+
117
+ try:
118
+ resultados = []
119
+ confianças = []
120
+ detalhes_agentes = []
121
+
122
+ agents_selecionados = [
123
+ ('ResNet', resnet),
124
+ ('ViT', vit),
125
+ ('BEiT', beit)
126
+ ]
127
+
128
+ for agent_name, is_selected in agents_selecionados:
129
+ if is_selected:
130
+ resultado = agents['imagem'][agent_name](imagem)
131
+
132
+ classificacao = resultado[0]['label']
133
+ confiança = float(resultado[0]['score'])
134
+
135
+ resultados.append(classificacao)
136
+ confianças.append(confiança)
137
+ detalhes_agentes.append(f"{agent_name}: {classificacao} ({confiança:.2%})")
138
+
139
+ classificacao_final = max(set(resultados), key=resultados.count)
140
+ confianca_media = np.mean(confianças)
141
+ concordancia = resultados.count(classificacao_final) / len(resultados)
142
+ distribuicao = dict(Counter(resultados))
143
+
144
+ return (
145
+ "📊 Resultado Final:\n"
146
+ f"Classificação: {classificacao_final}\n"
147
+ f"Confiança média: {confianca_media:.2%}\n"
148
+ f"Taxa de concordância: {concordancia:.2%}\n\n"
149
+ "🤖 Detalhes por Agente:\n"
150
+ f"{chr(10).join(detalhes_agentes)}\n\n"
151
+ "📈 Distribuição das classificações:\n"
152
+ f"{', '.join(f'{k}: {v}' for k, v in distribuicao.items())}"
153
+ )
154
+ except Exception as e:
155
+ return f"Erro na classificação: {str(e)}"
156
+
157
+ def responde_pergunta(pergunta, contexto, roberta_squad, bert_squad, distilbert_squad):
158
+ if not pergunta or not contexto:
159
+ return "Por favor, forneça tanto a pergunta quanto o contexto."
160
+ if not any([roberta_squad, bert_squad, distilbert_squad]):
161
+ return "Por favor, selecione pelo menos um agente."
162
+
163
+ try:
164
+ resultados = []
165
+ confianças = []
166
+ detalhes_agentes = []
167
+
168
+ agents_selecionados = [
169
+ ('RoBERTa-SQuAD', roberta_squad),
170
+ ('BERT-SQuAD', bert_squad),
171
+ ('DistilBERT-SQuAD', distilbert_squad)
172
+ ]
173
+
174
+ for agent_name, is_selected in agents_selecionados:
175
+ if is_selected:
176
+ resultado = agents['qa'][agent_name](
177
+ question=pergunta,
178
+ context=contexto,
179
+ max_answer_len=50,
180
+ handle_impossible_answer=True
181
+ )
182
+
183
+ resposta = resultado['answer']
184
+ confiança = float(resultado['score'])
185
+
186
+ resultados.append(resposta)
187
+ confianças.append(confiança)
188
+ detalhes_agentes.append(f"{agent_name}: {resposta} ({confiança:.2%})")
189
+
190
+ resposta_final = max(set(resultados), key=resultados.count)
191
+ confianca_media = np.mean(confianças)
192
+ concordancia = resultados.count(resposta_final) / len(resultados)
193
+
194
+ nota = (
195
+ 'Alta confiança!' if confianca_media > 0.8 else
196
+ 'Confiança moderada.' if confianca_media > 0.5 else
197
+ 'Baixa confiança - considere reformular a pergunta.'
198
+ )
199
+
200
+ return (
201
+ "📊 Resultado Final:\n"
202
+ f"Resposta: {resposta_final}\n"
203
+ f"Confiança média: {confianca_media:.2%}\n"
204
+ f"Taxa de concordância: {concordancia:.2%}\n\n"
205
+ "🤖 Detalhes por Agente:\n"
206
+ f"{chr(10).join(detalhes_agentes)}\n\n"
207
+ f"💡 Nota: {nota}"
208
+ )
209
+ except Exception as e:
210
+ return f"Erro ao processar a pergunta: {str(e)}"
211
+
212
+ # Carregar os agentes
213
+ print("Inicializando sistema...")
214
+ agents = load_agents()
215
+ print("Sistema pronto!")
216
+
217
+ # Interface Gradio
218
+ with gr.Blocks(title="Sistema Multi-Agentes de IA") as demo:
219
+ gr.Markdown("# 🤖 Sistema Multi-Agentes de IA")
220
+ gr.Markdown("""
221
+ <p>Ramon Mayor Martins: <a href="https://rmayormartins.github.io/" target="_blank">Website</a> | <a href="https://huggingface.co/rmayormartins" target="_blank">Spaces</a> | <a href="https://github.com/rmayormartins" target="_blank">Github</a></p>
222
+ """)
223
+ gr.Markdown("Selecione os agentes que deseja usar para cada tarefa e veja como eles trabalham em conjunto!")
224
+
225
+ with gr.Tab("📝 Análise de Texto"):
226
+ with gr.Row():
227
+ with gr.Column():
228
+ text_input = gr.Textbox(
229
+ label="Digite o texto para análise",
230
+ placeholder="Digite aqui o texto que você quer analisar...",
231
+ lines=3
232
+ )
233
+ with gr.Group():
234
+ gr.Markdown("Selecione os agentes:")
235
+ bert_check = gr.Checkbox(label="BERT", value=True)
236
+ roberta_check = gr.Checkbox(label="RoBERTa")
237
+ distilbert_check = gr.Checkbox(label="DistilBERT")
238
+ text_button = gr.Button("Analisar Sentimento")
239
+ with gr.Column():
240
+ text_output = gr.Textbox(label="Resultado", lines=10)
241
+ text_button.click(
242
+ analise_texto,
243
+ inputs=[text_input, bert_check, roberta_check, distilbert_check],
244
+ outputs=text_output
245
+ )
246
+
247
+ with gr.Tab("🖼️ Classificação de Imagem"):
248
+ with gr.Row():
249
+ with gr.Column():
250
+ image_input = gr.Image(type="pil", label="Upload da Imagem")
251
+ with gr.Group():
252
+ gr.Markdown("Selecione os agentes:")
253
+ resnet_check = gr.Checkbox(label="ResNet", value=True)
254
+ vit_check = gr.Checkbox(label="ViT")
255
+ beit_check = gr.Checkbox(label="BEiT")
256
+ image_button = gr.Button("Classificar Imagem")
257
+ with gr.Column():
258
+ image_output = gr.Textbox(label="Resultado", lines=10)
259
+ image_button.click(
260
+ classifica_imagem,
261
+ inputs=[image_input, resnet_check, vit_check, beit_check],
262
+ outputs=image_output
263
+ )
264
+
265
+ with gr.Tab("❓ Perguntas e Respostas"):
266
+ with gr.Row():
267
+ with gr.Column():
268
+ question_input = gr.Textbox(
269
+ label="Digite sua pergunta",
270
+ placeholder="Ex: Qual é a capital do Brasil?"
271
+ )
272
+ context_input = gr.Textbox(
273
+ label="Digite o contexto",
274
+ placeholder="Ex: Brasília é a capital do Brasil, localizada no Distrito Federal...",
275
+ lines=3
276
+ )
277
+ with gr.Group():
278
+ gr.Markdown("Selecione os agentes:")
279
+ roberta_squad_check = gr.Checkbox(label="RoBERTa-SQuAD", value=True)
280
+ bert_squad_check = gr.Checkbox(label="BERT-SQuAD")
281
+ distilbert_squad_check = gr.Checkbox(label="DistilBERT-SQuAD")
282
+ qa_button = gr.Button("Obter Resposta")
283
+ with gr.Column():
284
+ qa_output = gr.Textbox(label="Resultado", lines=10)
285
+ qa_button.click(
286
+ responde_pergunta,
287
+ inputs=[question_input, context_input, roberta_squad_check, bert_squad_check, distilbert_squad_check],
288
+ outputs=qa_output
289
+ )
290
+
291
+ gr.Markdown("""
292
+ ### 📋 Instruções:
293
+ 1. Selecione um ou mais agentes em cada aba
294
+ 2. Forneça os dados de entrada (texto, imagem ou pergunta+contexto)
295
+ 3. Veja como os diferentes agentes trabalham juntos!
296
+
297
+ ### 🔍 Sobre os Agentes:
298
+ - **BERT**: Modelo base robusto
299
+ - **RoBERTa**: Otimizado para melhor performance
300
+ - **DistilBERT**: Versão mais leve e rápida
301
+
302
+ ### 📊 Métricas:
303
+ - **Confiança média**: Média da confiança de todos os agentes
304
+ - **Taxa de concordância**: Quanto os agentes concordam entre si
305
+ - **Distribuição**: Como os votos se dividem entre as opções
306
+ """)
307
+
308
+ # Iniciar a interface
309
+ demo.launch()
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ gradio==4.8.0
2
+ torch
3
+ transformers
4
+ pillow
5
+ numpy