Update backend/main.py
Browse files- backend/main.py +10 -11
backend/main.py
CHANGED
|
@@ -19,10 +19,9 @@ from langchain_community.vectorstores import FAISS
|
|
| 19 |
from langchain_core.runnables import RunnablePassthrough, RunnableLambda
|
| 20 |
from langchain_core.output_parsers import StrOutputParser
|
| 21 |
|
| 22 |
-
# Carrega as API keys do arquivo .env
|
| 23 |
load_dotenv()
|
| 24 |
|
| 25 |
-
# --- 1. Inicialização
|
| 26 |
app = FastAPI()
|
| 27 |
|
| 28 |
app.add_middleware(
|
|
@@ -33,12 +32,13 @@ app.add_middleware(
|
|
| 33 |
allow_headers=["*"],
|
| 34 |
)
|
| 35 |
|
| 36 |
-
# --- 2. Configurações de IA
|
| 37 |
HF_EMBEDDING_MODEL = "sentence-transformers/all-MiniLM-L6-v2"
|
| 38 |
|
| 39 |
-
# MUDANÇA
|
|
|
|
| 40 |
model = ChatGroq(
|
| 41 |
-
model=
|
| 42 |
temperature=0.3
|
| 43 |
)
|
| 44 |
|
|
@@ -47,7 +47,7 @@ embeddings = HuggingFaceEmbeddings(
|
|
| 47 |
model_kwargs={'device': 'cpu'}
|
| 48 |
)
|
| 49 |
|
| 50 |
-
#
|
| 51 |
rag_system_prompt = (
|
| 52 |
"Você é um assistente experiente e prestativo. "
|
| 53 |
"Sua tarefa é fornecer respostas detalhadas e ricas em contexto com base nas informações fornecidas. "
|
|
@@ -62,7 +62,7 @@ rag_prompt = ChatPromptTemplate.from_messages(
|
|
| 62 |
|
| 63 |
rag_chain = None
|
| 64 |
|
| 65 |
-
# --- 3.
|
| 66 |
class ChatRequest(BaseModel):
|
| 67 |
content: str
|
| 68 |
|
|
@@ -91,16 +91,16 @@ async def upload_document(file: UploadFile = File(...)):
|
|
| 91 |
loader = PyPDFLoader(temp_path)
|
| 92 |
docs = loader.load()
|
| 93 |
|
| 94 |
-
#
|
| 95 |
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1200, chunk_overlap=200)
|
| 96 |
splits = text_splitter.split_documents(docs)
|
| 97 |
|
| 98 |
vectorstore = FAISS.from_documents(documents=splits, embedding=embeddings)
|
| 99 |
|
| 100 |
-
#
|
| 101 |
retriever = vectorstore.as_retriever(search_kwargs={"k": 6})
|
| 102 |
|
| 103 |
-
# Chain
|
| 104 |
rag_chain = (
|
| 105 |
RunnablePassthrough.assign(
|
| 106 |
context=(lambda x: x["input"]) | retriever | format_docs
|
|
@@ -110,7 +110,6 @@ async def upload_document(file: UploadFile = File(...)):
|
|
| 110 |
| StrOutputParser()
|
| 111 |
)
|
| 112 |
|
| 113 |
-
# MUDANÇA 5: Retorno com estatísticas (igual ao app 26)
|
| 114 |
return {
|
| 115 |
"message": "Processamento concluído!",
|
| 116 |
"filename": file.filename,
|
|
|
|
| 19 |
from langchain_core.runnables import RunnablePassthrough, RunnableLambda
|
| 20 |
from langchain_core.output_parsers import StrOutputParser
|
| 21 |
|
|
|
|
| 22 |
load_dotenv()
|
| 23 |
|
| 24 |
+
# --- 1. Inicialização ---
|
| 25 |
app = FastAPI()
|
| 26 |
|
| 27 |
app.add_middleware(
|
|
|
|
| 32 |
allow_headers=["*"],
|
| 33 |
)
|
| 34 |
|
| 35 |
+
# --- 2. Configurações de IA ---
|
| 36 |
HF_EMBEDDING_MODEL = "sentence-transformers/all-MiniLM-L6-v2"
|
| 37 |
|
| 38 |
+
# MUDANÇA CRÍTICA: Removi o os.getenv para ignorar configurações antigas do ambiente
|
| 39 |
+
# e forçar o uso do modelo novo e funcional.
|
| 40 |
model = ChatGroq(
|
| 41 |
+
model="llama-3.3-70b-versatile",
|
| 42 |
temperature=0.3
|
| 43 |
)
|
| 44 |
|
|
|
|
| 47 |
model_kwargs={'device': 'cpu'}
|
| 48 |
)
|
| 49 |
|
| 50 |
+
# System Prompt Otimizado
|
| 51 |
rag_system_prompt = (
|
| 52 |
"Você é um assistente experiente e prestativo. "
|
| 53 |
"Sua tarefa é fornecer respostas detalhadas e ricas em contexto com base nas informações fornecidas. "
|
|
|
|
| 62 |
|
| 63 |
rag_chain = None
|
| 64 |
|
| 65 |
+
# --- 3. Modelo de Dados ---
|
| 66 |
class ChatRequest(BaseModel):
|
| 67 |
content: str
|
| 68 |
|
|
|
|
| 91 |
loader = PyPDFLoader(temp_path)
|
| 92 |
docs = loader.load()
|
| 93 |
|
| 94 |
+
# Chunking otimizado
|
| 95 |
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1200, chunk_overlap=200)
|
| 96 |
splits = text_splitter.split_documents(docs)
|
| 97 |
|
| 98 |
vectorstore = FAISS.from_documents(documents=splits, embedding=embeddings)
|
| 99 |
|
| 100 |
+
# Recuperação otimizada (k=6)
|
| 101 |
retriever = vectorstore.as_retriever(search_kwargs={"k": 6})
|
| 102 |
|
| 103 |
+
# Chain
|
| 104 |
rag_chain = (
|
| 105 |
RunnablePassthrough.assign(
|
| 106 |
context=(lambda x: x["input"]) | retriever | format_docs
|
|
|
|
| 110 |
| StrOutputParser()
|
| 111 |
)
|
| 112 |
|
|
|
|
| 113 |
return {
|
| 114 |
"message": "Processamento concluído!",
|
| 115 |
"filename": file.filename,
|