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]) | |