rag-weaviate / app.py
prsdm's picture
Update app.py
d3167a2 verified
raw
history blame contribute delete
No virus
5.85 kB
import streamlit as st
import os
import weaviate
from dotenv import load_dotenv,find_dotenv
from langchain.vectorstores import Weaviate
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.chat_models import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
load_dotenv(find_dotenv())
weaviate_api_key = os.getenv('WEAVIATE_API_KEY')
weaviate_cluster = os.getenv('WEAVIATE_CLUSTER')
st.set_page_config(page_title="RAG-Roman Empire")
st.image("public/images/banner.png")
st.write(
"""
<div style='text-align: center;'>
<p>Salvete! I'm here to help you learn about the Roman Empire.
Feel free to ask me anything about Roman history and culture!</p>
</div>
""",
unsafe_allow_html=True
)
with st.expander("Sample questions you can ask"):
st.markdown(
"""
<div>
<ul>
<li>What were the major achievements of the Roman Empire?</li>
<li>How did the Roman Empire rise to power?</li>
<li>How did the Roman Empire expand its territory over time? etc.</li>
</ul>
<p><b>Note:</b> you can also ask irrelevant questions to test how the RAG framework is working.</p>
</div>
""",
unsafe_allow_html=True,
)
st.sidebar.subheader("Your OpenAI Key Please")
openai_api_key = st.sidebar.text_input('Put Your Key Here: ', type="password")
with st.sidebar:
if openai_api_key.startswith('sk-') and weaviate_api_key and weaviate_cluster:
st.success('API keys and URL already provided!', icon='✅')
else:
st.warning('Please enter your credentials!', icon='⚠️')
with st.sidebar.expander("ℹ️ Disclaimer"):
st.caption(
"""We appreciate your engagement! Please note, This demo app can be shut down
after the Weaviate cluster expires on 6/22/2024.
"""
)
# Adding custom HTML content to the sidebar with your name and heading
st.sidebar.markdown(
"""
<p style='text-align: center'> This RAG App is built using: </p>
<div style='text-align: center;'>
<a href='https://weaviate.io/' target='_blank'> Weaviate</a>
<a href='https://www.langchain.com/' target='_blank'> LangChain</a>
<a href='https://openai.com/' target='_blank'><img src="https://img.icons8.com/?size=100&id=ka3InxFU3QZa&format=png&color=000000" height="26"></a>
<a href='https://huggingface.co/' target='_blank'> <img src="https://img.icons8.com/?size=100&id=sop9ROXku5bb&format=png&color=000000" height="25"></a>
</div>
</p>
""",
unsafe_allow_html=True,
)
st.sidebar.markdown(
"""
<div style='margin-top: 20px;'>
<p style='text-align: center; margin-bottom: 0; margin-top: 10;'>App created by</p>
<p style='text-align: center; margin-top: 0;'><b>Prasad Mahamulkar</b></p>
<p style='text-align: center'> GitHub
<a href='https://github.com/prsdm/RAG-Application' target='_blank'> Repository</a>
<p style='text-align: center'> Follow me for more! </p>
<div style='text-align: center;'>
<a href='https://github.com/prsdm' target='_blank'><img src="https://img.icons8.com/fluency/48/000000/github.png" height="26"></a>
<a href='https://x.com/prsdm17' target='_blank'> <img src="https://img.icons8.com/?size=100&id=phOKFKYpe00C&format=png&color=000000" height="25"></a>
<a href='https://www.linkedin.com/in/prasad-mahamulkar/' target='_blank'><img src="https://img.icons8.com/?size=100&id=8808&format=png&color=000000" height="25"></a>
<a href='https://medium.com/@prasadmahamulkar' target='_blank'><img src="https://img.icons8.com/?size=100&id=XVNvUWCvvlD9&format=png&color=000000" height="25"></a>
</div>
</p>
</div>
""",
unsafe_allow_html=True,
)
def get_qa_chain():
auth_config = weaviate.auth.AuthApiKey(api_key=weaviate_api_key)
client = weaviate.Client(
url=weaviate_cluster,
additional_headers={"X-OpenAI-Api-key": openai_api_key},
auth_client_secret=auth_config,
startup_period=10
)
vectorstore = Weaviate(client, "RomanEmpire", "content", attributes=["source"])
retriever = vectorstore.as_retriever()
template = """You are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question.
If the answer is not in the context, just say that you I don't have access to this information. Use five sentences maximum and keep the answer concise.
Question: {question}
Context: {context}
Answer:
"""
prompt = ChatPromptTemplate.from_template(template)
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0, openai_api_key=openai_api_key)
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
return chain
def generate_response(input_text):
if openai_api_key and weaviate_api_key and weaviate_cluster:
chain = get_qa_chain()
answer = chain.invoke(input_text)
st.info(answer)
else:
st.warning("Please provide all required API keys and URL!")
with st.form('my_form'):
text = st.text_input('Enter text:', 'Tell me interesting facts about Roman Empire')
submitted = st.form_submit_button('Submit')
if not openai_api_key.startswith('sk-'):
st.warning('Please enter your OpenAI API key!', icon='⚠')
if submitted and openai_api_key.startswith('sk-'):
generate_response(text)