Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import chromadb | |
| import pandas as pd | |
| from sentence_transformers import SentenceTransformer | |
| # --- 1. SETUP MODELS AND DATABASE --- | |
| print("Loading embedding model...") | |
| embedding_model = SentenceTransformer('all-MiniLM-L6-v2') | |
| client = chromadb.Client() | |
| collection = client.get_or_create_collection( | |
| name="transcript_demo_hf_space", | |
| metadata={"hnsw:space": "cosine"} | |
| ) | |
| print("ChromaDB collection ready.") | |
| # --- 2. CORE FUNCTIONS --- | |
| def index_transcript(transcript_text): | |
| if not transcript_text.strip(): | |
| return "Please paste a transcript before indexing.", pd.DataFrame() | |
| chunks = [chunk.strip() for chunk in transcript_text.split('\\n') if chunk.strip()] | |
| ids = [f"chunk_{i}" for i in range(len(chunks))] | |
| if collection.count() > 0: | |
| collection.delete(ids=collection.get()['ids']) | |
| collection.add(documents=chunks, ids=ids) | |
| indexed_df = pd.DataFrame({"Indexed Chunks": chunks}) | |
| return f"✅ Indexed {len(chunks)} chunks successfully!", indexed_df | |
| def search_transcript(query): | |
| if not query.strip(): | |
| return pd.DataFrame(), "Please enter a query." | |
| results = collection.query(query_texts=[query], n_results=3) | |
| if not results or not results['documents'][0]: | |
| return pd.DataFrame(), "No similar chunks found." | |
| documents = results['documents'][0] | |
| distances = results['distances'][0] | |
| similarities = [f"{1 - dist:.2f}" for dist in distances] | |
| df = pd.DataFrame({ | |
| "Similarity Score": similarities, | |
| "Matching Chunk": documents | |
| }) | |
| return df, "Search complete." | |
| # --- 3. GRADIO INTERFACE --- | |
| sample_transcript = """Operador: Bem-vindo à TechServices, meu nome é João. Como posso ajudar? | |
| Cliente: Olá, João. Estou muito frustrado. Minha conexão de internet não funciona há três dias. | |
| Operador: Entendo perfeitamente sua frustração. Ficar sem internet é muito ruim. Vou verificar o sistema agora mesmo para resolver isso. | |
| Cliente: É o mínimo que espero. Já é a terra vez que isso acontece este mês. | |
| Operador: Lamento sinceramente por essa recorrência. Vejo aqui que há uma instabilidade na sua região. Posso agendar uma visita técnica para amanhã de manhã para trocar seu modem por um modelo mais novo, ou podemos tentar um procedimento de reinicialização remota agora mesmo. Qual você prefere? | |
| Cliente: Uma visita técnica seria bom. Pelo menos garante que alguém vai olhar isso direito. | |
| Operador: Combinado. Agendado para amanhã, entre 8h e 10h. O protocolo é 987654. Posso ajudar com mais alguma coisa? | |
| Cliente: Não, por enquanto é só isso. Obrigado. | |
| """ | |
| with gr.Blocks(theme=gr.themes.Soft(), title="Guideline Compliance Tester") as demo: | |
| gr.Markdown("# 🤖 Guideline Compliance Prototype") | |
| gr.Markdown("An interactive demo to test semantic search on call transcripts using ChromaDB.") | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| gr.Markdown("### 1. Index a Transcript") | |
| transcript_input = gr.Textbox(lines=15, label="Paste Full Transcript Here", value=sample_transcript) | |
| index_button = gr.Button("Index Transcript", variant="primary") | |
| index_status = gr.Label(value="Status: Waiting for transcript.") | |
| indexed_preview = gr.DataFrame(headers=["Indexed Chunks"], label="Indexed Data Preview", interactive=False) | |
| with gr.Column(scale=1): | |
| gr.Markdown("### 2. Search for Compliance") | |
| query_input = gr.Textbox(label="Guideline Query", placeholder="Ex: O operador ofereceu duas opções?", info="Try queries like: 'O cliente mostrou insatisfação?' or 'O agente se desculpou pelo problema?'") | |
| search_button = gr.Button("Search", variant="primary") | |
| search_status = gr.Label(value="Status: Waiting for query.") | |
| results_output = gr.DataFrame(headers=["Similarity Score", "Matching Chunk"], label="Search Results (Top 3)", interactive=False) | |
| index_button.click(fn=index_transcript, inputs=[transcript_input], outputs=[index_status, indexed_preview]) | |
| search_button.click(fn=search_transcript, inputs=[query_input], outputs=[results_output, search_status]) | |
| demo.launch() | |