| """Streamlit UI for Agentic RAG System - Simplified Version""" |
|
|
| import streamlit as st |
| from pathlib import Path |
| import sys |
| import time |
|
|
| |
| sys.path.append(str(Path(__file__).parent)) |
|
|
| from src.config.config import Config |
| from src.document_ingestion.document_processor import DocumentProcessor |
| from src.vectorstore.vectorstore import VectorStore |
| from src.graph_builder.graph_builder import GraphBuilder |
|
|
| |
| st.set_page_config( |
| page_title="π€ RAG Search", |
| page_icon="π", |
| layout="centered" |
| ) |
|
|
| |
| st.markdown(""" |
| <style> |
| .stButton > button { |
| width: 100%; |
| background-color: #4CAF50; |
| color: white; |
| font-weight: bold; |
| } |
| </style> |
| """, unsafe_allow_html=True) |
|
|
| def init_session_state(): |
| """Initialize session state variables""" |
| if 'rag_system' not in st.session_state: |
| st.session_state.rag_system = None |
| if 'initialized' not in st.session_state: |
| st.session_state.initialized = False |
| if 'history' not in st.session_state: |
| st.session_state.history = [] |
|
|
| @st.cache_resource |
| def initialize_rag(): |
| """Initialize the RAG system (cached)""" |
| try: |
| |
| llm = Config.get_llm() |
| doc_processor = DocumentProcessor( |
| chunk_size=Config.CHUNK_SIZE, |
| chunk_overlap=Config.CHUNK_OVERLAP |
| ) |
| vector_store = VectorStore() |
| |
| |
| urls = Config.DEFAULT_URLS |
| |
| |
| documents = doc_processor.process_urls(urls) |
| |
| |
| vector_store.create_vectorstore(documents) |
| |
| |
| graph_builder = GraphBuilder( |
| retriever=vector_store.get_retriever(), |
| llm=llm |
| ) |
| graph_builder.build() |
| |
| return graph_builder, len(documents) |
| except Exception as e: |
| st.error(f"Failed to initialize: {str(e)}") |
| return None, 0 |
|
|
| def main(): |
| """Main application""" |
| init_session_state() |
| |
| |
| st.title("π RAG Document Search") |
| st.markdown("Ask questions about the loaded documents") |
| |
| |
| if not st.session_state.initialized: |
| with st.spinner("Loading system..."): |
| rag_system, num_chunks = initialize_rag() |
| if rag_system: |
| st.session_state.rag_system = rag_system |
| st.session_state.initialized = True |
| st.success(f"β
System ready! ({num_chunks} document chunks loaded)") |
| |
| st.markdown("---") |
| |
| |
| with st.form("search_form"): |
| question = st.text_input( |
| "Enter your question:", |
| placeholder="What would you like to know?" |
| ) |
| submit = st.form_submit_button("π Search") |
| |
| |
| if submit and question: |
| if st.session_state.rag_system: |
| with st.spinner("Searching..."): |
| start_time = time.time() |
| |
| |
| result = st.session_state.rag_system.run(question) |
| |
| elapsed_time = time.time() - start_time |
| |
| |
| st.session_state.history.append({ |
| 'question': question, |
| 'answer': result['answer'], |
| 'time': elapsed_time |
| }) |
| |
| |
| st.markdown("### π‘ Answer") |
| st.success(result['answer']) |
| |
| |
| with st.expander("π Source Documents"): |
| for i, doc in enumerate(result['retrieved_docs'], 1): |
| st.text_area( |
| f"Document {i}", |
| doc.page_content[:300] + "...", |
| height=100, |
| disabled=True |
| ) |
| |
| st.caption(f"β±οΈ Response time: {elapsed_time:.2f} seconds") |
| |
| |
| if st.session_state.history: |
| st.markdown("---") |
| st.markdown("### π Recent Searches") |
| |
| for item in reversed(st.session_state.history[-3:]): |
| with st.container(): |
| st.markdown(f"**Q:** {item['question']}") |
| st.markdown(f"**A:** {item['answer'][:200]}...") |
| st.caption(f"Time: {item['time']:.2f}s") |
| st.markdown("") |
|
|
| if __name__ == "__main__": |
| main() |