Spaces:
Sleeping
Sleeping
import streamlit as st | |
import os | |
from langchain.chains import RetrievalQA | |
from langchain.vectorstores import Chroma, Pinecone | |
from langchain.llms import OpenAI | |
from langchain.document_loaders import TextLoader | |
from langchain.document_loaders import PyPDFLoader | |
from langchain.indexes import VectorstoreIndexCreator | |
from langchain.text_splitter import CharacterTextSplitter, RecursiveCharacterTextSplitter | |
from langchain.embeddings import OpenAIEmbeddings | |
from langchain.vectorstores import Chroma | |
from langchain.document_loaders import UnstructuredPDFLoader, OnlinePDFLoader | |
import pinecone | |
# Set the path where you want to save the uploaded PDF file | |
SAVE_DIR = "pdf" | |
st.header('Question Answering with your PDF file') | |
st.write("Are you interested in chatting with your own documents, whether it is a text file, a PDF, or a website? LangChain makes it easy for you to do question answering with your documents.") | |
def qa(file, query, chain_type, k,api_key_pinecode,index_name,environment_pinecode): | |
# load document | |
loader = PyPDFLoader(file) | |
#loader = UnstructuredPDFLoader(file) | |
#loader = OnlinePDFLoader("https://wolfpaulus.com/wp-content/uploads/2017/05/field-guide-to-data-science.pdf") | |
documents = loader.load() | |
#print("doccs",documents) | |
# split the documents into chunks | |
# text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0) | |
# texts = text_splitter.split_documents(documents) | |
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=0) | |
texts = text_splitter.split_documents(documents) | |
# select which embeddings we want to use | |
embeddings = OpenAIEmbeddings() | |
# create the vectorestore to use as the index | |
# initialize pinecone | |
pinecone.init( | |
api_key=api_key_pinecode, # find at app.pinecone.io | |
environment=environment_pinecode #"northamerica-northeast1-gcp" # next to api key in console | |
) | |
#index_name = "openaiindex" | |
index_name = index_name | |
#db = Chroma.from_documents(texts, embeddings) | |
#db = Pinecone.from_texts(texts, embeddings) | |
db = Pinecone.from_texts([t.page_content for t in texts], embeddings, index_name=index_name) | |
# expose this index in a retriever interface | |
retriever = db.as_retriever(search_type="similarity", search_kwargs={"k": k}) | |
# create a chain to answer questions | |
qa = RetrievalQA.from_chain_type( | |
llm=OpenAI(), chain_type=chain_type, retriever=retriever, return_source_documents=True) | |
result = qa({"query": query}) | |
print(result['result']) | |
return result | |
with st.sidebar: | |
st.header('Configurations') | |
st.write("Enter OpenAI API key. This costs $. Set up billing at [OpenAI](https://platform.openai.com/account).") | |
apikey = st.text_input("Enter your OpenAI API Key here") | |
os.environ["OPENAI_API_KEY"] = apikey | |
st.write("Enter Pinecode API key. [Pinecode](https://www.pinecone.io/).") | |
apikey2 = st.text_input("Enter your Pinecone Key here") | |
enviroment_pinecode = st.text_input("Enter your Pinecone your environment Key") | |
index_name = st.text_input("enter index-name") | |
left_column, right_column = st.columns(2) | |
# You can use a column just like st.sidebar: | |
with left_column: | |
# Add a file uploader to the app | |
uploaded_file = st.file_uploader("Choose a PDF file", type="pdf") | |
# Check if a file has been uploaded | |
if uploaded_file is not None: | |
# Save the uploaded file to the specified directory | |
file_path = os.path.join(SAVE_DIR, uploaded_file.name) | |
with open(file_path, "wb") as f: | |
f.write(uploaded_file.getbuffer()) | |
st.success(f"File path {file_path}") | |
query = st.text_input("enter your question") | |
chain_type = st.selectbox( | |
'chain type', | |
('stuff', 'map_reduce', "refine", "map_rerank")) | |
k = st.slider('Number of relevant chunks', 1, 5) | |
if st.button('Loading'): | |
# Or even better, call Streamlit functions inside a "with" block: | |
result=qa(file_path, query, chain_type, k, apikey2, index_name, enviroment_pinecode) | |
with right_column: | |
st.write("Output of your question") | |
#st.write(result) | |
#st.write(result['result']) | |
st.subheader("Result") | |
st.write(result['result']) | |
st.subheader("source_documents") | |
st.write(result['source_documents'][0]) | |