Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
import gradio as gr
|
2 |
import torch
|
3 |
from sentence_transformers import SentenceTransformer, util
|
4 |
-
#
|
5 |
from transformers import AutoTokenizer, AutoModelForCausalLM
|
6 |
from pypdf import PdfReader
|
7 |
import os
|
@@ -11,7 +11,7 @@ import os
|
|
11 |
print("Carregando o modelo de recuperação (Sentence Transformer)...")
|
12 |
retriever_model = SentenceTransformer('all-MiniLM-L6-v2')
|
13 |
|
14 |
-
#
|
15 |
print("Carregando o modelo de geração (DeepSeek)...")
|
16 |
# Nota: "trust_remote_code=True" é necessário para carregar a arquitetura do DeepSeek
|
17 |
generator_tokenizer = AutoTokenizer.from_pretrained(
|
@@ -69,15 +69,14 @@ def answer_question(question, knowledge_state):
|
|
69 |
|
70 |
knowledge_base, knowledge_base_embeddings = knowledge_state
|
71 |
|
72 |
-
# Etapa de Recuperação
|
73 |
question_embedding = retriever_model.encode(question, convert_to_tensor=True)
|
74 |
cosine_scores = util.cos_sim(question_embedding, knowledge_base_embeddings)
|
75 |
-
#
|
76 |
top_k = min(7, len(knowledge_base))
|
77 |
top_results = torch.topk(cosine_scores, k=top_k, dim=-1)
|
78 |
retrieved_context = "\n---\n".join([knowledge_base[i] for i in top_results.indices[0]])
|
79 |
|
80 |
-
# Verificação para garantir que o contexto não está vazio
|
81 |
if not retrieved_context.strip():
|
82 |
return "Não foi possível encontrar um contexto relevante nos documentos para responder a esta pergunta."
|
83 |
|
@@ -85,13 +84,15 @@ def answer_question(question, knowledge_state):
|
|
85 |
print(f"Pergunta: {question}")
|
86 |
print(f"Contexto Recuperado (Top {top_k}):\n{retrieved_context}")
|
87 |
|
88 |
-
# MUDANÇA PRINCIPAL: Prompt
|
89 |
prompt = f"""### Instruction:
|
90 |
-
Você é um assistente de IA especialista em
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
|
|
|
|
95 |
|
96 |
**Contexto:**
|
97 |
{retrieved_context}
|
@@ -108,7 +109,7 @@ Regras importantes:
|
|
108 |
# Ajuste nos parâmetros de geração
|
109 |
outputs = generator_model.generate(
|
110 |
input_ids,
|
111 |
-
#
|
112 |
max_new_tokens=350,
|
113 |
do_sample=False,
|
114 |
eos_token_id=generator_tokenizer.eos_token_id,
|
@@ -126,7 +127,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as interface:
|
|
126 |
knowledge_state = gr.State()
|
127 |
gr.Markdown(
|
128 |
"""
|
129 |
-
# 🤖 RAG - Auditor de Documentos (
|
130 |
**1. Carregue seus arquivos**: Envie um ou mais certificados ou documentos nos formatos `.pdf` ou `.txt`.
|
131 |
**2. Processe os arquivos**: Clique no botão para criar a base de conhecimento.
|
132 |
**3. Faça perguntas**: Após o processamento, faça perguntas sobre o conteúdo dos documentos.
|
|
|
1 |
import gradio as gr
|
2 |
import torch
|
3 |
from sentence_transformers import SentenceTransformer, util
|
4 |
+
# Usaremos AutoTokenizer e AutoModelForCausalLM para o novo modelo
|
5 |
from transformers import AutoTokenizer, AutoModelForCausalLM
|
6 |
from pypdf import PdfReader
|
7 |
import os
|
|
|
11 |
print("Carregando o modelo de recuperação (Sentence Transformer)...")
|
12 |
retriever_model = SentenceTransformer('all-MiniLM-L6-v2')
|
13 |
|
14 |
+
# Carregando o modelo de geração DeepSeek
|
15 |
print("Carregando o modelo de geração (DeepSeek)...")
|
16 |
# Nota: "trust_remote_code=True" é necessário para carregar a arquitetura do DeepSeek
|
17 |
generator_tokenizer = AutoTokenizer.from_pretrained(
|
|
|
69 |
|
70 |
knowledge_base, knowledge_base_embeddings = knowledge_state
|
71 |
|
72 |
+
# Etapa de Recuperação
|
73 |
question_embedding = retriever_model.encode(question, convert_to_tensor=True)
|
74 |
cosine_scores = util.cos_sim(question_embedding, knowledge_base_embeddings)
|
75 |
+
# Aumentado para 7 para mais contexto
|
76 |
top_k = min(7, len(knowledge_base))
|
77 |
top_results = torch.topk(cosine_scores, k=top_k, dim=-1)
|
78 |
retrieved_context = "\n---\n".join([knowledge_base[i] for i in top_results.indices[0]])
|
79 |
|
|
|
80 |
if not retrieved_context.strip():
|
81 |
return "Não foi possível encontrar um contexto relevante nos documentos para responder a esta pergunta."
|
82 |
|
|
|
84 |
print(f"Pergunta: {question}")
|
85 |
print(f"Contexto Recuperado (Top {top_k}):\n{retrieved_context}")
|
86 |
|
87 |
+
# MUDANÇA PRINCIPAL: Prompt com regras explícitas de extração de entidades
|
88 |
prompt = f"""### Instruction:
|
89 |
+
Você é um assistente de IA especialista em extrair informações de documentos técnicos. Analise o 'Contexto' para responder à 'Pergunta' seguindo estas regras rigorosamente:
|
90 |
+
|
91 |
+
**Regras de Extração:**
|
92 |
+
1. **Use APENAS a informação do 'Contexto'.** Não adicione informações externas.
|
93 |
+
2. **Para perguntas sobre 'cliente':** Procure por linhas que comecem com "Cliente:", "Contratante:", ou um nome de empresa claro. Ignore frases genéricas sobre escopo ou lotes.
|
94 |
+
3. **Para perguntas sobre 'instrumento':** Procure por linhas que comecem com "Instrumento:", "Descrição:", "Objeto:", "TAG:", ou um modelo específico. Ignore descrições de métodos de calibração.
|
95 |
+
4. **Para perguntas sobre 'título' ou 'resumo':** Resuma os dados principais, como o tipo de documento (ex: Certificado de Calibração), o nome do cliente e o instrumento calibrado.
|
96 |
|
97 |
**Contexto:**
|
98 |
{retrieved_context}
|
|
|
109 |
# Ajuste nos parâmetros de geração
|
110 |
outputs = generator_model.generate(
|
111 |
input_ids,
|
112 |
+
# Aumentado para permitir respostas mais detalhadas
|
113 |
max_new_tokens=350,
|
114 |
do_sample=False,
|
115 |
eos_token_id=generator_tokenizer.eos_token_id,
|
|
|
127 |
knowledge_state = gr.State()
|
128 |
gr.Markdown(
|
129 |
"""
|
130 |
+
# 🤖 RAG - Auditor de Documentos (v8 - Extração de Entidades)
|
131 |
**1. Carregue seus arquivos**: Envie um ou mais certificados ou documentos nos formatos `.pdf` ou `.txt`.
|
132 |
**2. Processe os arquivos**: Clique no botão para criar a base de conhecimento.
|
133 |
**3. Faça perguntas**: Após o processamento, faça perguntas sobre o conteúdo dos documentos.
|