Update app.py
Browse files
app.py
CHANGED
@@ -1,31 +1,16 @@
|
|
1 |
-
# -*- coding: utf-8
|
2 |
-
# Reinaldo Chaves ([email protected])
|
3 |
-
# Este projeto implementa um sistema de Recuperação de Informações Aumentada por Geração (RAG) conversacional
|
4 |
-
# usando Streamlit, LangChain, e modelos de linguagem de grande escala - para entrevistar PDFs
|
5 |
-
# Geração de respostas usando o modelo Gemma2-9b-It da Groq
|
6 |
-
# Embeddings de texto usando o modelo all-MiniLM-L6-v2 do Hugging Face
|
7 |
-
#
|
8 |
-
|
9 |
-
import sys
|
10 |
-
import platform
|
11 |
-
|
12 |
-
__import__('pysqlite3')
|
13 |
-
sys.modules['sqlite3'] = sys.modules.pop('pysqlite3')
|
14 |
-
|
15 |
import streamlit as st
|
16 |
from langchain.chains import create_history_aware_retriever, create_retrieval_chain
|
17 |
from langchain.chains.combine_documents import create_stuff_documents_chain
|
18 |
-
from langchain_chroma import Chroma
|
19 |
from langchain_community.chat_message_histories import ChatMessageHistory
|
20 |
from langchain_core.chat_history import BaseChatMessageHistory
|
21 |
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
|
22 |
from langchain_groq import ChatGroq
|
23 |
from langchain_core.runnables.history import RunnableWithMessageHistory
|
24 |
-
from
|
25 |
from langchain_text_splitters import RecursiveCharacterTextSplitter
|
26 |
from langchain_community.document_loaders import PyPDFLoader
|
|
|
27 |
import os
|
28 |
-
import chromadb
|
29 |
import tempfile
|
30 |
|
31 |
# Configurar o tema para dark
|
@@ -56,23 +41,7 @@ st.markdown("""
|
|
56 |
# Sidebar com orientações
|
57 |
st.sidebar.title("Menu")
|
58 |
st.sidebar.markdown("""
|
59 |
-
|
60 |
-
* Para recomeçar uma nova sessão pressione F5.
|
61 |
-
|
62 |
-
**Atenção:** Os documentos que você compartilhar com o modelo de IA generativa podem ser usados pelo Gemini para treinar o sistema. Portanto, evite compartilhar documentos PDF que contenham:
|
63 |
-
1. Dados bancários e financeiros
|
64 |
-
2. Dados de sua própria empresa
|
65 |
-
3. Informações pessoais
|
66 |
-
4. Informações de propriedade intelectual
|
67 |
-
5. Conteúdos autorais
|
68 |
-
|
69 |
-
E não use IA para escrever um texto inteiro! O auxílio é melhor para gerar resumos, filtrar informações ou auxiliar a entender contextos - que depois devem ser checados. Inteligência Artificial comete erros (alucinações, viés, baixa qualidade, problemas éticos)!
|
70 |
-
|
71 |
-
Este projeto não se responsabiliza pelos conteúdos criados a partir deste site.
|
72 |
-
|
73 |
-
**Sobre este app**
|
74 |
-
|
75 |
-
Este aplicativo foi desenvolvido por Reinaldo Chaves. Para mais informações, contribuições e feedback, visite o [repositório do projeto no GitHub](https://github.com/seu_usuario/seu_repositorio).
|
76 |
""")
|
77 |
|
78 |
st.title("RAG conversacional com upload em PDF e histórico de bate-papo")
|
@@ -112,27 +81,8 @@ if groq_api_key and huggingface_api_token:
|
|
112 |
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
|
113 |
splits = text_splitter.split_documents(documents)
|
114 |
|
115 |
-
# Create
|
116 |
-
|
117 |
-
|
118 |
-
# Initialize Chroma client with persistence
|
119 |
-
chroma_client = chromadb.PersistentClient(path="./chroma_db")
|
120 |
-
|
121 |
-
# Create or get the collection
|
122 |
-
collection_name = "pdf_collection"
|
123 |
-
collection = chroma_client.get_or_create_collection(name=collection_name)
|
124 |
-
|
125 |
-
# Create Chroma vector store
|
126 |
-
vectorstore = Chroma(
|
127 |
-
client=chroma_client,
|
128 |
-
collection_name=collection_name,
|
129 |
-
embedding_function=embeddings
|
130 |
-
)
|
131 |
-
|
132 |
-
# Add documents in batches
|
133 |
-
for i in range(0, len(splits), batch_size):
|
134 |
-
batch = splits[i:i+batch_size]
|
135 |
-
vectorstore.add_documents(batch)
|
136 |
|
137 |
st.success(f"Processed {len(splits)} document chunks.")
|
138 |
|
@@ -155,10 +105,10 @@ if groq_api_key and huggingface_api_token:
|
|
155 |
|
156 |
system_prompt = (
|
157 |
"Você é um assistente para tarefas de resposta a perguntas. Responda em Português do Brasil a menos que seja pedido outro idioma"
|
158 |
-
"Use os seguintes pedaços de contexto recuperado para responder "
|
159 |
-
"à pergunta. Se você não sabe a resposta, diga que "
|
160 |
-
"não sabe. Use no máximo três frases e mantenha a "
|
161 |
-
"resposta concisa."
|
162 |
"\n\n"
|
163 |
"{context}"
|
164 |
)
|
@@ -191,7 +141,7 @@ if groq_api_key and huggingface_api_token:
|
|
191 |
{"input": user_input},
|
192 |
config={"configurable": {"session_id": session_id}},
|
193 |
)
|
194 |
-
st.write("
|
195 |
|
196 |
with st.expander("Ver histórico do chat"):
|
197 |
for message in session_history.messages:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
import streamlit as st
|
2 |
from langchain.chains import create_history_aware_retriever, create_retrieval_chain
|
3 |
from langchain.chains.combine_documents import create_stuff_documents_chain
|
|
|
4 |
from langchain_community.chat_message_histories import ChatMessageHistory
|
5 |
from langchain_core.chat_history import BaseChatMessageHistory
|
6 |
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
|
7 |
from langchain_groq import ChatGroq
|
8 |
from langchain_core.runnables.history import RunnableWithMessageHistory
|
9 |
+
from langchain_community.embeddings import HuggingFaceEmbeddings
|
10 |
from langchain_text_splitters import RecursiveCharacterTextSplitter
|
11 |
from langchain_community.document_loaders import PyPDFLoader
|
12 |
+
from langchain_community.vectorstores import FAISS
|
13 |
import os
|
|
|
14 |
import tempfile
|
15 |
|
16 |
# Configurar o tema para dark
|
|
|
41 |
# Sidebar com orientações
|
42 |
st.sidebar.title("Menu")
|
43 |
st.sidebar.markdown("""
|
44 |
+
# ... [O conteúdo do sidebar permanece o mesmo] ...
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
""")
|
46 |
|
47 |
st.title("RAG conversacional com upload em PDF e histórico de bate-papo")
|
|
|
81 |
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
|
82 |
splits = text_splitter.split_documents(documents)
|
83 |
|
84 |
+
# Create FAISS vector store
|
85 |
+
vectorstore = FAISS.from_documents(splits, embeddings)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
|
87 |
st.success(f"Processed {len(splits)} document chunks.")
|
88 |
|
|
|
105 |
|
106 |
system_prompt = (
|
107 |
"Você é um assistente para tarefas de resposta a perguntas. Responda em Português do Brasil a menos que seja pedido outro idioma"
|
108 |
+
"Use os seguintes pedaços de contexto recuperado para responder "
|
109 |
+
"à pergunta. Se você não sabe a resposta, diga que "
|
110 |
+
"não sabe. Use no máximo três frases e mantenha a "
|
111 |
+
"resposta concisa."
|
112 |
"\n\n"
|
113 |
"{context}"
|
114 |
)
|
|
|
141 |
{"input": user_input},
|
142 |
config={"configurable": {"session_id": session_id}},
|
143 |
)
|
144 |
+
st.write("Assistente:", response['answer'])
|
145 |
|
146 |
with st.expander("Ver histórico do chat"):
|
147 |
for message in session_history.messages:
|