CoolFace
Apppublic

anuksharam/websitespace

sourceHugging Faceupdated 2y agoView on Hugging Face
0likes
rag.py127 linesDownload Raw Back to root
1import streamlit as st2from langchain_community.document_loaders import PyPDFLoader3 4st.title("RAG Demo")5 6 7'''8Provide a URL to a PDF document you want to ask questions about.9Once the document has been uploaded and parsed, ask your questions in the chat dialog that will appear below. 10'''11 12# Create a file uploader?13# st.sidebar.file_uploader("Choose a PDF file", type=["pdf"])14url = st.text_input("PDF URL", "https://www.resources.ca.gov/-/media/CNRA-Website/Files/2024_30x30_Pathways_Progress_Report.pdf")15 16# +17import bs418from langchain import hub19from langchain_chroma import Chroma20from langchain_community.document_loaders import WebBaseLoader21from langchain_core.output_parsers import StrOutputParser22from langchain_core.runnables import RunnablePassthrough23from langchain_openai import OpenAIEmbeddings24from langchain_text_splitters import RecursiveCharacterTextSplitter25 26 27 28 29@st.cache_data30def pdf_loader(url):31    loader = PyPDFLoader(url)32    return loader.load()33 34 35@st.cache_data36def html_loader(url):37# Load, chunk and index the contents of the blog.38    loader = WebBaseLoader(39        url,40        bs_kwargs=dict(41            parse_only=bs4.SoupStrainer(42                class_=("post-content", "post-title", "post-header")43            )44        ),45    )46    return loader.load()47 48 49# -50 51docs = doc_loader(url)52 53# Set up the language model54from langchain_openai import ChatOpenAI55llm = ChatOpenAI(model = "llama3", api_key=st.secrets["LITELLM_KEY"], base_url = "https://llm.nrp-nautilus.io",  temperature=0)56 57# Set up the embedding model58from langchain_openai import OpenAIEmbeddings59embedding = OpenAIEmbeddings(60    model = "embed-mistral", 61    api_key=st.secrets["LITELLM_KEY"], 62    base_url = "https://llm.nrp-nautilus.io"63)64 65# Build a retrival agent66from langchain_core.vectorstores import InMemoryVectorStore67from langchain_text_splitters import RecursiveCharacterTextSplitter68text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)69splits = text_splitter.split_documents(docs)70vectorstore = InMemoryVectorStore.from_documents(documents=splits, embedding=embedding)71retriever = vectorstore.as_retriever()72 73from langchain.chains import create_retrieval_chain74from langchain.chains.combine_documents import create_stuff_documents_chain75from langchain_core.prompts import ChatPromptTemplate76system_prompt = (77    "You are an assistant for question-answering tasks. "78    "Use the following pieces of retrieved context to answer "79    "the question. If you don't know the answer, say that you "80    "don't know. Use three sentences maximum and keep the "81    "answer concise."82    "\n\n"83    "{context}"84)85prompt = ChatPromptTemplate.from_messages(86    [87        ("system", system_prompt),88        ("human", "{input}"),89    ]90)91question_answer_chain = create_stuff_documents_chain(llm, prompt)92rag_chain = create_retrieval_chain(retriever, question_answer_chain)93 94# +95# agent is ready to test:96 97#results = rag_chain.invoke({"input": "What is the goal of CA 30x30?"})98#results['answer']99#results['context'][0].page_content100#results['context'][0].metadata101 102# -103 104# results['context'][0].page_content105# results['context'][0].metadata106 107 108# Place agent inside a streamlit application:109 110if prompt := st.chat_input("What is the goal of CA 30x30?"):111    with st.chat_message("user"):112        st.markdown(prompt)113 114    with st.chat_message("assistant"):115        results = rag_chain.invoke({"input": prompt})116        st.write(results['answer'])117 118        with st.expander("See context matched"):119            st.write(results['context'][0].page_content)120            st.write(results['context'][0].metadata)121 122 123# adapt for memory / multi-question interaction with:124# https://python.langchain.com/docs/tutorials/qa_chat_history/125 126# Also see structured outputs.127