| import os |
| import streamlit as st |
| from model import ChatModel |
| import rag_util |
|
|
| st.title("RAG By Karim Ben Khaled") |
|
|
| @st.cache_resource |
| def load_model(): |
| model = ChatModel(model_id="microsoft/Phi-3-mini-4k-instruct", device="cpu") |
| return model |
|
|
| @st.cache_resource |
| def load_encoder(): |
| encoder = rag_util.Encoder( |
| model_name="sentence-transformers/all-MiniLM-L12-v2", device="cpu" |
| ) |
| return encoder |
|
|
| model = load_model() |
| encoder = load_encoder() |
|
|
| def save_file(uploaded_file): |
| """helper function to save documents to disk""" |
| file_path = uploaded_file.name |
| with open(file_path, "wb") as f: |
| f.write(uploaded_file.getbuffer()) |
| return file_path |
|
|
| with st.sidebar: |
| max_new_tokens = st.number_input("max_new_tokens", 128, 4096, 512) |
| k = st.number_input("k", 1, 10, 3) |
| uploaded_files = st.file_uploader( |
| "Upload PDFs, CSVs, or JSONs for context", |
| type=["PDF", "pdf", "csv", "json"], |
| accept_multiple_files=True |
| ) |
| file_paths = [] |
| for uploaded_file in uploaded_files: |
| file_paths.append(save_file(uploaded_file)) |
| if uploaded_files: |
| docs = [] |
| for file_path in file_paths: |
| if file_path.endswith(".pdf"): |
| docs.extend(rag_util.load_and_split_pdfs([file_path])) |
| elif file_path.endswith(".csv"): |
| docs.extend(rag_util.load_and_split_csv(file_path)) |
| elif file_path.endswith(".json"): |
| docs.extend(rag_util.load_and_split_json(file_path)) |
| DB = rag_util.FaissDb(docs=docs, embedding_function=encoder.embedding_function) |
|
|
| |
| if "messages" not in st.session_state: |
| st.session_state.messages = [] |
|
|
| |
| for message in st.session_state.messages: |
| with st.chat_message(message["role"]): |
| st.markdown(message["content"]) |
|
|
| |
| if prompt := st.chat_input("Ask me anything!"): |
| |
| st.session_state.messages.append({"role": "user", "content": prompt}) |
| |
| with st.chat_message("user"): |
| st.markdown(prompt) |
|
|
| |
| with st.chat_message("assistant"): |
| user_prompt = st.session_state.messages[-1]["content"] |
| context = ( |
| None if not uploaded_files else DB.similarity_search(user_prompt, k=k) |
| ) |
| answer = model.generate( |
| user_prompt, context=context, max_new_tokens=max_new_tokens |
| ) |
|
|
| response = st.write(answer) |
| st.session_state.messages.append({"role": "assistant", "content": answer}) |
|
|