Spaces:
Sleeping
Sleeping
Guilherme Favaron
Major update: Add hybrid search, reranking, multiple LLMs, and UI improvements
1b447de | """ | |
| Aba de Comparação de Estratégias de Chunking | |
| Permite testar e comparar diferentes métodos de chunking | |
| """ | |
| import gradio as gr | |
| from src.chunking import compare_chunking_strategies, get_chunk_stats | |
| def create_chunking_comparison_tab(): | |
| """Cria aba de comparação de estratégias de chunking""" | |
| with gr.Tab("Comparação de Chunking"): | |
| gr.Markdown(""" | |
| ## Comparação de Estratégias de Chunking | |
| Experimente diferentes estratégias de chunking no mesmo texto para entender o impacto de cada abordagem. | |
| **Estratégias disponíveis:** | |
| - **Tamanho Fixo**: Divide em chunks de tamanho fixo com overlap | |
| - **Por Sentenças**: Respeita limites de sentenças | |
| - **Semântico**: Agrupa por parágrafos mantendo coerência | |
| - **Recursivo**: Hierarquia de separadores (parágrafos → sentenças → palavras) | |
| """) | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| gr.Markdown("### Configuração") | |
| sample_text = gr.Textbox( | |
| label="Texto para Análise", | |
| placeholder="Cole ou digite o texto que deseja dividir em chunks...", | |
| lines=15, | |
| max_lines=20 | |
| ) | |
| chunk_size_compare = gr.Slider( | |
| minimum=200, | |
| maximum=2000, | |
| value=500, | |
| step=100, | |
| label="Tamanho Máximo do Chunk" | |
| ) | |
| compare_btn = gr.Button( | |
| "Comparar Estratégias", | |
| variant="primary", | |
| size="lg", | |
| elem_classes=["primary-button"] | |
| ) | |
| gr.Markdown(""" | |
| **Dicas:** | |
| - Textos mais longos mostram diferenças mais claras | |
| - Chunks menores = mais contextos, mas mais fragmentados | |
| - Chunks maiores = menos contextos, mais informação por chunk | |
| """) | |
| with gr.Column(scale=2): | |
| gr.Markdown("### Resultados da Comparação") | |
| comparison_summary = gr.Markdown("Aguardando comparação...") | |
| with gr.Tabs(): | |
| with gr.Tab("Tamanho Fixo"): | |
| fixed_stats = gr.JSON(label="Estatísticas") | |
| fixed_chunks = gr.Textbox( | |
| label="Chunks Gerados", | |
| lines=10, | |
| max_lines=15, | |
| interactive=False | |
| ) | |
| with gr.Tab("Por Sentenças"): | |
| sentences_stats = gr.JSON(label="Estatísticas") | |
| sentences_chunks = gr.Textbox( | |
| label="Chunks Gerados", | |
| lines=10, | |
| max_lines=15, | |
| interactive=False | |
| ) | |
| with gr.Tab("Semântico"): | |
| semantic_stats = gr.JSON(label="Estatísticas") | |
| semantic_chunks = gr.Textbox( | |
| label="Chunks Gerados", | |
| lines=10, | |
| max_lines=15, | |
| interactive=False | |
| ) | |
| with gr.Tab("Recursivo"): | |
| recursive_stats = gr.JSON(label="Estatísticas") | |
| recursive_chunks = gr.Textbox( | |
| label="Chunks Gerados", | |
| lines=10, | |
| max_lines=15, | |
| interactive=False | |
| ) | |
| # Função de comparação | |
| def compare_strategies(text, chunk_size_val): | |
| if not text or not text.strip(): | |
| return ( | |
| "**Erro**: Por favor, forneça um texto para análise", | |
| {}, "", {}, "", {}, "", {}, "" | |
| ) | |
| try: | |
| results = compare_chunking_strategies(text, int(chunk_size_val)) | |
| # Cria resumo | |
| summary_lines = ["## Resumo da Comparação\n"] | |
| summary_lines.append(f"**Texto original**: {len(text)} caracteres\n") | |
| summary_lines.append(f"**Tamanho máximo do chunk**: {chunk_size_val}\n") | |
| summary_lines.append("\n### Resultados por Estratégia:\n") | |
| for strategy, data in results.items(): | |
| if data["success"]: | |
| stats = data["stats"] | |
| summary_lines.append( | |
| f"- **{strategy.title()}**: {stats['total_chunks']} chunks " | |
| f"(média: {stats['avg_size']:.0f} chars)" | |
| ) | |
| else: | |
| summary_lines.append(f"- **{strategy.title()}**: Erro - {data.get('error', 'Desconhecido')}") | |
| summary = "\n".join(summary_lines) | |
| # Formata chunks para exibição | |
| def format_chunks(chunks): | |
| if not chunks: | |
| return "Nenhum chunk gerado" | |
| formatted = [] | |
| for i, chunk in enumerate(chunks[:5]): # Mostra primeiros 5 | |
| formatted.append(f"--- Chunk {i+1} ({len(chunk)} chars) ---\n{chunk}\n") | |
| if len(chunks) > 5: | |
| formatted.append(f"\n... e mais {len(chunks) - 5} chunks") | |
| return "\n".join(formatted) | |
| # Extrai dados | |
| fixed_data = results.get("fixed", {}) | |
| sentences_data = results.get("sentences", {}) | |
| semantic_data = results.get("semantic", {}) | |
| recursive_data = results.get("recursive", {}) | |
| return ( | |
| summary, | |
| fixed_data.get("stats", {}), | |
| format_chunks(fixed_data.get("chunks", [])), | |
| sentences_data.get("stats", {}), | |
| format_chunks(sentences_data.get("chunks", [])), | |
| semantic_data.get("stats", {}), | |
| format_chunks(semantic_data.get("chunks", [])), | |
| recursive_data.get("stats", {}), | |
| format_chunks(recursive_data.get("chunks", [])) | |
| ) | |
| except Exception as e: | |
| error_msg = f"**Erro na comparação**: {str(e)}" | |
| return (error_msg, {}, "", {}, "", {}, "", {}, "") | |
| # Conecta evento | |
| compare_btn.click( | |
| fn=compare_strategies, | |
| inputs=[sample_text, chunk_size_compare], | |
| outputs=[ | |
| comparison_summary, | |
| fixed_stats, fixed_chunks, | |
| sentences_stats, sentences_chunks, | |
| semantic_stats, semantic_chunks, | |
| recursive_stats, recursive_chunks | |
| ] | |
| ) | |