diff --git a/rag_tutorials/llm_app_hybrid_RAG_claude/LLM-Hybrid-RagLite-Claude.mp4 b/rag_tutorials/llm_app_hybrid_RAG_claude/LLM-Hybrid-RagLite-Claude.mp4 new file mode 100644 index 0000000..ebc9e37 Binary files /dev/null and b/rag_tutorials/llm_app_hybrid_RAG_claude/LLM-Hybrid-RagLite-Claude.mp4 differ diff --git a/rag_tutorials/llm_app_hybrid_RAG_claude/README.md b/rag_tutorials/llm_app_hybrid_RAG_claude/README.md index 726aef3..749b2f5 100644 --- a/rag_tutorials/llm_app_hybrid_RAG_claude/README.md +++ b/rag_tutorials/llm_app_hybrid_RAG_claude/README.md @@ -1,13 +1,16 @@ -# Hybrid RAG Claude Chat 🤖 +# LLM Hybrid Search-RAG Assistant - Claude 🤖 -A powerful document Q&A application that combines Hybrid Search (RAG) with Claude's general knowledge. This is built on the RAGLite framework and Chainlit for the UI. +A powerful document Q&A application that leverages Hybrid Search (RAG) and Claude's advanced language capabilities to provide comprehensive answers. Built with RAGLite for robust document processing and retrieval, and Chainlit for an intuitive chat interface, this system seamlessly combines document-specific knowledge with Claude's general intelligence to deliver accurate and contextual responses. + +## Demo + +![Demo](rag_tutorials/llm_app_hybrid_RAG_claude/LLM-Hybrid-RagLite-Claude.mp4) ## Features -- **Hybrid Question Answering** +- **Hybrid Search Question Answering** - RAG-based answers for document-specific queries - Fallback to Claude for general knowledge questions - - Seamless switching between modes - **Document Processing**: - PDF document upload and processing @@ -15,16 +18,10 @@ A powerful document Q&A application that combines Hybrid Search (RAG) with Claud - Hybrid search combining semantic and keyword matching - Reranking for better context selection -- **Interactive Chat Interface**: - - Real-time streaming responses - - Chat history preservation - - Error handling with retry options - - File upload validation - - **Multi-Model Integration**: - - Claude for text generation - - OpenAI for embeddings - - Cohere for reranking (tried using the new Cohere 3.5 reranker) + - Claude for text generation - tested with Claude 3 Opus + - OpenAI for embeddings - tested with text-embedding-3-large + - Cohere for reranking - tested with Cohere 3.5 reranker ## Prerequisites @@ -40,11 +37,11 @@ You'll need the following API keys and database setup: - [Anthropic API key](https://console.anthropic.com/settings/keys) for Claude - [Cohere API key](https://dashboard.cohere.com/api-keys) for reranking -## Installation +## How to get Started? 1. **Clone the Repository**: ```bash - git clone + git clone https://github.com/Shubhamsaboo/awesome-llm-apps.git cd rag_tutorials/llm_app_hybrid_RAG_claude ``` @@ -66,11 +63,11 @@ You'll need the following API keys and database setup: ## Usage 1. Start the application -2. When prompted, enter your: +2. Enter your important keys in the ChatSettings widget: - OpenAI API key - Anthropic API key - Cohere API key - - Neon PostgreSQL URL + - Neon PostgreSQL URL 3. Upload PDF documents 4. Start asking questions! - Document-specific questions will use RAG diff --git a/rag_tutorials/llm_app_hybrid_RAG_claude/chainlit.yaml b/rag_tutorials/llm_app_hybrid_RAG_claude/chainlit.yaml index 8135e83..53e5a38 100644 --- a/rag_tutorials/llm_app_hybrid_RAG_claude/chainlit.yaml +++ b/rag_tutorials/llm_app_hybrid_RAG_claude/chainlit.yaml @@ -11,8 +11,8 @@ project: - DB_URL ui: - name: "LLM App with Hybrid Search and RAG - Claude" - description: "by unwind ai" + name: "🤖 RAG-Powered Document Assistant" + description: "Upload documents and ask questions using hybrid RAG with Claude" hide_cot: false default_collapse_content: true default_expand_messages: true @@ -25,6 +25,7 @@ ui: centered: true show_sidebar: true sidebar_position: "left" + theme: light # Configure the environment variables UI user_env: @@ -67,4 +68,30 @@ theme: dark: primary: "#2563eb" background: "#1a1a1a" - sidebar: "#1e1e1e" \ No newline at end of file + sidebar: "#1e1e1e" + +chat_profiles: [] +default_expand_messages: false +markdown: true +message_html: true +show_readme_as_default: true +default_collapse_content: true +theme: light + +features: + speech_to_text: false + task_list: true + +ui: + name: Hybrid RAG Assistant + description: Ask questions about your documents + hide_cot: false + show_docs: false + show_debugger: false + show_file_upload: true + +file_upload: + max_size_mb: 20 + max_files: 5 + accept: + - application/pdf \ No newline at end of file diff --git a/rag_tutorials/llm_app_hybrid_RAG_claude/main.py b/rag_tutorials/llm_app_hybrid_RAG_claude/main.py index 249d88a..fd89da6 100644 --- a/rag_tutorials/llm_app_hybrid_RAG_claude/main.py +++ b/rag_tutorials/llm_app_hybrid_RAG_claude/main.py @@ -10,14 +10,13 @@ from chainlit.input_widget import TextInput from chainlit import AskUserMessage import anthropic -# Configure logging + logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) -# Initialize global config variable my_config = None -# Define RAG system prompt +# Defining the RAG system prompt RAG_SYSTEM_PROMPT = """ You are a friendly and knowledgeable assistant that provides complete and insightful answers. Answer the user's question using only the context below. @@ -48,7 +47,7 @@ def process_document(file_path: str) -> None: import time start_time = time.time() - # Insert document into PostgreSQL database + # Inserting document into PostgreSQL database insert_document(Path(file_path), config=my_config) processing_time = time.time() - start_time @@ -181,7 +180,16 @@ async def start() -> None: logger.info("Chat session started") cl.user_session.set("chat_history", []) - # Show settings form first + # Add header with markdown formatting + await cl.Message( + content="""# 🤖 LLM-Powered Hybrid Search-RAG Assistant powered by Claude + + Welcome! To get started: + Enter your API keys below on the ChatSettings widget + """ + ).send() + + # Show settings form await cl.ChatSettings([ TextInput( id="OpenAIApiKey", @@ -280,28 +288,53 @@ async def handle_fallback(query: str, msg: cl.Message) -> None: """Handle fallback to Claude when RAG is not available or fails.""" try: user_env = cl.user_session.get("env") + if not user_env or "ANTHROPIC_API_KEY" not in user_env: + raise ValueError("Missing Anthropic API key in session") + client = anthropic.Anthropic(api_key=user_env["ANTHROPIC_API_KEY"]) - + + logger.info("Falling back to Claude for response") + + # Get response from Claude response = client.messages.create( - model="claude-3-5-sonnet-20241022", - max_tokens=1024, + model="claude-3-sonnet-20240229", messages=[ - {"role": "user", "content": query} - ] + { + "role": "system", + "content": """You are a helpful AI assistant. When asked questions, provide informative responses + based on your general knowledge. You don't need to reference any specific documents or context. + Just answer naturally as a knowledgeable assistant.""" + }, + { + "role": "user", + "content": query + } + ], + max_tokens=1024, + temperature=0.7 ) - + + # Get the complete response full_response = response.content[0].text - await msg.send(content=full_response) - + + # Create a new message for streaming + msg = cl.Message(content="") + await msg.send() + + # Stream the response word by word + for word in full_response.split(): + await msg.stream_token(word + " ") + # Update chat history chat_history = cl.user_session.get("chat_history", []) chat_history.append((query, full_response)) cl.user_session.set("chat_history", chat_history) - + logger.info("Successfully generated fallback response") + except Exception as e: error_msg = f"Fallback error: {str(e)}" logger.error(error_msg) - await msg.send(content=error_msg) + await cl.Message(content=f"❌ {error_msg}").send() if __name__ == "__main__": cl.run() \ No newline at end of file