From a3c6a1e578348d057e2ddc4280670f41d82d6c28 Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Sat, 8 Mar 2025 20:34:33 +0500 Subject: [PATCH 01/32] Feedback rag --- 11_feedback_loop_rag.ipynb | 1313 ++++++++++++++++++++++++++++++++++++ 1 file changed, 1313 insertions(+) create mode 100644 11_feedback_loop_rag.ipynb diff --git a/11_feedback_loop_rag.ipynb b/11_feedback_loop_rag.ipynb new file mode 100644 index 0000000..bf208b5 --- /dev/null +++ b/11_feedback_loop_rag.ipynb @@ -0,0 +1,1313 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "vscode": { + "languageId": "markdown" + } + }, + "source": [ + "# Feedback Loop in RAG\n", + "\n", + "In this notebook, I implement a RAG system with a feedback loop mechanism that continuously improves over time. By collecting and incorporating user feedback, our system learns to provide more relevant and higher-quality responses with each interaction.\n", + "\n", + "Traditional RAG systems are static - they retrieve information based solely on embedding similarity. With a feedback loop, we create a dynamic system that:\n", + "\n", + "- Remembers what worked (and what didn't)\n", + "- Adjusts document relevance scores over time\n", + "- Incorporates successful Q&A pairs into its knowledge base\n", + "- Gets smarter with each user interaction" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting Up the Environment\n", + "We begin by importing necessary libraries." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import fitz\n", + "import os\n", + "import numpy as np\n", + "import json\n", + "from openai import OpenAI\n", + "from datetime import datetime" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Extracting Text from a PDF File\n", + "To implement RAG, we first need a source of textual data. In this case, we extract text from a PDF file using the PyMuPDF library." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def extract_text_from_pdf(pdf_path):\n", + " \"\"\"\n", + " Extracts text from a PDF file and prints the first `num_chars` characters.\n", + "\n", + " Args:\n", + " pdf_path (str): Path to the PDF file.\n", + "\n", + " Returns:\n", + " str: Extracted text from the PDF.\n", + " \"\"\"\n", + " # Open the PDF file\n", + " mypdf = fitz.open(pdf_path)\n", + " all_text = \"\" # Initialize an empty string to store the extracted text\n", + "\n", + " # Iterate through each page in the PDF\n", + " for page_num in range(mypdf.page_count):\n", + " page = mypdf[page_num] # Get the page\n", + " text = page.get_text(\"text\") # Extract text from the page\n", + " all_text += text # Append the extracted text to the all_text string\n", + "\n", + " return all_text # Return the extracted text" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Chunking the Extracted Text\n", + "Once we have the extracted text, we divide it into smaller, overlapping chunks to improve retrieval accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def chunk_text(text, n, overlap):\n", + " \"\"\"\n", + " Chunks the given text into segments of n characters with overlap.\n", + "\n", + " Args:\n", + " text (str): The text to be chunked.\n", + " n (int): The number of characters in each chunk.\n", + " overlap (int): The number of overlapping characters between chunks.\n", + "\n", + " Returns:\n", + " List[str]: A list of text chunks.\n", + " \"\"\"\n", + " chunks = [] # Initialize an empty list to store the chunks\n", + " \n", + " # Loop through the text with a step size of (n - overlap)\n", + " for i in range(0, len(text), n - overlap):\n", + " # Append a chunk of text from index i to i + n to the chunks list\n", + " chunks.append(text[i:i + n])\n", + "\n", + " return chunks # Return the list of text chunks" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting Up the OpenAI API Client\n", + "We initialize the OpenAI client to generate embeddings and responses." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize the OpenAI client with the base URL and API key\n", + "client = OpenAI(\n", + " base_url=\"https://api.studio.nebius.com/v1/\",\n", + " api_key=os.getenv(\"OPENAI_API_KEY\") # Retrieve the API key from environment variables\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Simple Vector Store Implementation\n", + "We'll create a basic vector store to manage document chunks and their embeddings." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "class SimpleVectorStore:\n", + " \"\"\"\n", + " A simple vector store implementation using NumPy.\n", + " \n", + " This class provides an in-memory storage and retrieval system for \n", + " embedding vectors and their corresponding text chunks and metadata.\n", + " It supports basic similarity search functionality using cosine similarity.\n", + " \"\"\"\n", + " def __init__(self):\n", + " \"\"\"\n", + " Initialize the vector store with empty lists for vectors, texts, and metadata.\n", + " \n", + " The vector store maintains three parallel lists:\n", + " - vectors: NumPy arrays of embedding vectors\n", + " - texts: Original text chunks corresponding to each vector\n", + " - metadata: Optional metadata dictionaries for each item\n", + " \"\"\"\n", + " self.vectors = [] # List to store embedding vectors\n", + " self.texts = [] # List to store original text chunks\n", + " self.metadata = [] # List to store metadata for each text chunk\n", + " \n", + " def add_item(self, text, embedding, metadata=None):\n", + " \"\"\"\n", + " Add an item to the vector store.\n", + "\n", + " Args:\n", + " text (str): The original text chunk to store.\n", + " embedding (List[float]): The embedding vector representing the text.\n", + " metadata (dict, optional): Additional metadata for the text chunk,\n", + " such as source, timestamp, or relevance scores.\n", + " \"\"\"\n", + " self.vectors.append(np.array(embedding)) # Convert and store the embedding\n", + " self.texts.append(text) # Store the original text\n", + " self.metadata.append(metadata or {}) # Store metadata (empty dict if None)\n", + " \n", + " def similarity_search(self, query_embedding, k=5, filter_func=None):\n", + " \"\"\"\n", + " Find the most similar items to a query embedding using cosine similarity.\n", + "\n", + " Args:\n", + " query_embedding (List[float]): Query embedding vector to compare against stored vectors.\n", + " k (int): Number of most similar results to return.\n", + " filter_func (callable, optional): Function to filter results based on metadata.\n", + " Takes metadata dict as input and returns boolean.\n", + "\n", + " Returns:\n", + " List[Dict]: Top k most similar items, each containing:\n", + " - text: The original text\n", + " - metadata: Associated metadata\n", + " - similarity: Raw cosine similarity score\n", + " - relevance_score: Either metadata-based relevance or calculated similarity\n", + " \n", + " Note: Returns empty list if no vectors are stored or none pass the filter.\n", + " \"\"\"\n", + " if not self.vectors:\n", + " return [] # Return empty list if vector store is empty\n", + " \n", + " # Convert query embedding to numpy array for vector operations\n", + " query_vector = np.array(query_embedding)\n", + " \n", + " # Calculate cosine similarity between query and each stored vector\n", + " similarities = []\n", + " for i, vector in enumerate(self.vectors):\n", + " # Skip items that don't pass the filter criteria\n", + " if filter_func and not filter_func(self.metadata[i]):\n", + " continue\n", + " \n", + " # Calculate cosine similarity: dot product / (norm1 * norm2)\n", + " similarity = np.dot(query_vector, vector) / (np.linalg.norm(query_vector) * np.linalg.norm(vector))\n", + " similarities.append((i, similarity)) # Store index and similarity score\n", + " \n", + " # Sort results by similarity score in descending order\n", + " similarities.sort(key=lambda x: x[1], reverse=True)\n", + " \n", + " # Construct result dictionaries for the top k matches\n", + " results = []\n", + " for i in range(min(k, len(similarities))):\n", + " idx, score = similarities[i]\n", + " results.append({\n", + " \"text\": self.texts[idx],\n", + " \"metadata\": self.metadata[idx],\n", + " \"similarity\": score,\n", + " # Use pre-existing relevance score from metadata if available, otherwise use similarity\n", + " \"relevance_score\": self.metadata[idx].get(\"relevance_score\", score)\n", + " })\n", + " \n", + " return results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating Embeddings" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def create_embeddings(text, model=\"BAAI/bge-en-icl\"):\n", + " \"\"\"\n", + " Creates embeddings for the given text.\n", + "\n", + " Args:\n", + " text (str or List[str]): The input text(s) for which embeddings are to be created.\n", + " model (str): The model to be used for creating embeddings.\n", + "\n", + " Returns:\n", + " List[float] or List[List[float]]: The embedding vector(s).\n", + " \"\"\"\n", + " # Convert single string to list for uniform processing\n", + " input_text = text if isinstance(text, list) else [text]\n", + " \n", + " # Call the OpenAI API to generate embeddings for all input texts\n", + " response = client.embeddings.create(\n", + " model=model,\n", + " input=input_text\n", + " )\n", + " \n", + " # For single string input, return just the first embedding vector\n", + " if isinstance(text, str):\n", + " return response.data[0].embedding\n", + " \n", + " # For list input, return a list of all embedding vectors\n", + " return [item.embedding for item in response.data]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Feedback System Functions\n", + "Now we'll implement the core feedback system components." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def get_user_feedback(query, response, relevance, quality, comments=\"\"):\n", + " \"\"\"\n", + " Format user feedback in a dictionary.\n", + " \n", + " Args:\n", + " query (str): User's query\n", + " response (str): System's response\n", + " relevance (int): Relevance score (1-5)\n", + " quality (int): Quality score (1-5)\n", + " comments (str): Optional feedback comments\n", + " \n", + " Returns:\n", + " Dict: Formatted feedback\n", + " \"\"\"\n", + " return {\n", + " \"query\": query,\n", + " \"response\": response,\n", + " \"relevance\": int(relevance),\n", + " \"quality\": int(quality),\n", + " \"comments\": comments,\n", + " \"timestamp\": datetime.now().isoformat()\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def store_feedback(feedback, feedback_file=\"feedback_data.json\"):\n", + " \"\"\"\n", + " Store feedback in a JSON file.\n", + " \n", + " Args:\n", + " feedback (Dict): Feedback data\n", + " feedback_file (str): Path to feedback file\n", + " \"\"\"\n", + " with open(feedback_file, \"a\") as f:\n", + " json.dump(feedback, f)\n", + " f.write(\"\\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def load_feedback_data(feedback_file=\"feedback_data.json\"):\n", + " \"\"\"\n", + " Load feedback data from file.\n", + " \n", + " Args:\n", + " feedback_file (str): Path to feedback file\n", + " \n", + " Returns:\n", + " List[Dict]: List of feedback entries\n", + " \"\"\"\n", + " feedback_data = []\n", + " try:\n", + " with open(feedback_file, \"r\") as f:\n", + " for line in f:\n", + " if line.strip():\n", + " feedback_data.append(json.loads(line.strip()))\n", + " except FileNotFoundError:\n", + " print(\"No feedback data file found. Starting with empty feedback.\")\n", + " \n", + " return feedback_data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Document Processing with Feedback Awareness" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def process_document(pdf_path, chunk_size=1000, chunk_overlap=200):\n", + " \"\"\"\n", + " Process a document for RAG (Retrieval Augmented Generation) with feedback loop.\n", + " This function handles the complete document processing pipeline:\n", + " 1. Text extraction from PDF\n", + " 2. Text chunking with overlap\n", + " 3. Embedding creation for chunks\n", + " 4. Storage in vector database with metadata\n", + "\n", + " Args:\n", + " pdf_path (str): Path to the PDF file to process.\n", + " chunk_size (int): Size of each text chunk in characters.\n", + " chunk_overlap (int): Number of overlapping characters between consecutive chunks.\n", + "\n", + " Returns:\n", + " Tuple[List[str], SimpleVectorStore]: A tuple containing:\n", + " - List of document chunks\n", + " - Populated vector store with embeddings and metadata\n", + " \"\"\"\n", + " # Step 1: Extract raw text content from the PDF document\n", + " print(\"Extracting text from PDF...\")\n", + " extracted_text = extract_text_from_pdf(pdf_path)\n", + " \n", + " # Step 2: Split text into manageable, overlapping chunks for better context preservation\n", + " print(\"Chunking text...\")\n", + " chunks = chunk_text(extracted_text, chunk_size, chunk_overlap)\n", + " print(f\"Created {len(chunks)} text chunks\")\n", + " \n", + " # Step 3: Generate vector embeddings for each text chunk\n", + " print(\"Creating embeddings for chunks...\")\n", + " chunk_embeddings = create_embeddings(chunks)\n", + " \n", + " # Step 4: Initialize the vector database to store chunks and their embeddings\n", + " store = SimpleVectorStore()\n", + " \n", + " # Step 5: Add each chunk with its embedding to the vector store\n", + " # Include metadata for feedback-based improvements\n", + " for i, (chunk, embedding) in enumerate(zip(chunks, chunk_embeddings)):\n", + " store.add_item(\n", + " text=chunk,\n", + " embedding=embedding,\n", + " metadata={\n", + " \"index\": i, # Position in original document\n", + " \"source\": pdf_path, # Source document path\n", + " \"relevance_score\": 1.0, # Initial relevance score (will be updated with feedback)\n", + " \"feedback_count\": 0 # Counter for feedback received on this chunk\n", + " }\n", + " )\n", + " \n", + " print(f\"Added {len(chunks)} chunks to the vector store\")\n", + " return chunks, store" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Relevance Adjustment Based on Feedback" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def assess_feedback_relevance(query, doc_text, feedback):\n", + " \"\"\"\n", + " Use LLM to assess if a past feedback entry is relevant to the current query and document.\n", + " \n", + " This function helps determine which past feedback should influence the current retrieval\n", + " by sending the current query, past query+feedback, and document content to an LLM\n", + " for relevance assessment.\n", + " \n", + " Args:\n", + " query (str): Current user query that needs information retrieval\n", + " doc_text (str): Text content of the document being evaluated\n", + " feedback (Dict): Previous feedback data containing 'query' and 'response' keys\n", + " \n", + " Returns:\n", + " bool: True if the feedback is deemed relevant to current query/document, False otherwise\n", + " \"\"\"\n", + " # Define system prompt instructing the LLM to make binary relevance judgments only\n", + " system_prompt = \"\"\"You are an AI system that determines if a past feedback is relevant to a current query and document.\n", + " Answer with ONLY 'yes' or 'no'. Your job is strictly to determine relevance, not to provide explanations.\"\"\"\n", + "\n", + " # Construct user prompt with current query, past feedback data, and truncated document content\n", + " user_prompt = f\"\"\"\n", + " Current query: {query}\n", + " Past query that received feedback: {feedback['query']}\n", + " Document content: {doc_text[:500]}... [truncated]\n", + " Past response that received feedback: {feedback['response'][:500]}... [truncated]\n", + "\n", + " Is this past feedback relevant to the current query and document? (yes/no)\n", + " \"\"\"\n", + "\n", + " # Call the LLM API with zero temperature for deterministic output\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0 # Use temperature=0 for consistent, deterministic responses\n", + " )\n", + " \n", + " # Extract and normalize the response to determine relevance\n", + " answer = response.choices[0].message.content.strip().lower()\n", + " return 'yes' in answer # Return True if the answer contains 'yes'" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def adjust_relevance_scores(query, results, feedback_data):\n", + " \"\"\"\n", + " Adjust document relevance scores based on historical feedback to improve retrieval quality.\n", + " \n", + " This function analyzes past user feedback to dynamically adjust the relevance scores of \n", + " retrieved documents. It identifies feedback that is relevant to the current query context,\n", + " calculates score modifiers based on relevance ratings, and re-ranks the results accordingly.\n", + " \n", + " Args:\n", + " query (str): Current user query\n", + " results (List[Dict]): Retrieved documents with their original similarity scores\n", + " feedback_data (List[Dict]): Historical feedback containing user ratings\n", + " \n", + " Returns:\n", + " List[Dict]: Results with adjusted relevance scores, sorted by the new scores\n", + " \"\"\"\n", + " # If no feedback data available, return original results unchanged\n", + " if not feedback_data:\n", + " return results\n", + " \n", + " print(\"Adjusting relevance scores based on feedback history...\")\n", + " \n", + " # Process each retrieved document\n", + " for i, result in enumerate(results):\n", + " document_text = result[\"text\"]\n", + " relevant_feedback = []\n", + " \n", + " # Find relevant feedback for this specific document and query combination\n", + " # by querying the LLM to assess relevance of each historical feedback item\n", + " for feedback in feedback_data:\n", + " is_relevant = assess_feedback_relevance(query, document_text, feedback)\n", + " if is_relevant:\n", + " relevant_feedback.append(feedback)\n", + " \n", + " # Apply score adjustments if relevant feedback exists\n", + " if relevant_feedback:\n", + " # Calculate average relevance rating from all applicable feedback entries\n", + " # Feedback relevance is on a 1-5 scale (1=not relevant, 5=highly relevant)\n", + " avg_relevance = sum(f['relevance'] for f in relevant_feedback) / len(relevant_feedback)\n", + " \n", + " # Convert the average relevance to a score modifier in range 0.5-1.5\n", + " # - Scores below 3/5 will reduce the original similarity (modifier < 1.0)\n", + " # - Scores above 3/5 will increase the original similarity (modifier > 1.0)\n", + " modifier = 0.5 + (avg_relevance / 5.0)\n", + " \n", + " # Apply the modifier to the original similarity score\n", + " original_score = result[\"similarity\"]\n", + " adjusted_score = original_score * modifier\n", + " \n", + " # Update the result dictionary with new scores and feedback metadata\n", + " result[\"original_similarity\"] = original_score # Preserve the original score\n", + " result[\"similarity\"] = adjusted_score # Update the primary score\n", + " result[\"relevance_score\"] = adjusted_score # Update the relevance score\n", + " result[\"feedback_applied\"] = True # Flag that feedback was applied\n", + " result[\"feedback_count\"] = len(relevant_feedback) # Number of feedback entries used\n", + " \n", + " # Log the adjustment details\n", + " print(f\" Document {i+1}: Adjusted score from {original_score:.4f} to {adjusted_score:.4f} based on {len(relevant_feedback)} feedback(s)\")\n", + " \n", + " # Re-sort results by adjusted scores to ensure higher quality matches appear first\n", + " results.sort(key=lambda x: x[\"similarity\"], reverse=True)\n", + " \n", + " return results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fine-tuning Our Index with Feedback" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def fine_tune_index(current_store, chunks, feedback_data):\n", + " \"\"\"\n", + " Enhance vector store with high-quality feedback to improve retrieval quality over time.\n", + " \n", + " This function implements a continuous learning process by:\n", + " 1. Identifying high-quality feedback (highly rated Q&A pairs)\n", + " 2. Creating new retrieval items from successful interactions\n", + " 3. Adding these to the vector store with boosted relevance weights\n", + " \n", + " Args:\n", + " current_store (SimpleVectorStore): Current vector store containing original document chunks\n", + " chunks (List[str]): Original document text chunks \n", + " feedback_data (List[Dict]): Historical user feedback with relevance and quality ratings\n", + " \n", + " Returns:\n", + " SimpleVectorStore: Enhanced vector store containing both original chunks and feedback-derived content\n", + " \"\"\"\n", + " print(\"Fine-tuning index with high-quality feedback...\")\n", + " \n", + " # Filter for only high-quality responses (both relevance and quality rated 4 or 5)\n", + " # This ensures we only learn from the most successful interactions\n", + " good_feedback = [f for f in feedback_data if f['relevance'] >= 4 and f['quality'] >= 4]\n", + " \n", + " if not good_feedback:\n", + " print(\"No high-quality feedback found for fine-tuning.\")\n", + " return current_store # Return original store unchanged if no good feedback exists\n", + " \n", + " # Initialize new store that will contain both original and enhanced content\n", + " new_store = SimpleVectorStore()\n", + " \n", + " # First transfer all original document chunks with their existing metadata\n", + " for i in range(len(current_store.texts)):\n", + " new_store.add_item(\n", + " text=current_store.texts[i],\n", + " embedding=current_store.vectors[i],\n", + " metadata=current_store.metadata[i].copy() # Use copy to prevent reference issues\n", + " )\n", + " \n", + " # Create and add enhanced content from good feedback\n", + " for feedback in good_feedback:\n", + " # Format a new document that combines the question and its high-quality answer\n", + " # This creates retrievable content that directly addresses user queries\n", + " enhanced_text = f\"Question: {feedback['query']}\\nAnswer: {feedback['response']}\"\n", + " \n", + " # Generate embedding vector for this new synthetic document\n", + " embedding = create_embeddings(enhanced_text)\n", + " \n", + " # Add to vector store with special metadata that identifies its origin and importance\n", + " new_store.add_item(\n", + " text=enhanced_text,\n", + " embedding=embedding,\n", + " metadata={\n", + " \"type\": \"feedback_enhanced\", # Mark as derived from feedback\n", + " \"query\": feedback[\"query\"], # Store original query for reference\n", + " \"relevance_score\": 1.2, # Boost initial relevance to prioritize these items\n", + " \"feedback_count\": 1, # Track feedback incorporation\n", + " \"original_feedback\": feedback # Preserve complete feedback record\n", + " }\n", + " )\n", + " \n", + " print(f\"Added enhanced content from feedback: {feedback['query'][:50]}...\")\n", + " \n", + " # Log summary statistics about the enhancement\n", + " print(f\"Fine-tuned index now has {len(new_store.texts)} items (original: {len(chunks)})\")\n", + " return new_store" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Complete RAG Pipeline with Feedback Loop" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_response(query, context, model=\"meta-llama/Llama-3.2-3B-Instruct\"):\n", + " \"\"\"\n", + " Generate a response based on the query and context.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " context (str): Context text from retrieved documents\n", + " model (str): LLM model to use\n", + " \n", + " Returns:\n", + " str: Generated response\n", + " \"\"\"\n", + " # Define the system prompt to guide the AI's behavior\n", + " system_prompt = \"\"\"You are a helpful AI assistant. Answer the user's question based only on the provided context. If you cannot find the answer in the context, state that you don't have enough information.\"\"\"\n", + " \n", + " # Create the user prompt by combining the context and the query\n", + " user_prompt = f\"\"\"\n", + " Context:\n", + " {context}\n", + "\n", + " Question: {query}\n", + "\n", + " Please provide a comprehensive answer based only on the context above.\n", + " \"\"\"\n", + " \n", + " # Call the OpenAI API to generate a response based on the system and user prompts\n", + " response = client.chat.completions.create(\n", + " model=model,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0 # Use temperature=0 for consistent, deterministic responses\n", + " )\n", + " \n", + " # Return the generated response content\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "def rag_with_feedback_loop(query, vector_store, feedback_data, k=5, model=\"meta-llama/Llama-3.2-3B-Instruct\"):\n", + " \"\"\"\n", + " Complete RAG pipeline incorporating feedback loop.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " vector_store (SimpleVectorStore): Vector store with document chunks\n", + " feedback_data (List[Dict]): History of feedback\n", + " k (int): Number of documents to retrieve\n", + " model (str): LLM model for response generation\n", + " \n", + " Returns:\n", + " Dict: Results including query, retrieved documents, and response\n", + " \"\"\"\n", + " print(f\"\\n=== Processing query with feedback-enhanced RAG ===\")\n", + " print(f\"Query: {query}\")\n", + " \n", + " # Step 1: Create query embedding\n", + " query_embedding = create_embeddings(query)\n", + " \n", + " # Step 2: Perform initial retrieval based on query embedding\n", + " results = vector_store.similarity_search(query_embedding, k=k)\n", + " \n", + " # Step 3: Adjust relevance scores of retrieved documents based on feedback\n", + " adjusted_results = adjust_relevance_scores(query, results, feedback_data)\n", + " \n", + " # Step 4: Extract texts from adjusted results for context building\n", + " retrieved_texts = [result[\"text\"] for result in adjusted_results]\n", + " \n", + " # Step 5: Build context for response generation by concatenating retrieved texts\n", + " context = \"\\n\\n---\\n\\n\".join(retrieved_texts)\n", + " \n", + " # Step 6: Generate response using the context and query\n", + " print(\"Generating response...\")\n", + " response = generate_response(query, context, model)\n", + " \n", + " # Step 7: Compile the final result\n", + " result = {\n", + " \"query\": query,\n", + " \"retrieved_documents\": adjusted_results,\n", + " \"response\": response\n", + " }\n", + " \n", + " print(\"\\n=== Response ===\")\n", + " print(response)\n", + " \n", + " return result" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Complete Workflow: From Initial Setup to Feedback Collection" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "def full_rag_workflow(pdf_path, query, feedback_data=None, feedback_file=\"feedback_data.json\", fine_tune=False):\n", + " \"\"\"\n", + " Execute a complete RAG workflow with feedback integration for continuous improvement.\n", + " \n", + " This function orchestrates the entire Retrieval-Augmented Generation process:\n", + " 1. Load historical feedback data\n", + " 2. Process and chunk the document\n", + " 3. Optionally fine-tune the vector index with prior feedback\n", + " 4. Perform retrieval and generation with feedback-adjusted relevance scores\n", + " 5. Collect new user feedback for future improvement\n", + " 6. Store feedback to enable system learning over time\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF document to be processed\n", + " query (str): User's natural language query\n", + " feedback_data (List[Dict], optional): Pre-loaded feedback data, loads from file if None\n", + " feedback_file (str): Path to the JSON file storing feedback history\n", + " fine_tune (bool): Whether to enhance the index with successful past Q&A pairs\n", + " \n", + " Returns:\n", + " Dict: Results containing the response and retrieval metadata\n", + " \"\"\"\n", + " # Step 1: Load historical feedback for relevance adjustment if not explicitly provided\n", + " if feedback_data is None:\n", + " feedback_data = load_feedback_data(feedback_file)\n", + " print(f\"Loaded {len(feedback_data)} feedback entries from {feedback_file}\")\n", + " \n", + " # Step 2: Process document through extraction, chunking and embedding pipeline\n", + " chunks, vector_store = process_document(pdf_path)\n", + " \n", + " # Step 3: Fine-tune the vector index by incorporating high-quality past interactions\n", + " # This creates enhanced retrievable content from successful Q&A pairs\n", + " if fine_tune and feedback_data:\n", + " vector_store = fine_tune_index(vector_store, chunks, feedback_data)\n", + " \n", + " # Step 4: Execute core RAG with feedback-aware retrieval\n", + " # Note: This depends on the rag_with_feedback_loop function which should be defined elsewhere\n", + " result = rag_with_feedback_loop(query, vector_store, feedback_data)\n", + " \n", + " # Step 5: Collect user feedback to improve future performance\n", + " print(\"\\n=== Would you like to provide feedback on this response? ===\")\n", + " print(\"Rate relevance (1-5, with 5 being most relevant):\")\n", + " relevance = input()\n", + " \n", + " print(\"Rate quality (1-5, with 5 being highest quality):\")\n", + " quality = input()\n", + " \n", + " print(\"Any comments? (optional, press Enter to skip)\")\n", + " comments = input()\n", + " \n", + " # Step 6: Format feedback into structured data\n", + " feedback = get_user_feedback(\n", + " query=query,\n", + " response=result[\"response\"],\n", + " relevance=int(relevance),\n", + " quality=int(quality),\n", + " comments=comments\n", + " )\n", + " \n", + " # Step 7: Persist feedback to enable continuous system learning\n", + " store_feedback(feedback, feedback_file)\n", + " print(\"Feedback recorded. Thank you!\")\n", + " \n", + " return result" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluating Our Feedback Loop" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "def evaluate_feedback_loop(pdf_path, test_queries, reference_answers=None):\n", + " \"\"\"\n", + " Evaluate the impact of feedback loop on RAG quality by comparing performance before and after feedback integration.\n", + " \n", + " This function runs a controlled experiment to measure how incorporating feedback affects retrieval and generation:\n", + " 1. First round: Run all test queries with no feedback\n", + " 2. Generate synthetic feedback based on reference answers (if provided)\n", + " 3. Second round: Run the same queries with feedback-enhanced retrieval\n", + " 4. Compare results between rounds to quantify feedback impact\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF document used as the knowledge base\n", + " test_queries (List[str]): List of test queries to evaluate system performance\n", + " reference_answers (List[str], optional): Reference/gold standard answers for evaluation\n", + " and synthetic feedback generation\n", + " \n", + " Returns:\n", + " Dict: Evaluation results containing:\n", + " - round1_results: Results without feedback\n", + " - round2_results: Results with feedback\n", + " - comparison: Quantitative comparison metrics between rounds\n", + " \"\"\"\n", + " print(\"=== Evaluating Feedback Loop Impact ===\")\n", + " \n", + " # Create a temporary feedback file for this evaluation session only\n", + " temp_feedback_file = \"temp_evaluation_feedback.json\"\n", + " \n", + " # Initialize feedback collection (empty at the start)\n", + " feedback_data = []\n", + " \n", + " # ----------------------- FIRST EVALUATION ROUND -----------------------\n", + " # Run all queries without any feedback influence to establish baseline performance\n", + " print(\"\\n=== ROUND 1: NO FEEDBACK ===\")\n", + " round1_results = []\n", + " \n", + " for i, query in enumerate(test_queries):\n", + " print(f\"\\nQuery {i+1}: {query}\")\n", + " \n", + " # Process document to create initial vector store\n", + " chunks, vector_store = process_document(pdf_path)\n", + " \n", + " # Execute RAG without feedback influence (empty feedback list)\n", + " result = rag_with_feedback_loop(query, vector_store, [])\n", + " round1_results.append(result)\n", + " \n", + " # Generate synthetic feedback if reference answers are available\n", + " # This simulates user feedback for training the system\n", + " if reference_answers and i < len(reference_answers):\n", + " # Calculate synthetic feedback scores based on similarity to reference answer\n", + " similarity_to_ref = calculate_similarity(result[\"response\"], reference_answers[i])\n", + " # Convert similarity (0-1) to rating scale (1-5)\n", + " relevance = max(1, min(5, int(similarity_to_ref * 5)))\n", + " quality = max(1, min(5, int(similarity_to_ref * 5)))\n", + " \n", + " # Create structured feedback entry\n", + " feedback = get_user_feedback(\n", + " query=query,\n", + " response=result[\"response\"],\n", + " relevance=relevance,\n", + " quality=quality,\n", + " comments=f\"Synthetic feedback based on reference similarity: {similarity_to_ref:.2f}\"\n", + " )\n", + " \n", + " # Add to in-memory collection and persist to temporary file\n", + " feedback_data.append(feedback)\n", + " store_feedback(feedback, temp_feedback_file)\n", + " \n", + " # ----------------------- SECOND EVALUATION ROUND -----------------------\n", + " # Run the same queries with feedback incorporation to measure improvement\n", + " print(\"\\n=== ROUND 2: WITH FEEDBACK ===\")\n", + " round2_results = []\n", + " \n", + " # Process document and enhance with feedback-derived content\n", + " chunks, vector_store = process_document(pdf_path)\n", + " vector_store = fine_tune_index(vector_store, chunks, feedback_data)\n", + " \n", + " for i, query in enumerate(test_queries):\n", + " print(f\"\\nQuery {i+1}: {query}\")\n", + " \n", + " # Execute RAG with feedback influence\n", + " result = rag_with_feedback_loop(query, vector_store, feedback_data)\n", + " round2_results.append(result)\n", + " \n", + " # ----------------------- RESULTS ANALYSIS -----------------------\n", + " # Compare performance metrics between the two rounds\n", + " comparison = compare_results(test_queries, round1_results, round2_results, reference_answers)\n", + " \n", + " # Clean up temporary evaluation artifacts\n", + " if os.path.exists(temp_feedback_file):\n", + " os.remove(temp_feedback_file)\n", + " \n", + " return {\n", + " \"round1_results\": round1_results,\n", + " \"round2_results\": round2_results,\n", + " \"comparison\": comparison\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Helper Functions for Evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "def calculate_similarity(text1, text2):\n", + " \"\"\"\n", + " Calculate semantic similarity between two texts using embeddings.\n", + " \n", + " Args:\n", + " text1 (str): First text\n", + " text2 (str): Second text\n", + " \n", + " Returns:\n", + " float: Similarity score between 0 and 1\n", + " \"\"\"\n", + " # Generate embeddings for both texts\n", + " embedding1 = create_embeddings(text1)\n", + " embedding2 = create_embeddings(text2)\n", + " \n", + " # Convert embeddings to numpy arrays\n", + " vec1 = np.array(embedding1)\n", + " vec2 = np.array(embedding2)\n", + " \n", + " # Calculate cosine similarity between the two vectors\n", + " similarity = np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))\n", + " \n", + " return similarity" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "def compare_results(queries, round1_results, round2_results, reference_answers=None):\n", + " \"\"\"\n", + " Compare results from two rounds of RAG.\n", + " \n", + " Args:\n", + " queries (List[str]): Test queries\n", + " round1_results (List[Dict]): Results from round 1\n", + " round2_results (List[Dict]): Results from round 2\n", + " reference_answers (List[str], optional): Reference answers\n", + " \n", + " Returns:\n", + " str: Comparison analysis\n", + " \"\"\"\n", + " print(\"\\n=== COMPARING RESULTS ===\")\n", + " \n", + " # System prompt to guide the AI's evaluation behavior\n", + " system_prompt = \"\"\"You are an expert evaluator of RAG systems. Compare responses from two versions:\n", + " 1. Standard RAG: No feedback used\n", + " 2. Feedback-enhanced RAG: Uses a feedback loop to improve retrieval\n", + "\n", + " Analyze which version provides better responses in terms of:\n", + " - Relevance to the query\n", + " - Accuracy of information\n", + " - Completeness\n", + " - Clarity and conciseness\n", + " \"\"\"\n", + "\n", + " comparisons = []\n", + " \n", + " # Iterate over each query and its corresponding results from both rounds\n", + " for i, (query, r1, r2) in enumerate(zip(queries, round1_results, round2_results)):\n", + " # Create a prompt for comparing the responses\n", + " comparison_prompt = f\"\"\"\n", + " Query: {query}\n", + "\n", + " Standard RAG Response:\n", + " {r1[\"response\"]}\n", + "\n", + " Feedback-enhanced RAG Response:\n", + " {r2[\"response\"]}\n", + " \"\"\"\n", + "\n", + " # Include reference answer if available\n", + " if reference_answers and i < len(reference_answers):\n", + " comparison_prompt += f\"\"\"\n", + " Reference Answer:\n", + " {reference_answers[i]}\n", + " \"\"\"\n", + "\n", + " comparison_prompt += \"\"\"\n", + " Compare these responses and explain which one is better and why.\n", + " Focus specifically on how the feedback loop has (or hasn't) improved the response quality.\n", + " \"\"\"\n", + "\n", + " # Call the OpenAI API to generate a comparison analysis\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": comparison_prompt}\n", + " ],\n", + " temperature=0\n", + " )\n", + " \n", + " # Append the comparison analysis to the results\n", + " comparisons.append({\n", + " \"query\": query,\n", + " \"analysis\": response.choices[0].message.content\n", + " })\n", + " \n", + " # Print a snippet of the analysis for each query\n", + " print(f\"\\nQuery {i+1}: {query}\")\n", + " print(f\"Analysis: {response.choices[0].message.content[:200]}...\")\n", + " \n", + " return comparisons" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluation of the feedback loop (Custom Validation Queries)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "=== Evaluating Feedback Loop Impact ===\n", + "\n", + "=== ROUND 1: NO FEEDBACK ===\n", + "\n", + "Query 1: What is a neural network and how does it function?\n", + "Extracting text from PDF...\n", + "Chunking text...\n", + "Created 42 text chunks\n", + "Creating embeddings for chunks...\n", + "Added 42 chunks to the vector store\n", + "\n", + "=== Processing query with feedback-enhanced RAG ===\n", + "Query: What is a neural network and how does it function?\n", + "Generating response...\n", + "\n", + "=== Response ===\n", + "Based on the provided context, a neural network is a type of deep neural network that is particularly effective for processing data. The context does not provide a detailed explanation of how a neural network functions, but it does mention that neural networks are inspired by the structure and function of the human brain.\n", + "\n", + "However, it can be inferred that a neural network is a complex system that uses multiple layers to analyze data. The context mentions that deep learning is a subfield of machine learning that uses artificial neural networks with multiple layers (deep neural networks) to analyze data.\n", + "\n", + "In the context of the provided text, neural networks are used in various applications such as image recognition, natural language processing, and speech recognition. They are also used in tasks like object detection, facial recognition, and medical image analysis.\n", + "\n", + "While the context does not provide a comprehensive explanation of how a neural network functions, it can be inferred that neural networks are designed to learn patterns and structures in the data through a process of trial and error, similar to reinforcement learning. However, the exact mechanism of how neural networks function is not explicitly stated in the provided context.\n", + "\n", + "=== ROUND 2: WITH FEEDBACK ===\n", + "Extracting text from PDF...\n", + "Chunking text...\n", + "Created 42 text chunks\n", + "Creating embeddings for chunks...\n", + "Added 42 chunks to the vector store\n", + "Fine-tuning index with high-quality feedback...\n", + "Added enhanced content from feedback: What is a neural network and how does it function?...\n", + "Fine-tuned index now has 43 items (original: 42)\n", + "\n", + "Query 1: What is a neural network and how does it function?\n", + "\n", + "=== Processing query with feedback-enhanced RAG ===\n", + "Query: What is a neural network and how does it function?\n", + "Adjusting relevance scores based on feedback history...\n", + " Document 1: Adjusted score from 0.8386 to 1.0902 based on 1 feedback(s)\n", + " Document 4: Adjusted score from 0.6162 to 0.8010 based on 1 feedback(s)\n", + " Document 5: Adjusted score from 0.6023 to 0.7830 based on 1 feedback(s)\n", + "Generating response...\n", + "\n", + "=== Response ===\n", + "Based on the provided context, a neural network is a complex system that uses multiple layers to analyze data. It is inspired by the structure and function of the human brain and is particularly effective for processing data. Neural networks are used in various applications such as image recognition, natural language processing, and speech recognition.\n", + "\n", + "The context does not provide a detailed explanation of how a neural network functions, but it can be inferred that neural networks are designed to learn patterns and structures in the data through a process of trial and error. This process is similar to reinforcement learning, where the neural network receives feedback in the form of rewards or penalties, allowing it to adjust its parameters and improve its performance over time.\n", + "\n", + "Neural networks are composed of multiple layers, including convolutional layers, recurrent layers, and others. These layers work together to analyze the input data and make predictions or take actions. The exact mechanism of how neural networks function is not explicitly stated in the provided context, but it is clear that they are a powerful tool for analyzing and processing complex data.\n", + "\n", + "In the context of the provided text, neural networks are used in various applications such as:\n", + "\n", + "* Image recognition\n", + "* Natural language processing\n", + "* Speech recognition\n", + "* Object detection\n", + "* Facial recognition\n", + "* Medical image analysis\n", + "\n", + "Overall, neural networks are a complex and powerful tool for analyzing and processing data, and their applications continue to expand across various industries and domains.\n", + "\n", + "=== COMPARING RESULTS ===\n", + "\n", + "Query 1: What is a neural network and how does it function?\n", + "Analysis: Comparing the two responses, the feedback-enhanced RAG response is significantly better than the standard RAG response. Here's a breakdown of the improvements:\n", + "\n", + "1. **Relevance to the query**: Both res...\n" + ] + } + ], + "source": [ + "# AI Document Path\n", + "pdf_path = \"data/AI_Information.pdf\"\n", + "\n", + "# Define test queries\n", + "test_queries = [\n", + " \"What is a neural network and how does it function?\",\n", + "\n", + " #################################################################################\n", + " ### Commented out queries to reduce the number of queries for testing purposes ###\n", + " \n", + " # \"Describe the process and applications of reinforcement learning.\",\n", + " # \"What are the main applications of natural language processing in today's technology?\",\n", + " # \"Explain the impact of overfitting in machine learning models and how it can be mitigated.\"\n", + "]\n", + "\n", + "# Define reference answers for evaluation\n", + "reference_answers = [\n", + " \"A neural network is a series of algorithms that attempt to recognize underlying relationships in a set of data through a process that mimics the way the human brain operates. It consists of layers of nodes, with each node representing a neuron. Neural networks function by adjusting the weights of connections between nodes based on the error of the output compared to the expected result.\",\n", + "\n", + " ############################################################################################\n", + " #### Commented out reference answers to reduce the number of queries for testing purposes ###\n", + "\n", + "# \"Reinforcement learning is a type of machine learning where an agent learns to make decisions by performing actions in an environment to maximize cumulative reward. It involves exploration, exploitation, and learning from the consequences of actions. Applications include robotics, game playing, and autonomous vehicles.\",\n", + "# \"The main applications of natural language processing in today's technology include machine translation, sentiment analysis, chatbots, information retrieval, text summarization, and speech recognition. NLP enables machines to understand and generate human language, facilitating human-computer interaction.\",\n", + "# \"Overfitting in machine learning models occurs when a model learns the training data too well, capturing noise and outliers. This results in poor generalization to new data, as the model performs well on training data but poorly on unseen data. Mitigation techniques include cross-validation, regularization, pruning, and using more training data.\"\n", + "]\n", + "\n", + "# Run the evaluation\n", + "evaluation_results = evaluate_feedback_loop(\n", + " pdf_path=pdf_path,\n", + " test_queries=test_queries,\n", + " reference_answers=reference_answers\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "########################################\n", + "# # Run a full RAG workflow\n", + "########################################\n", + "\n", + "# # Run an interactive example\n", + "# print(\"\\n\\n=== INTERACTIVE EXAMPLE ===\")\n", + "# print(\"Enter your query about AI:\")\n", + "# user_query = input()\n", + "\n", + "# # Load accumulated feedback\n", + "# all_feedback = load_feedback_data()\n", + "\n", + "# # Run full workflow\n", + "# result = full_rag_workflow(\n", + "# pdf_path=pdf_path,\n", + "# query=user_query,\n", + "# feedback_data=all_feedback,\n", + "# fine_tune=True\n", + "# )\n", + "\n", + "########################################\n", + "# # Run a full RAG workflow\n", + "########################################" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Visualizing Feedback Impact" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "=== FEEDBACK IMPACT ANALYSIS ===\n", + "\n", + "Query 1: What is a neural network and how does it function?\n", + "\n", + "Analysis of feedback impact:\n", + "Comparing the two responses, the feedback-enhanced RAG response is significantly better than the standard RAG response. Here's a breakdown of the improvements:\n", + "\n", + "1. **Relevance to the query**: Both responses address the query, but the feedback-enhanced RAG response provides a more comprehensive and detailed explanation of what a neural network is and how it functions. It also provides more specific examples of applications, which shows a better understanding of the topic.\n", + "\n", + "2. **Accuracy of information**: The feedback-enhanced RAG response is more accurate, as it provides a clear and concise explanation of how neural networks function, including the concept of trial and error, reinforcement learning, and the role of feedback. The standard RAG response is less accurate, as it only mentions that neural networks are inspired by the human brain and that they are used in various applications, but does not provide a clear explanation of how they function.\n", + "\n", + "3. **Completeness**: The feedback-enhanced RAG response is more complete, as it provides a detailed explanation of the components of a neural network, including convolutional layers, recurrent layers, and others. The standard RAG response only mentions that neural networks are used in various applications, but does not provide a clear explanation of how they function.\n", + "\n", + "4. **Clarity and conciseness**: The feedback-enhanced RAG response is more concise and clear, as it provides a clear and concise explanation of how neural networks function and their applications. The standard RAG response is less concise and less clear, as it only mentions that neural networks are inspired by the human brain and that they are used in various applications, but does not provide a clear explanation of how they function.\n", + "\n", + "The feedback loop has significantly improved the response quality by:\n", + "\n", + "* Providing a clear and concise explanation of how neural networks function\n", + "* Providing more specific examples of applications\n", + "* Addressing the limitations of the standard RAG response (e.g., lack of clarity and concision)\n", + "* Providing a more accurate explanation of the components of a neural network\n", + "\n", + "The feedback loop has helped to identify the areas where the standard RAG response was lacking and has provided a more comprehensive and detailed explanation of the topic. This is a clear example of how a feedback loop can improve the quality of a response.\n", + "\n", + "--------------------------------------------------\n", + "\n", + "\n", + "Response length comparison (proxy for completeness):\n", + "Round 1: 1256.0 chars\n" + ] + } + ], + "source": [ + "# Extract the comparison data which contains the analysis of feedback impact\n", + "comparisons = evaluation_results['comparison']\n", + "\n", + "# Print out the analysis results to visualize feedback impact\n", + "print(\"\\n=== FEEDBACK IMPACT ANALYSIS ===\\n\")\n", + "for i, comparison in enumerate(comparisons):\n", + " print(f\"Query {i+1}: {comparison['query']}\")\n", + " print(f\"\\nAnalysis of feedback impact:\")\n", + " print(comparison['analysis'])\n", + " print(\"\\n\" + \"-\"*50 + \"\\n\")\n", + "\n", + "# Additionally, we can compare some metrics between rounds\n", + "round_responses = [evaluation_results[f'round{round_num}_results'] for round_num in range(1, len(evaluation_results) - 1)]\n", + "response_lengths = [[len(r[\"response\"]) for r in round] for round in round_responses]\n", + "\n", + "print(\"\\nResponse length comparison (proxy for completeness):\")\n", + "avg_lengths = [sum(lengths) / len(lengths) for lengths in response_lengths]\n", + "for round_num, avg_len in enumerate(avg_lengths, start=1):\n", + " print(f\"Round {round_num}: {avg_len:.1f} chars\")\n", + "\n", + "if len(avg_lengths) > 1:\n", + " changes = [(avg_lengths[i] - avg_lengths[i-1]) / avg_lengths[i-1] * 100 for i in range(1, len(avg_lengths))]\n", + " for round_num, change in enumerate(changes, start=2):\n", + " print(f\"Change from Round {round_num-1} to Round {round_num}: {change:.1f}%\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv-new-specific-rag", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 1a3f9bc91abe5a510e0308f1e9e76192ea582f3a Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Sun, 9 Mar 2025 11:10:40 +0500 Subject: [PATCH 02/32] Adaptive rag --- 12_adaptive_rag.ipynb | 1483 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1483 insertions(+) create mode 100644 12_adaptive_rag.ipynb diff --git a/12_adaptive_rag.ipynb b/12_adaptive_rag.ipynb new file mode 100644 index 0000000..2f8ba81 --- /dev/null +++ b/12_adaptive_rag.ipynb @@ -0,0 +1,1483 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "vscode": { + "languageId": "markdown" + } + }, + "source": [ + "# Adaptive Retrieval for Enhanced RAG Systems\n", + "\n", + "In this notebook, I implement an Adaptive Retrieval system that dynamically selects the most appropriate retrieval strategy based on the type of query. This approach significantly enhances our RAG system's ability to provide accurate and relevant responses across a diverse range of questions.\n", + "\n", + "Different questions demand different retrieval strategies. Our system:\n", + "\n", + "1. Classifies the query type (Factual, Analytical, Opinion, or Contextual)\n", + "2. Selects the appropriate retrieval strategy\n", + "3. Executes specialized retrieval techniques\n", + "4. Generates a tailored response" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting Up the Environment\n", + "We begin by importing necessary libraries." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import numpy as np\n", + "import json\n", + "import fitz\n", + "from openai import OpenAI\n", + "import re" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Extracting Text from a PDF File\n", + "To implement RAG, we first need a source of textual data. In this case, we extract text from a PDF file using the PyMuPDF library." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def extract_text_from_pdf(pdf_path):\n", + " \"\"\"\n", + " Extracts text from a PDF file and prints the first `num_chars` characters.\n", + "\n", + " Args:\n", + " pdf_path (str): Path to the PDF file.\n", + "\n", + " Returns:\n", + " str: Extracted text from the PDF.\n", + " \"\"\"\n", + " # Open the PDF file\n", + " mypdf = fitz.open(pdf_path)\n", + " all_text = \"\" # Initialize an empty string to store the extracted text\n", + "\n", + " # Iterate through each page in the PDF\n", + " for page_num in range(mypdf.page_count):\n", + " page = mypdf[page_num] # Get the page\n", + " text = page.get_text(\"text\") # Extract text from the page\n", + " all_text += text # Append the extracted text to the all_text string\n", + "\n", + " return all_text # Return the extracted text" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Chunking the Extracted Text\n", + "Once we have the extracted text, we divide it into smaller, overlapping chunks to improve retrieval accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def chunk_text(text, n, overlap):\n", + " \"\"\"\n", + " Chunks the given text into segments of n characters with overlap.\n", + "\n", + " Args:\n", + " text (str): The text to be chunked.\n", + " n (int): The number of characters in each chunk.\n", + " overlap (int): The number of overlapping characters between chunks.\n", + "\n", + " Returns:\n", + " List[str]: A list of text chunks.\n", + " \"\"\"\n", + " chunks = [] # Initialize an empty list to store the chunks\n", + " \n", + " # Loop through the text with a step size of (n - overlap)\n", + " for i in range(0, len(text), n - overlap):\n", + " # Append a chunk of text from index i to i + n to the chunks list\n", + " chunks.append(text[i:i + n])\n", + "\n", + " return chunks # Return the list of text chunks" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting Up the OpenAI API Client\n", + "We initialize the OpenAI client to generate embeddings and responses." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize the OpenAI client with the base URL and API key\n", + "client = OpenAI(\n", + " base_url=\"https://api.studio.nebius.com/v1/\",\n", + " api_key=os.getenv(\"OPENAI_API_KEY\") # Retrieve the API key from environment variables\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Simple Vector Store Implementation\n", + "We'll create a basic vector store to manage document chunks and their embeddings." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "class SimpleVectorStore:\n", + " \"\"\"\n", + " A simple vector store implementation using NumPy.\n", + " \"\"\"\n", + " def __init__(self):\n", + " \"\"\"\n", + " Initialize the vector store.\n", + " \"\"\"\n", + " self.vectors = [] # List to store embedding vectors\n", + " self.texts = [] # List to store original texts\n", + " self.metadata = [] # List to store metadata for each text\n", + " \n", + " def add_item(self, text, embedding, metadata=None):\n", + " \"\"\"\n", + " Add an item to the vector store.\n", + "\n", + " Args:\n", + " text (str): The original text.\n", + " embedding (List[float]): The embedding vector.\n", + " metadata (dict, optional): Additional metadata.\n", + " \"\"\"\n", + " self.vectors.append(np.array(embedding)) # Convert embedding to numpy array and add to vectors list\n", + " self.texts.append(text) # Add the original text to texts list\n", + " self.metadata.append(metadata or {}) # Add metadata to metadata list, default to empty dict if None\n", + " \n", + " def similarity_search(self, query_embedding, k=5, filter_func=None):\n", + " \"\"\"\n", + " Find the most similar items to a query embedding.\n", + "\n", + " Args:\n", + " query_embedding (List[float]): Query embedding vector.\n", + " k (int): Number of results to return.\n", + " filter_func (callable, optional): Function to filter results.\n", + "\n", + " Returns:\n", + " List[Dict]: Top k most similar items with their texts and metadata.\n", + " \"\"\"\n", + " if not self.vectors:\n", + " return [] # Return empty list if no vectors are stored\n", + " \n", + " # Convert query embedding to numpy array\n", + " query_vector = np.array(query_embedding)\n", + " \n", + " # Calculate similarities using cosine similarity\n", + " similarities = []\n", + " for i, vector in enumerate(self.vectors):\n", + " # Apply filter if provided\n", + " if filter_func and not filter_func(self.metadata[i]):\n", + " continue\n", + " \n", + " # Calculate cosine similarity\n", + " similarity = np.dot(query_vector, vector) / (np.linalg.norm(query_vector) * np.linalg.norm(vector))\n", + " similarities.append((i, similarity)) # Append index and similarity score\n", + " \n", + " # Sort by similarity (descending)\n", + " similarities.sort(key=lambda x: x[1], reverse=True)\n", + " \n", + " # Return top k results\n", + " results = []\n", + " for i in range(min(k, len(similarities))):\n", + " idx, score = similarities[i]\n", + " results.append({\n", + " \"text\": self.texts[idx], # Add the text\n", + " \"metadata\": self.metadata[idx], # Add the metadata\n", + " \"similarity\": score # Add the similarity score\n", + " })\n", + " \n", + " return results # Return the list of top k results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating Embeddings" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def create_embeddings(text, model=\"BAAI/bge-en-icl\"):\n", + " \"\"\"\n", + " Creates embeddings for the given text.\n", + "\n", + " Args:\n", + " text (str or List[str]): The input text(s) for which embeddings are to be created.\n", + " model (str): The model to be used for creating embeddings.\n", + "\n", + " Returns:\n", + " List[float] or List[List[float]]: The embedding vector(s).\n", + " \"\"\"\n", + " # Handle both string and list inputs by converting string input to a list\n", + " input_text = text if isinstance(text, list) else [text]\n", + " \n", + " # Create embeddings for the input text using the specified model\n", + " response = client.embeddings.create(\n", + " model=model,\n", + " input=input_text\n", + " )\n", + " \n", + " # If the input was a single string, return just the first embedding\n", + " if isinstance(text, str):\n", + " return response.data[0].embedding\n", + " \n", + " # Otherwise, return all embeddings for the list of texts\n", + " return [item.embedding for item in response.data]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Document Processing Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def process_document(pdf_path, chunk_size=1000, chunk_overlap=200):\n", + " \"\"\"\n", + " Process a document for use with adaptive retrieval.\n", + "\n", + " Args:\n", + " pdf_path (str): Path to the PDF file.\n", + " chunk_size (int): Size of each chunk in characters.\n", + " chunk_overlap (int): Overlap between chunks in characters.\n", + "\n", + " Returns:\n", + " Tuple[List[str], SimpleVectorStore]: Document chunks and vector store.\n", + " \"\"\"\n", + " # Extract text from the PDF file\n", + " print(\"Extracting text from PDF...\")\n", + " extracted_text = extract_text_from_pdf(pdf_path)\n", + " \n", + " # Chunk the extracted text\n", + " print(\"Chunking text...\")\n", + " chunks = chunk_text(extracted_text, chunk_size, chunk_overlap)\n", + " print(f\"Created {len(chunks)} text chunks\")\n", + " \n", + " # Create embeddings for the text chunks\n", + " print(\"Creating embeddings for chunks...\")\n", + " chunk_embeddings = create_embeddings(chunks)\n", + " \n", + " # Initialize the vector store\n", + " store = SimpleVectorStore()\n", + " \n", + " # Add each chunk and its embedding to the vector store with metadata\n", + " for i, (chunk, embedding) in enumerate(zip(chunks, chunk_embeddings)):\n", + " store.add_item(\n", + " text=chunk,\n", + " embedding=embedding,\n", + " metadata={\"index\": i, \"source\": pdf_path}\n", + " )\n", + " \n", + " print(f\"Added {len(chunks)} chunks to the vector store\")\n", + " \n", + " # Return the chunks and the vector store\n", + " return chunks, store" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Query Classification" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def classify_query(query, model=\"meta-llama/Llama-3.2-3B-Instruct\"):\n", + " \"\"\"\n", + " Classify a query into one of four categories: Factual, Analytical, Opinion, or Contextual.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " model (str): LLM model to use\n", + " \n", + " Returns:\n", + " str: Query category\n", + " \"\"\"\n", + " # Define the system prompt to guide the AI's classification\n", + " system_prompt = \"\"\"You are an expert at classifying questions. \n", + " Classify the given query into exactly one of these categories:\n", + " - Factual: Queries seeking specific, verifiable information.\n", + " - Analytical: Queries requiring comprehensive analysis or explanation.\n", + " - Opinion: Queries about subjective matters or seeking diverse viewpoints.\n", + " - Contextual: Queries that depend on user-specific context.\n", + "\n", + " Return ONLY the category name, without any explanation or additional text.\n", + " \"\"\"\n", + "\n", + " # Create the user prompt with the query to be classified\n", + " user_prompt = f\"Classify this query: {query}\"\n", + " \n", + " # Generate the classification response from the AI model\n", + " response = client.chat.completions.create(\n", + " model=model,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0\n", + " )\n", + " \n", + " # Extract and strip the category from the response\n", + " category = response.choices[0].message.content.strip()\n", + " \n", + " # Define the list of valid categories\n", + " valid_categories = [\"Factual\", \"Analytical\", \"Opinion\", \"Contextual\"]\n", + " \n", + " # Ensure the returned category is valid\n", + " for valid in valid_categories:\n", + " if valid in category:\n", + " return valid\n", + " \n", + " # Default to \"Factual\" if classification fails\n", + " return \"Factual\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Implementing Specialized Retrieval Strategies\n", + "### 1. Factual Strategy - Focus on Precision" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def factual_retrieval_strategy(query, vector_store, k=4):\n", + " \"\"\"\n", + " Retrieval strategy for factual queries focusing on precision.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " vector_store (SimpleVectorStore): Vector store\n", + " k (int): Number of documents to return\n", + " \n", + " Returns:\n", + " List[Dict]: Retrieved documents\n", + " \"\"\"\n", + " print(f\"Executing Factual retrieval strategy for: '{query}'\")\n", + " \n", + " # Use LLM to enhance the query for better precision\n", + " system_prompt = \"\"\"You are an expert at enhancing search queries.\n", + " Your task is to reformulate the given factual query to make it more precise and \n", + " specific for information retrieval. Focus on key entities and their relationships.\n", + "\n", + " Provide ONLY the enhanced query without any explanation.\n", + " \"\"\"\n", + "\n", + " user_prompt = f\"Enhance this factual query: {query}\"\n", + " \n", + " # Generate the enhanced query using the LLM\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0\n", + " )\n", + " \n", + " # Extract and print the enhanced query\n", + " enhanced_query = response.choices[0].message.content.strip()\n", + " print(f\"Enhanced query: {enhanced_query}\")\n", + " \n", + " # Create embeddings for the enhanced query\n", + " query_embedding = create_embeddings(enhanced_query)\n", + " \n", + " # Perform initial similarity search to retrieve documents\n", + " initial_results = vector_store.similarity_search(query_embedding, k=k*2)\n", + " \n", + " # Initialize a list to store ranked results\n", + " ranked_results = []\n", + " \n", + " # Score and rank documents by relevance using LLM\n", + " for doc in initial_results:\n", + " relevance_score = score_document_relevance(enhanced_query, doc[\"text\"])\n", + " ranked_results.append({\n", + " \"text\": doc[\"text\"],\n", + " \"metadata\": doc[\"metadata\"],\n", + " \"similarity\": doc[\"similarity\"],\n", + " \"relevance_score\": relevance_score\n", + " })\n", + " \n", + " # Sort the results by relevance score in descending order\n", + " ranked_results.sort(key=lambda x: x[\"relevance_score\"], reverse=True)\n", + " \n", + " # Return the top k results\n", + " return ranked_results[:k]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2. Analytical Strategy - Comprehensive Coverage" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def analytical_retrieval_strategy(query, vector_store, k=4):\n", + " \"\"\"\n", + " Retrieval strategy for analytical queries focusing on comprehensive coverage.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " vector_store (SimpleVectorStore): Vector store\n", + " k (int): Number of documents to return\n", + " \n", + " Returns:\n", + " List[Dict]: Retrieved documents\n", + " \"\"\"\n", + " print(f\"Executing Analytical retrieval strategy for: '{query}'\")\n", + " \n", + " # Define the system prompt to guide the AI in generating sub-questions\n", + " system_prompt = \"\"\"You are an expert at breaking down complex questions.\n", + " Generate sub-questions that explore different aspects of the main analytical query.\n", + " These sub-questions should cover the breadth of the topic and help retrieve \n", + " comprehensive information.\n", + "\n", + " Return a list of exactly 3 sub-questions, one per line.\n", + " \"\"\"\n", + "\n", + " # Create the user prompt with the main query\n", + " user_prompt = f\"Generate sub-questions for this analytical query: {query}\"\n", + " \n", + " # Generate the sub-questions using the LLM\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0.3\n", + " )\n", + " \n", + " # Extract and clean the sub-questions\n", + " sub_queries = response.choices[0].message.content.strip().split('\\n')\n", + " sub_queries = [q.strip() for q in sub_queries if q.strip()]\n", + " print(f\"Generated sub-queries: {sub_queries}\")\n", + " \n", + " # Retrieve documents for each sub-query\n", + " all_results = []\n", + " for sub_query in sub_queries:\n", + " # Create embeddings for the sub-query\n", + " sub_query_embedding = create_embeddings(sub_query)\n", + " # Perform similarity search for the sub-query\n", + " results = vector_store.similarity_search(sub_query_embedding, k=2)\n", + " all_results.extend(results)\n", + " \n", + " # Ensure diversity by selecting from different sub-query results\n", + " # Remove duplicates (same text content)\n", + " unique_texts = set()\n", + " diverse_results = []\n", + " \n", + " for result in all_results:\n", + " if result[\"text\"] not in unique_texts:\n", + " unique_texts.add(result[\"text\"])\n", + " diverse_results.append(result)\n", + " \n", + " # If we need more results to reach k, add more from initial results\n", + " if len(diverse_results) < k:\n", + " # Direct retrieval for the main query\n", + " main_query_embedding = create_embeddings(query)\n", + " main_results = vector_store.similarity_search(main_query_embedding, k=k)\n", + " \n", + " for result in main_results:\n", + " if result[\"text\"] not in unique_texts and len(diverse_results) < k:\n", + " unique_texts.add(result[\"text\"])\n", + " diverse_results.append(result)\n", + " \n", + " # Return the top k diverse results\n", + " return diverse_results[:k]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3. Opinion Strategy - Diverse Perspectives" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def opinion_retrieval_strategy(query, vector_store, k=4):\n", + " \"\"\"\n", + " Retrieval strategy for opinion queries focusing on diverse perspectives.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " vector_store (SimpleVectorStore): Vector store\n", + " k (int): Number of documents to return\n", + " \n", + " Returns:\n", + " List[Dict]: Retrieved documents\n", + " \"\"\"\n", + " print(f\"Executing Opinion retrieval strategy for: '{query}'\")\n", + " \n", + " # Define the system prompt to guide the AI in identifying different perspectives\n", + " system_prompt = \"\"\"You are an expert at identifying different perspectives on a topic.\n", + " For the given query about opinions or viewpoints, identify different perspectives \n", + " that people might have on this topic.\n", + "\n", + " Return a list of exactly 3 different viewpoint angles, one per line.\n", + " \"\"\"\n", + "\n", + " # Create the user prompt with the main query\n", + " user_prompt = f\"Identify different perspectives on: {query}\"\n", + " \n", + " # Generate the different perspectives using the LLM\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0.3\n", + " )\n", + " \n", + " # Extract and clean the viewpoints\n", + " viewpoints = response.choices[0].message.content.strip().split('\\n')\n", + " viewpoints = [v.strip() for v in viewpoints if v.strip()]\n", + " print(f\"Identified viewpoints: {viewpoints}\")\n", + " \n", + " # Retrieve documents representing each viewpoint\n", + " all_results = []\n", + " for viewpoint in viewpoints:\n", + " # Combine the main query with the viewpoint\n", + " combined_query = f\"{query} {viewpoint}\"\n", + " # Create embeddings for the combined query\n", + " viewpoint_embedding = create_embeddings(combined_query)\n", + " # Perform similarity search for the combined query\n", + " results = vector_store.similarity_search(viewpoint_embedding, k=2)\n", + " \n", + " # Mark results with the viewpoint they represent\n", + " for result in results:\n", + " result[\"viewpoint\"] = viewpoint\n", + " \n", + " # Add the results to the list of all results\n", + " all_results.extend(results)\n", + " \n", + " # Select a diverse range of opinions\n", + " # Ensure we get at least one document from each viewpoint if possible\n", + " selected_results = []\n", + " for viewpoint in viewpoints:\n", + " # Filter documents by viewpoint\n", + " viewpoint_docs = [r for r in all_results if r.get(\"viewpoint\") == viewpoint]\n", + " if viewpoint_docs:\n", + " selected_results.append(viewpoint_docs[0])\n", + " \n", + " # Fill remaining slots with highest similarity docs\n", + " remaining_slots = k - len(selected_results)\n", + " if remaining_slots > 0:\n", + " # Sort remaining docs by similarity\n", + " remaining_docs = [r for r in all_results if r not in selected_results]\n", + " remaining_docs.sort(key=lambda x: x[\"similarity\"], reverse=True)\n", + " selected_results.extend(remaining_docs[:remaining_slots])\n", + " \n", + " # Return the top k results\n", + " return selected_results[:k]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4. Contextual Strategy - User Context Integration" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def contextual_retrieval_strategy(query, vector_store, k=4, user_context=None):\n", + " \"\"\"\n", + " Retrieval strategy for contextual queries integrating user context.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " vector_store (SimpleVectorStore): Vector store\n", + " k (int): Number of documents to return\n", + " user_context (str): Additional user context\n", + " \n", + " Returns:\n", + " List[Dict]: Retrieved documents\n", + " \"\"\"\n", + " print(f\"Executing Contextual retrieval strategy for: '{query}'\")\n", + " \n", + " # If no user context provided, try to infer it from the query\n", + " if not user_context:\n", + " system_prompt = \"\"\"You are an expert at understanding implied context in questions.\n", + "For the given query, infer what contextual information might be relevant or implied \n", + "but not explicitly stated. Focus on what background would help answering this query.\n", + "\n", + "Return a brief description of the implied context.\"\"\"\n", + "\n", + " user_prompt = f\"Infer the implied context in this query: {query}\"\n", + " \n", + " # Generate the inferred context using the LLM\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0.1\n", + " )\n", + " \n", + " # Extract and print the inferred context\n", + " user_context = response.choices[0].message.content.strip()\n", + " print(f\"Inferred context: {user_context}\")\n", + " \n", + " # Reformulate the query to incorporate context\n", + " system_prompt = \"\"\"You are an expert at reformulating questions with context.\n", + " Given a query and some contextual information, create a more specific query that \n", + " incorporates the context to get more relevant information.\n", + "\n", + " Return ONLY the reformulated query without explanation.\"\"\"\n", + "\n", + " user_prompt = f\"\"\"\n", + " Query: {query}\n", + " Context: {user_context}\n", + "\n", + " Reformulate the query to incorporate this context:\"\"\"\n", + " \n", + " # Generate the contextualized query using the LLM\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0\n", + " )\n", + " \n", + " # Extract and print the contextualized query\n", + " contextualized_query = response.choices[0].message.content.strip()\n", + " print(f\"Contextualized query: {contextualized_query}\")\n", + " \n", + " # Retrieve documents based on the contextualized query\n", + " query_embedding = create_embeddings(contextualized_query)\n", + " initial_results = vector_store.similarity_search(query_embedding, k=k*2)\n", + " \n", + " # Rank documents considering both relevance and user context\n", + " ranked_results = []\n", + " \n", + " for doc in initial_results:\n", + " # Score document relevance considering the context\n", + " context_relevance = score_document_context_relevance(query, user_context, doc[\"text\"])\n", + " ranked_results.append({\n", + " \"text\": doc[\"text\"],\n", + " \"metadata\": doc[\"metadata\"],\n", + " \"similarity\": doc[\"similarity\"],\n", + " \"context_relevance\": context_relevance\n", + " })\n", + " \n", + " # Sort by context relevance and return top k results\n", + " ranked_results.sort(key=lambda x: x[\"context_relevance\"], reverse=True)\n", + " return ranked_results[:k]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Helper Functions for Document Scoring" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def score_document_relevance(query, document, model=\"meta-llama/Llama-3.2-3B-Instruct\"):\n", + " \"\"\"\n", + " Score document relevance to a query using LLM.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " document (str): Document text\n", + " model (str): LLM model\n", + " \n", + " Returns:\n", + " float: Relevance score from 0-10\n", + " \"\"\"\n", + " # System prompt to instruct the model on how to rate relevance\n", + " system_prompt = \"\"\"You are an expert at evaluating document relevance.\n", + " Rate the relevance of a document to a query on a scale from 0 to 10, where:\n", + " 0 = Completely irrelevant\n", + " 10 = Perfectly addresses the query\n", + "\n", + " Return ONLY a numerical score between 0 and 10, nothing else.\n", + " \"\"\"\n", + "\n", + " # Truncate document if it's too long\n", + " doc_preview = document[:1500] + \"...\" if len(document) > 1500 else document\n", + " \n", + " # User prompt containing the query and document preview\n", + " user_prompt = f\"\"\"\n", + " Query: {query}\n", + "\n", + " Document: {doc_preview}\n", + "\n", + " Relevance score (0-10):\n", + " \"\"\"\n", + " \n", + " # Generate response from the model\n", + " response = client.chat.completions.create(\n", + " model=model,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0\n", + " )\n", + " \n", + " # Extract the score from the model's response\n", + " score_text = response.choices[0].message.content.strip()\n", + " \n", + " # Extract numeric score using regex\n", + " match = re.search(r'(\\d+(\\.\\d+)?)', score_text)\n", + " if match:\n", + " score = float(match.group(1))\n", + " return min(10, max(0, score)) # Ensure score is within 0-10\n", + " else:\n", + " # Default score if extraction fails\n", + " return 5.0" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def score_document_context_relevance(query, context, document, model=\"meta-llama/Llama-3.2-3B-Instruct\"):\n", + " \"\"\"\n", + " Score document relevance considering both query and context.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " context (str): User context\n", + " document (str): Document text\n", + " model (str): LLM model\n", + " \n", + " Returns:\n", + " float: Relevance score from 0-10\n", + " \"\"\"\n", + " # System prompt to instruct the model on how to rate relevance considering context\n", + " system_prompt = \"\"\"You are an expert at evaluating document relevance considering context.\n", + " Rate the document on a scale from 0 to 10 based on how well it addresses the query\n", + " when considering the provided context, where:\n", + " 0 = Completely irrelevant\n", + " 10 = Perfectly addresses the query in the given context\n", + "\n", + " Return ONLY a numerical score between 0 and 10, nothing else.\n", + " \"\"\"\n", + "\n", + " # Truncate document if it's too long\n", + " doc_preview = document[:1500] + \"...\" if len(document) > 1500 else document\n", + " \n", + " # User prompt containing the query, context, and document preview\n", + " user_prompt = f\"\"\"\n", + " Query: {query}\n", + " Context: {context}\n", + "\n", + " Document: {doc_preview}\n", + "\n", + " Relevance score considering context (0-10):\n", + " \"\"\"\n", + " \n", + " # Generate response from the model\n", + " response = client.chat.completions.create(\n", + " model=model,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0\n", + " )\n", + " \n", + " # Extract the score from the model's response\n", + " score_text = response.choices[0].message.content.strip()\n", + " \n", + " # Extract numeric score using regex\n", + " match = re.search(r'(\\d+(\\.\\d+)?)', score_text)\n", + " if match:\n", + " score = float(match.group(1))\n", + " return min(10, max(0, score)) # Ensure score is within 0-10\n", + " else:\n", + " # Default score if extraction fails\n", + " return 5.0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The Core Adaptive Retriever" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "def adaptive_retrieval(query, vector_store, k=4, user_context=None):\n", + " \"\"\"\n", + " Perform adaptive retrieval by selecting and executing the appropriate strategy.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " vector_store (SimpleVectorStore): Vector store\n", + " k (int): Number of documents to retrieve\n", + " user_context (str): Optional user context for contextual queries\n", + " \n", + " Returns:\n", + " List[Dict]: Retrieved documents\n", + " \"\"\"\n", + " # Classify the query to determine its type\n", + " query_type = classify_query(query)\n", + " print(f\"Query classified as: {query_type}\")\n", + " \n", + " # Select and execute the appropriate retrieval strategy based on the query type\n", + " if query_type == \"Factual\":\n", + " # Use the factual retrieval strategy for precise information\n", + " results = factual_retrieval_strategy(query, vector_store, k)\n", + " elif query_type == \"Analytical\":\n", + " # Use the analytical retrieval strategy for comprehensive coverage\n", + " results = analytical_retrieval_strategy(query, vector_store, k)\n", + " elif query_type == \"Opinion\":\n", + " # Use the opinion retrieval strategy for diverse perspectives\n", + " results = opinion_retrieval_strategy(query, vector_store, k)\n", + " elif query_type == \"Contextual\":\n", + " # Use the contextual retrieval strategy, incorporating user context\n", + " results = contextual_retrieval_strategy(query, vector_store, k, user_context)\n", + " else:\n", + " # Default to factual retrieval strategy if classification fails\n", + " results = factual_retrieval_strategy(query, vector_store, k)\n", + " \n", + " return results # Return the retrieved documents" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Response Generation" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_response(query, results, query_type, model=\"meta-llama/Llama-3.2-3B-Instruct\"):\n", + " \"\"\"\n", + " Generate a response based on query, retrieved documents, and query type.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " results (List[Dict]): Retrieved documents\n", + " query_type (str): Type of query\n", + " model (str): LLM model\n", + " \n", + " Returns:\n", + " str: Generated response\n", + " \"\"\"\n", + " # Prepare context from retrieved documents by joining their texts with separators\n", + " context = \"\\n\\n---\\n\\n\".join([r[\"text\"] for r in results])\n", + " \n", + " # Create custom system prompt based on query type\n", + " if query_type == \"Factual\":\n", + " system_prompt = \"\"\"You are a helpful assistant providing factual information.\n", + " Answer the question based on the provided context. Focus on accuracy and precision.\n", + " If the context doesn't contain the information needed, acknowledge the limitations.\"\"\"\n", + " \n", + " elif query_type == \"Analytical\":\n", + " system_prompt = \"\"\"You are a helpful assistant providing analytical insights.\n", + " Based on the provided context, offer a comprehensive analysis of the topic.\n", + " Cover different aspects and perspectives in your explanation.\n", + " If the context has gaps, acknowledge them while providing the best analysis possible.\"\"\"\n", + " \n", + " elif query_type == \"Opinion\":\n", + " system_prompt = \"\"\"You are a helpful assistant discussing topics with multiple viewpoints.\n", + " Based on the provided context, present different perspectives on the topic.\n", + " Ensure fair representation of diverse opinions without showing bias.\n", + " Acknowledge where the context presents limited viewpoints.\"\"\"\n", + " \n", + " elif query_type == \"Contextual\":\n", + " system_prompt = \"\"\"You are a helpful assistant providing contextually relevant information.\n", + " Answer the question considering both the query and its context.\n", + " Make connections between the query context and the information in the provided documents.\n", + " If the context doesn't fully address the specific situation, acknowledge the limitations.\"\"\"\n", + " \n", + " else:\n", + " system_prompt = \"\"\"You are a helpful assistant. Answer the question based on the provided context. If you cannot answer from the context, acknowledge the limitations.\"\"\"\n", + " \n", + " # Create user prompt by combining the context and the query\n", + " user_prompt = f\"\"\"\n", + " Context:\n", + " {context}\n", + "\n", + " Question: {query}\n", + "\n", + " Please provide a helpful response based on the context.\n", + " \"\"\"\n", + " \n", + " # Generate response using the OpenAI client\n", + " response = client.chat.completions.create(\n", + " model=model,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0.2\n", + " )\n", + " \n", + " # Return the generated response content\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Complete RAG Pipeline with Adaptive Retrieval" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "def rag_with_adaptive_retrieval(pdf_path, query, k=4, user_context=None):\n", + " \"\"\"\n", + " Complete RAG pipeline with adaptive retrieval.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to PDF document\n", + " query (str): User query\n", + " k (int): Number of documents to retrieve\n", + " user_context (str): Optional user context\n", + " \n", + " Returns:\n", + " Dict: Results including query, retrieved documents, query type, and response\n", + " \"\"\"\n", + " print(\"\\n=== RAG WITH ADAPTIVE RETRIEVAL ===\")\n", + " print(f\"Query: {query}\")\n", + " \n", + " # Process the document to extract text, chunk it, and create embeddings\n", + " chunks, vector_store = process_document(pdf_path)\n", + " \n", + " # Classify the query to determine its type\n", + " query_type = classify_query(query)\n", + " print(f\"Query classified as: {query_type}\")\n", + " \n", + " # Retrieve documents using the adaptive retrieval strategy based on the query type\n", + " retrieved_docs = adaptive_retrieval(query, vector_store, k, user_context)\n", + " \n", + " # Generate a response based on the query, retrieved documents, and query type\n", + " response = generate_response(query, retrieved_docs, query_type)\n", + " \n", + " # Compile the results into a dictionary\n", + " result = {\n", + " \"query\": query,\n", + " \"query_type\": query_type,\n", + " \"retrieved_documents\": retrieved_docs,\n", + " \"response\": response\n", + " }\n", + " \n", + " print(\"\\n=== RESPONSE ===\")\n", + " print(response)\n", + " \n", + " return result" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluation Framework" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "def evaluate_adaptive_vs_standard(pdf_path, test_queries, reference_answers=None):\n", + " \"\"\"\n", + " Compare adaptive retrieval with standard retrieval on a set of test queries.\n", + " \n", + " This function processes a document, runs both standard and adaptive retrieval methods\n", + " on each test query, and compares their performance. If reference answers are provided,\n", + " it also evaluates the quality of responses against these references.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to PDF document to be processed as the knowledge source\n", + " test_queries (List[str]): List of test queries to evaluate both retrieval methods\n", + " reference_answers (List[str], optional): Reference answers for evaluation metrics\n", + " \n", + " Returns:\n", + " Dict: Evaluation results containing individual query results and overall comparison\n", + " \"\"\"\n", + " print(\"=== EVALUATING ADAPTIVE VS. STANDARD RETRIEVAL ===\")\n", + " \n", + " # Process document to extract text, create chunks and build the vector store\n", + " chunks, vector_store = process_document(pdf_path)\n", + " \n", + " # Initialize collection for storing comparison results\n", + " results = []\n", + " \n", + " # Process each test query with both retrieval methods\n", + " for i, query in enumerate(test_queries):\n", + " print(f\"\\n\\nQuery {i+1}: {query}\")\n", + " \n", + " # --- Standard retrieval approach ---\n", + " print(\"\\n--- Standard Retrieval ---\")\n", + " # Create embedding for the query\n", + " query_embedding = create_embeddings(query)\n", + " # Retrieve documents using simple vector similarity\n", + " standard_docs = vector_store.similarity_search(query_embedding, k=4)\n", + " # Generate response using a generic approach\n", + " standard_response = generate_response(query, standard_docs, \"General\")\n", + " \n", + " # --- Adaptive retrieval approach ---\n", + " print(\"\\n--- Adaptive Retrieval ---\")\n", + " # Classify the query to determine its type (Factual, Analytical, Opinion, Contextual)\n", + " query_type = classify_query(query)\n", + " # Retrieve documents using the strategy appropriate for this query type\n", + " adaptive_docs = adaptive_retrieval(query, vector_store, k=4)\n", + " # Generate a response tailored to the query type\n", + " adaptive_response = generate_response(query, adaptive_docs, query_type)\n", + " \n", + " # Store complete results for this query\n", + " result = {\n", + " \"query\": query,\n", + " \"query_type\": query_type,\n", + " \"standard_retrieval\": {\n", + " \"documents\": standard_docs,\n", + " \"response\": standard_response\n", + " },\n", + " \"adaptive_retrieval\": {\n", + " \"documents\": adaptive_docs,\n", + " \"response\": adaptive_response\n", + " }\n", + " }\n", + " \n", + " # Add reference answer if available for this query\n", + " if reference_answers and i < len(reference_answers):\n", + " result[\"reference_answer\"] = reference_answers[i]\n", + " \n", + " results.append(result)\n", + " \n", + " # Display preview of both responses for quick comparison\n", + " print(\"\\n--- Responses ---\")\n", + " print(f\"Standard: {standard_response[:200]}...\")\n", + " print(f\"Adaptive: {adaptive_response[:200]}...\")\n", + " \n", + " # Calculate comparative metrics if reference answers are available\n", + " if reference_answers:\n", + " comparison = compare_responses(results)\n", + " print(\"\\n=== EVALUATION RESULTS ===\")\n", + " print(comparison)\n", + " \n", + " # Return the complete evaluation results\n", + " return {\n", + " \"results\": results,\n", + " \"comparison\": comparison if reference_answers else \"No reference answers provided for evaluation\"\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "def compare_responses(results):\n", + " \"\"\"\n", + " Compare standard and adaptive responses against reference answers.\n", + " \n", + " Args:\n", + " results (List[Dict]): Results containing both types of responses\n", + " \n", + " Returns:\n", + " str: Comparison analysis\n", + " \"\"\"\n", + " # Define the system prompt to guide the AI in comparing responses\n", + " comparison_prompt = \"\"\"You are an expert evaluator of information retrieval systems.\n", + " Compare the standard retrieval and adaptive retrieval responses for each query.\n", + " Consider factors like accuracy, relevance, comprehensiveness, and alignment with the reference answer.\n", + " Provide a detailed analysis of the strengths and weaknesses of each approach.\"\"\"\n", + " \n", + " # Initialize the comparison text with a header\n", + " comparison_text = \"# Evaluation of Standard vs. Adaptive Retrieval\\n\\n\"\n", + " \n", + " # Iterate through each result to compare responses\n", + " for i, result in enumerate(results):\n", + " # Skip if there is no reference answer for the query\n", + " if \"reference_answer\" not in result:\n", + " continue\n", + " \n", + " # Add query details to the comparison text\n", + " comparison_text += f\"## Query {i+1}: {result['query']}\\n\"\n", + " comparison_text += f\"*Query Type: {result['query_type']}*\\n\\n\"\n", + " comparison_text += f\"**Reference Answer:**\\n{result['reference_answer']}\\n\\n\"\n", + " \n", + " # Add standard retrieval response to the comparison text\n", + " comparison_text += f\"**Standard Retrieval Response:**\\n{result['standard_retrieval']['response']}\\n\\n\"\n", + " \n", + " # Add adaptive retrieval response to the comparison text\n", + " comparison_text += f\"**Adaptive Retrieval Response:**\\n{result['adaptive_retrieval']['response']}\\n\\n\"\n", + " \n", + " # Create the user prompt for the AI to compare the responses\n", + " user_prompt = f\"\"\"\n", + " Reference Answer: {result['reference_answer']}\n", + " \n", + " Standard Retrieval Response: {result['standard_retrieval']['response']}\n", + " \n", + " Adaptive Retrieval Response: {result['adaptive_retrieval']['response']}\n", + " \n", + " Provide a detailed comparison of the two responses.\n", + " \"\"\"\n", + " \n", + " # Generate the comparison analysis using the OpenAI client\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": comparison_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0.2\n", + " )\n", + " \n", + " # Add the AI's comparison analysis to the comparison text\n", + " comparison_text += f\"**Comparison Analysis:**\\n{response.choices[0].message.content}\\n\\n\"\n", + " \n", + " return comparison_text # Return the complete comparison analysis" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluating the Adaptive Retrieval System (Customized Queries)\n", + "\n", + "The final step to use the adaptive RAG evaluation system is to call the evaluate_adaptive_vs_standard() function with your PDF document and test queries:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "# Path to your knowledge source document\n", + "# This PDF file contains the information that the RAG system will use\n", + "pdf_path = \"data/AI_information.pdf\"\n", + "\n", + "# Define test queries covering different query types to demonstrate \n", + "# how adaptive retrieval handles various query intentions\n", + "test_queries = [\n", + " \"What is Explainable AI (XAI)?\", # Factual query - seeking definition/specific information\n", + " # \"How do AI ethics and governance frameworks address potential societal impacts?\", # Analytical query - requiring comprehensive analysis\n", + " # \"Is AI development moving too fast for proper regulation?\", # Opinion query - seeking diverse perspectives\n", + " # \"How might explainable AI help in healthcare decisions?\", # Contextual query - benefits from context-awareness\n", + "]\n", + "\n", + "# Reference answers for more thorough evaluation\n", + "# These can be used to objectively assess response quality against a known standard\n", + "reference_answers = [\n", + " \"Explainable AI (XAI) aims to make AI systems transparent and understandable by providing clear explanations of how decisions are made. This helps users trust and effectively manage AI technologies.\",\n", + " # \"AI ethics and governance frameworks address potential societal impacts by establishing guidelines and principles to ensure AI systems are developed and used responsibly. These frameworks focus on fairness, accountability, transparency, and the protection of human rights to mitigate risks and promote beneficial output.5.\",\n", + " # \"Opinions on whether AI development is moving too fast for proper regulation vary. Some argue that rapid advancements outpace regulatory efforts, leading to potential risks and ethical concerns. Others believe that innovation should continue at its current pace, with regulations evolving alongside to address emerging challenges.\",\n", + " # \"Explainable AI can significantly aid healthcare decisions by providing transparent and understandable insights into AI-driven recommendations. This transparency helps healthcare professionals trust AI systems, make informed decisions, and improve patient output by understanding the rationale behind AI suggestions.\"\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "=== EVALUATING ADAPTIVE VS. STANDARD RETRIEVAL ===\n", + "Extracting text from PDF...\n", + "Chunking text...\n", + "Created 42 text chunks\n", + "Creating embeddings for chunks...\n", + "Added 42 chunks to the vector store\n", + "\n", + "\n", + "Query 1: What is Explainable AI (XAI)?\n", + "\n", + "--- Standard Retrieval ---\n", + "\n", + "--- Adaptive Retrieval ---\n", + "Query classified as: Factual\n", + "Executing Factual retrieval strategy for: 'What is Explainable AI (XAI)?'\n", + "Enhanced query: What are the key applications and techniques of Explainable Artificial Intelligence (XAI) in machine learning and deep learning?\n", + "\n", + "--- Responses ---\n", + "Standard: Based on the provided context, Explainable AI (XAI) is a set of techniques aimed at making AI decisions more understandable, enabling users to assess their fairness and accuracy. The goal of XAI is to...\n", + "Adaptive: Explainable AI (XAI) is a subfield of artificial intelligence (AI) that aims to make AI systems more transparent and understandable. The primary goal of XAI is to provide insights into how AI models m...\n", + "\n", + "=== EVALUATION RESULTS ===\n", + "# Evaluation of Standard vs. Adaptive Retrieval\n", + "\n", + "## Query 1: What is Explainable AI (XAI)?\n", + "*Query Type: Factual*\n", + "\n", + "**Reference Answer:**\n", + "Explainable AI (XAI) aims to make AI systems transparent and understandable by providing clear explanations of how decisions are made. This helps users trust and effectively manage AI technologies.\n", + "\n", + "**Standard Retrieval Response:**\n", + "Based on the provided context, Explainable AI (XAI) is a set of techniques aimed at making AI decisions more understandable, enabling users to assess their fairness and accuracy. The goal of XAI is to provide insights into how AI models make decisions, enhancing trust and accountability in AI systems. This involves developing methods for explaining AI decisions, which can help users understand the reliability and fairness of AI-driven outcomes.\n", + "\n", + "**Adaptive Retrieval Response:**\n", + "Explainable AI (XAI) is a subfield of artificial intelligence (AI) that aims to make AI systems more transparent and understandable. The primary goal of XAI is to provide insights into how AI models make decisions, thereby enhancing trust and accountability in AI systems.\n", + "\n", + "XAI techniques are being developed to explain the reasoning behind AI decisions, making it possible for users to assess the reliability and fairness of AI outputs. This is particularly important in high-stakes applications such as medical diagnosis, finance, transportation, and manufacturing, where the consequences of AI errors can be severe.\n", + "\n", + "By making AI systems more explainable, XAI techniques can help address concerns about the potential for unintended consequences, accountability, and responsibility in AI development and deployment.\n", + "\n", + "**Comparison Analysis:**\n", + "**Comparison of Standard Retrieval Response and Adaptive Retrieval Response**\n", + "\n", + "The two responses provide similar information about Explainable AI (XAI), but they differ in their tone, structure, and level of detail. Here's a detailed comparison of the two responses:\n", + "\n", + "**Accuracy and Relevance**\n", + "\n", + "* Both responses accurately convey the main idea of XAI, which is to make AI systems more transparent and understandable.\n", + "* However, the Standard Retrieval Response provides more context and background information about XAI, including its goals and applications.\n", + "* The Adaptive Retrieval Response is more concise and to the point, but it lacks the depth and detail of the Standard Retrieval Response.\n", + "\n", + "**Comprehensiveness**\n", + "\n", + "* The Standard Retrieval Response provides a more comprehensive overview of XAI, including its techniques, goals, and applications.\n", + "* The Adaptive Retrieval Response focuses primarily on the definition and purpose of XAI, without providing much additional context or information.\n", + "* The Standard Retrieval Response also highlights the importance of XAI in high-stakes applications, such as medical diagnosis, finance, transportation, and manufacturing.\n", + "\n", + "**Alignment with Reference Answer**\n", + "\n", + "* Both responses align with the reference answer, but the Standard Retrieval Response is more closely aligned due to its more detailed and comprehensive explanation of XAI.\n", + "* The Adaptive Retrieval Response is more concise and to the point, but it may not fully capture the nuances and complexities of XAI.\n", + "\n", + "**Strengths and Weaknesses**\n", + "\n", + "**Standard Retrieval Response**\n", + "\n", + "Strengths:\n", + "\n", + "* Provides a more comprehensive overview of XAI\n", + "* Offers more context and background information\n", + "* Aligns closely with the reference answer\n", + "\n", + "Weaknesses:\n", + "\n", + "* May be too lengthy or wordy for some readers\n", + "* Lacks the concise and to-the-point style of the Adaptive Retrieval Response\n", + "\n", + "**Adaptive Retrieval Response**\n", + "\n", + "Strengths:\n", + "\n", + "* Is concise and to the point\n", + "* Provides a clear and direct definition of XAI\n", + "* May be more suitable for readers who prefer a brief overview\n", + "\n", + "Weaknesses:\n", + "\n", + "* Lacks depth and detail\n", + "* Fails to provide much additional context or information about XAI\n", + "* May not fully capture the nuances and complexities of XAI\n", + "\n", + "**Conclusion**\n", + "\n", + "The Standard Retrieval Response provides a more comprehensive and detailed overview of XAI, while the Adaptive Retrieval Response is more concise and to the point. Both responses align with the reference answer, but the Standard Retrieval Response is more closely aligned due to its more detailed and comprehensive explanation of XAI.\n", + "\n", + "\n", + "# Evaluation of Standard vs. Adaptive Retrieval\n", + "\n", + "## Query 1: What is Explainable AI (XAI)?\n", + "*Query Type: Factual*\n", + "\n", + "**Reference Answer:**\n", + "Explainable AI (XAI) aims to make AI systems transparent and understandable by providing clear explanations of how decisions are made. This helps users trust and effectively manage AI technologies.\n", + "\n", + "**Standard Retrieval Response:**\n", + "Based on the provided context, Explainable AI (XAI) is a set of techniques aimed at making AI decisions more understandable, enabling users to assess their fairness and accuracy. The goal of XAI is to provide insights into how AI models make decisions, enhancing trust and accountability in AI systems. This involves developing methods for explaining AI decisions, which can help users understand the reliability and fairness of AI-driven outcomes.\n", + "\n", + "**Adaptive Retrieval Response:**\n", + "Explainable AI (XAI) is a subfield of artificial intelligence (AI) that aims to make AI systems more transparent and understandable. The primary goal of XAI is to provide insights into how AI models make decisions, thereby enhancing trust and accountability in AI systems.\n", + "\n", + "XAI techniques are being developed to explain the reasoning behind AI decisions, making it possible for users to assess the reliability and fairness of AI outputs. This is particularly important in high-stakes applications such as medical diagnosis, finance, transportation, and manufacturing, where the consequences of AI errors can be severe.\n", + "\n", + "By making AI systems more explainable, XAI techniques can help address concerns about the potential for unintended consequences, accountability, and responsibility in AI development and deployment.\n", + "\n", + "**Comparison Analysis:**\n", + "**Comparison of Standard Retrieval Response and Adaptive Retrieval Response**\n", + "\n", + "The two responses provide similar information about Explainable AI (XAI), but they differ in their tone, structure, and level of detail. Here's a detailed comparison of the two responses:\n", + "\n", + "**Accuracy and Relevance**\n", + "\n", + "* Both responses accurately convey the main idea of XAI, which is to make AI systems more transparent and understandable.\n", + "* However, the Standard Retrieval Response provides more context and background information about XAI, including its goals and applications.\n", + "* The Adaptive Retrieval Response is more concise and to the point, but it lacks the depth and detail of the Standard Retrieval Response.\n", + "\n", + "**Comprehensiveness**\n", + "\n", + "* The Standard Retrieval Response provides a more comprehensive overview of XAI, including its techniques, goals, and applications.\n", + "* The Adaptive Retrieval Response focuses primarily on the definition and purpose of XAI, without providing much additional context or information.\n", + "* The Standard Retrieval Response also highlights the importance of XAI in high-stakes applications, such as medical diagnosis, finance, transportation, and manufacturing.\n", + "\n", + "**Alignment with Reference Answer**\n", + "\n", + "* Both responses align with the reference answer, but the Standard Retrieval Response is more closely aligned due to its more detailed and comprehensive explanation of XAI.\n", + "* The Adaptive Retrieval Response is more concise and to the point, but it may not fully capture the nuances and complexities of XAI.\n", + "\n", + "**Strengths and Weaknesses**\n", + "\n", + "**Standard Retrieval Response**\n", + "\n", + "Strengths:\n", + "\n", + "* Provides a more comprehensive overview of XAI\n", + "* Offers more context and background information\n", + "* Aligns closely with the reference answer\n", + "\n", + "Weaknesses:\n", + "\n", + "* May be too lengthy or wordy for some readers\n", + "* Lacks the concise and to-the-point style of the Adaptive Retrieval Response\n", + "\n", + "**Adaptive Retrieval Response**\n", + "\n", + "Strengths:\n", + "\n", + "* Is concise and to the point\n", + "* Provides a clear and direct definition of XAI\n", + "* May be more suitable for readers who prefer a brief overview\n", + "\n", + "Weaknesses:\n", + "\n", + "* Lacks depth and detail\n", + "* Fails to provide much additional context or information about XAI\n", + "* May not fully capture the nuances and complexities of XAI\n", + "\n", + "**Conclusion**\n", + "\n", + "The Standard Retrieval Response provides a more comprehensive and detailed overview of XAI, while the Adaptive Retrieval Response is more concise and to the point. Both responses align with the reference answer, but the Standard Retrieval Response is more closely aligned due to its more detailed and comprehensive explanation of XAI.\n", + "\n", + "\n" + ] + } + ], + "source": [ + "# Run the evaluation comparing adaptive vs standard retrieval\n", + "# This will process each query using both methods and compare the results\n", + "evaluation_results = evaluate_adaptive_vs_standard(\n", + " pdf_path=pdf_path, # Source document for knowledge extraction\n", + " test_queries=test_queries, # List of test queries to evaluate\n", + " reference_answers=reference_answers # Optional ground truth for comparison\n", + ")\n", + "\n", + "# The results will show a detailed comparison between standard retrieval and \n", + "# adaptive retrieval performance across different query types, highlighting\n", + "# where adaptive strategies provide improved outcomes\n", + "print(evaluation_results[\"comparison\"])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv-new-specific-rag", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 9ce89b60d9698bff60ae052f15d87528460882f7 Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Sun, 9 Mar 2025 13:13:12 +0500 Subject: [PATCH 03/32] Self rag --- 13_self_rag.ipynb | 1177 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1177 insertions(+) create mode 100644 13_self_rag.ipynb diff --git a/13_self_rag.ipynb b/13_self_rag.ipynb new file mode 100644 index 0000000..cae2d56 --- /dev/null +++ b/13_self_rag.ipynb @@ -0,0 +1,1177 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "vscode": { + "languageId": "markdown" + } + }, + "source": [ + "# Self-RAG: A Dynamic Approach to RAG\n", + "\n", + "In this notebook, I implement Self-RAG, an advanced RAG system that dynamically decides when and how to use retrieved information. Unlike traditional RAG approaches, Self-RAG introduces reflection points throughout the retrieval and generation process, resulting in higher quality and more reliable responses.\n", + "\n", + "## Key Components of Self-RAG\n", + "\n", + "1. **Retrieval Decision**: Determines if retrieval is even necessary for a given query\n", + "2. **Document Retrieval**: Fetches potentially relevant documents when needed \n", + "3. **Relevance Evaluation**: Assesses how relevant each retrieved document is\n", + "4. **Response Generation**: Creates responses based on relevant contexts\n", + "5. **Support Assessment**: Evaluates if responses are properly grounded in the context\n", + "6. **Utility Evaluation**: Rates the overall usefulness of generated responses" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting Up the Environment\n", + "We begin by importing necessary libraries." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import numpy as np\n", + "import json\n", + "import fitz\n", + "from openai import OpenAI\n", + "import re" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Extracting Text from a PDF File\n", + "To implement RAG, we first need a source of textual data. In this case, we extract text from a PDF file using the PyMuPDF library." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def extract_text_from_pdf(pdf_path):\n", + " \"\"\"\n", + " Extracts text from a PDF file and prints the first `num_chars` characters.\n", + "\n", + " Args:\n", + " pdf_path (str): Path to the PDF file.\n", + "\n", + " Returns:\n", + " str: Extracted text from the PDF.\n", + " \"\"\"\n", + " # Open the PDF file\n", + " mypdf = fitz.open(pdf_path)\n", + " all_text = \"\" # Initialize an empty string to store the extracted text\n", + "\n", + " # Iterate through each page in the PDF\n", + " for page_num in range(mypdf.page_count):\n", + " page = mypdf[page_num] # Get the page\n", + " text = page.get_text(\"text\") # Extract text from the page\n", + " all_text += text # Append the extracted text to the all_text string\n", + "\n", + " return all_text # Return the extracted text" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Chunking the Extracted Text\n", + "Once we have the extracted text, we divide it into smaller, overlapping chunks to improve retrieval accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def chunk_text(text, n, overlap):\n", + " \"\"\"\n", + " Chunks the given text into segments of n characters with overlap.\n", + "\n", + " Args:\n", + " text (str): The text to be chunked.\n", + " n (int): The number of characters in each chunk.\n", + " overlap (int): The number of overlapping characters between chunks.\n", + "\n", + " Returns:\n", + " List[str]: A list of text chunks.\n", + " \"\"\"\n", + " chunks = [] # Initialize an empty list to store the chunks\n", + " \n", + " # Loop through the text with a step size of (n - overlap)\n", + " for i in range(0, len(text), n - overlap):\n", + " # Append a chunk of text from index i to i + n to the chunks list\n", + " chunks.append(text[i:i + n])\n", + "\n", + " return chunks # Return the list of text chunks" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting Up the OpenAI API Client\n", + "We initialize the OpenAI client to generate embeddings and responses." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize the OpenAI client with the base URL and API key\n", + "client = OpenAI(\n", + " base_url=\"https://api.studio.nebius.com/v1/\",\n", + " api_key=os.getenv(\"OPENAI_API_KEY\") # Retrieve the API key from environment variables\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Simple Vector Store Implementation\n", + "We'll create a basic vector store to manage document chunks and their embeddings." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "class SimpleVectorStore:\n", + " \"\"\"\n", + " A simple vector store implementation using NumPy.\n", + " \"\"\"\n", + " def __init__(self):\n", + " \"\"\"\n", + " Initialize the vector store.\n", + " \"\"\"\n", + " self.vectors = [] # List to store embedding vectors\n", + " self.texts = [] # List to store original texts\n", + " self.metadata = [] # List to store metadata for each text\n", + " \n", + " def add_item(self, text, embedding, metadata=None):\n", + " \"\"\"\n", + " Add an item to the vector store.\n", + "\n", + " Args:\n", + " text (str): The original text.\n", + " embedding (List[float]): The embedding vector.\n", + " metadata (dict, optional): Additional metadata.\n", + " \"\"\"\n", + " self.vectors.append(np.array(embedding)) # Convert embedding to numpy array and add to vectors list\n", + " self.texts.append(text) # Add the original text to texts list\n", + " self.metadata.append(metadata or {}) # Add metadata to metadata list, default to empty dict if None\n", + " \n", + " def similarity_search(self, query_embedding, k=5, filter_func=None):\n", + " \"\"\"\n", + " Find the most similar items to a query embedding.\n", + "\n", + " Args:\n", + " query_embedding (List[float]): Query embedding vector.\n", + " k (int): Number of results to return.\n", + " filter_func (callable, optional): Function to filter results.\n", + "\n", + " Returns:\n", + " List[Dict]: Top k most similar items with their texts and metadata.\n", + " \"\"\"\n", + " if not self.vectors:\n", + " return [] # Return empty list if no vectors are stored\n", + " \n", + " # Convert query embedding to numpy array\n", + " query_vector = np.array(query_embedding)\n", + " \n", + " # Calculate similarities using cosine similarity\n", + " similarities = []\n", + " for i, vector in enumerate(self.vectors):\n", + " # Apply filter if provided\n", + " if filter_func and not filter_func(self.metadata[i]):\n", + " continue\n", + " \n", + " # Calculate cosine similarity\n", + " similarity = np.dot(query_vector, vector) / (np.linalg.norm(query_vector) * np.linalg.norm(vector))\n", + " similarities.append((i, similarity)) # Append index and similarity score\n", + " \n", + " # Sort by similarity (descending)\n", + " similarities.sort(key=lambda x: x[1], reverse=True)\n", + " \n", + " # Return top k results\n", + " results = []\n", + " for i in range(min(k, len(similarities))):\n", + " idx, score = similarities[i]\n", + " results.append({\n", + " \"text\": self.texts[idx], # Add the text\n", + " \"metadata\": self.metadata[idx], # Add the metadata\n", + " \"similarity\": score # Add the similarity score\n", + " })\n", + " \n", + " return results # Return the list of top k results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating Embeddings" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def create_embeddings(text, model=\"BAAI/bge-en-icl\"):\n", + " \"\"\"\n", + " Creates embeddings for the given text.\n", + "\n", + " Args:\n", + " text (str or List[str]): The input text(s) for which embeddings are to be created.\n", + " model (str): The model to be used for creating embeddings.\n", + "\n", + " Returns:\n", + " List[float] or List[List[float]]: The embedding vector(s).\n", + " \"\"\"\n", + " # Handle both string and list inputs by converting string input to a list\n", + " input_text = text if isinstance(text, list) else [text]\n", + " \n", + " # Create embeddings for the input text using the specified model\n", + " response = client.embeddings.create(\n", + " model=model,\n", + " input=input_text\n", + " )\n", + " \n", + " # If the input was a single string, return just the first embedding\n", + " if isinstance(text, str):\n", + " return response.data[0].embedding\n", + " \n", + " # Otherwise, return all embeddings for the list of texts\n", + " return [item.embedding for item in response.data]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Document Processing Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def process_document(pdf_path, chunk_size=1000, chunk_overlap=200):\n", + " \"\"\"\n", + " Process a document for Self-RAG.\n", + "\n", + " Args:\n", + " pdf_path (str): Path to the PDF file.\n", + " chunk_size (int): Size of each chunk in characters.\n", + " chunk_overlap (int): Overlap between chunks in characters.\n", + "\n", + " Returns:\n", + " SimpleVectorStore: A vector store containing document chunks and their embeddings.\n", + " \"\"\"\n", + " # Extract text from the PDF file\n", + " print(\"Extracting text from PDF...\")\n", + " extracted_text = extract_text_from_pdf(pdf_path)\n", + " \n", + " # Chunk the extracted text\n", + " print(\"Chunking text...\")\n", + " chunks = chunk_text(extracted_text, chunk_size, chunk_overlap)\n", + " print(f\"Created {len(chunks)} text chunks\")\n", + " \n", + " # Create embeddings for each chunk\n", + " print(\"Creating embeddings for chunks...\")\n", + " chunk_embeddings = create_embeddings(chunks)\n", + " \n", + " # Initialize the vector store\n", + " store = SimpleVectorStore()\n", + " \n", + " # Add each chunk and its embedding to the vector store\n", + " for i, (chunk, embedding) in enumerate(zip(chunks, chunk_embeddings)):\n", + " store.add_item(\n", + " text=chunk,\n", + " embedding=embedding,\n", + " metadata={\"index\": i, \"source\": pdf_path}\n", + " )\n", + " \n", + " print(f\"Added {len(chunks)} chunks to the vector store\")\n", + " return store" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Self-RAG Components\n", + "### 1. Retrieval Decision" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def determine_if_retrieval_needed(query):\n", + " \"\"\"\n", + " Determines if retrieval is necessary for the given query.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " \n", + " Returns:\n", + " bool: True if retrieval is needed, False otherwise\n", + " \"\"\"\n", + " # System prompt to instruct the AI on how to determine if retrieval is necessary\n", + " system_prompt = \"\"\"You are an AI assistant that determines if retrieval is necessary to answer a query.\n", + " For factual questions, specific information requests, or questions about events, people, or concepts, answer \"Yes\".\n", + " For opinions, hypothetical scenarios, or simple queries with common knowledge, answer \"No\".\n", + " Answer with ONLY \"Yes\" or \"No\".\"\"\"\n", + "\n", + " # User prompt containing the query\n", + " user_prompt = f\"Query: {query}\\n\\nIs retrieval necessary to answer this query accurately?\"\n", + " \n", + " # Generate response from the model\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0\n", + " )\n", + " \n", + " # Extract the answer from the model's response and convert to lowercase\n", + " answer = response.choices[0].message.content.strip().lower()\n", + " \n", + " # Return True if the answer contains \"yes\", otherwise return False\n", + " return \"yes\" in answer" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2. Relevance Evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def evaluate_relevance(query, context):\n", + " \"\"\"\n", + " Evaluates the relevance of a context to the query.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " context (str): Context text\n", + " \n", + " Returns:\n", + " str: 'relevant' or 'irrelevant'\n", + " \"\"\"\n", + " # System prompt to instruct the AI on how to determine document relevance\n", + " system_prompt = \"\"\"You are an AI assistant that determines if a document is relevant to a query.\n", + " Consider whether the document contains information that would be helpful in answering the query.\n", + " Answer with ONLY \"Relevant\" or \"Irrelevant\".\"\"\"\n", + "\n", + " # Truncate context if it is too long to avoid exceeding token limits\n", + " max_context_length = 2000\n", + " if len(context) > max_context_length:\n", + " context = context[:max_context_length] + \"... [truncated]\"\n", + "\n", + " # User prompt containing the query and the document content\n", + " user_prompt = f\"\"\"Query: {query}\n", + " Document content:\n", + " {context}\n", + "\n", + " Is this document relevant to the query? Answer with ONLY \"Relevant\" or \"Irrelevant\".\n", + " \"\"\"\n", + " \n", + " # Generate response from the model\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0\n", + " )\n", + " \n", + " # Extract the answer from the model's response and convert to lowercase\n", + " answer = response.choices[0].message.content.strip().lower()\n", + " \n", + " return answer # Return the relevance evaluation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3. Support Assessment" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def assess_support(response, context):\n", + " \"\"\"\n", + " Assesses how well a response is supported by the context.\n", + " \n", + " Args:\n", + " response (str): Generated response\n", + " context (str): Context text\n", + " \n", + " Returns:\n", + " str: 'fully supported', 'partially supported', or 'no support'\n", + " \"\"\"\n", + " # System prompt to instruct the AI on how to evaluate support\n", + " system_prompt = \"\"\"You are an AI assistant that determines if a response is supported by the given context.\n", + " Evaluate if the facts, claims, and information in the response are backed by the context.\n", + " Answer with ONLY one of these three options:\n", + " - \"Fully supported\": All information in the response is directly supported by the context.\n", + " - \"Partially supported\": Some information in the response is supported by the context, but some is not.\n", + " - \"No support\": The response contains significant information not found in or contradicting the context.\n", + " \"\"\"\n", + "\n", + " # Truncate context if it is too long to avoid exceeding token limits\n", + " max_context_length = 2000\n", + " if len(context) > max_context_length:\n", + " context = context[:max_context_length] + \"... [truncated]\"\n", + "\n", + " # User prompt containing the context and the response to be evaluated\n", + " user_prompt = f\"\"\"Context:\n", + " {context}\n", + "\n", + " Response:\n", + " {response}\n", + "\n", + " How well is this response supported by the context? Answer with ONLY \"Fully supported\", \"Partially supported\", or \"No support\".\n", + " \"\"\"\n", + " \n", + " # Generate response from the model\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0\n", + " )\n", + " \n", + " # Extract the answer from the model's response and convert to lowercase\n", + " answer = response.choices[0].message.content.strip().lower()\n", + " \n", + " return answer # Return the support assessment" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4. Utility Evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def rate_utility(query, response):\n", + " \"\"\"\n", + " Rates the utility of a response for the query.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " response (str): Generated response\n", + " \n", + " Returns:\n", + " int: Utility rating from 1 to 5\n", + " \"\"\"\n", + " # System prompt to instruct the AI on how to rate the utility of the response\n", + " system_prompt = \"\"\"You are an AI assistant that rates the utility of a response to a query.\n", + " Consider how well the response answers the query, its completeness, correctness, and helpfulness.\n", + " Rate the utility on a scale from 1 to 5, where:\n", + " - 1: Not useful at all\n", + " - 2: Slightly useful\n", + " - 3: Moderately useful\n", + " - 4: Very useful\n", + " - 5: Exceptionally useful\n", + " Answer with ONLY a single number from 1 to 5.\"\"\"\n", + "\n", + " # User prompt containing the query and the response to be rated\n", + " user_prompt = f\"\"\"Query: {query}\n", + " Response:\n", + " {response}\n", + "\n", + " Rate the utility of this response on a scale from 1 to 5:\"\"\"\n", + " \n", + " # Generate the utility rating using the OpenAI client\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0\n", + " )\n", + " \n", + " # Extract the rating from the model's response\n", + " rating = response.choices[0].message.content.strip()\n", + " \n", + " # Extract just the number from the rating\n", + " rating_match = re.search(r'[1-5]', rating)\n", + " if rating_match:\n", + " return int(rating_match.group()) # Return the extracted rating as an integer\n", + " \n", + " return 3 # Default to middle rating if parsing fails" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Response Generation" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_response(query, context=None):\n", + " \"\"\"\n", + " Generates a response based on the query and optional context.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " context (str, optional): Context text\n", + " \n", + " Returns:\n", + " str: Generated response\n", + " \"\"\"\n", + " # System prompt to instruct the AI on how to generate a helpful response\n", + " system_prompt = \"\"\"You are a helpful AI assistant. Provide a clear, accurate, and informative response to the query.\"\"\"\n", + " \n", + " # Create the user prompt based on whether context is provided\n", + " if context:\n", + " user_prompt = f\"\"\"Context:\n", + " {context}\n", + "\n", + " Query: {query}\n", + "\n", + " Please answer the query based on the provided context.\n", + " \"\"\"\n", + " else:\n", + " user_prompt = f\"\"\"Query: {query}\n", + " \n", + " Please answer the query to the best of your ability.\"\"\"\n", + " \n", + " # Generate the response using the OpenAI client\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0.2\n", + " )\n", + " \n", + " # Return the generated response text\n", + " return response.choices[0].message.content.strip()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Complete Self-RAG Implementation" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def self_rag(query, vector_store, top_k=3):\n", + " \"\"\"\n", + " Implements the complete Self-RAG pipeline.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " vector_store (SimpleVectorStore): Vector store containing document chunks\n", + " top_k (int): Number of documents to retrieve initially\n", + " \n", + " Returns:\n", + " dict: Results including query, response, and metrics from the Self-RAG process\n", + " \"\"\"\n", + " print(f\"\\n=== Starting Self-RAG for query: {query} ===\\n\")\n", + " \n", + " # Step 1: Determine if retrieval is necessary\n", + " print(\"Step 1: Determining if retrieval is necessary...\")\n", + " retrieval_needed = determine_if_retrieval_needed(query)\n", + " print(f\"Retrieval needed: {retrieval_needed}\")\n", + " \n", + " # Initialize metrics to track the Self-RAG process\n", + " metrics = {\n", + " \"retrieval_needed\": retrieval_needed,\n", + " \"documents_retrieved\": 0,\n", + " \"relevant_documents\": 0,\n", + " \"response_support_ratings\": [],\n", + " \"utility_ratings\": []\n", + " }\n", + " \n", + " best_response = None\n", + " best_score = -1\n", + " \n", + " if retrieval_needed:\n", + " # Step 2: Retrieve documents\n", + " print(\"\\nStep 2: Retrieving relevant documents...\")\n", + " query_embedding = create_embeddings(query)\n", + " results = vector_store.similarity_search(query_embedding, k=top_k)\n", + " metrics[\"documents_retrieved\"] = len(results)\n", + " print(f\"Retrieved {len(results)} documents\")\n", + " \n", + " # Step 3: Evaluate relevance of each document\n", + " print(\"\\nStep 3: Evaluating document relevance...\")\n", + " relevant_contexts = []\n", + " \n", + " for i, result in enumerate(results):\n", + " context = result[\"text\"]\n", + " relevance = evaluate_relevance(query, context)\n", + " print(f\"Document {i+1} relevance: {relevance}\")\n", + " \n", + " if relevance == \"relevant\":\n", + " relevant_contexts.append(context)\n", + " \n", + " metrics[\"relevant_documents\"] = len(relevant_contexts)\n", + " print(f\"Found {len(relevant_contexts)} relevant documents\")\n", + " \n", + " if relevant_contexts:\n", + " # Step 4: Process each relevant context\n", + " print(\"\\nStep 4: Processing relevant contexts...\")\n", + " for i, context in enumerate(relevant_contexts):\n", + " print(f\"\\nProcessing context {i+1}/{len(relevant_contexts)}...\")\n", + " \n", + " # Generate response based on the context\n", + " print(\"Generating response...\")\n", + " response = generate_response(query, context)\n", + " \n", + " # Assess how well the response is supported by the context\n", + " print(\"Assessing support...\")\n", + " support_rating = assess_support(response, context)\n", + " print(f\"Support rating: {support_rating}\")\n", + " metrics[\"response_support_ratings\"].append(support_rating)\n", + " \n", + " # Rate the utility of the response\n", + " print(\"Rating utility...\")\n", + " utility_rating = rate_utility(query, response)\n", + " print(f\"Utility rating: {utility_rating}/5\")\n", + " metrics[\"utility_ratings\"].append(utility_rating)\n", + " \n", + " # Calculate overall score (higher for better support and utility)\n", + " support_score = {\n", + " \"fully supported\": 3, \n", + " \"partially supported\": 1, \n", + " \"no support\": 0\n", + " }.get(support_rating, 0)\n", + " \n", + " overall_score = support_score * 5 + utility_rating\n", + " print(f\"Overall score: {overall_score}\")\n", + " \n", + " # Keep track of the best response\n", + " if overall_score > best_score:\n", + " best_response = response\n", + " best_score = overall_score\n", + " print(\"New best response found!\")\n", + " \n", + " # If no relevant contexts were found or all responses scored poorly\n", + " if not relevant_contexts or best_score <= 0:\n", + " print(\"\\nNo suitable context found or poor responses, generating without retrieval...\")\n", + " best_response = generate_response(query)\n", + " else:\n", + " # No retrieval needed, generate directly\n", + " print(\"\\nNo retrieval needed, generating response directly...\")\n", + " best_response = generate_response(query)\n", + " \n", + " # Final metrics\n", + " metrics[\"best_score\"] = best_score\n", + " metrics[\"used_retrieval\"] = retrieval_needed and best_score > 0\n", + " \n", + " print(\"\\n=== Self-RAG Completed ===\")\n", + " \n", + " return {\n", + " \"query\": query,\n", + " \"response\": best_response,\n", + " \"metrics\": metrics\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Running the Complete Self-RAG System" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def run_self_rag_example():\n", + " \"\"\"\n", + " Demonstrates the complete Self-RAG system with examples.\n", + " \"\"\"\n", + " # Process document\n", + " pdf_path = \"data/AI_Information.pdf\" # Path to the PDF document\n", + " print(f\"Processing document: {pdf_path}\")\n", + " vector_store = process_document(pdf_path) # Process the document and create a vector store\n", + " \n", + " # Example 1: Query likely needing retrieval\n", + " query1 = \"What are the main ethical concerns in AI development?\"\n", + " print(\"\\n\" + \"=\"*80)\n", + " print(f\"EXAMPLE 1: {query1}\")\n", + " result1 = self_rag(query1, vector_store) # Run Self-RAG for the first query\n", + " print(\"\\nFinal response:\")\n", + " print(result1[\"response\"]) # Print the final response for the first query\n", + " print(\"\\nMetrics:\")\n", + " print(json.dumps(result1[\"metrics\"], indent=2)) # Print the metrics for the first query\n", + " \n", + " # Example 2: Query likely not needing retrieval\n", + " query2 = \"Can you write a short poem about artificial intelligence?\"\n", + " print(\"\\n\" + \"=\"*80)\n", + " print(f\"EXAMPLE 2: {query2}\")\n", + " result2 = self_rag(query2, vector_store) # Run Self-RAG for the second query\n", + " print(\"\\nFinal response:\")\n", + " print(result2[\"response\"]) # Print the final response for the second query\n", + " print(\"\\nMetrics:\")\n", + " print(json.dumps(result2[\"metrics\"], indent=2)) # Print the metrics for the second query\n", + " \n", + " # Example 3: Query with some relevance to document but requiring additional knowledge\n", + " query3 = \"How might AI impact economic growth in developing countries?\"\n", + " print(\"\\n\" + \"=\"*80)\n", + " print(f\"EXAMPLE 3: {query3}\")\n", + " result3 = self_rag(query3, vector_store) # Run Self-RAG for the third query\n", + " print(\"\\nFinal response:\")\n", + " print(result3[\"response\"]) # Print the final response for the third query\n", + " print(\"\\nMetrics:\")\n", + " print(json.dumps(result3[\"metrics\"], indent=2)) # Print the metrics for the third query\n", + " \n", + " return {\n", + " \"example1\": result1,\n", + " \"example2\": result2,\n", + " \"example3\": result3\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluating Self-RAG Against Traditional RAG" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "def traditional_rag(query, vector_store, top_k=3):\n", + " \"\"\"\n", + " Implements a traditional RAG approach for comparison.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " vector_store (SimpleVectorStore): Vector store containing document chunks\n", + " top_k (int): Number of documents to retrieve\n", + " \n", + " Returns:\n", + " str: Generated response\n", + " \"\"\"\n", + " print(f\"\\n=== Running traditional RAG for query: {query} ===\\n\")\n", + " \n", + " # Retrieve documents\n", + " print(\"Retrieving documents...\")\n", + " query_embedding = create_embeddings(query) # Create embeddings for the query\n", + " results = vector_store.similarity_search(query_embedding, k=top_k) # Search for similar documents\n", + " print(f\"Retrieved {len(results)} documents\")\n", + " \n", + " # Combine contexts from retrieved documents\n", + " contexts = [result[\"text\"] for result in results] # Extract text from results\n", + " combined_context = \"\\n\\n\".join(contexts) # Combine texts into a single context\n", + " \n", + " # Generate response using the combined context\n", + " print(\"Generating response...\")\n", + " response = generate_response(query, combined_context) # Generate response based on the combined context\n", + " \n", + " return response" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "def evaluate_rag_approaches(pdf_path, test_queries, reference_answers=None):\n", + " \"\"\"\n", + " Compare Self-RAG with traditional RAG.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the document\n", + " test_queries (List[str]): List of test queries\n", + " reference_answers (List[str], optional): Reference answers for evaluation\n", + " \n", + " Returns:\n", + " dict: Evaluation results\n", + " \"\"\"\n", + " print(\"=== Evaluating RAG Approaches ===\")\n", + " \n", + " # Process document to create a vector store\n", + " vector_store = process_document(pdf_path)\n", + " \n", + " results = []\n", + " \n", + " for i, query in enumerate(test_queries):\n", + " print(f\"\\nProcessing query {i+1}: {query}\")\n", + " \n", + " # Run Self-RAG\n", + " self_rag_result = self_rag(query, vector_store) # Get response from Self-RAG\n", + " self_rag_response = self_rag_result[\"response\"]\n", + " \n", + " # Run traditional RAG\n", + " trad_rag_response = traditional_rag(query, vector_store) # Get response from traditional RAG\n", + " \n", + " # Compare results if reference answer is available\n", + " reference = reference_answers[i] if reference_answers and i < len(reference_answers) else None\n", + " comparison = compare_responses(query, self_rag_response, trad_rag_response, reference) # Compare responses\n", + " \n", + " results.append({\n", + " \"query\": query,\n", + " \"self_rag_response\": self_rag_response,\n", + " \"traditional_rag_response\": trad_rag_response,\n", + " \"reference_answer\": reference,\n", + " \"comparison\": comparison,\n", + " \"self_rag_metrics\": self_rag_result[\"metrics\"]\n", + " })\n", + " \n", + " # Generate overall analysis\n", + " overall_analysis = generate_overall_analysis(results)\n", + " \n", + " return {\n", + " \"results\": results,\n", + " \"overall_analysis\": overall_analysis\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "def compare_responses(query, self_rag_response, trad_rag_response, reference=None):\n", + " \"\"\"\n", + " Compare responses from Self-RAG and traditional RAG.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " self_rag_response (str): Response from Self-RAG\n", + " trad_rag_response (str): Response from traditional RAG\n", + " reference (str, optional): Reference answer\n", + " \n", + " Returns:\n", + " str: Comparison analysis\n", + " \"\"\"\n", + " system_prompt = \"\"\"You are an expert evaluator of RAG systems. Your task is to compare responses from two different RAG approaches:\n", + "1. Self-RAG: A dynamic approach that decides if retrieval is needed and evaluates information relevance and response quality\n", + "2. Traditional RAG: Always retrieves documents and uses them to generate a response\n", + "\n", + "Compare the responses based on:\n", + "- Relevance to the query\n", + "- Factual correctness\n", + "- Completeness and informativeness\n", + "- Conciseness and focus\"\"\"\n", + "\n", + " user_prompt = f\"\"\"Query: {query}\n", + "\n", + "Response from Self-RAG:\n", + "{self_rag_response}\n", + "\n", + "Response from Traditional RAG:\n", + "{trad_rag_response}\n", + "\"\"\"\n", + "\n", + " if reference:\n", + " user_prompt += f\"\"\"\n", + "Reference Answer (for factual checking):\n", + "{reference}\n", + "\"\"\"\n", + "\n", + " user_prompt += \"\"\"\n", + "Compare these responses and explain which one is better and why.\n", + "Focus on accuracy, relevance, completeness, and quality.\n", + "\"\"\"\n", + "\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\", # Using a stronger model for evaluation\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0\n", + " )\n", + " \n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_overall_analysis(results):\n", + " \"\"\"\n", + " Generate an overall analysis of Self-RAG vs traditional RAG.\n", + " \n", + " Args:\n", + " results (List[Dict]): Results from evaluate_rag_approaches\n", + " \n", + " Returns:\n", + " str: Overall analysis\n", + " \"\"\"\n", + " system_prompt = \"\"\"You are an expert evaluator of RAG systems. Your task is to provide an overall analysis comparing\n", + " Self-RAG and Traditional RAG based on multiple test queries.\n", + "\n", + " Focus your analysis on:\n", + " 1. When Self-RAG performs better and why\n", + " 2. When Traditional RAG performs better and why\n", + " 3. The impact of dynamic retrieval decisions in Self-RAG\n", + " 4. The value of relevance and support evaluation in Self-RAG\n", + " 5. Overall recommendations on which approach to use for different types of queries\"\"\"\n", + "\n", + " # Prepare a summary of the individual comparisons\n", + " comparisons_summary = \"\"\n", + " for i, result in enumerate(results):\n", + " comparisons_summary += f\"Query {i+1}: {result['query']}\\n\"\n", + " comparisons_summary += f\"Self-RAG metrics: Retrieval needed: {result['self_rag_metrics']['retrieval_needed']}, \"\n", + " comparisons_summary += f\"Relevant docs: {result['self_rag_metrics']['relevant_documents']}/{result['self_rag_metrics']['documents_retrieved']}\\n\"\n", + " comparisons_summary += f\"Comparison summary: {result['comparison'][:200]}...\\n\\n\"\n", + "\n", + " user_prompt = f\"\"\"Based on the following comparison results from {len(results)} test queries, please provide an overall analysis of\n", + " Self-RAG versus Traditional RAG:\n", + "\n", + " {comparisons_summary}\n", + "\n", + " Please provide your comprehensive analysis.\n", + " \"\"\"\n", + "\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0\n", + " )\n", + " \n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluating the Self-RAG System\n", + "\n", + "The final step is to evaluate the Self-RAG system against traditional RAG approaches. We'll compare the quality of responses generated by both systems and analyze the performance of Self-RAG in different scenarios." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "=== Evaluating RAG Approaches ===\n", + "Extracting text from PDF...\n", + "Chunking text...\n", + "Created 42 text chunks\n", + "Creating embeddings for chunks...\n", + "Added 42 chunks to the vector store\n", + "\n", + "Processing query 1: What are the main ethical concerns in AI development?\n", + "\n", + "=== Starting Self-RAG for query: What are the main ethical concerns in AI development? ===\n", + "\n", + "Step 1: Determining if retrieval is necessary...\n", + "Retrieval needed: True\n", + "\n", + "Step 2: Retrieving relevant documents...\n", + "Retrieved 3 documents\n", + "\n", + "Step 3: Evaluating document relevance...\n", + "Document 1 relevance: relevant\n", + "Document 2 relevance: relevant\n", + "Document 3 relevance: relevant\n", + "Found 3 relevant documents\n", + "\n", + "Step 4: Processing relevant contexts...\n", + "\n", + "Processing context 1/3...\n", + "Generating response...\n", + "Assessing support...\n", + "Support rating: fully supported\n", + "Rating utility...\n", + "Utility rating: 4/5\n", + "Overall score: 19\n", + "New best response found!\n", + "\n", + "Processing context 2/3...\n", + "Generating response...\n", + "Assessing support...\n", + "Support rating: partially supported\n", + "Rating utility...\n", + "Utility rating: 4/5\n", + "Overall score: 9\n", + "\n", + "Processing context 3/3...\n", + "Generating response...\n", + "Assessing support...\n", + "Support rating: fully supported\n", + "Rating utility...\n", + "Utility rating: 5/5\n", + "Overall score: 20\n", + "New best response found!\n", + "\n", + "=== Self-RAG Completed ===\n", + "\n", + "=== Running traditional RAG for query: What are the main ethical concerns in AI development? ===\n", + "\n", + "Retrieving documents...\n", + "Retrieved 3 documents\n", + "Generating response...\n", + "\n", + "=== OVERALL ANALYSIS ===\n", + "\n", + "**Overall Analysis: Self-RAG vs Traditional RAG**\n", + "\n", + "Based on the comparison results from the test query \"What are the main ethical concerns in AI development?\", I will provide a comprehensive analysis of the strengths and weaknesses of both Self-RAG and Traditional RAG systems.\n", + "\n", + "**When Self-RAG performs better:**\n", + "\n", + "1. **Dynamic retrieval decisions**: Self-RAG's ability to dynamically adjust its retrieval decisions based on the query context and user feedback can lead to better results in complex queries with multiple relevant documents. In the case of Query 1, Self-RAG's retrieval needed was True, indicating that it was able to identify the most relevant documents for the query. This suggests that Self-RAG's dynamic retrieval decisions were effective in this scenario.\n", + "2. **Relevance and support evaluation**: Self-RAG's evaluation of relevance and support can lead to more accurate and informative responses. In this case, Self-RAG's relevant docs were 3/3, indicating that it was able to identify the most relevant documents for the query. This suggests that Self-RAG's evaluation of relevance and support was effective in this scenario.\n", + "\n", + "**When Traditional RAG performs better:**\n", + "\n", + "1. **Simple queries**: Traditional RAG may perform better in simple queries with a single relevant document. In this case, the query \"What are the main ethical concerns in AI development?\" may have been too complex for Traditional RAG to handle effectively.\n", + "2. **Pre-defined ranking**: Traditional RAG's pre-defined ranking may be more effective in scenarios where the ranking of documents is not critical. In this case, the query \"What are the main ethical concerns in AI development?\" may not have required a highly ranked response.\n", + "\n", + "**The impact of dynamic retrieval decisions in Self-RAG:**\n", + "\n", + "Self-RAG's dynamic retrieval decisions can lead to better results in complex queries with multiple relevant documents. However, this may also lead to over-retrieval or under-retrieval of documents, depending on the query context and user feedback. To mitigate this, Self-RAG's dynamic retrieval decisions should be carefully tuned to ensure that the most relevant documents are retrieved.\n", + "\n", + "**The value of relevance and support evaluation in Self-RAG:**\n", + "\n", + "Self-RAG's evaluation of relevance and support is critical in ensuring that the retrieved documents are accurate and informative. By evaluating the relevance and support of each document, Self-RAG can provide more accurate and informative responses. However, this evaluation should be carefully tuned to ensure that the most relevant documents are retrieved.\n", + "\n", + "**Overall recommendations:**\n", + "\n", + "1. **Use Self-RAG for complex queries**: Self-RAG's dynamic retrieval decisions and evaluation of relevance and support make it a better choice for complex queries with multiple relevant documents.\n", + "2. **Use Traditional RAG for simple queries**: Traditional RAG's pre-defined ranking and simplicity make it a better choice for simple queries with a single relevant document.\n", + "3. **Tune Self-RAG's dynamic retrieval decisions**: Self-RAG's dynamic retrieval decisions should be carefully tuned to ensure that the most relevant documents are retrieved.\n", + "4. **Evaluate relevance and support in Self-RAG**: Self-RAG's evaluation of relevance and support is critical in ensuring that the retrieved documents are accurate and informative.\n", + "\n", + "In conclusion, Self-RAG and Traditional RAG have different strengths and weaknesses, and the choice of which system to use depends on the type of query and the desired outcome. By understanding the strengths and weaknesses of each system, we can make informed decisions about which system to use in different scenarios.\n" + ] + } + ], + "source": [ + "# Path to the AI information document\n", + "pdf_path = \"data/AI_Information.pdf\"\n", + "\n", + "# Define test queries covering different query types to test Self-RAG's adaptive retrieval\n", + "test_queries = [\n", + " \"What are the main ethical concerns in AI development?\", # Document-focused query\n", + " # \"How does explainable AI improve trust in AI systems?\", # Document-focused query\n", + " # \"Write a poem about artificial intelligence\", # Creative query, doesn't need retrieval\n", + " # \"Will superintelligent AI lead to human obsolescence?\" # Speculative query, partial retrieval needed\n", + "]\n", + "\n", + "# Reference answers for more objective evaluation\n", + "reference_answers = [\n", + " \"The main ethical concerns in AI development include bias and fairness, privacy, transparency, accountability, safety, and the potential for misuse or harmful applications.\",\n", + " # \"Explainable AI improves trust by making AI decision-making processes transparent and understandable to users, helping them verify fairness, identify potential biases, and better understand AI limitations.\",\n", + " # \"A quality poem about artificial intelligence should creatively explore themes of AI's capabilities, limitations, relationship with humanity, potential futures, or philosophical questions about consciousness and intelligence.\",\n", + " # \"Views on superintelligent AI's impact on human relevance vary widely. Some experts warn of potential risks if AI surpasses human capabilities across domains, possibly leading to economic displacement or loss of human agency. Others argue humans will remain relevant through complementary skills, emotional intelligence, and by defining AI's purpose. Most experts agree that thoughtful governance and human-centered design are essential regardless of the outcome.\"\n", + "]\n", + "\n", + "# Run the evaluation comparing Self-RAG with traditional RAG approaches\n", + "evaluation_results = evaluate_rag_approaches(\n", + " pdf_path=pdf_path, # Source document containing AI information\n", + " test_queries=test_queries, # List of AI-related test queries\n", + " reference_answers=reference_answers # Ground truth answers for evaluation\n", + ")\n", + "\n", + "# Print the overall comparative analysis\n", + "print(\"\\n=== OVERALL ANALYSIS ===\\n\")\n", + "print(evaluation_results[\"overall_analysis\"])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv-new-specific-rag", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 8e26102fc2db119e16210d4bb5d7f49ade04dc00 Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Sun, 9 Mar 2025 15:16:43 +0500 Subject: [PATCH 04/32] Proposition Chunking --- 14_proposition_chunking.ipynb | 1010 +++++++++++++++++++++++++++++++++ 1 file changed, 1010 insertions(+) create mode 100644 14_proposition_chunking.ipynb diff --git a/14_proposition_chunking.ipynb b/14_proposition_chunking.ipynb new file mode 100644 index 0000000..6eac37a --- /dev/null +++ b/14_proposition_chunking.ipynb @@ -0,0 +1,1010 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "vscode": { + "languageId": "markdown" + } + }, + "source": [ + "# Proposition Chunking for Enhanced RAG\n", + "\n", + "In this notebook, I implement proposition chunking - an advanced technique to break down documents into atomic, factual statements for more accurate retrieval. Unlike traditional chunking that simply divides text by character count, proposition chunking preserves the semantic integrity of individual facts.\n", + "\n", + "Proposition chunking delivers more precise retrieval by:\n", + "\n", + "1. Breaking content into atomic, self-contained facts\n", + "2. Creating smaller, more granular units for retrieval \n", + "3. Enabling more precise matching between queries and relevant content\n", + "4. Filtering out low-quality or incomplete propositions\n", + "\n", + "Let's build a complete implementation without relying on LangChain or FAISS." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting Up the Environment\n", + "We begin by importing necessary libraries." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import numpy as np\n", + "import json\n", + "import fitz\n", + "from openai import OpenAI\n", + "import re" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Extracting Text from a PDF File\n", + "To implement RAG, we first need a source of textual data. In this case, we extract text from a PDF file using the PyMuPDF library." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def extract_text_from_pdf(pdf_path):\n", + " \"\"\"\n", + " Extracts text from a PDF file and prints the first `num_chars` characters.\n", + "\n", + " Args:\n", + " pdf_path (str): Path to the PDF file.\n", + "\n", + " Returns:\n", + " str: Extracted text from the PDF.\n", + " \"\"\"\n", + " # Open the PDF file\n", + " mypdf = fitz.open(pdf_path)\n", + " all_text = \"\" # Initialize an empty string to store the extracted text\n", + "\n", + " # Iterate through each page in the PDF\n", + " for page_num in range(mypdf.page_count):\n", + " page = mypdf[page_num] # Get the page\n", + " text = page.get_text(\"text\") # Extract text from the page\n", + " all_text += text # Append the extracted text to the all_text string\n", + "\n", + " return all_text # Return the extracted text" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Chunking the Extracted Text\n", + "Once we have the extracted text, we divide it into smaller, overlapping chunks to improve retrieval accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def chunk_text(text, chunk_size=800, overlap=100):\n", + " \"\"\"\n", + " Split text into overlapping chunks.\n", + " \n", + " Args:\n", + " text (str): Input text to chunk\n", + " chunk_size (int): Size of each chunk in characters\n", + " overlap (int): Overlap between chunks in characters\n", + " \n", + " Returns:\n", + " List[Dict]: List of chunk dictionaries with text and metadata\n", + " \"\"\"\n", + " chunks = [] # Initialize an empty list to store the chunks\n", + " \n", + " # Iterate over the text with the specified chunk size and overlap\n", + " for i in range(0, len(text), chunk_size - overlap):\n", + " chunk = text[i:i + chunk_size] # Extract a chunk of the specified size\n", + " if chunk: # Ensure we don't add empty chunks\n", + " chunks.append({\n", + " \"text\": chunk, # The chunk text\n", + " \"chunk_id\": len(chunks) + 1, # Unique ID for the chunk\n", + " \"start_char\": i, # Starting character index of the chunk\n", + " \"end_char\": i + len(chunk) # Ending character index of the chunk\n", + " })\n", + " \n", + " print(f\"Created {len(chunks)} text chunks\") # Print the number of created chunks\n", + " return chunks # Return the list of chunks" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting Up the OpenAI API Client\n", + "We initialize the OpenAI client to generate embeddings and responses." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize the OpenAI client with the base URL and API key\n", + "client = OpenAI(\n", + " base_url=\"https://api.studio.nebius.com/v1/\",\n", + " api_key=os.getenv(\"OPENAI_API_KEY\") # Retrieve the API key from environment variables\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Simple Vector Store Implementation\n", + "We'll create a basic vector store to manage document chunks and their embeddings." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "class SimpleVectorStore:\n", + " \"\"\"\n", + " A simple vector store implementation using NumPy.\n", + " \"\"\"\n", + " def __init__(self):\n", + " # Initialize lists to store vectors, texts, and metadata\n", + " self.vectors = []\n", + " self.texts = []\n", + " self.metadata = []\n", + " \n", + " def add_item(self, text, embedding, metadata=None):\n", + " \"\"\"\n", + " Add an item to the vector store.\n", + " \n", + " Args:\n", + " text (str): The text content\n", + " embedding (List[float]): The embedding vector\n", + " metadata (Dict, optional): Additional metadata\n", + " \"\"\"\n", + " # Append the embedding, text, and metadata to their respective lists\n", + " self.vectors.append(np.array(embedding))\n", + " self.texts.append(text)\n", + " self.metadata.append(metadata or {})\n", + " \n", + " def add_items(self, texts, embeddings, metadata_list=None):\n", + " \"\"\"\n", + " Add multiple items to the vector store.\n", + " \n", + " Args:\n", + " texts (List[str]): List of text contents\n", + " embeddings (List[List[float]]): List of embedding vectors\n", + " metadata_list (List[Dict], optional): List of metadata dictionaries\n", + " \"\"\"\n", + " # If no metadata list is provided, create an empty dictionary for each text\n", + " if metadata_list is None:\n", + " metadata_list = [{} for _ in range(len(texts))]\n", + " \n", + " # Add each text, embedding, and metadata to the store\n", + " for text, embedding, metadata in zip(texts, embeddings, metadata_list):\n", + " self.add_item(text, embedding, metadata)\n", + " \n", + " def similarity_search(self, query_embedding, k=5):\n", + " \"\"\"\n", + " Find the most similar items to a query embedding.\n", + " \n", + " Args:\n", + " query_embedding (List[float]): Query embedding vector\n", + " k (int): Number of results to return\n", + " \n", + " Returns:\n", + " List[Dict]: Top k most similar items\n", + " \"\"\"\n", + " # Return an empty list if there are no vectors in the store\n", + " if not self.vectors:\n", + " return []\n", + " \n", + " # Convert query embedding to a numpy array\n", + " query_vector = np.array(query_embedding)\n", + " \n", + " # Calculate similarities using cosine similarity\n", + " similarities = []\n", + " for i, vector in enumerate(self.vectors):\n", + " similarity = np.dot(query_vector, vector) / (np.linalg.norm(query_vector) * np.linalg.norm(vector))\n", + " similarities.append((i, similarity))\n", + " \n", + " # Sort by similarity in descending order\n", + " similarities.sort(key=lambda x: x[1], reverse=True)\n", + " \n", + " # Collect the top k results\n", + " results = []\n", + " for i in range(min(k, len(similarities))):\n", + " idx, score = similarities[i]\n", + " results.append({\n", + " \"text\": self.texts[idx],\n", + " \"metadata\": self.metadata[idx],\n", + " \"similarity\": float(score) # Convert to float for JSON serialization\n", + " })\n", + " \n", + " return results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating Embeddings" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def create_embeddings(texts, model=\"BAAI/bge-en-icl\"):\n", + " \"\"\"\n", + " Create embeddings for the given texts.\n", + " \n", + " Args:\n", + " texts (str or List[str]): Input text(s)\n", + " model (str): Embedding model name\n", + " \n", + " Returns:\n", + " List[List[float]]: Embedding vector(s)\n", + " \"\"\"\n", + " # Handle both string and list inputs\n", + " input_texts = texts if isinstance(texts, list) else [texts]\n", + " \n", + " # Process in batches if needed (OpenAI API limits)\n", + " batch_size = 100\n", + " all_embeddings = []\n", + " \n", + " # Iterate over the input texts in batches\n", + " for i in range(0, len(input_texts), batch_size):\n", + " batch = input_texts[i:i + batch_size] # Get the current batch of texts\n", + " \n", + " # Create embeddings for the current batch\n", + " response = client.embeddings.create(\n", + " model=model,\n", + " input=batch\n", + " )\n", + " \n", + " # Extract embeddings from the response\n", + " batch_embeddings = [item.embedding for item in response.data]\n", + " all_embeddings.extend(batch_embeddings) # Add the batch embeddings to the list\n", + " \n", + " # If input was a single string, return just the first embedding\n", + " if isinstance(texts, str):\n", + " return all_embeddings[0]\n", + " \n", + " # Otherwise, return all embeddings\n", + " return all_embeddings" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Proposition Generation" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_propositions(chunk):\n", + " \"\"\"\n", + " Generate atomic, self-contained propositions from a text chunk.\n", + " \n", + " Args:\n", + " chunk (Dict): Text chunk with content and metadata\n", + " \n", + " Returns:\n", + " List[str]: List of generated propositions\n", + " \"\"\"\n", + " # System prompt to instruct the AI on how to generate propositions\n", + " system_prompt = \"\"\"Please break down the following text into simple, self-contained propositions. \n", + " Ensure that each proposition meets the following criteria:\n", + "\n", + " 1. Express a Single Fact: Each proposition should state one specific fact or claim.\n", + " 2. Be Understandable Without Context: The proposition should be self-contained, meaning it can be understood without needing additional context.\n", + " 3. Use Full Names, Not Pronouns: Avoid pronouns or ambiguous references; use full entity names.\n", + " 4. Include Relevant Dates/Qualifiers: If applicable, include necessary dates, times, and qualifiers to make the fact precise.\n", + " 5. Contain One Subject-Predicate Relationship: Focus on a single subject and its corresponding action or attribute, without conjunctions or multiple clauses.\n", + "\n", + " Output ONLY the list of propositions without any additional text or explanations.\"\"\"\n", + "\n", + " # User prompt containing the text chunk to be converted into propositions\n", + " user_prompt = f\"Text to convert into propositions:\\n\\n{chunk['text']}\"\n", + " \n", + " # Generate response from the model\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\", # Using a stronger model for accurate proposition generation\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0\n", + " )\n", + " \n", + " # Extract propositions from the response\n", + " raw_propositions = response.choices[0].message.content.strip().split('\\n')\n", + " \n", + " # Clean up propositions (remove numbering, bullets, etc.)\n", + " clean_propositions = []\n", + " for prop in raw_propositions:\n", + " # Remove numbering (1., 2., etc.) and bullet points\n", + " cleaned = re.sub(r'^\\s*(\\d+\\.|\\-|\\*)\\s*', '', prop).strip()\n", + " if cleaned and len(cleaned) > 10: # Simple filter for empty or very short propositions\n", + " clean_propositions.append(cleaned)\n", + " \n", + " return clean_propositions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Quality Checking for Propositions" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def evaluate_proposition(proposition, original_text):\n", + " \"\"\"\n", + " Evaluate a proposition's quality based on accuracy, clarity, completeness, and conciseness.\n", + " \n", + " Args:\n", + " proposition (str): The proposition to evaluate\n", + " original_text (str): The original text for comparison\n", + " \n", + " Returns:\n", + " Dict: Scores for each evaluation dimension\n", + " \"\"\"\n", + " # System prompt to instruct the AI on how to evaluate the proposition\n", + " system_prompt = \"\"\"You are an expert at evaluating the quality of propositions extracted from text.\n", + " Rate the given proposition on the following criteria (scale 1-10):\n", + "\n", + " - Accuracy: How well the proposition reflects information in the original text\n", + " - Clarity: How easy it is to understand the proposition without additional context\n", + " - Completeness: Whether the proposition includes necessary details (dates, qualifiers, etc.)\n", + " - Conciseness: Whether the proposition is concise without losing important information\n", + "\n", + " The response must be in valid JSON format with numerical scores for each criterion:\n", + " {\"accuracy\": X, \"clarity\": X, \"completeness\": X, \"conciseness\": X}\n", + " \"\"\"\n", + "\n", + " # User prompt containing the proposition and the original text\n", + " user_prompt = f\"\"\"Proposition: {proposition}\n", + "\n", + " Original Text: {original_text}\n", + "\n", + " Please provide your evaluation scores in JSON format.\"\"\"\n", + "\n", + " # Generate response from the model\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " response_format={\"type\": \"json_object\"},\n", + " temperature=0\n", + " )\n", + " \n", + " # Parse the JSON response\n", + " try:\n", + " scores = json.loads(response.choices[0].message.content.strip())\n", + " return scores\n", + " except json.JSONDecodeError:\n", + " # Fallback if JSON parsing fails\n", + " return {\n", + " \"accuracy\": 5,\n", + " \"clarity\": 5,\n", + " \"completeness\": 5,\n", + " \"conciseness\": 5\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Complete Proposition Processing Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def process_document_into_propositions(pdf_path, chunk_size=800, chunk_overlap=100, \n", + " quality_thresholds=None):\n", + " \"\"\"\n", + " Process a document into quality-checked propositions.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF file\n", + " chunk_size (int): Size of each chunk in characters\n", + " chunk_overlap (int): Overlap between chunks in characters\n", + " quality_thresholds (Dict): Threshold scores for proposition quality\n", + " \n", + " Returns:\n", + " Tuple[List[Dict], List[Dict]]: Original chunks and proposition chunks\n", + " \"\"\"\n", + " # Set default quality thresholds if not provided\n", + " if quality_thresholds is None:\n", + " quality_thresholds = {\n", + " \"accuracy\": 7,\n", + " \"clarity\": 7,\n", + " \"completeness\": 7,\n", + " \"conciseness\": 7\n", + " }\n", + " \n", + " # Extract text from the PDF file\n", + " text = extract_text_from_pdf(pdf_path)\n", + " \n", + " # Create chunks from the extracted text\n", + " chunks = chunk_text(text, chunk_size, chunk_overlap)\n", + " \n", + " # Initialize a list to store all propositions\n", + " all_propositions = []\n", + " \n", + " print(\"Generating propositions from chunks...\")\n", + " for i, chunk in enumerate(chunks):\n", + " print(f\"Processing chunk {i+1}/{len(chunks)}...\")\n", + " \n", + " # Generate propositions for the current chunk\n", + " chunk_propositions = generate_propositions(chunk)\n", + " print(f\"Generated {len(chunk_propositions)} propositions\")\n", + " \n", + " # Process each generated proposition\n", + " for prop in chunk_propositions:\n", + " proposition_data = {\n", + " \"text\": prop,\n", + " \"source_chunk_id\": chunk[\"chunk_id\"],\n", + " \"source_text\": chunk[\"text\"]\n", + " }\n", + " all_propositions.append(proposition_data)\n", + " \n", + " # Evaluate the quality of the generated propositions\n", + " print(\"\\nEvaluating proposition quality...\")\n", + " quality_propositions = []\n", + " \n", + " for i, prop in enumerate(all_propositions):\n", + " if i % 10 == 0: # Status update every 10 propositions\n", + " print(f\"Evaluating proposition {i+1}/{len(all_propositions)}...\")\n", + " \n", + " # Evaluate the quality of the current proposition\n", + " scores = evaluate_proposition(prop[\"text\"], prop[\"source_text\"])\n", + " prop[\"quality_scores\"] = scores\n", + " \n", + " # Check if the proposition passes the quality thresholds\n", + " passes_quality = True\n", + " for metric, threshold in quality_thresholds.items():\n", + " if scores.get(metric, 0) < threshold:\n", + " passes_quality = False\n", + " break\n", + " \n", + " if passes_quality:\n", + " quality_propositions.append(prop)\n", + " else:\n", + " print(f\"Proposition failed quality check: {prop['text'][:50]}...\")\n", + " \n", + " print(f\"\\nRetained {len(quality_propositions)}/{len(all_propositions)} propositions after quality filtering\")\n", + " \n", + " return chunks, quality_propositions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Building Vector Stores for Both Approaches" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def build_vector_stores(chunks, propositions):\n", + " \"\"\"\n", + " Build vector stores for both chunk-based and proposition-based approaches.\n", + " \n", + " Args:\n", + " chunks (List[Dict]): Original document chunks\n", + " propositions (List[Dict]): Quality-filtered propositions\n", + " \n", + " Returns:\n", + " Tuple[SimpleVectorStore, SimpleVectorStore]: Chunk and proposition vector stores\n", + " \"\"\"\n", + " # Create vector store for chunks\n", + " chunk_store = SimpleVectorStore()\n", + " \n", + " # Extract chunk texts and create embeddings\n", + " chunk_texts = [chunk[\"text\"] for chunk in chunks]\n", + " print(f\"Creating embeddings for {len(chunk_texts)} chunks...\")\n", + " chunk_embeddings = create_embeddings(chunk_texts)\n", + " \n", + " # Add chunks to vector store with metadata\n", + " chunk_metadata = [{\"chunk_id\": chunk[\"chunk_id\"], \"type\": \"chunk\"} for chunk in chunks]\n", + " chunk_store.add_items(chunk_texts, chunk_embeddings, chunk_metadata)\n", + " \n", + " # Create vector store for propositions\n", + " prop_store = SimpleVectorStore()\n", + " \n", + " # Extract proposition texts and create embeddings\n", + " prop_texts = [prop[\"text\"] for prop in propositions]\n", + " print(f\"Creating embeddings for {len(prop_texts)} propositions...\")\n", + " prop_embeddings = create_embeddings(prop_texts)\n", + " \n", + " # Add propositions to vector store with metadata\n", + " prop_metadata = [\n", + " {\n", + " \"type\": \"proposition\", \n", + " \"source_chunk_id\": prop[\"source_chunk_id\"],\n", + " \"quality_scores\": prop[\"quality_scores\"]\n", + " } \n", + " for prop in propositions\n", + " ]\n", + " prop_store.add_items(prop_texts, prop_embeddings, prop_metadata)\n", + " \n", + " return chunk_store, prop_store" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Query and Retrieval Functions" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def retrieve_from_store(query, vector_store, k=5):\n", + " \"\"\"\n", + " Retrieve relevant items from a vector store based on query.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " vector_store (SimpleVectorStore): Vector store to search\n", + " k (int): Number of results to retrieve\n", + " \n", + " Returns:\n", + " List[Dict]: Retrieved items with scores and metadata\n", + " \"\"\"\n", + " # Create query embedding\n", + " query_embedding = create_embeddings(query)\n", + " \n", + " # Search vector store for the top k most similar items\n", + " results = vector_store.similarity_search(query_embedding, k=k)\n", + " \n", + " return results" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def compare_retrieval_approaches(query, chunk_store, prop_store, k=5):\n", + " \"\"\"\n", + " Compare chunk-based and proposition-based retrieval for a query.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " chunk_store (SimpleVectorStore): Chunk-based vector store\n", + " prop_store (SimpleVectorStore): Proposition-based vector store\n", + " k (int): Number of results to retrieve from each store\n", + " \n", + " Returns:\n", + " Dict: Comparison results\n", + " \"\"\"\n", + " print(f\"\\n=== Query: {query} ===\")\n", + " \n", + " # Retrieve results from the proposition-based vector store\n", + " print(\"\\nRetrieving with proposition-based approach...\")\n", + " prop_results = retrieve_from_store(query, prop_store, k)\n", + " \n", + " # Retrieve results from the chunk-based vector store\n", + " print(\"Retrieving with chunk-based approach...\")\n", + " chunk_results = retrieve_from_store(query, chunk_store, k)\n", + " \n", + " # Display proposition-based results\n", + " print(\"\\n=== Proposition-Based Results ===\")\n", + " for i, result in enumerate(prop_results):\n", + " print(f\"{i+1}) {result['text']} (Score: {result['similarity']:.4f})\")\n", + " \n", + " # Display chunk-based results\n", + " print(\"\\n=== Chunk-Based Results ===\")\n", + " for i, result in enumerate(chunk_results):\n", + " # Truncate text to keep the output manageable\n", + " truncated_text = result['text'][:150] + \"...\" if len(result['text']) > 150 else result['text']\n", + " print(f\"{i+1}) {truncated_text} (Score: {result['similarity']:.4f})\")\n", + " \n", + " # Return the comparison results\n", + " return {\n", + " \"query\": query,\n", + " \"proposition_results\": prop_results,\n", + " \"chunk_results\": chunk_results\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Response Generation and Evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_response(query, results, result_type=\"proposition\"):\n", + " \"\"\"\n", + " Generate a response based on retrieved results.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " results (List[Dict]): Retrieved items\n", + " result_type (str): Type of results ('proposition' or 'chunk')\n", + " \n", + " Returns:\n", + " str: Generated response\n", + " \"\"\"\n", + " # Combine retrieved texts into a single context string\n", + " context = \"\\n\\n\".join([result[\"text\"] for result in results])\n", + " \n", + " # System prompt to instruct the AI on how to generate the response\n", + " system_prompt = f\"\"\"You are an AI assistant answering questions based on retrieved information.\n", + "Your answer should be based on the following {result_type}s that were retrieved from a knowledge base.\n", + "If the retrieved information doesn't answer the question, acknowledge this limitation.\"\"\"\n", + "\n", + " # User prompt containing the query and the retrieved context\n", + " user_prompt = f\"\"\"Query: {query}\n", + "\n", + "Retrieved {result_type}s:\n", + "{context}\n", + "\n", + "Please answer the query based on the retrieved information.\"\"\"\n", + "\n", + " # Generate the response using the OpenAI client\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0.2\n", + " )\n", + " \n", + " # Return the generated response text\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def evaluate_responses(query, prop_response, chunk_response, reference_answer=None):\n", + " \"\"\"\n", + " Evaluate and compare responses from both approaches.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " prop_response (str): Response from proposition-based approach\n", + " chunk_response (str): Response from chunk-based approach\n", + " reference_answer (str, optional): Reference answer for comparison\n", + " \n", + " Returns:\n", + " str: Evaluation analysis\n", + " \"\"\"\n", + " # System prompt to instruct the AI on how to evaluate the responses\n", + " system_prompt = \"\"\"You are an expert evaluator of information retrieval systems. \n", + " Compare the two responses to the same query, one generated from proposition-based retrieval \n", + " and the other from chunk-based retrieval.\n", + "\n", + " Evaluate them based on:\n", + " 1. Accuracy: Which response provides more factually correct information?\n", + " 2. Relevance: Which response better addresses the specific query?\n", + " 3. Conciseness: Which response is more concise while maintaining completeness?\n", + " 4. Clarity: Which response is easier to understand?\n", + "\n", + " Be specific about the strengths and weaknesses of each approach.\"\"\"\n", + "\n", + " # User prompt containing the query and the responses to be compared\n", + " user_prompt = f\"\"\"Query: {query}\n", + "\n", + " Response from Proposition-Based Retrieval:\n", + " {prop_response}\n", + "\n", + " Response from Chunk-Based Retrieval:\n", + " {chunk_response}\"\"\"\n", + "\n", + " # If a reference answer is provided, include it in the user prompt for factual checking\n", + " if reference_answer:\n", + " user_prompt += f\"\"\"\n", + "\n", + " Reference Answer (for factual checking):\n", + " {reference_answer}\"\"\"\n", + "\n", + " # Add the final instruction to the user prompt\n", + " user_prompt += \"\"\"\n", + " Please provide a detailed comparison of these two responses, highlighting which approach performed better and why.\"\"\"\n", + "\n", + " # Generate the evaluation analysis using the OpenAI client\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0\n", + " )\n", + " \n", + " # Return the generated evaluation analysis\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Complete End-to-End Evaluation Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "def run_proposition_chunking_evaluation(pdf_path, test_queries, reference_answers=None):\n", + " \"\"\"\n", + " Run a complete evaluation of proposition chunking vs standard chunking.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF file\n", + " test_queries (List[str]): List of test queries\n", + " reference_answers (List[str], optional): Reference answers for queries\n", + " \n", + " Returns:\n", + " Dict: Evaluation results\n", + " \"\"\"\n", + " print(\"=== Starting Proposition Chunking Evaluation ===\\n\")\n", + " \n", + " # Process document into propositions and chunks\n", + " chunks, propositions = process_document_into_propositions(pdf_path)\n", + " \n", + " # Build vector stores for chunks and propositions\n", + " chunk_store, prop_store = build_vector_stores(chunks, propositions)\n", + " \n", + " # Initialize a list to store results for each query\n", + " results = []\n", + " \n", + " # Run tests for each query\n", + " for i, query in enumerate(test_queries):\n", + " print(f\"\\n\\n=== Testing Query {i+1}/{len(test_queries)} ===\")\n", + " print(f\"Query: {query}\")\n", + " \n", + " # Get retrieval results from both chunk-based and proposition-based approaches\n", + " retrieval_results = compare_retrieval_approaches(query, chunk_store, prop_store)\n", + " \n", + " # Generate responses based on the retrieved proposition-based results\n", + " print(\"\\nGenerating response from proposition-based results...\")\n", + " prop_response = generate_response(\n", + " query, \n", + " retrieval_results[\"proposition_results\"], \n", + " \"proposition\"\n", + " )\n", + " \n", + " # Generate responses based on the retrieved chunk-based results\n", + " print(\"Generating response from chunk-based results...\")\n", + " chunk_response = generate_response(\n", + " query, \n", + " retrieval_results[\"chunk_results\"], \n", + " \"chunk\"\n", + " )\n", + " \n", + " # Get reference answer if available\n", + " reference = None\n", + " if reference_answers and i < len(reference_answers):\n", + " reference = reference_answers[i]\n", + " \n", + " # Evaluate the generated responses\n", + " print(\"\\nEvaluating responses...\")\n", + " evaluation = evaluate_responses(query, prop_response, chunk_response, reference)\n", + " \n", + " # Compile results for the current query\n", + " query_result = {\n", + " \"query\": query,\n", + " \"proposition_results\": retrieval_results[\"proposition_results\"],\n", + " \"chunk_results\": retrieval_results[\"chunk_results\"],\n", + " \"proposition_response\": prop_response,\n", + " \"chunk_response\": chunk_response,\n", + " \"reference_answer\": reference,\n", + " \"evaluation\": evaluation\n", + " }\n", + " \n", + " # Append the results to the overall results list\n", + " results.append(query_result)\n", + " \n", + " # Print the responses and evaluation for the current query\n", + " print(\"\\n=== Proposition-Based Response ===\")\n", + " print(prop_response)\n", + " \n", + " print(\"\\n=== Chunk-Based Response ===\")\n", + " print(chunk_response)\n", + " \n", + " print(\"\\n=== Evaluation ===\")\n", + " print(evaluation)\n", + " \n", + " # Generate overall analysis of the evaluation\n", + " print(\"\\n\\n=== Generating Overall Analysis ===\")\n", + " overall_analysis = generate_overall_analysis(results)\n", + " print(\"\\n\" + overall_analysis)\n", + " \n", + " # Return the evaluation results, overall analysis, and counts of propositions and chunks\n", + " return {\n", + " \"results\": results,\n", + " \"overall_analysis\": overall_analysis,\n", + " \"proposition_count\": len(propositions),\n", + " \"chunk_count\": len(chunks)\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_overall_analysis(results):\n", + " \"\"\"\n", + " Generate an overall analysis of proposition vs chunk approaches.\n", + " \n", + " Args:\n", + " results (List[Dict]): Results from each test query\n", + " \n", + " Returns:\n", + " str: Overall analysis\n", + " \"\"\"\n", + " # System prompt to instruct the AI on how to generate the overall analysis\n", + " system_prompt = \"\"\"You are an expert at evaluating information retrieval systems.\n", + " Based on multiple test queries, provide an overall analysis comparing proposition-based retrieval \n", + " to chunk-based retrieval for RAG (Retrieval-Augmented Generation) systems.\n", + "\n", + " Focus on:\n", + " 1. When proposition-based retrieval performs better\n", + " 2. When chunk-based retrieval performs better\n", + " 3. The overall strengths and weaknesses of each approach\n", + " 4. Recommendations for when to use each approach\"\"\"\n", + "\n", + " # Create a summary of evaluations for each query\n", + " evaluations_summary = \"\"\n", + " for i, result in enumerate(results):\n", + " evaluations_summary += f\"Query {i+1}: {result['query']}\\n\"\n", + " evaluations_summary += f\"Evaluation Summary: {result['evaluation'][:200]}...\\n\\n\"\n", + "\n", + " # User prompt containing the summary of evaluations\n", + " user_prompt = f\"\"\"Based on the following evaluations of proposition-based vs chunk-based retrieval across {len(results)} queries, \n", + " provide an overall analysis comparing these two approaches:\n", + "\n", + " {evaluations_summary}\n", + "\n", + " Please provide a comprehensive analysis on the relative strengths and weaknesses of proposition-based \n", + " and chunk-based retrieval for RAG systems.\"\"\"\n", + "\n", + " # Generate the overall analysis using the OpenAI client\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0\n", + " )\n", + " \n", + " # Return the generated analysis text\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluation of Proposition Chunking" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Path to the AI information document that will be processed\n", + "pdf_path = \"data/AI_Information.pdf\"\n", + "\n", + "# Define test queries covering different aspects of AI to evaluate proposition chunking\n", + "test_queries = [\n", + " \"What are the main ethical concerns in AI development?\",\n", + " # \"How does explainable AI improve trust in AI systems?\",\n", + " # \"What are the key challenges in developing fair AI systems?\",\n", + " # \"What role does human oversight play in AI safety?\"\n", + "]\n", + "\n", + "# Reference answers for more thorough evaluation and comparison of results\n", + "# These provide a ground truth to measure the quality of generated responses\n", + "reference_answers = [\n", + " \"The main ethical concerns in AI development include bias and fairness, privacy, transparency, accountability, safety, and the potential for misuse or harmful applications.\",\n", + " # \"Explainable AI improves trust by making AI decision-making processes transparent and understandable to users, helping them verify fairness, identify potential biases, and better understand AI limitations.\",\n", + " # \"Key challenges in developing fair AI systems include addressing data bias, ensuring diverse representation in training data, creating transparent algorithms, defining fairness across different contexts, and balancing competing fairness criteria.\",\n", + " # \"Human oversight plays a critical role in AI safety by monitoring system behavior, verifying outputs, intervening when necessary, setting ethical boundaries, and ensuring AI systems remain aligned with human values and intentions throughout their operation.\"\n", + "]\n", + "\n", + "# Run the evaluation\n", + "evaluation_results = run_proposition_chunking_evaluation(\n", + " pdf_path=pdf_path,\n", + " test_queries=test_queries,\n", + " reference_answers=reference_answers\n", + ")\n", + "\n", + "# Print the overall analysis\n", + "print(\"\\n\\n=== Overall Analysis ===\")\n", + "print(evaluation_results[\"overall_analysis\"])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv-new-specific-rag", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From b69c7851b605d6c4b70d1f4855ea6d67eae0b17d Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Sun, 9 Mar 2025 17:12:31 +0500 Subject: [PATCH 05/32] MultiModel rag --- 15_multimodel_rag.ipynb | 1075 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 1075 insertions(+) create mode 100644 15_multimodel_rag.ipynb diff --git a/15_multimodel_rag.ipynb b/15_multimodel_rag.ipynb new file mode 100644 index 0000000..71a1e98 --- /dev/null +++ b/15_multimodel_rag.ipynb @@ -0,0 +1,1075 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "vscode": { + "languageId": "markdown" + } + }, + "source": [ + "# Multi-Modal RAG with Image Captioning\n", + "\n", + "In this notebook, I implement a Multi-Modal RAG system that extracts both text and images from documents, generates captions for images, and uses both content types to respond to queries. This approach enhances traditional RAG by incorporating visual information into the knowledge base.\n", + "\n", + "Traditional RAG systems only work with text, but many documents contain crucial information in images, charts, and tables. By captioning these visual elements and incorporating them into our retrieval system, we can:\n", + "\n", + "- Access information locked in figures and diagrams\n", + "- Understand tables and charts that complement the text\n", + "- Create a more comprehensive knowledge base\n", + "- Answer questions that rely on visual data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting Up the Environment\n", + "We begin by importing necessary libraries." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import io\n", + "import numpy as np\n", + "import json\n", + "import fitz\n", + "from PIL import Image\n", + "from openai import OpenAI\n", + "import base64\n", + "import re\n", + "import tempfile\n", + "import shutil" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting Up the OpenAI API Client\n", + "We initialize the OpenAI client to generate embeddings and responses." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize the OpenAI client with the base URL and API key\n", + "client = OpenAI(\n", + " base_url=\"https://api.studio.nebius.com/v1/\",\n", + " api_key=os.getenv(\"OPENAI_API_KEY\") # Retrieve the API key from environment variables\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Document Processing Functions" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def extract_content_from_pdf(pdf_path, output_dir=None):\n", + " \"\"\"\n", + " Extract both text and images from a PDF file.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF file\n", + " output_dir (str, optional): Directory to save extracted images\n", + " \n", + " Returns:\n", + " Tuple[List[Dict], List[Dict]]: Text data and image data\n", + " \"\"\"\n", + " # Create a temporary directory for images if not provided\n", + " temp_dir = None\n", + " if output_dir is None:\n", + " temp_dir = tempfile.mkdtemp()\n", + " output_dir = temp_dir\n", + " else:\n", + " os.makedirs(output_dir, exist_ok=True)\n", + " \n", + " text_data = [] # List to store extracted text data\n", + " image_paths = [] # List to store paths of extracted images\n", + " \n", + " print(f\"Extracting content from {pdf_path}...\")\n", + " \n", + " try:\n", + " with fitz.open(pdf_path) as pdf_file:\n", + " # Loop through every page in the PDF\n", + " for page_number in range(len(pdf_file)):\n", + " page = pdf_file[page_number]\n", + " \n", + " # Extract text from the page\n", + " text = page.get_text().strip()\n", + " if text:\n", + " text_data.append({\n", + " \"content\": text,\n", + " \"metadata\": {\n", + " \"source\": pdf_path,\n", + " \"page\": page_number + 1,\n", + " \"type\": \"text\"\n", + " }\n", + " })\n", + " \n", + " # Extract images from the page\n", + " image_list = page.get_images(full=True)\n", + " for img_index, img in enumerate(image_list):\n", + " xref = img[0] # XREF of the image\n", + " base_image = pdf_file.extract_image(xref)\n", + " \n", + " if base_image:\n", + " image_bytes = base_image[\"image\"]\n", + " image_ext = base_image[\"ext\"]\n", + " \n", + " # Save the image to the output directory\n", + " img_filename = f\"page_{page_number+1}_img_{img_index+1}.{image_ext}\"\n", + " img_path = os.path.join(output_dir, img_filename)\n", + " \n", + " with open(img_path, \"wb\") as img_file:\n", + " img_file.write(image_bytes)\n", + " \n", + " image_paths.append({\n", + " \"path\": img_path,\n", + " \"metadata\": {\n", + " \"source\": pdf_path,\n", + " \"page\": page_number + 1,\n", + " \"image_index\": img_index + 1,\n", + " \"type\": \"image\"\n", + " }\n", + " })\n", + " \n", + " print(f\"Extracted {len(text_data)} text segments and {len(image_paths)} images\")\n", + " return text_data, image_paths\n", + " \n", + " except Exception as e:\n", + " print(f\"Error extracting content: {e}\")\n", + " if temp_dir and os.path.exists(temp_dir):\n", + " shutil.rmtree(temp_dir)\n", + " raise" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Chunking Text Content" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def chunk_text(text_data, chunk_size=1000, overlap=200):\n", + " \"\"\"\n", + " Split text data into overlapping chunks.\n", + " \n", + " Args:\n", + " text_data (List[Dict]): Text data extracted from PDF\n", + " chunk_size (int): Size of each chunk in characters\n", + " overlap (int): Overlap between chunks in characters\n", + " \n", + " Returns:\n", + " List[Dict]: Chunked text data\n", + " \"\"\"\n", + " chunked_data = [] # Initialize an empty list to store chunked data\n", + " \n", + " for item in text_data:\n", + " text = item[\"content\"] # Extract the text content\n", + " metadata = item[\"metadata\"] # Extract the metadata\n", + " \n", + " # Skip if text is too short\n", + " if len(text) < chunk_size / 2:\n", + " chunked_data.append({\n", + " \"content\": text,\n", + " \"metadata\": metadata\n", + " })\n", + " continue\n", + " \n", + " # Create chunks with overlap\n", + " chunks = []\n", + " for i in range(0, len(text), chunk_size - overlap):\n", + " chunk = text[i:i + chunk_size] # Extract a chunk of the specified size\n", + " if chunk: # Ensure we don't add empty chunks\n", + " chunks.append(chunk)\n", + " \n", + " # Add each chunk with updated metadata\n", + " for i, chunk in enumerate(chunks):\n", + " chunk_metadata = metadata.copy() # Copy the original metadata\n", + " chunk_metadata[\"chunk_index\"] = i # Add chunk index to metadata\n", + " chunk_metadata[\"chunk_count\"] = len(chunks) # Add total chunk count to metadata\n", + " \n", + " chunked_data.append({\n", + " \"content\": chunk, # The chunk text\n", + " \"metadata\": chunk_metadata # The updated metadata\n", + " })\n", + " \n", + " print(f\"Created {len(chunked_data)} text chunks\") # Print the number of created chunks\n", + " return chunked_data # Return the list of chunked data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Image Captioning with OpenAI Vision" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def encode_image(image_path):\n", + " \"\"\"\n", + " Encode an image file as base64.\n", + " \n", + " Args:\n", + " image_path (str): Path to the image file\n", + " \n", + " Returns:\n", + " str: Base64 encoded image\n", + " \"\"\"\n", + " # Open the image file in binary read mode\n", + " with open(image_path, \"rb\") as image_file:\n", + " # Read the image file and encode it to base64\n", + " encoded_image = base64.b64encode(image_file.read())\n", + " # Decode the base64 bytes to a string and return\n", + " return encoded_image.decode('utf-8')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_image_caption(image_path):\n", + " \"\"\"\n", + " Generate a caption for an image using OpenAI's vision capabilities.\n", + " \n", + " Args:\n", + " image_path (str): Path to the image file\n", + " \n", + " Returns:\n", + " str: Generated caption\n", + " \"\"\"\n", + " # Check if the file exists and is an image\n", + " if not os.path.exists(image_path):\n", + " return \"Error: Image file not found\"\n", + " \n", + " try:\n", + " # Open and validate the image\n", + " Image.open(image_path)\n", + " \n", + " # Encode the image to base64\n", + " base64_image = encode_image(image_path)\n", + " \n", + " # Create the API request to generate the caption\n", + " response = client.chat.completions.create(\n", + " model=\"llava-hf/llava-1.5-7b-hf\", # Use the llava-1.5-7b model\n", + " messages=[\n", + " {\n", + " \"role\": \"system\",\n", + " \"content\": \"You are an assistant specialized in describing images from academic papers. \"\n", + " \"Provide detailed captions for the image that capture key information. \"\n", + " \"If the image contains charts, tables, or diagrams, describe their content and purpose clearly. \"\n", + " \"Your caption should be optimized for future retrieval when people ask questions about this content.\"\n", + " },\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": [\n", + " {\"type\": \"text\", \"text\": \"Describe this image in detail, focusing on its academic content:\"},\n", + " {\n", + " \"type\": \"image_url\",\n", + " \"image_url\": {\n", + " \"url\": f\"data:image/jpeg;base64,{base64_image}\"\n", + " }\n", + " }\n", + " ]\n", + " }\n", + " ],\n", + " max_tokens=300\n", + " )\n", + " \n", + " # Extract the caption from the response\n", + " caption = response.choices[0].message.content\n", + " return caption\n", + " \n", + " except Exception as e:\n", + " # Return an error message if an exception occurs\n", + " return f\"Error generating caption: {str(e)}\"" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def process_images(image_paths):\n", + " \"\"\"\n", + " Process all images and generate captions.\n", + " \n", + " Args:\n", + " image_paths (List[Dict]): Paths to extracted images\n", + " \n", + " Returns:\n", + " List[Dict]: Image data with captions\n", + " \"\"\"\n", + " image_data = [] # Initialize an empty list to store image data with captions\n", + " \n", + " print(f\"Generating captions for {len(image_paths)} images...\") # Print the number of images to process\n", + " for i, img_item in enumerate(image_paths):\n", + " print(f\"Processing image {i+1}/{len(image_paths)}...\") # Print the current image being processed\n", + " img_path = img_item[\"path\"] # Get the image path\n", + " metadata = img_item[\"metadata\"] # Get the image metadata\n", + " \n", + " # Generate caption for the image\n", + " caption = generate_image_caption(img_path)\n", + " \n", + " # Add the image data with caption to the list\n", + " image_data.append({\n", + " \"content\": caption, # The generated caption\n", + " \"metadata\": metadata, # The image metadata\n", + " \"image_path\": img_path # The path to the image\n", + " })\n", + " \n", + " return image_data # Return the list of image data with captions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Simple Vector Store Implementation" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "class MultiModalVectorStore:\n", + " \"\"\"\n", + " A simple vector store implementation for multi-modal content.\n", + " \"\"\"\n", + " def __init__(self):\n", + " # Initialize lists to store vectors, contents, and metadata\n", + " self.vectors = []\n", + " self.contents = []\n", + " self.metadata = []\n", + " \n", + " def add_item(self, content, embedding, metadata=None):\n", + " \"\"\"\n", + " Add an item to the vector store.\n", + " \n", + " Args:\n", + " content (str): The content (text or image caption)\n", + " embedding (List[float]): The embedding vector\n", + " metadata (Dict, optional): Additional metadata\n", + " \"\"\"\n", + " # Append the embedding vector, content, and metadata to their respective lists\n", + " self.vectors.append(np.array(embedding))\n", + " self.contents.append(content)\n", + " self.metadata.append(metadata or {})\n", + " \n", + " def add_items(self, items, embeddings):\n", + " \"\"\"\n", + " Add multiple items to the vector store.\n", + " \n", + " Args:\n", + " items (List[Dict]): List of content items\n", + " embeddings (List[List[float]]): List of embedding vectors\n", + " \"\"\"\n", + " # Loop through items and embeddings and add each to the vector store\n", + " for item, embedding in zip(items, embeddings):\n", + " self.add_item(\n", + " content=item[\"content\"],\n", + " embedding=embedding,\n", + " metadata=item.get(\"metadata\", {})\n", + " )\n", + " \n", + " def similarity_search(self, query_embedding, k=5):\n", + " \"\"\"\n", + " Find the most similar items to a query embedding.\n", + " \n", + " Args:\n", + " query_embedding (List[float]): Query embedding vector\n", + " k (int): Number of results to return\n", + " \n", + " Returns:\n", + " List[Dict]: Top k most similar items\n", + " \"\"\"\n", + " # Return an empty list if there are no vectors in the store\n", + " if not self.vectors:\n", + " return []\n", + " \n", + " # Convert query embedding to numpy array\n", + " query_vector = np.array(query_embedding)\n", + " \n", + " # Calculate similarities using cosine similarity\n", + " similarities = []\n", + " for i, vector in enumerate(self.vectors):\n", + " similarity = np.dot(query_vector, vector) / (np.linalg.norm(query_vector) * np.linalg.norm(vector))\n", + " similarities.append((i, similarity))\n", + " \n", + " # Sort by similarity (descending)\n", + " similarities.sort(key=lambda x: x[1], reverse=True)\n", + " \n", + " # Return top k results\n", + " results = []\n", + " for i in range(min(k, len(similarities))):\n", + " idx, score = similarities[i]\n", + " results.append({\n", + " \"content\": self.contents[idx],\n", + " \"metadata\": self.metadata[idx],\n", + " \"similarity\": float(score) # Convert to float for JSON serialization\n", + " })\n", + " \n", + " return results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating Embeddings" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def create_embeddings(texts, model=\"BAAI/bge-en-icl\"):\n", + " \"\"\"\n", + " Create embeddings for the given texts.\n", + " \n", + " Args:\n", + " texts (List[str]): Input texts\n", + " model (str): Embedding model name\n", + " \n", + " Returns:\n", + " List[List[float]]: Embedding vectors\n", + " \"\"\"\n", + " # Handle empty input\n", + " if not texts:\n", + " return []\n", + " \n", + " # Process in batches if needed (OpenAI API limits)\n", + " batch_size = 100\n", + " all_embeddings = []\n", + " \n", + " # Iterate over the input texts in batches\n", + " for i in range(0, len(texts), batch_size):\n", + " batch = texts[i:i + batch_size] # Get the current batch of texts\n", + " \n", + " # Create embeddings for the current batch\n", + " response = client.embeddings.create(\n", + " model=model,\n", + " input=batch\n", + " )\n", + " \n", + " # Extract embeddings from the response\n", + " batch_embeddings = [item.embedding for item in response.data]\n", + " all_embeddings.extend(batch_embeddings) # Add the batch embeddings to the list\n", + " \n", + " return all_embeddings # Return all embeddings" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Complete Processing Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def process_document(pdf_path, chunk_size=1000, chunk_overlap=200):\n", + " \"\"\"\n", + " Process a document for multi-modal RAG.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF file\n", + " chunk_size (int): Size of each chunk in characters\n", + " chunk_overlap (int): Overlap between chunks in characters\n", + " \n", + " Returns:\n", + " Tuple[MultiModalVectorStore, Dict]: Vector store and document info\n", + " \"\"\"\n", + " # Create a directory for extracted images\n", + " image_dir = \"extracted_images\"\n", + " os.makedirs(image_dir, exist_ok=True)\n", + " \n", + " # Extract text and images from the PDF\n", + " text_data, image_paths = extract_content_from_pdf(pdf_path, image_dir)\n", + " \n", + " # Chunk the extracted text\n", + " chunked_text = chunk_text(text_data, chunk_size, chunk_overlap)\n", + " \n", + " # Process the extracted images to generate captions\n", + " image_data = process_images(image_paths)\n", + " \n", + " # Combine all content items (text chunks and image captions)\n", + " all_items = chunked_text + image_data\n", + " \n", + " # Extract content for embedding\n", + " contents = [item[\"content\"] for item in all_items]\n", + " \n", + " # Create embeddings for all content\n", + " print(\"Creating embeddings for all content...\")\n", + " embeddings = create_embeddings(contents)\n", + " \n", + " # Build the vector store and add items with their embeddings\n", + " vector_store = MultiModalVectorStore()\n", + " vector_store.add_items(all_items, embeddings)\n", + " \n", + " # Prepare document info with counts of text chunks and image captions\n", + " doc_info = {\n", + " \"text_count\": len(chunked_text),\n", + " \"image_count\": len(image_data),\n", + " \"total_items\": len(all_items),\n", + " }\n", + " \n", + " # Print summary of added items\n", + " print(f\"Added {len(all_items)} items to vector store ({len(chunked_text)} text chunks, {len(image_data)} image captions)\")\n", + " \n", + " # Return the vector store and document info\n", + " return vector_store, doc_info" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Query Processing and Response Generation" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def query_multimodal_rag(query, vector_store, k=5):\n", + " \"\"\"\n", + " Query the multi-modal RAG system.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " vector_store (MultiModalVectorStore): Vector store with document content\n", + " k (int): Number of results to retrieve\n", + " \n", + " Returns:\n", + " Dict: Query results and generated response\n", + " \"\"\"\n", + " print(f\"\\n=== Processing query: {query} ===\\n\")\n", + " \n", + " # Generate embedding for the query\n", + " query_embedding = create_embeddings(query)\n", + " \n", + " # Retrieve relevant content from the vector store\n", + " results = vector_store.similarity_search(query_embedding, k=k)\n", + " \n", + " # Separate text and image results\n", + " text_results = [r for r in results if r[\"metadata\"].get(\"type\") == \"text\"]\n", + " image_results = [r for r in results if r[\"metadata\"].get(\"type\") == \"image\"]\n", + " \n", + " print(f\"Retrieved {len(results)} relevant items ({len(text_results)} text, {len(image_results)} image captions)\")\n", + " \n", + " # Generate a response using the retrieved content\n", + " response = generate_response(query, results)\n", + " \n", + " return {\n", + " \"query\": query,\n", + " \"results\": results,\n", + " \"response\": response,\n", + " \"text_results_count\": len(text_results),\n", + " \"image_results_count\": len(image_results)\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "def generate_response(query, results):\n", + " \"\"\"\n", + " Generate a response based on the query and retrieved results.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " results (List[Dict]): Retrieved content\n", + " \n", + " Returns:\n", + " str: Generated response\n", + " \"\"\"\n", + " # Format the context from the retrieved results\n", + " context = \"\"\n", + " \n", + " for i, result in enumerate(results):\n", + " # Determine the type of content (text or image caption)\n", + " content_type = \"Text\" if result[\"metadata\"].get(\"type\") == \"text\" else \"Image caption\"\n", + " # Get the page number from the metadata\n", + " page_num = result[\"metadata\"].get(\"page\", \"unknown\")\n", + " \n", + " # Append the content type and page number to the context\n", + " context += f\"[{content_type} from page {page_num}]\\n\"\n", + " # Append the actual content to the context\n", + " context += result[\"content\"]\n", + " context += \"\\n\\n\"\n", + " \n", + " # System message to guide the AI assistant\n", + " system_message = \"\"\"You are an AI assistant specializing in answering questions about documents \n", + " that contain both text and images. You have been given relevant text passages and image captions \n", + " from the document. Use this information to provide a comprehensive, accurate response to the query.\n", + " If information comes from an image or chart, mention this in your answer.\n", + " If the retrieved information doesn't fully answer the query, acknowledge the limitations.\"\"\"\n", + "\n", + " # User message containing the query and the formatted context\n", + " user_message = f\"\"\"Query: {query}\n", + "\n", + " Retrieved content:\n", + " {context}\n", + "\n", + " Please answer the query based on the retrieved content.\n", + " \"\"\"\n", + " \n", + " # Generate the response using the OpenAI API\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_message},\n", + " {\"role\": \"user\", \"content\": user_message}\n", + " ],\n", + " temperature=0.1\n", + " )\n", + " \n", + " # Return the generated response\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluation Against Text-Only RAG" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def build_text_only_store(pdf_path, chunk_size=1000, chunk_overlap=200):\n", + " \"\"\"\n", + " Build a text-only vector store for comparison.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF file\n", + " chunk_size (int): Size of each chunk in characters\n", + " chunk_overlap (int): Overlap between chunks in characters\n", + " \n", + " Returns:\n", + " MultiModalVectorStore: Text-only vector store\n", + " \"\"\"\n", + " # Extract text from PDF (reuse function but ignore images)\n", + " text_data, _ = extract_content_from_pdf(pdf_path, None)\n", + " \n", + " # Chunk text\n", + " chunked_text = chunk_text(text_data, chunk_size, chunk_overlap)\n", + " \n", + " # Extract content for embedding\n", + " contents = [item[\"content\"] for item in chunked_text]\n", + " \n", + " # Create embeddings\n", + " print(\"Creating embeddings for text-only content...\")\n", + " embeddings = create_embeddings(contents)\n", + " \n", + " # Build vector store\n", + " vector_store = MultiModalVectorStore()\n", + " vector_store.add_items(chunked_text, embeddings)\n", + " \n", + " print(f\"Added {len(chunked_text)} text items to text-only vector store\")\n", + " return vector_store" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def evaluate_multimodal_vs_textonly(pdf_path, test_queries, reference_answers=None):\n", + " \"\"\"\n", + " Compare multi-modal RAG with text-only RAG.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF file\n", + " test_queries (List[str]): Test queries\n", + " reference_answers (List[str], optional): Reference answers\n", + " \n", + " Returns:\n", + " Dict: Evaluation results\n", + " \"\"\"\n", + " print(\"=== EVALUATING MULTI-MODAL RAG VS TEXT-ONLY RAG ===\\n\")\n", + " \n", + " # Process document for multi-modal RAG\n", + " print(\"\\nProcessing document for multi-modal RAG...\")\n", + " mm_vector_store, mm_doc_info = process_document(pdf_path)\n", + " \n", + " # Build text-only store\n", + " print(\"\\nProcessing document for text-only RAG...\")\n", + " text_vector_store = build_text_only_store(pdf_path)\n", + " \n", + " # Run evaluation for each query\n", + " results = []\n", + " \n", + " for i, query in enumerate(test_queries):\n", + " print(f\"\\n\\n=== Evaluating Query {i+1}: {query} ===\")\n", + " \n", + " # Get reference answer if available\n", + " reference = None\n", + " if reference_answers and i < len(reference_answers):\n", + " reference = reference_answers[i]\n", + " \n", + " # Run multi-modal RAG\n", + " print(\"\\nRunning multi-modal RAG...\")\n", + " mm_result = query_multimodal_rag(query, mm_vector_store)\n", + " \n", + " # Run text-only RAG\n", + " print(\"\\nRunning text-only RAG...\")\n", + " text_result = query_multimodal_rag(query, text_vector_store)\n", + " \n", + " # Compare responses\n", + " comparison = compare_responses(query, mm_result[\"response\"], text_result[\"response\"], reference)\n", + " \n", + " # Add to results\n", + " results.append({\n", + " \"query\": query,\n", + " \"multimodal_response\": mm_result[\"response\"],\n", + " \"textonly_response\": text_result[\"response\"],\n", + " \"multimodal_results\": {\n", + " \"text_count\": mm_result[\"text_results_count\"],\n", + " \"image_count\": mm_result[\"image_results_count\"]\n", + " },\n", + " \"reference_answer\": reference,\n", + " \"comparison\": comparison\n", + " })\n", + " \n", + " # Generate overall analysis\n", + " overall_analysis = generate_overall_analysis(results)\n", + " \n", + " return {\n", + " \"results\": results,\n", + " \"overall_analysis\": overall_analysis,\n", + " \"multimodal_doc_info\": mm_doc_info\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "def compare_responses(query, mm_response, text_response, reference=None):\n", + " \"\"\"\n", + " Compare multi-modal and text-only responses.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " mm_response (str): Multi-modal response\n", + " text_response (str): Text-only response\n", + " reference (str, optional): Reference answer\n", + " \n", + " Returns:\n", + " str: Comparison analysis\n", + " \"\"\"\n", + " # System prompt for the evaluator\n", + " system_prompt = \"\"\"You are an expert evaluator comparing two RAG systems:\n", + " 1. Multi-modal RAG: Retrieves from both text and image captions\n", + " 2. Text-only RAG: Retrieves only from text\n", + "\n", + " Evaluate which response better answers the query based on:\n", + " - Accuracy and correctness\n", + " - Completeness of information\n", + " - Relevance to the query\n", + " - Unique information from visual elements (for multi-modal)\"\"\"\n", + "\n", + " # User prompt with query and responses\n", + " user_prompt = f\"\"\"Query: {query}\n", + "\n", + " Multi-modal RAG Response:\n", + " {mm_response}\n", + "\n", + " Text-only RAG Response:\n", + " {text_response}\n", + " \"\"\"\n", + "\n", + " if reference:\n", + " user_prompt += f\"\"\"\n", + " Reference Answer:\n", + " {reference}\n", + " \"\"\"\n", + "\n", + " user_prompt += \"\"\"\n", + " Compare these responses and explain which one better answers the query and why.\n", + " Note any specific information that came from images in the multi-modal response.\n", + " \"\"\"\n", + "\n", + " # Generate comparison using meta-llama/Llama-3.2-3B-Instruct\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0\n", + " )\n", + " \n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_overall_analysis(results):\n", + " \"\"\"\n", + " Generate an overall analysis of multi-modal vs text-only RAG.\n", + " \n", + " Args:\n", + " results (List[Dict]): Evaluation results for each query\n", + " \n", + " Returns:\n", + " str: Overall analysis\n", + " \"\"\"\n", + " # System prompt for the evaluator\n", + " system_prompt = \"\"\"You are an expert evaluator of RAG systems. Provide an overall analysis comparing \n", + " multi-modal RAG (text + images) versus text-only RAG based on multiple test queries.\n", + "\n", + " Focus on:\n", + " 1. Types of queries where multi-modal RAG outperforms text-only\n", + " 2. Specific advantages of incorporating image information\n", + " 3. Any disadvantages or limitations of the multi-modal approach\n", + " 4. Overall recommendation on when to use each approach\"\"\"\n", + "\n", + " # Create summary of evaluations\n", + " evaluations_summary = \"\"\n", + " for i, result in enumerate(results):\n", + " evaluations_summary += f\"Query {i+1}: {result['query']}\\n\"\n", + " evaluations_summary += f\"Multi-modal retrieved {result['multimodal_results']['text_count']} text chunks and {result['multimodal_results']['image_count']} image captions\\n\"\n", + " evaluations_summary += f\"Comparison summary: {result['comparison'][:200]}...\\n\\n\"\n", + "\n", + " # User prompt with evaluations summary\n", + " user_prompt = f\"\"\"Based on the following evaluations of multi-modal vs text-only RAG across {len(results)} queries, \n", + " provide an overall analysis comparing these two approaches:\n", + "\n", + " {evaluations_summary}\n", + "\n", + " Please provide a comprehensive analysis of the relative strengths and weaknesses of multi-modal RAG \n", + " compared to text-only RAG, with specific attention to how image information contributed (or didn't contribute) to response quality.\"\"\"\n", + "\n", + " # Generate overall analysis using meta-llama/Llama-3.2-3B-Instruct\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0\n", + " )\n", + " \n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluation on Multi-Modal RAG vs Text-Only RAG" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "=== EVALUATING MULTI-MODAL RAG VS TEXT-ONLY RAG ===\n", + "\n", + "\n", + "Processing document for multi-modal RAG...\n", + "Extracting content from data/attention_is_all_you_need.pdf...\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Extracted 15 text segments and 3 images\n", + "Created 59 text chunks\n", + "Generating captions for 3 images...\n", + "Processing image 1/3...\n", + "Processing image 2/3...\n", + "Processing image 3/3...\n", + "Creating embeddings for all content...\n", + "Added 62 items to vector store (59 text chunks, 3 image captions)\n", + "\n", + "Processing document for text-only RAG...\n", + "Extracting content from data/attention_is_all_you_need.pdf...\n", + "Extracted 15 text segments and 3 images\n", + "Created 59 text chunks\n", + "Creating embeddings for text-only content...\n", + "Added 59 text items to text-only vector store\n", + "\n", + "\n", + "=== Evaluating Query 1: What is the BLEU score of the Transformer (base model)? ===\n", + "\n", + "Running multi-modal RAG...\n", + "\n", + "=== Processing query: What is the BLEU score of the Transformer (base model)? ===\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\faree\\AppData\\Local\\Temp\\ipykernel_14692\\2117883450.py:75: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n", + " \"similarity\": float(score) # Convert to float for JSON serialization\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Retrieved 5 relevant items (5 text, 0 image captions)\n", + "\n", + "Running text-only RAG...\n", + "\n", + "=== Processing query: What is the BLEU score of the Transformer (base model)? ===\n", + "\n", + "Retrieved 5 relevant items (5 text, 0 image captions)\n", + "\n", + "=== OVERALL ANALYSIS ===\n", + "\n", + "**Overall Analysis: Multi-Modal RAG vs Text-Only RAG**\n", + "\n", + "Our analysis compares the performance of multi-modal RAG (text + images) and text-only RAG across multiple test queries. We evaluate the strengths and weaknesses of each approach, focusing on the types of queries where multi-modal RAG outperforms text-only, the advantages of incorporating image information, and the limitations of the multi-modal approach.\n", + "\n", + "**Advantages of Multi-Modal RAG**\n", + "\n", + "1. **Improved Contextual Understanding**: Multi-modal RAG can leverage both text and image information to better understand the context of a query. This can lead to more accurate and informative responses, especially when the query requires a deeper understanding of the topic.\n", + "2. **Enhanced Visual Cues**: Images can provide visual cues that can help disambiguate ambiguous queries or provide additional context that is not explicitly stated in the text. For example, in Query 1, the image of the Transformer model could provide visual confirmation of the query, which was not present in the text-only response.\n", + "3. **Increased Retrieval Precision**: Multi-modal RAG can retrieve more relevant text chunks and image captions, leading to more accurate and precise responses. In Query 1, the multi-modal RAG retrieved 5 text chunks and 0 image captions, which may not have been sufficient to provide a clear answer.\n", + "\n", + "**Disadvantages of Multi-Modal RAG**\n", + "\n", + "1. **Increased Complexity**: Multi-modal RAG requires more complex processing and retrieval mechanisms, which can increase the computational cost and make the system more difficult to train and deploy.\n", + "2. **Image Quality and Relevance**: The quality and relevance of the image captions can significantly impact the performance of the multi-modal RAG. Poor-quality or irrelevant images can lead to suboptimal responses.\n", + "3. **Overreliance on Image Information**: If the image information is not relevant or accurate, the multi-modal RAG may rely too heavily on it, leading to suboptimal responses.\n", + "\n", + "**Types of Queries where Multi-Modal RAG Outperforms Text-Only**\n", + "\n", + "1. **Visual-Spatial Queries**: Multi-modal RAG can perform better on visual-spatial queries that require a deeper understanding of the visual context, such as Query 1 (What is the BLEU score of the Transformer (base model)?).\n", + "2. **Ambiguous Queries**: Multi-modal RAG can help disambiguate ambiguous queries by leveraging both text and image information, leading to more accurate and informative responses.\n", + "3. **Multi-Modal Queries**: Multi-modal RAG can perform better on multi-modal queries that require the integration of both text and image information, such as Query 1.\n", + "\n", + "**Specific Advantages of Incorporating Image Information**\n", + "\n", + "1. **Visual Confirmation**: Images can provide visual confirmation of the query, which can help disambiguate ambiguous queries or provide additional context that is not explicitly stated in the text.\n", + "2. **Visual Cues**: Images can provide visual cues that can help the model understand the context of the query, leading to more accurate and informative responses.\n", + "3. **Multimodal Fusion**: Images can be fused with text information to provide a more comprehensive understanding of the query, leading to more accurate and informative responses.\n", + "\n", + "**Overall Recommendation**\n", + "\n", + "1. **Use Text-Only RAG for Simple Queries**: Text-only RAG is sufficient for simple queries that do not require a deep understanding of the context or visual information.\n", + "2. **Use Multi-Modal RAG for Complex Queries**: Multi-modal RAG is recommended for complex queries that require a deeper understanding of the context, visual information, or both.\n", + "3. **Use Multi-Modal RAG for Ambiguous Queries**: Multi-modal RAG can help disambiguate ambiguous queries by leveraging both text and image information, leading to more accurate and informative responses.\n", + "\n", + "In conclusion, multi-modal RAG can outperform text-only RAG in certain types of queries, particularly those that require a deeper understanding of the context, visual information, or both. However, the multi-modal approach also has its limitations, such as increased complexity and the potential for overreliance on image information. The choice of approach depends on the specific use case and the type of queries being addressed.\n" + ] + } + ], + "source": [ + "# Path to your PDF document\n", + "pdf_path = \"data/attention_is_all_you_need.pdf\"\n", + "\n", + "# Define test queries targeting both text and visual content\n", + "test_queries = [\n", + " \"What is the BLEU score of the Transformer (base model)?\",\n", + "]\n", + "\n", + "# Optional reference answers for evaluation\n", + "reference_answers = [\n", + " \"The Transformer (base model) achieves a BLEU score of 27.3 on the WMT 2014 English-to-German translation task and 38.1 on the WMT 2014 English-to-French translation task.\",\n", + "]\n", + "\n", + "# Run evaluation\n", + "evaluation_results = evaluate_multimodal_vs_textonly(\n", + " pdf_path=pdf_path,\n", + " test_queries=test_queries,\n", + " reference_answers=reference_answers\n", + ")\n", + "\n", + "# Print overall analysis\n", + "print(\"\\n=== OVERALL ANALYSIS ===\\n\")\n", + "print(evaluation_results[\"overall_analysis\"])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv-new-specific-rag", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 69efa9e3b088dded9424b823ef18e074df935287 Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Sun, 9 Mar 2025 17:12:44 +0500 Subject: [PATCH 06/32] Eval paper --- data/attention_is_all_you_need.pdf | Bin 0 -> 2215244 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 data/attention_is_all_you_need.pdf diff --git a/data/attention_is_all_you_need.pdf b/data/attention_is_all_you_need.pdf new file mode 100644 index 0000000000000000000000000000000000000000..97d7c51c5d8901e87995a89589b8e91e21459728 GIT binary patch literal 2215244 zcmd?QbyU<*^e>8mD2OQCAP7j82m=hDB1j0*9ny&8(5(VWi=+YrN(_y3cOx)#hvYEy z&^_-vqyFN)_1?Pgt-IEJYd!v%@2P$E*=NV+>~mmwB`w3v&m)A-5{b_*D9p&mXm9cc zUtFA#SH}9Sv$+%S`}Vc7xwN^dy_q>9ucEn~rLz^|BR+n9MhOXgh_jRVYg>Hx$ueDq z=%wT^+bDps~T@nt7oPL+j)nD0~dKArPf5DSZ z#%+Wb)eOHM@;N(DsqFEiCqqqIqRO*tuiq#^^oZ~@SR#i#@`--P`+{#qYp;0}#YrC9 z#C6S&GBLPBjXUNTOdp ztWj=zt6bdsV{C&S9O0kjwuH^3Iby@Ip+hYyHp$)z_O7dzgFm_QyI{mL z+2iUDyu;fh#Z=-r594}X6*UL+jVt+4mBP-uwKKXmN=-Wpt>D4 zOcVaTj{ea^cjG6CIm6Sq{8|Q@^c7?m)7}VE;+>T=eiOoPo8qt8QkaJ3`LDYZ%fWWa zMc==FIKJX$3qf|e`roU4O16n}=Cwx8cGhlSc0RJ=@M3CuV^Ne&Bm*w(QIt&A+1sey zD_Br}O%$1~;bhxqIpvX&-&|sry8LwKb-ztGX^K?ThvTIN9Lu~C@yoSt1}QgPvYb|; zMw5dUmGtUC(%Z1)EDAf^7_N@Hq)Hn~`JHl9NTr*Fg%AXo#<`m0DX-&XYHkUh^%oNmeTT)Tf9%xmI|nZ2oa;R{PWsr6lCJ z=G?6AdLuEh5e>zy?czxXShwre2lI z->fg2q&CDvWGmW36Tt@S1yuI5>f|qEv>B4fJg(jWB_Cx)msAjB(5x!oYP$xeQ>Zo_ zk8>0Z`o>87>#myV3+5DViY(u0Txyy3dRR_eH2YdNO_9u_jLsrTlltC|gW){>_tfty zLUz=?&BLSN9_3uD)Wu3LZ5Uu*~bg!*Ihw;V} zd)ly0D*R@WdZ;eV(L1h5A=cMYNqF?T>ys-^<|QX3{yoiQzUO;>YWmaUY$bROimBet zH@jlHw%3PX1S71LIh-@h7sb;z^)y&}OK%1e-rF4Xs@xDPZhES($23bmWvvf5?xZfElP_q=_4sz~x>^w}a&=Vc&^%c( z3V8Df1@L1wyK3!;Qp@3Fa1$B6s)g%gUR%G@05OdajgUu5aW<2@_o}3}M3^iNo>S^L zyjSJ%4V>+iFz>>1b6z6M;7#gsYGXOBE8G-G*MDXF@9-&Ax!aQFd(Q6px*TMmg+@~DN{>4d`94g} zsNNO6Ng}WJ&Wc~+_4;%zlc4_XL_K<$qAW#LZrW7S>W9ZBa3}X~H%^*U@Xp)E2p@BG zt1oHP@;Yi!X_+H?M42GCo9|;rHut(={#p5HS>ZKoVSz2Z5|(DM-vo|CZqPQU{rWOe z++*-CNGqO1^#Vtff}2<8*LV97CsN-)9iD)};7@OSzYt$J$Yy{YpINzZJ+jKX|GUw|e+wZ4V z*Anhry2uqg$y!$|CeG#%sXLx1FYH*Z)mNdp@6!HWh~lz;--^9wtFf2%+0vUNQI+ug zy|QvEk?ZAsi}!bTKfmAH967!I6mO-NSr+Fg+k*cztRl1HW^{Q{QP8qjiqVG_hQ8~s z$CBa~!oyiZuDwh$fIw>se%D4$^L=?ysi-yBo5t%L5a{*wL)VFZC&F;cj!0k$NGmk5%mt3TL4 zy5{;^Y@w7SGp?NN%H18&@lCWaqI+uic+6t{h6j<^Af!Ct0Vqgq=$@vc0VJ4yG1%f^*f04I!h2^ zA#KHMr;!#P z^6MkfM$>ukSg?x8=fnVWQLg6G(2_9;o|qq!8I2;viC&i7M?sHtxvsbfj%fa<_YU{d zawlS+DHJ$*%F!qlUz6@-&E%nRCM-<6C*vKyB+nH6# zgCsYh<6b}hdJc48qJPqDKJRIxcfC8VpAl%^*I>en?tHhI5C8t_ZJk?`QLKY1iT!rr*DhC{Mh#u^ zNuwroIYgF7F>7JUw@5HtN$7#;m4Sv2giFtNH!J3XM$#l%>)*n!##9B|YKC9lgIw0;lCT^vqZ^dGXN4`DN9LC*l1<;4ue70+ z*rYYmsc5;D{2RPj8M@x(ZBu@q7(K0(+cn}EguP2hXTE*a;50(^c=q}exY^ue_jaR? z^X8Rk2AiPTkJ|xFx56Zd*O%yrNbCD~iV+>lu6K!BdJCQ0dr8h4mz%Q3c!C(49JP8> zQ{w%E$~*Ti-qcwAIMWd86Eg_Y^WD3VnK=BL?sJ}$wY;AX@!i=@yEHWM zMWX6bY)C{rY%WE5Uh`z}MRlk2a%L4zprKa%35qFg`y|aCFyI;i1khV*ov7QQDe!r*?0|?(E#6LQ-5R=_E6lqqSE=Knmd-Lw#>_$}TK*lU7cT&G9@ZgKm|J zu^fm``PzMi9*%)|4L_ErL?c{_x2={-oo5K%1k2Aj=P>0HsH}zTgYNhc9o2A#h;OY? zh$%g~(Prg9xgr>D0rOF5Eth<6;E`uaU$lS96(7E=$FK}EaB z>i!{t8Y&|NI#ciaC=vaFmH^*YDqZ{rA=@9Xb~(4+ka29~!(vHeA5D4rtz4tgX?hHz zb#y&-jW@HVqOf02-&0J;8{f5~xxHdK6XihaYZAY7_mE+2@oTG_*`#BE&fE!=n(59B z<(F0{0WzJhLu5lvFEr~#^S$vCk1HN&ECv+CY49&w2a>nI&567%=mL@COLsXrqq*DVjCFqr=E}hqrX(Bh_cmhifilmpaiuDyucr(|+7Fp}DeD_et00Rmu3)>Ge2x zSb#{LrOAxvg!Tsx`nZ$oot$6h$6vS|Tt>PW{9?X;k4=3ZPo;I9vX-3F*tXLVA^8E? zkl}Hf%DN;UW4;18Zy+kj3g9Z8+abbVkNowWfcIEzg_wA_woUxwY|ZQ){RfwRHO&uy zy2j3Bhf-WE7N1 zakGf~J^G+3DGw)HoST#*IeB(x_9~D$zE}?FjH=h=f}^5&cZf}#wO&UB-eFse&VA5P zZiDc&SiQy_4aa`L^|G=VpP2S+KbPwrja=|hJ3(ljlFrN_GGUXIpJ#X z;#T?8ucpU@S04`Ftp+j5;W+fI*$_68j5%7xF%u|Nwb#IL>ggbuiNeoVD7e2Dk_ohie_SHH0 zH0fBU+x#XT0TRuo9(OE;rqZT`M(}rye^g~#Tao?lvQF(H4Ef!oL)tg;$o%2^m_n(0 zIF8xV_^7)fFXH!+?e1+;)NlIvv`*qY{GY$7rm?`ezH17XmvTRu#as4dgSTOdKN*ji-v&d4KGDeMU-59$yKoLRpt2;GJF_Y5UZ|#(Ft!I9YI5 zdtQnt3$9+o=e!WAw9zDu8w4-BJSVRESAEQgRDWl}qToW|W~JvD zfh^tmxp?RgQAb-e`fEsnpB8%0xvX|tbD$4rMUV^d&2c=@wo_{@3^NZMe@|y*Qv%{HIzvwNvN;}aexBaH*tyZ zGv7tLDxmxB^XfSDTP_)l&c?1dyiOPWh0gOR#34=Wnh(;R_xQ{LNk+hg14~XG?bDYe z*12MG)#^O1N7qcZZe)cxnQZ5V(2=rhoATjybGrM?t@n*T@H8_5mS~ItI1d~3t0X%f<;SK`MoDqMRHdTEkRxKX&EIDYoMDhlg+bI8^!@YpWe+l>M9u7cKUt8Jajk&2aBd?l^i8HoF z&i1t>(D2mS8S={9>6yK)gT0-(oin2dKJPR8xAsnI4zEptc4>20Yg2Po*{A;(w*@cE ztu3vb83hCcLHPf!4n#x*`S^gTUcQFdF!Bov0o*lD1hGMhvnCE4$Y`>_!YQ(j_ig@ylRf?e)PsiCov_{O!!qvjHZwv8(0smxe z_Cip>(7YZDS=lnc`Jego&!Eb1OvUt!vm5@jcmw$8Zy0E%eFl8^`-bTX?Fg@`Y0d&A z<5;CVk~2kDIoWQ9yO=Ty97Xf!tNxdWn0ZE^+_;wfo7bsW@;sf{T;wKD@zcceC_ib1 z2!wn=b>}KjkvBf!qlY;5RN_ggltcp+pAWKqYS@lj6h&2oJ^*DLPKe>$>BI$JVf7aQ z+Ur1t_Sd~rp1!SvqsvdDbmpobM3a8TOUVs33G2l;NP}%Q=M_ijxd!8)i zNc?g0H?Z-Cil6&fnzv=`VLP0o5Sj4(9miD=(EaD`e$ovvtVx-ro)?SFpk71mHlj7mcqu)^C0N|R6$}d<%S2%M z*e0JH?KpcJB;guO<;nI#fGYp;z6&q+>X9u_Ft0NF3Q#jCdbB-{6j%f0*Iq#Fcguc1 z!3@3e6pk!GOdG7doT3oNh^YFwQJV>g+_I$NB-7vK031(X!*rx?XrnU{C z3sPRdt8%gI=R+^uE~GvC4E{*N?{sb;+o!vv(&*$rYn0*E=ipGuUrTO>9-nr@bupZ# zIww05GZ_6N6OJ!cV|kQjty*6)!q6<+eMThu<*R30jz9rU80<+5rH>& z8Ec@?V}In3mH(!w^V(zI!)kb$I~-Y1dV7x%m;|R~SiVww$?+T5{sT-eU7(CuuUHH# zCu8n$9$hr*IrPzmEOkRR&+Hf<5k}4U%+fq`PonlMmC-9TU1N8-DYePZCusk)IizWp z9So1mJw7>jK5N`2Joi%X_E3ueOaj~dIS{JQ#{?HUu%z&a3)$9R`n}|Z(RKf@eI2K7 zU}PSH{*n$yeg4FH&jlk;k28T}TO9To%&0x8E`$hSwOmSOp9C|c7P}LeJ;Zd}{ehMA z(sQgTbcSMg^fLuk;EcT3O_DOi?#=%&5Ht9H;ooR$mPW3dRBe1Y)COh0^A!+SZ-cd-~dF_v%u9$DgP(~!}m`U83WyS*NWvCwwzKFFiY^CPug7v&HnnM zAiLtrM&apc2{4#;#rWZViGU6bK#&-V;Tu=;1p`yex2*~S#k>+8rIQ2N?TmGb zG%WeP{Ui-f)HB~dg1CJWBe||nu%E1Ekqv-l-OatNz-#1vB*6b*WkS{M1Uc7%a zIKvQZzPUHOpz;Rw0q|VLGy8K8YUvYrF`_j z+7_m(6kNvyp6wzb_9lITb9=Rl+?&_MR14j~JqI0{>6kf4VFB3OPtv3pTwbc)>U#U3 z(}pDd3*yGm9@2s|%& zFxV#CbGkxrc)lRp)z=OXa{h)Z8V+(hNa~ZQEWhI-D<=()at7*Gc?g`fumtuc^e@C! z#u#)`@ba4=`5y49slm-ffYsky0_6wVQ_zy*@aFaQQi-`xD8%g@G;I^ZpPs|&9@W@) zL}|TIXtH_O0UbixXv@QqFnZ@x!~LXv>Y;(yFrX=q2y9sewv1Bq z0<#T4hc-MeiUIRTO;fwvf;zGkR=hdt+g1>_a?{E}++MQ(k&aPKCRp_~kM^=PkS!ev z*peMD=b(Z43&uGsNJhIf?1n%NT_e-aVtJRPT=s>Z4+4A}2U`{^Y=d0JdTt*EQ@&2QhZ-$CJh;0B zOrkBkJ_=c3jVO2J%07@b5cf^lUbb5SwnWl^TLK$3q}E|Y7viQA);}t444zV*5_>6e z;<+|SQUcUwY>RDu{_v`?u^*vCC-fQD$Z~z`_(6U1?Ch_Z*mck*JqyM~`Ma9WK&rK8 z1;6Fb9E~r~WKTh=D|>8%!LWS$t*wVHKBk@kH={2B6+vY?o+^iPlpX8ag567?LkEuQ z3pAd`D_aq&i|NcOKsUaCk~W@lM84OT*-Av|v9t>uC3~xV?s32opdO_zt8u%sxldGW zY|fa0&YH>*V1(VIkZitl7;Z{#ja$_2qJlT?#Zgjud7<@T0s(nd8+sbEO$akoSXw4^ zZ7mNpD^|7u;LwW~e3VqlSD=PX^0heWXx(#wm zEO19IK&;JWZCEhtEgM8oIm#-R#zcEky+*+^4s34tVDQNQ<3Hy&`}VW|MI3+qzwv&(&J+Qd3h;sTkvLRTFC7#y69g@=1os6S$Q8YjpIiU?p@TGBDrhht`@ z-h~2G35SyUZvaX2pk)He{_~V94l$T6LC^ls=zRFq6hnjW`rjBM<07Ju>F`S^r|TY| z!8qDHe`qkL$ zPY%pGza{ZA=ll?meZK>aEk?pDc&}W5pBP#k4WKC1bL9aYP;8}@!btBf1P5E>$NP-& zi~zWl!*-H$ocp+iUVV4bo)DWdH!(Yk!5O=opc=QiGYZSg-7>cZ^r7S|Uwht2K*O;m z^lZ?Fq1p&TvGd`I_kQDLiuaD1Wm$XPUVzcnNQSdg%P> zN81xVQFms@2?^szsoUo)3UdHD>tw3ruu{bf@)Bxq-79OTGYbYBN#kd)h&E7rLKmh# zMrn)_zzDbUisTAvQ&vP8-r+h1476;3T%SH}S4?gY*^9?$fj`tV46Aef5Z#n9JMZnU zmT>WtVN2G?k@=3uAiskV`-a~SslXlE8o+R{<;}hP?fP1DKbwp-)Z?&+X1hTsiGslp z-V!NJ+|Ud$ItzghV~x$T4<8Oth*+a}D(JD|>$BdpSK;PaL1IGr3~H0PgrRuhQsVPl@G%IjHw(H!-grNB7`0J-y&x?)$V@>sSTp z7+IGU6|oh4RA)=x5mA_+uhQ0kR57>;lEIj5KSa~G{&bUqT;G_)$h|B^Np(M~s?Z3| z|3_LSSNE!5%4E4V)N^_qvtBTC#pl_y{~*oDcShu6f+8ichvgwCv8D@#rHJ{AP2Tbt zWlBk1I8^nF_$O{4q~yU*M%|2jS0)4(<>rVz&Mz|HCg|_V0lcFjPkj!Pc0MRe9DF^- z{kW)kQP9%BJu~HV&P>=mHq89kR}3F((y55N`2$U#+2l8GVjhCdj|a5;c9XLu4LLYU z0xIH;lcVE<$v!UY&G}S~i&T%hd*pQe5IC|8iXSt^RnH&es}I!iexmPra!XR1^e4+~ zq~RYC>?ei1>TjWr1QdeTj-dDIb2ONZMJk+Tc!^m(v4(4HB*mL8f`fhAbM1Ac>2Thw z$E9NNSVy`FD&dI@A$nd!n-S`9z&6Lu?dSolF2nM+5j$>5*K;l)Du}EE_(hn$I7SSr zh1JNaJZ+EHjJ@;Jy6EL`3fT!~1W2uL^K`Ak=pp#`u(>2E9NA*pXAnx(uwJQ##5yj2 zs9=^t!OBV?uGUH`KVoN5mh;O~J2r6&9H0(o<50@VAk4NU6d?lxl(YXhkQnc$eew-rM%3Wz2cL-HMFi`TcG3&D+GknpuUh zr&uSF3=3PBHo58%k1nb@UdQXqc?Lq9C{w%7g8Ejr;Qx_gw0mYGw1q4JQeu<+AA>=C zOA)PP!YT4qlx%lyx{P_%qAvB?G_*=~pN@gq_zl~B=@J*J^) zp*1QhTbWw*?N{nMWfxO3+~)O6{p+?PCZ8H*mzaXO2W3vl#uo%Obr3DlniLy z-0usohJG6^Id^=|63O?kzSn`1X4lKSSmQiE!a#oXl_6v&-LxK*ccjjoUl9!U_hqV$!K$@<8 zIGGVbBNw4q*Xwy&SGrG&u}A=fxXJ%|Du3mH;q^gxg}5ID7=Jffg799i;f2q@L~Cn~ zOROA%N88(>&$r|Y5rE%IMJ$!oC{16t*z_H$B+G-qv&YLHde>=Z47oQcPea~*$iwtn z1=$Fp24m9o53jXwb26eYgY}>XZjSr~I z9hZcmF1i=%f}3fSySU0cm69eG5XB6|n5Y1FK0tii3o*oa@`Ml8&-A!+5v?_}T3nsh z(~xGEk$$_7VKm^WmVKB1cqqZ1V6meJv1Rqs|G;sTV zKDrq7PN2REH7;Q?ZB4Mvv1l>G-*A5r9Qjs zmD&Jg!4_h1P&6nbO29Kch>6er5K)64LtMyKewfM0OMPNhrmkGc6D8V*99yUus6@yZ zpKujd1)^0?Bhp?%NO&b|PWRwI6IBixVJHoE{;T4@Nm5oK-CoM+f4NuBedp$g4M?8g z#T`lCQYN*4j^KtWQHk`UqDThOTzA~qX%@#{{8isw zdC}+HHw8WB)_|}nf9#1|gT^GO>N*MfhN!yUGz!+*y^eAJYad_wUCE%c;3!bi1vYOR zEnz1#AKSWa*6c`N6zny5{Gwe}#Jfc#Fyn2a>AxNALN(`hNk^}~%g+y4|1K{FD@}*# z$}44;jVQ8{6P6H`wVx=2NsZ$iE&SQ%!f5e+<|v)g$ty3>y!N3BOg6 zXoU~t+n_~DUZ>vAUVZNO`lch9y|1I*c`ja5$Zy+4nLo}5cP7qF#^|d*bO?>{Jd2_E znFSV9MrS0MqsbjG*VwL~B>-&5G+ZiMQGl`XI(Pxwzx$?a@Z)MfHgtGK@XNrlv2mZ) zwC6K|D3TTntAZvV7Mq49VLE#!$(y!VWb+e@u<`Ti%Fg9qLD$%v*US}O*3BPbp;2^% zLO~dRhR69h>;TBN`QJZE`rQLDa=L00Mg?CULzg4~Jo24GNzQvS2$W32`L*V%%e{{3 zFt#H_4rX%)1{!%Co%LCU>%dRC@Fer=Wvejj;_FEloK<2=8lo~Ceba1o-fDEuHy$|C z-2RCG3?ERhFLxL*CoD!JjtK@=rC&?MSo#Z5f6R7oX*aN@6s?QCq7zih>|jtv8H_pl>P5hvOw~%J*6;41@z2fmBo-U{*#CDuMJy+ z^kX{2ng7j9|K$2Z12}>>>|cL2o!^k4jP9%o@@_^i_7 zaY}$lf>WD9(WmCv5us4#6-v{==!m&2U=|>4LIf^_-^$}>g;r4*o@4;ok)N#zB;x3U zUwww*{26sv7YP^~Evx`IhGf?-#?Iwp25x{Dru_Ona``j2ShRc#fmN;o=alcg0GC)5 z0!n|OvZctLQGsuvNDiXmv{#dUZ!zV#1$B*H5`~EP`PVZ5u^(^~Sey=o^FNRuo3l6l zTeO!%2xzJMV~3(_iYhfq>9(pocE#WPI+zxFFO+Y$(H?qu!G}WJJr7 zpy$Hs)mO89aT+a~qP^6MO)+2?^4tQ=%gI_F`W!Q}6S(lyIh)693?q5_UOsChP`Wqk zK<8nd|Bk(ajaD-{$xBW>yC7z?C!phYAqPLS7Q-XI z<=jU}0S}axd*k3*atL0Smy-JqfYDQm{i6N=kc4+fNoueLkxRsyLdt@cNY!3XUMvV$ zHpk;Gc7u7Lb>J03yW5m} z)7;b)KFyg=%pj;F70p{#$;Bz|vOtq^#@rS~Wn?XMw9Ee&Nn2Qf*?bn~M8*^iywo|1;zzwtA(CC`9$N$icm z!`Z-h+d@CB9MXpVg~lCbV~{rnlw_Gd5TrHhkF@ty^EPkszHJhwpEIaC?Hqoi^KZFQ zo=P)^ssj+!Eek`(?On~$9@2GhRiHBN@6LAQsltPK+jL(oWN6G!h2$26c1a8kmEbM;BO4FpV^8<8HVp%{z#}r=0gSQ(1__wZ0K`Hg{+PRT7SbHbwH07U zTyK~+nC<1q`43u$9e{f6G!1=JG_0Q}xf{(3X}ulzd%p!(o6^h$gnHwnxXUbH4Q=bU zm69(_x;4B0+?@FX7h%J74H|m(_h*+y>hAqHwBZ1a(c_Si4sn;$(EQp!6L^v?uPVR@ zz)(MAKdBYE*OjImh90RW@=M>!CFD&TpL6$C(Wt$z+-4wKwpE6#8` zhiIJvLlo(wb&1IAtNwBaOp}ICCrtzrF)rQ|ITrTlK?SXLquc0y0F+P1{5t{wqDWeU zs!cYDT!fRlJs>K4vqsoY!m!qxa#1|)gb@(H7tmQ2E{6o641SRmR)352Ul@^?AL%pr zK?3!h4%D~DUeBZgkQNDMo1G9@-Xzs~s9Yz_sRW*%(|nM;!?hR-nn#CI94h)m{gF*7 zBEi+G?|q18Ngh;fjc;+vAQrlOz;G_^%~JoEqZTUcclc`!nB=TQxowWz@Y%6^Eu-am z&VuZnxmVSG)xgpKwlIDwyWaX(U(K{{sh|@==EWZWUKQE=pPL62wl)IZ<|090e>OUdMFYE$_VAPix_SJPnd z&M{x@3$GST8p(f|HM#C+#y&WLpY_6o6AS485gzZSTz)0dHtlim^EvV02ZEOIG1xN6 zId71^U43p;9^*+Ubq6QB<}ToV7sWZIJ)V6EbC-S3h&E|hcGgLO{vu$u`rwm}LxxA~ zdGK_!?@kS-_NN>k7UlryI}BAIhX>^Ka4?xYOc6-*wPMWT0UeP1!@&Wvf!Lx3-e*Uk z_O2@q6=uxCH&856`-~g<2q^x?ono5=06TGTsET-bfS-TYh+&m3LjR>$8)gArAvF)|60kR=K%Q2r z{fg8$P&E6Sz3sY!P38jE2$*ERvOfr`RPih3{G|IQ~)^2OY@AvO6H5fbz>~`7Q zwvFEDumH1ppO##HrWNyTM)BK-XcZU|G*GtCN;o-td8J^`5ts1FhNJ^u()WOpSTQj% z^e!*@jbg$M;`Jy)!Vatr#n0MvP%#Jcn_nneWOLoDmc>lx`4BX}!JPC#zsmDv3t&Y2 z`K8IxFeQ7ttypJZ8+lCnF0bM7*17AnV;boKlTAC6F?dc&kKeL(Gq{914M90{Fg-DG z%TJA3|KqZxEd~gZ-eCZF?v2`7YRka+Esixh{C)#NdM0LPEnfne#V{Sak!&yAI5eQj zjg#$31~pp%TR#NZ0b+um8`R3SoVFxg0pu3M&z2-q+1L$$uiLgtP*Kd4rhkHdO&i0VL-Pqj7UEL%>cWYW`9@Hz5;`z z${q|edCvw>bJBoTe@!sGW(IIwLLKeY!HG7%j^hv9zuLXD1DMl9Mrb7_dSQHw_GSWP zci0*xi4jNa%IVa$_78wO=QO0e;s}Joh&ERk!K)vG;e*9A0{l4~U=$w?$R0bq4hp$! zevS~s4A;Octj2W)b2e$@XrtBA1@hiNf`6w1b1CGnu?Cvwn)-^B@`+<1CzeUbapyqB zwEgmVVCa1I5rc@x(fL(v7JvxJ<-*5?OUpheK?DAyI0*zGK1_JdlYt{4G)sUi0H#PC z{GT2NI;?C|?fiQ3ma4hE^D^`n4vx-#5}*tFCum-AH(@1XTZ+xf6+2`+SRT-h&(C{q zomP#{_x1J7Gs`9yT^#||c~E82&m)Q}HPt6K$i(dfgbn>iR|7Fl4 z>59H!5IxIKlk{9nY)>frMgUKl@IC$>lUtxp5w8!-099K(?bC!%AT|IzQNiPP;)h<3 z4CA*E!;CnZL*G|$4)TcSL=)oT_+L3p610T7cz$yLtamM8uPIF%M3T6Rrw*7csTgE0)UMcv zB1sv9oTjWT$6R7=nm??83{q&3z{!ZbqJIEVod~E1c1H&x!1n3D`P)}PnVx5!Xcj;U zPY#j_>@}e(a1UVB$IBOMqp=bxz_Y0R@7~O5cnomidXKG=l(V5@oFFt+{W$Uo!FEPl zB$tG|-`@1lj}QO>U_wPI;&uZ<{4$#v^=thkOkxfSxuD>c+^spY@afjm)1xCx?}CyT z1_8aXr=|U*0{{zEdEaB&PpW=ye#lT_zuylb-{1oPg6U)7Bh33OAX_;MX+Aky;`BaP z!v(`mUkg7zY^BgPK)3yBYw%nlNLfEUEz1_lb|(ZzsksUN=Chf_sB9Jja0Jk375K#D zBy~fMz4xB}z(acU@I5fhWPuQpDY0>2RI5+h^Q-}l^7T|&4Ak)Kn>FjHOY0EALd^8vK}rf}!h8USLu^*vEeDt!7~ z7#s(T)Pe&eFEyO+LDh;n(;E0n9Y#B#h zJ4NXjwZqsp;>T{y@9pP3SA=RV*=Y+|v$KLWoSAf_nQ)JzY89`UK|lH$aDWX36a+_$e44k ze**v7BNE+AkWj;CU5p5btQ^*s2V3sS8rFH|~8S_;T@OH2&Hci`)*gijcoGJ&NXWAC{G`K5c2+zJ&+R}+d@i+xlK4>s~;-d+_ z1=pzkxu09`<{)XOx2;A&<-$Kh1YQF4K^*Zm9+2eZfD0rs_PR=^`%&pUZ|x{Sv$iQV=J zsqdRLi9u9ktKX{@$qreubBHxN@SjR#p?;W~w%Hj$qhtMZW*4`(ttyNbpN*qPP`w>^ zOttAPvJub*2mZ8j%sB(NW;=%py09(jupI}(N;9HSYbhZ|alu2ac^G97h8|D*c|TB~ zxO8^=@G}Ie=J}dk%YfxDX%KdozRCotf_&BEIWE#iil)8%&h(6IPE-GYyk1~EwiORJ z=q$)`T;7cRra|#57sxEf8`kO%Fx)Wr@|rs#p!n!#8;^0io_&p8O0~Ys%XuJ2ttEFk zneNT1P?Amek{F#U=|gx%W(ySLl4GNznzEb_;DC(G$&FFSQmqHoE3%s>CaY3@^^^+f z;NqB`_SHV`JO*pNl>^)4CRK%VUWyIw5jNy__4VpiC__cTjkq9oPFIXYEG=WB=ql*i zHi%5@K74Z5&F*P%1L%S{_BgMK39}KQ+tQD!<`hn4TImjw249XK3|(ReAq&d)F9_Rt zP2ac&m%LtJ?$BXpdE71>p}Zaa{ODCM*^jsKQZy99}+YTS*SB#@rBeTziqo3dBd#+TJ{UI zbm9vms{d_nqqf~T40no%0nVY6BQ%TZetNY%nOm^CADg;93^De#N`5Jxf*>Dn1&=k2 zoF*2>TtL=l``=gre%|#$K^t=x16!JVDmjwLb#nxYP^)|U)#9WztrR&z5)^roC5{)y z^2qQko$QzH? zX{!ZYOBERA{;OA$L1WrHPs9qDVvk}*@@5{Z#X$XmqtRkjNeKkm_6vYFf-gnSh-hh> z%d{{Nb`|tt6V#UTrRr>6G5<;l^>fE!hQ4n!wK>PF9s*d~Yfn-=eK@1>X15yZfYTBQ zyyt(er3XCd&B+CxtTkoGq9R%|WFIalo+9+lU!1OtKZnbqqf=Di!F~t;MKN6jsc~z@ z0HNxmrKI1yiTf48?m++#XV`ziTpI#*)&uB53G67~7-qr!@gb8;N%TcX8;yaa`?{8W zTSd*c>6wZw{N73RMJS2iC$(p4E^xWIXJX6!u}q5I4ZGD~whP(ObOh-ymp-G)1Y(Wq zno%SGgaN!!tvNnXwhrAltEp`KT2{dP@5mr!6JPoIxUPSj_o9q%WTO>0JmGoeb6 z1c%RSIZiNae}SzKl(Pjwv5E&L-qMmzQ2hlwg4+h63R3|Op@|OP^3>=7a1DoOS1Rz( z6lsLYu`kmt#kT$DmvaROTbIT(mG}KhZ;vo$5q4?27{2G zen<%C_hzC#U5*lTV-vlq+_8CryKn(;V9^;3{JSr}J2{k6XJ|ro@`fmYIVvVX?6cI( zJ}#){wH2Pf>4z-XG|3k>ohFfOfgthS`>sPfdlWpG(;+s1BT+4v#atgr!KsYl>;?OB z4Gr+TZv%Ve!q+AwVNHb4go5`Pn+CjU(#0W>71vB4cm0+UwVF^(}W8(Jb;bDO-#putVqEB=jy$;4iAi}^SWQ^=|rU1>X{RE0zGHmCH+?{H zl#bwEtA(9P4!AcDle*#`9Wiz&YaOY5LN6)S`vC8R05%2PVwFCStu-5?bzwHxs7{l|m+jK4i!4wLeak*=0uMeqr1}_DRmD0>kTnXsD|x)+ zH3k{2LiEfiSdJBVdFqM$m17bh$C`&TT2@U#uO^d4Bu-xX{phO6Qhte%HxPM>B0G!Yz>0qQ(?T7whuUsSu0H0eM8|rhYH6RN95h3uZb0OnisBnOL zcFz)1xI64yO!KS#fP6o-WX!s&r|z=E1voS=G6ZW02Nnv?CRFD`)pVU>c1M9AfV$ag z6P-!#2e#}5E=rYG)^ZE%W~=kDyI!IRhOOS}wY#H1_eq}WyE89rE$~r>jl&Ao-%q@c zTRVew2&FzGLQznhOY0&*883u{zr+;Kd7Z1ta`4pR%Sv3X=rDW*kZ#Y+3s{OU<|zT7 zOrN17Mh@z3L{lL?S{xzLNMcxie*R7^iXB~OXK>5ttN!YjFBr~mfO6eKj$gN|v)2U; zHbus_s#ART1*AeZl8erYiJMlWe}_^D(b`pSPy_OwRPdFR*$@NlrA|Kv@REw%7q01W z?ru>sY#~$HR6v}Oh3uhPu~7*?aI9=keBC+k>Pow?{`Tu?5TuXhtB33PWxF z`af8E52&WH?r#{!aU4WNMMRV`h!CZS0*avo$A%Px^bRT|0wO}_gyIMyO{5bEM5Tn# zC3IlJ z!zav=Gv6<_X9(Nn#0cTEYemnbC_ny=GSpa!1>^hU&ks7PLNHp&7ahB$E zI=H@3Tg5^0G*QMmPQu%j9g55B7@b|Hd;txg6HOqQZ*p4&@J}m)Q~*z0*p1V`Z<4_E zwJ-273yW3d5cme{;t`|Nqh)|b7gXwX7C|Y!O-JuQe?QdI@{T6~haCtq` zD7;-JBu>^*pJBQLAhJAZ^Vv@-gu~YuDEk!(_M)?sQ>v}Qp7Rs= z+Ek9`+m&3a7ljiR_t=EsKfY9>yj!^N z7h?^+WZTSvLGT(|$btW^T9%rr1m&36aYkW-hv@6n}h_RLZAm!xW&l$L}jN; zDhZpaSZ-|aZgd-ELX_SG0ZZ1inhZx81z!lC<7MS~wctL~)Q#R=nGDVpTsBAdTLocp z^6(A4E$IUdYO;FxW`};DZ;)DSg>=ZPZQcA|Uw7CTFTa<%Y2z~g$<*4hFSBp?waXOs z_{!5nh5)?dhf1^{$d*AfXy-w~{pG3J=``H>it<6oe0MY*tOH?342^_lWWo2)H;}sj z{NexOwG!~?fsz?IN=$aGZmJr;0EYFZt7*nXmwfi_pIg~m&Md#75F*bhKf2q1^_f`I z+u&cxBJW$mHQM$=J55kxeJB@Wd_&)>!mi$RkOWKPm5{Y`v106OOIPM`;2STB$FG zE*FAEDns1>$H@EUah>wZx8J>nI^vNhd7IWl3oBGSy(U;M)8)?EmR~lUiHG{JjD{ij zKj}Bn89Sfab?vg;uG_|^+gEl!W1cFQM9OGLP48?0YQvf@;4G4jn>7tTN;t;ToA=s0?4-fZv!%c|R#&957eW@$`$_ z-I&4rQR;`2CAFv6et90W{~K3pN2F|3&c#};?;5(PX?-o8C^N^ z@1YEPAlz{e#}iyq+xiN%!0U@?A1Ce|lbk%AA%EAhS(W6>tt0sF-;0!euqTG+Zg?|D z+=8bd=BF>f9j8S5DZ2rR_^Uq0J$vz@!GC?rE}#M#vbi4pm6odA#h`!vA9HjgwYl)T}w{b8&uBo z(Io4A3A6&FrO=Fs_G_Amy=Y5gvn#lNd}L8VICxm1y)ZD*->z* z_2T___Yr+?slF-1^1P^TM}u!Mo(dt&&>r-HPiUo+2Pq!Y_iKj& zgj0cR&I40EEN`(O6t}!bcB$bagKs;w$36j1VizBJuMz3QQ?@o5JRJ#;uj(b)?1isD z@8=i2!#h=dr&vP{*%H`1Wid%9Qq>z#bw}%uH=(9It7NtN-=&|0M1Ig5s^j1mqN3TD)~^<+VV~0@n#mUrJ9rjAv|tPW19_4K&nUa50}}XS>c^qq3nnufGthm zjwOtoC;c7;zPb>dxStVG7+*mN*^X0V+_%FPNB~;_35tb~Zg2f&M^mF5UWcf<;{Qf$%Fn zQ>7Z+zn&duy~W#vJ)TVDx)#20&ml~=NX;Um=&#$SYJNM#{6~yPg~XG^$`2M#O6L)= z{j#oi+Sl7O+Ks-n8)Zo$&JSBSJ8C&PJIYVZd6cmNS}SPNaE-ZA`7bO)+-9`Nx?ADQ z^oQ^;Q6CxA$o*96J%0RZWwhYt%1UgspHn=6$NjGTs{M=gDj5EmyXR1zR13GuOp`LT zX5|u{3*iUZEO=y4A5BGzlf7)F=j2{q`3Dn{2+XYIjXNs1n=3)SIcGd>by-l~+z36g zXfw`Two1-p+aswTH*1QwvakF>=l-)dgodY3(aXU9Ffn1sF&<>F-xCb-_y^*CG3%`Y--Nt4B5B(QlycM$g$Lj zdCc-~Ye1cnIr4JNV_Jj9qY^JoV!vM7J5>*lq3@{wZfC_0% zG0haea%4EaH0MVskrZY z-jNOd&6f^JIwNgKsJ!8>R--t_>lrUfTY3r8)xq!Mka9zSmk6MJOkdHHt}Go zZ>y7}Mr{3c!i5X+!3O6{W`z1B+Lh?3@$<)pmx7x8PA1))cc&W2$7M70US%GQHl#;pYM z6V5)YHq1%036bkBA10IHpZ_A@TNtFig~mC_!PCjQJmI!Vtxh}|HOkkc#m^4;Z%Uc$ zW?LfVz{X_LYg~;r8ZAfh%H* z>k>3M-6*xr=bL21YRh%fg$X{O#G1S_hb-8;u8&FPQB?gBMW4?h2*X`6lG9l8;eYXH zKY}o)f?vTTH5_}}`rx~*tmABF+eOm-q}x{b6P+)|Kk*Sh;U!maVWwiXzkj(*58UC1 zH~4U=pO&jHQ1at6(V=ny*s^qpZ>BvO{$w#ZORQ)B}qO7b=O)$d>t3av_Ec+ln!He7` z2xo_D=n*lg1w@fpolm(?p=69zLohUiBb(>BsL`wUxtIgvzBRMvir!(L1fk~ld5T$jbl zX`K^i3wr9SS8(4Vl%y}wI#p>qdw^^N=u+DsxkhA}&1qK*vhQJp#7valULM+uQkT)B zfZtw?C`yZ&mvt>QeX%f@2|HHN)@U(01OJ?R9nL1~Bwmw{^U5{% z9Leb~xy45#*H~uYmK+KBG$Fa)!S1L~S%D%<0}zD?(ukm1nq~tMa*CWqc0=n4^JLPv;^;h_h^x=iL^!t3-ZI{mG!f~? zP3CgEObuUW-i$rADAHh_)cX)jk2X2{bYDz(iK}=Gu_A2Y^8nsI3lhywhl|J5bexOx zKo$pSQm-dA98Dy$eXv+K6<_!&yI^c^l)B%?pyeN2JzSBZRd~&OpqSg;gH~0gQGL`Y zJx3z^$4{#VL4iQQo{4K?mkf($pIgNR45Snol2zY~CwtF+^ti?1KF*dU&Fk*sFRYz0 zy!PvTAec}_u+@!Oo~7?1o7WHo^*=NUr!|U)HHMHiY`tf45KF#dNd_!38hQp+YPFur zUllz%bT@u|MyP)~F))r1e&5{*OE&_M=IDz|bsh=qe8kM@j3^FUbH~a#?T=(y*>qBa z!}*`V@x}9>VGVrP`U&DXLgBj4Pn9}Vxno99G-3P%T?53ea2@;y3Jgqm{!>7Eei|m@ zr=eId?E=LNuEYP23o?}MznA~1OpIl;W4;IvKqdyQRW%Q%$ZhHkX&)ximW*8^w+Y?f zO8b3st#;Gwo6xC9*|{c^g^}c=F9>LTaFaJ>td}M$hadyQqiprsHJ!tXq@_8N^yx4t z{6de#OVlqej_FZ0nk4Xa=gqNANpJR0#mYU@BAR?`ky-Hd(XH#WC(-9jie7a;8R(|V zCh?yN$Do&*n??rv=q%d?G!1W@fjduqkq;elc0y!@zIfh%^TKSf&UOaONN!V`-bWj* z{WH{dvWy(M^Yk87YLhdE(p-miDNYj>8@Bcs>)+zeU`(_PE9nRp^ z-MM3Ljlvr9dCTo3KIx13|H z%irEPC;YkXsX{L{fTybV2Xi=!!A}Amgd~Yjc!meNm^nb?&ir}d6I#cQr}GEslX(+l z|DWIT5yU;)*!6t2GtWAGhpR|<33|8*7zXsHWiCz&AZ>jw)p!}N4_Khc(6`fY@g^W3 z+)Dnh_fE_35e&=h+v$h@lj<8CIUn%8Nu%>+N@L>EZ0{$Y{>kJ-R++8 zF&qn6n_uo4JMs$^+OgA7GHOAYb-%6z(fj>7&ar04)WHp*?M_z_pTpiSP0H8~hHtF} zw3MKNT`DLT+@DX&G!)k<-VFrf+0kd3m?pFv4B5pl$uZr8?890 zbu%&}BU~8kS+^DMU)-Xu9X1NR(b8Ay?4^}wweu)5X+B$buTyy?WT^?}gP|Rvvd7fS^{us#MKm4~pve%y~ z4-~wwuun@t>X zL-CGIPUOt#ZjW$iOd9hdD1&Xbji^3?K!q6;umW8g$22?$L<6pDZy3n@u3x79$n!y* zK$a$Xd#``u`NdJa(*ju!tN-&&ix42EwY@KDfEmlsSm0U_3W-{fnamFE*g0^@p_P5W z@IuYu)msS-U^wvH0!5Cie~F=^iqcPR``lBQ7q<|=Q&AdmfYr*n9Ra^QHd`Dvup9mu zi1ja)TqngMKTVE|MCn^%h|y9(I?Eo_-D5{Id>3n{Yutu)w|4KRj`DY z?JBUx;DPJF3a0wsm#=*pg5=`9+s%&xOzL`1)QF0%|CXx>-hF@TOF>}ib}q_N`G^;w zW0jq1Gy>fdzWr;nVPK{XK!>zVE(k|3c6rynVw|yF&|vb8g1ew6H?;lDGYQ6WHc#fp8^2+hF5yHSd-c7sCa3d6eUrEj> z^>B;nG=?r0NAaW5D|%f#25J~jJJi(;f8WDi4;f5$g2U+#Cuas{pZXokdC0iqOO_Q5I8wWA9`kA2wxfJ1kA6$kP1{H3zB2AymDrB3U> z-@RFo9tB*h5IkW2#CTvDh(Zd__N#0 zFzuV`<_ zHSg&ig1o6h(7h~_Dus|La-EAkkV{7|;F>cIuQoDSx@x!&Qqh~2wf9`6EG)qNoL`)q zH0}Wc{H>x84#w;=diMf*a%G3;3cB}t-*QYkk;1&Y0O)E>Hj{dOKC;aHhjbbv%pvwp zD{{V~Ku()X2Dt|lsjDB6@ty-(VVMi0e=jJ&x+-+puP{rSLY94(IpHd7?^kpk7gONK z;H1DSUr3cO2PJFJmRI@4@JH)X{)r8^}I-MGD9^R1{KKu;X@5 z>YVdjXF#m` zY6Q#9zVyJp3f=vi4u{esfpzOO{M?2}EzL~Opme%&u6A?enyKz#|9aID@ezgxfwn2~ zf#&l;XS90(+^d9GNy8t!r-(q*Qe+{9RnW|v5U_{xbKe8d*AwG8j9rXbe$pkOf+x)t z4P1Q09;&U82~;`Gkr8*HT?@~{@6}oK37uLnTn!iAO1L2YGjy1tVM7`w^H3xON(&@c zaegm>$@>OX_!)(>j6$c!l{zdTTpbFVP^_xaC1>RI5`tA{!|}#ma~ZY-*!i`A$EH~@ zQLe_{OmgN$*1Ln9Z?S{02$nx|naTU`hR86wgG?(~%$OUS6m`8`UWTAeig_*iip9q* z2;t%AWY|;9CHOrlNP|JFkUYrb-9<&$453@zVU8ZgAPo}4S8W!<1(tDex&44Xp!LA( zFl9?)$ZmApdC#mVDrM^X44mE^FTL=vZ#LG}V-+lLY;$bYYfaltd^M*0QoCTa2b9$U zqCSD++1h@T?uU5vXcM;Hczu}AnULV}!+=J|skA(UYe=~-Mau`m=GwD7%;5+E`X2lC zqTnC~wCD*su8W!8MnvH^zKFF{hE03XaYSZR@<-1#@TgT8EXl&%SLY>Q0I>LqVQ{v9 z8-XHuAiw*pjT#KZYetHA8J0UCV2)?8XOYB3z2&t$2i{8INaV)&`H27uXAuSR;tWaL zwP#}DF92&6FXM=r{O7uIb2IC#Y3P>9*x90o>vUZ9j6-x~c)sY~LG;ZDG)Uc-XN66^ z^dr{imt!Caq-QlT>&!mpW(y^DcVmlA{Qz$K>ssAu>Q$w&X}I+;`aW#fA#b8>|9nB; zqW&uGvSNnaDQHf)m!^3v&Q=DZCze4^S5HSreSMVe7sUAips(3C1!0CcAT*!I?DyDw z#oircR%1R&YHX8IDXe(b_;7TI`iBA7w-E-J&ZFozt-3kM@%gHX;Jq36f^n??8?lA1 z9j6m7v;>b7D9~@79)tuAY&cHF>y7xC>5OI?)A2HJ76!rn2M1MrGC;JFRwvGOu7o<< zTLdB?747!J$52e%KTzuStJBVpPOPD%`V|9j3Tiy53}(-2`MYSoct%@Dgyf_p;!8>Fj?7$r^y?_YJt>^v0~HkO44J~ zQQ5YE8{vNQ?>??sd5{zTLXCHR0;Pe+ZQ!Y%iJ*a7RQKZtR2}NSMg6B_2E;Ty7Cf8Z zyM?5B;Zi4=7+gbkG4gnIZCIpsLsDn3v-KMZN0Mcp3NO2uh6mETLyP`)jvIqC8fs&f z`J@{IOn@qoc{wV8LX;n-IWM;KBuXzlwd&g(IZ6-(#Z0+#r99mVM5g^3qacsouj9Gi z46+tZ%}R5)jbXMcSRWXxWiHpdjng(68s9i)`6nVStEJq5I6)SWUQmje_G-;<@kn1o zG}3%%0W#W%iPT66v-1lDovWTt+2LrQ_OUBRP#C1YUTRlHp|7mXz}nMUI5iNA4|$fI zlf)e06a+pn21=lO+No&ZeLwO|r{4gl`s`h&qBX@oGT$LK$Eds|{^@shq-COphRcpB z{zr3k{xcjlg%*-=8gC;BX!tdFAior}(F&915>HqgslzoacOB)qm>1%(@^U`-#D#*^ z$;+RRu}Muw{wjThiBFV?LUdv!P;RMBXJ_D%dO89cDN2(#q=t|sN#iiThU%?8i`>V- z8|M*b_CeUFHj@5`q;%%IM9%P@a_MCps1r^4O55^#(C>Uuo51M78Mv!m^;I$o_o9Il zeJ}zQ+*T^50cTc{OYSf%X52?MZNxU=s^XL(;)VeCMO1`x)=7Lhn_B6BvMc{!JO*j5 zwon5o0RRo@0y9FvwpYUa71unYK*_T#)dB4P!`s=SPE+-@g0(lqmMWMfs!_tWzo^ z5Eh($d+Hv$0U!!ndPf;pTKiO8eO1>ytYJ?iQ&Og}MzN`RH0)S+=yBjXECY%VeEA^PiieflMn_$l2>cNEB8X3Y5Gl@Ms z+}iKs+eZo!{Zo!ZXrw`G@sU>h2DlOiS#3Iea%gxeDylozgI)cCt~{K3SY_p9*dt1$ zc^?byL*7cFNHdMAA1)2DApeEo#w^T2$B*40FTjR3aAkztSmx?35v;e)a9GCi0Y@5` zn5e`T`3H8Du;)1UtJ-Apn@mHuFUxD_j=_53(oLR!D2j3_HJ$*Cp8qCYvTugE&=apo zKKclr(J9pTq)p`*LRq@};a>hKVRfXU29~F`o+&n>1hDFJA9u+zL!Ap_v_18IYVmDm9-qnvc=q@ zlRrAE75#SNH3hrY{~+&q`&}r#`{X7F+*{NbNWp-SpWy~^d`w%brHd7ndLU-x%-~)5 zpjR^AwWJ?sLTe!iO~jOthE(+hS2^nM&-{EML_X)8!E1<5q<*F~>A6KXoz8s7*MObv zltLtyz@6sdBU5W&$oH~@^N6*6^MDR*v>ySYc@xNUw-!4KYVk?77KLUZzvo91dhg0> zlzd*Q;Xt?x8%?J6f05Gnee@_5fXgNyiEqzNp&Q&EMB|DBd=vp9KY?!G&2dG*JQdR2 zi^xTD9Dj(XfCwm}F#6CIFNlVGWk?Hi^!kE2h^Oa0kouObSRyG``oUYh;@9UC-M+Zc z*kV4PAX*Ze_yQKxMtlVTS{xadMS(Z0;&Pc)?@3UDe29f22ow)K+}H;Af2##O&&eVV zsCeLrgv*TYzh}dN*jsS~L+TNubNu{bc&Wv~2$C+j}k8$11-`j*2f zr)rG_QhlURgq{5V9o z-z-0u_LQPX`$uc>Zx6D?GH!lQeuMw4M%z{0V~`8oz;dy1`SmqWvx> zY3=vqMk8N81s1i;qsJ!E>ZIuS7QS@bYMMwN?ISR{R|3KSA~;7~P3s#^2gl$6u{wCt zRTEJ_>wZ3JAe79Gre|WyHx)}uP9KaC{^7+kw=VA~oB)i@#kIIT+#$II$5wl61YKzz zO)h@b)(b4};E1BHmO6%f1cQta0^mo+rqNwX60TCZ|0$GuGn zRvJ2L6x~9;G^SH8PGItZ37u^Np6dOY9y8{k_XdWnB$)@ohIp<|)^5n&WL@wC@zWU- zDG?0-Rux`2q7e!F^i&>b-1OId88oLvHUdv@A#kI9^#b(B1Kt&zvdx)O`Z9U9lx4$qLEWCa_ChO z#3sLe;o9g9p){rDR&^K9rTFnf;xK=3vEYwAZR1+Eq>SaA5GXAK>{t_oEdT_y-b?13 zUannzsUV0rpe6wYtN^gB$Dp_9tfr^)0O@yU42e7F*@#am3s}*FG6EScch}(Cmp6%* zuwLy`H|RLG8TABU&c3q}FP#p(D$YNFC+Xu!m6Aen0$F=Ni2pX!nLN0K*!V+Wxr%6T z%m80vlK8@@;9QN{{`a0Es7+q5EQtQzOV@n``Eb+oe3p(Hg{5fIaj<~WXSMn_Nm*B^ zoVUO@cf1z@m5U%;9}_{JIu4X5WDr;8WfK6{6FdKmt1?6tfx3)F$X1o?C_jI$`{nquCEpCoo?>U8dEA^(LI#y<}r+|zSH1?Ii_q%o| z*U*AMmg)2KM4jv&p#PO#R+Hax7au~n&3Jv*N&~Jao=+SjGXb4-ptvS=4b1~@7G3#2?7^f`E$AO8YXITo7%*PzBWq5ut-v* zES-M@eRC3hqSMB(M{|3<{=Qx*3kFV<$qE6OmaySR)+*5t^AUc+`+o=zt?##!HBN!J zhDr+O`);$Y*vi(`O%iROwS}bEMGMW%*!z8vGz^oi6 zqfj~yBxAXg_tmV;I>G#RhY@D>+j*^H8q8JWZF?f2@L=ru=;RWg=}94LWk-Wat0xG; zHB;QxEG<_)Q0fs3_~S+*z5x?c$v>eO&%^6yGA6aOSjCYRbQ-%zqVDyclZf|W^;}*S zLsti@RCfLjq`&`Cc(*G1)C{N{4@i-__Z3bB7xeh$HrhQr+L}6U!RL{x6ZtsN@!i}w zc$w%U!-*mNdjJSHfie=MT0;p+*8q0ooBWkvwrBSAT}Qn`51rdX{U^Ier~z|Q5o{KO zA(X_*+CZ^K1;{7F@TTTze`9fL;}uLdl?yMYry9aGC!&E1xNi2textHeVU^Gyq^4Jy z3-SEE7b@q>?s{rm0w($r6FL+}XT;L`n^~vSFL#fBRCoK0mCj1^@T!`H zgFk=EuOVR;31{jEeLVK*2$tdxg8fyCy_uLPnLn~miPwX*G>g5K`q%YPcimSd0aZpA za;pA?TlK#iGaawnBkT2U5DmIGP})~+khxyZUZs1uz7eOkPL$H<=(6@b0&XewG*hy; zD16}ME(bxwD^c3)@=XGn%ecyS^*%afv$G0b3mQXup`RC<>QzavK7j+n)YIVJi5sy% zG8Md7fT_~7v?JHneCt@mWO+S(OaNMON<7Rb1YnsDDM`T(-kSIPp$mONX&Pg9ouex#fGUSw|mG4Oi=QCXy;%IOQ zK+n!ScV9PP2B`<7+gox`x(lEhg^^12D|ibmRSV+zw>*9ImWSVgfc7Fmu; z09!(!c83+kgu_pT2^t;}j}Cl%0kj)%F#!B|mc-N}o{H6er|BtR0+L?FrFaW-CgD?- zvus&F-(k0pM|0wS`wK1Yl{EtgaL$j^M>QCUL08WkA`ws5JBCgPh3cxpDS+IITuHZebQ4K6!{*`nfRb zl(${fh=`5rb)eO|ezqVn$h~Q3w5|Mr4{yaSfTNx~_h*8BG{9?j5J^1g1%e>XJON

1Uy#r(3yX_6x<~XNExmxV$V}2l6QpsD$uyb29E@lOD6*9%Csy@#i=Xt(yg3Le#5z zx~(@Cl*PqYOnX%Ym&WHl7Gc5Ew~*#Ran7d&c7e+9c=4^XV0hvg1Kxo8{#qk>wsES? zw)Olg0B>~mqLaihGvCv7=uKD&InKml3iJD|$s9aC)KmfO70}0#MZmZl6%K!(Rf}y2q*=IwbM9_{|8C8!;7Y$c@;aZ-mStQlj}~O>zA|)>npOH#(!~v ziJri!?Aa%!U81xXN;C|J*-brK@7B)ZYK%Jz!1?wu>mI8PEfk(@($HiIfeU|ZN)`G+ zC2N?(O;2ZsUS7?*F8XYhF!AE{K1yXUcJ7WB$8DaL+9PvYN(Z>|M+Otf%s06LMx;Ti zC@R*;SxE7(>RM?Tjx>JHt%5YyHG%~Vn${}`L+iiK`vi0)S3fx#u^7qBbP5XdWNFNyL1Um3odC;YeJM$G( zfdGr|=%GpKztHsx%kMZlzn>oJsDwMC$%x{#BXMrvbbGm_!5Bi@6A#i{bTzjy-m$#_ zpk1{I!hGc)0&qpEjriLh{t^hnM-i>>+I?5!^KCtW_Hwo{nbd>>bpuUT4(IZrwIHED z{kEq-tAV)(T4|T$ihW?+SSVlL3#O5ezECeHQ1zo~B^!dFG}yr>DAD_oFG3sL%M-)+ zklso*HD*U{-?)4fN|+EdpS(8qL~%k08SaYL=za$*P!ubzIf))GOG4C&#=+WkC&C)A zN-VFZQ-~gkt$vBNZPNo|-3K>~&W^m|(ihpls$`^ceOcOE&Y0)3kx>RyAmn{)Wg(TZ zW+;O1qdnQ777x<=GlPSU+JYPN1y^)yXqryxW*u5@D8!O|_ZqP+2@S-UylzeM z$IXMAp`Y)}JhJOBC^YYgPlO45SH;{K71gxU_K45{YEQn82Jy40YgfesENX|Ah)u1T z(f$qnO)db+8qqcCz^lvj%hklK&V3KSMVUp2P`LN@Sb}5lza@4CQ^Fl;TWHegQ5Drl zxBx?G%=T&3$F*823D`IZ-8UO&_U{ckmid{t#!uzNh1M`P?KIrY+DOlvQ6*nFfc@r* z-Ydn7r2Z}Jtp`Db@^=_>4ER=sEnxLt)y7eAx|X~yK78!|6cjWJTsYZl--Y-4t}s(; z7atHzpx}l>*iS5e050tIdjJ0NcM|bdzQAJ_(PBrQU9gp84;DCNS${o^em0Vv%P4M4 zzDA^lk%}dOiWFe12ae#`ghP8W@8hFt+f4qMzbJ(9=#665YDn1^c~{n**JS@J74_}P3EJ61mFKK-Jd@pZ8&*;U( z&^n};xp_q43!(&E!bfnT=VsXjz;jMp@6IsuWEgI_8ls@J$OjF$l zxGMru`oB4`yI((T+4l6Z)zp&%qzji?I7cyQ|7Q@NAYgRQM$syy-#!I5>SWF`oH5}V zXnor*4zQWha32=0o%`-1+rDX*dUWtET%JfUYfv|WK;DBy5rz27j}fW})kJ=TmS~Y`;!d@Oj*BYD!%K{tN4?*d42hFU^km+?O`?;E0Xr7|uGc@nh zpPgK*!D9cc+}Jf;$nv|NMEf62_DAiqd2cpzFA8yA?u6=5yvC?zn}WF(ait{w@o!bv zt|~=+(~qE>#X7csLywBcDajns$v-rrLZ3LvtKQEgvx1v-MnG$}(qu97h0|jEAi=?A zVd%X6buQ`~Rg96OY50iTNg17Iezv&BawUcCXZM>$y>u?yd^)|m5VHhY_Mo$#QiZ>x zGl*`v;9jJ9i}zw0*D0l-M^D#PW^N9gG+F+h;ZT(3<~;C#y|{=-20-RvLO^l}gEE=*VHyxBT7^ELmn-g6G4b!xFN1_^X&ymd^mE?xQeGZ z`HxkcgG_MyMWU?Y6qmK;sBKJN2TikQRnrH|#UxU+x}5x>90wP#?br0Zf`uZ#X~OGy z_q6b-@T+laV#PJ(%8;gcUs%Q2W7#H;)tqh2sv(|krNX{b0iw|BIdh=le+OKGl8AI) zO1*0SO03tMDb(OB+IZTSY{+m5#^&VeFUrDFa6YQ@a@&{QZg?+!_0b&!j68qVWB?V_ ztZN?_`(&OnmR+II^NL^-tw7VQT zM}s1jjSfl3(z^uA4qRpt)OK>=3om~*gg&7o_KGAtd%U9{AX0P$cHU@GNLE(=xqVXh zV=&2CIv;WHo`*0ag&VbupW6t@I$0cWOF(Dy8~(wYEst{1&hmjdJRFRNsEW3NY=)(~ zfC@_AVvCIp*uresW!=o&P0=POLR_Q;r^Y715gjpQxKe76-3@R~{W8vxJJ40P<;Y^nlYA2g$y(oDfr zU*1}CIsF0<3vi7My`z#1xHowwGGGh@ZCf64|IHIH!99&oHNU0bsdhFJi$ds(3nVk3 z4(m-Eu{893dx1y?t<9M@bDE&qxu|t(0KQPgnA>Gk%Z%azjOCeS8ktTc$#db^R+E}c zIKz~@15WxE^Z&@{bvn^0!T^3WV{%`SwDq*C;-e~A=HZsMc>m*;Z5J)YUTbGvEuL9< z$C&TjX+eKQYctxJx(SxrU_96I%MEj*H*oH&NiufQ%c5RySA@p5P_f6~M=oBXt`U07 zHnhq)M$qHc%E65G1?5W5-w(!nz{C^7#I{B-mvO)^cKHgnGP!DsqrgDm|8F!2O8psw z8vq^wnTZFo#^`sDFdsx+OjD!dzOfaH9*pF;&K`V6ukozOEe-6`Rz|v3@K4m*${6v$ z^HIK1JF<=$AA)d-ctSwYe6kDF8hES=I~n6f(-Y%l5Wh2Jia>!dYJ!9EjCb`A{Nhll z*2|NREfePCSHliEfPVIL$=J)ya0NeVl-nC+e@Gp<9kek44y1ctLaTS+bW25*{y#-) zX>B^1lyWU00jULv^KfNL0o9FL47Fj*1TgZxv{^Wv3~%IoIt|An>%Mfvoa=t*aZu-Y zk50`h=b%f;R%1~KcCD*-B|I6HO+o>6C-SNdozof(jVwRJV0=&qt)##!Bd4l-V(6$_Mgz-sMaf40&})0ntg(D!_-O!bTdf(J_XR^M zWqTU@N{s2L;@EY~86K16!S2UHxD4;rewQ?8{=N3*g^bik$65$(TFeUi95PTvNUh03 zWU@a4I&pIl4QA%^38JjcG@tdexxCwY2-Og)I1t$_0?;>wcT@*~igIM;;_lOZt;VR~ zAgzKN8mZJnp9ZP{0IdR(wj4nlZ;lr2IheLBDoE#$X&{_lo-3i6)Pk-YG$F@ObqsPG zUA9c$?9QI(#AC8kkac#Xi3xP2-o7Pfy;~zkw)6^$Y;z6TGBT)I5%kqc+f_Xn4LAW) zXja50uxg*w|8u_1_Q4Asga;km-A(4K7>|CTm&^rvs()&Ao!Qy zbmZsFag)uWH)+oknWKH1Ztxqb1M*S3G05eq&T`jt$J!nGM?ZfEc2H>sv5&zQC~wPC zr`tc{v0gbayV)-0G3gv^eB<=(LXq@Twi6H$t+Yg;Q61h=DS|Tg&#jUh(g`q;lQIxx zhO7e(A92EirIv#IcW;=5J^s7S@LXjzgx6oHp(Sc0c}_3Jvb@{3Ed@q}%h&v}c8>dV zQTZV-k?boDJ9JJE{FE=i^EA%nCx&i zt1S9Ui71)mttyirL!vu3o^pksV2 zR4r+GFuO@u2x4I^&F7<4@Hew!$E&00KPJ#EI;o*GSZ8Qs%cr6akx^8-KWXy>7I%da z4w)W$Q;LcTZ0*v*KnD%6iz)6;j+aU7kj%*99!R$#GqUEr!Jrt;FVpaAbMQ#|9qKos zC3)#WHMkCTH!CH!0Vn3U@vuvO#D?vXF0tQIHhiq!pOgjwZQ6l?L{;wiEfr!q`4uf5 z2~%Fydw;Y3sQ9ic@d74Dup^Wu0v7bj)aZJVDRaoHaW)XkrRAppt8&F*B@NiKju7Fw zS>$w^;_hSMi^m+4Fk!=-iQ+S@M^^MV!W;HE|s`~a8gO3vB!ne2# zPHOOB$1Iudpag9%;+IeSZlU9*ZiH zgacgxZnYP@v2_-|ob@q8D-?%iZOzV#6LaX`1k6Rz?7NJlOdsK~5{} zzzm;rd)F{W|D$y~8yr%?wXfjXOno-LeFEdRoSK`sZ_+*SwA_3`iM-R$+eHm|ZtfGa zDhtRRH!utanW;hbE@750JnWWa$dr^Lhz;wR_Ymy9G6x?kx7c_7?U|TVk7XRlU0ko% zW+B{c<8!dYGV^f)e_3>K-1t0qfz%eRSQBxA*TxF`DfXP=R;R|+s4CE;uF)L3ceV!bALy_K=^g?Ww<+FO1Lmja z;8ozg}_MY--HD?{U5(vZ&*+( z9S6GLdlro|@js>=W^C^8_3@-RD0S?d>H-1)3qto`$ZH7L0*_;CC}ItAen>p&*gCpp z1(zQfNyF!YGhSpZm&G7uM$`b#@Ru7wQ`4|)9E_<6mp)cLRxw^r^O2*Xix((*5#Rn4 z`&-s8{I`rS?Rr;mA`D8AfJ%ZqhJk^CZ$P1r#EC~V|!H6)1TnGF~L6?WXLE2nYLLV)67Jyqac#ZO^i2>P8y~s9NU($k_ zKx=w(*<&os>V3D8>-KRch-Q$AG8|TmW4d7GU!oz{cIKi_w2v2-!Oc2lG)vks0C>@w zBsk8-KUqGJBr{;8F~-tKJ+qGj0~-fr@4p`6f1XX0ZSQh$H4jK6JA!dwrqJ)pD0<)R zTRneEx0Xwn=e{(sSPF?5_D}h8q-gmg&8aS1P7@p_V+_}FhC`_NMmhzmdA8J; z!KbD$){z@W!K35uYh3XaLO$PN)HM8O&*bSv)qTn<|BW`Y8Wh_!s2k@ZkX2NRb_Yww`G5I`PrzjH9nW z^-yJrX$hWzk9q71t`*r6p}iV$w8e)IkDFe@q`95Mg-Nhc%(`4gcaFb;Nkz~h@B&8+ z?umE@bm`H3WWc`kiYSUKmJRDS6DY)>fw|tGa8f1tqp0&7+)g7{>*mQJ^tjml4cAr; z%>rZMIP>N!HEF7zAQ%C+^?XAw9<)wxQ4IO^?du=g?8Y4)1*66)2fg=Gj~qUC6c8_= z4}7v&1S?hsyDMTGlto6+mRONo;e{DgrH69LZHClO8tM@csW9EE#xL(mFFnqDT zFmmud6v6|Zti9^9s$-n@*n2GPm>yLq;A~_Xvj#rnQZZAjM_Fp6u$$fVV^3o4~mpWKf-Mjc@Vps>1iqiG~q&rOV_Oz z#zP+~e^K*se|AzBjY-VVNNv(@z)hEMr>cCGo{<++G%r!2+7E+qIreuFSiyYoC)u}+ z8b@~@Js$Pjx0*090-%xq)JZl#I-@CszPa0sDUO-rB{(Sqe)XT?YZ+%Qh>j9k>le-n zs7q0IvC|zrHOjb|aT)Lxr_HP<%sdkp`{wYao)co5>)=(-U|^b=ck}V#Iun6Pb2CfO zc7vANxg+u2fmtc%0m*pw(8p(w-!g?52pX>2sV+F$vPWFu`lyaH^*+P#Z6B-yzt^MJ zeFJC0Y@uFSrTIO&j{U#x#31S7BkuB>zMub{aQ>%2orZhBa6Wo8MrsRcVkot>%7O&; zAL?$#gX|TXR3B_`BQd_|)M%q#9wZ9Jkv>LgR~HVK->$>9Zrcr=rrmzPbI6f_Gy~eq z_AQKV5aj ze~ZCD#$@)^wY7y1RtBZEJB8=gWHaM2V11}q*k1SKC^~a}&Wq~9@DSVb-B}U3pAk2< z%L|4|FnIs3lKE$@4Q+0F#hvFv9QbeYpf1|hr8{RG87yF2#vtQAOlMq490uo2qEg*>j(k2Gc2N9kSL&32^@PIt^QyvfJz-i>NjnR>{OI6{| z2#llGK*wrJHk!d7S*L$qD2RjXW9J!=^fb`m1T9-NW+~1(t;garGxRcq!sdEC#u;pI zZ^GJ-FH6F-VNllQ&vjIqHYVLklgUzR2-!MczQwFMFsnYbK4zR$DA1>VK_W5?jN?X^ zH_z|?*sTTaGftoV5pzN9st<~>LB?Z2)wR$HHoCPXKovtoU}q9(0iz(YOB}EP`+K=q zL0ra`6}W;^uKL*UESmqNv$Chn+WGi4}$l$nOe4F3ec*4@?_kbqa z!)d#n=msdlInKksq);qY@YQR#ORX)sBXd1&d-VndnnB0FSIRBa^^CT;iULG!F6{NX zP&5;WmzPo1+49K$QT|vkCqEk*rl)3kAKrWCW)>hkCuD3BZ-@Dfp*kGE=EK(B zcw0S;r1@02X9*dO&%h-)Z*M}y_J}^e4OavV7p}*CTaJ#KcDuL|6;a}A@b$^oLGEov z1040Z1@i6bG1FM^=B9!Kq$t~#j*?%3mp1Ev6cXK2-{}sjf6aZGg5g0z`Gnb{oT_0~ z!J2HPz+$I)jXW) zd&`^*Qp#xJOJ>^X(z)4x3jw@?q1U%Mx@hO|GY(hD4xfTk-)QL!gQBeKi3=@TULe>@ zBS~Um!|v&4OUXz1>diU7w?_^_Xrl#oxWfDl)0fuT42fJwvUmyG^87 z$XYLgqR6h4cJt#HvV)+o;QW=L@Qi{1fdXe4(%tEkGM&eal}QygkY}yGBoB_?JG!`Z zZF^GO6X&bvh&i`<*Nz>ef~iVhwvRoC8>tr?q+&0HW7`!i_y7`1It#~=3=K=O3FW&P zP~3J5iv>Uyc#lDxT>a99gV>9|p%>d^^#&E}ZRzceT4FdIP_O2**(*j5Is9qT#a_gU zXNxaJ)1sP88#~Qx^V(M5f)`565vy;E>^08%F*fxtrX;W6Tm?^+u8nuXSl4Q-ZRbmy zb468qk4b}bDcc6rkqM5YzVo`*8G*ncaZYXdDgtuDD-GZ2lhRlKs(ehC?C`p*fovW4 zmulZ$fJ1)$(e#K;dB2S+c)tMf1g$4xA(xPP9VWfw3qCkqJvZeS?sU6;sdtP*Yf3oW zqNhx1(Co2#I|6#E;TeMwX?h0V{s+~$7jLK8Bs-bIdsP}e8)WACTsBi?UoenTpeT1? z!?O#iEeerG1HcGvqRe?%WLP3-gU{x-3pn16EVBPahG5DM?K^Yz%jXp9l`e~<1IT)6 zZR-Mfugv{ui)~wZ<9OBh^${>;qsa1b)T|>nVHYS1Q&|2NZSNfwWzwyW;y4COjDRQ@ z5G6+iM4Qk!C?cs*az+6`l7uD+4d@6WARt+wp;eM(ktk8gxs@CQB(~(7)7@`_GxMEu z*1h-q*1i9@mUQ=9Z&mHu;n{mX)lS3L_iurP_>yH(=zHF9$J90Ps3d=jb3mifV^l1| z*7FohI$6<^H)~E*kl~33)Kyc}JK``-Em0>A{Cm$KnGP6I@WW9Z;6;0aakJ@E}zOIDFVVF27j(;=y;2r;}ss& zB*~(!$TA7=IEe7BFUbwZ|I`Svq*3d99cvs_x~e)Fs};?nvewKnTm_kJ zBsGyppww!VD-;&a3+R2UYWF{EN839Zo9+N-X|BjbKlZ2#EsjZAJ)ab91UjGAT5p2q zQ_7RryfP_3h|0d{?4}vBk;mYIDH<~RSQe6SEH@S^dXFOM*j;aAhYAF3yn=|8qt3_9 zL~I_XK9d{r%#TMLF4BiL=eDtnra_I@U14iW*=ok)|6M?yhi7p-dd$_6^FTb4yWBsm z27xKRN=*GbnT zCr?amI`27aw^uZ_yKaYA4N7S09)`hpY{RZ_{1fE;vti_|CzChq3c&>=PTciMcS5Is zMh1%`^lkxsesUau)|0!hKd9htN2}X(qOc279jR8J4GIa;pPLQWb zpF*UJ5kkr~ht{Zg5l`n|K_R3xAvM_Ov;xSj_ zSosAkH(jY!FN9P^gaOM8SgW8Z6^?jmjR#;1fvn}2=eKFU1ul=q^Pu5s? z>oq(uC-95Rgz#-&+^c>(e5eGy@xud1-n1`6Js=UpKeM=frwJI|ekW$rxCiM7Qo6U1 zj#u@~5kn)*eNgh?Pdb1A!pNGJkrsx?@#GgHWYM9GJly8Q!Do3Tt5?N^qEFCU^lr~C z8b`0nZAn~?u2IEdNYhu4?&_W8Axjh8>ltpAVIRnaY{Xe^e_3SIrVE%ID*d#b{cY%X zXdXw4p&=r}v*2o=YMDI7Za}J}3wMEe!$+$n?IV3!yN~@9Yc}x;15JXj^d8%L#-xc3 z*H_5OBW16M#F5_|0PSF6{%=oe<&vQW5kAIz0;}h_N^XPRje{Y>mTixsXnD}+*v3x6 z(m@?dr}2LoDW3BzO*+LZ@TT--AMUOnf>n7vfrE_2$a}pv^;{&Eb@{>S=<`r!&??ERf1*g685Dc;54miX%Yg^25-4#7^!nK z93S3|b$5w$@`NZRb?AU@Oe=@@Qhp8P)e(Z2xo9+wycZ)I`FG#%eFOKoje@M)+IogZ zaNp4!((ck>JZnV$PbmOH+8xGv;`tv#_c<)T!1g;esO@hZqj+rvI1kX-giCz_3r3y| zlsemy?htx{8c#&1+~;ro-!cQX>wTx$Hn3O8rwaO{IqLdcha8q0Kh~@<;y&AguGLR_JxBWEe(kpj`s>tmH|Im$CSND08k0S5g@Y86nj18i(RqGunx6 zTUG;~4pB+>QIn-Er6)`$z3js1rB`SABU;Mpp_T@iQEbkw-~p1gST1QbIBDbh;v#wA z%wja#2?iE{XwC{zr8@DW804N5vz>f=>1uE;X z#$FKzQoKa#x>3P*fpf2Gdi0;l6lbyarlzUtOGT8b*0U6Jjdcu0$u>5n>>wn@lkrP( z$J~Io>4G~GbDC}Z$*EeJ^&m@2g1yiR9x~MP?*kvfzbAhSK#_Hjanb)kdU#9ze7iZsyxwE+o&C{Oa=!3;snsEgwR6cb2B1Z!Juee7zn~Llt_v>^!}}P1jROVN z`9?~~1Fve!#q5ttWxm>-+TJzN zO{P1&DC0I>6`X`E!?26VyYH_TUu9ij@A7v%n0d(jooz%HDd9#FZ~0?Fv*X0s{N?&4 z>s=v*p^(n@b*k9&H`RuK&L~aqg4}IrgXki0-^}4I?08;}6avhkBKxtz3QLJZwIp*U zVc*KFN+mWoc^v^R)vnm3MC+r8$IjXuIw2DS<#v>SPv_wZ)@3^Me=kV)jL74g?Cn z%b|%Vg#>kmK9jshBtP$4j*o9_L`e#Ji&`NEo79;yIwfQ}oFt>g%{ zt%qcLhuuf>lv)4b#J%JRAF0~mX?&2Vc>n)~r%~x|p2lWU{pw$ILIGs3(D;LrGcD7R z585(HF(E_1V3hnjAu|ze+_-uN>)Ic>ix%-3B3;?#0yI0CSG~#7yLg!$`kxrtV=H>Q%fi^vmi5leQaKu;g>#g22*#fUQ5$~o>l+r(qXw3p|80f#?Y&Xw%hug+V+#EpWE%tpSiCK4A2nNv_k zcsG2zJNAB>$juA#h)&{(;CErr?DRU@`ng4uLA? zE3TTEQa!!&*@idb9>u%N1O+(c6eoTbH~S!d=_WKfOc;M|s*PjNJ9g~8NljQHw>p z#QsJjDRy3QRCaz)6p4J ziAhOP-m2=3dGqZy=hAKZ?X^>9J#?)^gt8m!S72^ADXR+jw>@Y(7F*SuihJlv2+Fx+ z>in*0lN<#b_au-H%%@;DFw-&?$nFK86Yh@w^gKe=Ma^v(H$QoGao~i!@_dTJq8X6`K z(>*A?aOC>Yi)~y7$O1Wfp1ro@0 zO`kc`=xRD&1)3}I<<2=5K+d^3h9RtS)V8yZA&#sF*0Fk9oN~7a&ISHmWF|#;*LR8M?`1RjjhP5mxwd zcF0}KOJrvU@)ckQRJR14!Pc@F?w%L=FHL%x4`dFI&$)RtF)=s_2b9VDHiMPxQa}wH z5)5N0qJs1iabrot0foQGv~y93;89~%rEKdoTUU7|G+xxnTIK-bjbbuY8)xPrEPN4Kr@yw(0v9+N*Chw!l^&hKwOTAuYQDkk-3BQ|Gmj!2rPkvoR#e8N*vEPwAVRw789-62E8n3 zH4x6~rc{rpL~g$9R|ev^nOO7#ZnxbrK8!N|UP@611E7VO99(&91wmf$918G28o5czn0DaV2;cvq z-`5FBF>BSIU;k-mG6AhtuG4OhQ3jTrTT)6f(K79<1i$+0Xq+IF<*Df&0}+KjzPa}v zqE}G=iVC4~cc3Nu(!ryarP6WoBZqm9sKwa7h&v2Ld7GR+4e+P7)*)HmUny775?duZ z%rf`~-MXe6`mAq5ynbC&md8ir{61gB*E>9@iJ_Zosow#-AsjXS0kuWWS0o4mi7Zew zAYn>z$c-YF;r_d`hIfY*!A)#VN(l5T=+CfzS;NFVlbr_z=8f$2SxITO;(iaz$%{b3 z8oB5&d_WB6FRaDFln6_?_V&SZ&P5T=<5N)bQ~J7{>X{^u@7cp~3}+==${BRuK)dRh zQVE%MeHUdTA?;$7MnfSy@}?uJ_`Zh^5np>Z37Xk-$i4L32VZfN+>A!>jrW9_`riyQ z1vT@cR}$N*5-vvFR&hM)=7gKb{(*&ts9(`Kp2gvIV?BES%ks6_EP+539y=P z5zg@5mfE=eig<&M2=4dmY4A?Zm4KJRZ9*S!&@mN8nyjX|V>3?pdt zPx%7b>EzS&tv_4c5yDB=P$A08gD9^n@D;N0-bpDp!X2d0KOLbf&}nK?lX5cs5t5TZ zurXwHp&E1VU15VIR5;(2rF##rFoEcooyEtofZK9+D?j!c;*Z0ZPYZ>w{VMwuUEVNO zD-cB*UgR3UD-@_|JolcG-nf)>p>VYbsp^I0qu0U~5;h99?*R;A(z_k0m#Tddbi|QA zN1@;sUbo@Qx{Y^L?974Z5wD(RHT0uE@?oJe1NzR#YkS=m+g{mV3r-aM0l z(52P9vAe^-q(`HFC2qLz(Bm2t>I*w7C*;`g^?6at%>?rQLGFhoMr<;&;!O8XVO7&? zZ~es1$vYg?^o&3LGn)me9rNW+P*XdVVrRm={+Qp!})0f{k{Kg3Qm(WJtfy2bq zXRzl)ygH7tuWOf*Pl@0_lBF=O&L;$2-)DXZ@hq7ZSCost(cOO=$`;HE?{H62O_eR9 zl2wFb=1{);Y*x#?E`5t-0Vq=m)q>hc!k68(QR#kKJw1VQU9N@uh5@sy1bbwTl3lv6JHp=-~_kHzc*-mr- z+AXfQ%+FDMjszON3njnLyIV2JI~=(3r7A)d8ZZnIFbAaa7JB>;g{p|K`b9z}bsQ4Q zeBd@#6o|KIwEE8A`_;1&>OcFgeQ8KW{7=v;G6yK03kXAJe6#9ky&LW6Q7qE9&$m#T z_{Ff%Mh!l-5^DDoVm%R;@g?4^J!vBEA8bk+{7S$(u^kU90$GGRDzmotFqS zOP^X#(g1p?USPNWMn&Ux9yXn(uT%u7n}SHW>_?XNWnb@^w_hocJT%DZMd=ltSTX)5 z8$Zu$vp-)daQGqqCkfRL+=1Zcq6@JtZ;w5#A8ifCi@4oC-{!#I{i29t!32#I7{TU# z)1{(d-J8{#cC9cTZH$S_eBaKCnlbtCZQX6$;>N^0RE-!;~c->2&FAR%=^P%SqE7 z9jbvH6}%fb6>r2PL+p-J?4-gt)aYYC`;;H6pBjx(sB0b^1k;#5NrczqRM{;RxS%-d zj(4@%xCbt2$CrZ%OLBN=w-6@amUOUh%xS$=9Qf;tfulgr8}uXVAR#k85D0@@SEj~8 z2}Ro_9-hk)jN3!@q@Ex&(yWYP98={-$Z=~*cFSt?7%!~0xZMM$TkS4B92mq5z3k!@ z!`DE5@LSMD1ph?bn~NXcBkZ_i##KZUB!mi(jQe1W5UFfl`E%zq4jQLci6ZQI-u&HB#LXmY3+R=FnbubjGw^~t=aAsMB+d3;Z@8r@HI4z39pXO(ptp>Y zxIQA9xf*XW@$^h(q@kZVt~BIvo7DLuhUASVWM4o^{)M*%x-HGguYz`cD-WjouS{lx z>V_hhU2DVLuOK;ET7?Nlo_5<48UQ*3xdNoYjtGxGgBH0L$o8#ha5ZtVB>O_`wmrE( zaV(0aFgspOmaJv$H1|> z5ED_A`spcoFt?cM;?vJx9N`HcW^>Z{4orX`DCUL?z>AE$20fDTJ+5(^gfwbk0$w}k zoyo017T~53H+Zj@tS^j;NY(ev+MsFT2oLANNE4ag7}$nI-PnLK7?B~vM(AD@^i+$r z##5s?xbUk#ffXIL>AoAAW{rLXk}0@&kz-HmevMlQ$1{BqG)n>h1lc#Bn|oaI)u9B9 z6qW_}63mB_Z*Kh5oEwhVc~M18JBha4QSJt%A{y7#Q2E5SaQ`wJ)=U6cVWWJdjVkJI zAx8Ok#0tJJv;imYM9!h(^vZLShr(ijL}Qq{;BCMCm-_OO{tIlEdQWad8=s@-^wqJa67{n1&||E+xNWm z0Q0;gqpPp-mI@cSrZ?cxGb#BFLuPP63W0IwAeoyOc{263GVRtyoGC-ePlGR3T@sy& zndBEai~fZ1dj*_7GCPwwdV9hh2guP%#@#tdz13iO+dGbVK^){)84F4-RI0{@2!e`6 zwmI_dUPi_AG!7_UToQqn4hxGYIlEV6nUVeLH*OM`-XK8-DvOW7| zJnnku=*(Ole0Z1;RHA$I?b&en6cGY=e&p3JV?g4Oy-t4o8(brxZuLsya6+kg{ux0i z4`G)7;D;uG=MFcI9>Dc2f-BTCLvyJ!^G!%ks-j7 zMn2L|=u!H$V->t^5XMzNm0xu}g`gX0iOWf~KpH5WnHN|NP|7RXper2!=TRncDGL0b&@( z6T4XyutTyY8;`|ZEdGgbKL7nZ$oRaP8GL(p6trtGw2CDct-K?VYcdfQEcAgVjNyCf z&*^?IvVBJ(E>M0_>=%0p*hPws>NC|dGo!P!VDZ800!aV^Tvz{ zf9;Km|N0Q^$(au!P2nwL?u_Ta|5@TWk1P-e3p1l|H9ThQ=m`4o z7&aXg7h_Ym2U717RS0mCe-d?0BW`SX7a&jKR19aglynlV^7Etam6 z^QXPWmBfA7#q*4U7EFRh*Z}+P(u(sL!yQ-mN4z<6Scu+KFya+WZE+xzd$q6R6$yW) z2pQ*K5!M^5)|U=HIAVB7Uf{_qXGxpk?|Vc#YaEQ0@CQ%=SE!O2A2%x5C5^TCx1VM_ zWjk&Q7yh}5_Bjzqt7rvY-F)*j$P@l+?vf*Uyi|l}{P$~xiRu6Kqo2I6&aO6tGe!f= zRAAFUnXzp%=otmxL8m%t=oT(S%nJ}i#ZZ^M$^Fhu%5UFZTkRETFY~=y2sH~cSL>% za=%7k)<#a2;Y%QshaEw*puzi|cf`vA2Pk&<6OgY%`{EEbIvW29MG`N<+D45JBS9Ws( zp=8Z7U2J2WYMZ#de(`v?O6lqCDDiv-^zTgsY7vnH81&TifBbe9RYi3!O+$KiwGX#3 zl$NX+fFcbMwnsKR(#>9ieSuX)CMZQI{09L$JeHkRPuXtGYb41$)HH0#isn7msCTLN zpEbPPvNVXbcObHcY6PGzP#aIrmyC`*`DY^5_62CtXpQthdda+$nog1TZG6c}o%q?( zP+YC(GY+!M!}^R&V4Fm=Od>B{Xk~V~XtvWRzPr)|I)wQFAA(&E=Y>|>>Tq9<8C*c} z1PScH`T_lcyR1-q>IKDyR&m^Juuk5Gy-+TFE7)P{C(^6;Ygz}$aXgvy=;o1y-Veyp zYMw`le{w$6SEO*RZ*)H0Q~abD$F%>?A3lZKG2`havy&^oKi@v>+A%79*gvi!fg3IB zHaCTEa!Z99U)r~GtpV770UTl8*D~6FT9>G{Ft~`S65pOZsn?~q$W0J&NW1t&bM|ftaDuq5bwWPxp%b$+E^RSrd^^o-LEip4nX3v zXwZ2=*HNZ&-OBUjMutP7%Wq2euo$RW%`K+TsnyRDgsW-xE)K?h-J zcufZ5^!86D2R3Z0Y5L3&sH^#p3B^xhy)o6us#T-}Zl#Y)k+Aw?cf4}Okku{h_$?8aD+*h*H34k9BcwJpJ>&%}=_5YaFIpmf#WqTgcn&hLi zL#ouMj>CMTMDGc*Z#vox`>qL;-04b|2DY+8O_B}7Z z&*d6hzh`(smgi|c7yHt5&u6sB+cquwc`k+19r^YwLFkp9O zcp!iHNM3g=yZiG{FmH0Qd-95Ytqjj_)99DT?5`S59gaD2Ck1pv*YHhA$s6*d(<}I- z%0%j^&s|>9Dp0yP5NN=$iXThg7@E2-dNomI@z2zv?M*ohawioM4I}%`4rZGUxLW2F z2HJ$fqnTVDoK@nctySiYI#)PL8#N{e)%AlpO*#`B#Xx{mqVhdsLq#nchsm>^{b_TX z@dLB5pWD`8oPu>JY3OxaU=OF?tN1A&w?agJ0;dOoef~&1!~$gRp&tuileg>-l}Po9 z_UhFlJ^h+H&>Lk@sefEv`kEnU7>262|F7(h6XpB~K8+|7f>OSLabw}DOk4IolCq1e zov&6Q#&l9UOuaE!lft7%LI-76@J(myH0(k~u`)!7Yc~30cSn^|gw45)z1=+Bm<5%sGxb}wR%()*sR{3` z+`RRq3*BWJlYB;1w3bo+=fshV!y6kDD*~p!7g=5c-xx9DWG@3s0?X&G+N4DY6kMoM z;}2Yr65l%|;2#w?d;| z4ZQa7&>E-m(bEvEyeT`Tl4{c?oVFs?H2+*rXB}VRj$irEzs(>`4z_kB3(z+&Om(v6 zR+QZ)@OiBhW3h~3MRF{fR%T~yy92M|C zV-|O&^OWTo!Zh1qrna)o&Syk0pwcUgJw2JNW#_~lA2R>f`Ke8f8hz@I$h~yJEa7^& z602#d0*76^P7-o@d}Py1v(Ha;k%FhR^0O`dh#W>2T6-$c(dU$04h@jl=T}oj>E)!QZ_bB=8B>hiWl zW1P*TVE2wBY+f6Qmg-aIL`*raL4|ako2!prO^HB7GP~X$-$o!MLcvWT>|#u8tlyg` zc7{2!fB{X8Yh=e^E+-pWh~wjg?uEp#^DdRCV4pdk(7UDQEa z6bXT=tsSItg#pEH!Aq!Bu`Db`N4m6pJ)|9aflK&R2-xwZZ@s-+*k^_g%M&mj95eAy zICE+> z2sBswYs^{kuP(8KRgeT{ex2erwjo36DH4oPuvNGt=sPj6Tq~(u_9;Ve(tPW(K9Vo~y@LhsQ4nr`&IZ ziv<3qRlbsFxm@O!mo**;I6bl!c(sK(D&*)LIf)npoC1USYSAYm2g*CI$bSoUQPc9u z7>BU+{LtG)xgDfxS2s0~QhJIWmZeo=JNlAdcLuusHaMA9ntqb*f*wcK6jnd;B%z6E z0_de%#ymyS=!BEk#=zm<0jhSq$y(A-eOhPXwzQp-v~`BI>2_rJbn)UXiBGmpGaG_I zY_l?PM^E}?BRqR2)AKd!b2Y}X3~~y!c$Ny1`Nxu0@Y9(rtwYMbtRCLmN#R4bk2@g{ zkOU~zQ+FB~-NrrE%J)m_){1Xq{Q-8Xc@-rKoIZo*#T}+Ju${6#>zQq&a?O-4n+hAk zgiJ3Yhs};un#s4X)*I^{@sQW*G>rcW7Q$+qtSA4rjVdRnBkPZNk?exwYt27Kb1hNJ zBBx?YFJnW6b0_tjvfeG{;>TejJ{33%VLvI2pEWP_ z)Xm#_fW+6*D$>8CWf{2RaPOXQVEbB&Ge-+Bhf=UyRs89fSNEvrfp&5*3}kt!EVeBo zyD3dEGK==nH&S_#3!T1UYMPhxo>nKifoE!rB8295L@#k1#9;W$w!{Le&!8PW2irdi zclR`qDM@$YSb_j(a$*7dBv;nk8|-#$etfR;+js0vF2<2{iQ~j7*1UApKf7k6z%_Rm zn-mn*wuWEPs21OAec)}JbMh=o2Q*$jW+i07HY!bgKLl{pQ#ZD3qj)&s@|>WQ$N3_8 zndD2NkodG&i*2aktc0jays-4eDdix8Q-=svQ+l_#z{u<79=#hceUMFbE5y-WY31=? zWsAisz9}{a?@1?qINbPrbY#{7Trt_RipMAN!{HEnsRWwXX5{c@2|-zF4C1SMNmr0o zGsIIuJn<r4@Ih$QyC{?n++_Ub2xNDT@0Q@fe-GOBxje8v5b7~>0gfTMMET&^9~rBK|ccK zxa)rc!dCd>{UfUGn|&ef0qi{1!VXi~D+RMG+id>R?gVAF{2_LjX76?56K)sK=6T|A z>vx1#XM-hBN|a@k9wiyyvkn~y7af(VB`u6#y&;^W4HJYBow_fJV&66P z_PTCIzMe??Qe{@Prd4+%m{1ZdLJ+!YYWEsKmd2IAPU(Al;5}fVWCA=Cx+#Bh68zqEvS&%@ZPen_YGNo-wZ4 zT5{WHV=ZZ%#8Sy0FNr&qFuT4Kd6lw0&Lj~%?%|HHPGf~|m!0(>9Fl$C`T*V8-L0T~ zqE-%x{lNXT4Vyn%jAkUzAUMR@TxKrvn~@(_p~qs#Z)k3xQYy_0TKRn7(gDC2R@i@j z>V|wG3!xb+b?i93>=JrAGII{a1c&;_+spifXQQp6vdKuW5}#z&@V{VyW@G<(q20LABe zO2*?ZOXfq^O5o@t`mv~8P^^VW*Ww_T{~9r>U^y2p=}G*8!(lSjvX}P}1e#1xX1Pkg zKbiS6Bh?ZEq~h!Nh4wv+XEvQrez@?lx~ydT(yVnxfwO&10p@q7l_nTd*#)DeWLwC$ zf*-Z(Iq>B5%v*%dDZBExjMPm!e$v7yiH2~(Wokk2^JJanncgAn6Zzn}5kB+j!)Rj} z0r5TeIQnCdmfE>>iQm(<`pww3H?F1`OOAxkEGbOf)wKd8J7hNPeis%VcHbUut7*62 zn$DT4q^~IOC(_TMRYL&+$(cza(H+1wzH-4-FZX_mp07o@^^f;QU~U?P%v35U)M?Db z@wrtvB$BA-HahF%~b)Op9mz)G~a|!&TPp zHo35ZzIp-JCZ~bgkFuZlj9xd?Rwa~palvh-pJZhp2iJY!*c zTNb`tl3D3T82615y?Yrh&Lj3b_}G*E{0W{e`JSQWzqMkB`w7p&SMZfxv2E#sD>MeU z@mbVfx%^%i8I#(nnTb8V|XbKJ{#)ZO1hg>b6B3_&82K7q&S!TCf`EloGlf+M@jTc+R(3#_jm~Wl=ypT30VZCz* z;Kb*Ipq}i5lT`nGC?&O0M5nr*bPq1*EMvJFsjT1p3cS-id(Q2-x{}Ezm77V@g14q@ zkxAPVX!Hu*!)ifn&ZUi%?(?W;0&|h98%kKM_h}^JsC!qK1TlCB`@CvoamT(U5+Cyx z_{=@8==dEn_X24r3P2CEETWR_07VLK#~Zu zdcC3fQJp^d9rCNM7C%N8JB#Uk^9L$SfOPb5CJ#>5Vo8m5hOd$Uc{ob`-Y@L_Kt~$! zv8tPa^*B;0n-KC3^dwuj3>`72olgDzeFTj?@KE+stlq{Nkn_O3ag^=TtwkkqA%=Em zz7$csUR@hMR;$kRbRz(t(5O3Zr2eqN_GrRvIr+A@I7(yIDpv%q>xrsYNiHfC*y%?j zdj()&D7qI>lvPdNjDE(rRzYD|abQaLY6Mma|tIyGI-XZnU? z{6K}?QPuy#y?wnMZ9F>nUe&O%BLw!58*CX>cmh#lOxXKqq|>;!s4#&>p|D1;t}Tj4 zdBA^KaV5qsVef8>=B}Z;4q&K;Zb4*@VdH!9LjV$>On3;fif>sYm;s|<1U;L5)Sf~A z^HIU%-F3WvKv$QCaz$2nnhVCHc{QI5oc&w;>PXkFFkIFBNpYkFKMwX@oZWwBf0*|XSL)+4~xs;J;#zC&T{FPUq+g&bPzm=OD#R* zxd4TLp{3<^Wq$(#FF|4Cy@No9-!xiX^K$$sR6WB@xBf{a3u96XglIQBM5PHz+Lfxg ztbB`I7WZsq!dg{IRdAOd#KARY3qKk(e{w@3k5;@7J)bNrbgRl%{QOZIMrBZ$(&64@ zd2AAqQo*_=BN&HSRCBdiz7!p)9JltSt#{j%H37C5qg7`?-F}S1NcO#f2Drhept1Ml z-JZ_Z$BPcE;-}D#%S%ge(_cg&QNs-7y~<{779~e~Rs7M9gYM7+vd8A=jj>||9tdl# zQC@pjJ&1$)IH%ONl9DwM_|VZ76-%WaD1czfO$pcfu{QOJHIGh6-BtoZG*}j`a6Koh zt-pL!DJYG4Z+Q{-+#18mlr+`$T@g2qp8VZsR2Z~+-FAdQH98^hcin6+6`U`=Z=EId z2yxTx@EiTe4E38z)W^b+5Wq6;9*_OLjQYoE&;CCH-;hF0(mqvHwLR7SvU*!G1qH4k zbjMckbmQ-{k@q}n8Bo(|I5H4d7jB^6Xd4Ay%m3ei9HNZ9kt@!IIZs??1$!~C3l{luS^`>^4Qt4ZrMQEUe5BVrYBiN&>U$9*uU2W* z5B2x}fW7{hnty@AyrY>*3N0}^A%h#-VBwrq!IC5D29e_`>qSFXFHBVfUZtW}FvbbB z_(X}Vy)UOL6=$i<%IYsxX>v#jRi3UQt=CArSe!8jBp=h`?!&JZPr+a{+w=f5Hh|Ds zTPlN~n__yS4IGxu^SZoC7Eb}KLHhUR2Ai@gmiIZ^Fi&43$hBw^6vyNWl#y_rE=+qE z-`b1Aj26dft&c#o$g0?*Gch=Nxi#Uus~_yRR%V2UzO+r)Q<3CJ`lvd8%u&_jv z0D204_RWW|IZ>y##&bMep|k)!&$TyLZ&MMs=KEe$f1jgrTQ?3X*>pCmYr(sSA=Ve- zj2l6jfH^9^EBTUx!x*s*#ci=&mVKM2j^P`t(fFv0yhY)kGTi}HB9|*n-;JxN0ed2I zxoT8dHafwvy1|H%#h#uEqq#M&wIQ<=#i1*?dgul67C`^mecsJ=`fB)@+gfGJI2;$9< zN5asPRwBgu z*vdl#BW{~V7V=TR{mNDF3QpFgepS@fW0sX7 zT1P?d1S}XbZ9`P|%4f-(RA!L|EC%-*jpjump13PFD>mM5c(DMK&=i%PhJq3EC>4wZ z`rX|*K5>)%Ak9zL^Q>kH(sU(bgKv5c!N@yx$;K9bjG}V3ff~s&rKJ0(tV=!Qs8$;t z`Y=R!d4+1^CXBG(uCNxJGA>24p&Pq8uVjdNS!&nc?JT@+qeD8tcVY`1%X8F>0 zo5}n^$o%Bd%&~G?u!$TXC^E@qtec)3R(cW7F33bp_C7;fY_5ClISHLq_vjU5lvJ zf~+OxDz~($%s)zOlBke=cO(#~z*)^lHHELP#6bV^O1EY4ImT5i$<@G?L^3OxAFhaU zn_i0y!tL1@SScHzTo40Xg3vw2=vsl zPXbSK*h+nWkUPbnra}f7U*A_WYtV!Qg1qLT+@Fx8K_9;SQMJ9i=!vP=;n^?A{!zQ{ zq(qosicHV78B!4cq_%d6+{i_)ua~PKoe_7;Qymd}B-MPkbQ6{#)2Bw_#tdq<(5IVHnW%>^1iu}vnhsVl=0H;>crSGhJn>#HXAU{^XJ`=_RddiaeR*)j68C|Ch! zUN56l<_D@%aZ4g9@XiHohG=E&R&k^S{KRhQyqc-PMV@QWm00&e+37X4(;G_(Gi4 z8``ff>^*$oUo(D5M7hp7a zj23y`@5wV|dS~1^Jcys%7N!RLc>^EuZq7t$-Y5_~84#FC7VI?FiO2+C7R|brAa=mX~=`XwAN~#3=PTu&$aV&c4=d%H} zqqtI1XS_xXDG3=f1|+%cs$Fzhi_Nj`(=7tXv5HKOz% z_H8c?K^v{aROkznHv@89*&hp>RY~}KG}{ayakitJ2q0BzPbOKHBa+-{v66?_no}UD zNJKQ-q2s|ft{JUGyYC&boPPa**A4=`m?d`(Z(^$^e|xb9HhTO0NrkIBCu9Y`A?mcj zJnK;A76o0h?Y&{VZq2R9FUlzy4|`Ghx;h1bZE0MF<+eG~pr8q+7})e`xyaW5qyv z(;$z0rnG3U#E7z*S{$R@3Ie{9%a$}dJ553TjPSGda0t(wbX!f}1w!^+$ZwJcp{|T4 zVbPmIy8Soi+UcPjBA?k5R9pL*6U+BQ-g~Xrr_52!?rB~Yx4$XtAstVo^cO2O7#$Uy zt;btM)A)2Dd$RJuYyFO*`l!gAj@TKljD6(xQ*b|n8XXvC%Wglt^A?B{^z&uITetF@K~bBC5xCYN>mkzcHn0m--K~5X(7ElQ_qIZCywo6 z>LM!cmYA8y?W(rqhcbmr=jcfGqs;GCr0e@06nA|_PBz*38|(_K*AVgGKuX~}&4kIt zbmF9WCfv&-Z^y%|Ly7e1M6b>Iu0|e~Z6zB9s7u)h*?;;r4`@Kwn|9q>%8|XXE|`t? zWl=S=0v;PRsAO42WfjE=<2==pn5HSsU-OEPM~4$n1ze-3dnm)<+ny&(wv8|^yvaIVoiPD0kQ`U0Yt#jO>oXPD~nb*)zU@1df!hvKxoWu5B_nLWo94$;%CMI>H^6e{^-QvH}$`0QuK(j4TB}Z2&CiGb? z+vMPCXHkeHX~D8${gWhxF0;)R#yFnCSkIYV8PZsz1&ERyGDr_OPiyz-Ylz&63tBNh z@I*1Hv!s4^DHbG>l8n`pv8qUL6*BVP{AFLrZ_{A~{Uk~w27`0FOQLhTwwbA4U;lH#fP&FX6 zrZjdGDV%&|Qsormx&ZkK93=!rmmF94@fh^{>2>^aS_yqOP@T@}hhj3%)|By8p0x~Z z?AFLOO3KPNwRWQ;F>T1;2xLrMSE^e@>(Fl|8gk)2^7(DbFuobd3KCLYm%Oy|+S%zD$rzaGji z(jE0xG`Nfqysrq4wwnu~PXqnZgBfxq{=Tlr}3?UYlLTYnsZ+IPgO#n#Ov0(pe!89ph^2N_6FJw5^8>vB>e?$+LjT5l z+!tyE)tYeiIiEqQlMd%IdXpAj@aN*ZwZ01e^ejxuB{uP73=H25Kg1%nr^3R@M)2-^ zQfUo$wMwp-Hv?M z@mV=r5rXHnaap%yTZZNYu}5`5>hDevg0eGh2Slv4f9m`XZ~KAhW!y4!`iVP{LtYgH zJ`{2Ur<705>2o_^xYAA<0S*cyEH@Rojy? z43IMUi8~kobPnQ~n6=-0lG*pF1`5TRgLWuYq12pgL2-?AQ1pJKJ%M5j%2^QE{reNY z2dWg@g@|Xgli(v8gCTR7;!JGq1CA#~3!UeXwp#M{5r4vu+Xf(csNna7w9>Hp!N!f+uFCCi2zA`>K%DGA7pe@?dtX!mhvQU@qf7ul{Q7J&!<4}suqedFZ1 zzAdo_&tD8Fd;bvE_QeN?rh@S4ox2wAAZC1xrYKc>uZ?2*Gy*g$dmR#HVaIMR^ zy$^r?&(nmbR*%S$%fH^e5r=C8e5AKFKzwtkH(Y>^Jn+9k8f1d)yC}lkSHzt_E$tAF z-{AR=H-w_&&u})h1Ubpm`DX@uuLsn?rtik>v$YXBcKjb{L@XjwI5^*Qa>>Wd4PvJp zVWyLwXA_B(3GCm`$A*~ffPz4^zKCL&u*_hK-1DH(0O`I&)&?>RE#?-jmXd5kchc#y z$8Wn}9PYZ3{U-qnLd+L5!9Wi29LVc2NWeWAd+*= zvB}v%K|xSKk~G~)&WJ<_q97T%C1;S>V!MAh+Thkz*JAu_;_Gt^A zykIXJlUg*vS-uOb&Jg_VU`J5A5Md<}|3_#6R2I}HoOJh}Er$paSAcuruW1A3RaqY; z2xQl4c_AIUXjyw$O_%D-y%ZLYt@8Yq)3o-Z0Vy$xcg?Lf5IeCeact@uwe{rwcYsY< zKB`3EA87Lk%t%m$33)Zu&ycqT61!((Qzl0oL70$)7|>h{^q-~O%|~ zZjMkd#`=}-zZ;}WBp5rZya3TLb1yt=tfh!DpICcm`OH$x2+Os7j+HZfhiCS!A6zDE zg?X=GRnqO0+7lJ3LwOa){ki?#Uk0&)K?5s$P*Q$LNMKG03qJ*aLM*uosWq+5EdJMz8>5K=sxXV_g9%zbocTWqEtBGt zGqb9!_oJoQuxK}dyugrLK8sP!L5>~1yVVt9Y?ZMALYb8P93H)`V^Rc_+hhw%b=Re= z-7?2xI0!7p4}ir$Y#35|DSyN(aDV$3SSxhzK|J!9<15N@b*1*8o!+@0)IJYqe!<_N zv(0pvM$u@XQDphxV?(A4m0cwry#fC!TuvFpkx^`HqlW3{-P=s6)=78QX7VA1gCGz< z<%Ue^ZfvBI3shxo3~7unzVhOo;9lCY`*_@f{AN~I+H|%TB0eGP{CX~A(g5D{gG5Q? zHmciuzGT?YUtMeiP?2y}f$E7z>+8FLGN+{9s+J8NZI}^C}PY@IwsoJnA`UYk!KWH7|P6 z4%OJ&LS5Q9p3XY%(!*E#_X78|)_)^ab|#E!Z2~#F#_fX;y&aFs=#ogQO}w*c`#JV~ z)Y=KlYWy^T+*BKIu{)q0@IXsX=VR=1TwGp}E4sxd?TJfFz zBi3sYkN0N_)N|sO;TupXEY#^;6f^z2(pUT){h9%MK)e5|eNw;y>r7De4QLQ>xuU6QRwuTFQjPc0b}y>3K*DQ8q*;Sq<%$J-7XvA65_J&Ql9yyVM%#bf@ zt!|k)2V*`P(NMuQ&m9!Vmz=|N9PXiL!2S<_t_impfitt;u^K#1w!wQRH!m3vH)Qs$ z&+N9~O`}JgPR{(A;(H!pohsa?QPT?s!I)+Ap`{B?j7JD8J zj^G?&XO5XvjbjRz^e|>*$}Y(){?-WRsv)&16uOMybh(CEHBCYioj0W#rP6M1bn;m~X#W!f?1plNSfjj)C8A zXl_Y|YK!eH^;b^Gi=-v<(2PBx&TTjv3VA%#3!=m*=3Tuzy_o+vF#Tk_=!iE4quE?l z@(H#ztx^;;C7R^^LVL;S(X?ITQ@|u`HtV|I0bDS$)tm_PnYs_T+;%({uzT&{F)61d zLK7a0>2M38as>0jDVgn+E9cpBFxnN@$E-#7qT1ikz9JN)LcxW4m(qb~>{!%JwtltG zO+Syz{7q7_rV+oy+h((;%|(yMTO4F3#-98HQXqVH1woF$juetB%M_bgCvZB%t?5Qu zVc}UyR*SCaBDIiuf(nmCG0eMn0*NW>Usd4wYCjzGp7uX_56x|HD0lY3jy2fijf{Ku zhTyc)lOOd7dSVLh4rJ-7A84nIsk{|_tZ~|(;{Yp0-Iap;GJC%Ez%gnh^c4Yk|9F(D zTGHLfql+m0+kwx&I|stfF8!R8blrHkC0m3hFCmxU#C4QMQ*^E1Rx6eg;H#!O(3=B^GEao_v3yS-@sNfK}{lM zh77AhnRmGadod9>tCD)Z2mj-`fRdOYzo={AKDXC=Nw1;5F?dU4-W?L?#Yq1qD+!n@x`!gWj(0ks!$IyTEci9Y#9Xg9`)ag6D4q!MiK~`|T98J(_^EaV+ zJi%YR?!(0cCROF6yQ&MnT^K-LufN+2r3FB`(9!uk*5QxLxqo5L7>~@4BRo(rO>h_e zm-zt%$B|(~@QEB79|Viz=$L{&A-4;`Qu|v|I5qRxNzB?N7*z`IQr~hRrHT+}O z{hzi3Xa2v(M9EGaw3V;Gw`*5|v9c1Nj+Bq56BeL9>tK(H)%^#NR@Y`ZPOiYA*E{TK zLa^rF%Y>YDK3Kyw;2M(0Pk^WBq?NYnrS1qRR|koZ35i<-ZS3zA9#fNIb$DGUD{T@? zfFSA#8qLwh9T`+4F_bKWKG6Fv&7t3V)DgrZL3FicwN~pBE{PDxyK%|c)fc=?0B`fs zf{+0ZmQbGw*mQyMOHT)$-a((c0l)#Gacx18XS_cB&648<2k!e&2N; z7<%IuCDj^}T8;~Bfh5}YtX9e2b$#T{7-tGK;-APQ2@+@q z>3LWb@LJ;@W}y7WiyUg7ZSpqHzmnLwyeF40oLyQIACnDDZMG}`Sbe7?T0|KVqWeMz zVit#c{O}<4g2A4qVEd?|OuefOWo7>sqrp*P3_%qEnfxKMWx_*Zx;=P}{%3oj_R0W{ z0K9g7MeV7S`+{-4^=-y*-3#~BqOn@md+)6k0}c9p6Eh8}lcpDr>b(FL`$*PtDWqdH z02qhzS#v4Rj0d%WuFQ&7FN`i3@e!+{3uic)avE>i^)fZw2jTIhdnbBNFF?oV=P~K` zH?5&8=YLmj>x)p)%iA%&gC>hWFSVrsr=GGFCm(wsx_yNTeVseVMDZ8k$x*2!mtJGx zj&@nagdLRQL1?&4Efcri!Q&Y8`f&{)@Ep9Suf?;p1n17><5=KsnqN+1@HdLt8rl=CcO;16in4q0@q1!Q!#f)JU{jh z*>xwX>>Y@z= z!f_rXz#oVm{(XLu7XNoMPb?dLTI6anXXa*A6ABVjwp4`Bjz^WvF#L`GJL+?1&MBtT zWcgxoR_<(-+mNXVagoXVarc*O{^g+@jUJn43I)Z%`@ewFQP?5zAdFDg982d-pum$l z&3|uotI9I_4JKW`l%biP)a@8jlg%Sj2i#52-qnem@BGiNhbu10m)RK8il?a?v^H*` z7W?Vb^9j2BCD-HKZvDMQNg39`Ou6->&`4uOVfiw=);M3=+w}2f3zLRUU~w_iOaX?3 zuomGfn?JG?lLXg(lif&g6kRJDy;493lRNa-T`33hq19zwv&s`Y6>P7GC}61kk=mQg zbxP`(<8zwu+8bh*_=6)NL6{R+Yu zNJg}AdR}RC0)m9O5VkFTAIkAKK1`9Da3{M8&$T$sSDfpV6kbE7!{X|)+qG^hm80zr zA>OwNdeBcnPBQDwN%yuFX+Jjij+nRY^yhz$Q$AEH^2krnVeC5O;kwt}@6h$~%@}DM zl@*_ZLBE1vTAfZ-KpBU?nvzsM{(Ep!1!h!>TU|S+EZF+!Hj)_vG%6kyvgYrGuID5D zsXsH9fjZshMB5|TM{mE!-OxQ)koW$XYBBRYSkKk0O)n$v@I4441uwRAyK#;a_ZoeH zjkZ;n^~FpbKve=>;-CGS>3*N1y6cdwm5*2cUb~zK_X{L9(t1c7?Oaewl2X48MYdqR zBd&EuW~J`CYgkW7q=TS7;Yo9+V0nMxz3b@4Nb&ddgi9HvvT5CsZnqWI|5D&zSq!9r z`C2;iY`F`ChAd}xWlM(Zu7{gDHoW8o^Vx*xcX5;;;+pdfFZY+3Zg@ZrjKY=E}FCP6EJ*=-j(Ha(93B%gFxU z5%c=W3Hw{;vkKIQ{npltX<{fg$}-s9q&_qI^){J70Ed8F%g5wmAaKh+`Z4s9Mi5n{ z^aL4meD6Sdf&VTPHBsWX^4hRih zg#(RlRN&)mUa&@Z$*bpYFJ!i=vCw~zIRYmINeT1RCk|HdhkvGAx$309H*Zm*;|+X1 z8}JuPr>Z&XBRI~#pqg#@{y;rl1;{M|#jan#N{@MZZp&At^qzZj6$F+?Y<(|v@`%L6 zea4;6d-9#><4cWuV^4*Vf4*^G)}|@OH>@V`>#ub z@O!@<{L-_{0}x)6xBtA_Ge)j*;%YX?@ll)l-jAPa6q2N z;&2sqM(Ww6*%oCx_RkPZ0pJ-uC^-acy46bw9vicWiKbL-d4{(@(hooaw!A!oS%qH% zn#mq+S(_{`y;iJQ5Im_Wcp)wPQoGQ?dWC#pMtOalBrQ4_;f8pmxXNpT} zAdvBwDwkiklf+Rxs<@n!IqVg};l-c0%}4+l>)$VaxGnZNYJFu`2GMYCO0Km6^75kU zh>fskE(QyJiN7uIx@h5q`MtH{sfmAyB@so*Uol8KYufiPfBP-q>n40MmCWm5?(pQr ztwoObQJ+5zW$ql$YEC1&Y3WZrvTb44%gr+8;(dgJVvvvZ{4fTqcQ@!GH@z)TS%;@n zAX};XkrT!TAF9@c$vnV5JDC9va9^~X^l@)0U3EwH1nxX6O zFe2kVZV;N~-RUh&bqahhbuFncdIa!!!6>=3&Ng{dj?*bI2__rN8CAz^#%mCYT)#DC z;_#e=yn9qiPjM7V{)3hPNGt*=i)BTUU~^Y>-s)3HlJ$9L&Gnjg=$u5r#en0QqldEDkd_gKnOiE*e$fj~%dpLd9*x zYkt&C2EOxYzCv#2gVE6uJSGb>8977D=4%&LQ!l%ZF;Z)7Hqh~GB9|6nJ!`R=lModo z_(f+F2m^38<=`Zh{oE6Z%A3HRLLY01LJz5SzJLCdw!Iwbz%|bFbIX2%9;(n6UZ`)_ zTk4}s{H-TLdYXu@ghLg&dM3a%qrF6*GgRIT!Z2JVzH^QJK9y@yj70Hs+x?f#ir>FjdT;^D4juUKS?k8d4eMqGlzAG5tJ=cs)Wguj;5 zG3F`&COi5#Y4Ef6;b)oY2z(CoP6jCr7S+UmhTVQDBl88Z-VN!gRtl$9t_VJT<`BK@ zVe_|scS*zAuE@|L1)*xgaRZ#D?wn^OqyQx`0spnfL+W{Vo*1W(yu#f*jl~CZr(#eAcIzv^3O>P>Z+Zrs?5E`993hwF@Rd~X?B6?z^2r9 zroE9Nv!l6vcCPAYkKaPiR5veF&a>O^d5-URZ)pXlOKfyJ-Eua{Pb=t8R{g{jd3~LX zqR{EQy{0@%I_&X*HWb(#9`^InmYUfW5#cF}HP+}`PNudH7)6G#=iegrN$4M{C~~wv zT(3H4Ra**W@!yir*nO<9`v|(|F0dHa&Z3u3M{jlitU3%l{NTc6g8%MD`=vHX76QUz z~PE?+%&S9svPf^0KMRDn=kP}v=FDF6XT><^pSkIwxkWrak!x%Dq zYm1NaLoFjnE)=iN6kA+1h#vLKZ%JGCw7H)Xr5RUxi$ty{I{X=7&__9&Axpkv!dF&Y ztyd^iZgqyDdp21!$7P@3OGmSeh7Ygt;yDV}tpCpkqPZG3j1P~#fp z-OIdqBL#kChTE?8hiZjWi?pRpgi((BVtdSuCqL{jF)|c?*VmB8%V~u*5O}kT=OxXV z>=cvk5>)rI<)&FfUo56T@2_egq^}rRopm0tti?=7L<&;sLQJlc>i%+Q zr~{Sd(}R)Ev-t>oPSlq?SqG95mm4N@Q7^#@8lc|=gTmbY1oq0pMy@r379rsZuiW#r+OBm-o`tp7piM zR)A!4$afi`8Db`{CH~+-*je*kH|T7T%IB*WnXO#`?_EvHy<^8nmF?@)C)PIy3jB8KT>ai2Y`oTV`6P#z;y|1 z%jBU|ozZXjmQk+Pn%DW(lz729t=uyQY-6}r;pQ2ax{vSA9ZX_DNy!p}nz%)A42IvI z3=$$k>W?A73Z%Z(B-_uUTWZEXB)n+Y2m2U=ZoTP;?5CZ*@XO>vslKc5HPnKY0{-vs zygteRLW`PV0ix3^6zbZsSvRVP55ZlUDXT7OZ?{zfzXrxb!~0YUo-ekKfIo9w zZtJq#lIU3IW2l9(ok@86X^iWan?I4Mn+pM2tzb-`QokWWMDV2E_Hf=tsk8*+I4ej9 z6(tJeL9W_l#d>uqmH27JuyLeJzNJus!d1w{02wzran~_gS)4Ku)RTyn50=-U@dL__ zo1tI~65F8@RTLl@-J)T{ZRl=A96wH#()4(K&)*_0KfVjpL;jK{xJwOBQOd6PY{u(Q zzZRBqY16WP_(fl1;0S++K`j&Ks!>0q{iwkM7zwb9X*q4JYudUTOaJoP)U^bv>rEc6PABtf9I11K?a zyck}N}XQev@>zUh-6ts)u6#bLifwi*>972xM! z2yYWU;R?eGPu~GEMrwtsj;FB^%Go6&Z)^lK9aVD&5re^yXH50o33}`VPzOeb7F4+HddB>;~ z;I4IwQsfMo^UEW;BQ)xb;G5kMBO^dNis=mQ8f{2$Q7|JNG@ z$nHSfps`=Oj3H+sKr0`EO96EoB-5p{5GF!i1cB8;uVy5MeBzK18$?Nn=RRHyP_%=l zpuGQ2QA!Vwu}VS1H+4(lAg2{x`S1P|J|$h`@n|Ae7P{Q5Gd@VXbR{_KHl9mK~2IPZQgKJVyuinrM6Ss-)z$T&xlD8|0AY}Xr> z<85vZ4kPklHgEh=Cr$N@ZOsgZel79_slZ%)u{1(M=_xKWVB(bk+ZN>dwe|we_^uIR zUK0Y=_Y6p>_Rm91t{_3&miGiN1*Sk*7}$k4fvY~o!Og>94bT3%XDSEbFS^Ly0;-pc zj;aD!?aWmOE*E4tk4$iGv=4PxDjICj$q;qs@RpdRF>pGacyAkNS4+K;|Ed_GDqnt& z+m^1~a^*4r6T7G(Ci4ikpdJfuIEHEq=Pk+H@(nV8Z0;pb$NBg}{L5nCR`9sk2IZv^c1{bBa>~kVi_(e0gn6*fWZ&u<*GO4fF-EMk~p-N_C9;vOSHw3B_yA$+k5-1Bi!UH;CC%{BYVy_N&2Y7>{#KQ_^5q^sH z6c8C_TPL!I`kEe+8P<>?FQ1WTP#8M>ETrLkMDO#Cq8GMiGg%i3YuSX2CRP(c|CSo# zx}Ux58pQAm=T94A<#X@Z0+IW?RvpAXjdo;-l%3F2w25xWCF z8Q?$;gc0k5#~(~s9Ba%PU_HbQcc#uP9#0pp9s!~ldw&RN<~r0GdJQNH$`X*U@vK7<_IpVPnTkm+=&3!V1@t;yP*DM#L6jDtr>WOPB3YSIB212K zOh870R+c3dh3i2;sFJBXyOjcY&*`Lzl!d{C_gtzoHY*0YKKU<6QzXG|LFGM?hbHC` zxnv6lGay;^d#Ea)&=c0QC6p0$fb37gt_-l>3yau)^%+nLh}WeX>|lAkYriJ0t9-m9 zLqwiaOb)C~!waQ^A%F2s^+!p9PK>4iP6cT4@&impLw|7*Ed~;r>!FXv6}RXpS*FO^ zRBk1J3!(;ESk1QJbqkS)Cbt5v#Kc&`z`SJMEfeLQW9o@5k4-o6%Ld;JfMQ+`wmY0b zkE91-Mz=2bd<+FgI+3G%xh>}$Q%3t~+Vg<(y)K;rb#9_c9vxgY1O4T{je#!ilfhtQ z5~Z#8*pWc#E5g0E-ScO+yBDq@fm}U*DZBA@5HX#GXX7m3CcaCNN#~djK9(0C*>zts zctVoQ#Z@gwHm6P*HlD*pTW-*&3yOBVd2-$7a_}p&XVXuEha|U3dG)~Ny>WYh3ytCK znT<4oo#2h@cLw4GTwAtvSE}(1>KDZQYJwdPHq@-!@+r%o^`4Hw@AQMPnRZ+5Ik31e zfp8+~ufLj_mpwfk52^usHOT`~lzlNh!%{qYP2-9%GE3D~^IWc6b=MA%a5XkHLY&aS zc{Bm)Gk6$q*0n;yIMF8ZLkAt1;n||e#0qkj*ijSyPRgqh4Hn{S#)*40TBa(`1ak|h^Q3vV4cms$7RxiNb zpL=FR3nPCIdtdPf?AE=o3K%Sj6_(CLB*{e<$OEGjJ8oY6^9(EqaooJl02bgx1$!I| zdrx+Px3ax?n+OJj?XXoPFv27`NJ4I(06$LW?72C^U^(Qs>Zrkw?@Lw(8i`nrBv;4x71%xg`t-0e}I;{8{ABsD1E#U zG0(gTt<`rdu=ok<$oRPj3uqqp)Ca{M$#{zMt3K9iqR)#^`S}q#J`s4-u^XG-++&aY zu>EIZxz#Vb;`R#WCt$FCb_Ns+%(1WBy28CbC{pQGxLemuY25~geWY8n}z z<7R&8buX6RbsDFTxGfxE$kp_E5uMsCVU@ON#E1IU&;U90wirF$-JC&AIc7rsirTbK zb0wNR@+!sC$TAUEdH)nlRaZ^NorOP}m_T_Q*k!UQlPf4$iYp>T+yG9?7Y(507k+$o zwzU_f9}FhiK_Qg%*6YF!)j4`HDVQ5f#T8_3Pt#ojcR36bm}7Yom!t}TTj}(TWJWRP zYeV>Rgbj*o~+hIBsrV2kbascTOI-)OGeus{4d_5ylZSj1Ky7F0JxHe>IsNDjpmC0>!o`hhe9i@ zl1CvZ#VxQ)=UI)=;%UJpI$W5Jv1SJVuv4PCnH{L5qxVWRX#>8Nk@q+PEaB@dQK7hT z=I}PWsEvbn0&{=YhTCM(I_<*pp>n9w4;ruphmtaJ3yuO%v`GAc(|zT;dNA0Hlac%r z-pzPhzusI6nRTS>m(e2s(A^nZj}7&GId>)1IjRj{7kc@X3n&YVHM|Bd!OREhICj@$ z@%rM3Sy?<8?EP#ky2Yu)ViM^!EjKg}5qIE=!1RAeO0z2GH}dkM1&~E9{hy!VJiEVr znRUf{&);QyM~t8bG{2N^(djS^ym^HWT1#FPQ$+96=bG7E`#Ka_}FMg`@?K=jb3icV*_%PACJk-8t2sG?2IUVZ_6tl0A$%8gU-X;)L}7n)1m0Y001?N`|6dIYavVF_VAIMim*N} z3`V69m^${~kK2X+eGlc(z-0kx@GiAl(~#M=K6M^tm7lCxEJ?R>6`3 z=5uUabjc7Rb$!w|;}y0i(LcsQ{|59s9|pGGd2eM06~4I5=!2l-Go4@JA-R!~^o1C9 zjvCwLgYEKQSw-r#&$vz(=UM{a>P^SWMzBY?Z4}xU`&@j#c$#BsZ|HSIyA=`4ks9$f zGf4@<|8%Y|9Q_<%?hIq~F}ngKtBFjZfB`DsFuV<=o0{_nSxM!2hu_|XxYaX>KQKE1 zd(ZZgO=ehDd{5jA+wF@uj0ca!V9Wh)`;zwi?%dqiS$Yt(3~v<=^QH^D#bkC7_7x}` zx91U4*MFHimz6g4PRtrkiL?3^e%nEHml*Yzfhc}wbbbqNCM`-B(}5c(#yil+XxzVb zQ!N%cxb=?g#rhkR^>~+(0&>7%fr?#o;(>wda9r7llOIS=3Rdl@!u2h$SyYIpsYde8 zl9?8#bfWNPL_o5VN{iLuT}(;0P|WD*?&d8ZHxva8=8T!;0gpv7xckn6Dm>c$`ws4R zd~$hGRit=o)2Od-;sO~4ev{$Sx43de2#k_q1<;k|L?4s)QjU(MY*@-y;JY6wV znT0gSxeM(%r0M#OtW5HYt!Py7Ck8`5s~^O+D1cPMS+IQt^0GM=rjYp9&-*Df!kiwp zTQGXN92qb)^aZq?+Vs!3a_Jpz2A}C8E@u&R6Th}=;IqwP;JZ+@zm$8pvMF6HQGG}u zVd@G4kq&X=6Qc3oys}#JB7$a+bzg?9YaaO!i{tz1e2p2ZDum#EI-5o{8hRMOkv;xX zc7n8M00%y_4_~iY4xPm<`LFD-_#ZAElpKorzIF_BEGV*nz(oec9&oc@Fz{WJd5j;( z`06PD0dsl=%Wk)M5{Ix4hnPN>Fl&Xq`Z$^Za!UKU>Eo<85>EHrPg9ccUl4KFANN0y zm}TbOliR9Yo@0Lm4qZo4cI@aX{)vPzfX|KuB`gj)Z4bg@U*cv)1M`P$W*6zJ3XM0k z;jWeIulgsjN;v$j0f0HLE_SWwaBH_}Z_>YSqG7bB=1+AkCR#oqMwa36)C|Z)8^8>| z@MYzA5L(EE{nNS@UwAODG_{%&e94k(E179sI(~NT)A|*3`=#0%Pe4XHURH~XqspTJ z)~>Lxj${!kHe?JmGI`e6y_Fm|KHh1BDz_@*LefYvv`!Qrd+eH=W zQhpQB$PN!NfC94DA6|c^x^>K;Nb-c#eDcC~r0?yp7#d86%8P;AH?gs} zneF)%c!0I_mUm-V?jU_pOJkflDA3`#!9(SJiwUOe_ffcLHW9yL#&^LMD{c|nY*)u8 zVev6EYKu`)Kp;KeJNeo7-cSsM8TO`la61vK=wwRA(2VumR>!g-K{` zaX5&9cx78NLAkS_vAgT?lPhkXp;xW>ajlq*SUI4_WT)Ni4N7q{0X z4*Z4!ZKsjMqpuzb!wxVTi>Yc6;|dIphfy7&-7HQzmSQ{8DOOtAm*gLk26A09;cb0R z8hFp7&rq9!qPn#0@;S?=w-d!$q>{9r|Jgo&=bHDzha&&c3Zjz{*R$9;B(7e)b~P{b zYeO2Yu_Yw43Ex=$iLXzm*=cR6!{|_AjwWO@W=X<>?%?CXLyJiMx9?uKG%Y!taZuJk zPe)0FKK#|3VUgFe8-?@QwHf;GRs7G3;YF!?=V=g z{VR!5T(@9C*+vG@)2D-uM0Twsex6-Jolt$Vv&nkU*mUA1ng1A8=0N^e_Tky7uDnL1 zqKFtWwwpX(6ZzVnCL-7!IpO*xNoS_f_ L9; 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

g8J009N^{CAf!(uJ{Qn`?-3Fn8H!F& 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%0AI%{TFXGDE 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�^5< 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
?xnGaOO8QL=GRH+JVj%hI}TZh2_8 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

D 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˲$FzI`v!6<|%HY>Z)eQPeT<^ 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

FTE8RgzOt)Ho4@J_ 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
    k}u1PQZj1w@HNbPX%W1w^s2#NvP` zB^pZuL?}pfqI-q1a|jSOMLnHR}@j=G4gmINj>JG(E~YZaLx}1 zbRri6EWH7e+vzY(tPO6EWD;``3No(12Q0=|@|ZxN79BxBA{X7u4Pryd5g^ct;);^Uw_eMssq2ve<=tXhG zN(i_`FUmzmv9aVRDCD zTnarwlA6jzT2YP{#Kw~Q0D)HIBA}%w7$9K=Jo#>m7bKacT!exgFNlpLM}a^uiYrE6 zkV8SD7v0MXVnfLhAkd29ij@#>i&m851+lT@C=h5xam7j~xJN6>@PgP_ViX9{Gx4g3 zC?>c?E6PPi=TIQfid+n^pkOq^dqZt2X66Ao(Xf*H6|>k_a$g|Oi{gs0N64Wd(Tnbl zjABE{5g^ct;)<0JaEn%yi;QAp$x%?&iaaBd^ae?8BNyoexv>Q2P*5IUwAP|BikW## zP81Maa|cq!5v(mGRLum5iX8F-$=IT6qM{r(IOhihdXbBQmfm27L_}KKkM~JZ54or} z$f;(rv0O}0zUM%YM~LSFA`~Q=(Y@T@90CM-QCu-{gPb3@MK8*P1gq0U><0uHeyl21 zLcu+HQARb3PZ>E11bR_iu@VZBu|@YsMzOKvC=lpHt_Scjfzm+IEEqVjHJ*U){8foa z(lsc^MMkl)914ohK0{JR<@svjioq9TQIKdx_eMssq2ve<=tXhG@(36u>2X}ekTUa_ z#m17OpsW{pJ|O4~MoG3C7oi}hnw>*Id5qCoi`rMsMvo`1v9^>@H4`MRamWuO#v^dt7a=>$x%?&i&hmY`GI@J7-b@(bG|?@#>nS;ZluqOd zt{H8%pPYnC%fZjLW^^-u9c?!`31v`LjJzJ_AmA?@Y(XFyUvxJF5=*Tv9b_ONkc(pf zQtAv6x#;#w2dkb-91=(pv~W~lAxIjs6B@JQ_Y$PoP;x&Ykc;Aqu{X&1fm`IF+@*uqSaK8yaxMBqqq#0Y> z&kkZ^$x$FsjN*!wP;iT4l#7gFW64n

    fs;utY|KSxp;tHg&T!Yl~}qLGEUx*jQrK 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�Wlv!qD4aG+x?@MI1 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

  1. IJW)1 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

    xXI5|8cyrg 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

    Q4!)=GV4}@j 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 _SJo;#ToG3uDxF5=XgSZhrz3MGRQ5SI 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 literal 0 HcmV?d00001 From 766940140d2c3b31085f8de13cacad908f439115 Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Sun, 9 Mar 2025 18:04:06 +0500 Subject: [PATCH 07/32] fusion rag --- 16_fusion_rag.ipynb | 1207 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1207 insertions(+) create mode 100644 16_fusion_rag.ipynb diff --git a/16_fusion_rag.ipynb b/16_fusion_rag.ipynb new file mode 100644 index 0000000..8da33c3 --- /dev/null +++ b/16_fusion_rag.ipynb @@ -0,0 +1,1207 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "vscode": { + "languageId": "markdown" + } + }, + "source": [ + "# Fusion Retrieval: Combining Vector and Keyword Search\n", + "\n", + "In this notebook, I implement a fusion retrieval system that combines the strengths of semantic vector search with keyword-based BM25 retrieval. This approach improves retrieval quality by capturing both conceptual similarity and exact keyword matches.\n", + "\n", + "## Why Fusion Retrieval Matters\n", + "\n", + "Traditional RAG systems typically rely on vector search alone, but this has limitations:\n", + "\n", + "- Vector search excels at semantic similarity but may miss exact keyword matches\n", + "- Keyword search is great for specific terms but lacks semantic understanding\n", + "- Different queries perform better with different retrieval methods\n", + "\n", + "Fusion retrieval gives us the best of both worlds by:\n", + "\n", + "- Performing both vector-based and keyword-based retrieval\n", + "- Normalizing the scores from each approach\n", + "- Combining them with a weighted formula\n", + "- Ranking documents based on the combined score" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting Up the Environment\n", + "We begin by importing necessary libraries." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import numpy as np\n", + "from rank_bm25 import BM25Okapi\n", + "import fitz\n", + "from openai import OpenAI\n", + "import re\n", + "import json\n", + "import time\n", + "from sklearn.metrics.pairwise import cosine_similarity" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting Up the OpenAI API Client\n", + "We initialize the OpenAI client to generate embeddings and responses." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize the OpenAI client with the base URL and API key\n", + "client = OpenAI(\n", + " base_url=\"https://api.studio.nebius.com/v1/\",\n", + " api_key=os.getenv(\"OPENAI_API_KEY\") # Retrieve the API key from environment variables\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Document Processing Functions" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def extract_text_from_pdf(pdf_path):\n", + " \"\"\"\n", + " Extract text content from a PDF file.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF file\n", + " \n", + " Returns:\n", + " str: Extracted text content\n", + " \"\"\"\n", + " print(f\"Extracting text from {pdf_path}...\") # Print the path of the PDF being processed\n", + " pdf_document = fitz.open(pdf_path) # Open the PDF file using PyMuPDF\n", + " text = \"\" # Initialize an empty string to store the extracted text\n", + " \n", + " # Iterate through each page in the PDF\n", + " for page_num in range(pdf_document.page_count):\n", + " page = pdf_document[page_num] # Get the page object\n", + " text += page.get_text() # Extract text from the page and append to the text string\n", + " \n", + " return text # Return the extracted text content" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def chunk_text(text, chunk_size=1000, chunk_overlap=200):\n", + " \"\"\"\n", + " Split text into overlapping chunks.\n", + " \n", + " Args:\n", + " text (str): Input text to chunk\n", + " chunk_size (int): Size of each chunk in characters\n", + " chunk_overlap (int): Overlap between chunks in characters\n", + " \n", + " Returns:\n", + " List[Dict]: List of chunks with text and metadata\n", + " \"\"\"\n", + " chunks = [] # Initialize an empty list to store chunks\n", + " \n", + " # Iterate over the text with the specified chunk size and overlap\n", + " for i in range(0, len(text), chunk_size - chunk_overlap):\n", + " chunk = text[i:i + chunk_size] # Extract a chunk of the specified size\n", + " if chunk: # Ensure we don't add empty chunks\n", + " chunk_data = {\n", + " \"text\": chunk, # The chunk text\n", + " \"metadata\": {\n", + " \"start_char\": i, # Start character index of the chunk\n", + " \"end_char\": i + len(chunk) # End character index of the chunk\n", + " }\n", + " }\n", + " chunks.append(chunk_data) # Add the chunk data to the list\n", + " \n", + " print(f\"Created {len(chunks)} text chunks\") # Print the number of created chunks\n", + " return chunks # Return the list of chunks" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def clean_text(text):\n", + " \"\"\"\n", + " Clean text by removing extra whitespace and special characters.\n", + " \n", + " Args:\n", + " text (str): Input text\n", + " \n", + " Returns:\n", + " str: Cleaned text\n", + " \"\"\"\n", + " # Replace multiple whitespace characters (including newlines and tabs) with a single space\n", + " text = re.sub(r'\\s+', ' ', text)\n", + " \n", + " # Fix common OCR issues by replacing tab and newline characters with a space\n", + " text = text.replace('\\\\t', ' ')\n", + " text = text.replace('\\\\n', ' ')\n", + " \n", + " # Remove any leading or trailing whitespace and ensure single spaces between words\n", + " text = ' '.join(text.split())\n", + " \n", + " return text" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating Our Vector Store" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def create_embeddings(texts, model=\"BAAI/bge-en-icl\"):\n", + " \"\"\"\n", + " Create embeddings for the given texts.\n", + " \n", + " Args:\n", + " texts (str or List[str]): Input text(s)\n", + " model (str): Embedding model name\n", + " \n", + " Returns:\n", + " List[List[float]]: Embedding vectors\n", + " \"\"\"\n", + " # Handle both string and list inputs\n", + " input_texts = texts if isinstance(texts, list) else [texts]\n", + " \n", + " # Process in batches if needed (OpenAI API limits)\n", + " batch_size = 100\n", + " all_embeddings = []\n", + " \n", + " # Iterate over the input texts in batches\n", + " for i in range(0, len(input_texts), batch_size):\n", + " batch = input_texts[i:i + batch_size] # Get the current batch of texts\n", + " \n", + " # Create embeddings for the current batch\n", + " response = client.embeddings.create(\n", + " model=model,\n", + " input=batch\n", + " )\n", + " \n", + " # Extract embeddings from the response\n", + " batch_embeddings = [item.embedding for item in response.data]\n", + " all_embeddings.extend(batch_embeddings) # Add the batch embeddings to the list\n", + " \n", + " # If input was a string, return just the first embedding\n", + " if isinstance(texts, str):\n", + " return all_embeddings[0]\n", + " \n", + " # Otherwise return all embeddings\n", + " return all_embeddings" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "class SimpleVectorStore:\n", + " \"\"\"\n", + " A simple vector store implementation using NumPy.\n", + " \"\"\"\n", + " def __init__(self):\n", + " self.vectors = [] # List to store embedding vectors\n", + " self.texts = [] # List to store text content\n", + " self.metadata = [] # List to store metadata\n", + " \n", + " def add_item(self, text, embedding, metadata=None):\n", + " \"\"\"\n", + " Add an item to the vector store.\n", + " \n", + " Args:\n", + " text (str): The text content\n", + " embedding (List[float]): The embedding vector\n", + " metadata (Dict, optional): Additional metadata\n", + " \"\"\"\n", + " self.vectors.append(np.array(embedding)) # Append the embedding vector\n", + " self.texts.append(text) # Append the text content\n", + " self.metadata.append(metadata or {}) # Append the metadata (or empty dict if None)\n", + " \n", + " def add_items(self, items, embeddings):\n", + " \"\"\"\n", + " Add multiple items to the vector store.\n", + " \n", + " Args:\n", + " items (List[Dict]): List of text items\n", + " embeddings (List[List[float]]): List of embedding vectors\n", + " \"\"\"\n", + " for i, (item, embedding) in enumerate(zip(items, embeddings)):\n", + " self.add_item(\n", + " text=item[\"text\"], # Extract text from item\n", + " embedding=embedding, # Use corresponding embedding\n", + " metadata={**item.get(\"metadata\", {}), \"index\": i} # Merge item metadata with index\n", + " )\n", + " \n", + " def similarity_search_with_scores(self, query_embedding, k=5):\n", + " \"\"\"\n", + " Find the most similar items to a query embedding with similarity scores.\n", + " \n", + " Args:\n", + " query_embedding (List[float]): Query embedding vector\n", + " k (int): Number of results to return\n", + " \n", + " Returns:\n", + " List[Tuple[Dict, float]]: Top k most similar items with scores\n", + " \"\"\"\n", + " if not self.vectors:\n", + " return [] # Return empty list if no vectors are stored\n", + " \n", + " # Convert query embedding to numpy array\n", + " query_vector = np.array(query_embedding)\n", + " \n", + " # Calculate similarities using cosine similarity\n", + " similarities = []\n", + " for i, vector in enumerate(self.vectors):\n", + " similarity = cosine_similarity([query_vector], [vector])[0][0] # Compute cosine similarity\n", + " similarities.append((i, similarity)) # Append index and similarity score\n", + " \n", + " # Sort by similarity (descending)\n", + " similarities.sort(key=lambda x: x[1], reverse=True)\n", + " \n", + " # Return top k results with scores\n", + " results = []\n", + " for i in range(min(k, len(similarities))):\n", + " idx, score = similarities[i]\n", + " results.append({\n", + " \"text\": self.texts[idx], # Retrieve text by index\n", + " \"metadata\": self.metadata[idx], # Retrieve metadata by index\n", + " \"similarity\": float(score) # Add similarity score\n", + " })\n", + " \n", + " return results\n", + " \n", + " def get_all_documents(self):\n", + " \"\"\"\n", + " Get all documents in the store.\n", + " \n", + " Returns:\n", + " List[Dict]: All documents\n", + " \"\"\"\n", + " return [{\"text\": text, \"metadata\": meta} for text, meta in zip(self.texts, self.metadata)] # Combine texts and metadata" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## BM25 Implementation" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def create_bm25_index(chunks):\n", + " \"\"\"\n", + " Create a BM25 index from the given chunks.\n", + " \n", + " Args:\n", + " chunks (List[Dict]): List of text chunks\n", + " \n", + " Returns:\n", + " BM25Okapi: A BM25 index\n", + " \"\"\"\n", + " # Extract text from each chunk\n", + " texts = [chunk[\"text\"] for chunk in chunks]\n", + " \n", + " # Tokenize each document by splitting on whitespace\n", + " tokenized_docs = [text.split() for text in texts]\n", + " \n", + " # Create the BM25 index using the tokenized documents\n", + " bm25 = BM25Okapi(tokenized_docs)\n", + " \n", + " # Print the number of documents in the BM25 index\n", + " print(f\"Created BM25 index with {len(texts)} documents\")\n", + " \n", + " return bm25" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def bm25_search(bm25, chunks, query, k=5):\n", + " \"\"\"\n", + " Search the BM25 index with a query.\n", + " \n", + " Args:\n", + " bm25 (BM25Okapi): BM25 index\n", + " chunks (List[Dict]): List of text chunks\n", + " query (str): Query string\n", + " k (int): Number of results to return\n", + " \n", + " Returns:\n", + " List[Dict]: Top k results with scores\n", + " \"\"\"\n", + " # Tokenize the query by splitting it into individual words\n", + " query_tokens = query.split()\n", + " \n", + " # Get BM25 scores for the query tokens against the indexed documents\n", + " scores = bm25.get_scores(query_tokens)\n", + " \n", + " # Initialize an empty list to store results with their scores\n", + " results = []\n", + " \n", + " # Iterate over the scores and corresponding chunks\n", + " for i, score in enumerate(scores):\n", + " # Create a copy of the metadata to avoid modifying the original\n", + " metadata = chunks[i].get(\"metadata\", {}).copy()\n", + " # Add index to metadata\n", + " metadata[\"index\"] = i\n", + " \n", + " results.append({\n", + " \"text\": chunks[i][\"text\"],\n", + " \"metadata\": metadata, # Add metadata with index\n", + " \"bm25_score\": float(score)\n", + " })\n", + " \n", + " # Sort the results by BM25 score in descending order\n", + " results.sort(key=lambda x: x[\"bm25_score\"], reverse=True)\n", + " \n", + " # Return the top k results\n", + " return results[:k]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fusion Retrieval Function" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def fusion_retrieval(query, chunks, vector_store, bm25_index, k=5, alpha=0.5):\n", + " \"\"\"\n", + " Perform fusion retrieval combining vector-based and BM25 search.\n", + " \n", + " Args:\n", + " query (str): Query string\n", + " chunks (List[Dict]): Original text chunks\n", + " vector_store (SimpleVectorStore): Vector store\n", + " bm25_index (BM25Okapi): BM25 index\n", + " k (int): Number of results to return\n", + " alpha (float): Weight for vector scores (0-1), where 1-alpha is BM25 weight\n", + " \n", + " Returns:\n", + " List[Dict]: Top k results based on combined scores\n", + " \"\"\"\n", + " print(f\"Performing fusion retrieval for query: {query}\")\n", + " \n", + " # Define small epsilon to avoid division by zero\n", + " epsilon = 1e-8\n", + " \n", + " # Get vector search results\n", + " query_embedding = create_embeddings(query) # Create embedding for the query\n", + " vector_results = vector_store.similarity_search_with_scores(query_embedding, k=len(chunks)) # Perform vector search\n", + " \n", + " # Get BM25 search results\n", + " bm25_results = bm25_search(bm25_index, chunks, query, k=len(chunks)) # Perform BM25 search\n", + " \n", + " # Create dictionaries to map document index to score\n", + " vector_scores_dict = {result[\"metadata\"][\"index\"]: result[\"similarity\"] for result in vector_results}\n", + " bm25_scores_dict = {result[\"metadata\"][\"index\"]: result[\"bm25_score\"] for result in bm25_results}\n", + " \n", + " # Ensure all documents have scores for both methods\n", + " all_docs = vector_store.get_all_documents()\n", + " combined_results = []\n", + " \n", + " for i, doc in enumerate(all_docs):\n", + " vector_score = vector_scores_dict.get(i, 0.0) # Get vector score or 0 if not found\n", + " bm25_score = bm25_scores_dict.get(i, 0.0) # Get BM25 score or 0 if not found\n", + " combined_results.append({\n", + " \"text\": doc[\"text\"],\n", + " \"metadata\": doc[\"metadata\"],\n", + " \"vector_score\": vector_score,\n", + " \"bm25_score\": bm25_score,\n", + " \"index\": i\n", + " })\n", + " \n", + " # Extract scores as arrays\n", + " vector_scores = np.array([doc[\"vector_score\"] for doc in combined_results])\n", + " bm25_scores = np.array([doc[\"bm25_score\"] for doc in combined_results])\n", + " \n", + " # Normalize scores\n", + " norm_vector_scores = (vector_scores - np.min(vector_scores)) / (np.max(vector_scores) - np.min(vector_scores) + epsilon)\n", + " norm_bm25_scores = (bm25_scores - np.min(bm25_scores)) / (np.max(bm25_scores) - np.min(bm25_scores) + epsilon)\n", + " \n", + " # Compute combined scores\n", + " combined_scores = alpha * norm_vector_scores + (1 - alpha) * norm_bm25_scores\n", + " \n", + " # Add combined scores to results\n", + " for i, score in enumerate(combined_scores):\n", + " combined_results[i][\"combined_score\"] = float(score)\n", + " \n", + " # Sort by combined score (descending)\n", + " combined_results.sort(key=lambda x: x[\"combined_score\"], reverse=True)\n", + " \n", + " # Return top k results\n", + " top_results = combined_results[:k]\n", + " \n", + " print(f\"Retrieved {len(top_results)} documents with fusion retrieval\")\n", + " return top_results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Document Processing Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def process_document(pdf_path, chunk_size=1000, chunk_overlap=200):\n", + " \"\"\"\n", + " Process a document for fusion retrieval.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF file\n", + " chunk_size (int): Size of each chunk in characters\n", + " chunk_overlap (int): Overlap between chunks in characters\n", + " \n", + " Returns:\n", + " Tuple[List[Dict], SimpleVectorStore, BM25Okapi]: Chunks, vector store, and BM25 index\n", + " \"\"\"\n", + " # Extract text from the PDF file\n", + " text = extract_text_from_pdf(pdf_path)\n", + " \n", + " # Clean the extracted text to remove extra whitespace and special characters\n", + " cleaned_text = clean_text(text)\n", + " \n", + " # Split the cleaned text into overlapping chunks\n", + " chunks = chunk_text(cleaned_text, chunk_size, chunk_overlap)\n", + " \n", + " # Extract the text content from each chunk for embedding creation\n", + " chunk_texts = [chunk[\"text\"] for chunk in chunks]\n", + " print(\"Creating embeddings for chunks...\")\n", + " \n", + " # Create embeddings for the chunk texts\n", + " embeddings = create_embeddings(chunk_texts)\n", + " \n", + " # Initialize the vector store\n", + " vector_store = SimpleVectorStore()\n", + " \n", + " # Add the chunks and their embeddings to the vector store\n", + " vector_store.add_items(chunks, embeddings)\n", + " print(f\"Added {len(chunks)} items to vector store\")\n", + " \n", + " # Create a BM25 index from the chunks\n", + " bm25_index = create_bm25_index(chunks)\n", + " \n", + " # Return the chunks, vector store, and BM25 index\n", + " return chunks, vector_store, bm25_index" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Response Generation" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_response(query, context):\n", + " \"\"\"\n", + " Generate a response based on the query and context.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " context (str): Context from retrieved documents\n", + " \n", + " Returns:\n", + " str: Generated response\n", + " \"\"\"\n", + " # Define the system prompt to guide the AI assistant\n", + " system_prompt = \"\"\"You are a helpful AI assistant. Answer the user's question based on the provided context. \n", + " If the context doesn't contain relevant information to answer the question fully, acknowledge this limitation.\"\"\"\n", + "\n", + " # Format the user prompt with the context and query\n", + " user_prompt = f\"\"\"Context:\n", + " {context}\n", + "\n", + " Question: {query}\n", + "\n", + " Please answer the question based on the provided context.\"\"\"\n", + "\n", + " # Generate the response using the OpenAI API\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\", # Specify the model to use\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt}, # System message to guide the assistant\n", + " {\"role\": \"user\", \"content\": user_prompt} # User message with context and query\n", + " ],\n", + " temperature=0.1 # Set the temperature for response generation\n", + " )\n", + " \n", + " # Return the generated response\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Main Retrieval Function" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def answer_with_fusion_rag(query, chunks, vector_store, bm25_index, k=5, alpha=0.5):\n", + " \"\"\"\n", + " Answer a query using fusion RAG.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " chunks (List[Dict]): Text chunks\n", + " vector_store (SimpleVectorStore): Vector store\n", + " bm25_index (BM25Okapi): BM25 index\n", + " k (int): Number of documents to retrieve\n", + " alpha (float): Weight for vector scores\n", + " \n", + " Returns:\n", + " Dict: Query results including retrieved documents and response\n", + " \"\"\"\n", + " # Retrieve documents using fusion retrieval method\n", + " retrieved_docs = fusion_retrieval(query, chunks, vector_store, bm25_index, k=k, alpha=alpha)\n", + " \n", + " # Format the context from the retrieved documents by joining their text with separators\n", + " context = \"\\n\\n---\\n\\n\".join([doc[\"text\"] for doc in retrieved_docs])\n", + " \n", + " # Generate a response based on the query and the formatted context\n", + " response = generate_response(query, context)\n", + " \n", + " # Return the query, retrieved documents, and the generated response\n", + " return {\n", + " \"query\": query,\n", + " \"retrieved_documents\": retrieved_docs,\n", + " \"response\": response\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Comparing Retrieval Methods" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def vector_only_rag(query, vector_store, k=5):\n", + " \"\"\"\n", + " Answer a query using only vector-based RAG.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " vector_store (SimpleVectorStore): Vector store\n", + " k (int): Number of documents to retrieve\n", + " \n", + " Returns:\n", + " Dict: Query results\n", + " \"\"\"\n", + " # Create query embedding\n", + " query_embedding = create_embeddings(query)\n", + " \n", + " # Retrieve documents using vector-based similarity search\n", + " retrieved_docs = vector_store.similarity_search_with_scores(query_embedding, k=k)\n", + " \n", + " # Format the context from the retrieved documents by joining their text with separators\n", + " context = \"\\n\\n---\\n\\n\".join([doc[\"text\"] for doc in retrieved_docs])\n", + " \n", + " # Generate a response based on the query and the formatted context\n", + " response = generate_response(query, context)\n", + " \n", + " # Return the query, retrieved documents, and the generated response\n", + " return {\n", + " \"query\": query,\n", + " \"retrieved_documents\": retrieved_docs,\n", + " \"response\": response\n", + " }\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "def bm25_only_rag(query, chunks, bm25_index, k=5):\n", + " \"\"\"\n", + " Answer a query using only BM25-based RAG.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " chunks (List[Dict]): Text chunks\n", + " bm25_index (BM25Okapi): BM25 index\n", + " k (int): Number of documents to retrieve\n", + " \n", + " Returns:\n", + " Dict: Query results\n", + " \"\"\"\n", + " # Retrieve documents using BM25 search\n", + " retrieved_docs = bm25_search(bm25_index, chunks, query, k=k)\n", + " \n", + " # Format the context from the retrieved documents by joining their text with separators\n", + " context = \"\\n\\n---\\n\\n\".join([doc[\"text\"] for doc in retrieved_docs])\n", + " \n", + " # Generate a response based on the query and the formatted context\n", + " response = generate_response(query, context)\n", + " \n", + " # Return the query, retrieved documents, and the generated response\n", + " return {\n", + " \"query\": query,\n", + " \"retrieved_documents\": retrieved_docs,\n", + " \"response\": response\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluation Functions" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "def compare_retrieval_methods(query, chunks, vector_store, bm25_index, k=5, alpha=0.5, reference_answer=None):\n", + " \"\"\"\n", + " Compare different retrieval methods for a query.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " chunks (List[Dict]): Text chunks\n", + " vector_store (SimpleVectorStore): Vector store\n", + " bm25_index (BM25Okapi): BM25 index\n", + " k (int): Number of documents to retrieve\n", + " alpha (float): Weight for vector scores in fusion retrieval\n", + " reference_answer (str, optional): Reference answer for comparison\n", + " \n", + " Returns:\n", + " Dict: Comparison results\n", + " \"\"\"\n", + " print(f\"\\n=== Comparing retrieval methods for query: {query} ===\\n\")\n", + " \n", + " # Run vector-only RAG\n", + " print(\"\\nRunning vector-only RAG...\")\n", + " vector_result = vector_only_rag(query, vector_store, k)\n", + " \n", + " # Run BM25-only RAG\n", + " print(\"\\nRunning BM25-only RAG...\")\n", + " bm25_result = bm25_only_rag(query, chunks, bm25_index, k)\n", + " \n", + " # Run fusion RAG\n", + " print(\"\\nRunning fusion RAG...\")\n", + " fusion_result = answer_with_fusion_rag(query, chunks, vector_store, bm25_index, k, alpha)\n", + " \n", + " # Compare responses from different retrieval methods\n", + " print(\"\\nComparing responses...\")\n", + " comparison = evaluate_responses(\n", + " query, \n", + " vector_result[\"response\"], \n", + " bm25_result[\"response\"], \n", + " fusion_result[\"response\"],\n", + " reference_answer\n", + " )\n", + " \n", + " # Return the comparison results\n", + " return {\n", + " \"query\": query,\n", + " \"vector_result\": vector_result,\n", + " \"bm25_result\": bm25_result,\n", + " \"fusion_result\": fusion_result,\n", + " \"comparison\": comparison\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "def evaluate_responses(query, vector_response, bm25_response, fusion_response, reference_answer=None):\n", + " \"\"\"\n", + " Evaluate the responses from different retrieval methods.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " vector_response (str): Response from vector-only RAG\n", + " bm25_response (str): Response from BM25-only RAG\n", + " fusion_response (str): Response from fusion RAG\n", + " reference_answer (str, optional): Reference answer\n", + " \n", + " Returns:\n", + " str: Evaluation of responses\n", + " \"\"\"\n", + " # System prompt for the evaluator to guide the evaluation process\n", + " system_prompt = \"\"\"You are an expert evaluator of RAG systems. Compare responses from three different retrieval approaches:\n", + " 1. Vector-based retrieval: Uses semantic similarity for document retrieval\n", + " 2. BM25 keyword retrieval: Uses keyword matching for document retrieval\n", + " 3. Fusion retrieval: Combines both vector and keyword approaches\n", + "\n", + " Evaluate the responses based on:\n", + " - Relevance to the query\n", + " - Factual correctness\n", + " - Comprehensiveness\n", + " - Clarity and coherence\"\"\"\n", + "\n", + " # User prompt containing the query and responses\n", + " user_prompt = f\"\"\"Query: {query}\n", + "\n", + " Vector-based response:\n", + " {vector_response}\n", + "\n", + " BM25 keyword response:\n", + " {bm25_response}\n", + "\n", + " Fusion response:\n", + " {fusion_response}\n", + " \"\"\"\n", + "\n", + " # Add reference answer to the prompt if provided\n", + " if reference_answer:\n", + " user_prompt += f\"\"\"\n", + " Reference answer:\n", + " {reference_answer}\n", + " \"\"\"\n", + "\n", + " # Add instructions for detailed comparison to the user prompt\n", + " user_prompt += \"\"\"\n", + " Please provide a detailed comparison of these three responses. Which approach performed best for this query and why?\n", + " Be specific about the strengths and weaknesses of each approach for this particular query.\n", + " \"\"\"\n", + "\n", + " # Generate the evaluation using meta-llama/Llama-3.2-3B-Instruct\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\", # Specify the model to use\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt}, # System message to guide the evaluator\n", + " {\"role\": \"user\", \"content\": user_prompt} # User message with query and responses\n", + " ],\n", + " temperature=0 # Set the temperature for response generation\n", + " )\n", + " \n", + " # Return the generated evaluation content\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Complete Evaluation Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "def evaluate_fusion_retrieval(pdf_path, test_queries, reference_answers=None, k=5, alpha=0.5):\n", + " \"\"\"\n", + " Evaluate fusion retrieval compared to other methods.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF file\n", + " test_queries (List[str]): List of test queries\n", + " reference_answers (List[str], optional): Reference answers\n", + " k (int): Number of documents to retrieve\n", + " alpha (float): Weight for vector scores in fusion retrieval\n", + " \n", + " Returns:\n", + " Dict: Evaluation results\n", + " \"\"\"\n", + " print(\"=== EVALUATING FUSION RETRIEVAL ===\\n\")\n", + " \n", + " # Process the document to extract text, create chunks, and build vector and BM25 indices\n", + " chunks, vector_store, bm25_index = process_document(pdf_path)\n", + " \n", + " # Initialize a list to store results for each query\n", + " results = []\n", + " \n", + " # Iterate over each test query\n", + " for i, query in enumerate(test_queries):\n", + " print(f\"\\n\\n=== Evaluating Query {i+1}/{len(test_queries)} ===\")\n", + " print(f\"Query: {query}\")\n", + " \n", + " # Get the reference answer if available\n", + " reference = None\n", + " if reference_answers and i < len(reference_answers):\n", + " reference = reference_answers[i]\n", + " \n", + " # Compare retrieval methods for the current query\n", + " comparison = compare_retrieval_methods(\n", + " query, \n", + " chunks, \n", + " vector_store, \n", + " bm25_index, \n", + " k=k, \n", + " alpha=alpha,\n", + " reference_answer=reference\n", + " )\n", + " \n", + " # Append the comparison results to the results list\n", + " results.append(comparison)\n", + " \n", + " # Print the responses from different retrieval methods\n", + " print(\"\\n=== Vector-based Response ===\")\n", + " print(comparison[\"vector_result\"][\"response\"])\n", + " \n", + " print(\"\\n=== BM25 Response ===\")\n", + " print(comparison[\"bm25_result\"][\"response\"])\n", + " \n", + " print(\"\\n=== Fusion Response ===\")\n", + " print(comparison[\"fusion_result\"][\"response\"])\n", + " \n", + " print(\"\\n=== Comparison ===\")\n", + " print(comparison[\"comparison\"])\n", + " \n", + " # Generate an overall analysis of the fusion retrieval performance\n", + " overall_analysis = generate_overall_analysis(results)\n", + " \n", + " # Return the results and overall analysis\n", + " return {\n", + " \"results\": results,\n", + " \"overall_analysis\": overall_analysis\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_overall_analysis(results):\n", + " \"\"\"\n", + " Generate an overall analysis of fusion retrieval.\n", + " \n", + " Args:\n", + " results (List[Dict]): Results from evaluating queries\n", + " \n", + " Returns:\n", + " str: Overall analysis\n", + " \"\"\"\n", + " # System prompt to guide the evaluation process\n", + " system_prompt = \"\"\"You are an expert at evaluating information retrieval systems. \n", + " Based on multiple test queries, provide an overall analysis comparing three retrieval approaches:\n", + " 1. Vector-based retrieval (semantic similarity)\n", + " 2. BM25 keyword retrieval (keyword matching)\n", + " 3. Fusion retrieval (combination of both)\n", + "\n", + " Focus on:\n", + " 1. Types of queries where each approach performs best\n", + " 2. Overall strengths and weaknesses of each approach\n", + " 3. How fusion retrieval balances the trade-offs\n", + " 4. Recommendations for when to use each approach\"\"\"\n", + "\n", + " # Create a summary of evaluations for each query\n", + " evaluations_summary = \"\"\n", + " for i, result in enumerate(results):\n", + " evaluations_summary += f\"Query {i+1}: {result['query']}\\n\"\n", + " evaluations_summary += f\"Comparison Summary: {result['comparison'][:200]}...\\n\\n\"\n", + "\n", + " # User prompt containing the evaluations summary\n", + " user_prompt = f\"\"\"Based on the following evaluations of different retrieval methods across {len(results)} queries, \n", + " provide an overall analysis comparing these three approaches:\n", + "\n", + " {evaluations_summary}\n", + "\n", + " Please provide a comprehensive analysis of vector-based, BM25, and fusion retrieval approaches,\n", + " highlighting when and why fusion retrieval provides advantages over the individual methods.\"\"\"\n", + "\n", + " # Generate the overall analysis using meta-llama/Llama-3.2-3B-Instruct\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0\n", + " )\n", + " \n", + " # Return the generated analysis content\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluating Fusion Retrieval" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "=== EVALUATING FUSION RETRIEVAL ===\n", + "\n", + "Extracting text from data/AI_Information.pdf...\n", + "Created 42 text chunks\n", + "Creating embeddings for chunks...\n", + "Added 42 items to vector store\n", + "Created BM25 index with 42 documents\n", + "\n", + "\n", + "=== Evaluating Query 1/1 ===\n", + "Query: What are the main applications of transformer models in natural language processing?\n", + "\n", + "=== Comparing retrieval methods for query: What are the main applications of transformer models in natural language processing? ===\n", + "\n", + "\n", + "Running vector-only RAG...\n", + "\n", + "Running BM25-only RAG...\n", + "\n", + "Running fusion RAG...\n", + "Performing fusion retrieval for query: What are the main applications of transformer models in natural language processing?\n", + "Retrieved 5 documents with fusion retrieval\n", + "\n", + "Comparing responses...\n", + "\n", + "=== Vector-based Response ===\n", + "The provided context does not mention transformer models specifically. However, it does mention Natural Language Processing (NLP) as a branch of AI that focuses on enabling computers to understand, interpret, and generate human language. NLP techniques are used in chatbots, machine translation, text summarization, and sentiment analysis.\n", + "\n", + "Transformer models are a type of neural network architecture that is particularly effective for NLP tasks, such as machine translation, text generation, and text classification. They are not explicitly mentioned in the provided context.\n", + "\n", + "If you're looking for information on transformer models, I can provide general information on this topic. However, please note that the context provided does not specifically address transformer models.\n", + "\n", + "=== BM25 Response ===\n", + "The provided context does not mention transformer models or their applications in natural language processing. The context covers various topics such as deep learning, convolutional neural networks, recurrent neural networks, natural language processing, and machine learning, but it does not specifically discuss transformer models.\n", + "\n", + "If you're looking for information on transformer models, I can provide general information on this topic. Transformer models are a type of neural network architecture that have gained popularity in natural language processing tasks such as machine translation, text generation, and language understanding. They are particularly effective in handling long-range dependencies in sequential data and have been widely adopted in many NLP applications. However, this information is not present in the provided context.\n", + "\n", + "=== Fusion Response ===\n", + "The provided context does not explicitly mention the main applications of transformer models in natural language processing. However, it does mention that Generative Adversarial Networks (GANs) and transformers are examples of generative AI models that can create original content, including images, text, and music.\n", + "\n", + "Based on general knowledge, transformer models are widely used in natural language processing (NLP) for tasks such as:\n", + "\n", + "1. Machine translation\n", + "2. Text generation\n", + "3. Sentiment analysis\n", + "4. Text classification\n", + "5. Language modeling\n", + "\n", + "These models have achieved state-of-the-art results in many NLP tasks and have become a popular choice for many applications.\n", + "\n", + "If you're looking for more specific information on the applications of transformer models in NLP, I can try to provide more general information or point you in the direction of more resources.\n", + "\n", + "=== Comparison ===\n", + "**Comparison of Vector-based, BM25 Keyword, and Fusion Retrieval Approaches**\n", + "\n", + "For the given query, \"What are the main applications of transformer models in natural language processing?\", we can evaluate the responses based on relevance, factual correctness, comprehensiveness, and clarity/coherence.\n", + "\n", + "**Relevance:**\n", + "\n", + "* Vector-based response: 6/10 (The response is relevant to the query, but it does not directly answer the question. It provides general information about NLP and mentions transformer models, but does not explicitly state their main applications.)\n", + "* BM25 keyword response: 5/10 (The response is not directly relevant to the query, as it does not mention transformer models or their applications in NLP.)\n", + "* Fusion response: 9/10 (The response directly answers the question and provides a comprehensive list of transformer models' main applications in NLP.)\n", + "\n", + "**Factual Correctness:**\n", + "\n", + "* Vector-based response: 8/10 (The response is generally correct, but it does not explicitly mention the main applications of transformer models in NLP.)\n", + "* BM25 keyword response: 8/10 (The response is generally correct, but it does not mention transformer models or their applications in NLP.)\n", + "* Fusion response: 9/10 (The response is factually correct and provides a comprehensive list of transformer models' main applications in NLP.)\n", + "\n", + "**Comprehensiveness:**\n", + "\n", + "* Vector-based response: 6/10 (The response provides general information about NLP, but does not explicitly state the main applications of transformer models.)\n", + "* BM25 keyword response: 4/10 (The response does not provide any information about transformer models or their applications in NLP.)\n", + "* Fusion response: 9/10 (The response provides a comprehensive list of transformer models' main applications in NLP.)\n", + "\n", + "**Clarity and Coherence:**\n", + "\n", + "* Vector-based response: 7/10 (The response is clear, but it does not explicitly state the main applications of transformer models.)\n", + "* BM25 keyword response: 6/10 (The response is clear, but it does not mention transformer models or their applications in NLP.)\n", + "* Fusion response: 9/10 (The response is clear, concise, and well-organized, making it easy to understand the main applications of transformer models in NLP.)\n", + "\n", + "**Overall Performance:**\n", + "\n", + "* Vector-based response: 6.5/10\n", + "* BM25 keyword response: 5.5/10\n", + "* Fusion response: 8.5/10\n", + "\n", + "Based on the evaluation, the Fusion retrieval approach performed best for this query. The Fusion response provided a comprehensive list of transformer models' main applications in NLP, was factually correct, and was clear and concise. The Vector-based response was relevant but did not explicitly state the main applications of transformer models, while the BM25 keyword response was not directly relevant to the query.\n", + "\n", + "\n", + "=== OVERALL ANALYSIS ===\n", + "\n", + "**Overall Analysis: Vector-based, BM25, and Fusion Retrieval Approaches**\n", + "\n", + "In this analysis, we will evaluate the performance of three retrieval approaches: Vector-based, BM25 Keyword, and Fusion Retrieval. We will examine the strengths and weaknesses of each approach, their performance on specific query types, and how fusion retrieval balances the trade-offs.\n", + "\n", + "**Query 1: What are the main applications of transformer models in natural language processing?**\n", + "\n", + "For this query, we can evaluate the performance of the three approaches as follows:\n", + "\n", + "1. **Vector-based Retrieval (Semantic Similarity)**: This approach is suitable for queries that require understanding the semantic meaning of the query and the documents. In this case, the query is asking about the main applications of transformer models, which implies a need for semantic understanding. The vector-based approach is likely to perform well, as it can capture the nuances of the query and the documents.\n", + "\n", + "Performance: 8/10\n", + "\n", + "2. **BM25 Keyword Retrieval (Keyword Matching)**: This approach is suitable for queries that require exact keyword matching. In this case, the query is asking about the main applications of transformer models, which implies a need for exact keyword matching. However, the query is also asking about the main applications, which may require a more nuanced understanding of the documents.\n", + "\n", + "Performance: 6/10\n", + "\n", + "3. **Fusion Retrieval (Combination of Both)**: This approach combines the strengths of both vector-based and BM25 keyword retrieval. By using a combination of both approaches, fusion retrieval can capture both the semantic meaning of the query and the exact keyword matching.\n", + "\n", + "Performance: 9/10\n", + "\n", + "**Overall Strengths and Weaknesses of Each Approach**\n", + "\n", + "1. **Vector-based Retrieval (Semantic Similarity)**:\n", + "\t* Strengths: Can capture nuances of the query and documents, suitable for queries that require semantic understanding.\n", + "\t* Weaknesses: May not perform well for queries that require exact keyword matching.\n", + "2. **BM25 Keyword Retrieval (Keyword Matching)**:\n", + "\t* Strengths: Can perform well for queries that require exact keyword matching.\n", + "\t* Weaknesses: May not capture nuances of the query and documents, suitable for queries that require semantic understanding.\n", + "3. **Fusion Retrieval (Combination of Both)**:\n", + "\t* Strengths: Can capture both the semantic meaning of the query and the exact keyword matching, suitable for a wide range of queries.\n", + "\t* Weaknesses: May require more computational resources and complex implementation.\n", + "\n", + "**How Fusion Retrieval Balances the Trade-Offs**\n", + "\n", + "Fusion retrieval balances the trade-offs between vector-based and BM25 keyword retrieval by combining the strengths of both approaches. By using a combination of both, fusion retrieval can capture both the semantic meaning of the query and the exact keyword matching, resulting in a more comprehensive search result.\n", + "\n", + "**Recommendations for When to Use Each Approach**\n", + "\n", + "1. **Vector-based Retrieval (Semantic Similarity)**: Use for queries that require semantic understanding, such as questions that ask about the meaning or context of a term.\n", + "2. **BM25 Keyword Retrieval (Keyword Matching)**: Use for queries that require exact keyword matching, such as searches for specific terms or phrases.\n", + "3. **Fusion Retrieval (Combination of Both)**: Use for queries that require a balance between semantic understanding and exact keyword matching, such as searches for terms or phrases with nuanced meanings.\n", + "\n", + "In conclusion, fusion retrieval provides advantages over individual methods by combining the strengths of both vector-based and BM25 keyword retrieval. By using a combination of both approaches, fusion retrieval can capture both the semantic meaning of the query and the exact keyword matching, resulting in a more comprehensive search result.\n" + ] + } + ], + "source": [ + "# Path to PDF document\n", + "# Path to PDF document containing AI information for knowledge retrieval testing\n", + "pdf_path = \"data/AI_Information.pdf\"\n", + "\n", + "# Define a single AI-related test query\n", + "test_queries = [\n", + " \"What are the main applications of transformer models in natural language processing?\" # AI-specific query\n", + "]\n", + "\n", + "# Optional reference answer\n", + "reference_answers = [\n", + " \"Transformer models have revolutionized natural language processing with applications including machine translation, text summarization, question answering, sentiment analysis, and text generation. They excel at capturing long-range dependencies in text and have become the foundation for models like BERT, GPT, and T5.\",\n", + "]\n", + "\n", + "# Set parameters\n", + "k = 5 # Number of documents to retrieve\n", + "alpha = 0.5 # Weight for vector scores (0.5 means equal weight between vector and BM25)\n", + "\n", + "# Run evaluation\n", + "evaluation_results = evaluate_fusion_retrieval(\n", + " pdf_path=pdf_path,\n", + " test_queries=test_queries,\n", + " reference_answers=reference_answers,\n", + " k=k,\n", + " alpha=alpha\n", + ")\n", + "\n", + "# Print overall analysis\n", + "print(\"\\n\\n=== OVERALL ANALYSIS ===\\n\")\n", + "print(evaluation_results[\"overall_analysis\"])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv-new-specific-rag", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 3827dab58e297ed2df0405370ea3ebf2afdf0628 Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Sun, 9 Mar 2025 18:57:58 +0500 Subject: [PATCH 08/32] KG rag --- 17_graph_rag.ipynb | 959 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 959 insertions(+) create mode 100644 17_graph_rag.ipynb diff --git a/17_graph_rag.ipynb b/17_graph_rag.ipynb new file mode 100644 index 0000000..bb0a653 --- /dev/null +++ b/17_graph_rag.ipynb @@ -0,0 +1,959 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "vscode": { + "languageId": "markdown" + } + }, + "source": [ + "# Graph RAG: Graph-Enhanced Retrieval-Augmented Generation\n", + "\n", + "In this notebook, I implement Graph RAG - a technique that enhances traditional RAG systems by organizing knowledge as a connected graph rather than a flat collection of documents. This allows the system to navigate related concepts and retrieve more contextually relevant information than standard vector similarity approaches.\n", + "\n", + "Key Benefits of Graph RAG\n", + "\n", + "- Preserves relationships between pieces of information\n", + "- Enables traversal through connected concepts to find relevant context\n", + "- Improves handling of complex, multi-part queries\n", + "- Provides better explainability through visualized knowledge paths" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting Up the Environment\n", + "We begin by importing necessary libraries." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import numpy as np\n", + "import json\n", + "import fitz # PyMuPDF\n", + "from openai import OpenAI\n", + "from typing import List, Dict, Tuple, Any\n", + "import networkx as nx\n", + "import matplotlib.pyplot as plt\n", + "import heapq\n", + "from collections import defaultdict\n", + "import re\n", + "from PIL import Image\n", + "import io" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting Up the OpenAI API Client\n", + "We initialize the OpenAI client to generate embeddings and responses." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize the OpenAI client with the base URL and API key\n", + "client = OpenAI(\n", + " base_url=\"https://api.studio.nebius.com/v1/\",\n", + " api_key=os.getenv(\"OPENAI_API_KEY\") # Retrieve the API key from environment variables\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Document Processing Functions" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def extract_text_from_pdf(pdf_path):\n", + " \"\"\"\n", + " Extract text content from a PDF file.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF file\n", + " \n", + " Returns:\n", + " str: Extracted text content\n", + " \"\"\"\n", + " print(f\"Extracting text from {pdf_path}...\") # Print the path of the PDF being processed\n", + " pdf_document = fitz.open(pdf_path) # Open the PDF file using PyMuPDF\n", + " text = \"\" # Initialize an empty string to store the extracted text\n", + " \n", + " # Iterate through each page in the PDF\n", + " for page_num in range(pdf_document.page_count):\n", + " page = pdf_document[page_num] # Get the page object\n", + " text += page.get_text() # Extract text from the page and append to the text string\n", + " \n", + " return text # Return the extracted text content" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def chunk_text(text, chunk_size=1000, overlap=200):\n", + " \"\"\"\n", + " Split text into overlapping chunks.\n", + " \n", + " Args:\n", + " text (str): Input text to chunk\n", + " chunk_size (int): Size of each chunk in characters\n", + " overlap (int): Overlap between chunks in characters\n", + " \n", + " Returns:\n", + " List[Dict]: List of chunks with metadata\n", + " \"\"\"\n", + " chunks = [] # Initialize an empty list to store the chunks\n", + " \n", + " # Iterate over the text with a step size of (chunk_size - overlap)\n", + " for i in range(0, len(text), chunk_size - overlap):\n", + " # Extract a chunk of text from the current position\n", + " chunk_text = text[i:i + chunk_size]\n", + " \n", + " # Ensure we don't add empty chunks\n", + " if chunk_text:\n", + " # Append the chunk with its metadata to the list\n", + " chunks.append({\n", + " \"text\": chunk_text, # The chunk of text\n", + " \"index\": len(chunks), # The index of the chunk\n", + " \"start_pos\": i, # The starting position of the chunk in the original text\n", + " \"end_pos\": i + len(chunk_text) # The ending position of the chunk in the original text\n", + " })\n", + " \n", + " # Print the number of chunks created\n", + " print(f\"Created {len(chunks)} text chunks\")\n", + " \n", + " return chunks # Return the list of chunks" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating Embeddings" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def create_embeddings(texts, model=\"BAAI/bge-en-icl\"):\n", + " \"\"\"\n", + " Create embeddings for the given texts.\n", + " \n", + " Args:\n", + " texts (List[str]): Input texts\n", + " model (str): Embedding model name\n", + " \n", + " Returns:\n", + " List[List[float]]: Embedding vectors\n", + " \"\"\"\n", + " # Handle empty input\n", + " if not texts:\n", + " return []\n", + " \n", + " # Process in batches if needed (OpenAI API limits)\n", + " batch_size = 100\n", + " all_embeddings = []\n", + " \n", + " # Iterate over the input texts in batches\n", + " for i in range(0, len(texts), batch_size):\n", + " batch = texts[i:i + batch_size] # Get the current batch of texts\n", + " \n", + " # Create embeddings for the current batch\n", + " response = client.embeddings.create(\n", + " model=model,\n", + " input=batch\n", + " )\n", + " \n", + " # Extract embeddings from the response\n", + " batch_embeddings = [item.embedding for item in response.data]\n", + " all_embeddings.extend(batch_embeddings) # Add the batch embeddings to the list\n", + " \n", + " return all_embeddings # Return all embeddings" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Knowledge Graph Construction" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def extract_concepts(text):\n", + " \"\"\"\n", + " Extract key concepts from text using OpenAI's API.\n", + " \n", + " Args:\n", + " text (str): Text to extract concepts from\n", + " \n", + " Returns:\n", + " List[str]: List of concepts\n", + " \"\"\"\n", + " # System message to instruct the model on what to do\n", + " system_message = \"\"\"Extract key concepts and entities from the provided text.\n", + "Return ONLY a list of 5-10 key terms, entities, or concepts that are most important in this text.\n", + "Format your response as a JSON array of strings.\"\"\"\n", + "\n", + " # Make a request to the OpenAI API\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_message},\n", + " {\"role\": \"user\", \"content\": f\"Extract key concepts from:\\n\\n{text[:3000]}\"} # Limit for API\n", + " ],\n", + " temperature=0.0,\n", + " response_format={\"type\": \"json_object\"}\n", + " )\n", + " \n", + " try:\n", + " # Parse concepts from the response\n", + " concepts_json = json.loads(response.choices[0].message.content)\n", + " concepts = concepts_json.get(\"concepts\", [])\n", + " if not concepts and \"concepts\" not in concepts_json:\n", + " # Try to get any array in the response\n", + " for key, value in concepts_json.items():\n", + " if isinstance(value, list):\n", + " concepts = value\n", + " break\n", + " return concepts\n", + " except (json.JSONDecodeError, AttributeError):\n", + " # Fallback if JSON parsing fails\n", + " content = response.choices[0].message.content\n", + " # Try to extract anything that looks like a list\n", + " matches = re.findall(r'\\[(.*?)\\]', content, re.DOTALL)\n", + " if matches:\n", + " items = re.findall(r'\"([^\"]*)\"', matches[0])\n", + " return items\n", + " return []" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def build_knowledge_graph(chunks):\n", + " \"\"\"\n", + " Build a knowledge graph from text chunks.\n", + " \n", + " Args:\n", + " chunks (List[Dict]): List of text chunks with metadata\n", + " \n", + " Returns:\n", + " Tuple[nx.Graph, List[np.ndarray]]: The knowledge graph and chunk embeddings\n", + " \"\"\"\n", + " print(\"Building knowledge graph...\")\n", + " \n", + " # Create a graph\n", + " graph = nx.Graph()\n", + " \n", + " # Extract chunk texts\n", + " texts = [chunk[\"text\"] for chunk in chunks]\n", + " \n", + " # Create embeddings for all chunks\n", + " print(\"Creating embeddings for chunks...\")\n", + " embeddings = create_embeddings(texts)\n", + " \n", + " # Add nodes to the graph\n", + " print(\"Adding nodes to the graph...\")\n", + " for i, chunk in enumerate(chunks):\n", + " # Extract concepts from the chunk\n", + " print(f\"Extracting concepts for chunk {i+1}/{len(chunks)}...\")\n", + " concepts = extract_concepts(chunk[\"text\"])\n", + " \n", + " # Add node with attributes\n", + " graph.add_node(i, \n", + " text=chunk[\"text\"], \n", + " concepts=concepts,\n", + " embedding=embeddings[i])\n", + " \n", + " # Connect nodes based on shared concepts\n", + " print(\"Creating edges between nodes...\")\n", + " for i in range(len(chunks)):\n", + " node_concepts = set(graph.nodes[i][\"concepts\"])\n", + " \n", + " for j in range(i + 1, len(chunks)):\n", + " # Calculate concept overlap\n", + " other_concepts = set(graph.nodes[j][\"concepts\"])\n", + " shared_concepts = node_concepts.intersection(other_concepts)\n", + " \n", + " # If they share concepts, add an edge\n", + " if shared_concepts:\n", + " # Calculate semantic similarity using embeddings\n", + " similarity = np.dot(embeddings[i], embeddings[j]) / (np.linalg.norm(embeddings[i]) * np.linalg.norm(embeddings[j]))\n", + " \n", + " # Calculate edge weight based on concept overlap and semantic similarity\n", + " concept_score = len(shared_concepts) / min(len(node_concepts), len(other_concepts))\n", + " edge_weight = 0.7 * similarity + 0.3 * concept_score\n", + " \n", + " # Only add edges with significant relationship\n", + " if edge_weight > 0.6:\n", + " graph.add_edge(i, j, \n", + " weight=edge_weight,\n", + " similarity=similarity,\n", + " shared_concepts=list(shared_concepts))\n", + " \n", + " print(f\"Knowledge graph built with {graph.number_of_nodes()} nodes and {graph.number_of_edges()} edges\")\n", + " return graph, embeddings" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Graph Traversal and Query Processing" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def traverse_graph(query, graph, embeddings, top_k=5, max_depth=3):\n", + " \"\"\"\n", + " Traverse the knowledge graph to find relevant information for the query.\n", + " \n", + " Args:\n", + " query (str): The user's question\n", + " graph (nx.Graph): The knowledge graph\n", + " embeddings (List): List of node embeddings\n", + " top_k (int): Number of initial nodes to consider\n", + " max_depth (int): Maximum traversal depth\n", + " \n", + " Returns:\n", + " List[Dict]: Relevant information from graph traversal\n", + " \"\"\"\n", + " print(f\"Traversing graph for query: {query}\")\n", + " \n", + " # Get query embedding\n", + " query_embedding = create_embeddings(query)\n", + " \n", + " # Calculate similarity between query and all nodes\n", + " similarities = []\n", + " for i, node_embedding in enumerate(embeddings):\n", + " similarity = np.dot(query_embedding, node_embedding) / (np.linalg.norm(query_embedding) * np.linalg.norm(node_embedding))\n", + " similarities.append((i, similarity))\n", + " \n", + " # Sort by similarity (descending)\n", + " similarities.sort(key=lambda x: x[1], reverse=True)\n", + " \n", + " # Get top-k most similar nodes as starting points\n", + " starting_nodes = [node for node, _ in similarities[:top_k]]\n", + " print(f\"Starting traversal from {len(starting_nodes)} nodes\")\n", + " \n", + " # Initialize traversal\n", + " visited = set() # Set to keep track of visited nodes\n", + " traversal_path = [] # List to store the traversal path\n", + " results = [] # List to store the results\n", + " \n", + " # Use a priority queue for traversal\n", + " queue = []\n", + " for node in starting_nodes:\n", + " heapq.heappush(queue, (-similarities[node][1], node)) # Negative for max-heap\n", + " \n", + " # Traverse the graph using a modified breadth-first search with priority\n", + " while queue and len(results) < (top_k * 3): # Limit results to top_k * 3\n", + " _, node = heapq.heappop(queue)\n", + " \n", + " if node in visited:\n", + " continue\n", + " \n", + " # Mark as visited\n", + " visited.add(node)\n", + " traversal_path.append(node)\n", + " \n", + " # Add current node's text to results\n", + " results.append({\n", + " \"text\": graph.nodes[node][\"text\"],\n", + " \"concepts\": graph.nodes[node][\"concepts\"],\n", + " \"node_id\": node\n", + " })\n", + " \n", + " # Explore neighbors if we haven't reached max depth\n", + " if len(traversal_path) < max_depth:\n", + " neighbors = [(neighbor, graph[node][neighbor][\"weight\"]) \n", + " for neighbor in graph.neighbors(node)\n", + " if neighbor not in visited]\n", + " \n", + " # Add neighbors to queue based on edge weight\n", + " for neighbor, weight in sorted(neighbors, key=lambda x: x[1], reverse=True):\n", + " heapq.heappush(queue, (-weight, neighbor))\n", + " \n", + " print(f\"Graph traversal found {len(results)} relevant chunks\")\n", + " return results, traversal_path" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Response Generation" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_response(query, context_chunks):\n", + " \"\"\"\n", + " Generate a response using the retrieved context.\n", + " \n", + " Args:\n", + " query (str): The user's question\n", + " context_chunks (List[Dict]): Relevant chunks from graph traversal\n", + " \n", + " Returns:\n", + " str: Generated response\n", + " \"\"\"\n", + " # Extract text from each chunk in the context\n", + " context_texts = [chunk[\"text\"] for chunk in context_chunks]\n", + " \n", + " # Combine the extracted texts into a single context string, separated by \"---\"\n", + " combined_context = \"\\n\\n---\\n\\n\".join(context_texts)\n", + " \n", + " # Define the maximum allowed length for the context (OpenAI limit)\n", + " max_context = 14000\n", + " \n", + " # Truncate the combined context if it exceeds the maximum length\n", + " if len(combined_context) > max_context:\n", + " combined_context = combined_context[:max_context] + \"... [truncated]\"\n", + " \n", + " # Define the system message to guide the AI assistant\n", + " system_message = \"\"\"You are a helpful AI assistant. Answer the user's question based on the provided context.\n", + "If the information is not in the context, say so. Refer to specific parts of the context in your answer when possible.\"\"\"\n", + "\n", + " # Generate the response using the OpenAI API\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\", # Specify the model to use\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_message}, # System message to guide the assistant\n", + " {\"role\": \"user\", \"content\": f\"Context:\\n{combined_context}\\n\\nQuestion: {query}\"} # User message with context and query\n", + " ],\n", + " temperature=0.2 # Set the temperature for response generation\n", + " )\n", + " \n", + " # Return the generated response content\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Visualization" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def visualize_graph_traversal(graph, traversal_path):\n", + " \"\"\"\n", + " Visualize the knowledge graph and the traversal path.\n", + " \n", + " Args:\n", + " graph (nx.Graph): The knowledge graph\n", + " traversal_path (List): List of nodes in traversal order\n", + " \"\"\"\n", + " plt.figure(figsize=(12, 10)) # Set the figure size\n", + " \n", + " # Define node colors, default to light blue\n", + " node_color = ['lightblue'] * graph.number_of_nodes()\n", + " \n", + " # Highlight traversal path nodes in light green\n", + " for node in traversal_path:\n", + " node_color[node] = 'lightgreen'\n", + " \n", + " # Highlight start node in green and end node in red\n", + " if traversal_path:\n", + " node_color[traversal_path[0]] = 'green'\n", + " node_color[traversal_path[-1]] = 'red'\n", + " \n", + " # Create positions for all nodes using spring layout\n", + " pos = nx.spring_layout(graph, k=0.5, iterations=50, seed=42)\n", + " \n", + " # Draw the graph nodes\n", + " nx.draw_networkx_nodes(graph, pos, node_color=node_color, node_size=500, alpha=0.8)\n", + " \n", + " # Draw edges with width proportional to weight\n", + " for u, v, data in graph.edges(data=True):\n", + " weight = data.get('weight', 1.0)\n", + " nx.draw_networkx_edges(graph, pos, edgelist=[(u, v)], width=weight*2, alpha=0.6)\n", + " \n", + " # Draw traversal path with red dashed lines\n", + " traversal_edges = [(traversal_path[i], traversal_path[i+1]) \n", + " for i in range(len(traversal_path)-1)]\n", + " \n", + " nx.draw_networkx_edges(graph, pos, edgelist=traversal_edges, \n", + " width=3, alpha=0.8, edge_color='red', \n", + " style='dashed', arrows=True)\n", + " \n", + " # Add labels with the first concept for each node\n", + " labels = {}\n", + " for node in graph.nodes():\n", + " concepts = graph.nodes[node]['concepts']\n", + " label = concepts[0] if concepts else f\"Node {node}\"\n", + " labels[node] = f\"{node}: {label}\"\n", + " \n", + " nx.draw_networkx_labels(graph, pos, labels=labels, font_size=8)\n", + " \n", + " plt.title(\"Knowledge Graph with Traversal Path\") # Set the plot title\n", + " plt.axis('off') # Turn off the axis\n", + " plt.tight_layout() # Adjust layout\n", + " plt.show() # Display the plot" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Complete Graph RAG Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def graph_rag_pipeline(pdf_path, query, chunk_size=1000, chunk_overlap=200, top_k=3):\n", + " \"\"\"\n", + " Complete Graph RAG pipeline from document to answer.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF document\n", + " query (str): The user's question\n", + " chunk_size (int): Size of text chunks\n", + " chunk_overlap (int): Overlap between chunks\n", + " top_k (int): Number of top nodes to consider for traversal\n", + " \n", + " Returns:\n", + " Dict: Results including answer and graph visualization data\n", + " \"\"\"\n", + " # Extract text from the PDF document\n", + " text = extract_text_from_pdf(pdf_path)\n", + " \n", + " # Split the extracted text into overlapping chunks\n", + " chunks = chunk_text(text, chunk_size, chunk_overlap)\n", + " \n", + " # Build a knowledge graph from the text chunks\n", + " graph, embeddings = build_knowledge_graph(chunks)\n", + " \n", + " # Traverse the knowledge graph to find relevant information for the query\n", + " relevant_chunks, traversal_path = traverse_graph(query, graph, embeddings, top_k)\n", + " \n", + " # Generate a response based on the query and the relevant chunks\n", + " response = generate_response(query, relevant_chunks)\n", + " \n", + " # Visualize the graph traversal path\n", + " visualize_graph_traversal(graph, traversal_path)\n", + " \n", + " # Return the query, response, relevant chunks, traversal path, and the graph\n", + " return {\n", + " \"query\": query,\n", + " \"response\": response,\n", + " \"relevant_chunks\": relevant_chunks,\n", + " \"traversal_path\": traversal_path,\n", + " \"graph\": graph\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluation Function" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def evaluate_graph_rag(pdf_path, test_queries, reference_answers=None):\n", + " \"\"\"\n", + " Evaluate Graph RAG on multiple test queries.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF document\n", + " test_queries (List[str]): List of test queries\n", + " reference_answers (List[str], optional): Reference answers for comparison\n", + " \n", + " Returns:\n", + " Dict: Evaluation results\n", + " \"\"\"\n", + " # Extract text from PDF\n", + " text = extract_text_from_pdf(pdf_path)\n", + " \n", + " # Split text into chunks\n", + " chunks = chunk_text(text)\n", + " \n", + " # Build knowledge graph (do this once for all queries)\n", + " graph, embeddings = build_knowledge_graph(chunks)\n", + " \n", + " results = []\n", + " \n", + " for i, query in enumerate(test_queries):\n", + " print(f\"\\n\\n=== Evaluating Query {i+1}/{len(test_queries)} ===\")\n", + " print(f\"Query: {query}\")\n", + " \n", + " # Traverse graph to find relevant information\n", + " relevant_chunks, traversal_path = traverse_graph(query, graph, embeddings)\n", + " \n", + " # Generate response\n", + " response = generate_response(query, relevant_chunks)\n", + " \n", + " # Compare with reference answer if available\n", + " reference = None\n", + " comparison = None\n", + " if reference_answers and i < len(reference_answers):\n", + " reference = reference_answers[i]\n", + " comparison = compare_with_reference(response, reference, query)\n", + " \n", + " # Append results for the current query\n", + " results.append({\n", + " \"query\": query,\n", + " \"response\": response,\n", + " \"reference_answer\": reference,\n", + " \"comparison\": comparison,\n", + " \"traversal_path_length\": len(traversal_path),\n", + " \"relevant_chunks_count\": len(relevant_chunks)\n", + " })\n", + " \n", + " # Display results\n", + " print(f\"\\nResponse: {response}\\n\")\n", + " if comparison:\n", + " print(f\"Comparison: {comparison}\\n\")\n", + " \n", + " # Return evaluation results and graph statistics\n", + " return {\n", + " \"results\": results,\n", + " \"graph_stats\": {\n", + " \"nodes\": graph.number_of_nodes(),\n", + " \"edges\": graph.number_of_edges(),\n", + " \"avg_degree\": sum(dict(graph.degree()).values()) / graph.number_of_nodes()\n", + " }\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def compare_with_reference(response, reference, query):\n", + " \"\"\"\n", + " Compare generated response with reference answer.\n", + " \n", + " Args:\n", + " response (str): Generated response\n", + " reference (str): Reference answer\n", + " query (str): Original query\n", + " \n", + " Returns:\n", + " str: Comparison analysis\n", + " \"\"\"\n", + " # System message to instruct the model on how to compare the responses\n", + " system_message = \"\"\"Compare the AI-generated response with the reference answer.\n", + "Evaluate based on: correctness, completeness, and relevance to the query.\n", + "Provide a brief analysis (2-3 sentences) of how well the generated response matches the reference.\"\"\"\n", + "\n", + " # Construct the prompt with the query, AI-generated response, and reference answer\n", + " prompt = f\"\"\"\n", + "Query: {query}\n", + "\n", + "AI-generated response:\n", + "{response}\n", + "\n", + "Reference answer:\n", + "{reference}\n", + "\n", + "How well does the AI response match the reference?\n", + "\"\"\"\n", + "\n", + " # Make a request to the OpenAI API to generate the comparison analysis\n", + " comparison = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_message}, # System message to guide the assistant\n", + " {\"role\": \"user\", \"content\": prompt} # User message with the prompt\n", + " ],\n", + " temperature=0.0 # Set the temperature for response generation\n", + " )\n", + " \n", + " # Return the generated comparison analysis\n", + " return comparison.choices[0].message.content" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluation of Graph RAG on a Sample PDF Document" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Extracting text from data/AI_Information.pdf...\n", + "Created 42 text chunks\n", + "Building knowledge graph...\n", + "Creating embeddings for chunks...\n", + "Adding nodes to the graph...\n", + "Extracting concepts for chunk 1/42...\n", + "Extracting concepts for chunk 2/42...\n", + "Extracting concepts for chunk 3/42...\n", + "Extracting concepts for chunk 4/42...\n", + "Extracting concepts for chunk 5/42...\n", + "Extracting concepts for chunk 6/42...\n", + "Extracting concepts for chunk 7/42...\n", + "Extracting concepts for chunk 8/42...\n", + "Extracting concepts for chunk 9/42...\n", + "Extracting concepts for chunk 10/42...\n", + "Extracting concepts for chunk 11/42...\n", + "Extracting concepts for chunk 12/42...\n", + "Extracting concepts for chunk 13/42...\n", + "Extracting concepts for chunk 14/42...\n", + "Extracting concepts for chunk 15/42...\n", + "Extracting concepts for chunk 16/42...\n", + "Extracting concepts for chunk 17/42...\n", + "Extracting concepts for chunk 18/42...\n", + "Extracting concepts for chunk 19/42...\n", + "Extracting concepts for chunk 20/42...\n", + "Extracting concepts for chunk 21/42...\n", + "Extracting concepts for chunk 22/42...\n", + "Extracting concepts for chunk 23/42...\n", + "Extracting concepts for chunk 24/42...\n", + "Extracting concepts for chunk 25/42...\n", + "Extracting concepts for chunk 26/42...\n", + "Extracting concepts for chunk 27/42...\n", + "Extracting concepts for chunk 28/42...\n", + "Extracting concepts for chunk 29/42...\n", + "Extracting concepts for chunk 30/42...\n", + "Extracting concepts for chunk 31/42...\n", + "Extracting concepts for chunk 32/42...\n", + "Extracting concepts for chunk 33/42...\n", + "Extracting concepts for chunk 34/42...\n", + "Extracting concepts for chunk 35/42...\n", + "Extracting concepts for chunk 36/42...\n", + "Extracting concepts for chunk 37/42...\n", + "Extracting concepts for chunk 38/42...\n", + "Extracting concepts for chunk 39/42...\n", + "Extracting concepts for chunk 40/42...\n", + "Extracting concepts for chunk 41/42...\n", + "Extracting concepts for chunk 42/42...\n", + "Creating edges between nodes...\n", + "Knowledge graph built with 42 nodes and 110 edges\n", + "Traversing graph for query: What are the key applications of transformers in natural language processing?\n", + "Starting traversal from 3 nodes\n", + "Graph traversal found 9 relevant chunks\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAPdCAYAAABba9tpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3iURdfH8e+9u+mFQIDQQYp0CL0lVAEB6SB2UXiwPIIFsPIqKooKCj7YBbuiUqQoiqAgvRt6h9B7COlld+/3j5iVpQZIsim/z3Xl0p2de+ZsSdiczJwxTNM0ERERERERERERyUUWTwcgIiIiIiIiIiKFj5JSIiIiIiIiIiKS65SUEhERERERERGRXKeklIiIiIiIiIiI5DolpUREREREREREJNcpKSUiIiIiIiIiIrlOSSkREREREREREcl1SkqJiIiIiIiIiEiuU1JKRERERERERERynZJSIiIiecjixYsxDIPFixdn25ijR4/GMIxsG68gGThwIIGBgbk6Z3R0NIZh8MUXX2S57/jx43M+sEJm4MCBVKpUydNhuFSqVInbbrvN02GIiIjkKiWlRESkwPriiy8wDIN169a5tZ87d46mTZvi6+vLb7/95qHoCg+n08lXX31Fx44dKV68OF5eXpQsWZJOnTrxySefkJqa6ukQPW7evHmMHj06W8esVKkShmFc9SsrybHCrG3btm7PV7FixWjSpAmfffYZTqfzmsbatm0bo0ePJjo6OmeCFRERyWdsng5AREQkN8XFxdGpUyc2bdrETz/9xK233urpkAq05ORkevfuzfz582nZsiUjRowgLCyMmJgY/vrrLx599FFWr17NlClTPB1qrqlYsSLJycl4eXm52ubNm8f777+frYmpiRMnkpCQ4DbH1KlTmTBhAsWLF3e1t2zZMtvmLKjKlSvH2LFjATh16hRfffUVgwYNYteuXbzxxhtZHmfbtm28/PLLtG3bNk+t0hIREfEUJaVERKTQiI+Pp3PnzkRFRTFz5ky6dOni6ZAKvCeffJL58+czceJEHn/8cbf7hg8fzu7du1mwYMEVx7Db7TidTry9vXMy1FxjGAa+vr45Pk+vXr3cbh8/fpypU6fSq1evKyZEEhMTCQgIyNngrpGnYypSpAj33HOP6/ZDDz1E9erVee+993j11VfdEowiIiKSddq+JyIihUJCQgK3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UcK1hfRS75OsqFSpEgsWLGDhwoUsW7aM48eP8/PPP7tOMUxOTubFF1901ZkrXrw4JUqUIDY29prmvPB1hqy/F0VERPIj1ZQSEZECr1atWsybN48OHTrQsWNHli9ffslVU1arNVvnjYiI4LXXXiMlJYWlS5fywgsvEBISQp06dVi6dKmrrtGVEhaZq0fGjRt3Uc2kTIGBgaSmpmZr7OfPfc8993D//fdfsk+9evUue32NGjUA2LJlC/Xr13e1lyhRgltuuQWAb7755pLXnr/yJNM333zDwIED6dWrFyNHjqRkyZJYrVbGjh3rtkrnWt3I6x4REcGnn37Kvn37XIlHwzCIiIhg6dKllClTBqfTecNJqcvFaJ5XZP16+fj4YLG4/53S4XDQsWNHYmJieOaZZ6hRowYBAQEcOXKEgQMHuq1qKlOmDJGRkfz44488//zzrFq1ioMHD/Lmm2+6+mT1fXy+S70HnnjiCbp3786sWbOYP38+//d//8fYsWP5888/adCgAbGxsbRp04bg4GBeeeUVqlSpgq+vLxs2bOCZZ565aDVWVgUEBLjes5cydOhQPv/8c5544glatGhBkSJFMAyDO+6445rmzMnXWUREJC9SUkpERAqFpk2bMmvWLLp160bHjh1ZunTpRatjsqJixYosXLiQ+Ph4t9VSmduCzt+KFhkZSVpaGlOnTuXIkSOuxETr1q1dSambb775koXIM1WpUgWA4ODgK/5SXKJECfz8/FwrUs534eqwihUr4nQ62b9/v9tqoj179lw0ZlBQEA6H44pzX06XLl2wWq18++23rhPdbsT06dOpXLkyM2fOdNsK99JLL12y/6Wei127drkKYmeHzNd0wYIFrF27lmeffRbIeI0//PBDypQpQ0BAAI0aNbriODeytS8nbN68mV27dvHll19y3333udoXLFhwyf4DBgzg0UcfZefOnfzwww/4+/vTvXt31/1ZfR9nRZUqVRg+fDjDhw9n9+7dhIeH8/bbb/PNN9+wePFizpw5w8yZM90Ky+/fv/+G5rya6dOnc//99/P222+72lJSUoiNjXXrl9deZxEREU/T9j0RESk0OnTowNSpU9mzZw+33nqrq+bRtejatSsOh4P33nvPrX3ChAkYhkGXLl1cbc2aNcPLy4s333yTYsWKuU7PioyMZNWqVfz1119XXUHTqFEjqlSpwvjx4y/aBgcZW+wgY4VF586dmTVrFgcPHnTdv337dubPn+92TWaNqQ8++MCtfdKkSW63rVYrffv2ZcaMGWzZsuWyc19OhQoVePDBB/n1118ver4yXcsKkMxVJOdfs3r1alauXHnJ/rNmzeLIkSOu22vWrGH16tVur9GNuummmyhbtiwTJkwgPT3ddYpiZGQke/fuZfr06TRv3hyb7cp/BwwICAC4KInhKZd6rk3T5N13371k/759+2K1Wpk6dSrTpk3jtttucz0myPr7+EqSkpJISUlxa6tSpQpBQUGulYKXijstLe2i93p2s1qtF72XJ02ahMPhcGvLa6+ziIiIp2mllIiIFCq9e/fm008/5cEHH6RHjx789ttv+Pr6Zvn67t27065dO1544QWio6OpX78+v//+O7Nnz+aJJ55wrQgB8Pf3p1GjRqxatYru3bu7Vkm0bt2axMREEhMTr5qUslgsTJ48mS5dulC7dm0eeOABypYty5EjR1i0aBHBwcHMnTsXgJdffpnffvuNyMhIHn30Uex2O5MmTaJ27dps2rTJNWajRo3o27cvEydO5MyZMzRv3py//vqLXbt2Ae6rOd544w0WLVpEs2bN+M9//kOtWrWIiYlhw4YNLFy4kJiYmCvGP3HiRPbv38/QoUP5/vvv6d69OyVLluT06dMsX76cuXPnXlTz6nJuu+02Zs6cSe/evenWrRv79+/no48+olatWpdMdFStWpWIiAgeeeQRUlNTmThxIqGhoTz99NNZmi+rIiMj+f7776lbt66r1lPDhg0JCAhg165d3HXXXVcdI3Ml1bBhw+jcuTNWq5U77rgjW+O8FjVq1KBKlSqMGDGCI0eOEBwczIwZMy5b26hkyZK0a9eOd955h/j4eAYMGOB2/7W8jy9n165ddOjQgdtvv51atWphs9n46aefOHHihOu5atmyJUWLFuX+++9n2LBhGIbB119/nePb32677Ta+/vprihQpQq1atVi5ciULFy4kNDTUrV94eDhWq5U333yTc+fO4ePjQ/v27SlZsmSOxiciIpJXKSklIiKFzgMPPEBMTAwjRoygf//+/PTTT1m+1mKxMGfOHF588UV++OEHPv/8cypVqsS4ceMYPnz4Rf0zV0VFRES42kqVKkXVqlXZs2dPlmoNtW3blpUrV/Lqq6/y3nvvkZCQQKlSpWjWrBkPPfSQq1+9evWYP38+Tz31FC+++CLlypXj5Zdf5tixY25JKYCvvvqKUqVKMXXqVH766SduueUWfvjhB6pXr+6WpAsLC2PNmjW88sorzJw5kw8++IDQ0FBq167tVjPocvz9/fntt9/4+uuv+frrr3nrrbeIi4sjJCSE+vXr88EHH1y2XtWFBg4cyPHjx/n444+ZP38+tWrV4ptvvmHatGksXrz4ov733XcfFouFiRMncvLkSZo2bcp7771H6dKlszRfVmUmpc5/jW02Gy1atGDhwoVZeo379OnjStx98803mKbp0aSUl5cXc+fOZdiwYYwdOxZfX1969+7NY4895lYf7HwDBgxg4cKFBAUF0bVr14vuz+r7+HLKly/PnXfeyR9//MHXX3+NzWajRo0a/Pjjj/Tt2xeA0NBQfv75Z4YPH86oUaMoWrQo99xzDx06dLjoFMrs9O6777q2qqakpNCqVSsWLlx40ZylSpXio48+YuzYsQwaNAiHw8GiRYuUlBIRkULLMFU5UURERICoqCgaNGjAN998ky01oDwlOjqam266iXHjxjFixAhPhyMiIiIil6GaUiIiIoVQcnLyRW0TJ07EYrG4FYgWEREREckp2r4nIiJSCL311lusX7+edu3aYbPZ+PXXX/n1118ZMmQI5cuX93R4IiIiIlIIKCklIiJSCLVs2ZIFCxbw6quvkpCQQIUKFRg9ejQvvPCCp0MTERERkUJCNaVERERERERERCTXqaaUiIiIiIiIiIjkOiWlREREREREREQk1ykpJSIiIiIiIiIiuU5JKRERERERERERyXVKSomIiIiIiIiISK5TUkpERERERERERHKdklIiIiIiIiIiIpLrlJQSEREREREREZFcp6SUiIiIiIiIiIjkOiWlREREREREREQk1ykpJSIiIiIiIiIiuU5JKRERERERERERyXVKSomIiIiIiIiISK5TUkpERERERERERHKdklIiIiIiIiIiIpLrlJQSEREREREREZFcp6SUiIiIiIiIiIjkOiWlREREREREREQk1ykpJSIiIiIiIiIiuU5JKRERERERERERyXVKSomIiIiIiIiISK5TUkpERERERERERHKdklIiIiIiIiIiIpLrlJQSEREREREREZFcp6SUiIiIiIiIiIjkOiWlREREREREREQk1ykpJSIiIiIiIiIiuU5JKRER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jBs3jvDwcCZPnszixYsJDw93XbtlyxYqVaoEQHR0NCEhITzzzDM0bNiQ995777JjX6933nmHJk2aEB4eTpMmTVi5ciUAiWkOHmzbmC8mvMljfbpwd2Qjvpn0tuu6g3t381ifLjzYKYKXHh7I0/f257fpUwF4c8Rj/PDJ+xw7doyU5BR+/OhdFvz4DUWKhLBh+VIe69OFh7q148FOEcz74RvXmGdOHufpe/vzyK2R3N+nB3fccQej/6khlJ6ezrPPPkvTpk0JDw/n9ttv5+zZs1d9fI0bNyYwMJDo6GgGDhzIgw8+SOvWralTpw4A48aNo3bt2tStW5e7777btfotLS2NkSNHUqdOHerXr8+tt97qGnP8+PE0bdqUhg0bcuutt7qOlJ87dy716tUjPDycOnXqMHv2bADGjBlDzZo1XSvyMvsbhkFsbCyQsZLtxRdfpEWLFtx0002MGTPGNd+OHTto0aIFtWvXpk+fPnTq1OnfVXlt2/6bmPLygltuuepz4mldu3bF39+fefPm3fhKMYAvv8xISi1alLFyas6cGx9TCo3GjRvj4+PDypUr80SyWkRE5FrZPB2AiFyfxDQ7f584R7rDxNd6+W1618Pb+m+tKX8vK2WD/LJtbMle9913H6Zp0rRpU9544w1KlCgBwODBg+nRowc9evS45HWlSpXioYce4qWXXuLTTz91u69hw4YsW7YMq9VKTEwMDRo0oHPnznTt2pUePXoQHh7OE088AcDixYuvGN+5c+eoXbs2b775JgBnz5695NjlypW7rsd/77338tQ/W6BWrVrFwIED2bFjB45/kqmJced4b+avnIs5w71tm9C5/12UKFWaN556lB73PMCt/e/iwJ5dPNStPe179nGNm5SUSGpqKv7+/gQEBOBl8wKgWp16vDvtZ6xWK3GxZ3moW3uatG5PidJleG/089Rq2JhXhn4P8Wd5sEtbatSoAWQkjzJPygJ49dVXGTVqFO+///4VH9/ChQtJTU2lWrVqAKxfv55ly5YRFBTEr7/+ymeffcbKlSsJCQlhyJAhPPvss3z44YeMHTuWXbt2sX79enx8fDh16hQA3333HTt37mTlypVYrVa+/vprHn30UX755RdGjRrFxx9/TIsWLXA6ncTFxXH27FnGjx/PsWPH8PPzIykpCYvl0n/Pio2NZeXKlZw+fZoqVarwwAMPULZsWe69914effRRHnjgAbZv306DBg246667Mi6KjISPPoItW6B1a6hQ4XreBrkqICCAbt26MW3aNH755RfuuOOOGxtwzx7326+/DhUrQv36NzauFAo+Pj40adKEZcuWERUVRePGjT0dkoiIyDVRUkokHzJNk62n410rpLIzIZXJ22ohxeFgx5kEivl64+d1+S1L4hlLliyhQoUKpKenM2rUKO6//37mzZsHwOTJk696/ciRI6levTo7duxwaz9z5gyDBg1i165d2Gw2zpw5w5YtW64rceTl5cU999yTI2MD/P3337z22mucOXMGm83Gzp07SU5Odt3fvmdfAIoUC6V0+YocP3QA/4BA9mzbQsc+GdsdK1a9mbpNmrmucTgcJCcnk5qaSlhYmOt0PYC4szGMf+YJDu/f+09iKob9u7ZTonQZ/l6xlIeffxmA0JJh3Hbbba7rZs2axblz55gxYwaQsZIpc0XZpURGRmK1WilatCizZ8+mSJEiAPTv39+1ZW7hwoUMGDCAkJAQAB555BH69+8PwM8//8ybb76Jj09G7avMZOWsWbNYu3YtjRo1cj3WTB06dODxxx+nX79+dOrUifDwcBwOB9WqVeOee+6hU6dOdOvW7bKvVWaiqXjx4lSuXJn9+/cTFBREVFQU9913HwA1a9Z0bTdyadQo4ysfadu2LYsWLeKvv/6iXbt2hIWFXf9g3brB77//e9tuz9jK9+WX/27xE7mCiIgIli1bxrJly5SUEhGRfEfb90TyoYNxyZxOSsP7CoXMs4OPxUKK3cm20/HaxpcHVfhnVYmXlxdPPPEES5cuvabrg4ODeeaZZ3juuefc2h9++GEiIiLYvHkzUVFR3HzzzaSkpFxyDJvN5pbYuLCfv7+/28qaaxn7atLS0ujTpw/jx49ny5YtLPmnHk9qairWf74vvH3+LUhusVrdYnX37/eR1WrDYrHg4+PD6TNnSEz8d4vWxFEjqdO4GZN/W8In8xZT7qYqpKWmuo1kAjaL+6l/pmkyadIkV/2vbdu2uRKIl7J06VKioqJYtGgRbdu2dbUHBgZe9pqs/CwwTZPnnnvOFcfmzZvZvHkzkLEV8vPPP8ff35/777+ft956C6vVyqpVq3jiiSc4efIkzZs3v+z7zNfX1/X/Vqv1sluJcvJnVm6x2Wz07t0bp9PJzJkzb2ywVq3g7rvd22JiMk7pS0q6sbGlUKhUqRJlypRh+/btF9WfExERyeuUlBLJZxxOk32xGb+o3GgNqasxDAMvi8HJpDRib7Bws2SvxMREVz0fgKlTp9KgQYNrHueRRx4hKiqK9evXu9rOnj1LxYoVMQyDJUuWsHHjRtd9wcHBbqf2Va5cmQMHDri2h3399ddXnO9KY1+rlJQU0tLSXMm5SZMmue4L8M5Y2XepZGpAUBBVatZm4ayMU+0O7d3DlnWrXfeXrliR6J3bKVasGMkJ8axZ/CdpaRmJp/hzsYSVLYdhGGxavYJ927e6rgtvEcH8Gd9nxBYbw88//+y6r1evXkyYMIGkf5IMSUlJbN3677XX45ZbbuHHH38kLi4OgI8//phOnToB0KNHD959911S/0mYZb4+vXr14qOPPiImJgbIqHX1999/Axm1n2rXrs1jjz3GI488wqpVq4iPj+fEiRNERkbyf//3f0RERLj6Z0VwcDD169fnm28yam/t3LnT/fj6DRvgrrsyvq7hdMW8oFGjRtx0001ERUWxe/fuGxvs8cehZUv3tl27YPRocDpvbGwp8AzDcK1AXLFihYejERERuTZKSonkMyeTUklOd+BtzZ1vX6th4DRNDsclX72z5JoTJ07Qrl076tWrR926dfnrr7/46quvXPcPHjyYOVkomOzj48Mrr7xCdHS0q+2NN97g2WefJTw8nM8++4xmzf7d2nbvvffy448/0qBBAyZPnkyZMmV4+umnadq0Kc2bN6dYsWJXnO9KY19NZu2pzK+4uDjGjBlD06ZNadSoEd7e3q6+Qd42wOByC/yeeft95n7zBYM6R/LJm69QvV44gcEZW+Ru7XcX8bFnebxPF74cN4aqteuSlJRMXHwcg5/+Pya/9SpDurbl12nfUSP8321n/33pdTatWckjt0by7KODadasmWtr3TPPPEOTJk1o1qwZ9erVo3nz5kTdYBKmS5cuPPDAA7Ro0YK6desSFxfH2LFjXfPdfPPNNGzYkPDwcO6//34A7r77bgYOHEi7du2oX78+4eHhrlPknn/+eWrXrk2DBg34+uuvGT16NOfOnaNPnz7UrVuXevXqkZ6e7horq7766is+/PBD6tSp43oeQkJCMpItL72UkXzZtQuef57LvmB5kGEYru2S06dPv7HVpBYLvPZaRi2p8/35J1xQ803kUpo3b47NZmP5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p5SEhITEf4GHH7YJBzdwS13LJVWDKIqcv3ABo8GAh4cHzlarbXuXLmu1Ql4ePPccZyZNIjY2lkOHDlFSUgLYylQiIyOJjIzEw8ODkydP2kWqnJwcKisra+3T2dmZgIAAAgMDCQoKomnTpjf91HvFihVs376dGTNmXLPcYtu2baxcuZLBgwdz77331nnboigyd+5c4uLi6N+/P6NHj75imYSEBH766ScsFgsPPfQQnTt3rvX+F198QVpaGp988kmdXRWXotPpiImJ4Y8//rCf75YtW9K/f39atWp157J8pkyBuLg/f37xRRg3zv6jKIq8++67nD9/nvfee6+WuLFq1SpWr15Njx49KCsrIycnxz6x9fX1pV27drRt27bOpV4ffvghixYtolevXnz99dc3LUqVlJSwdOlSEhISUCgUDBkyhAEDBtxSdteOHTtYvnw5np6evPvuu/9I4cVoNJKdnU1aWhqpqan89ttvODs7065dO7y9ve0uqpCQkOt2GawLJpOJtLQ04uPjSUhIQKfTATYBsm3btnTo0IGWLVveMZfLX4HRaGTDhg32Do2hoaFMmDChlpuyBlEU+eSTT8jOzuall16yZ6xVVlayadMmoqOjsVgsNGnShNGjR9s7ud4OsrKy+P7776msFpOmTp1a95JBqxW6deP8mTOYTCabEL5uHVQLWruio6mcPp2ICxdqu2w7dIBvv7V3aL1ZLnemRUREMH78eIqKivjf//53zd/Ht0pxcTGvvvoqrVu35plnnrnt25eQkJD4r/DP+2tIQkJCQuL28/jjsGsXlJbaOvJdheu5pGoQBAFvb2/OnTuHePo0Vmwt7ikuhqZNbQJVfj54e8OECTRu3JjGjRszYsQIMjMziY2NJT4+nk2bNrFp0yaaNWtGZGQk3bp1Y+DAgfbSouzsbHJycjh+/Djnzp0jISHB3k1MLpfTrFmzWm6qukyeRFEkISEBNze36zpdarZVXl5+w21efm4mTpzIiRMn2L59O6GhoVd0Y2vXrh3Tpk3j22+/Zd68eZSXl9fKO2nRooXdrdKxY8d67R9sk/l77rmHvn37EhcXx/bt2+0OmIYNG9K/f386d+58+8WQy8/Vpe3igcTERPLy8ujatSuenp5YrVays7NJTExkzpw55OXloVKpUKlUBAUF2YWoq03cb4Sjo6Nd1LoZEU4URfbt28eK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RASNGjW6rV0YLyU6Opr8/HwGDBhw1XtAEAR69OhB27ZtWbZsGXFxcXz66afcddddjBo16oYdBvV6PT/99BPJycmo1Wree+89goKCWL9+PTExMfz000/s3LmT0aNHX5H3dlM4ONR2StVRlAK495FH+MFsZuexY1zYtMl2j+bmQkkJtGtX526u16N169YkJyeTnp5OREQEYPs9//DDD9O5c2cWL15MXFwcaWlpjBkz5rodOEtKSigvL78tHQslJCQkJKRMKQkJCYn/JCaTiddffx2TycT7779/WzN1Tp48yccff0xgaSnPJif/6V5p2xa++86WWXWHMZlMJCQkcPDgQX766SdUKhUdOnSgVatWREZGEh4efl2nzMaNG1m3bh3Dhw9n0KBB11zOarVy9uxZu0CVnZ1tn8zXoFKp8Pf3JygoiKSkJHJzc+nXrx/jx4+/7naff/55TCYTarUanU7HfffdR9++fet/Mi7DZDKRlpZGYmIiSUlJlJSUALag95YtW9rL8q7mALBarSQkJLBt2zaOHz8OQO/8fAanpODo5IRMEDCEhfG8oyM+Pj68/fbbV53YXbhwgbfeeouOHTvy2GOP3fSxLF++nB07dnD//fdz9913218vLy/n999/5/Dhw8hkMvr378/BgwfR6/W8//77ON8BcfRSDh8+zNy5c9Fqtbz33ns3FBD+iRw9epQ5c+Ywbtw4evfu/XcPpxaiKJKfn18rNF1XLYIolUqCgoLseVRNmjS5obBUVlbGsWPHiI+PJyMjA2t1qbKPj49doGratOltE6jKy8t54403UCqVzJo165oNEC4lMTGRpUuXUlxcjLOzM2PHjqVjx45XHVNxcTHffPMNZ86cwdnZmaeeeqqWKH/u3DlWrFhhd3x26NCBESNG3JJAzIIFGD75hPPnz+Pm7o7roEFQj+6lRqORTz/9lBMnTjC1YUPabNhgyzDs2BE+/xzqcI6uR83vnO7duzNp0qQr3tfr9axZs4Zdu3YhiiKtWrViwoQJeHl5XbGsFHIuISEhcXuRnFISEhIS/0FiYmIoLS1l6NChtz3kuVmzZtx///0cef998vPz8W3QwFbWkZgIM2bA7Nm2vKo7iFKppGPHjri4uBAfH09QUBByuZyUlBRSUlJQqVS0b9+eyMhIWrZsieyyJ/E1okX55aVpl1FTvtekSRN69eoF2J6iHz9+3O6mOnXqFJmZmWRmZmKxWDh27BjHjh0jJyeHPn36EBgYiI+PT63JpUwmIzg4mKSkJB599FEWLlzIsmXLKC8vZ9iwYfWeHJeWltrL8tLS0uxdDF1cXOjevTvt2rUjNDT0hjkzMpmM9u3b0759e3Jycti+fTvG336jqKiIkpISnJ2dOXP+PBZ/fwYOHHjNcd6O0r2ysjJ2796Nu7u7PadLFEV7VkxlZSXNmjVj8uTJNG7cGF9fXxYuXMiWLVsYM2bMTe/3RpjNZtauXQvAwIED/18KUgBF1dly/4RA8MsRBAEfHx98fHzo2bMnVquV06dP2wWqmrI/AEdHR0JDQ+15VF5eXldcly4uLvTs2ZOePXtSWVlJQkICR44cIS0tjS1btrDl/9g777AozrcL37N9F5ZexYYgWBEr1thbTKIm0ZiYmGqipvfEX5oppvfejIlREzWx994VlSooAgIWpJdle5vvj5VVYi+p39zXpcDO7My7OzML75nznGfVKoKDg70CVXR09BUJVEuWLMFqtXLTTTddlCAFkJCQQFxcHEuWLGHDhg1899137Nq1i9tuu63BMTp69CifffYZNTU1RERE8PDDD58hrERGRvLwww9z4MABFixYwL59+0hLS6N///6MGDHi8n4nXIFTCjzi/UMPPcRbb72FddYszCqVZxx798K0afDmm+duwHERhIWFERwcTFZWFqIonnH8NBoN48aNo2vXrsyaNYvs7GymTZvGyJEjGTBgQIPfEUVFRYCUJyUhISFxtZBEKQkJCYn/Z9RnSWm1WgYMGPCn7KNXr14U3XwzFfv3o6qqOjVp2rLFM7n43/+uaIJxsaSlpaFUKrn99ttp2rQpZWVl3vyp+n9+fn507dqVpKQkrxuiPlPEYDBc8j4DAgK8k1fwvN+FhYVeoUoQBHbs2MGvv/5KXl4earUaX19fb7lfixYtaN68OfHx8WRmZlJXV8czzzzDxx9/zMqVKzEYDNx+++1nCGmnI4oix44d85baFRYWepc1adKEhIQEEhISaNas2WVPruvHW1dRgf3IEUxGI9U1NWxNTeWEWk2TJk3O+dx6UepKQs7XrFmDw+Fg2LBhKBQKqqurmT17NpmZmSiVSm666SYGDRrkfZ969OjB6tWr2bRpE4MGDfrTSuq2bdtGeXk5AQEB/ziH0aVQ7/gLCgr6m0dyYeq7yzVr1oxhw4bhcDjIz8/3lvqlpKSwb98+wCOy1buo4uPjz3DN+fj4eBsqmM1mMjMz2bdvH1lZWaxdu5a1a9c2uMZjYmLOey3+keLiYrZu3UqjRo3o3bv3Jb1OjUbD2LFj6datG7NmzWL//v288sorXuEkOzubb775BpvNRnx8PJMmTTqvwNS6dWv+97//sWvXLhYtWsS6devYuXMnI0aMoG/fvufsZnpWLjNT6nT0ej2PPPIIWatXU3HkCOHh4R5H67p1EBMDV+CqFASBtm3bsmXLFkpKSs6ZHRYTE8MLL7zgLf+eP38+e/bsYcKECUSd7CZbL0o1bdr0sscjISEhIXEKSZSSkJCQ+H/Gtm3bqK2t5brrrrvqLqnTGTthAt8eOMCA2bNRGY3ofX09CxYtgpAQmDTpT9s3eISZ9PR0AgMDvQJJWFgY1113HSNGjKCwsJDdu3ezZ88e1q9fz/r164mIiCApKcnbjetCTqmLQalU0rJlS68AU583NGvWLGw2G82aNaOkpIT09HTS09MBT+izn58fhw8fZvXq1bRu3ZpnnnmGTz/9lO3bt2M0Gpk4cWKD7Byn00lOTo43H6q6uhrwhPy2bdvWK0RdbZFBL5NBUBABAQGUnDiB+eTE9NVXXyUhIYHBgwfTsmXLBuJXXl4eWq32slrdg+e4bNq0iYCAAHr16sWWLVv47bffsFqttGzZkgkTJpzRUU0mkzFy5Ei++eYbli5dyoQJEy7/RZ8Dm83GsmXLAE8Xtave4ewv5J/slLoQSqXS644aPXo0JpOJnJwcb7nftm3b2LZtG+ARaevzqGJjYxuU9dYHYiclJWG1Wtm/fz8pKSlkZmayYcMGNmzYgJ+fH4mJiXTu3Jm4uLgLisXz5s1DFEXGjh17SWLW6TRv3pypU6eybt06li5dyvz585k7dy42mw0fHx969OjB7bffflGikkwmo2fPnnTu3Jm1a9eyZs0a5s2bx6ZNm7jxxhtJTEy8OOH6NKeU+zKcUvWEh4djfu89rOPHU1ZeTkREBEqFAr7+2iNMXcGNlDZt2rBlyxays7PPG2ivUCi4/vrr6dy5Mz/99BMFBQW8/vrrDBs2jGuvvZYjR47g7+8vhZxLSEhIXCUkUUpCQkLi/xH1LimNRnNV8onOh0KhYNzUqfxQUsKotWtRqVSo6yfp333nEaZuvvlP239xcTEVFRX069fvjEmVIAhER0cTHR3NmDFjyM7OZvfu3aSlpbF48WIsFguHDh3CbrdjMpmuagmWIAjcdNNNlJaWkpGRQZcuXRgwYIA3QD0vL4/CwkKqqqooKSlh0aJFFBcXExISQtOmTTl+/Djbt2+nrq6Ou+66i/z8fDIyMsjOzsZmswEex0HPnj1JSEigTZs2f26nudNKWFxuN349e/L4I4+wceNGr1OrWbNmDBkyhE6dOmEwGKioqKBdu3aXPSmvd0klJSXx8ccfk5ubi0ajYfz48fTp0+eck+hOnTrRpEkTduzYwdChQwkPD7+s/Z+LdevWUVdXR3h4uLek8N9KZWUlWq32osvL/sn4+Pg0cC9WVlY2yKNas2YNa9as8XYArBepmjdv7j1HNRoNXbp0oUuXLtjtdrKyskhJSSEjI4MtW7awZcsWfHx8vAJVfHz8GaLQ/v37OXDgAAkJCefsSnmxyOVyhg4dSmJiIs8++yy7d+9GEARGjRrFuHHjLs3lhCdY/rrrrqNPnz4sWbKE7du389VXXxEbG8uYMWNo3rz5+TdwmlNKvEynVD3R/fpx4PXXcT77LGVlZURERCCXyeCll6BxY7iEDoSn06pVK2QyGVlZWRf1+69Ro0Y888wzbNq0iUWLFrFixQq2b9/O8ePHL9nlJiEhISFxbqSgcwkJCYn/R2zcuJFffvnlLw1oPXjwICueeYYxe/fSqH5yAZ7yvbffvqI73+djxYoVLF68mMcee+yiJ4BWq5WUlBS2bdvGzJkzUSqV9O7dm/bt25OUlET79u0vebJ3LoxGI6+99hq1tbU88cQTDVq9u1wujh07xgcffEBqaiodO3bEarUiiiJGo5HMzEzKyspQqVTExcURHBxMXFwcXbp0ISEhocFk+k/HZIJp06hYs4YdCgW6V19l0LXXIooimZmZrFmzxluuFxwcTFRUFKmpqdx8880MGzbskndXV1fH888/T1lZGSEhIbhcLtq3b8/48eMvqiQvKyuLTz75hM6dO3P//fdf8v7PN64XXngBq9XKpEmT6Nix41Xb9t/BE088QWBgIC+++OLfPZQ/FVEUKS4u9pb65ebmesVdjUZDfHy8V6SKiIg4Q/CsbxyQkpJCenq6N3Bdp9ORkJBA586dvbl106ZNo7y8nFdeeeWqCKJ2u50ZM2aQkpJCVVUVKpUKvV5PcHAw48ePp23btpe97WPHjvHbb7+RnZ0NQNeuXRk9evS5nXMZGYj33MORI0fQaDSEN2sGW7de9v4BMp57Dv/vv0etVhMWHu4RvcLDYdYsuEzH53vvvUdhYSEffvjheTug/pHKykpmz57N5s2bOXDgANdeey2vv/46mr+gcYeEhITEfx3JKSUhISHx/wSn0/mXuaROp1WrVhx56CGWv/ceow8cICw8HAE8nZVeeAE++wxOOhiuJmlpaWg0mkvKLdJoNPTs2ZMePXqQm5tLcXEx4eHhpKamkpqaik6no3PnziQlJREbG3tFYce+vr7cc889fPjhh3z//fe89NJLXkeWXC6nWbNmXH/99ZjNZpKSkrBYLGzfvp2ysjI0Gg0qlQq73U5RURHBwcFUVFSQmZmJyWSivLycmJgYgoOD/7SW9l58fLC99hpvulyIosibJ88tQRC8JYOFhYWsXbuWffv2sXv3bsrKyujUqRM1NTWXXALzyy+/kJycTFhYWINw4ot9nW3atKFly5bs27ePI0eOXLVcmJUrV2K1WomOjiYxMfGqbPPvwmazYTKZiImJ+buH8qcjCAJRUVFERUUxaNAgnE4nBQUFXidVfYMA8OTF1Qemt2rVioCAAJRKpfc8ry+hTUlJIS0tjV27drFr1y7UajVKpZLCwkJuuummqyJIGQwGPv/8cwoLC/H19eXpp58mMjKS+fPns2vXLj755BO6devG2LFjL6vbZOPGjXn00UfJyspiwYIF7Nmzh9TUVAYOHMjw4cPPdND5+CAAMkHwOKUsFnC74QrE8fbTp5ORl0fA5s1UVlZ6QupLS+Gpp+Crr+AyymPbtGlDbm4uubm5tGnT5qKfFxwczMMPP4zVaiU3N5fCwkJeeeUVxo8fT/v27S95HBISEhISp5CcUhISEhL/T9i0aRNz585lxIgR3HDDDX/pvkVR5JtvvsFn9mxGFBcTeLoQ4evrKee7gk5sf6SmpoZnn32Wrl27ct99913WNqZOnUplZSXvvfceBoOB3bt3k5yc7M1qCgoK8ubNnC+f5EIsXryYFStW0KFDByZPnowgCJhMJjIzM9m0aROzZ88mODiY+Ph4fHx8aN++PQkJCcTExLBgwQJ+++03bDYb0dHRZ7i4/Pz8vIHkMTExNG3a9Ko5vU5n/fr1zJs3j+uvv57rrrvunOtVVFQwZcoUDh48SFJSEkqlkm7dujF48GBviPC5cDqdLFiwgDfeeAOZTMaUKVO47bbbLmvCnZ+fzzvvvEPbtm155JFHLvn5f6SyspKXXnoJp9PJk08+2cD19m/kxIkTvPLKK/Tv359x48b93cP5W7FarRw6dMgrUhUXF3uXRUZGekWquLi4BkKN2+3m0KFDpKSksHv3bjZs2IAgCPTs2ZOOHTvSqVMn2rdvf1lOm+LiYj777DMqKysJDQ3l4YcfbiB0HThwgJ9//pmKigp0Oh1jxoyhR48ely1Qu91utm/fzpIlSzAYDPj6+nL99dfTp08f5PWdVIuL4YYbOHb8ODKZjEaRkZ7GFleYW+i22TjQvz++ubn4+fuf+t1x/fWecr5LfE1FRUVMnz6dQYMGXVYXzk8++YTU1FQ6derE/v37AY+L7JZbbrmszyIJCQkJCckpJSEhIfH/gr/LJVWPIAjceeedvFVczOaVKxliNJ4KWTca4eGHYcYMuAJx53TqnQ0dOnS47G3o9XoqKysxGAxERUVx4403Mnr0aA4dOsTu3bvZt2+ft0NT06ZNSUpKomvXrvj7+1/Sfq6//noOHjzIzp07MZlMCIJAXl4eoigiiiI+Pj4EBgby5JNPEhsb26As77777qN169bMmjULpVLJzTffjEwm83b6Ky0t9bq8wJPz1axZM2JjY72d/q50IuW02yn4+ms6Wq0MuEDOik6nIygoiHHjxtGpUyc2bNjAzp072blzJ23btmXw4MG0atXqjMlzfn4+s2bNYseOHcjlcqZMmXJFpXcxMTEkJCSQkZFBbm7uFXUBBFiyZAlOp5O2bdv+6wUp+Hd13vuz0Wg0XicUQG1trVegOnDgABs3bmTjxo3IZDKaN2/u7ewXHR3tDVsHKC0tJS4uDrvdTkpKCikpKd4mBJ06dSIhIeGiGk8cPHiQr776CovFQkxMDFOmTMG3vonESVq3bs3LL7/M8uXLWbNmDT/++CO7du3i9ttvP6MBwMUgk8no06cPXbt2ZfXq1axdu5a5c+eyYcMGbrrpJhISEhBOujy9Tinw5EpdoSglU6uJ/e03jvTvj6GyEoVC4WmasXSp50bG+PGXtL2mTZvi6+vrLUu8FERRpKioyCsEZmRkMGfOHPbs2UN2djZjx44lKSnpz3enSkhISPzHkEQpCQkJif8HbN++nerqaq699tqrGtp9KWg0GiZNnsyblZX479hBb4fjVKZHeblHmPr+e7hEUedspKenI5fLadeu3WVvw8/PD2jYgU8QBOLj44mPj+fWW28lIyOD3bt3k5mZyZEjR1iwYAGtW7cmKSmJjh07njdg3OVykZ+fT3p6OuXl5aSlpZGSkkKnTp1ITEykQ4cOJCQk8Ntvv5GWlkZQUNBZc6J69eqFr68v3377Lb/88gt33303d955p3fs9QJVfn4+hYWF3u/rCQsLa+CmioyMvKRJ1fFJkxi8cSN+/v7oXnoJPvnknOvWi21t27Zl2LBhDBo0iOTkZNauXUtWVhZZWVk0btyYwYMH06VLF1wuF4sWLWLjxo3Y7XYA+vXrx913333R4zsXI0eOJDMzk4ULF/L0009f9kTy2LFj3pDpG2+88YrH9U+gXpT6N3be+7Px9/f3OiRFUaSsrMwrUOXk5HD48GGWL1+OSqWiZcuWhIWFsXLlSuLi4nj55ZeRyWQUFBSQmprKvn37vF035XI5rVu39l7/Z/uc3rFjB7NmzcLtdtOlSxfuuuuuc+YiqVQqRo8eTdeuXZk1axY5OTlMmzaNESNGMGTIkMtyTGo0GkaOHMk111zD4sWL2bVrF1988QVxcXGMGTmSpoAgk+FyOj1PuIKw89NRR0YSMXs2FaNGUVVZiVwuR6fVwscfQ3Q09Ox50dsSBIHWrVuzZ88eqqurLyqHrp7q6mqMRqNXoExISCAuLo6FCxeyadMmfvjhB5KTkxk/frx07UhISEhcAlL5noSEhMR/HKfTyQsvvIDFYmH69Ol/myhVT0pKCt9/8QX37ttHokzm7dgEQPv28OWXcAXhsVar1Rsc/thjj132dn766Se2b9/OfffdR9euXc+7rtFoZN++fezatYvDhw8Dnklhx44dSUpK8gYdm81msrKySE9PJysryxuKrNVq8fPzIzMz0+tyqBe0NmzYwK+//sqECRPO29EtLy+Pzz//HLPZzNixY8/qiHM6nRw5csQrVOXl5WEwGBqso9VqadGiBbGxsbRo0YLo6Ohzimtuq5XjMTGIDgdRUVGeUp4NG+CkoPdHfv/9d1avXs0jjzzSIIRZFEWys7NZs2YNBw8eBDyindFoxMfHh8jISCIjI8nIyGDMmDEMGjTonO/DpfD999+TnJzMgw8+6J1oukURo91Jnd2J2eHCLYIAyGUCvioFfioFGoXMK2J99tlnZGZmkpSUxD333HNVxvV3U3+cnn/++Qt3XZPw4na7KSoq8opUhw8fJi0tjaqqKpKSkujdu7c3jyo4OBhRFDl69CgpKSns27ePsrIywONMio+P9wpUer2eJUuWsGLFCgCGDx/OyJEjL1pIdbvdbN68mYULF2Kz2WjUqBF33HEHLVq0uKLXe/ToUebPn09OTg4KvYIHju6nLlSLQyEQGBiI6s578W/cmiBZEBrZlQeCV8yfj/mhhwAIDw/3dHP18YGZMz3i1EWyc+dOZs6cecHP1D+SmprKV199ddYy5fz8fH766SdKSkpQq9WMHDmS/v37/3UNJyQkJCT+xUhOKQkJCYn/ODt27KC6uprhw4f/7YIUQKdOnSi89lp+dLnwz8igBZ5JPwCZmfDhh/D885e9/f379+Nyua44bLreKfVH0eZs+Pr60rdvX/r27Ut5eTm7d+/2/tu0aRMWiwWtVovb7Uan0yEIAmFhYfTs2ZOEhARiY2ORy+XMnj2bLVu2eEUogPj4eABycnLOO4GKjY3lqaee4pNPPmHevHnU1dWdMXFVKBS0aNGCFi1aMGjQIERRpLKy0uueys/P5/jx417XEngmyI0bN27gpgoMDEQQBNI2bybYbsdXrz+VLXOee125ubkIgnBGgLYgCLRt25a2bdty6NAh3n77bXbu3AlA8+bN6d27N7t27cLPz49rrrnmgsfjYrnhhhvYu3cvixcvJio2nuNGG6UmG063iFsUOX3KL+I5T2UyAa1cRmM/LbbyE2RmZiKXy//ynLY/k6qqKkAq37tUZDIZ0dHRREdHc+2115KWlsb06dOJj4+nRYsW7Nmzhz179gAeh2J9HtXgwYMZOXIkxcXF3tK+emFr1qxZ1NTUYLVaCQ0N5d57770kIaV+XP379ycxMZE5c+aQkZHBO++8Q9++fRk9evRld5Dza+THNZOvIbA2kGpLNdvtkQiiCCLIFQrwPYRgLEAhKPCT+dFS1ZIYZQw62eWV9IWMGUPJoUPYPv6YsrIyIiMiUJhM8MQT8OOP5xTD/0h9wHl2dvYlvZdFRUUAZ22OEBMTwwsvvMCKFStYtWoV8+bNY8+ePUyYMIFGjRpd9D4kJCQk/j8iiVISEhIS/2GcTicrVqxArVYzePDgv3s4XkaNGkVRURFfOp08m5NDqNt9auGqVfDcc5ccYFvP1ciTArxZS6eX710MwcHBtGrVCpvNxpYtW8jPz6e8vByHw+ENHh8+fDhDhw4lNDS0wXPHjh1LXl4e27dvp02bNnTp0oVGjRrh4+NDTk4Ooiie1x0RFRXFM888w8cff8zKlSsxGAzcfvvt57xbLwgCISEhhISEkJSUBHicZnkFhRw+foLiklJKS0sxWa0kp+9n0+YtiG4XAQEBxMTEcGjVKqa43V4BD/AE158Fh8NBUVERTZo0OeckODU1lTlz5qBQKLjhhhto1qwZBw8e5JdffuHo0aMMGzaMkpKSq9YxLzQ0lD5Dh2NQ+bGtqAyFUoVcEFAIAjKZcMZ77RY9YpXJ4eJgpZG6OhdxfQYTpYaQkJCrMqZ/ApWVlSiVSim4+Qpwu90sWrSI4OBgXnzxRRo1akRdXR05OTneTKotW7awZcsWBEGgadOmXpFq2LBhVFZWsn37dr799luKiopQKBRotVq2bduGxWKhY8eOl1wiFhgYyJQpU0hNTWXu3Lls2rSJtLQ0br311ksS8WtcNeyx7uGY8xhO0YlMIyNIE4T7mA2hstrzOaVQ4NAFoVVqcOGiylXFLssuUq2pxChj6KTphFamvfDO/kDE1Kkcz83FuXw5ZWVlhEdEID96FN55B15//aK24e/vT+PGjcnOzsbtdl+0m+nIkSMANGvW7KzLlUolI0eOpHPnzsyaNYuCggJef/11hg8fzvDhw/+UJhMSEhIS/wWkT0cJCQmJ/zD/NJdUPTKZjPvuu4833niDj10upubno3O5PAtbt75sQcrlcrF//36aNm16SVkhZ+NSnFJWq5WsrCwyMjLIzMzEZDIBngyWsWPH0rZtW5RKJRkZGaSlpbF161a2bt1KTEwM3bt3p3Pnzvj4+KBUKpk4cSLTp09n1qxZNG/enJCQEOLj40lJSaG8vPyCQcXBwcE8/fTTfPbZZ2zfvh2j0cjEiRPPmT0DnvK5GpuT4joLVRYHZnUQiuhAmjRvQxPA7Xbhcjhx2K3UlpdyIvcgm7dvx5iaisNu50RxMSq1GoVez4nsbFq0aHHG+VZQUIDL5TprqLjBYGDu3LmkpKQgl8u5/vrrGTZsGAqFgsrKSu677z58fX0xGAy88cYbxMfHM2TIENq2bXvZWVBOt5u8KhMB7bohGOowGgyEh4UiE849QZUJAjJBQCEDk8WMw+Ekqm0HQvz9KDFaCfdR/ydCjquqqggKCvpPvJa/ApPDicHmpM7mKft0uN2Ul1cQnJBEm0B/RH0gBpsDva8vXbp0oUuXLoCnG+WBAwe8ItXq1atZvXo1CoWC8PBwDhw4QFBQEHFxcXTv3p2ioiIOHz7M4cOHmT9/Ps2aNaNTp0506tTpogPMBUGgU6dOtGrVioULF7Jlyxa+/PJLOnbsyLhx4wg4vTPqH3CLbg7YD5BiTcEiWlAJKnwEn1PnSeOmGN1gNRqx6nS4qqqpqzMSGBiIj9YHt+jGLtrJtmdz1HmUHtoeNFU0vbTzTBCI+uorjl97LY7MTMrLywkPC0PYsAHcbrhIgalt27asXr2awsLCiypjrA85DwgIuGAzi8aNG/Pss8+yYcMGFi9ezLJly9i3bx8TJky44pJJCQkJif8ikiglISEh8R/F6XSycuVK1Gr1VcvguZro9XomTZrEu+++y3uJiTwdFoY2IADuu++yt5mbm4vZbL5il1T9+ODcTqnKykoyMjJIT0/n0KFDuE6KasHBwXTr1o0OHTrQsmXLBnfHu3XrhtVqJTU1ld27d3Pw4EHy8/P55ZdfaN++PUlJSbRv356xY8cye/ZsvvvuO55++mni4uJISUkhJyfnoiafer2eJ554gq+++or09HQ++ugjHnzwwTO6e4miSKnJRkGNmRqbE7coIsNToqaSyU6Vr8lluBVKXBoNOr0/EdGxNO/cg6rEbih++h7x+FFsVivlgsBnn30GQGRkJC1atCAmJobY2FgOHToEeMoMT9//rl27mDdvHmazmejo6DPKXXbs2EFYWBj3338/QUFBrF27lpycHHJycoiMjGTw4MEkJSVdkgvB6nSRUlJLtdWBXJChkoHBasVsMuHrezHuIJHa6hqcDgc+WjV2N6SW1hIdoCM+yPdfLeY4nU5qa2u9XeMkzo7LLVJmtnHUYKHK6sDlPq1sVRQxuiCkeQw6vR9ppQbkgoBeraCpn5YIHzVKuYyQkBD69OlDnz59EEWRY8eOeR1Uv//+OzabDb1eT0BAAAaDgZ49ezJ69GiOHj1Kamoq+fn5FBUVsXDhQho3buwVqCIvooupTqdj/PjxJCUl8fPPP5OamsqBAwcYPXo0ffv2PeMcdogONpk3UeQoQkDAVzjLeS6T4fD3xyQIhIeHYzQaMZlMlJWVodFoCAwMRKPS4Bbd1LnrWG9eTztVO7pqul7aNaPR0GjuXIoHD8Z24gSVlZUEDxiAcAn5TW3atGH16tVknxTRL0RVVVWDkPMLIZPJGDRoEImJifz8888cOHCAd955h379+jFq1KjLLpmUkJCQ+C8iiVISEhIS/1F27txJVVUVw4YNO6Nl+D+F5s2bM27cOH7++Wc+0ul4+tFHT4kLBw7AwYPQqxdcpAsgLS0N4IrzpOBMp5QoihQUFHiFqOLiYsDjPIiOjiYhIYEOHTpcsHudRqOhR48e9OjRg5qaGvbs2cPu3btJS0sjLS0NrVZLp06diIqK4vDhwyxevJju3bsDcOjQIfr06XNR41er1Tz44IPMnDmTPXv28O677/Loo496nRBWp6cE7YTRilsEZb0QdY6xywWQn5SpLFY7INCk32AK2ncidtlvhG9cg9rfnw4dOpCfn8+JEyc4ceIE27dvBzyZWE6nk8LCQvR6PXq9nl9//ZXs7GyUSiVjxoxhwIABDUppzGYz69evx9fXlwEDBqBWq+nWrRs5OTmsXbuW/fv389NPP7Fo0SIGDBjANddcc0FHoNXpYu+JGmptTtRyT9C+ws8PY10dNbW1+PhcWFQyGk04HA7kchl+fn7IBBl2l5vD1WZEEVoF/3uFqepqT/nVf6kc8WpTbraRXVGHye5CxHPtKOWnrp3q6iqsxjoCgwLRKRWIoohLFKm1OsiwOjikkBEf5EuUXuN9jiAINGnShJKSEqqrq+natSuNGjWiffv25OXlkZaWRmpqKuApw2vdujWdO3fGarVy8OBBcnNzOXbsGEuWLCEyMtIrUEVFRZ33XIyNjeWFF15g1apVrFy5krlz57J7927uuOMOrzjsEB2sN63nqPMoakGNUji367L++pXJPKKbXq+nuroaq9XKiRMn8PX1JSAgAF+5LzbRRoYtA5fooru2+yVdM0J4OBFr17Lj/vs5UVaGz6BBjLjoZ3tet0qlIisr64zQ8rNxodK9cxESEsKjjz7qFd83btxIeno648ePv6LusBISEhL/JSRRSkJCQuI/yD81S+ps9OnTh4KCArZv386vv/7K+PHjYdcuePRRcLlAq4WPPoLOnc+7HVEUSU9PJzg4mKioqCsel16vx+VykZuby48//khmZqbXNaVWq+nYsSMJCQm0b9/+srN3AgICGDx4MIMHD6a4uNgbjr59+3acTifZ2dkUFhYSHByMXq+/qFyp01EoFNx77734+fmxfv163nnnHR599FGUfoGkldZicbpRygTU8kvrEGWorcVps+Ejl+HQ6si+5U4q2ibQIWUnU6ZMQRRFysvLveHp9TlZarWaVatW8cMPP1BYWIhWq6V169aMHTuWzp07n5Htsn79eiwWCzfeeKO3A6AgCLRq1YpWrVpRXFzM2rVr2b17N4sWLWLFihX06tWLQYMGnVVUcYsiaaW1DQQpAJlMjp+fPzU1NdTVGfDzO3d5jiiK1NTWAJ5smvpyP5VchsPlpqDWjEYhJzrg8sKc/24qKysBKeT8bDhcbnKqjBwzWHGJYoNzqB6n00FdXR1KpcL7uSCczClTyDznoM3lJqPcQKnJRptQPVqFHFEUWblyJYsXLwZg8ODB3Hzzzd5rwmw2c+jQIW+p344dO7z7jIqKomfPnrjdbsrLyzl8+DDLly9n+fLlhIWFeQWqpk3PXiqnUCi47rrr6NKlCz///DO5ubm89tprDBs2jOHDh7PNsY2jzqNoBA0K4fxTh/rtu0/mBKrVaiIiIjCbzVRXV3vdU/7+/h7hX4AsexY6mY4OmktzuMrDw+n666+8++67HNu8mYBmzegVHQ2VldC27XlL+RQKBfHx8ezfvx+z2XyGi/SP1IecX6ooBZ73pEePHrRt25Zff/2VvXv38umnn5KUlMSYMWOk7DYJCYn/9wiieJ42ORISEhIS/0q2bt3Kzz//zNChQ7nxxhv/7uFcEIfDwbvvvktRURF33nknPTdtgt9/P7WCjw989x2cJY+onqNHj/L6668zYMAAbrnllsseS3V1tdcN9fXXXwPQq1cvgoKCSEhIICEhgfj4+PNmNF0JoiiSm5vLrl272LBhA8nJySiVSho3bowgCHz44YdnzWW60DZXr17NwoULiYyJo9uocYgyBRr5uZ1R58Jmt1FyogStVkOYXA5lZbhUKuy+fgRXldF5yDUo/yByFRUV8eqrrxIaGsqJEyc4dOgQFouFZs2aER4e7h1DcHCwt8Nfo0aN+Pzzz5HL5bz55pteUeps1NbWsnHjRjZv3ozZbEYQBDp27MiQIUOIPq1VfH61iYOVRlQyGXJZw9ctim6OHz+OiGeSf65sKYOhlurqGhQKBY2iGiHQcDs2lwu5INAjKgi9+t9372/Hjh38+OOP3HPPPd7wewmwOV2klNZSZXGcFJjODMIHKC8vw2y2EBYWilZ7bqHD6XbjcIv4KuV0CPVl8fxf2bFjB4IgcMstt9C/f//zjqe6utorUB04cMDr6KzvlqlSqTAajZSVlXkFouDgYK9AFR0dfdbxi6LI9u3b+e233zCbzTTu1ZjQa0PRKXXndUjVYzQaqaysJCwsDK22YZC5KIoYjUZqampwu93I5XICAgKQ6+TIBBkjfEYQqgg9x5bP/1689dZbRGZnc/+RI+iUSujY0XMz4zzOyY0bN/LLL7/wwAMP0KlTp/Pu4+OPPyY7O5t33323YWOHyyA9PZ05c+ZQU1ODr68vY8eOpVu3bv9ad6WEhITElSKJUhISEhL/MZxOJy+99BJGo5E33njjX3MXtrKykjfeeAObzcbLXboQ9vnnDVcICYEZM+Ac7bWXLVvG0qVLefzxxy8pD0cURY4cOUJ6ejoZGRkcPXrUuyw7OxtfX18++eQTYmNj//JJg8Ph4Msvv2TevHnU1tbidDpp2bIlAwYMoHv37iQmJl5SNsmmXckUuVSotDr8dFq0mkvvflVWXobFbCEiIhx1ba3HlQC4FArsoWGEhgXTJTKggYNk9erVfPTRR+h0OkJCQujQoQPjxo3DaDQ2cFNVV1d7n1NUVMSxY8fo1asX1113HS1atKBFixZnTHRPx2azsWPHDtauXet1/MTGxjJkyBCax7dhd3E1LpFzOsPq6gxUVVXj7+9/1sBnt9sjXLndbkJCQs5aKiiKIlaXm2Ctkm6NAs9w0vzTWbp0KcuWLeOpp566ZPHzv4rd5WbviRqqrY6zuqPqsVotlJaWodFqCA8LA85/7N2iiNXpwlBZTvJvP+O2WbjvvvsuOreoHlEUOXHihDc0/dChQ1itVsAjUvn6+mK326mtrUWlUiEIAgEBAXTs2JHOnTsTExNzhkvRYDAwd/FcqjtWo/BRoMGTCXWhTnUmk4mKiopzXh/guY5qa2upq6tDFEVUKhXaYC2N1I0Y4Tvigm6ss3Hs2DGODBtG4/JyIsLDUalU0KcPvP/+OR1TZWVlvPjii/Tq1YsJEyacc9uiKPLkk0+iVCp5++23L3lsZ8NisfD777+zZcsWANq1a8f48eMlh6KEhMT/S/59t/AkJCQkJM7Lrl27qKysZOjQof8aQQo8d/EnTpzIxx9/zMeHDvFKr14oT+YRAVBRAQ8/DN9/D2cRDNLS0tDpdBc1kbbb7Rw8eJCMjAwyMjKora0FPC29691Q7du355NPPuH48eP4+/v/LXexlUolDz30EE6nk+TkZIqKilAqlV53hFKppGPHjiQlJdGmTZvzThhdbhFl4xgCjBaqy8ooN9YRHHzuiePZsDvsWMwWNBo1arUG3KdEJLnTicpup8Jsp6DGTEygZ7tHjhzh888/p7CwkAEDBnD33XfTuXNnBEEgKCiIpk2bel0h1dXV5Ofnc+DAAfbv349cLsflcrFs2TLAUwbTqFEjr5sqJiaGkJAQ77FRq9X079+fvn37kpqaypo1a8jLyyMvL4/O140hNCYevebcjitfvR6DwUBdnQG9nx65TN5gucFQi9vtRqVS4uNzdheMIHiyuaosDkpMNhr5/rsCjauqqgDP9SjhESQyywwXFKRA9IiqAic7f17488LtdlFTUY5crSZh2Cj6x0YR3azpJY+x/rpo1KgRAwcOxOVyUVhY6BWp8vPzvc4ki8WCTCYjPz+f0tJSNm7ciJ+fH4mJiXTu3Jm4uDhkMk9WWsJNCaSZ0zCVmzA6jVgsFk8nvfN8ZtR/Bp3vnrdMJiMwMBC9Xk9NdQ0mswlHmQO7v5295r10D+9+ye9B48aNUffti3n+fMrKyoiIjESxdSt8/rnn98ZZCA0NJSQkhOzs7POWRVdVVWEyma5KA416tFot48ePp1u3bsyaNYv9+/fzyiuvMHr0aPr16ye5piQkJP5fIYlSEhISEv8hXC4XK1asQKVS/eOzpM5G69atGTVqFAsXLuSrli15KDER4WR4OQBFRfDYY/Dll56sqZNUVVVx9OhRkpKSkMvlZ2wXPCVe9SLUgQMHcDgcgCcXqE+fPiQkJNCqVSvPHfaTnN6B72Jbrl9tZDIZ99xzD8eOHePgwYMEBwfz+uuvk5yczO7du0lOTiY5ORm9Xk/Xrl1JSkqiWbNmZ0xqDteYqLE68VGrUYWHUVZWTkVFBW63C73+4spRDCfFO29L9JMdB+uRC+AUBPKrTQSqZGxavZI1a9ZQVFREdHQ0b7/99nlD9wMDA+nSpQtlZWW0a9eOESNG0KpVK6+bKj8/n+PHj3P8+HGvw8DPz4+YmBhvp79mzZqhUCjo3LkznTp1Ii8vj/Vbt6ELi8RYW0tdlQO9Xo+v/kzRSUDAPyCAyopKamtrCQo85VpwuZwYDJ5MsYALiA5ymYDdDccMln+dKFVZWYlMJjurU+z/I8frrJSabShlwnldb0ajEbvdga/eF5VSdc716rHbbZSVleFyuREEgbCmzbFfpYYUcrncK9ped9112Gw2cnNzvSLVsWPHUCqVVFdXU1lZSVFREYcPH2bDhg34+/uTmJhIQucE8hrnoVao8W/kyVszGAxUVFRgMpkICgo6a8fLP2ZKnQ+FQkFIaAh6mycM3eF0sK5oHblrcxl5w8hLLpML/d//qNm9m9qiIo8wFRGB7McfISYGrr32rGNt06YNW7ZsoaSk5JxdC+vzpJo2vXTB8EK0bNmSF198keXLl7N69Wp++eUXkpOTmTBhwkV1UZSQkJD4LyCJUhISEhL/IepdUkOGDPlXuaROZ+jQoRQWFpKamsryAQO4zmCAw4dPrbB/Pzz3nKcs4+SkKD09HaDBnez6Fuv1ZXn1EwuAJk2a0KFDBxISEs4Z/gunOvDVB5z/XQQEBHD33Xezb98+9u7di9FoZMSIEVx77bUUFRWxe/du9uzZw4YNG9iwYQPh4eEkJSWRlJRESEgIZoeTwzVm5IJnYq1Wa4iICKe0rIyqqmpcLtdJEeLck26H04HJbEalVp0qGfzjxFMmRyUTMNrt/L5lN3tWr0alUhEXF8eQIUMuqguk1Wpl7dq16HQ6hgwZgkajIS4uDvAc05KSkgYiVWlpKampqd7OZAqFgmbNmnkn5S1atGDgqDEcrKjDZjRgNNqoqamlttaAr68Pej8/lIpTWTm+Pj4Yag0Y6+rw8/NDIfecYzW1tYiiiEajRnsRJZNKmUCVxYHB5sBP/efkj/0ZVFZWXlSZ1v8HLE4XOVVGABTneT/copuamhpkMuGixDyz2UxFRQWiKKLVaggJDcXphsJaC2E+GgI1V/d8UavVtGvXztvtzWAwkJOT43VcVlRUUF1dzeHDh3E4HGRlZZFckUz0zdEoXUpErUhAQAA6nY6qqiosFgvFxcUEBAScIRxdjFPqbOOLiIigzlKHLErG3vV72fPCHoYNG8agQYMa3Cg4L40aEfDNN4jjxmGorqa8rIyw8HCE11+Hpk3hLN3u2rZty5YtW8jKyjqnCHS5nfcuFqVSyahRo+jSpQs//fQThw8f5vXXX2f48OEMGzbsrOKfhISExH8J6VNOQkJC4j/C6S6pIUOG/N3DuWwEQeCuu+6iuLiYpZs3Ez15Mm3few9KS0+ttH07TJ8OL74IgkB6ejoKhYK4uDj279/vdUTVZxQpFAratWvnLc3zlNdcmHphrz5E+O+kffv29O/fn19//ZUvv/ySt99+G0EQaN68Oc2bN+fmm2/mwIED7Nq1i7S0NJYsWcKSJUuIiYkhYcAwnP5haBWnnEFKpYqIiAjKSkuprTXgcrkJDg7iXMKUodYAIvj7+Z9a5w9OKVEmUF1djdlmQxMUSv+hwwnx82X+/PkXnU+0ceNGzGYzI0eOPCMvSxAEIiMjiYyMpHfv3oDHoXL48GGvSFVYWOj9vp7ut9yNb0g4apWKsPBwrFYrxro66uqM1BmN6LRa/Pz8ToapCwQE+FNeXkFtTQ3BwSEeQc7oEScutjRLLgg43G4qLf8eUUoUPSVoLVq0+LuH8o/gqMGC1elGc4HulIbaWlwuN4GBAWe47xoiYqir83wuiaDX+57MEBJQyjxZZIU1ZgIjzt398Wrg5+dH165d6dq1q7dTZn1oenZ2NsXFxaiaqrDb7RiqDNTIa1Aqlfj6+OLn54fT6aS2tpbq6mpMJhPBwcFe4ehSnFJ/xFfji6AW6DGyB7t/2M3ixYvZsmULo0aNIikp6eJK2jp1IuDNN3E9+SQmk4nKykqCg4MRnnwSZs2CPzheW7VqhUwmIzs7m0GDBp11k1fSee9SaNy4Mc899xzr169n8eLFLF26lH379nHHHXdI16SEhMR/Guk2mISEhMR/hF27dlFRUUG/fv3+tS6pejQaDZMnT0atVvPNokVUvPwy/LGUY8kS+PJLSktL2bx5M+Xl5fzvf//j008/ZfPmzTidTnr27MnkyZP54IMPePjhh+nbt+9FC1Lwz3FK1TNx4kR8fX3ZtWsXu3btarBMLpfTrl077rvvPt577z3uvvtuWrduTWHREU6Y7NTWVFNRUY7ZbPK6GBRyBeEREajVnk5d5eXliKKI3WblxfsnMKF/EhOH9+Op22/icI4nw0qnO1U2mbo3mcHX9ee3RfNxu91UVldTV1eHTHTjFxBA4jUDvcHxsbGx3ufdeeed+Pn5YTKZGryG011S/fv3Jy0tjV9++aXBOomJid7jsWvXLnr06MGdd96JTqdjw4YNTJ48meeff54xY8bQqVMnAoODUWh9sJpNVFZW8dX0aaxe8AtKpRK1WoUAmMxmSkpKKSkpwWw2odXp+OGdV/l95rc4HA5qamoQRdD56FCp1NzWuxN52ZnnPVaCILBz7Uq27dhxUcd25syZjBo1CoBNmzaRmJgIQHFxMX369LmobVwptbW1uFwuKU8KcLpFjhksyATOK4Y4nU4MBgMKhQL9aZ9Ruzeu5YHrBnD/tf24d2gfVv82l6qqaqqrPIJUYGCAV5ACzz4UgkCZ2YbZ4aJv377ExsZe0HG0adMmVq1a5f35j+fL4sWLad26NYmJiWRmZja4fur3GxYWxjXXXMMDDzzAhx9+iEwuQ3SLaFVaVCoVoihiNpspLSvl2LFjVFRUoFAo+Paeb0ldmcqJEyeorq5GFEWvU+rB5g9iqml4fZ+NzbM3c/zQce9YAIJignj99dcZOHAgtbW1/PDDD0yfPp2HH36Yxx57DGh4vezdu7dBx1XhppsInDQJtUaDyWj0ZAZWVsKTT8LJAPh6NBoNMTExHDp0CLvdjtFtpNRZSrGzmBJnCZXOSoqOFp3VFfZnIJPJGDx4MC+//DKtWrWiuLiYd955h3nz5mGz2f70/UtISEj8HUhOKQkJCYn/APUuKaVS+a/MkjobkZGR3HnnnXzzzTd8tmIFU995B9UjjyDa7TgcDixmM+bp05kzcyYH6+po2bIlISEhXjfUuVqeXwr/JKcUQKNGjUhKSmLHjh3MmTOHFi1aEB4efsZ6Go2G7t270717dwrKKkkrN2ExGjBbbZjNFmQyAZ3OBx9fHzRqNeHh4ZSXl2M2WygtKyXAz4/rbr2Dbv0GIQgCs7/8hB/eeY13Z/9G/STaaDDw7Xef061LEi6XG6fTiVMU8ff3w98/ALvbTbHJk2Wj0+mIiooCPO/l0qVL6dChA/Pnz+euu+7yjnvjxo2YTCauv/56lEolaWlpLFq0iHHjxnnXSTstY+zHH3/ktttu4/nnnwc8pZ/1NG/enEGDBlFtsbPjWCUuux27SsUtkx7G7nBgtdZP8ERcLhdulwubzYrJZEKlUnsm16JIRUUFdrsdQeCSc5Z2r1tJbbsE7rj27A6Mi6FRo0Zs3br1sp9/KdR3LJQ6gEGZyYbV6UZ1AZdUdU014kmRSTh5bYiiyJuPT+H9uYuIad2W4qOF3DOoFx8t6oDOx5eQkGB0ujPDwhUyAavLzY70/eTm5hIYGMjmzZvp16/fWfftdDrZtGkTNTU1DBs2DDjzfPnqq6946aWXuPXWW4GG18/ZkMlkfDv7W34z/oYcOWH+YdhsNiwWC0ajJ+y8/meny4nNbsNsNmO3271ZU5fCljlb0PnriIrzfD7IkVPhqkCn1zF27Fj69evH77//TmpqKnv37sXPz4+SkpIG2+jSpQu//vprg8fkTz9N8OHDlC9bRm1NDQqFAt8DB+DVV+GNN+Dk7wa7aKfpNU2pa1vH7OrZoPGUY4qICAiIbpHw+8LR2rTss+4jRhlDgDzgkl7j5RAaGspjjz3Gjh07WLBgAevXryctLY3x48fTtm3bP33/EhISEn8lkiglISEh8R9g9+7dVFRUMHjw4L/kbu5fRefOnRk8eDCrV6/mrRUr6DloEPHffYf7ZEg5gsCovDxq4uK4+6OPrlqJwyOPPMKSJUsoKirixhtvbOAssNlsPPnkk6xevRqNRkOHDh34+eefL2q7oijSokULWrRowfr168+77qJFi4iIiKB7d08nqr179/Luu+8yZMgQjh07RnJyMu3ataNRo0asWLGCcePGnVW8EJUaVGonfrpwnr9rHHc8/gwBoeEYjUaMRiMKhRwfHx8CAgKQyQyYTGbuHNWD1775EUEQcLldNI6Jo7L0O+qqK7m1RweWZOTz6cvPctvY29m6bbO3c1VwWBjKk6Hpi2d+Q+/hIzHaHMTFxHgFwrlz5zJo0CBuvfVWPvjgA+666y7uuusu2rVrx9NPP01UVBQLFy5kxIgRLFu2DIPBQGJiIt27d+err75CEDwlgl999RW//vorWq2WX3/91esuWrRoEYmJiRw/fpxHH32UrAMHsbrc9Bo8nHuefJ63n3qImNZtuW78XezZspHZn36AzWbF6XAw6OZb6T5oGFar1Tv5Li8vQ6PR4Ourx26zYbfZEEU3FosFk8nI1LvGEdu2PYcy06gqKyOxR2+mvPwGe7dsZNe61aRs28zquT9y8803M3LkSFauXMn8+fNxOp3odDqefPJJWrZsSX5+PtXV1ezevZvs7GzMZjO7d++muLiYCRMmsG7dOgC2bNnC559/jlKppHv37ixdupSZM2fSqFEjjhw5wocffugJjXY4GDVqFGPGjAEgKSmJyZMns3nzZqqrq7nvvvu4/vrrASgoKOCDDz7g+PHjGAwGTCYTjRo1oqKigvfff58TJ05gs9m45pprmDx58kWd639V97Dz7cdmszF16lQKCgpQq9UEBgby/PPPewOrJ0yY4G144HK5yM/P55dffqFly5ZUK32xK3S47a4ztjvn8w9ZPncWQaFhWK0WmsbE8fgb73mX17ubKsvLSNm5lcMHD+Cj90euUODv7wcImM3ms47ZKcj46auvGDx4MCEhIbz77rvexgLFxcWMGzeOm266id27dzNixAhmzpyJy+Vi5cqVDBgwgOuvv55bbrmFrVu38vbbb7N582YyMjJ46623+PHHH+nYsSNbtmzBz8+Pw4cP8+6771JRUQHA2LFjGTNmDHdNvItuD3ajy9AubPt9G+u+W4fT4UR0i4x6ZhSt+rbCbDYjCAJut0eQttlsmEwmb8n06TzS/hH6jOtD5sZMaktr6TehH6OfHs3GHzdyOPUwPz//M7+/9TtjXxpL28FtWfzJYj5Y8gFup5uwsDC+/vprBg4cyKRJkygrK2PatGmIoojT6QQ8brHHHnvMK7h9/fXXvP/++/hqtdzg68u03FwKBQG5XM7+hQt5duFCany0mBwmhj4xlDbXtcHhcPBg3IMMmTSE9NXpmA1m7nj7DuKuiUOmkFGUV8QnD3yCzWhDiZIXX32Ru2+8m9zcXB577DHKysqw2Wzcf//9PPTQQ+c7ZS8aQRDo1asX7du3Z+7cuaSkpPDJJ5/QvXt3xo4de0mdUyUkJCT+yUiilISEhMS/HLfb7XVJ/ZuzpP6IyWQiMzPTm3eybds2kmNiuLFLF27IyECr06HRaDh+/DiTiouJqqqCqyRK3XzzzTzzzDNeQeh0p9Rzzz2HIAgcOnQIQRDOuGt/PtavX09AQAAZGRkUFBQQHR191vWcTqdXXKkfQ70bYNu2bezevZutW7fSp08fbrvtNqKios7ppjHYPRM3QRB468d6N4GI9eQk0mwyUVtroLbWgEqlRKFUIIoiFZWVRJ/MUlq7YA7dBw6l3iW1cdki7HY7Hbv1YOu2TchkAkqVCnx8WDp7JhWlJaz9fR7xHbvhGxTSIE/q+++/59VXX2XgwIFMnjyZnJwcAPLy8gCPS2fAgAF89NFHzJw5k0WLFrFo0aIzXtdzzz3HwYMHSUxM9Jb0nM7tt9/OkCFD+OSHn0ktrcVaU+VdJggCGo2WxKSe9Bw4FLlcRlV5GVNGDqF7/0HeQHa3243T5cLhcGC326io8DiJXC43NdU1VFRU4nA4KMrP4/F3PsPlcvLCnWPZtXkjsW0TSOzdl6YtW+FnN1JZWcn06dNJTU1lyJAhyOVyTpw4wSOPPMKYMWPIycmhqKiIGTNmUFxcTFVVFTNmzKCurg673c6MGTOwWCzMmzePkSNHEhAQQE5ODrW1tcybNw8fHx8WLVrEgAEDaNeuHU6nkxkzZpCXl+ftHJmamkrv3r2pqanhrbfe4sSJEwDMnz+fzp070759ewoKCqirq+O7775jxYoVJCYm0rt3b9xuN6tWreLo0aP/mnwbp9OJVqtl6NChCILA/v37mTJlileM69Wrl3fdw4cPU1VV5W0W0HHkrejDIrGbjGds12Qy023AEEbdOxmnw8GP777ODx+9w7gpj3vXuf/FN3j9oftQabSYjXVMfOE1lEolNTW1LJzxFQHBIfQfefMZ25YrlaxZtIAhgwZSUVHBunXrCAsLQ6VSUVdXh9FopKioiGuuuYa6ujqaNWuG3W6nZ8+euN1ufv75Z+x2O19++SV+fn4EBATQrl07mjdvzpdffgl4rkGlUuk97v379wfg6NGjfPHFF5RXlGOz2aisqCS8fTgTZ070iMHHq/ni9i94dvWzKFQKZDIZGrUGtVqNw+E4eZ3YvaLc/v37CYkMweVyUVNew/NLn8dqsPJUl6foO74v/e/sz7Z52xg2eRhdr+sKwJZ5WyjJLWHD9g34Kf2YNWsWU6ZMYfny5fTu3ZucnBwCAgLYuXMnR48eZfXq1Q06ru7fv59XXnmF1NRUIiIiePmRRyA3F0EQyCstZaLRyFe39qXgtRs5YTXyRt83eKXbK4hmEYvBQnS7aG753y2kr0vnp2d/4sX1L1JXUsd3d3/Hoz89SkzPGKwuK3WGOrbVbePRWx9l9s+zadXKI9R1796dpKQkunbteqWnrxc/Pz8eeOAB0tLSmDNnDrt27SIrK4tbbrmFLl26/GUCsISEhMSfhSRKSUhISPzL2bVrF+Xl5QwaNOhf7ZKq76xWH1Ken5/vndz07t2bgwcPotVq6fnSS4Rs2wZffYXFakV0u/FVqz15ITNnwjmEnkvhmmuuAU51kqp3SplMJr7//nuOHTvmnQhERERc9Ha///57Jk6cSE5ODjNmzOC1114DPHf6H3zwQbp3786+fft4/PHHWbJkCWvXrmXmzJk89NBDxMbG8thjj7F27VrWrVtHbW0tW7duJSMjA71ez6233kpNTQ0AO3fu5Omnn/ZMYu1Oxj/6DP2GjeC23p149ZsfiW3TnqWzfmDj0t9xOhwIMjkTHn+WJi3jEUURERGTycSRI0dYOedHyoqP8b+Pv6S2sgK328WPH7/Lsx9+zQ3X9yc2No70/RksWrGEOx57muvH38VPn7xHZVkJ7z0xGbfTQY8vv8DhcDBp0iTS0tJ49tlniY+P5+abb2bGjBm4XC6vONW3b1/v+1UvwNXz8ssvA9C/f39GjBjBggULvNlLq1evpqSkhFtvvRWdTkd6ejqrV69m6fpNPPHoI3To1oOsfXsoPX4UvwBPiZGhuoqp99xKXtZ+QMRht7N99QoG3ngLVpORHauWkbZtEwIw+p4H6DFo2MnzQkCn0+Lr64NcLuea4dfhH+Bxs0S3ao2hsty7TKlUkJTomaDOmzePuro61qxZ431Nbrebzp07e7OJunfvzsGDB0lPT6d79+5UVFSwaNEiunfvTmpqKtHR0d5SrW7durF9+3Y6duyIzWajtraWnTt3erctk8kIDg6me/fufPPNN9xyyy3ez4hly5YRHx+PxWJBLpczfvx4du3ahclkol+/fmg0Gr777juEk40EAOx2O76+viQlJZ33PL+UzmtX8pxLJTQ0lJycHLp06XLGsu3btzN48GDPMpkM/8goBEDpoztjXZVKiVUmQyaToffzo2PPPqTt2IKptppnx9/IgFE3s/a3X+gx+Fp0ej/Ki4/y8wdvMu+Lj3h0+vuMf/gJADYtXci+LRt48t1PWT57JttXr6CutgaL2UyLuHiaRzUiMzOTsrIyCgsLveWVERERBAcHM2PGDDp37ozVaqVTp06888479O7dG7lcTqdOnQBPSWyLFi281wlAQkLCyW6BMq+T7nQ2btuIXC5Hq9NSkVfBgv8toKakBrlCjsVgwVJpITwmHLlMjkarITAwEFH0fGZYLBasJ3ObnC4nNTU1uJwumnZvSlFREQqFgoDIAA6kHCBeFY/T6cRuNuOwWlGo1exbvo+ClAJ6d+2NDBmu05opCIJAREQEr776Ks899xxHjx7l999/x2g0YjabEUWRDRs2MGzYMO/n8sRnnuHVTz8lJCyMtSeOk4uLsTvTEQdlIJMrEASB0rxS1P5qFGoFnUZ43reWXVtSWlCKzWbjSPoRIltG0rpXawCUciXqQDXrs9aTmZXJzeNuRnFySlVXV0d2dvZVFaXqSUxMJC4ujt9//52tW7fy3XffkZyczG233XZJWYkSEhIS/zQkUUpCQkLiX8zpLqnT83T+LbhcLvLy8sjIyCA9PZ3y8nLAM5mOi4vz5kOFhYVx+PBh3nvvPb777jte+N//CKiowPzNNwBodTowmeCHHzyZIVeJelGq3imVn59PUFAQ06dPZ926dWi1Wl555RUGDhwIwH333ccNN9zADTfccMa2qqqqWLVqFV9++SVHjhxhxIgRTJs2zbuPAwcO8MUXX/D9998Dnsnk6S6gTZs2ARASEsLYsWP58ssvmTVrFsuWLWPBggXeSX1VVRWjRo1iwYIF9OnTh42FZZRXnllSM3j0GMbc5ynFyk7dyztPPcyMtdswm83IBBlyuZyls2aQunUjj7z5IaWlZRwvKsDldFJTUc7L93kyagoLC1BrtXTt3otPX36e+C7d6Td6LMvm/sQDr77Lkf2prFmzhjfffJOCggIEQaCgoICcnBxcLhcqlYrg4GBvKc7u3btxuVw89dRT7N69m7q6Op5++mkOHz7Mli1bAOjTpw+LFy/GbrezdOlScnJyWLJkCWq1mp49ewKQkpLC1KlTqbE6OHY4j7ufeZGxUx7jlfsnsH3tSkbe8wCvPjSRo/m5PPfpd4Q1bsJbD92LQq2muqqCvKxMho65jZvum0xdTTUv3D2O6NZtCQoNRxTB4XBitztwiyKCXIHd4fD4yAQB+8ncM1EEl8NBaWkpgiBgMpno2LEjw4cPb+BuqKurw2QyYbfbqT4ZFu9yuaipqaGurg5RFKmtrfXk+DidXpHU7XZ7xQC73Y5Op+PZZ5/1brd+HxaLxbu+3W73LrPZbDidTm8plMFgQBRFdDqdt6xt6tSpKJXKBuP94/eXu+xsXy/02JXsc/bs2fTs2dMrWNQvKy8vJy8vj6lTpxIQEIAoV7B04Twqy0q5bcqjnnU5hUwmw+VyIpPLUSmU7N28npYJiYiA2ViHQqnCLzCYsVMeY82vs4iMakptRTnR8a1JXreK7td4nEk7Vi1jzMQHCQ0JZdTtd3PXo0/z4v13kLZrB++9OZ2oqCjMZjPZ2dn88MMP9OjRg8TERD799FNCQkLYvHkzQUFBBAcH061bN2QyGa+88gqLFy/mgQceADzlskOHDvWGgk+aNIl77rmH48ePM3PmTCZNmsQfmTV3FlqNlqDgIN584k3GvTKOpFEeIXJis4n46nwJDQ1FqVLi5+eHn58fFRUVyGQyAgMD0ek8Qp5CrvB+vokyEbvd7unKJ4ChxkBtRQWC1YqstAx3Tg4muRyn2cKgiX25Kf5mIiIbExERQWRkZIPxKZVK2rdvT05ODv369WPu3LlUVVXx1ltvnVEWWX+Mlc8/w9GUuURs2M/U7+5CZxdBpYLmzUGhoOhgEQqVAqvViq+vLzK5DLfLc73IZLIzzik1ajRo8An0YeqWqQzSDSJM0bCz35+BTqfj9ttvp1u3bsyaNYuMjAwOHTrE6NGj6du371V3TdldbhwuNyIgEwTUchlymeTMkpCQuLpIopSEhITEv5jk5GTKy8sZOHDgv8YlZTab2b9/PxkZGWRlZXknETqdjm7dupGQkEDbtm29E5t6WrRowbhx45g9ezZff/MNTzz+OPsXLiTWYkGpVHpWOilsXE3UajVms9kT5O10UlRURJs2bXjrrbdITU1l8ODBZGVlER4eznfffXfO7cyePZvhw4cTEBBAQEAA4eHhrF69muHDh3tf3+kuoXMhCALx8fG43W7kcjmjR4/mhx9+8E74du7cSXx8vLcDl0wmR3+WgO68rExmf/4hhppq5HI5Rw/n4bDb8fXVI5PJ2LtxLVn79vDAtLdRa3UY6uo8+1Qo+WrlZmQyGbcmtaNLvwG0bJfItbfeQfKmdViMdQSHR3hDn4OCgohQBbFo0SJKS0sJCQlBqVTidDoJCgrCaDRiMBi8Ack6nQ6n00loaCh6vR5RFAkKCmLnzp106NCB9evX4+/vT48ePcjJyUGtVnPs2DFqamqwWq0sXrwYpVKJXC5nx44dtG7bjvDGTYlo2hwQ8AsIpPRoESaTiYrSEprExhHWuAn5WRkcLzyMf0Agxfm52CxmNi75jX1bNgAgilBcWEBAcCgg4hbduN0uEEXcbrfH0SGC6BZxu1ye0jEfX6pLSyhXeMSjiIgIVq5cSYsWLfDz88PtdlNWVkZ4eDhVVVVYLBaKioooLS3FbrdTUFCAwWDA7XaTl5eHy+Xi6NGj7Nq1i8DAQA4ePOgVdn18fBAEgfnz59OqVSsAampqUKvVaDQaADIyMlCr1YCntC0rKwsfHx/cbje//vorNTU1OJ1OduzYgUajITIykm+//dbrLDKZPJ0b68sb/+mIougV3NLT0zl69Cj9+vVj1qxZuFwu77/6krAffvgBl8uF1i+Am596CYfdTvHxYkA86SAERJHaWgO71q3mYGoKCBDbrgM9ht1AZUUFcoWCjn0HsmLuTxzOOYjZbKG6vJRjBYcZcecDfPvq8wy65Q7qqqsoyjtE45bxlJaWkLV3Nwu++ZxDmWk0jY2nKPcgBw4cIC8vj8TERNq0aeN9XSEhIQA8+uijTJs2jW7duvH5558zZcqUixYl4uPj0el0zJ071xuCXlFRQUhICApBgRw5LlyYakyENgsFYNuv287oqGcxW7wlzPXlgvVoNBr8AvyQnXSVne56UigU+AE6nQqz0QqiiMrpJHFgPBu/2swTpq3UhoezNiSEZJWKoDZtyMjMRC6Xs27dOo4dO4bb7eaWW25BpVKRkpJCYWEhVVVVrF27lqeeeoq2bdt6Rf4tIxsRkNCLyplbydmUQ7tuLVAKAoUb99G4b2fvdWGxWBqc3263m7hucSyctpCDOw7Sqmcr3G435hozUXFR6PQ61sxaA3fAcJ/hVBZUEhQU9Kc3C4iLi+Oll15i2bJlrFmzhrlz55KcnMyECRMuyb37R+wuNyUmG9UWO7U2Jxani9NNjDIZ6JUK/DVKQrQqQnQqZFL5oISExBUiiVISEhIS/yBEUcTmclNnd2Kyu3CdnAjJBQEfpRy9SoFGIfMGzC5fvvxf4ZIqKyvzuqHy8vI8d8uBsLAwevbsSYcOHYiJiWmQDXI2+vTpQ0FBATt27ODLr7/mYPv2PNSkCVGFhRAWBnfffdXHXh8mazQaadq0KTKZjPHjxwPQsWNHoqOjyczMPGsXvNP5/vvvKSkpoXnz5oDHHfP99997RalLmejHxcUBUFhYyP3338+2bdu8mT9/RCkT+GNllMNu5+XJd/H+nEW06tARU10dNyS0wG6zYjrZSWv1vNmENWrMVy89A4BCoeT+l95AEASCgoJQqTyTOJ1CiV6jJiwsHIVCQcrm9ThOugsUCgU9kroxun9vPv/8c2JiYsjNzW0wlilTpvDTTz/Rv39/CgoK6N69O1arlWeffRa9Xs/BgweZO3cuAIMHD2b9+vU8+eSTZGVlMWfOHIYMGYJSqUSv17Njxw5vFldxcTEPP/ww69euobKklE2L5jP67vsBEbdbRKVS0+Wa/mxftYwPnphMbNv2tE7sTHBIiKdTl58/t01+hJvuOdNJIpcrCAsLIyqqMWq1muDgYBpHNQZAq9USGBRE48ZNGDr2Nr6Y+jjHD2p48MEHef/99/nll1949913PWVLdjsjRozgvffe8+Znffzxx2zatIn8/Hw++eQTCgsLWbRoEZ999hkA119/PVOnTkWtVjN48GCSk5P57LPPCAgI4JlnnvF27HK5XISEhDBnzhyioqL45ptv+PDDDz1OIFHkt99+4/XXX6dZs2Y8/vjjPProoxQWFqJUKklKSmLixIm8+OKLPPPMM2zbtg1BEPDx8eHTTz8lISEBOCX61PPH78+37I9fRdHjpLFard6vNpvtjO9tNpt3HZvN5v13rmWiKJKdnU1RUREDBw5EpVKdse/i4mK6du1KaKhHfFH7+CKXy5FpNKgUcq/7ShBkiIjI5TK6DRjCxOdf9rpoZIJA+Qklao2W+DbtuPXhp5j9wXTqamtwu1zc9MAjNIuLp3FsPN+98RIOh53O/QZRZzRSXV3Nu089RNKgYWj0eu5/aToPDu1N7969UalUyGQybrvtNnr37o3NZuOHH34gLCyMZs2aUVVVxfbt2ykoKOCpp54641w9FwqFgsWLF/Pwww8zffp0ZDIZU6ZM4YEHHkBAwEfmg1N0MuHtCXw84WN0/jra9m1LSBOPIOZyubDb7RhNRuRyOcHBwWi12ob7UHqmGYIgEBUVhcpXhcViwS26cTgcOIF+NyTyy+cbWbNgHzdP7EO3kR1Rb87jzjVZCNXVuIDbfH25rbCQl4xGjiuVLPv5Z9IKCyksLOSRRx7xhq4nJiaSnp5Oy5Yt6dmzJ0FBQdx8883o/fUUOAoIatyYZz6/k5/fWcYvX2zE5XITEhHAE706IJd5fvfUlx6eTkBYAI/PfpzZ/5uNxWhBJpNx8/9upvPwzjz969P89NxPrPtiHc+5n6N5WHPmzpl70cfhSlAqlYwePZouXbrw008/kZ+fz2uvvcaIESMYMmQICsXFT/OMdidFtWaKjTbsLs/vZ5ngcUfJBM8tBhFwu0WqrQ6qrA4Ka834KOU08dPSRK9FeYFOlRISEhLnQhKlJCQkJP4BWBwujhutHK+zYHW6PWKU2LBkBDxZNmq5jChfDWX5BykrK2PgwIHe7kz/FNxuN/n5+V4hqrS0FPBMTmJjY0lISKBDhw4XFHL+iCAI3HbbbRw7dowVK1ag0WhQvPMONG4MWq23zffJQXhu614hPj4+WCwW6urqaNKkCQMHDmT16tVce+21FBQUUFBQQOvWrc+7jX379lFeXk5xcbG3nKWmpoYmTZp4Sxb/iJ+fH7W1tWddFh8fD0BRURGCIDBmzBjefvttli5dysSJE8nNzfUGofsqZRwpqUZz0l0BYLfZcDochDXytGFf9OO3AJwoKUGt0aFQyHn7598JiWqMyWTCx8eXRo0iyTt4AFEUOXGiBN+TTrZH75mEr68fnCxxHDTqZiIaN2XLqmVY6mppmuhx7dxzzz1s2+YpD9TpdJjNZg4dOoROp6Np06bEx3vyrF555RXvxFCn03HNNdewaNEili1bxtSpU6mrq8PHx4cZM2YQEhLCY489Rl5eHtOmTWPdunVewaSoqIhp06bx008/MfvX+Yy8bwrmujpuvv8hPnrucSIiwpnw8OPs3byBFz/7jqYxLXE6HFgtFkTR40JrHnfquOZlZ9IsNh6lSsWcbSnexz/4ZXGDY/PKlz8A4HKLtOrQkZ0paYTo1N7l48aNY9y4cWcc0/ouhAD9+vXzdhJr3ry5NysMYNCgQYwePdpz3E6+L/XulJiYGJYuXXrWc+Z0UUgQBG/HNYA2bdqwcOFCnnzySTp37sz9998PQOPGjZkzZ84Z26ovAzxdFKr/Vy8gne2x8y07PSD7UlEoFF5HWEBAABqNJ3xbrVazadMmqqur+eCDDwgODvY+Xr9+SkoKmzZt4ueff0ar1aJWq1GqVGw+VoPLLaL6w0S7oqIchUKJ3teX8LCGn192swlBEAgNDeWmO++h74iRLJ75DW6nnZHjJ2CxWOh3/Wi2rVhM2bGjjH/4KQIDA7FZLbicTm6Z9Ah+QSEsOXk9qtVqLBaPCFJTU8OWLVto3rw506dP9woOLpeLwsJCAgMDSU5OJicnhxtvvJGnnnqK4OBg7rjjDmQyGcnJyV5HXr0AHh8f3yDfrJ5NmzaRbEkm3ZZOr7G96H1Lb++y29+4HYvFwokTJ7jvu/vQaDSEhISccUPh+5LvKSsrQ6VS8cyqZ9BoNISFhVFTU8OkWZM8nS1tNpr1asn0nrHIBQFRIcMmCNwdHMBzpzmu5HI5GpuNb/R6VEolrn37qI2M5Fj//uSoVGTqdFx77bWkpaUhiiJhYWE4HA4EQWD5uuU0SmiE3WZHLshpOqALL8aG4bBYEN1uBI0GpU5DaDMN72e+j8FgwGazofHV8EXRF9TW1qJSqWjZtSWvrHnljPcqvEU4T897GqfoxCpaSdImEaWOuviT9yrQpEkTnn/+edauXcvSpUtZvHgxe/fuZcKECd6bIOfCLYoU1prJqzLhcIvIBQGNXHYex92px12iiMnu4kCFkWMGC21C/AjRqa7eC5OQkPh/gyRKSUhISPyNWJwuDlUZKTHacLpFBEAhE1DJZAg0zENxiyJuUcTqdJFbbcQg86XdkBu4pl/Pv238p2OxWMjKyiIjI4P9+/djMnnKPDQaDV26dCEhIYF27dpdcRtrpVLJpEmTWL58OSUlJZ6yi9NL/Q4ehGeegYoKuPNOuP/+hmLVRfDAAw94tz9jxgwEQeCRRx4B4KuvvuLee+/l2WefRSaT8fXXXxMV5ZmEnCtT6vvvv2fcuHFeQQogICCAwYMHM2vWLG8o8enccccd3HXXXSxatIgHH3yQ2NhY77L6SWBRUZG3nEqlUiGKIvPnz2fu3Lk899xznmwiEW566GlChwzzPt9Hr+fuJ57nwVFD8Q8KovvJAG+Xw4U20FPqZbFYUCgUaLRatFoNKpWaoKAgZDIZarUK10mhxOVyAyIYGgpoQ8eO59s3XmJxgB8//fQTzz77LDabjaSkJO95PWLECOrq6oiIiPA6WM7Fddddx+7du0lMTCQgIIC+fft6xZjY2FjmzJnDAw88QE1NDQaDAb1eT9++fSkuLsZpt6GUK/AND8NtNZ18DRqimsfwzLsf8+bjk3E6nMjkMh5//T1aJXbijRlz+Hr6K3z1xss4nQ7CG0Xx6jc/nXeMp+MQ3fgqFQRrr+4k7dNPP+XXX3/F5XLh5+fH7Nmzz7u+2+2+KKHo6NGjFBQUoNPp+OGHH867fn3e1OWgUqkaiEJ6vf4Moej0n09/7GzL1Gr1OR2Wx44dY8qUKbRo0YIPP/wQ8Ag9p4fnv/3220ycONF7Ddez7tdZHDl2jIlPTfU+ZrNZMZnMHkHoArk6Pj6+OByevC67zYF/QACBgUGMGHMrsz96m/AmTYmKboHD4UQmV3LjvZN55b7x+AUG0//6UQCsWLECvV5PSkoKjz/+OCdOnMDlctGzZ09atWpFZWUlJ06cYP78+TRt2hSDwUBlZeU5BT6ZTIZSqUSlUuHj44Ofnx+BgYHecrOwsDBCQ0OJjIxEHaZG8Bewy+yo5R5RVRRF7/UFEBgYeM6yca1Wi1wux+Vy4evri9FopLa2lsDAQPz9/amoqKCqqooyh4NyQUAvl+MToEFXbSEmrQx9o0Yel5zFgsVqxWQ0YjJ6OiEqVSq0ZjNti4vppFYzvlMnrO+8Q0ltLSUlJUybNo2KigqMRiO+Ub7c+sqtnCg8gVqlRqFQoFCp0IsiDocDg0yGf1UVfn5+aLVaDAYDFosFtVqNzWbznrMXQiEokIty0qxptFC2wFf215a4ymQyhg4dSseOHfn555/JycnhrbfeYuDAgdxwww3e8sTTsThcpJfVUmXxCHjnF6PORC4IyBVy3KJInd3F3hM1NPPXEh/sK5X0SUhIXBKC+Fe0O5GQkJCQaIAoihQbrRysNGJ1ulEIAgqZcNF/EBpNRmoNRnR6Pf4+OloG+dDUT/uXt4auqKjwdss7dOiQNzMkJCTEG1LesmXLSyojuNj9TpkyhfLycnr27MnUqVNPiV1TpkBy8qmV77oLHnrosvc1e/ZstmzZwt1330337t2vbOBXkZkzZ7Jz505eeOEFmjRpAsDChQtZtWoVnTp14v7770cQBGqsDnYer0Z+8hw7HYfDTkVFBXa7A7lchlKl8riURPD19SEwMIiSkhO4RdFbnuZBxFZ8AqGi3BO2hICg90XZogUgIIpuSiurcZoMTOh79i5Udrud//3vf9hsNt58882LEivr6uq8OVNPPvkkFouFL774guPHj5OcnExycjLV1Z5Qd4VCQfv27enWrRvt2rVjb5mRaqsDreL8JaJXA/fJMty2IXqaB5zZve1cOJ3OCzqKzvXYH5fX/+y8yJy1iooKsrOziY2NpVGjRgCXLRSd67H6UrR/Awcr68ivNp92vni6g9psdiIjI7zlq+dHpKKiApPJjFbrcQqd7jQRET3HymLBYrFgtzvQ+OopL8yjeM8W2rZtS9u2bWnVqtUZGXv1LFiwgC+//JL169djs9moq6ujpqaGsrIySktLKSsro7y83CsC1YtK9eKi3W4/6zkil8sZ+MpAIjtGYq2yIhNkOJwORFH05EH5+XmcqgoFCoXCU+4o8zRIqP89VF1djcFg8Dqk7HY7oaGh3tficDgoKyvDYDB4xKswX46uOYpyZx2tDAb6KJW0rKpCZTDgsNuxWK1YLRZvWSacDB1Xqzk2aRLhd95JVFQUgtUKW7dSq3WxoPUxjCYzdVV13hy+egHf6XRisVgQRdEropnNZm/zhaqqKhQKBU2aNLmo362iKGISTXTVdCVRk3gR58efgyiKbN++nQULFmCxWAgJCeH2229v4Og1OZzsPVGD0e5CJbvy8HJRFHG4RVyiSJReQ0KYnyRMSUhIXDSSU0pCQkLiL8YtimRX1HHUYEGES747CSKG2lpcTid6TTAOl5us8jqqLA4Swvz+1M44brebwsJCb1lecXEx4JkYREdHe8vyIiMj/1SBLD09ncDAQPr06cP+/fv5/vvveeihhzwT3j9OsGbOhJAQOEvJ1MVQ7wSodwf8U4iPj2fnzp3k5OR4RakbbriBQ4cOkZKSwtatW7nmmmvwVyvwUyuotTpQyE5NsA11ddRUVyOKHieAy+XCarGiUHjyYTQaTz6MQqnEYvbkwMiEekFBQK1UgFLpDYs2W22YS0oICgzEjeec0DrMZ4y7nq1bt2IwGBg+fPhFu+cmTJhAYWEhVquV2NhYbrvtNqZNm8aJEyc8oxIEWrduTbdu3UhMTGwwkW8RoCO1tBan243iioURT3mtW3QjukVE0Y1bFBHdbtxuEacgIHM6OLgnkwyL+aKFpdODoC+F+ol5vRjk6+t71lK184lHe/bsYeXKlUyaNInOnTujUqn+cpH7n0SQRsVhwYzLLSKXeTon2mx2fHx9LlKQAhAIDg7B6SzBYrFSVVXdIABbQECj1qBRawgICMTpdGC2OwlQChTYbGzbto1t27Yhk8lo0aKFV6Rq2rQpgiAwbNgwDh06xMKFC4FTImJISEgDZ+UfEUURi8VCbW0tBoOBqqqqBgJWZWUllZWV1OypIaJ9BDK1DHOtGVEUEQQBURSprKw89ToEwZutVf99/Y0Ii8UThK731WM2mykpKSEsLMzrcIuKiiI4OJgKUwWmGhP7FuxDaVdSEhVFip8f8uBgejVqxEAfHyKLivBPScFd79o76aKyWq2s27OHw0eO4K/X88C2bYTX1nJoQmfcjdoRWuciWKej1uWi7uTnlU6nw8/Pz1NGWF6Oy+VCo9Egl8uxWq1UV1djNntccUeOHEGhUKBUKlEqlQ2+P92lJwgCMlFGjj2H9ur2yIU/XwA/G4Ig0Lt3b9q3b8/cuXNJTU3lo48+okePHowZMwa5WsO+E7UY7S7UctlVEY8EQUAlF3C63RyvsyITBNqH6v9ff4ZISEhcPJIoJSEhIfEX4hZFMssNHDNYUcgElJcxOTaZTDgcTvR+ehQKJQrA6XZTbLTiEkU6hvtfVWHKZrORnZ1NRkYGmZmZ3nb0arWajh07kpCQQPv27dHr9VdtnxciPT0dhULBxIkTmTFjBunp6SxbtsxTNjdxIjz4oCdTqp7334egIBgy5JL3Vf+66l/3P4X6sPOcnBwGDRoEeNwN9957L6+99hrz5s3zul6a+mnJsDo8JaBuF5UVFVitNgSZgEqpwG63gwB6Pz2BAQEIwqnzUqlUYsGC0+FoOBk/KaB4HBJynBo1drudkpJSlFotTrudlsFnzzpzOBysWrUKtVrtHfvFMHPmTPbu3UtycjKFhYVs2rQJgOjoaLp160aXLl3OKCeqD9DWumwEyEXKbS4UeLrhie5TYpIoegLQRdF96usf1jn9K+fwmctVKuQKBVlrl1JZlH/GcplM1sBl5O/vf0Xla/VulSud/KWkpKDVamnWrNlZS33+vxGqU+GrlGO0u5AJAtU1NQiCQOBZOlmeD0EQCA0Lo+TECerq6lAqFej1Zy95cwtyfLRyrh0xlNuvG0phYSFZWVlkZWWRn59PXl4eixcvRq/X06ZNG6ZNm0abNm0u+bNXEAR0Oh06nY7IyMhzrmez2ZiRNgNThAmFoMDP1w+1Wo3T6fQElZ/sSOp0OnG5XLjdbtxut3e5eLJEzm63ezs3ulwujEajV/SUyWQoNUqUPkpqttVgr7ZzovIExcXFREZG0rhxY1YYDKxTqWjWrBnD3niDbmo12n370CYnE2gwYOndm369ehGek0PJ9u0o8vOpAA52jUC02XGZrMgsFoIEAb1eT/lJR5TFYkGv1xMREUFFRQWiKBIeHk51dTVarRa32+11+DkcDqxWKxaLpcF7VF8S6RWplHJqlbUUO4ppompyScflauPv78+kSZNITU1lzpw57Ny5k/379zP4zgdwav2umiB1OgqZDBE3x+osBGmUNPbTXvhJEhIS/++RRCkJCQmJv5BDVUaOGawoZcJlujVEamtrEQTwP23yrZDJEBApNdnIqjDQPtTviiap1dXVpKenk5GRQU5Ojre8IzAwkH79+pGQkEBcXBxKpfKy93G5mEwmcnNzadu2LRqNhrvvvpvp06ezfPlymjdvTkLXrvDCC/Dqq6eeJIrw8ssQGAhdz15Odi7+qU6p4OBgQkJCyM3Nxe12e8uiQkJCuOOOO/j222/59ttvef7554nwUZOnkFNrsVBbUY7bLSJXyBHdbux2B0ql4qSzRnPGfpQKzzF2OJwNRanTRD9BAJ2vL5EBAVTX1OAA9q5fhaplU9q1boVG03C79S6poUOHntF+/fRuazabjZqaGtLT00lNTeXw4cPeCbC/vz/NmjWjcePGqFQq9u/fz759+84boK3U6ug06jY0en9sxguLjIIAgswzcRNkMs91plR6f27wVZAhyGSIcjl6t41ON96A5izC0tUuZb1a1DtfgoOD/+aR/DMQBIEmfjqyK+qoNRhwOV0EBPgjl1/68ZPL5ISGhVFaUkJVdTUKhfKMTnWi6Cl9auyr9Yart2jRghYtWnD99ddjMpnIzs72ilS7d+9m9+7dCIJA06ZNvS6qFi1aXJUSyaNHj/Ltt99Sbign9v5YgqKC8JP78dOzP7Fv5T4qjlQwfet0mic0B8ButfPp3Z9yLOcYKrUK3xBfbnvjNgLDAjEYDOh0OgRBwGKxYLVacblcKBQK3LgRNAJH9x7lu+e+w+FwEBoaSnV1NSdOnCA9PR2TyUSTJk0QRZGff/4ZHx8fWrZsSceOHVm7di0FH39Ms0WL+Oijj+jeqRNBaWkYZTZsYXrkFidulwu3ywWCgFBdjW+TJri0WkwmEwaDAZlMhmgXmf38bE7knPC6wfrd248hdw9pcKycDid2h90rvNX/q8+fAlD4KZj42ETcJW5uuukmIiIiiIiIIDIykvDw8Aai7yuvvEJNTQ0fffTRGcdAFEU+//xzvv76axwOBzqdjpCQEJ5//nn69+9/0ceyY8eOxMfH89tvv5FbWkmlzYXcUYPK3x/kCl6ZfDfdBw5h2M23XvqJchaUMhkul4ucKiPBWhVa5d/jGJOQkPj38M/8y0hCQkLiP0ilxU5hreVkts/lTRpMJrPXJfXHyZFcJqBA4HidlVCdmkjfMwWGcyGKIkVFRV4h6tixY95lzZs3p0OHDiQkJHjyOv5mO/7+/ftxu9106NAB8ATqTp48mTfffJMZM2YwdepUwm64wRN0/sUXp57ocMCTT8K338LJ7nUXwz/VKQWeEr7t27dz9OhRmjVr5n28S5cuHDhwgG3btjF//nxuuOEGCpK3oI5ujaBQIHe5cDmdCIKAv78//gH+CGf0evSgPNnW3eH8Q7i1y+UxC538z3VyUq3T+3OsIJ/klYspSA5iwYIFdOrUiejoaOx2O2azmd9//x2r1UpoaKhXSDo9QNvtdlNZWUl5eTlVVVW4TwpgGo2G0NBQwsLC0Ol01NTUeDvTKZXKBo6icwVoK511uFQhaEPDkONGfk6BSTjne3I2XG4Ru9tNiFZF58ioq1Ai+NdSWVmJTqc7Q0D8/0xjvYbDVQYMLjdyhfycod4Xg0qpIiQkhLLycioqyomIiECpPBWgbXO5UctlRJ8jg8zHx4euXbvStWtXRFHk2LFjXoEqLy+PoqIiVqxYgVarpXXr1l6RKjAw8JLGKYoimzZtYsGCBTidTvr160e/Fv1Yb1vvyUu6oSvXPXod04ZNO+O5A+4eQOLgRARBYPU3q5nz/ByeX/w8DocDrVZLaGgoAGVlZZjNZvwC/JD5yNBatYTZPSV9/v7+DB8+HKVSSWpqKvn5+ZhMJmpra/H390cURcrKyjh+/Djr16+nrq6Oli1bYrFYePjhh1GpVDRRqRgepcWhkqGus54yNbrdOAWB4pJSFEqFt/TO4XCw/N3laP21PPjrg4huEavRit1oPyPkXKFUoFCeOX1yuVynBCq5jeGThlOytISUlJQz1g0MDCQyMpKIiAgKCwsRRdHbnOH0368vvvgiGzZsYOXKlTRu7Mn027NnD/v27bskUQo8nUxvuW0863KPYzBbMNfVYTWZLvn8uFjUMhlWp5ucKiOJ4f+s7sASEhL/PCRRSkJCQuIvwOn25D653CIa+eVOVkVqa2vOcEmdjlImw+p0cbDSSJBGifo8oc52u50DBw54g8rrnUBKpdIrQrVv3x5//3/WH5RpaWkIguAVpQAaNWrEhAkT+O677/jyyy957rnnUN99t0eYmjfv1JPNZnj4YU/O1Mkw5wtRL0r905xS4Cnh2759Ozk5OQ1EKYCxY8eSl5fHwoULWbFiBSqViraD3DRqlYDFWIdCJsff3w+5XI7JaDxnyZrL5cJsMeNwODzrnXw8qK4O1Wn5XbUGAw4ERGDFzK/RaTxugNzcXA4cOICvry8tWrTAbDZTWlpKTEyMp+OTRkNAQAAqlYqqqiqOHz/O8ePHvV27IiIiaNu2LR06dCA2NvaMErbLCdCusthJLa3F6nRfccjv6QG/oToVieH+/zpBCqCqqqpB3pEEKOUyjqfuQtYkDv/AoAZlrZeDVqsjMDCQ6qpqysrKiIiMRC6T43J7ZJO4IB98ziJ4/BFBEGjSpAlNmjRh2LBhWK1WDh486BWpUlJSvGJIo0aNvALVhZpOmEwmfvzxR9LT09HpdEycOJHExEQABikGscG8gaY9m6IRzhQuVRoVHYd09P7csktLln+6HIVCgVqtxmKxeB2dISEhlFSUYMVKuDOckZEjmZ45nfvuu4/IyEhSUlL47rvvAMjLy6Nly5bExcVRXV3tbaKhUqn48ccfEUWRI0eOEBwcTGxsLEeOHGFfWRnL85S0nu5k2H198ZXJmPfGMgRB4ERxDcZqMw/MfcArdgNUHq8kqm0URqPR46wUQB+h99yMEGHRW4vI2pgFArTp04Y7pt+BQqXAXGvm5//9TN7ePGRyGdGJ0dzx6R2sWbqGSEskn3zyCZs3b+bpp5/GaDRiNptp3bo1rVu3Jjs7m8zMTOx2O08//TQ6nc7rqvL39+fdd99l/fr13sYDgFeYrOfdd99l5syZyGQyEhIS+OKLL/D398doNPLII4+QfLLpx5gxY7jrsacRFSrMlUW889Qj1BlqCY9qgtNhv+w8u3MhCAIKQaDUZMPscKGT3FISEhLnQRKlJCQkJP4Cjhqs1NmdqC851PwUJvNJl5T+TJfU6ajlMswOF0W1FuKCG7alrqmpITMzk4yMDA4cOOB1pgQEBNCnTx8SEhJo3br131KWdzE4nU6ysrKIjo4+w7XQtWtXCgoKWL9+PbNmzeLee+9FeOopqKyE9etPrVhV5enG9/33nnK+C1C/n7/CKVXfEepiO61VVlaSm5vLzJkzyc3NbbC+0Whk7969ZGRkIIoiYWFhpGXuZ+zjU2kS1xqn1Ux1dc35ByTgyRwRRVxuFzKZ3NslUmkyeYQgweMn0gYGo9JpqTq0H43Lxvj776dbt244HA42bdrEnj17AI8jJykpiY8++ghfX18OHz5McnIy+/bto66uDrlc7i3N6dq1K61bt24QJnw1CNKq6NYokP3lBqotDpyigOoSul/WU99lTy4TaOGvo2WQ7xkdDv8N2Gw2TCbTecOx/z9SWFjI9jUr6TxMRWD7zlclJN9Pr8fpcFBXZ6S8rIzQsHDsbpFwHxVNLjN/R6PRkJiYSGJiIqIoUlpa6hWoDh06xNq1a1m7di0qlYr4+HivSOXpBujh0KFDfP/999TU1NCyZUvuvffeBi6aCEUEw32Gs82yjRJniSeT7TwNvFd9tYrO13YGPC6vZR8sI7J5JMMnD8eCBX2gnpJ9JWRsy2D4o8P58ccf2bBhAyEhIUybNs3rjKo/J99++20WLlxIWloaycnJREdH88ILL/D6668zffp09u/fz/79+7Hb7XzyyScEdAvgxcdeJHXlQQY9MAhRp+NI1lEm/zQZuVqO25sj58nA6ja2G7+/8DsHNxwkok0E0V2jiekZg91uJ3VRKjnJOdz1/V3I5DJ+efIXZr06i3739uP3l39HpVXxxMInUKqUWGot2G12rHYrtbW11NXV0alTJ5KTk73iXM+ePRk/fjyxsbG8/PLLlJSU0KtXL0pKSjhx4gSHDx+mrKwMURSZNWsWc+bMISwsrEEZYEREBGlpacyYMYOdO3cSEBDA/fffz3PPPceXX37Ja6+9hs1mIyMjA4vFQu/evSEkiq5Dr+edpx7mutvuZNDoMaQl7+LFe26l24Ah1Bpq8fPzuySH6PlQyASsLjfH6yy0DPK98BMkJCT+3yKJUhISEhJ/MqIoctRgQYArCBUVqa05mSXlf/4SEkEQkAlwtM5CdICOkuLj3rK8oqIi73pNmjTxOqLquzn90zl48CA2m62BS+p0brrpJo4cOcKePXuIjo5m4MCB8NprUF0Np5dRHDkCjz4KX30F52i1Xk99q3CDweDtPgWnArTP1VntQsLSHx+r/3q+id7ZqKmpoby8HD8/P7RaLWq1GrPZTGZmJlarlYiICKqqqnA6nbRr3YrGgg29QsAdHIpM9JSvyWRnlq7JBBmelypQUnICu91BZGQE3pb2J51jImD380eh0xEXHsCGTYWEhIQwZMgQQkJCAGjdujUjR47kzTff5Pjx4zgcDqZNm4YgCF4HmkKhIDExka5du3qdEH8mepWCpEaBFNSYya8xYXW5EfC4DWUC57weRFHEKYo43SLCye20DdUTrP1zx/tnUp8nJTmlTiGKIvNOuiz7t4/H6Kuh2GgFrlSYEggMCsLhdGK3O6g1mWgU6E+HMP+r8hksCIJXvBg4cCAOh4NDhw6RlZXF/v37yczMJDMzE4DQ0FBat25NZWUlmZmZyOVyrrvuOkaMGHFW52GgPJBrfa5lv20/AFasmN1m1IIaGaduuCx6bxElh0v435L/AZ7SsSGPDkGtV2MWzfjIfOim60aFfwU/lP7AE088QbNmzWjVqhUAgwYNYs6cOUyePNm7706dOtGnTx/WrVvHL7/8wqFDh5gzZw42m42wsDCeeeYZbr31Vlq1asXu3bsJVYbS47Ye7PxxJ2OfH4tGo6H3mN7EtvKIXG63G7fLjcvt6cYXGRlJq6RWHNh+gIKUAtZ+uJaC5AIGPz6Yw8mH6Xh9R9QaNaIo0nFkR/Ys2EP38d05sPkAd317FxWVFd7331Zlo6qqiuRVyeTn5+N2uykoKMBkMqFQKDCZTLz//vvccMMN1NbWolar6dq1K3q93uvMXbt2LevWrWPgwIGUlJRw9OhRXnjhBVwuFz4+PowYMYKdO3cSHBzMzJkziYiIoGvXrrz++uvU1NSwbt063n//fWQyGT4+Poy5dTybN2+kQ+8B5GXvZ+jNtyKXy+na+xpad+wCQE11DWaTieDg4EvoMHn+c1EAjtdZiQ30+Vf8jSEhIfH3IIlSEhISEn8yFRY7Rofzsjrt1eNxSTku6JKCk4G5djvVThcffLOYw2keh4pCoaBdu3Z06NCB9u3b/2lZEn8m6enpAOcUpeRyOffffz9vvPEGCxYsoGnTprRs2RL3e+8h3ncfYm7uqdK01FRM991HwSOPYHO5zisUZWdnYzKZeP7553GdXPf0AO1Lpb6kpb4ULTAw8LK7ry1cuJDdu3fz7LPP0qRJE5YsWcKaNWu8wcBqtZr8/Hz0ej033XQTo0aNwu5ys7/MQInZE86rlp3fwadUKrHZ7DhdLhT155/LhUupxK73R2kyEue20DQwim/y8ggMDDwjMFsmk1FSUoJCocBgMLB8+XKUSiW9e/dm3LhxdOnSBd0FBMKrjUwQiAn0IUqv4XidlWMGC2any5vhfvo7Ip78WcST3xaq8zhbwnTqq9rt8u+gqqoKkELOT2ffvn3k5+fTtWtXWsbG4HKLyATPBNvldqG6AtcrIgQEBWMwGikryEd91IGy8fCr+wJOolQqvc6osWPHUlFR4Q1MT0tLY926ddTW1qLVahk2bBhqtZqSkhIiIyPP+vrkgpwOmg74yHxoo2oDMjC6jYh4OlKu/XQtyUuTeWrRU7g0LoxuIwig0WswHjfSq2Uv2vu1RyPTEJsUS2FBIc899xyVlZU0b94cAIvFQmFhYQNRqv61DB8+nF69erFw4ULmzZtHVlYWn3/+OfHx8SgUCkaNGkVcXBw7y3bidDqx2WyUlZXhcrnQ+JwqO5TJZMhkMhwWB3V1dVitVpRaJR0GdyC+TzxxveP45YlfGPLEENyi2xM07qPD39+fkpAS1Go1ERERyGQygoODCQgOwOXyCFwylQyZKEOtVqNSqcjKygIgJiYGp9NJQUEB27ZtIzs7m/LyctxuNwcOHEChUHi7+Gk0GsxmMwsWLCA6OpqQkBBef/118vPz+eWXX+jUqRM5OTm43W4OHTrEgQMHqKiooKamhnbt2lFSUsJNN91EcHAwjzzyCCcqKhFFkfuvvQaX08mk6wciALdOeRSlUklAQAAajRqr1caJkhL89H4EBPh7S1afGDeS0uPH8NHrcTqdhEc15ul3PiEoNIycjDTmffMZL3723RnnS71byupyoz1PnICEhMT/byRRSkJCQuJPpsJsRxRBLv/zXFIutwuL2YLFYsZitSK6RdR6P3zCIunVq5e3LO/f0Ord7Xaf1VFksVhYtWoVMpmM/fv3k5KSck4Hkt1uJzk5mdtuu43ExERkMhm+Gg13VlXhbzaf2llJCSU5OSzr3BnxHBNMpVLpbXvudrsJCQm5oFB0oceuZjlaQkICe/bsYceOHRw+fJijR49SW1uLQqHA19eXdu3a8corr/DZZ5+xatUqWrVqRatWregY4c9xo5WcSiNWp8clpDpHi/D6ck6nw+HJwBFFHP6BCKJIcE42bef9hP6TjzhRWorJZKJNmzZeF9S+fftITk5m+/bt5Obm0rhxY/r164dGoyE/Px+Xy8W6desIDAykXbt2f8vddI1CTkygD9EBOmqsDursTursTox2Jy5PvAxKmYCfWolepcBfrcBH9d/5E0rqvNcQh8PBb7/9hlKpZPTo0YBHiEwI8yNAoyS3yuOsU8g8uTkXe87Wd9hzuEUUMhlxQXpmz15DuqGWiNCQBllBfxYhISFcc801+Pn5cfDgQZo1a4a/vz8RERGUlpby22+/8dtvvxEQEEDbtm1p164drVq1OkMwFhBopW5FO307Sp2lVLmr+PLDL9n3+z5eWvQS+kA9SkFJiDyEIHkQZUfLmPvDXKpGV6EZekoc6tOnDydOnODWW29l8uTJJCUl4Xa7ady4Menp6We9AeHn58edd95Jy5Yt2bBhA8HBwaSkpGA2m3n77bf59ttvuX3k7Yy6aRStr2mNxWLBYrFQW1uL0WhEp9N5O+/Vd5Yt3FtI255tceDA6XRSVVBFUOMgAgMDiU2KJXNlJq0Htqa2upats7eSODiRwMBAulzbhZ2zd3LXe3chk8kwVBiQBcloHtGcVkNb8dxzz3H//ffTunVrbrjhBg4dOsSTTz7JwIEDSUhIYNWqVRgMBpo3b+5t9mC32zEYDISEhLB8+XIiIyO9n8FGo5Hy8nI+/vhjbz6fxWLBx8eHvLw8/P39vZ1xLRYLGo2GqVOn4hsYxE2THyNl2yaiolsw5OZbGXzjWE4UFZC5ZzcDRt5EeHg4RqOR6upqDAYDZrOZ4OAgNBpPWenkF1+j95BrAfjohaeZ/+0XPDD1FeITEs8qSIFH+He63NTZnJIoJSEhcU7+O39RSUhI/KcYMmQIJSUlyGQy9Ho9n3zyCR07drzgsgshiqK3zfb603OGzsKiRYuIiIige/fuAOzdu5d3332XX3/9FYCvv/6aDz/8EI1Gw/Llyxk3bhxbt249Yzs1NofXcfH83eOY8sLrNIk5f3bLbb078eo3PxLbpj1mr0vKl/ITxdx/bX+WZORhdzi8QpTNbqe+xZBKpUSr1bFi3myuHX0zN3YdccH35a677iIxMZHHHnusQYvqJUuWsHHjRj788MOzPq/+TvSllqqdr9zNeVp49unU1dWRmppKkyZN+D/2zjsqivNtw9dsZ5deBQuKgAUQrGisKNbYa6oao6aYoomJGn+mmphiukn0iy1GUzT2XrBG7AUBRWyg9A4LbN/5/ljZhNiNLcle53hinN2Zd2ZnZ2fu937u57fffrvqa6pEH2dnZ6KiokhOTiYvL4/u3buj0WhIa9mS1t9/j1Kns5erxeh0NPP0pOLpp68ZoP3VV1+RnJzMmDFjCAkJueHxvJcEBweTkZHB7NmzqVOnDnq9Hnd3d9zc3Bg2bBitWrVCEASefvppPv30U+bPn8+0adNwcXGhlosT3k4KMv7kEqoyf0kFgapnbYlMgcJJjcEKosWKFBHvlCRqx++iRsIRJBYLuLhw5tQp+znxxRdfkJKSYs9tKSwspH79+nz55ZfUr18fgMrKStavX8+OHTuYNWsWjRo1YujQodWCfe8lEkHA00mB5z+4FO92cJTvVWfbtm0UFRXRq1evakKdIAgEuqnxdlKQUlhOvs6I3mJFIghIBQHpVco+RVHEKmLvTmk7x+Q08nLBXSXHeewYPv/8cxYuXIiXlxdBQUF3dd9MJhO//fYbO3fuRCaT8eyzz9KpUycEQaC0tNTuojp58iR79+5l7969SCQS6tWrR3h4OIsXL2b37t3k5OTQvXt3XFxcOHv2LGKGyHdTviMoKIiv+n0F2K7HBw4cAGDJL0s4k3qG/fv3061bN/txWrJkCd27d8fHx4cff/yRmjVrUqtWLR555BHmzZvHV199dc19CQgIQKlU8vbbb7N06VISEhI4fPgwQ4cORalSEtY7jP6v9UeKFJlMhsViISsrC7PZjFwmR66Q4+LigqurK0lZSXzY/0MsJgsSqQRnb2ce/ehRBEGg34v9qMivYOHohQDUaVqHhj0botVqeWLGEyyesphJbSYhk8uo17Qej335GBqZBoWTgnr16vHxxx/z5JNPsnPnTurXr0+3bt3o2LEj48ePRxAESkpK+PzzzzEajZSXl1NRUUFFRQVarZZFixaxdu1aysvLUalUyOVyYmJicHV1paysDIlEYndiKZVKfH19yczMRKFQUFxczMmTJ7FYLDTv3I2m7Tqx5PMP6TZsOBuXLmHVD3PxCahJUFgEOdnZpKamIpfLbcfKasGkM5KdbcTF1YU/e4ItZjO6igp8/G3X6eP79/Ltu1P5vw07sZjNvDHqUcpKijHo9dRvFMa49z6hwuTCmTNnGDlyJOXl5VitVvr168f06dPv8BnuwIGDfyKCeLu1Bw4cOHBwFykpKcHd3R2AlStX8vbbb9tLt6637EZs27aN1157jYyMDHtY6tUwm82MHj3aLtRcjUaNGjF//nzatGlzze1ZrCLb0/OxWG0ulJvlD1EqnKysbMxmEwEBAWSmX+CF/j2YvWk3ZrOtW44g2IJunZyccFKr7eVVj7ZrxluzF/J0j44opJLrBmj/73//o169evTp04eFCxdSVlbGo48+ekNh6XY79giCcMsuowMHDnDo0CFGjx5NSEjIFa9XKBTVHghFUWThwoXs37+fmJgYHnnkEduCxER49lkwGKoP6v/+D5o1u+p4FyxYwP79+xk7dizNmze/rX2+GxQUFLBw4UJ++uknSkpKaNq0Kd7eNsfFsGHD7PkkVaxbt461a9cSERHBuHHjqh0vqyiSX2mkRG+i1GCizGDGcvkWwWKxkH3pIi5yCS3CG+OtLcZ1YP9q702YNYvPv/uOI0eO0LRpUzQaDR4eHvYW9lu2bCE2NpahQ4desR95eXn89ttvJCQkIAgC7du3p2/fvleM38HdYe7cuRw6dIiZM2f+5495aWkp06ZNQ6lUMn369Ou6S7VGM5llOjLL9Zgsov37UlXmWfVfiQAyiYQaGiW1XJ1wV8qqfff27dvHwoULcXFxYcqUKXfNsZadnc33339PZmYmfn5+jB07llq1al31tVarlfT0dHtg+oULF+zlyi4uLjRu3JiwsDAaN2580+fMDz/8QHx8PNOmTbtiu2fOnOGzzz7D09OTqVOn3nIpr9lsZufOnaxevZqzZ89SXFxMz8964lLLBbWgxmg0UlFRgclowmwx20vlnJ2dcXV1RSaTkZWVZXfD5ufno1ar0el0KBQKatSogVarJScnB51OhyiKKBQKnJ2d8fLyso/XLJoxikYedn6YGrIat7QPt4PZbLYLWeXl5XYn1fTp00lOTsZqtdKrVy86jngOtbsnE/p3ReWkRhRF6oQ2pM/w0Whc3RER+fXrmTRu2YbwVrZ7GpugaivL/L93JlNWVICLqxsFuTl4+vjxxdK1OLu6VhOlRFGkrKQYNw9PRFHky2mv4+lfk/+9MYWv336DGjVqMGXKFMDR8dOBAwd/4HBKOXDg4IGkSnQC20PCn2/gr7fsRsybN48xY8Zw+vRp5s+fz3vvvQfAzp07GTduHK1bt+bIkSNMmDCBNWvWsHXrVhYuXMgLL7xAcHAw48eP5/jx4wwePJhz584xcuRIIiIimDlzJlFRUZSUlAC2h4zXXnuN0jIt5UYTIyZMokP3h6s5oJbN/Y4da1dgNpmQyeWMe+sDwppVL9+w3WyWI5FKuXTpEnk5uYiiiN5gQKFQMLJ9Mx4ZN55DO+IoKyli4NPP0fHhfiyf+x2FudlMH/c07xj1tG/bFg8PDw4dOmS/8XZzc6N9+/YolUr7TXxVKK7RaGTPnj2cPn2a9PR0+vfvj1KpZN++fSQlJaFWqwkLC+Pw4cN88cUXKJVKkpOTWbZsGSaTCZlMxvjx42nXrh3Hjh3j3eyaTnUAAQAASURBVHffpW3bthw6dAiLxcIPP/xgL1VZv349b7/9NkajEUEQmDNnDtHR0Rw6dIhJkyZRVlaGxWIhJCSEevXq0b1796uG8P4VQRB4/PHHycjIYMeOHdSrV4/o6GiIiICPPoJXXoE/tQTn8OFrilL3sgPfzSCKIvHx8fz666/k5+djsViQy+V4e3vz/PPPXzNzq1evXqSkpJCYmMj27dttQfCXkQgCfholfhqlfRsW8fKDidXCy5++Q8OGDQlq3xJyLiICer3e9jCk0zF7wQISExNRKpX06NGD6OhogoODsVgsTJs2DYVCQffu3a86Ll9fX55//nlOnz7N0qVL2b17NwcPHqRXr1506dLlum3sHfx9CgsL7Q/o/3VWr16NwWDgkUceuWG5s4tCRkNvF0K9nKkwWdAazFSYzJitNvFGKgio5VJclDKc5bJrZo+1adOG3NxcNm7cyKxZs5g0aRIqleqqr70dRFFk7969/PLLL5hMJtq2bcuwYcOuu39V7qh69erRu3dvKioqOHXqlD0w/cCBA3YXVGBgoD23Kigo6JrX5+joaOLj4zlw4MAVolRISAiDBg1i2bJlzJ8//wrR/EbIZDJiY2Np06YNa9euZcuWLaRuTSXssTAKCwqRSqQ4OzvjU9MHJycnKisrKSsrs7uSrFYrVqsVLy8ve3l1VUh4eXk5er0eFxcXnJycyM3NpaysDJPJRElJCTqdDmdnZzw9PbEoLHhIPfCT+t302P8OMpkMd3f3avdFAD169ABsQuCvv/5KWFgY5UYzs5ZvxK9mTQwGAws+ncGq/5vFtG/nYTKbmfDBZxiMBvQ6HQajEYvZjGC1YrFYsFos9B35DAOfHIlCoeSHLz5m5qSXePu7hdW2K4oiy+fN5sCOrVgsFiq0ZTRs2gJRFOnQoQOvvfYa5eXldOzYkdjY2HtyjBw4cPDg47jLc+DAwQPL8OHD2bFjBwAbNmy4qWWjR4+mb9++9O3b94r1FRUVsWnTJr777jsuXrzIww8/zDvvvGO/gT516hTffvst8+bNA2DHjh3VnFI7d+60r+u3336jbt26/Prrr0RFRZGWllZtO/379+e3336jWXQbdqUXoNOWXTGergOGMGS0Lcj15LHDfDzxRRbG2cJZraKVwqIiBKUT5eUVyOUypFJbG2sAmVSK1WL7u9UKU79dQHZ6Gu89O5xWnbvRb+QYdq1bxcsffYlzZTGCvoK4uDiCg4P53//+h1Kp5LfffqO0tJTJkyeTnZ1NWFgYY8eOZdasWfbuQL/88gtr167l888/Z/369axbt460tDScnZ0ZNWoUzs7OPPHEE5w/f57PPvuMffv24erqytmzZ2nfvj1paWnk5eVx7tw5Fi1axPz585k9ezb/+9//2Lx5M6mpqTz11FPs3r2bhg0bYjKZqKyspKSkhLFjx7Jhwwb8/f1JSUmhRYsWTJ8+/aYEqSoUCgXPPfcc77//frXSENq1g2nT4N13QRRBLofLZZpXo8oJUNUp7n6i1Wr58ccfOXr0KBkZGSiVSoKCgigtLaVnz57XFKTA9pD19NNP895777F8+XJCQkKoU6fOVV8rCAKyy933kErw9va2tys/u3w5jTIysF52yhlUKsIjIigqLqZDhw488cQT9vXs27ePoqIiOnfujJub23X3rUGDBkydOpV9+/axatUqVqxYwe7duxk0aBBNmzZ1dG+6SxQWFuLp6fmfP74XL14kPj6e2rVrX9cB+1ckgoCLQobL38gZ69evH7m5uRw9epTvv/+ecePG3dK17lrodDoWL17M4cOHUalUjBgx4rayqzQaDS1atKBFC5vAkJmZaReozp49S3p6Ohs2bMDJyYlGjRrZRao/N9QIDQ3F3d2dgwcPMmDAgCv2r0uXLly4cIHDhw+zfv16evfufcvjFAQBDw8PNBoN6QfTCekXgtJZiUVnCyGvqKiwC7DOzs7o9XqKi4spKipCEATKy8uxWCx2V5irqyvl5eWUlZWhUqmQyWTUrFkTZ2dnCgoK0Ov1GI1GiouL0el1OPs4EyqEIrg8GN+lESNG8Oyzz/JiSTGikwt+NW1ioFKpYsjo5xjRuTVSqRSj0YjRaMBitiCXK5ArFCgVCswWCwa9HkEQMFvMZGZlEeDvT6fe/RnX79srthe3ejnH9v3OZ7+sQePiwooF/8eR+D1IJQKDBg3ioYceYuvWrcyaNYsvvvjiins7Bw4c/DdxiFIOHDh4YFm0aBFgm+mbNGlStZuXay2bO/fqYZtgy67o2bOnfVbRz8+PzZs307OnretRUFAQHTt2/Nvj3rdvHw0aNKB9+/ZUmsy27Cv3KzvdnU1OZMk3n1NWUoxEIuHS+bOkp50HwSY4mQwGpFIpKicVri4uuLm5oZTZOgb51ahhD6QeOPwpvHxrUCewDjK5HI1SiY9/AFKpFI1Gw2P9e+KhkrNw4UJKS0s5e/YsAEajkbp16xIdHY2npyd+fn7Uq1cPFxcXe9vpPwdyx8XFMWTIELtA8/TTT9uFwU2bNnH27Fk6dOhgf71EIuHixYuALfcoOjoasLkCZs6cCdjaXvfo0cPeClwul+Pm5saGDRs4f/68/bOpcihpNJpb/jy8vb15+umnmTVrFt99990fpSF9+kCDBrB/PzRvDmFh11zHg+KUSkhI4Mcff+TixYvk5+dTu3ZtateuzYABA/j+++9JT0+/4To8PDwYMWIE3377Ld9//71dpLweWVlZ5ObmcvjwYQoLC2mck0MDqxUntRqNWo0qNJSSVq1ISkqiQYMG9veZzWY2btyITCa7pkvqr0gkEtq2bUvz5s3ZtGkTW7duZc6cOYSEhDBkyBACAwNvaj0Obg6z2UxpaSk1a9a830O5r4iiyNKlSxFFkWHDht1zgU4QBJ566ikKCwtJSkpi2bJlDBs27G+t8/z588ydO9fe2W7MmDF4e3vfkbHWqlWLWrVq0b17d/R6PadPnyYpKYnk5GSOHj3K0aNHAVvuU5VAFRISQqtWrWwuptRU+3X/z+sdPnw4WVlZrFu3jrp16xIeHn5TY8rNzWX79u3Ex8djNBpRKpWMHT4WUS2Src5GJ+owGo2YTWZ7MLit45xNaFKr1ahUKkwmE6Wlpeh0OiQSCa6urqjVaiorKzEajSgUtrw5Nzc3nJycyM/Pt5UFmkwITgIl2SXM/34+p1ucpl+/fvj6+v7t430rlJSUUFlZac/lW7VqFV5eXtT09eFMbiFmRFQaDbpKHWt+WkTt+qHk5eUDIJEIaDRqnJycUDk5YbVYyc7OQqlUIpPLkUgk6CorycvL48DObdQKqn/F9stLS3Dz8ETj4kJleTmbl/+Ct39NNHIZZ86coX79+gwfPpxWrVrx0EMP3dNj48CBgwcXhyjlwIGDB56qmb7CwsIrsjaut+yvzJs3j5ycHHvbaa1Wy7x58+zCx90oXZFJJAgCtnbZf2owbzQYeOvZkbw55wdq1qtPeVkZ4x7uhK5Sj7efL1KpBN8aNahdpw6ZGZlYrSJqjQa1ky23QqX8o7TDSa2xzzhLpFIslj+CwgUEFJdLRkRR5Ouvv6Zbt253ZN/+mt/UtWtXfvrppytel5mZWa0URSqVXjPM/M/rCwsLIz4+HoCZM2eSlpbGiBEjbmus4eHh9O7dm7Vr1zJv3jxeeOEF2/hDQ21/qigqgp9/BokEHn8cLotR99sppdfrWbp0Kbt27eLChQsolUpCQ0Pp2rUrffv2RaFQsG7dOs6ePYvZbL5huVtkZCQxMTHs2LGDn3/+mZEjR17xmsLCQg4dOsTBgwfJzMwkLS0Ng8FAQEAAHTp3plZWFtIqp0ODBnaxMzj4jxD//fv3U1hYSExMzBXlJTdCpVLRv39/2rdvz8qVKzl06BAzZsygdevW9O/f/5bX5+DqFBUVAY7Oe8ePH+fMmTM0a9bsvjUzUCgUPP/888yYMYPt27fj5+dHp06dbnk9oiiyefNmVq9ejdVqpXv37vTt2/eulcGqVCoiIyOJjIxEFEXy8vLsAlVqaipbt25l69atKBQK/Pz8yMrKYtu2bVeIUmAL63722Wf54IMPmDdvHlOnTr2mkCaKIqdPn2bbtm0kJiYCtvM4JiaGtm3b2sQkayWry1dTpCiissAmLFU11KioqECpVKLX63FycqJGjRpYrVaKiorQ6/XodXqysrKQy+VYLBbKSsvw9vljLAqFgoCAAIqLi9HqtIgSkVNLT3H28FmyLmRx6NAhOnbsSO/evW/oEr1TlJaWMmTIELuo5uPjw+rVq9GVFJKbmcnHL4+xO8F8Amry7Fvv4+bmipOTE1+/OZmHYnvwUNcegEhhQQGiaItMkMvlrJ73HZt/tk0IOru68dJ7H1+x/a4DhxG/bRMjOrfG3cuL8BbR5GZm4KKQMf+331i8eDEKhQKr1crs2bPvyTFx4MDBg49DlHLgwMEDx7Vm+jw9Pa+77HocOXKE/Px8srKy7AJOSUkJtWvXJj8//6rvcXV1pbS09JbH/9BDD3HmzBn27Nljy2ySCOQVFOLh6YEoWikuLsJy4RwmkxEnZ1cEQcLv61cBULNWAC6u7giCrTOcVCLFxdWFstIytLcoiDg5O6Ov0KKW29xO/fv35/PPP6ddu3b2md8LFy4Qdh2H0J/p3Lkzb7zxBq+++ioajYb58+fbl3Xv3p133nmHEydO0KRJEwAOHjxIq1atrrvO7t278+6775KSklKtfO+hhx7iwoULbNu2jdatW3P27NlqZSC3w8MPP0x6ejonTpy4dmnICy9Aaqrt75s3w/z54Ol5X51SZ86cYcGCBZw+fZrs7Gzq1atHaGgoI0aMsAusYCuN2bVrF+np6fbudtdj0KBBnDlzhn379tGoUSOio6PRarUcOXKEgwcPcu7cOftrAwMDadiwIQkJCfTt25cWzZpBTg78+ivUqgVjx3Jm8WLkcrm9HNBisbBhwwZkMpk93+R28PLyYvTo0cTExLB06VL27dvHkSNH6N69O926dbM7FxzcHlWi1H85cNhsNvPbb78hk8kYNGjQfR2Lu7s7L7zwAh9//DG//vorPj4+N32NBptwPn/+fE6dOoWLiwujRo2icePGd3HE1REEAT8/P/z8/OjSpYs9p7AqMP3ixYtkZ2czZ84cMjMzadKkCWFhYTRo0MDu2PTz8+Opp57iu+++Y/bs2UyaNAm5XG7fhslk4uDBg8TFxZGZmQlA/fr1iY2NJSoqqlpZoFqiprVTa7Zbt6P2V6Mr06HVajGbzfZud2Bz4VqtVntX34qKCnvzDIPBgNFoJL8gH5lchpubm31SRhAE3D3cEZwFihOLMZ41olarEQSBEydOUFhYSHx8PF27dqVbt263HOB+qwQGBnLw4EG0Wi1JSUkkJiby448/Inf1IKrPMN5dsBSFXIqTkxontZO9MQrAxI++sP9dp9Oh0+lRKGyljl8uXcPFixfRarWoVE42gVOA8nItUa3b8n8bdgLg7OrKJ4uX29djsFhQyaQ4ySRMmTLFHnLuwIEDB3/GIUo5cODggeNqM33r1q2zt6y+1jK4dqbUvHnzeOSRR6rdrLq7u9O1a1d+/PFHml0l4PrJJ59k5MiRrFq1inHjxlVzgFwPDw8PVq5cyauvvkpxcTF6s5UhL7xCw6jmWCxW9DoDtd09eOyFV5jxwijcPL2I6T0AsDmb/oqrqyvlWi1lZWVIResVy69Fn+Gj+fKNV/nxw7dYuHAhkyZNwmAwEB0dbT9ekyZNuukHnt69e3PgwAGioqJwd3enY8eOdrdKcHAwP/30E88884y9zKFp06ZXdU79meDgYBYsWMATTzyByWRCKpUye/ZsWrVqxfr165k4cSKXLl2ioKCA0NBQ3nrrrZve/79SVR7zwQcfXL00RKf7Q5ACyMiAl1+GOXPui1PKbDazevVq1q9fz5kzZ1CpVDRp0oTevXvTo0ePK1wPDRo0YNeuXZw+ffqmRCm5XM6YMWN455137EH9GRkZ9twyPz8/WrVqRcuWLfHz8yM1NZWUlBRycnJsTrJXXoEJE0AUqdDpyM7OpkGDBvZxVbmkOnXqdEdcTfXr12fy5MkcPHiQlStXsnbtWn7//XcGDBhAq1at/vN5SLdLYWEh8N92Sm3fvp2CggK6d+9+R8rb/i61a9dm9OjRfPfdd/zf//0fkydPxt/f/4bvS05OZsGCBWi1Who3bsxTTz1lF9TvF3K53F6+B7bzbcGCBaxevZoLFy5QVFTEzp07kclkBAcHExYWRnh4OJGRkfTs2ZONGzeyZMkSRowYgVarZdeuXezatQutVotEIqFly5bExsZWE+j/Sl1ZXcKUYSQaEtG4a3BxcaG4uJjS0lKsVitSqZSKigr0ej1ubm52oVupVOLp6YnRaKSwsJCioiLycvPQarW4uLjg4uKCIBGoFCvxVfoyuMVgvLp5cejQITIzM/Hx8UGn03Hy5En72Hv27ElMTEw1ke1OIIoiFy9eJDExkcTERNLT0+25WF5eXkQ0CsXdWY1V7oGTTHr9dSFSXFwMgIenJ1Uubzc3N/R6PRaLGWcXZwx6A4WFRVitVlxdr3SC2br3QYCzynF9duDAwXURxKorlgMHDhw4+NtYrVbOnTvHiRMnSEhIIDc3F/9GTWjQoSuCxYzayQkntRqp5Po3hX+lpKSY0tIy3NzcbuoBXxRF9BYrDbycCfa49Ryma1F1My6KIq+++io6nY7vvvvujq3/asyePZvjx4/zySef3JF29RkZGXz44YfI5XLeeOMNfHx8/lj44ouwb1/1N7RujWXmTJ5/+WVUKhVffvnl3x7DzYxx3rx5HDt2jMzMTIKCgoiKimLEiBF2l+Bf0Wq1TJw4kYYNGzJhwoTrrt9kMpGUlMTBgwfZsmULJ0+exMXFhY4dOxIdHU2rVq2oXbt2tQeJsrIyXnvtNVq2bMno0aOrrS8hIYFvv/2W3r1706dPHywWC2+++SYlJSVMnz79b7vc/orRaGTr1q1s2rTJno02dOjQmxLjHFRn7dq1rFu3jokTJ963srX7SVlZGdOmTUMulzN9+vQ72vXu77JlyxaWL1+Ot7c3kydPvub1z2w2s2rVKrZu3YpEImHAgAF07dr1gRUCioqKmDJlCuHh4XTv3t3uorp06ZL9Ne7u7jRq1IjExEQyMjKoX78+paWlmM1m1Go1HTp0oFOnTjd9bbGKVuJ18aQYU5AiRS7KuXTpEnq9HqVS+UcTkcuiuslkwsPDo5pYm5mZSWVlJUqlElEUEWQCKncVXjIv+nr2xVXqiiiK7Nu3j19++YXCwkIqKipwcXGhoKAAiURCQEAAXl5e9OnThzZt2vytMHudTsepU6dITEwkKSnJPmkikUgIDg4mIiKCiIgIatSogSAIXCip5GSBFpVUct1zo0xbRnFRMWqNGh/vP34fLRYzGRkZVFRUoNE44+3tRVFREVariJu7G+5ubvw5psBktSIC7Wp54vw3mgA4cODg34/jCuHAgQMHfxODwcDJkyc5fvw4iYmJVFRUALYcorZt2xIeGUWBixtWUUAhvb0bUFdXV7RaLVptGa6uLkhuIGqZrSIyiUCA8519wBo+fDhpaWno9XrCwsLueiaEyWQiOTmZoKCgOyJIAdSqVYsnn3zS3glw0qRJf5SAvfUWPPUUZGf/8Yb9+5G+/z7OajXllZWYTKY7PstdhdVqZevWrfz666+cPn0auVxO8+bNGTx4MJ07d77uA4yLiwsBAQGcO3fuqrlSVquV06dPc/DgQY4ePYperwegTp06uLu7U15eTqtWrRg8ePA1169yUpGnyyPHnIM1MwNJTh7qhlGknrE5zKrchAcOHKCgoICOHTvecUEKbFkuDz/8MG3btmX16tXs27ePjz/+mBYtWjBw4MD/tOvnVqlySj0IDqH7wZo1a9Dr9QwePPiBEqQAunbtSk5ODnv37uW7775jwoQJV1x78vLymDt3Lunp6Xh7ezNmzJjruoYeBDw9PQkNDeXUqVOMGjWK0NBQBgwYQGlpKSdPnrSLVOvWrePixYucP3+enTt30qpVK5588kn69u17y5+VRJDQ1qktToITJ4wnKNYXI5FJ8Pf3RyaTUVxcjNlsxmKxYLVY0Rv0lJSU4OTkZC+58/DwwGy2uYQElYDBZKD0TCmpa1PJ9M6kS5cuNGvWjIceeojQ0FDmz5/P2bNn0Wq1+Pj4IJFIyMvLo6ysjEWLFrFlyxb69+9PVFTUTQmIoiiSk5NjL8s7c+aMXUxzcXGhTZs2hIeH07hx46uWCQY4qzhXXIHBYkV1DbeUxWqhtKQEQeCKa7dUaguEN5lMl0vtdfj5+ZGbm0dpSSmi1Xr5PQKiKGK2itTQKB2ClAMHDm6I4yrhwIEDB7dBSUmJ3Q2VkpJiD+729/enXbt2REZGUq9ePbuIkJxfRlqpzja7ehuz1xKJFBcXW8ZVWVkZ7lfp5leFKIqYRZEAjcqeJ3WnWLly5R1d3404deoURqORqKioO7re6OhoLly4wI4dO1i8eDFPPfWU7XPx9oZZs2DUKPhzntjGjXTx9mZtUH2KSkrx8vJCKnBHnQgFBQXMnz+fPXv2kJGRQVBQEO3ateOJJ56o7ua6Dg0aNCArK4sLFy4QEhKCKIqkpaVx8OBBDh8+bJ9JVygUtGzZklatWtG4cWNMJhPTp09n27ZtNGrUqFpZY7m1nHPGc+RYcqj7Ql0sEgvrC1cgGksR3EUkOScojZAT4BaAsY6RSnMlGzZsQCqV/q0sqZvB3d2dESNG2POmDh8+zPHjx+natSs9evR44ESGB5HCwkIkEsk9C2J+kMjIyOD333+nVq1atG3b9n4P5woEQeCxxx6joKCA06dP8+OPP/5xrcIm/i5ZsgSDwUDLli15/PHHcXJyus+jvjmio6NJTU3lyJEj9q6tbm5uNGvWDL1eT1paGnK5HE9PT1xcXEhPT+fixYts2rSJAwcO2EsCGzdufNMTFoIg0NypOU5lTqy8uBInfyekzlKUEiUBTgGUlZVRVlaGSTQBtkmR/Px8lEqlrVOfkwqFiwK9oMdL6UV7t/ZIy6XsqLuDEydOcP78eTw8PIiJiaF9+/ZMnDiRzZs3s2bNGgwGAwqFAl9fXwwGA+Xl5aSlpTF79mzq1avHwIEDCf1z043LVGVyVZXlFRQU2JcFBgba3VCBgYE3/D1SyiSEeGpIztdisYpIJVe+vqSkxOZ8cnOrljdVhbOLC5WVlegNBiorK3BxdaFGDT9yc3MpK9NiFUW8PD0xWqwopAINve58AxkHDhz8+3CU7zlw4MDBTSCKIpmZmSQkJJCQkEB6ejpgu8kNDg4mKiqKJk2aXLP9s9ZoZl9GERYRlLfplrJarWRmZgAQULPmNUsAjRYrCNDK3x1Pp392CPSPP/7I77//zrvvvoufn98dXbfZbOazzz7j3LlzPPLII8TExPyxMCkJ8dlnKalRk6KQhpTVCiS/Zm1KPb1Q+/khk8uRSQRclTLclHLclXK81QoktyFSiaLI3r17WbBgAUlJSchkMpo0acLjjz9O27Ztb0n4Onr0KHPmzKFt27a4ublx8OBB+0OMRCIhPDycVq1a0aRJE3uocBUXLlzg448/RqPRMG3aNEzOJpIMSaSb0jGKRgB05Tp05ToCLCISnQ5RELBKBYrUSkS1EmdnZ6x6KxnxGYQQwvCBw2/5eNwuoihy7Ngxli9fTkFBAa6urvTr14+HHnrob5XI/NuZOnUqoijywQcf3O+h3FNEUeSLL74gJSWFCRMmXLUT3INCRUUFH330Ebm5ufTr148uXbrw888/s2/fPhQKBY8++iht2rR5YMv1rkZlZSWvvfYagYGBvP766xQVFbFjxw727NmDTqdDJpMRHR1NbGwsAQEBbN26le+++w6FQkGtWrWqNZ0IDAy0i1RBQUE3/L5//fXXJJ9Opt9L/dD76ymyFGHF5jiSiBLKissoKSlBJpOhUCmQyCQIMgG5VI7MKiNrXxatvFvRr3M/+zpzc3PZsWMH8fHxdgGqTZs2dO7cGYPBwPz588nJyUEmk+Hk5IRWq7WXDoqiiEQiISwsjAEDBqDRaOxuqFOnTmEy2UQylUpF48aNiYiIIDw8/LbywkRR5FB2CfmVxivK+IwmI9nZ2UilUmoGBCAIVzuOIpmZWegNegRBwEmlwt/fH7PZTG5uLmazBY2LCxpXN8J8XKjrdneD3R04cPDvwCFKOXDgwME1MJvNnDlzhoSEBHsXHbCFn4aFhREZGUlERAQazc1lNp0vruBUYTkKieSqM5Q3Q2lpCSUlpbi6ueJxFbeUVRQxWKzUd1fT0PvOlLvdL0RR5PXXX0etVvPOO+/clW2UlpYyffp0ysvLmThxIvXr18diFcku13MpLZOSsgqsl7sMYTCA0Yjo6Ync3R1RBMvln1BBAI1cSm1XJ2q5ON10mWZZWRk//PADGzZsIDMzk7p169K9e3cef/zxWw4HLywsZM+ePbz//vt2YUsQBEJCQmjVqhXNmjW74bm6efNmVq5eScN+DXFv7Y5RNKIQFChQ2BsNlJSUUMtoRHrZHWi1WilQKJB7e+Pm7kZOUQ5IwcvZi1aaVjRUNERy1Yebu4PZbGb79u2sX78evV5PrVq1GDJkyAMtOtwvrFarvYnDq6++er+Hc085ceIE33zzDZGRkTz//PP3ezg3JC8vjxkzZpCXl4eTkxNSqZRatWoxZswYatSocb+Hd1vMnj2bXbt20bJlS3spmqurK506daJDhw5XOKAWLVrE3r176dq1K61btyY5OZmkpCTOnj1rL2NzcnKiUaNGdpHqryVoSUlJfP3114SEhNjP+WxLNpnmTArMBRRaCqk0VdqCvkVb8xFjkRFTronyi+WUny4n/Ww6QUFBfPnll1eUU1ZWVrJ371527Nhhv2cIDw+nffv2nDx5kl27dgG2sum8vDz0ej0SiYTKykqys7MpKipCo9EQGBiIk5MTNWrUsLuh6tevf0VZ9u1QabJwMKuYCpPlT8KUSG5uLnq9AW9vLzSaazucyspKKS4uxmK1IpVI8fLyxNnZBbPFTH5BARK5AnNxPsPat3R0R3XgwMFN4Sjfc+DAgYM/UVlZSXJyMsePHycpKcmeu1PVbS4yMrJah7Fboa67mrxKA4U6E0pBcluuGhdXV8rKtGjLtLi6ulZzS4mXBSlXpYxgzzsXbn6/uHDhAmVlZbRp0+aubcPNzY1nnnmGTz/9lDlz5vDypCmk6URK9CZQuyBHgiIzAwEwmy1YrRakBj1SpQL+dNNusYpUGC2cKignvVRHIy9n/DTK6zoXjh07xrfffsvx48eRSCS0a9eOUaNG0bx585t2PGi1Wo4cOcKhQ4c4e/as/d9FUaR///60bt36ljKd2sS24ZT/KcxuZioqK/BQe1QbS9UDmGixVNuWVRBQKpXoKnWYyk1onDVYJBbidfFcNF2kk7oTKsm9KaWTyWR069aNNm3asGbNGvbs2cPnn39OZGQkgwcPvqab8b9IVfcxT0/P+z2Ue4rZbGbZsmVIpdJrZqg9aPj4+BAVFcUnn3yCKIo888wzPPfcc3ct3+5uYrFYOHr0qD2LsaSkhLZt2xIbG0uLFi2u+fv66KOPkpGRwdatWwkKCqJ79+50794dvV7P6dOnSUpKIjk5maNHj3L06FEAAgIC7AJVvXr1WLZsGYIgMGzYMPu1LUAWQIDM1kDCKlo5ee4k333/HdEto2kU3IhVa1dRUFCAKIp2QXDnzp288847vPbaa9VKX9VqNV27dqVLly4cP36c7du3k5SURFJSEv7+/rRt25bjx49z7tw5BEGgoqKC5ORkzGYzTk5OtvJ7s9l+TB599NE73kFRLZfSrIYbR3JKqTRZUEol6HWV6PUGlErFDScvNM7OlJSUXL6HESkpKUGt0YAgwc3Ti9xzpzm89jcKThzk+eefv8KV68CBAwd/xSFKOXDg4D9PQUGB3Q2Vmppqn3GtXbs2kZGRNGnShDp16vzt0giJIBDp68bB7GLKjbYbwVsVpiSCBFdXV0pKSigrLcXDw/YwWdVtz0kmIcrPDdm/oFzp+PHjAHc8T+qvBAcHM3jIEPanpvF7Wh7Obm4opVLbZ+PqCiZfyMvD/lGJImRkQGAgqGz5LVKJgFQiRRRFdCYLx3JLCXBWEebjcsVnodPpWLJkCUuXLiUzM5PAwEAGDhzIo48+elOuO71ez/Hjxzl06BAnT560n6++vr52R9TRo0epX7/+LQlSZZYyNldsxqm2E2V5ZWjLtGhqaKo9UMhltgdgs1SK7E9OKbNUilKpJDc3FwB3N3dkEhlm0cwl8yU2V2ymm6YbTpJ7l3fj4uLC448/TkxMDMuWLSMhIYHExERiYmLo3bv3VYOA/2sUFRUB/OeC4Xfu3EleXh6xsbH/CJGyvLycH374gRMnThAWFobFYuHSpUtotdp/lKBYWVnJnj172LFjB8XFxYiiiL+/P/Xr1+eNN964YdmdXC7nmWee4f3332fhwoX4+/vj7++PSqUiMjKSyMhIRFEkLy+PpKQkTp48yenTp9m6dStbt24lNzeX/Px8OnbseE2hRCJIUIpKzKVmZCYZLZu2JCo8iu3bt7Nhwwb0ej1169YlJyeH9evXU1RURLdu3ejWrVu1a4pEIqFZs2Y0a9aM9PR04uLi2LlzJwcOHLA7Ti0WCzKZjKCgIBQKmxvVz8+P4OBgMjMzOXr0KElJScTGxtKtW7c7mhfmqpTT0t+d47mllBpMlFVUAuDh6cmfO+hdDalEilqtpqKiEplMhtliobSiErWTE3Xc1HRo14K8Y/tISUnhiy++4MUXX3Rcbx04cHBdHOV7Dhw4+M8hiiLp6en2fKjMzEwApFIpoaGh9nyou3WzX2EycyS7FK3RjFwi3LKAZBWtZGZmIlqt1KxZEwQpRqsVtVxK8xpuuCr/eTPnV+Ott96isrKSjz/++K5mpVhFkeT8Mk7nFKHX6XBSyOxinw0RcnOxFBRgMZuRSKXIpFKQyaBuXZBfWZ5gsloxW0W8nRQ0reFmL+dLTU3l008/5fDhwwiCQKtWrXj++eerBYtfDbPZTFJSEocOHSIhIcGeMeLu7k6LFi1o1aqVXTg9fvw43333Hb1796ZPnz43dQwqrZVsrNhIkaUItaDGoDeQl5eHTCbD39/f/rAoiiIXL17EWS7Hy2AAk4kCQcCo0eDm5kZBQQHOzs7VRA6LaEEn6qghq0EPTQ/kwr0/P0VRJDk5mWXLlpGTk4NGo6FPnz506NABqfTONgP4J3Hw4EHmzZvH8OHDH8ig77tBeXk506ZNQxAEpk+f/sA/LKempjJv3jxKSkoICQnh6aefZseOHWzevJlatWrx2muvPfCB/rm5uWzfvp34+HiMRiNKpZK2bdsSExPDli1b2LNnD2+88QaBgYE3tb5Tp07x5Zdf4ufnx5QpU667/yaTiTNnznDkyBG++eYbKioqaNmyJXK5HB8fH7uLqkGDBnah6syZM8ycOZOOHTvy2GOP2del1Wrt7ssLFy6Ql5dHo0aNcHFxQa1W07NnT2JiYuzuNb1ez6lTp0hMTCQpKYn8/Hyys7PJzs5GpVIhlUqRSCTUrl2b1q1bU7duXeLi4jAYDNSoUYPAwEBOnDiBTqdDo9HQq1cvOnbseEfdcWaryPr9R9FKVajUGlzUamQS4Ya/uXqDnry8fJRqNYJEgq6sjDb1a9Ggpi+CIKDX6/nmm29ITU2lVq1ajB8//o510HXgwMG/D4co5cCBg/8EJpOJlJQUuyOq9HJnNbVaTUREBE2aNCEsLOyedS7Smy0k52vJrTQAoJRIbkl4sWU6lOLi6YHaSY23WkGYjwsa+b/DAJubm8ubb75Ju3btePLJJ+/adkRR5GSBlrRSHTIBCvJyMRpNePt4o1H/2bUkYkpLRywtQSKR/FFeolDYhKmrdCmyiCJGixVvtYImXhpW/LaMBQsWkJWVRc2aNRk+fDhDhgy55gOV1WolNTWVgwcPcuzYMSorbTPZarWa5s2b07JlS0JCQq5wF1RUVPDqq68SHBzMxIkTb+oY7KrcRaopFY2gsec/FRcXU1ZWhkatwdvH2/76KhG3Zs2aGAwGcnJycHZ2xmAwYDKZqFmz5hXlN1XCVKQyklZOrW44pruFxWJh9+7drF27loqKCmrUqMGQIUMICwv7R4VE3yk2btzIqlWrGD9+PI0aNbrfw7kn/Pzzz+zcuZNHH32UTp063e/hXBOr1cratWvZuHEjAL1796ZXr15IJBJEUWT27NkcP36ciIgInn/++QcuzF8URU6fPs22bdtITEwEbI68mJgY2rZtaxcDqwSgLl26MHTo0Jtef9W526xZM8aOHXvD7+9PP/3Erl276NatG76+viQnJ3Pq1Cl7ib5MJiM4OJiwsDDUajWLFi2iU6dO1USpKjIzM1m8eDE//vgjTk5O9OnTh5KSEioqKpDL5QQHByOKImfOnMFyudRZo9EQHh5OREQEISEhJCcnExcXx7lz5zh9+jSiKBIcHMzo0aM5e/Yshw8fBqB58+ao1Wr27duH2WzGw8ODvn370rp16zvymZeUlDBt2jRcfGrQb+QYSsw2oQpAKghILneZtRXq2SZxbH+gXKulUluGyqAlfv1qGoUGV8tnMxqNzJkzh6SkJPz8/JgwYcItuXcdOHDw3+Hf8fTiwIEDB1dBq9WSmJhIQkICJ0+exGi0dRDz9vamS5cuREZGEhwcfF+cEiqZLdMhs1zP6cJy9GYrggByQWK/Cbwa4uWbQblag5PFSmVZGY29nGnk7/6veqhOSEgAIDIy8q5uJ6tcz8UyHTKJgFwiwcfHh+zsbAoLC1HI5cjtLigBaw0/jBXlqCzWP1ZgNMKlSzZh6i8lD1JBQCGRkKfVMWvLJpZ88QmCINCpUycmTJhASEjIFeOpcvEdPHiQw4cP28VTuVxud0SFhYVdN9NMo9FQq1YtLly4gMlkuuGs+gXTBc6ZzqEUlNUCyd3d3dHr9VRUVqAqV+Hs7Gwfi06ns2WYGQz2cZtMJpydna86NqkgRYaMZGMydeR1qCG7P8HMUqmUmJgYoqOjWbduHTt27ODrr7+mcePGDBkyhICAgPsyrvvFf618Lzs7m927d+Pv70+HDh3u93CuSVFREXPnzuXcuXN4eHjw9NNPV7teCILAqFGj+OSTT0hMTGT58uUMGTLkPo74D0wmEwcPHiQuLs4uYNevX5/Y2FiioqKuEFKCg4Px9PTk0KFDDB48+KaFlh49enDhwgWOHj3K1q1b6dat2zVfm5mZye7du/H19aVfv37IZDLat2+PxWLh/Pnz9sD0lJQUUlJSKC0tJSUlBalUSoMGDWjUqFE1R13NmjV5/fXXkUql/PTTT/z+++9IpVKMRiN5eXnExcWhVquJjo6mZ8+eNGnShLp161bbt7Zt2/LQQw/Zyws3btzI8ePHmTBhArGxsYwcOZKNGzdy5MgR1Go1vXr1Ij8/n/379/PDDz+wZcsWBgwYYG9ocbusWLECo9FI+5bNiK7jS6XJQna5nmK9kVKDGZNFRBT/+M2TCAJquRQ3pZzs3HR2/rqIppFN8HRzISEhgVOnTtkFboVCwXPPPce8efM4evQon3zyCRMmTMDHx+e2x+vAgYN/Jw6nlAMHDv5V5Obmcvz4cRISEjh//jxVl7h69erZMyf8/f0fKAHHaLGSfVkcKTeauTxJiQD2HCNRtM1SAkgEW1BpeWYam379idYtm/P444/fj6HfNT7++GMuXbrEZ599dteCfHVmC/EZRRgsVlR/EiZ1ukry8vKRyWX41/ijdM1sNpGdkYl3ZQVOfz1/AgNB/dc8KFsAbKm2HIvVyvZFc+jbtTODBg26Yp+ys7M5dOgQBw8eJD8/H7BlkjRu3JhWrVoRFRV1S2Gxy5YtY9u2bTdsdW8STazQrkBr1aKRXJlnZTabyc7Otme/yOVyu4MqwD+AkpISKnWVSKVSLBbLVV1S9qMhilSIFfhIfejn3O+B+A7m5uayfPlyEhISEASB9u3b07dv3/9MmclXX31FcnIys2bN+kcGZt8qVfv70ksvERYWdr+Hc1WOHTvGokWLqKysJCoqiuHDh18za66kpIQZM2ZQUlLC448/fl+FtrKyMnbt2sWuXbvQarVIJBKaN29ObGwsdevWve57V61axcaNG3n55Zdp3LjxTW9Tp9PxwQcfkJ+fz/jx4696rRNFkS+++IKUlBTGjRtHkyZNrrsPJ0+eJC4ujl9//RUfHx+Cg4MRBIGgoCB7qZ+bmxtJSUkcOHCAH374AbPZjEwmQxRFatWqRYMGDaioqEAqlVK3bl0GDBhww+6feXl5LFu2jEWLFtkcqhoNw4YNIyAggH379mEymahbty6xsbEcOXKEY8eOARAUFMTAgQOvOslxI86fP89HH32El5cX77zzzhXXAFEUqTRZMFlFREQkCKhkEpQy2+9lRUUFr7/+OqIoMmLECObPn09AQADTpk2rJsBZrVZ+/PFH4uPjcXNzY8KECfj7+9/yeB04cPDvxSFKOXDg4B+N1Wrl3LlznDhxgoSEBHvQslwup1GjRkRGRhIREVGtO86DiiiKlBjMlBlMaI1mygxmzFYREZAJAq5KGS5KGa4KGe4qOWaTialTp1JRUcF77733r3E7aLVaXnvtNaKionj22Wfv2naO55aSqdX/qSX2H5SWllBSUoqT2glfHx9AQBStXLx4CbkAAUYTmIx/vCEoCJR/lOGZzCays7Mp12oB8Krhj7eLhi7BAfZw++LiYrsQdenSJft7Q0JC7IHlVe6kWyUhIYFvv/2WXr160a9fv2u+7qzxLDsrd6ISVEiFqzsGKyoqKCgoQKFQUKNGDcrLyykqKsLHx4fCwkLMZjMSieSKLKmrYRbNGEUjPZ172rtdPQikpKSwbNkyMjIyUKlUPPzww3Tu3PmOtF9/kHn77bepqKjgk08+ud9DueskJSXx9ddfEx4ezosvvni/h3MFJpOJpUuXsnv3bmQyGUOGDKFjx443FG/T09P55JNPsFgsvPTSS/e8DDMjI4Nt27Zx6NAhzGYzarWaDh060KlTp5su1crOzubtt9+mdevWPPXUU7e0/aysLGbMmIFSqWTq1KlXbLMqY69Ro0a8/PLLNyWGp6amMnPmTMLDwwkKCiIpKYkTJ05QWFhIUVERBoMBDw8PPDw87GXLL7zwAjqdjt27d2O1WqlXrx4uLi4kJSVhtVpp1KgRAwYMuGFuVllZGR9//DHr16/HYDBQu3ZtOnTogF6vJzc3F4lEQocOHWjatCkbN27k9OnTAISHhzNgwABq1ap1U8dNFEU+/PBD0tLSeOaZZ2jWrNlNve+vLFiwgP379zNw4EBSU1NJSkriscceo2PHjlds79dff2XHjh1oNBpefvnlm84Qc+DAwb+ff/fdlgMHDv6VGAwGTp48ac+HqqioAGzdttq2bUtkZCQNGzb8x7UhFgQBD5UcD9XNORYUCgU9evRg6dKlbNiw4a5mL91LTpw4gSiKd7V0r8JkJrfCgEy4eqCrm5sbBoMBXaWO0tJS3Nxs5ZGCIGBChMA6kJMDJhO4u/9JkBIpLS0lJzcXs8mETCbD188PVzc3TFaRi4WlXDx5goMHD3LmzBn79mrXrk2rVq1o0aLFHQnYDwkJQRAEUlNTr/kaURQ5bTyNiHhNQQps5YB6vZ7y8nKKi4vtZSw6nQ6r1YrFYkEikeDmemPhV4oUK1ZSjakPlCjVsGFDpk6dSnx8PKtXr2b58uXs2rWLwYMHExUV9UC4uu40oihSUFBw0w+x/2QsFgu//fYbEomEwYMH3+/hXEFWVhbff/89WVlZ+Pv7M3r06Jv+XAIDA3n66aeZPXs2c+bMYfLkydSocXfLY0VR5MSJE8TFxdlFET8/P2JjY4mOjr7l315/f39q167NsWPHeOyxx27p/QEBAQwfPpy5c+cyZ84cJk6caBeTzWaz/XMfOnToLX2PzWYzZWVl5OXlkZeXh0qlQqPRYDabEUURtVqNq6urPTtr/fr1vP7663Ts2JFVq1bZ3ZdNmjTBarWSmJjIqVOnaNGiBX379sXPz++q23V1dWX69Ok88sgjfPLJJ5w+fZrVq1fToEEDNBoNFRUVbN++naNHjzJw4EC6devGqlWrSEpKIjk5mVatWtG3b1+8vb2vuv4qDhw4QFpaGqGhoTRt2vSmj8tf6dChA/v372f37t288MILnDx5ktWrV9OyZctqJY+CIDBs2DBUKhUbN27ks88+48UXXyQ4OPi2t+3AgYN/Dw5RyoEDB/8ISkpK7G6olJQUzJfb0fv7+9OuXTsiIyOpV6/eAxf2erfp0KEDW7ZsIT4+nh49evwrshqqbuYjIiLu2jaytHrMVhGV9Frni4C3tzfZ2TmUlJaiUCpxUjkhlUowmy1YpFKktetUe4fFYiY3I4Oy8nIsCLi4uODv749MJqOyshK9xcq6E8dI3LQSAB8fH1q1akXLli3veCmDWq2mTp06XLhwAaPRiEJxZYfAMmsZeZY8FMKVy/6Kp6cnBoMBrVZrX5dOp7N/D52dnZHdRMi+IAjIkJFuSscoGm9q2/cKiURCu3btaNGiBZs2bWLr1q3Mnj2b0NBQhgwZQp06dW68kn8Q5eXlmEymf43D8nrs3r2b7OxsYmJiHqiyIVEU+f333/n1118xmUy0a9eOoUOH3rKo07RpUwYOHMiKFSv4+uuvmTJlym27LK+HwWAgPj6e7du3k5eXB0CjRo2IjY39280CoqOj+e233zhx4gQtW7a8pfe2bNmSCxcu2MvuqsrZ4+LiyM/PJyYm5oZ5caIokpmZSWJiItu3b2f//v2kp6cTHByMu7s7MTExRERE0KhRIxQKBZmZmSQnJ5OcnMzFixf5/fff0el0eHl50ahRI9q3b2+fPFOpVLRv3578/HwOHz7M0aNHadu2Lb1798bd3f2q4wkPD+fbb79l8eLF7N69m6ysLJydnfHx8SEvL4/MzEwKCgoICwtj5MiRZGdns3r1ag4cOMDhw4fp0KEDvXr1wtXV9Yp16/V6VqxYYReK/s7nFhQURM2aNcnMzKSkpISYmBji4uJYt27dFcH1giDQv39/VCoVK1eu5IsvvmDcuHH/mSYLDhw4uDYOUcqBAwcPJFU3iAkJCSQkJJCeng7YbmqCg4Pt+VC+vr73eaT3F7lcTs+ePfn555/ZsGEDI0aMuN9D+lsYjUZOnjxJcHDwXXmoAtu5laHVXzdQHkAikeLj60NOdg4F+QX4+/sjlUoxmy1YLRakkj/cRdqyUsxpaXiYLbhLBKy+vkg8PCgtLaWy0hYKLlUo8KwVSJcevWjVNJLAwMC76sAJDQ0lPT2dc+fOXfWmv8haxOLXF3Ni4wkKLhXwwZ4PqNukrn35sS3HWPbeMkRRxGK20OP5HgR3Cqa4uBiwPaAajUZUKtVVXVLv9nqX4qxiPjv2WbX9HOU+iq/SvqJYU4yf7OpugfuJSqWif//+tG/fnhUrVnD48GE++OAD2rRpQ79+/a75EPlPoyrk/E448x5kKisrWbt2LWq1mj59+tzv4diprKxk8eLFHDlyBJVKxciRI2nRosVtr69bt27k5OQQHx/P7NmzGT9+/B0rPy0qKmLHjh3s2bMHnU6HTCajbdu2xMbG3rHmAC1btmT58uXs37//lkUpgEGDBnHx4kV2795NvXr1CA8PZ8OGDdf93A0GAykpKSQmJpKUlGS/tpWWluLi4kLz5s158cUXqVWr1hXX6lq1alGrVi26d+/Oww8/zNSpU3FyckKj0djznkRRtOfyZWdnExQURPfu3Tl9+jR79uxh//79dO7cmR49elRzFVWh0WgYO3YskZGR/Pzzz5SVlSGRSAgMDKS0tJSzZ89y/vx5jh8/Tv/+/Zk8eTJHjhyxN3GIj4+na9eudO3atVqX102bNlFaWkqHDh3+tlNSEAQ6dOjAzz//zK5du3jyySfZv38/O3bsoGPHjld1hPXo0QOVSsXPP//MrFmzGDNmDFFRUX9rHA4cOPhn89+yFDhw4OCBxmw2c+rUKX755RemTp3Ke++9x5o1a8jJyaFZs2Y89dRTfPrpp0ycOJGuXbv+5wWpKtq1a4eHhwf79u2zz17fDV566SXq1q2LIAgcP37c/u+FhYVERUXZ/4SGhiKTyewPvTdDx44dCQ4O5uTJk5hMpmveoO7cuZNNmzbZ/z8rK4v27dvb/3/16tU0atSIqKgoEhMTiYqKQns516mKSpMFg9mK9PJDxsxJ4zm27/erbk8hV+Dl5YnVauXloX04smcHgL3Nt9VqISPjEv0jgzGXliKRCCikUhT5BZRlZVFRUYkg2JxEXh7uHNq+hRp16tqP4/V4++23GT9+PAALFy6kf//+ABw+fJhhw4Zd970ADRo0ALCX1/yVYksxzfs2563Nb+Fdp3qphyiKfDvmW5797llm/D6D1359jR8m/oBKpsJqtWI0Gu3ley4uLle4pLLPZZNzLgeZUsap309dsW0rVoosN39+3A+8vLwYM2YMr7/+OoGBgcTHx/Pmm2+yfv16eyfPfzKFhYXAv7/z3rp166ioqKB3797XDAy/15w/f57p06dz5MgR6tWrx7Rp0/6WIAU2ceDxxx8nJCSEM2fOsHjxYv5ubOz58+f5v//7P6ZOncqWLVuQy+X07duXDz/8kOHDh9/RbpXu7u40aNCAkydPXnHNvhmkUiljx47Fzc2Nn376iXnz5qHX6+nbt2+1zz0/P58dO3bw1Vdf8corr/Dtt9+yZ88eDAYDLVu2ZNSoUUyaNImoqCiaNm1K7dq1b3itbtCgAW3btkUqlTJ+/Hjeffddhg0bRkREBGq1Gl9fX0pLS1m/fj2ffvopaWlpdOjQAS8vLzZv3szUqVPZvHnzVa8rgiDQunVr3nzzTbsbTSqV0rlzZ7p164aPjw/JycnMnDmT559/HpVKxXvvvUe/frZmEuvWrWPq1KnExcVhNpspKChg69atODk50bdv31s+zlcjOjoahUJBQkICJpOJvn37YrVaWbZs2TXf06lTJ0aOHInFYmHOnDkcOHDgjozFgQMH/0wcTikHDhzcVyorK0lOTiYhIYGkpCR0Oh1gu0Ht2LEjkZGRhIaG/ic6Q90uMpmMXr16sWTJEtatW8eoUaPuynYGDx7M66+/Trt27ar9u5eXVzWRaubMmezateumHRhnzpzhzJkzeHh48MsvvwBcNU/KbDazc+dOSkpK6NGjB2DLE9mzZ4/9NbNnz+bNN9/k0UcfBag2riq0RjMWUUR+udRz4kdfXHd8Go0zBoMR0WrFaDACIharlfJyLZmZmZhMJgAkElvmlNVqa5/tpdNhqeWF0t0dAdtDzbYVvxIS4EuH5refl9WiRQt+/fXXG76uKlfqWqJUiaWEkLYhOEuu7kgTBIGKUltem06rw9nTGU9vT4pKitDpdJhMJpycnK7aRGDXj7toN7Qd7jXc2fnjThq3v7KjVpm17Ib78CBQv359Jk+ezMGDB1mxYgVr1qxhz549DBw4kJYtW/5j86b+C06p3NxcduzYgZ+fH506dbrfw8FqtbJ582bWrFmDKIr06NGDvn37IpVeO9PtVpDJZDz33HPMmDGDffv24efnR8+ePW9pHRaLhaNHjxIXF8eFCxcAW+ZdbGwsLVq0uKvh/9HR0aSkpHD48GFiYmJu+f2urq4888wzvPXWW/z444/06NGDtm3b2t1QiYmJ9mYoYHM7RURE2APNq8r/r5fFdy169OhBSkoKW7du5fHHH8fPz4/OnTtjMpk4c+YMycnJHDp0yJ6/tHv3boKCgoiIiLB33ouLi6N37952gevPeHl58corr7B161ZWr17Nvn37aNOmDQMGDGD79u2sX7+ew4cP88wzzxAdHc2kSZPo2LEjGzduZMeOHSxdupRt27ZhsVgwmUwMHDjwjnUZdXJyolWrVvz+++/s3buXnj17smvXLhITE0lOTr5mp8s2bdqgVCqZO3cuCxYswGAw3NcOkg4cOLh/OEQpBw4c3HMKCgrs+VCpqan2h/jatWsTGRlJkyZNqFOnzj/2Ye9+8NBDD7Fp0yYOHjxIz54970puys3eLM6bN48ZM2bc9Hrnz5/PE088QY0aNZg7dy7Dhg3Dx8eHtLQ0oqKieOaZZ9i6dSvDhw9n9uzZWCwWdu7cycCBAxk+fDhRUVGUlJTw0ksvsWfPHlJSUvj666+Jj49HEASKi4txd3fn1KlTjB8/nvSMTAwWK/2fHEWfx0fyyiP9GDjqGdp160Xc6uWsWPB/mE1GrFaRp16dwkOx3fHw9EAikWA2mzGabJ31KisrEa1W+0OaTqXCVSJhxOjH6NqlO0eOHaa4uJiejz7BEy+/zvpffuRsUgLvT53MnJkf8u6779KtWzc+++wzVqxYgdlsxsvLi48//piAgABKS0spKyvj3Llz5ObmUl5eTnJyMvv37+fjjz9myZIlWCwWli9fzs8//4yTkxNt27Zl4cKFbNq0CYvFwsWLF1m2bBlz5sxBFEX69etHy5YtycnJYdrb0+gwpgPJW5Ipyizi8JbDqP3UiIhcOHoBZy9npveZjkSQIJFJGDlrJEmHklgzYw2XTl4CAdqPbE/tV2ojlUrtD3RWi5XdP+9m6tqpuHi5sOKjFVSWVqJ2q16eYsZ80+fI/UYQBKKjo2natClbtmxh8+bNzJs3j+3btzN06FCCgoLu9xBvmf+CU+q3337DarUyePDgOyb83C4lJSUsWLCAlJQUXF1dGTVq1F3J0tFoNLz44ot8+OGHrFq1Cj8/v5vqrFZZWcmePXvYsWMHxcXFCIJAZGQksbGxdoH7btOsWTN++uknDhw4cFuiFNgyjuRyOYWFhRw9epSJEydiMBgAW3OQJk2aEBERQURExE13B7wZGjZsaHdU9u7d2y7Wy+VyGjduTOPGjRkyZAiFhYVs27aNX375hbNnz5Kenk7NmjWRy+WcPXuW5ORkgoODeeKJJ2jRokW14y6RSOjevTuNGzdm3rx57Nu3j9TUVEaNGsVjjz3G8uXL7RlU8fHxdOnShQkTJtC5c2fWrVvHhg0bSEhIwNfXF09PT0RRvGOfa4cOHfj999/Zs2cPPXr0YODQYfy0fCVxx5KQ+NYGQUAiCKhkElwUMlwUMuRSCc2aNeP5559n9uzZLFmyBL1eT7du3e7ImBw4cPDPwSFKOXDg4K4jiiLp6en2fKjMzEzAZrdv0KABUVFRNGnS5F89Y3+3kclkPPzwwyxatIj169czevTo+zKO+Ph4iouL6d27t/3f3nzzTQICAnj22WeveL3FYuGHH35g+/btlJWVMWXKlGrdeEpLSwkLC+Ojjz4CbA92JSUlfPHFFwCkpaXZX/vVV19x4sQJxo8fby91q8JsNtOvXz/eeecdmnbrzfniSgxlJVeMp0WHGDr3HYggCORkXOSFAT1o0f4YCqUSuVyOIBEoKysDEQSJgFwuR6GwhRJXapwxCAIitrben334FaVlpYx6djiRbTsR8VAH6jUMo32P3lCQyYYNG/jqq6/IysqiXbt2SCQSUlNTGThwID179uTw4cMYjUY+/vhjTp8+TVpamv31hYWFfP/99xQVFbF+/XoGDRqEWq3m8OHDAKxYsQKDwcDvv/+On58fUVFRqNVq5s6dS0FBAVarFV25Dt9QXzo91Ynpnaazfe52Wg5pia5Mx7zn5uHq58rYeWOp17we5w+c5+fJP+Ps5cyTnz2Ja4Ar2hItC8csJKhZEHUi6qBSqXByciJldwo+dXyoGVoTgPCO4exdtpeuo7tWO9ZV7rF/EgqFgt69e9OuXTtWrVrFvn37+Oijj2jZsiUDBgz4Rwk8/3ZR6tSpU5w4cYJGjRrd1aYJN0NSUhILFiygvLzcHkx9tQDqO4Wfnx/PPPMMX375JfPnz8fLy4vAwMCrvjY3N5ft27cTHx+P0WhEqVTSuXNnYmJi7nmJvEqlIjIyksOHD5OXl3fT2xdFkbS0NJKSkti0aRP79+9HoVCQnp6Oq6srAwcOJCIi4qZd11Vlj7ci2AiCQI8ePZgzZw5xcXEMHDjwqq/z8vJi2LBhDB06lP3797NgwQLS09MpLS3F3d0do9FIXFwcu3btIiQkhGHDhtGzZ89qJYi1a9dm6tSprFy5kri4OGbOnEmPHj0YPXo0w4cPZ/78+SxevJjNmzeza9cuunbtyuOPP05iYiKZmZn4+voye/Zs6tevz8CBA+9IB7zAwEDqBYdgUGrYcjoDicqTZn2GYTKbSckvQXn5d1IEJAJILncbru3qROOwMF5++WVmzZrF8uXL0ev19OnTxzEx6cDBfwiHKOXAgYO7gslkIiUlhYSEBE6cOEFpaSlg6wrWqlUrIiMjCQsLw8nJ6T6P9N9D69at2bBhA4cPH6ZXr153NO/jZpk3bx7Dhw+vVuLx7rvvXvP1GzZsoG7dujRs2JDly5dTs2ZNe8kI2GaZn3jiib89rtOnT6PX63n00Uc5VWDLK3HzvPJhPOfSRWaMf5b8nGykUina0hJyMi5Sp34IYAs/l0qkWCxmZFIZgiBgNtvK9wxGA4Wu7oBATMfOCAK4u7nh71cDQ9p5VLVs2SRqtZqQyEikUilHjhyhoKCAzZs3IwiC/WGoW7dulJSUoNPp6Nu3L9u3b8doNDJ06FASExNJSUlhxIgR/Pbbb/bZcKlUSn5+Pl27duXVV19lz549LFu2jIKCAvbv34+bmxvu7u4MGjSI+vXrs3zlctoObYuL1AWVWkVRVhGBgYEc23wM79reGCoMdBzQEYA6deqw4dMNZJ/N5tfJv2KxWLBYLJgNZsqzy5E3k6PT6dDpdGz+fjNZqVm8EPYCEkGCUW8k/2L+FaKU7B98C+Lu7s7IkSOJiYlh6dKlHDp0iOPHjxMbG2sP8X3QKSoqQq1W/yPGeqtYrVaWLl2KIAgMHTr0vj3cms1mVq5cybZt25BIJAwePJjY2Nh7Mp6GDRvy2GOPsXjxYr755humTJlidwaJokhKSgpxcXEkJiYCNrEkJiaGtm3bXjV0+14RHR3N4cOHOXDgwHWD6SsrKzl58qS9REyr1WK1Wjly5Aienp6MGzeOY8eOUVpaSuPGja9ZQnYniYqKws/Pj127dl0zvLwKQRBo06YNzZs3Z9u2bWzatAmtVotKpbIfg+TkZKZNm8Znn31Ghw4daN++PWFhYQQGBiKXyxk6dCgREREsXLiQjRs3kpyczKhRo3jhhRcYOXIks2bNYvXq1axdu5YNGzYglUrp1KkTzz77LBs2bCA1NZVPPvmEJk2a0L9/f2rWrHlb+222ipwrLqdRryFU6A1oTWbcVeCidiInOwtTZQU1awYgkUgRRRErYLWK5FcaKag0opZLCa5Ri/HjJ/DVV1+yfv169Ho9Q4YMcQhTDhz8R/jn3hE6cODggUOr1ZKYmMiJEydITk62h3Z6e3vTpUsXIiMjCQ4Ovu9lFP9WpFIpvXv3ZuHChaxdu5Znnnnmnm6/vLzc/oB+s8ybN4/U1FTq1q1LSUkJJpOJVatW8b///Q+wiZhVZWF3Cqnk2je5018aw+jXp9Gxly0Atn9UCEaDHrPFjNFoREDA19cXvUGPSqVCqVBguHyeyyQyEAQsgoBU5YQg2DKmJFIpMosFX6MRiVRKgH8Nnh9lE9q2bdvG2LFjGTt27BVjSUxMpKSkhIcffpj8/HzOnTtHly5dkEqlaDQaHnroIQ4ftpUIVpXnVLkQQ0NDOXPmDBERETRt2pTAwEAmT55sX3daWhoKpQKJRGK/6Retf4QiyxVycs/nknk6k5oNapJzLofCzEKcPZyZ8fsMKisryc/Px8vLy94l0Ww2k3sxl3MHzzFp8yScXG2Cs1Qq5f2Y9zlz5AwhzUPs23CXut/aB/cAEhgYyMSJEzl27BjLly9n48aN7N27l/79+9OmTZs7fu7eSQoLC/+1Lqnff/+drKwsOnTocF/EeYC8vDy+//57Ll68iI+PD6NHj6Zu3br3dAzt27cnJyeHbdu28c033zB+/HgSEhKIi4uzXyvq169PbGwsUVFRD8T52rhxYzQaDQcPHqR3795/XJ9EkezsbHs21Llz5+yl/66urrRt25bi4mKsVis9e/a0C4AffPAB8+fP54033rjrzq+q8rpFixaxa9eum8rzUigU9OrVi4ceesieFZWbm0vfvn0JCQlhzZo1HDhwgDVr1hAfH09gYCC+vr52oa1x48a8+eab/PTTTxw+fJj333+fQYMG0alTJyZPnszjjz/Ol19+yS+//IJOpyMxMZHvvvuOjh070rp1a7Zv386JEydITEwkOjqavn373tJ1oUhn5GSBllKDGYVSSUlxEQarFXdnDQq5HBcXF8rKtJSUluLp4WkLagekUgE5YBVFKs0WTuSVUUPtzkuvTOTbr74gLi4Og8HA448//kCclw4cOLi7OEQpBw4c/C1yc3NJSEjg+PHjnD9/3u70qFevHpGRkURGRuLv7++Y7bpHREdHs2HDBo4ePUpGRsbfbvd8K/z6669ERkbSsGHDm3p9bm4ucXFxXLp0CZ1Ox9tvv027du2YNGkSCQkJVw3QdnV1JT09/ZbH1qBBA9RqNT///DPtH+6PCJQUFuDuVb3rnLa0FP/atjKXrSuXoS0twWK2kJuTgyiKOLtoCAjwJycnB4PBiKenJ15Km9PE188HuVKFRCKg1ThjBGQWC4giZpMZU0kJTkoVOZfSuXTpEgEBAfTv359PP/2UwYMH4+npiclkIikpiaZNm97UfsXExPDhhx/aS13mzZtnX/bQQw+Rnp5OeHg46enp6PV6UlJSaNzYFjouILB4/GIStyZSmmtzMk6ImsB7O96j4FIBvcb14quRX112g5kZ+clIVn+6mp2Ld5J9NhupRkrz7s2hFjh7OiOTyTi65ihNOjchNCwUnU5HZWUlOp2O8O7hbJq7CSc/m1BlNVlxFe9e+dK9RBAEmjVrRkREBNu3b2fDhg0sWrSIHTt2MHToUEJDQ+/3EK9Ar9dTWVlJSEjIjV/8D0On07FmzRpUKtUd6y52q+zfv5+ffvoJg8FAq1atePzxx++bI23QoEFcvHiRrVu3snPnToKCgpBKpbRs2ZLY2Nh7LpTdCJlMRsuWLdm5cyepqakYjUYSExNJSkqyl5wKgkBgYKA9G6pOnTqUlJTw5ptv4uHhwcMPPwyAr68vo0aN4ptvvmHOnDlMmjQJhUJxV8cfHR3NmjVriIuLIzY29qabtLi7uzNixAhiYmJYtmwZx44dIzExkS5duvDiiy+yatUq4uPjycjIoKioiMLCQg4ePAjYnKyNGzcmNjaW3bt388svv3DixAlGjBhB7dq1admyJWfOnLFnax06dIjs7Gy8vb1p2rQp4eHh9hD2Q4cO0bFjR3r16nXDIPRLZTpOFmgxW60opVIkgoBGrUGr1VKuLcfd3R03N3cqKioo12pxcXa54nhIBAGVVIrZaiW7wkCJTMFzEybyf199zu+//45er2fUqFGOyUwHDv7lOEQpBw4c3BJWq5Xz58/b86GqOtnI5XIiIiKIjIwkIiLiqoKCg7uPRCKhd+/ezJ8/n7Vr1/Lcc8/dsXU/88wzrF+/npycHLp3746Liwtnz561L583bx5jxoy54n3XypT64Ycf6NatG+7u7uzfvx+Apk2b8sgjjzBv3jxeeeWVK9Y1YMAAfvzxR6KiouxB5zeDTCZj9erVvPjii0x//310FpE+jz9FvydGVnvduDff553nR+Hs6kpUm/b4BtSksKgQlZsHMrkcJyc1IODl7U12VjaFBQX4X3ZiKJUqnF3dkEikeNfwQxUUDGlpIAgIEgGrCN37DGDeB2/xw1ef0bpNG9q3b0+TJk3sLbUBRo0addOiVEREBP/73/9o27YtLi4u9OjRw/7d8/DwYP369YwYMYKsrCy2bNlCSEgIq1atAkCChKe+fAoAsUJkVM1RfH78cwAmLJnAkqlLQLBlZz36zqM079mc0FahLJqyiPz0fIxGI8lbk3l54cv28fQZ/0e5jUajQaPRIIoioz4ZRWVlJZWVlXx89mOMRiMfvvEh4Y3CiYqKIjw8/B9fRiaXy+nevTsPPfSQvUPfp59+SlRUFIMGDbrn+TzXo6rz3r/RKbVhwwa0Wi2DBg26Y93Fbha9Xs/PP//M/v37USqVjBw5ktatW9+3SZmMjAy2bdvGmTNnKCwsRK/X06xZs2qlfA8ahYWFiKJIUlISL730kl00c3JyokWLFkRERBAWFnbFZ7ty5Up7ifOfYwGaNGnCww8/zPr161m8eDFPPfXUDT+Pqsm120Emk9G1a1eWLVvG3r17b7nrY506dXjllVc4fvw4y5cvZ/PmzcTHx9OvXz/69OnDqlWrOHfuHAaDAV9fX5ydnUlPT+fixYv2dRQUFBAXF8fp06fp168fO3fuJDg4mMmTJ9tzpvLz88nMzESn06FUKqlduzZ16tQhNTWV7du3s3fvXrp27UrXrl2vem2+WKbjZL4Wqyiikkrtx9TFxdkmSpVrcXN3QyKR4O7uTmFhEcXFRZevg1cef5lEglQQ0ZktnEfKc69MZO7XX9qzFceOHevowuzAwb8YQfw7V14HDhz8JzAYDJw8edKeD1VRYWsT7+LiQpMmTezuGKVSeZ9H6gBswuE777xDTk4Ob7zxxjUDbh8kPvroIzIzM/nss8/uastxAItVZHt6PhYrKKTXLgswmU3k5uZiMVvw8vLE2bn6Q5BWW0ZRUTHOzhq8/uK4sqPXQXo6WK1YFArMShVN3/8fl0KC2B0YSHp6un32GmzlioGBgdStW9f+x93d/br7o9Vq7Q9oX375JZs2bWLjxo325SdPnuTLL7+kW7duDBo0qNp7t1RsId2UjrPE+brb+CtGo5Hs7OzLM+E3L0CLokipuRRFuoLzy89TUFAA2B7kGjZsSFRUFJGRkXc1BPpekZmZybJlyzh16hRSqZSYmBgefvjh+5rXU0ViYiKzZs1iyJAhxMbG3u/h3DHy8vJ4++238fT05O23377r15I/k56ezty5c8nLy6N27dqMGTMGPz+/e7b9KkRR5MSJE3ZRAmzB59HR0cTFxVFRUcGTTz5Ju3bt7vnYrobFYuHcuXP2srzs7GxEUeTQoUM4OTnxyiuv0KRJE+rXr39Nt8z58+f56KOPqFWrFlOnTr2i3MtqtTJr1iySk5N55JFHbtjZLyUlhc8//5yYmBgeeeSRW94ng8HAlClTUKlUvPfee7ft8jGbzezYsYP169ej0+moWbMmgwcPtpe5Z2Vl4eTkROfOnQkICODMmTMkJSXZBacLFy6g1WpxdXVlwoQJjBgxArlczvnz5/npp5+4ePEier0eNzc3DAYDgiDg7OyMq6ur7bfPYsHFxYVevXrRoUMH+/cpr8LA0dxSRFFE8acS8CpycnMw6A34+HijVmsAW+ml0WjC19f3ulmioiiit1hxkkmIcJPz3ddfkZmZScOGDXn++ecd95kOHPxLcTilHDhwcFVKSko4ceIECQkJpKSkYDbb2rf7+/vTrl07IiMjqVevnqPW/wFEIpHQp08fvv/+e9atW8e4cePu95CuS1lZGRcuXKBp06b35CFSKhHw1SjJKNNfsyW2yWwiNycHi9V6VUEKbKJspU5HeXkFarX6sovqL6icoFYtuHQJk9oZl6wM/ApyqZGfQ8sePbBOmEBOTg5paWmkp6dz4cIFUlNTOXXqlH0V7u7uts5G9epRt25dAgMDqwkbkydPZu/evZhMJgICApgzZ061IdSvXx+JRGJ/QP0zDRQNuGi6iEW0IBVu/sHpzzkvt4IZM0qZkj5N+uDd1JusrCyOHz/O8ePHSUpKIikpiSVLllCvXj2ioqLswcH/RGrWrMnLL79MUlISy5YtY9u2bezbt4++ffvSoUOH+3rtrCqD+rd1PF2xYgUWi4VBgwbdM0FKFEXi4uLs2+7cufM93X4VBoOB+Ph4tm/fTl5eHgCNGjUiNjaWsLAwBEEgLCyMmTNnsmTJEry9vW+61PpOo9VqSUpKIjExkZMnT6LT6QCb2zA8PJyIiAg6dOjAnj17aNiw4XVLYEVR5NdffwVg2LBhV/1eSSQSnn76ad5//32WLl1KnTp1qF+//t3ZOUCpVBITE8O6des4fPgw0dHRt7WeKtdV69atWbduHbt37+bLL7+kSZMmjB07lrS0NNasWcP69etxdXWld+/eDBkyhKKiIpKTk1m+fDlLly4lLy+PWbNmsXPnTqKjowkPD2f06NGcPHmSNWvWoNPpcHd3JyAggAsXLpCVlYUoiiiVSgoKCvj111/Ztm0bffv2Jap5C04WaLFYRVTSKwUpABdnZwx6A9ry8suilICHhwe5uXkUFxehcgq4ZvdVQRBQSSXozFYuGeCVV17h66+/JiUlhS+++IIXX3zxgRD2HThwcGdxOKUcOHAA2G7sMjMzOXHiBMePH7fn9giCQHBwsD0f6kEqQXFwbURR5N133yUrK4spU6Y8cLkhf2bPnj0sXryYUaNG3fbN+61SpDNyIKsYmSC5IvjcZDLaZomtVluQt+baLiKLxUxWVhaCIOAfEIBUcnVhRywtRa83ELZ0EXV3bbP9o1QKX3wBbdpUe63ZbCYjI4O0tDQuXLhAeno6OZczrarw9fWlXr16dldVnTp1rlva8PHHH3P+/Hk+//zzarPUFtHCqvJVFFmK0Aiamy4zMpvNZGZm4urqetNlQKIoUiFWUFNWk56anldsq7Cw0J5Pd+bMGXuIsb+/v12gCgwM/Efm01ksFnbt2sXatWuprKzE39+fIUOG3JOOYFdjxYoVbN68+R/jpLwZUlNT+fTTTwkNDeWVV165J+eJVqtl4cKFJCUlodFoGDlyJE2aNLnr2/0zhYWF7Ny5kz179qDT6ZDJZERHRxMbG3vVkPejR48yZ84c1Go1kydPvieiryiKXLx40e6GSk9Pt1/PvLy87NlQDRo0sF/HcnNzefPNN2nZsiWjR4++5rr379/PggULaNas2Q2be1y8eJGPP/4YtVrN//73v2s6Mv+uUwqgoqKCyZMn4+3tzZtvvnlHzsfs7Gx+++03kpKSkEgkdOrUiR49enD48GE2bNhAeXk5Pj4+9OvXj6ioKN577z0yMzPx9fW1N8Xw9PQkMDAQiUSCt7c39evXJyMjg4sXLyKVSmnWrBn+/v4cOHCAgoIC9Ho9JpMJs9mMu7s7zXsNoEbDCDRKBRLh6sK6KIpkZGZgtVipWTMAmcz2mebn51FZqcPT0wMXl+u7Yc1WK2ZRJNLXFS+5wDfffENqaiq1atVi/Pjx97w014EDB3cXhyjlwMF/GIvFQmpqqr0sr2r2XKlUEhYWZs+H0mg093mkDm6HqoePsLAwXnrppfs9nGvyzTffkJSUxMyZM+/ZuSaKIvGZxZToTdVme/8sSHl7eaG5jiBVRUVFOQUFhajVTvj4+HC1vAyD2YJMW0bH8WNQVJT/sSAgAFatghu4ZvR6Penp6aSlpdn/VOUCgc0JULNmzWplfwEBAXbXwOrVq9mwYQPjxo274qE5y5zF5orNCAgohZsrjbBYLGRkZODi4lLdbVNSAgYjuLnCX3JIdFYdMkFGH+c+eEivL2RVVFSQmJhod1CZTCbA5hqLjIwkKiqK0NDQe+5G+btUVFSwfv16duzYgdVqJSwsjCFDhuDv739Px/H9999z+PBhZs6c+a94uLNarXzwwQdkZGQwdepUateufde3mZKSwvz58yktLSU0NJSnn376hqW2dwpRFDl//jxxcXEcO3YMq9WKq6srnTp1okOHDjf8TDdu3MiqVavw9fVl8uTJd+W6q9frOXnypD2kvKysDLBdq4KDg+1CVI0aNa4p2MyYMYPMzExmzpx51Vwjg8HAtGnTqKio4J133sHb+xpl1H8iPj6eH374gZCQECZMmHDV0roqUapz584MGzbsFvf8D5YuXUpcXNxVr7t/h+TkZJYtW0Z2djZqtZrevXvbO+lt3boVg8GA0WikoqKCzp078+yzz5KSksKCBQvIyclBLpcTHBxMdnY2er0esHXPLSwsRCqVUqNGDR599FG8vLzYsWMHp0+fpqKiAotUTo9nJiARBKQSAQ93d5TKq2cBFhcXUVamxdXNFQ932/XebDZdnsSRULNmAJJrTOJUobdYUMukdKjjhdlkYs6cOSQlJeHn58eECRMe2Fw0Bw4c3Dr/rLs5Bw4c/G0qKytJTk4mISGBpKQku23e3d2djh07EhkZSWhoqCNQ8l9A06ZNqVWrFsnJyZw7d+6ulivcLgaDgVOnThESEnJPxU9BEGjk5czB7BJMVhGFVMB4WZCyWq14e3nf9Hg0Gg2VOh2VFZVUVFRcIWRZrCIiEBJUE0X/frBkyR8Ls7NBr4cblCOoVCoaNGhAgwYN7P9WVlZWTaRKS0vj0qVL7NmzB7C1Gq9Tpw5169ZFFEV0Oh0pKSlXPBwFyAJopGhEoiERKVJkwo1vDa5avldUBJcbH1BcBHXr2oUpk2jCipWmqqY3FKTAdkxbt25N69atMRqNnDp1iuPHj5OQkMCuXbvYtWsXKpWKiIiIf1RQukajYejQoXTs2JHffvuNEydOcOrUKTp06ECfPn1wdr61bK/bpaioCLlcfs+2d7fZt28fly5dom3btnddkLJaraxZs4ZNmzYB0LdvX3r27HlPyjEtFgtHjx5l27ZtpKWlAVC7dm1iY2Np0aLFTYu0PXr0ICcnh/379zN79mxefvnlvy3wiqJIbm6u3Q31Z7eji4sLbdq0ITw8nMaNG990+VWrVq1YunQpx48fp3Xr1lcs37RpE6WlpfTs2fOmBCmwdSW9cOECu3fvZsWKFQwZMuTmd/IW6dq1Kzt37mTjxo1ERETcMfdeWFgYjRo1Ys+ePaxZs4alS5eya9cuBg8ezPTp01mxYgWfffYZFouF8PBwzp8/T8OGDXnrrbf46aefOHToEJcuXaJfv37UrVuXkydPkpycTHp6OpmZmRw4cIAjR45Qv359hg8fTp8+fYiPjydPVCBTKikryEeQSNDrdGg0Gtzd3ZHLq3c1dHZxoaxMS3m5rQufgIBMJsfV1ZXS0jJKSkrw9Lx+owW5REKl2UJepYEaGhXPPfcc8+bN4+jRo3zyySdMmDDh8kSQAwcO/uk4nFIOHPwHqCqLSUhIIDU11X6jWLt2bSIjI2nSpAl16tT5R5bFOLg+CQkJfPvttzRq1Ijx48ff7+FcwbFjx5g9ezZDhw6lS5cu93z7KQVazpVUIljM5OflIYpWvL2rwllvHqvVYs/h8A8IQCa1PeBVhbb6qBW09HdHEEWYMQNWrrS9sU8feOutO7IvoihSWFhYrewvPT0do9GIxWJh3759uLu7M2zYsGoZVa6urhhFI1srtpJlzsJJcLphvlRVOY5Go/njYfDSJSj/kwtMo4E6dTCLZvSinnryesSoY24pu+qvWK1Wzp07Z8+h+qcHpZ86dYply5aRmZmJk5MTDz/8MDExMXfdAfb666/j5OTEO++8c1e3cy/Q6/VMmzYNg8HA9OnT7+pnX1hYyNy5czl//jweHh6MHj2a4ODgu7a9KiorK9mzZw87duyguLgYQRBo0qQJsbGxhISE3NZvt9ls5vPPP+fs2bO0bduWJ5988pbXYzKZSE1NtQtRVd9HgMDAQLsb6nbLbsvKypg0aRINGzbk5ZdfrrassLCQN998E41Gw3vvvXdLAdhms5lPPvmEtLQ0xowZQ4sWLaotv1NOKbB1mY2Pj2fixImEhIT8rXVdjcrKSjZu3EhcXBwWi4WGDRsilUo5cuQIrq6umEwmRFEkKiqK/v374+/vz8GDB/npp5/Q6XQ0atSIkSNH4u7uTllZGSdPnuTgwYOsWbOGzMxMwFZC3aVrNxr2HIRVkKDTlmEwGjEajEgkAnKFAldXV9zd3e2/fQC5uTno9Qa8vf+Y5LGKVrIyM7FYrQT4+18hZv0VndmCn0ZBC3/bZIbVauXHH38kPj4eNzc3JkyYcM+dpg4cOLjzOEQpBw7+hYiiSHp6ul2IqrqxkEqlhIaG2oWof2M7cAfVEUWRDz74gIsXL961m+K/w8KFC9m3bx8ffPDBfTkfzVYru85mkV+hx1ChxcvT85YFqSp0ukry8vJRqZT4+fkhiti7CEUHeKBR/EloOHkSzGYID79h6d7fwWq1kp2dTVpaGt988w1nz56lSZMm1UpWPDw8qFu3LrXr16Y0vJRyVTkqiQq5cH23ZHp6Omq1+o+Z6j87pQARMAYGYFJJCZQHEqOOueE6b4WqHLwqgerSpUuAzcUVFBRkz6F60HPwrFYre/fuZfXq1Wi1Wnx8fBg0aBBRUVF3ZaLAbDYzbty4B76s92ZZtWoVGzdupH///vTs2fOubefo0aMsWrQInU5H06ZNefLJJ++6uzM3N5ft27cTHx+P0WhEqVTStm1bYmJi7sh5XV5ezowZMygoKGDQoEF069bthu8pLi62i1ApKSkYjUbA5uZs3LgxERERhIeH3zFx8KuvvuLkyZN89NFH1Tp9zpkzh6NHjzJy5Eja/CWX72YoLi7m/fffx2g0Mnny5Gr5W3dSlMrJyeHtt98mLCyMF1988W+t63rk5+ezfPly9uzZw7Fjx6hXrx4LFy7EaDSyatUqTpw4gSAItGnThj59+gCwYMECUlNTUavVPP7449XEOavVSlxcHPPmzePChQv41q3P0Ff/h8WgR0BAIhEwm82YTCaMRhOCIKBQKvBw98Dd3Q2JREplZQX5+QWXfxNr2NddXq6lsLAIlZMKP19frlbyXoXJYgUButT1Rnb5t7Iq3H7Hjh1oNBpefvnlf002ngMH/1UcopQDB/8STCYTKSkp9nyo0tJSwNZiPjw8nMjISMLCwq7bitfBv5Oq9u+hoaG8+uqr93s4dqxWKxMnTsTDw4Np06bdlzGcP3+eb//vexp0fhjfOnVRK5RXBJ/fCoVFhZRry/Hw9EDupEElk9C8hjvuquuIMaIICxfCvn3QsiWMGAGK688e3w5VXZrGjBmDp6dntbK/3MtikkQpwa+XH66NXZHJZChFJUqFEoVCcYVAcvHiRVQq1R8Px1YrnDsHZjNWiYDOQ4UECaH+bWitfuimygL/Dv/0oHS9Xs+GDRuIi4vDbDYTGhrK0KFD73g5Wl5eHtOmTaN9+/Y88cQTd3Td95oqt4ybmxvvvPPOXSk7NxqNLF26lD179iCTyRg2bBjt27e/a+eRKIqkpKQQFxdHYmIiYAsDj4mJoW3btne881h2djYfffQRer2eZ599lqioqGrLrVYr58+ftwtRVZNcADVq1LCLUMHBwXfF4XfgwAHmz5/PkCFDiI2NBf4Ita9bty6TJ0++7c+iqqObr68vU6ZMsd8fVYlSXbp0YejQobc99m7dupGTk0NxcTFms5kFCxbQo0cPwFa6/uqrr7J582ZUKhWRkZEsXrz4ptYriiJBQUEEBQURFxdX7d8nT57M9u3bqVmzJnXq1MHNzY3u3bvj7+/PihUr2LdvHydOnGDGjBn06NGD//3vfyxatAipVMqUKVNYsWIFe/futa/TbDazZcsWjpzPoF50B/TaUr564xUeGfcK/nUCsVisWK0WTCYTFqsViSCgUCrx8vRiXJ/OjHvvE2oFhRAQEGD/fuZkpDOmZwyz1u3A19fn6p1rL7Ns3mzaPdyPXlEN8fjT76goiqxevZqNGzeiUql48cUXmT59OlFRUYwfP563336bkpISvvjiC9asWcOOHTv4/PPPb+nzc+DAwb3DkSnlwME/GK1WS2JiIidOnCA5Odk+Y+nt7U2XLl2IjIwkODj4qkGeDv47hIeHU7duXVJTUzl9+nS1XKL7yblz56ioqKBTp073bftfffUVZrOZFjXcMLhoKNIZMYsCColwWw867u7umMwWdCYLGicrLf09cVXe4EF52zb45hvb348ehfPn4f3377iDqkGDBqxfv57z58/TokULgoKC7MsqKyvtQeoXLlwgNysXp1ZOmFxNlGnLsOqtyKVylEqbQKVUKhEEwS78ACCRYPHzQV9ZjCiV4Jqtpc0PCdTpEQyD7v7thpeXF507d6Zz585XBKVv3LiRjRs34u7ubheoQkJCHqigdJVKxcCBA+nQoQMrVqzgyJEjvP/++7Rp04b+/ftXc4n8HaoaWvwbnLIrVqzAbDYzcODAuyJIZWVl8f3335OVlYW/vz9jxoyhZs2ad3w7YJtYOnjwIHFxcXbhp379+sTGxhIVFXXXMqv8/f155pln+Oqrr5g3bx6vvfYanp6eJCcnk5iYSHJyMpWVlYCtTDYsLMxelnezOU5/h6ioKBQKBQcOHCA2Nhar1crSpUsBGDZs2N8SBxs2bMiAAQNYsWIFCxcu5Nlnn0UQBO7UfP3SpUtxd3cnLS2NsWPHMmbMGLujs0pMS01NRRAEcnJybnq9cXFxuLu7c+LECS5cuEC9evUAWzl8SUkJAwYMoGPHjqxcuZKlS5eyb98+PvzwQ1599VWSk5NZuXIl27Zt4/fff2fFihX83//9HydPniQ1NZUOHTpw5swZu6taJpPRq1cvPNNyuFRWialSxoSPvkKtdkKuUGAwGDDo9chkMoxGIwaDkcqKCnSVlZjM5ssjFtGWa/H0qGqK8cfva3FxMSonJ4RruKVWLvg/Grdsg9YYXE2UEgSB/v37o1KpWLlyJV988YV9Mvav9O3bl759+9708XXgwMG958G5G3PgwMFNkZubay/LO3funP3mqV69ekRGRhIZGYm/v/8D6wZwcO8RBIG+ffvy1VdfsWbNGiZOnPhAnB/Hjx8HIDIy8p5v+8yZM3z99ddYLBaee+45wsPDsYoiF0oqOVdcgd5iRSYIyG5SnBJFEYsoYrKCi5sbpw/Gk56TTudXJtx4MFlZ1f9/61bw8oJXX4U7+DkFBQUhk8k4ffr0FcvUajWNGjWiUaNGfwyrOIujxUe5JLuEwc2AxWJBZ9VRUVGBWCaiM+qQi3IKtYVI5BKkMilSZzmuOVYarE+iwc40VFojpM2GHj1sGVP3iOsFpe/cuZOdO3fi5ORkD0oPCwt7YILSvb29GTt2LGfPnmXp0qXEx8dz5MgRevToQdeuXf+2+FLVtbFa18R/IOfOnePw4cPUr1+f5s2b39F1i6LInj17WLp0KSaTifbt2zN06FAUd8HBWFZWZg/v12q1SCQSWrZsSWxsLHXr1r3j27saDRs2pEuXLsybN4/hw4dTr149+756eHjQokULIiIiaNCgwS1lN90JlEolTZs25cCBA2RnZ3Pu3DkuXbpEq1atqgnrt0u3bt24cOECx44dY/PmzXYn052gqhtj3bp18fLyQqfTkZ+fj1qtZt68eWRkZNh/X2rUqHGdNVVn3rx5jBkzhtOnTzN//nzee+89TCYTn376KRs3biQ2NpalS5fywgsvMGfOHDIzM+nRowedOnVi8ODBrFixgjlz5jBixAiysrJ45plnCAsLY+jQoUycOJHi4mK6deuGj48PU6ZMQavVUmE08+jLr9O6YwwjO7fmhfdmUq9hI3atWc7vm9ZjMhqRSCU89tJEagaFotfrEK0iJSUlaIqLMRgMuLm6Iv1T5pRao6ayopLYer6MmvgGe7dspLSokCdfepUeQx5j0VczKczL4aPxz/CtRs3PPy4iLCyMadOmsX37doxGI6GhoTz55JOsW7eOU6dOXTXjbeHChaxatYpVq1YB8NZbb7FkyRI8PDzo3r07ixcvtjcO2Lx5M++99x46nQ6pVMpHH31ETEwMO3fu5IUXXqBDhw7s3bsXs9nMDz/8YC95XL9+PW+//TZGoxFBEJgzZw7R0dEcOnSISZMmUVZWhsVi4Y033rir4foOHPxTcYhSDhw84FRZ56uEqKoyG7lcTkREBE2aNKFJkyZ3bBbdwb+Txo0bExQUxNmzZ0lJSakmPtwPRFEkISEBDw8P6tSpc0+3nZqaytdff40oijz//POEhYUBIBEE6nto8FErOF9SSW6FAb3FinB5mVQQ+HNlnxWwWm1ilAhIBQFvJwVBHu4YkyRsOXuGDRs22PM7rknPnjBvHlx2IwDwyy/g42Mr5btDyOVygoKCSE1Nvdwl8PoiUYBHAAEeAZhFMxdNF8k155Khy6DIXITJbMKCBavVSmV5JYY8A/psPeRD+EUjgSsOYVUosCiVSIuLbeWJ48bdsX25FRQKhV2w/3NQ+rFjxzh48CAHDx58IIPSg4ODmTJlCgcOHGDlypWsXr2aPXv2MHDgQFq0aHHbwvK/wSlVlSkDf98t81cqKyv58ccfOXr0KE5OTjz11FN3XPQCuHTpEnFxcRw6dAiz2YxarbYLB/ei1b1eryclJYXExESSkpIoKSnBZDKRl5eHSqXi+eefp3nz5gQEBNz3SYzo6GgOHDjAnj17OHjwIAqFgoEDB96RdQuCwMiRI8nOzmbVqlV3PJto+PDh7NixA7PZTExMDFu2bCEiIgJPT08++OADtm3bhpOTE2+//ba92cfo0aOv6e4pKipi06ZNfPfdd1y8eJGHH36Yd955h61bt1JWZutqN27cODp27AjA77//TmhoKDVq1ODAgQMsWbKEoqIiQkNDSUpKolatWnTr1g0nJydSUlKQyWS4ubmxevVqli9fzo8//siAAQPYc7GArLwCnJzUSKUynF2csVqtNGnbidhBj+Dp6cmZpBN8PPFF5m7ejU6nQyKVIJVKsVis6HQ6zl+4QK0/OQ093D3QVbnw5HK+Xb2Fi+fO8Hy/rnQdMJThL01k09KfmPTFHLq1jaaBlzMffPABGo2GgwcPAvDee++xadMmRo4cyc6dO4mPj+fAgQPX/DzWr1/P8uXLOXbsGM7OzowaNcq+7Pz587z99tts3rwZV1dXzp49S/v27e2CVUpKCvPmzePbb79l9uzZTJ06lc2bN5OamspTTz3F7t27adiwISaTicrKSkpKShg7diwbNmzA39+fgoICmjVrxkMPPXTXHJcOHPxTcYhSDhw8gBgMBk6ePElCQgKJiYmUX+5o5eLiwkMPPURUVBQNGza85zOWDv65VLmlqvIVGjZseF8fNLKzs8nPz6dTp073dBwpKSnMmjULgHHjxl1VnHNVyonyc6PSZCGrXE9+pQGt0YzZakW02gK8ASSCTaxyVcjwclJQ00WFi0JmP9ZJSUls2LCBiIiI6zsefH3hk0/g5Zdt4edVfP21zTHVu/cd2/8GDRqQmppKamoqTZs2van3yAQZQYogghRBoAaTaMIgGvj8188x6o088eQTXOISaYY00orS2F1WhI+TEyHZ2QBIZTJkn31GipcXAc2aUadOnfvmSpJIJISEhBASEsLgwYOrBaUnJSWRlJTEkiVLHpigdEEQaN26NU2bNmXLli1s3ryZuXPnsn37doYMGXJbTpF/gyh14MAB0tPTad269R0VEc6dO8fcuXMpKioiKCiI0aNH39HjJIoiJ06cYNu2baSmpgLg5+dHbGws0dHRd/03PS8vz54NdebMGcyXrzcajYbo6GhGjRrFnj17OHPmDFlZWfTp0+e+C1IAjRo1wsXFhV9++QVvb2/69u17R4U7lUrFs88+y4wZM/j+++/vqJNl0aJFgM2tM2PGDHx9falVqxbp6ek0btyYDz/8kGPHjtG1a1eSk5Px8/Nj7ty511zfkiVL6NmzJ+7u7ri7u+Pn58fy5cvZvXs3MpmMunXr2gWpKtRqNaNGjaJz587MmDGDffv2MW3aNLp164ZSqWTcuHEUFBTw22+/YTabUSgUmEwmXFxc2LZtG66urjg1aIqL+x/H3MXFBf+AAE4fP8K3b02ioqwEuVzBpfNnsZjNuLi4IpNKcXV1RS6XY7aYMegNZGVlYaysAGylgVUTAC062fLC6tQPQSqVUZSfh4//H+HzVafhqlWrKC0tZfny5YAt861u3br/z955hzdVtnH4PmnSpOkelLZQKLNldLD33jJFcKF+ICrKEsGBeyKoKKiogAxxoIIisvcGgRY6KZRVCl10JV3Zyfn+CD1SWV0gau7r6nU1JznvGTk5531/7/P8Hjp16kTTpk0pKChg+fLl9sis60zW7ty5k9GjR+Pu7g7A+PHj2b17NwBbtmzh7NmzdO/eXfq8TCbj4sWLgH2ioEOHDgB06tSJuXPnArB9+3YGDhxIWFgYYJ8A8vT0ZNOmTZw/f/6aAgwpKSkOUcqBg7/gEKUcOLhL0Gq1JCQkEB8fz6lTp6TOYmBgIF26dCEyMpIGDRrcNl8JB/9+wsLCaNKkCWfOnOHEiRO0bNnyb9uX+Ph44M6m7iUnJ/Pll18iCAJTpkyhadOmN/28WuFEY29XGnu7YrWJlJgtGCw2RFFEEAQUMgF3ZzkKp2t/kwqFgscff5zZs2ezbNkyXnvttZun/nToAG+9Ba+9Vn75O++Ajw907lyFI76WsmNOSUmpsCj1VxSCAoWgQG6UU1JYQkhwCCHBIXTr1g2wDxKyDh/Ga8IETHq93WekqIjSDz/k43btEASBgIAAGjRoQP369WnQoAF16tS54/5OgiBQt25d6taty5AhQ64xSj937hy//vorQUFBkkBVr169v2WQrlQqGTp0KF27dmXt2rUcPnyYDz74gHbt2jFy5MhKpeIVFBQgk8n+sdG1RqOR3377DWdnZ+69994aadNms7FlyxbWr1+PKIoMGjSIoUOH1pgfo9Fo5NChQ+zatYucnBzALrT07duXFi1a3LZrymKxcObMGUmIKts2QHBwsOQNFRISIvUtIiMj+fDDD4mNjeW3336rsYik6iCTyWjatCmbN2+mVq1aFaoSWFkCAwP53//+x+LFi/n555/L++XVAGPHjuXpp5+mpKSE1NRUZDIZY8aMAaBVq1Y0aNCAxMREateufdN2li5dSnZ2tjTRUVxczAcffECbNm3o0KEDqampN1w3JCSEBx98kN27d+Ph4cHGjRvRarWcPHmS//3vf9SvX59Vq1ZRUFCARqNBJpOh0+lYtWoVnUc541O/MXDVb8ImMv/l55i17Ef86tajpLCQSYN7UqjV4O0nx2q1G6Arlc54uXii0+sxGIzoSkoQRRt6gx6PK/chk9mCyWzCWeGMzMkJq9VSbt+dr6q89/nnn1/3GvD19aV58+aUlpYSHR1doSjsq397oijSr18/Vq5cec3nMjIyyk2mODk5Sf30GyGKIi1atODQoUO33A8HDv7rOEQpBw7+JsrKmZcJUWXhwYIg0LhxYynd5G4vZ+7gn0NZBM/HH3/MunXrbutg6FbExcWhUqluKQzVFElJSXz11Vc4OTkxZcoUycS1ojjJBDyVCjwrEcgQHBzM0KFDWbt2Lb/99tutS4sPHAj5+XB1hSCbDV58ERYtgitphtWhYcOGKBQKKUqjOpTNpl9vef3u3WHcOLhiSGy12fA3mXBv1Yokm43U1FQOHTokddblcjl169YlJCREEqsCAgLu6PX5V6P0hIQE4uLiOHHiBJs2bWLTpk3ljNKbNm16x4tIeHt7M27cOHr16sWqVauIjo4mLi6Ofv36MXDgwApF2uTn5+Pt7f2PneDYtm0bWq2WoUOHSp491UGr1bJs2TJSUlLw8PBg/PjxUsRDdcnPz2fPnj3s378fvV6PXC6nS5cu9O3bl6CgoFs3UAW0Wi1JSUkkJiZy8uRJjEYjYBc2o6KipGp5Nzp3KpWKSZMmMWfOHLZu3UpAQACda0gUrw7Z2dnYbDbq1KlzW7y9ANq0aUP//v35+eefycvLo1+/flVuS6vVotPppO957dq1+Pn5Ua9ePWJjY+nZsydbt27lnnvuITU1ldTU1Fum1R87dozc3FwyMzOl329cXBzt27ena9eutG3blp9++qncOh4eHuUMwAVBQK1W8/bbb7Njxw5+/PFH1q9fT0ZGBp07d0ahUPDOO+/w888/s2/fPrKzs3FxceHciURMchWBtf/sk5qMRixmM/UaNsbLz49lK+1RYbm5uWiKihFFu3ijUqnw9fXD1WhAo9GgyTMiipBzOQc3dzd7YyJoCgquEeXUbm7oSopwd7YPWUeMGMG8efPo2rUrarUanU5HamqqlIYfGBjIPffcQ3R0NGfPnmXdunXljOt79+7NK6+8wowZM3B1dWXZsmXSewMGDODtt98mISGBiIgIAI4ePUr79u1v+r0MGDCAd955h1OnTpVL3+vcuTOpqans2LFDqhwZFxdH8+bNb9s17MDBPxWHKOXAwR3EarVy5swZyR+qLI1CqVTSunVrIiMjCQ8Pv6XXiwMHVaVp06aEhoaSkpJCYmKi1PG6k2i1Wi5cuEDbtm3vSHRMQkICixYtQi6XM3XqVBo1anTbt1nGgAEDSEhIYNeuXURGRt56sDtmDOTlwXff/bnMYLCn9i1bBtX035LL5TRq1IhTp05RXFwspTBUBYVCIVX8vC5PPQWbNkFJCU4yGS4qFd2PHaP74sWI/Hkd/PVvz549gH1wXL9+fUJCQqQ/b2/vOyJUubq60qlTJzp16nRTo/SIiAiioqJo3rz5HU1JDAkJ4YUXXuD48eP8+uuvbNq0iYMHDzJixAg6dep0w3Nks9nQaDTXNQP+J6DRaNi6dSve3t41Ei2TkJDAN998Q2lpKS1btmTs2LHV+k2AfcLp/Pnz7Ny5k9jYWGw2Gx4eHvTr14/u3btXu/2/YrPZuHDhghQNVVbdDcDf31+KhqpMtUlfX18mTpzI3Llz+f777/Hz87tjEwjX4+TJk6Snp1OnTh0KCgqwWCy37dlx7733cuTIERITEzl16lSV2yksLGT06NF2byWZjFq1arFhwwZKS0v59ttvGTNmDB999BEvvfQSMpmMRYsWSSldN/KUWrp0KQ8++KAkSImiyObNm6lTpw4ymey65+TRRx9l7NixrF27lkmTJkm/fYVCwaBBg/D29qZVq1ZcunSJr7/+GpPJhM1mY+LEiQQHBzNt2jS0Wi17Dxzgfy++ibxdB2w2KzabiKu7O+Omv8ykEQPw9PGh1xB75KLJZAKZEyKiPZpIEHBRu6B2VWM2mVBJ4rlISbHdnkKQyexRVDp9uf0f9r8n+PzV51n54dus+OYbXnrpJYxGIx06dJDucy+99JIkSoG9n9OpUyf27t3Lxo0by00eDBkyhCNHjhAVFYWXlxc9evSQBNrGjRuzcuVKJkyYgE6nw2Qy0apVq+tGTl1N48aNWb58OY888ghmsxknJycWLlxI+/bt2bhxI88//zwzZszAbDZTr149yXDdgQMHfyKINVX31IEDB9dFp9Nx4sQJ4uPjSUpKQq+3P3C9vLykAU3Tpk1vSzlrBw6ux5kzZ5g7dy7BwcG8+uqrdzxaat++ffzwww+MHz/+ljOQ1SU+Pp5FixahUCh49tlna6RaU2XJycnh3XffxdXVlTfeeAO1Wn3zFWw2ePNN2Ly5/PKgILswVc0y7Bs3bmTdunVMmDCB1q1bV7mdr776iri4OBYuXHjja+jbb+Gzz8ov++gj6NXrmo+KokhOTg6pqamSQHXp0qVyKRIeHh7lRKqQkJA7KuLbbDbOnj0r+VCVTSzI5XKaNWtGVFQUERERd9Qo3Ww2s3PnTjZv3ozBYCA4OJj777//uiKCRqNh5syZdOrUibFjx96xfawpli1bxpEjR6p977BYLKxZs4adO3fi5OTEyJEj6dOnT7XuhVarlePHj7Njxw4p8jk4OJi+ffvWuABfWlpKcnKyZFJeWvqnR0+TJk0kIaq6kdYxMTF8/fXXuLq6MnPmzL8lcttms/Huu++SlZVFhw4dOHz4MBMnTrytqd/R0dE8+eST1K5dm8WLF9eob5nFYuHVV1/FarUye/bsavX9Dh8+zPLly2natCnTp0+v1vWbnp7O6tWrOXXqFE5OTvTu3Zt77rkHtVrN+fPnWbthI75tumOxWDEb9bio1dSqVQuV8k8xvqy6oCjaULm4YNAbKCkpxtnZmbp16+LiosZqtZCVlYXVakWpUmE2mewFQ6xWLBYzaldX6tSpg4D9WAwWK54qBV3qVr5aaEZGBvPnz6eoqIiuXbsyZswYZDKZNCEjiiIzZsxAr9fz1VdfVfncOXDgoPo4IqUcOLgNlHmTxMfHc/r0acmbIDg4mMjISCIiIv42bxIHDpo0aUKzZs2k6I+qegtVlfj4eGQy2W33tIqNjWXx4sWoVCqeffbZO1Ze/a/4+/szatQoVq5cyc8//8y4ceNuvoJMBm+8ARoNHD785/LMTJg6FRYvBje3Ku9PaGgoYPeVqo4oVTaYslgsNx5YPfgg/PKLfd/L+Owz6NoV/rKOIAjUrl2b2rVr07FjR6ntjIwM0tLSuHDhAqmpqSQmJpKQkCCt5+fnVy7tr169erfNMLrM26Zp06aMHj26nFF6WaSKIAh31ChdoVAwcOBAOnfuzLp16zhw4AAff/wxrVq14r777qNWrVrSZ//JJuepqakcOXKEBg0a0K5duyq3c/nyZb7++msuXbqEv78/TzzxRLVEh9LSUg4cOMDu3bvRaDQIgkBkZCR9+/alSZMmNfKcL0v3L0vLO3funJSS5OXlRdeuXQkPD6dZs2Y1eu23bduW7Oxs1q9fz4IFC5g5c+atRfUaZt++fWRmZtK5c2fuueceDh8+zOHDh2+rKOXq6kqzZs0oKCiQqqy5VeOeezVyuZx+/fqxevVqDh48SM+ePavUjtFoZM2aNQiCwP3331/t66xu3bpMmzaNhIQEfvnlF7Zv384ff/zB0KFD6d69O89Nmczuk6nkmmxocg0UFRVh0Bvw9fXF28cbnU5Hfl4eIvb7i5ubOxpNAUajAZlMRk5OLmq1C94+PvjVqkXO5csYjUZ8fXwpLS3BYDBiNpsoKixCpVLh5+uH7co1Xs/DpUrHVKdOHV544QU++eQTDhw4gMFg4PHHH+exxx7jwoULGAwGWrRowcKFC6t17hw4cFB9HKKUAwc1gCiKpKWlER8fT0JCAunp6YA9lz40NFQSov6JAwEH/06GDRvGyZMn2bBhA1FRUXdMIC0rQ960adPbOrg5duwYS5YsQaVSMW3atBov811ZunfvTnx8vDSYuqUYpFDAhx/ChAlw8uSfy0+fhhkz7JX5quhJERISgkKhICUlpUrrl1HmiWE2m28sSjk7w+TJ8Morfy67dAl+/dUuWN0CuVxO/fr1qV+/vlQRyWg0cvHixXIpfzExMcTExAB2cSsoKEiKpGrQoAFBQUE17v90PaP0MoHq7zBK9/Dw4JFHHqFnz56sXr2a2NhYEhISykU8lIlSlTFGvxsQRZFVV/zJqjMAP3z4MCtXrpTSfx5++OEqp11evnyZnTt38scff2AymVAqlfTu3ZtevXrViBBpNBqlNOvExEQ0Gg1gv+4aNGggRUPVrVv3tt6/Bw8ezOXLlzl69CiLFi1i6tSpd8xLrbS0lHXr1qFUKrn33nvx8PCgYcOGJCQkoNfrcXGpmlhRETw8PAgLCyMzM5MlS5YwderUGvNh69atG5s2bWLbtm1069atSudz8+bNFBYW0q1bN4KDg2tkv8oE1RYtWrB37142bNjAjz/+yJ49exg9ejSRDZtwNFODi7Mz+Xm5lJaUkJ2dRX5+PnK5E05OTtTy80OtdgVE9Ho9KpUK/9q10Wo06HR69PpMPD098fLyQqPRotFoCAwMQK/XU1AgUlJSwuXLlxEAN09vnJ1kBLhWXWj19/fnxRdfZN68ecTExGAymVi1apUjO8GBg7sMhyjlwEEVMZvNpKSkSEKUVqsF7KV327dvLz3Yb2enyYGDqtKwYUNatmxJUlISsbGx1YqYqQzJyclYLBaioqJu2zaio6NZtmwZLi4uPPfcczXWYa8OgiDw2GOP8fbbb/P999/TuHHjW6d4qdXw6afw+ONwRegG4NgxeyTV++/bo6oqiVwup3Hjxpw8eZKioqIqp5qVdeqvZ3Zejn79YOVKSEr6c9n27RUSpa6HUqmkSZMm5czqi4uLpWiqsr+DBw9y8OBBaV+Dg4PLpf35+/vX6GDe19eXPn360KdPH0pKSkhMTLzGKN3b25vIyMjbapReFvGQmJhYLuJh2LBhlJSUSPv6TyImJobz58/Trl27KqXgGgwGVq5cyZEjR1AqlYwbN06KxqsMoihy6tQpduzYQdKV69nX15devXrRpUuXagvteXl5kgiVkpIipa6q1WratWtHeHg4LVq0qLGonYpQdu/Ky8vj1KlTrFy5kkceeeSOTGSsX7+e0tJSRo4cKd2nOnTowPnz5zl+/DhdunS5rdtv1qwZ9erV4/Dhw6xbt44RI0bUSLtKpZJevXqxYcMGYmJi6NChQ6XWz8vLY/v27bi4uDB8+PAa2aerkcvl9OnTh44dO7Jhwwb27NnDZ599RosWLYgcPJoSZyXBwcEUFxeTmZFBaWkJgiDg5+eHy5XfgNlsxmy24KJ2QaVUERAQQElJCRqNFq1Wi0Ihx9lZgclkJjc3l4CAAFxcXEhPT6e0tJSCwkJsMjkhbgoUTrVuscc3x8fHhxdeeIH58+eTkJDAggULmDhx4m2LqHXgwEHlcYhSDhxUgrKBRnx8PMnJyVJVGz8/P/r06UNkZCSNGze+4xWZHDioCkOHDiUpKYl169YRFRV1R6pxxcXFAdw2g/UjR46wfPlyXF1dee6556hbt+5t2U5V8PLy4uGHH2bJkiV89913TJw48dYDOx8fWLDALkwVFPy5fMcOaN4cHnusSvsSGhrKyZMnOX36NG3btq1SG1dHSt0UQYDp0+3HUEYNi/Xu7u60bNlSSgkVRZGCggLS0tIkj6q0tDTOnz9/1S64SAJV/fr1adCgQY1UcwNwc3O7pVG6Wq0mPDycqKgoWrRoUaMDJEEQiIiIoHnz5lLEw8qVK8nNzcXJyekfFSllMpn49ddfUSgUjBw5stLrp6Wl8fXXX5Obm0twcLDkFVQZzGYzR48eZefOnWRkZADQqFEj+vbtW617p8Vi4ezZs5I3VHZ2tvRe3bp1admyJeHh4TRs2PBvrZaoUCiYOHEis2fP5sCBAwQGBkrVxG4XWVlZ7N27V+pfldG2bVt+/vlnjhw5cttFKUEQeOSRR8jIyGDz5s00aNCgxtIGe/XqxbZt29iyZQvt27evlMj3yy+/YLFYuPfee2vcOP9qXF1deeCBB+jZsye//PILCQkJXMjIovND48HVDZvVhlqtRiaTYbFYpIqDgYGBWKxWexuSUCvg5uaOWq1Go9FeEchFzGYLomgjv6AAP19f6tWvz4XUVBRqN/LSL7Jny69k9OnD0KFDqxXd5OHhwYwZM/jss884deoU8+fPZ8qUKXc8HdWBAwfXxyFKOXBwCy5fviz5Q13t41DWOYmMjCQwMNDhD+XgH0dISAgREREkJCRw7Nixavm0VASr1UpiYiLBwcG3JVLj0KFDfPvtt7i5uTF9+vTbVnK9OrRr1464uDhiYmI4dOhQxQZVdevafZieegp0uj+Xb9hQZVGqzAQ7JSWlyqJU2QDhphX4yoiIsJu3L18OXl52keo2IggCvr6++Pr6SlGANpuNy5cvl4umOn36NCevSo/09PQsl/ZXv379ag9anJ2dpWfFX43Sjxw5wpEjR5DL5TRv3lwySq+pgebVEQ9lvkD5+fmsXLmSBx54gMDAwBrZzu1kx44daDQaBg8eXCkxTRRFduzYwW+//YbVaqVPnz6MHDmyUobjRUVF7N27l71791JcXIxMJqNdu3b07du3yh51RUVFkjdUcnIyBoMBsF8nERERUlqet7d3ldq/Xbi7uzN58mQ++OADfvnlF2rVqnXbfJ3K0jVtNhujRo0q9525ubnRsmVLKaXxdpynq2tAKRQKnn76aWbNmsWyZct45ZVXKi1qXg83Nze6devGzp07K1UJNyUlhdjYWGrXrl1lP6rKUrt2bSZNmsTJkydZvXo1J/Zuo0HHHlhMJuROTjS4Er1oj5oqJe3iRWSCDJVKiYtL+funTOZ0xXPKlYKCAmyiiE6nx2yx4OzsjLubO34BQRRqC/hj7U+onWDr1q0kJCQwbty4aqXil01WffHFF5w+fZqPP/6YadOm3VZhz4EDBxXDIUo5cPAXbDYb58+fl4Soy5cvA/aOSXh4OBEREURERODp6fk376kDB9Vn2LBhJCQksH79etq0aXNbZ+PPnj2LTqejd+/eNd72gQMH+P7773F3d2f69Ol39WD74Ycf5syZM/z888+EhobiV5FqemFhMHeu3ei8rBpdo0ZV3oeQkBCUSiWnT5+uchsVTt8rY+hQ+9/fhEwmIzAwkMDAQDp16gTYI1XS09PLCVUJCQnEx8dL6/n7+5dL+6tXr16VZ+yvZ5QeGxtLXFwcCQkJJCQkIAgCjRo1IioqisjIyBrxJ3J1deXBBx8kOjqa+Ph4Tp48yTvvvEP37t0ZOnToHU0HqwxarZbNmzfj6enJgAEDKrxecXExy5cv58SJE7i5uTF27FjCw8MrvP6lS5fYuXMn0dHRWCwW1Go1AwcOpGfPnpUWQco8J8vS8tLS0qT3/Pz86NSpE+Hh4f+IKrxBQUE89dRTfP755yxdupQXXnjhtqRHlwl2YWFh10317tChAwkJCURHR9O/f/8a3/5f8fPzY/z48SxYsICFCxcyc+bMGols7NevH7t372bz5s2Eh4ffcnLTZrOV81aryYqOFaFZs2bMnDmTV155hWMlelr3HoBMJmAxW1Cr7ZGnWq2Wy5cvo9frsVot5Obm4O3jg7OivAeiUqkiMDCQ4uJi8sQ8dDodGenpBNULwcVFxaXTSaidIDw8nFOnTpGVlcWcOXMYOHAggwcPrvKxq1QqpkyZwqJFi0hKSuKjjz7iueeeu+tEYAcO/ms4RCkHDrAbiiYnJ0uDgjLfDXd3dzp37kxUVBRhYWGO/HMH/zqCg4Np1aoVsbGxREdHV9rbojKUDfRr2k9q3759/PDDD3h5eTF9+vQamcW+nbi6uvLYY4/x+eef88033zB9+vSKiYHt28PSpfDdd/a0vkmTqrwPTk5ONG7cmBMnTlBYWFglkb1SkVLX4+RJMBrtUVR/U2qSXC6XxKYyDAYDFy9elNL+Lly4wNGjRzl69ChgF5bq1KlTTqgKCgqqtKB7tVH60KFDycvLIz4+XjJKP3v2LL/88kuNGaWLoojRaKRfv34MGzaMVatWsWfPHo4ePcrgwYPp2bPnHR/k3orff/8dk8nEww8/XOHn76lTp1i6dClFRUWEhoby+OOPVygt02azkZiYyI4dOySxtnbt2vTt25cOHTpU6vmv0+lITk4mMTGREydOUFxcDNivnbCwMMLDw2nZsiW1a9f+x0VZt2jRggceeICffvqJL774gpdffrlGJ+ksFgurV6++aVW5iIgIVCoVR44cuSOiFEDLli0ZMmQI69ev59tvv+WJJ56o9nfn7e1Nx44dOXToEGfPni3nk3c9Dhw4QHp6erlU5TuJ0Wjkyy+/pLi4mFouLij1hdg8/Cgs1VFcXIS3jw9eXt5YrVZpQjc/P5/S0lI8PD3x8vT6yz1GwN3dA7XalaysLGxOcvJyc5DlXKJ7q5Yk/bGPrKwsXnzxRb7//nsuXrzIpk2bpKipqqbnOzs788wzz7B06VKOHz8uCVNXVyp14MDBneXu6n04cHAH0Wq1khHtqVOnJEPRgIAAunTpQmRkJA0aNPhbfRwcOLgTDBkyhNjYWDZs2EC7du1uyzUviiJxcXH4+PjUqM/Tnj17+PHHH/H29mb69Ok1ElVyJ2jZsiXdu3dn37597Ny5k379+lVsxRYtYM6c8stOnYK0NOjWzW6OXkGaNm3KiRMnOH36dJVSNyvsKXU9vv4aFi2y/9+/P8yaZfeeugtQqVRSNFMZRUVFki/VhQsXSE1N5dKlS+zfvx+wC3T16tUrl/ZXq1atSg1ay7xzyozSExISiIuLIzk5uZxReplA1aRJk0r5F5aUlGA2m/Hx8aFZs2a8/vrrHDhwgHXr1rF69Wr27t3LfffdR2Rk5G0TSkRRRG+xYbLasIkiMkFAKZehcpJds820tDQOHTpE/fr1K2RKbrVaWb9+PVu2bEEQBIYPH87AgQNveT8zGo0cOnSInTt3kpubC9gjQvr27UuLFi0qdC5EUSQrK0vyhjp79iw2mw2we9l07tyZ8PBwmjdvXuVqf3cTvXr14vLly+zevZsvvviC559/XrofVJc9e/aQk5ND9+7dqVOnznU/4+zsTOvWrTl06BAZGRk3/FxNM3jwYFJTU4mJiaFhw4blvK6qSv/+/fnjjz/YsmXLTUUpnU7H2rVrkclkjB49utrbrSylpaV8/vnnpKamEhISwtSpU1Gr1SRn5nIiW4PVSUlObh4uSmcMBgOurm64u7tRWFiI0WikoKCA0pJS3D3c8fT0xElmv3eJoogVAd+AQPIyL7Fh0Xyyz58hvkMHPD09ycvL48SJE8ycOZPNmzezceNG0tPTmTVrFkOGDGHgwIFV8nGVy+U8+eSTfPfddxw6dEgSpu7mKGsHDv7NOEQpB/8ZRFEkIyNDSs24cOECYJ+tbty4MZGRkURERNz1URYOHNQ0devWpU2bNhw7dozDhw/TuXPnGt9GRkYG+fn59OrVq8YGvDt37mTVqlX4+PgwY8aMiqXB3UWMGjWKkydPsnbtWlq0aFE1D6zt2+HVV8FmAz8/u9BTQc+N0NBQwO5RUhVRqtLpe1fz889//r9tG/TsaRen7lI8PDyk1G2wP0/y8/PLpf2lpaVx7tw5aR1XV1fq169fLqKqohElbm5udO7cmc6dO2M0GiWj9ISEBHbv3s3u3bsrbZRecMUov8zPTSaT0b17d9q1a8fmzZvZuXMnX331FaGhoYwePbrG0rIMFitZJUYK9Ca0RjNmm1jOs0cQBJROMjyVcnxdnAl0U6GQCVKa0ujRo295z8jPz2fJkiWcP38eHx8fnnjiCRrdIr01Pz+f3bt3c+DAAfR6PXK5nC5dutC3b98K/RbLKvCWpeXl5+dLx1O/fn3JG6o60W13M/fffz85OTmcOHGC5cuX89RTT1X7OIuLi1m/fj1qtZphw4bd9LPt27fn0KFDHDlypEoG+BXhr8cjCALjx49n1qxZ/PLLL9SrV++W0U23IjAwkKioKGJjY0lPT7/hpM2GDRsoLS2lT58+BAQEVGublUWr1fLpp5+SmZlJWFgYzzzzjCSutqjjT0gtH46kZpIrgNlmw2C2onCS4e3tg9rVlfy8PIxGI0ajAZvWSmlJCe6enqjUrogIyGUCDTxc6BbQjNMN62MuLCAlJYXAwEBOnTqF0Wikc+fODBkyhMjISL755hvS09NZt24d8fHxjB07tkrPT5lMxmOPPYZSqWT37t189NFHPPvss9XyrXLgwEHVcIhSDv7VWK1Wzpw5I/lDlXUalUolrVu3JjIykvDwcFxdXf/mPXXg4O9lyJAhHD9+nI0bN9KhQ4caryBZlrpXU8a4O3bsYPXq1fj6+jJjxox/XIl7QCpN/9FHH7Fs2TJmzpxZ+fSpzZvtghRAXh5MngzLlkEF0hDq16+PUqkkJSWlCntfTVEqOBi02j9fL1hgF6ZqKNridlNW/tzPz08yirfZbGRlZZUTqk6dOkVycrK0nre3dzmRqn79+rjcohKhUqmUoqOqY5Re9vz7q1m4i4sLI0eOpHv37vz6668cP36cWbNm0blzZ0aMGIGHh0eVzlGx0UJqoY7sEgNmm12EkgkCTgJS9JKIXeAzWGzozEaySoycKShFKNGQfjmXNm3a3HLQf+zYMb777jv0ej2tW7fm0UcfvaE5vSiKnD9/nh07dhAbG4soinh4eNCvXz+6d+9+S8Pj/Px8SYRKSUmRrn0XFxfatm1LeHg4LVq0+E8YJ8tkMp588kk++OADjh8/zrp16xg+fHi12vz9998xGAzcf//9tzyHoaGheHp6cvToUe699947Jvyp1WqeeeYZ5syZw+LFi3n11VerXbVz4MCBxMbGsmXLFp544olr3s/Ozmb37t24ubkxZMiQam2rsuTk5DB//nzy8/Np1aoV48ePv8b7zNVZTq+mwRToTazbexBR6YZcrSZXq0WlUuHjH4BOr8NsMiMiAgJ6k5mSomx8FSIdwpvhpbaLXJMmTWL27NkUFRXh7+9PdnY20dHRvPjii8ybN4/g4GBmzpzJxu07OJaYDF6+rNp3hIaNmhAcXBdnJyfcnZ1wV8pxd5Yjv0WkpCAIPPDAA6hUKjZv3swnn3zClClTaNy48e06pQ4cOLgODlHKwb8OnU7HiRMniI+PJykpCb1eD9jLsXfv3p2oqKh/hKGoAwd3kqCgINq2bUt0dDR//PEHXbt2rdH24+PjcXFxKZcSVVW2bt3KmjVr8PPzY/r06f9IQaqMRo0aMWDAALZs2cLGjRsrP6hr1gz27fvzdVaW3Qz966/hFubVMpmMJk2akJSUhFarrfTAqixdp0qeUo89Bi+88OfrzEz46acqVxO8GyjzmqpTp45UVdFsNnPp0iXS0tIkj6rY2FhiY2Ol9WrXrk2DBg0koapu3bo3fD791Sg9PT1dEqiuZ5QeFRUl+aSUiVI3+r34+fkxYcIEzpw5w+rVqzl48CAxMTEMGjSIvn37VviZaRNFUrU6zmlKMdtEnAThuul5EoIgdUZtoojZaqPQKqPNvWNoExKIKIrXXddkMrFq1Sr279+PQqFgzJgxdOvW7bqftVqtHD9+nB07dkhR0sHBwfTt25e2bdveUAy2Wq2cO3dOSsvLzMyU3gsKCqJly5aEh4fTqFGjGhfy/wm4uLgwefJk5syZw6ZNm6hdu3aFUi2vx6VLlzhw4ECFq8rJZDLat2/P9u3bOXPmTI08WypK3bp1eeSRR1i+fDmLFy9m+vTp1fJjCwkJISwsjJiYGIYPH36Nt9Hq1aux2WwMHz682tVAK0N6ejqffvopRUVFdO7cmUcfffSG6bCCIOCrVnIp+gCX8wvoNXAwZy9loPL0xtvPnzrBdbHIRFJOJKLNzsRQpEVXkItBp2O/tzfDhg2jY8eOBAUF8b///Y+vv/4anU7Hs88+y7vvvsv+/fuZ8cKLjHr8SVxqB6MKa0O7RpHodTpsokipKHLmcj4uLmpkMhkyARQyGUFuSup4uODhLL/hPUgQBEaMGIFSqWTt2rXMnz+fSZMm0axZs9t5eh04cHAVDlHKwb+C/Px8yX/j9OnTkpdD3bp1pZnjf2sIvQMHNcWQIUOIiYlh48aNdOzYscZMjzUaDWlpabRr167aA7fNmzezdu1a/P39mT59+r+iYs7QoUNJSkqSKjA1vFJeu0KMGQP798NV0TicOQPTp9ujj24ReRQaGkpSUhIpKSmVNrmvVqRUz57QqhVcJc6wbBkMGwbVjDq4m1AoFDRs2JCGDRvSq1cvwD5xcvHixXIRVYcPH+bw4cOAfbBdt25dSaRq0KABAQEB1wwGBUEgODiY4ODgChmlX7x4EVEUbyniNmnShJdffpnDhw+zdu1a1q5dy/79+7n33ntp27btTZ+jeouV+MuFFOjNCLcSo66DTBAw6krQFxbi6etLml5En60lwt8TZ6c/jz8jI4Ovv/6arKwsgoKCePLJJ6+bvlNaWsqBAwfYvXs3Go0GQRCIjIykb9++NGnS5Lr7VlxczIkTJyST8rKJLYVCIYlQ4eHh/2gxvCbx8/PjmWee4ZNPPuHbb7/F19e30iltoiiyatUqRFHk/vvvr/BzokOHDmzfvp3Dhw/fUVEKoGPHjqSmprJnzx5++eUXHnzwwWq1N3DgQE6dOsW2bdsYM2aMtDwpKYmkpCTq1q1b45NFN+PcuXMsWLAAnU5H3759GTVq1C1/y5cvXyYjI4PmzZszalA/tFota9eu5dCqTQC0bduWoX36sG7dBTLT03B2dqZ58+akpqayYsUKtm3bxogRI2jTpg0XLlxg+/bt7N+/n3ffe4+1uw/QontfcgQ18nwtrmoXXJ0VuDp7UliopbCoGETQFRbi6e2Fm5sbFptIaqGei0UGaqmdaebnjlpx42tr0KBBuLi48OOPP7JgwQKefPLJGi/M4sCBg+vjEKUc/CMpK7EcHx9PQkIC6enpgL0zHxoaKvlDOTqNDhxUnICAADp06MDhw4c5dOgQ3bt3r5F2a6rq3oYNG1i/fj21a9dm+vTp1U6ZuFuQy+WMGzeO2bNns3z5cl577bWKV/pSq+HTT+Hxx+HSpT+XHz8Or78Os2fftLJd2UCuKqJUtYzOBQGee658ZFRJCSxeDC++WPn2/kGo1WrCwsIICwuTlhUWFpYTqS5cuMDFixfZdyUKTqlUSkbqZX++vr7lBom3Mko/ceIEJSUl7Nixg/bt29/UKF0QBDp16kTr1q3Ztm0bW7duZcmSJezatYv777+fBg0aXLOOzmwlJktLscmCs0yGk6zyk0BWm5XCwkKcnGR4uKqxiQKXS00cy9bSJsALhUxg3759rFq1CovFQvfu3Rk9evQ1JtuXL19m586d/PHHH5hMJpRKJb1796Z3797XRKGIosjFixeltLy0tDTJ88rX15cOHToQHh5OaGioI8L6BjRq1Ij//e9/LF26lK+++oqXX365UpXMYmNjOX36dKWrytWtW5fAwECOHz/OQw89VOPfz61EmNGjR3Px4kV2795NgwYNqlW9NiwsjPr163Po0CGGDBmCp6cnFotF8la7//7771jhnRMnTrBw4UJMJhPDhw9n0KBBFRKXjx07BkCbNm0Ae4bC2LFj6dWrF6tXryYmJoa4uDj69u1LWFgY69evJzk5mYiICHx8fDh48CBfffUVDRs2ZPjw4aSlpXEpO4cMXOh638OYzWYsBh1Gi5XSIi3u7u54eXnh5eWNi1pNfl4eZrMFbYEGvU6Hn68vCic5VlEku9SIxmAm1NeNuu6qGx5Pz549USqVrFixgkWLFjF27NjbWpXYgQMHdgTxardJBw7uYspMRcuEKO0VPxK1Wk3Lli2JjIykRYsWt/TncODAwY3JycnhzTffxNPTk3fffbdGOvmffvopKSkpfPLJJ1WqPCWKIuvXr2fjxo0EBgby3HPP1WgJ8ruFsrTEnj178tBDD1Vu5YwMGDcOrphZS9x/vz1N7gYdcJvNxnPPPYe7uzvvvfdepTZ58eJFZs2axfDhw7nnnnsqt79lvP663RerDCcnWLWqwmbt/1ZEUSQ3N/cakepqAdDNza2cSBUSEnJdH54yo/R33nmHCxcuSKb2arWaiIgIoqKiaN68+U2FUI1Gw2+//caRI0cAe4TKvffeK0UqGq02jmZqKDJaUDrJkFUxKjm/IJ+S4hJ8fX1wc7Mfi00UMVpteDnLSNyylthjMajVah599FFat25d7pydOnWKHTt2kJSUBNhFpd69e9OlS5dyfQODwUBycrKUlldUVATYJ7YaN25MeHg4LVu2JDAw0BFhXQnWr1/Phg0bCAgI4KWXXqpQqpnZbObNN99Eo9Hw5ptvVtrEuyx6dsKECeWuh+qQlJTE559/Tv/+/bnvvvtu+lmtVst7772HwWBg5syZ1aoue/z4cRYtWsSAAQMYOXKk5J3YqlUrnn766Sq3WxliYmJYtmwZNpuNBx98sEKplGW8++67ZGZm8tFHH+H2l/RxURSJjY3l119/JS8vDw8PD7p06UJiYiLp6el4e3szcuRITp8+zcGDB7HZbDRv3Q7P5q1Rurojw4auuAQnuRPe3t5oNRosFitOTjK8vb1xdXVFFEW0Wi1FxfaoKUEm4O3ljbu7G6Jov08hQH0PF5r5ud/0PnX8+HGWLFmCzWbj4YcfrrFJOgcOHFwfR6SUg7uakpISEhMTiY+PJzk5GaPRCPw5IxwZGUnjxo3/k14ODhzcDvz9/enYsSOHDh3iwIEDUspRVdHr9aSkpBAaGlplQer3339n8+bNBAUF8dxzz1XZePlup1+/fsTHx7Nnzx4iIyNp3rx5xVeuUwc+/xyefBJ0uj+Xr1plr8r3+OPXXa3MoyghIQGNRlOpdMhqpe+VMWkS7NwJZb5UVqs98uuTT6re5r8AQRDw9/fH39+f9u3bA3YBMTMzk9TUVMmjKjk5WRJgwC7C1K9fX/KoqlevHiqViqioKOrXr09UVBQPPPCA5ENVljaoUCho1qzZDY3Svb29efzxx+nduzerVq3iyJEjHD9+nP79+9O/f39SCo3VFqRMZhMlJSU4OyvKDWhlggBWM5fyDWgEJY0aNWL8+PFSJLTZbObo0aPs2LFD8nxq1KgRffv2JSoqCplMhiiKZGdnSyLUmTNnsFqtALi7u9OpUydatmxJ8+bN76hnz7+NIUOGkJ2dTUxMDIsXL2bKlCm37J/t2LGD/Pz8KleVa9++PWvXruXIkSM1JkpVBi8vL5566inmzZvHwoULeeWVV6p8DUVFRVG7dm327t1Lly5d2LBhA3K5nFGjRtXwXl+f/fv388MPPyAIAo8//rh076kIOTk5pKen06xZs2sEKbDf01q3bk1ERAS7du1i48aNbN68mcDAQFq0aEFycjJLly6lb9++vPrqq2zdewB5/VDkKhe0+bk4KxQonZX2aCmzmaCgIAoLCykqKiIvL5+SkhJ8fHztFf/UavLy8rFYLBQUFKDT6/D19UUll2O22Ugr1CMCLfzcbyg6t27dmokTJ7Jw4UJ++OEHDAYD/e/iCrEOHPzTcYhSDu46Ll++LFXLO3funBRG36BBAyIjI4mMjHTMXjpwcBsZPHgwhw8fZvPmzXTt2rVa0VInTpzAarVWqeqeKIqsWbOGbdu2UadOHSmi59+KTCZj3LhxvPvuu6xYsYI333yzcoOb0FD4+GOYMgUslj+Xf/mlXZi6QYn1MlEqJSWlUibFZddFlYzOywgIsPtiLV/+57J9++DYMbiSAuLATpnXVN26denWrRtgP/eXLl0qF1F1/Phxjh8/DtgHggEBAdSpU4ezZ8/Svn17GjVqRGhoKPfff/8NjdIbN24sGaX7+flJ+xASEsILL7zAsWPHWLNmDRs3biTpQjrN+w7BRaWssiAFIpqCAhDB28cHEKTlhYWFaAsLUShVhHbsRo9GQfiqlRQVFbFnzx727dtHcXExMpmMdu3a0bdvX0JCQjCbzZw8eVJKy8vLy5O2Vr9+fckbqn79+o7+RA0hCAJjx44lPz+fkydP8tNPP/Hwww/f8PxqtVo2b96Mq6trlavKlXlYJSYmUlpa+rdUU27atCn33Xcfq1evZvny5UycOLFK15RMJmPAgAF8++23zJ07F71ez6BBg8r9Bm8XZZG6CoWCCRMmEB4eXqn1/5q6dyPkcjn9+/enU6dOrFu3jv3795OVlUVgYCAajYYdO3aQcu487e57FKMNSgs1OAkydKWlmE0mFApnCouKcHNzw8vLG1c3NwoKCjDoDWRlZeLh4YGnpydBQYFoNFqKi4vt72Vm4u3tLQlmFwv1qBVONPS68fXSsmVLpk6dyoIFC/j1118xGAwMHTrUcb9w4OA24BCl/oGYrDaKTRaKTRYMFhs2UZSqTLg7y3FXyittLvp3YrPZOH/+vCREXb58GbAPeMLDw4mIiCAiIuJfma7jwMHdiJ+fH126dGH//v3s27ePPn36VLmtuLg4gEqLUqIo8ssvv7Bjxw6Cg4OZNm3adWdf/23UqlWL0aNH8/333/Pjjz8yfvz4yjXQrh288w688kr55e+9B97ecEXMuJrQ0FCASotSZT4+lqsFsKowdiz8/nv51MN58+Dbb2/qh+XA/h00atSIRo0aSctKS0tJS0uTRKrU1FT27t3L2bNn0ev1ZGdnlzNSb9u2LUOGDCE/P18SqM6ePStV4atTp44kUAUHByMIAm3btiUyMpLtO3dyWeWHTq+ntLAQHx9vlMrKR0Tq9XoMBiNqtQuqK+tbrRby8vIwGIw4OTnh7ekBcmfiMvK4dHA70dHRWCwW1Go1AwcOlNKMEhMT2bhxI6dOnZIEU5VKRevWraW0vH9rtOXdgEKhYOLEicyePZt9+/YREBBww2fI2rVrMRqN3HfffdWKUOvQoQNnzpzh+PHjkmB7p+nTpw+pqanExMSwefPmKqc0d+jQge+//55t27bRt29fBg0aVMN7Wh5RFPntt9/YunUrKpWKyZMnV9qoHuyilCAIFfaOdHd3Z8yYMZLfVHJyMjabDblcjrp+UwqKS1HJZdT298fTw4OMzEwMej0mkwlnZ2cKCgqoVcsfhVxBbX9/SnU6NAUaCguLKC0txdvbGx8fb9RqF/Lz87FYrOTnF6DT2aOmbIKMswWl1HJR4q688XC4adOmTJ8+nU8//ZSNGzdiMBgYPXr0P2aM5cDBPwWHKPUPwWoTuawzcqlIj9ZgxiqKlLmB/TmfaP9fJhNwVTgR7OFCkJuqXMWauwWj0UhycrI0M1tSUgLYH1KdO3cmMjKSZs2aVdzs14EDBzXKoEGDOHTokBQtVZXfotVqJSkpifr161cqLUwURX7++Wd2795NvXr1mDZt2t8y+/130bVrV+Li4jh69CiRkZG0bdu2cg307w/5+faoqTJsNpg5ExYuhL/MgNetWxe1Wk1KSkqlNlMjkVIArq4wYYLdlL2MU6fsXlODB1ev7f8grq6uNG/eXEr/FEWRgwcPMm/ePCIiIvDw8JBEqzJUKhX16tWjQYMG9O7dm9GjR5Oeni6lzm/cuJGNGzfi7e0tCVRNmjQhqktPjmdr0ZcUUWI2kZ19GbVajbe3F3J5xSIsRUQKNBoEAek+odfryMvPx2a14eKiwtfXD5PJSLGmAC2QfOGS5Bfl7+9PSkoKCxYskIqegL1wQ5kI1bhx4xqrJurg1nh4eDBp0iQ+/PBDVq9ejb+//zWRNxcuXOCPP/4gKCio2kJSmzZt+Omnnzhy5MjfJkoJgsBjjz1GRkYG69ato379+rRo0aLS7Tg5OWGz2TCZTDRq1Oi29oNtNhsrV65k//79uLu78+yzzxIcHFzpdnJzc7l06RJhYWGVjmYOCgpi6tSpnDhxgtWrV2NVe+LfKBSDrhSD1YJBr8fXz4+GDRpw6VI6JSUlGAxGcnJykclk+PjYCz64ql1xcXGhUGuPjsrNzcPFRYWPjw+BQUFoNBpKikvQ6w1kZmbi5eODXOnCibwi2gd53zTKMyQkhOeff5758+ezc+dOjEYjY8aMuWPG8w4c/BdwPKHvckRRJL3YwFlNKXqzFRGQywScZTIErq0MYhNFbKJIscnCidxizhSUUM/DhUbebsirUAmnJtFqtZI/1MmTJ6XZ9YCAALp06UJkZCQNGjRw3OQdOLgL8PX1pWvXruzdu5e9e/dWyUvh9OnT6PX6SkVJiaLIjz/+yN69ewkJCeHZZ5/9z3m8lA1u3n77bVauXEmTJk0qHyn60EOQlwcrVvy5zGiEZ5+FZcsgJERaLJPJaNKkCfHx8eTn51e4ammNeEqVMWIE/PQTpKb+ueyLL6BPH6iCF5mDPxEEAYvFgp+fH8OGDaNVq1aIokhOTo4USZWWlsb58+c5ffq0tJ67uzsNGjSgT58+WK1W8vLySElJYffu3ezevRu1Wk2HUY/i4uOPj5cX7m5uaDQadDoder0O9ytpNDLh5s/04qJiLGYLHh4eODnJKdAUUFxUjCCAl7cXMkEg+3I2FrO9z+Dq5UXb3gMoTInn999/R3fFQ00ul9OiRQspLe9OpDw5uDF169blySef5IsvvuDrr7/mxRdflEzAyyYeAB544IFq9/vUajXh4eHExsZW6h5W0yiVSp555hnef/99lixZwquvvlrp6zA2Nhar1YqPjw+XLl3CarXeFt9Ui8XCsmXLOHbsGD4+PkybNo3atWtXqa2ydOFbpe7dCEEQaNmyJWFhYWw6cYFSq4hJV2r3j7JaMZlM+Pj4EFQniOysLEpLSzGZzOTk5qLXG/Dy8sTNzQ2ZIMPb20dK6SsToDw9PfG54jWVn5+P1WKlIC8fFzdXEL3I1Zmo7Xpz8a9OnTq88MILfPLJJxw4cACDwcDjjz/u8LR14KCGcIhSdzE6s5XkvCJydCYQwbkCBqIyQUAmCMixP/TNNpGzGh05OhMt/NzxcXG+6fo1iSiKZGZmSml5ZbOyZX4VkZGRREREVPkh6MCBg9vLoEGDOHjwIFu3bqVHjx6VnrGNj48HKp66J4oiP/zwA/v376dhw4ZMnTr1P1tN09PTkzFjxrB48WK+/fZbJk+eXPl0gcmT7cLUxo1/Lisqsi//7jt7Ot8VQkNDiY+PJyUlhc6dO1eoeScnJwRBqH6klL0xu2A2bdqfy3Jy4IcfoLIpjA6uIT8/HwAfHx/A/hyuXbs2tWvXlsqdWywWMjMzy/lTJSYmkpCQILXj4+ODj48PBoOBEqMZi1xJoUaDxmLGxUWFq9oVV1dXigoLKSosorSkBC8vryupt9dev1ablcJCLU5OMtSuarKzszCZzDg5yVAqlRQVFmKz2W0KFHI5giDDaDAgKlTExifg4eZK27ZtCQ8PJzQ01BFdfZcRHh7O6NGjWbVqFV988QUvv/wyHh4eREdHc/78eaKioggLC6uRbXXo0IHY2FiOHj1621Pebkbt2rUZO3YsCxcuZOHChbz00ksV9mU0m8388ssvODk5MXbsWGJiYoiJiZF+ozWF0Whk4cKFJCcnExAQwLRp0yoVzfxXKpu6dyO0JhsKN3d8gBJBpLi4GJPJhE6nw2Kx4Obujo+PL1arDVEUpedPfn4BRUVFeHl5oVarcVY4E1C7NiWlpWg1GrTaQkpKSu3CVmAQBZoCSktK0ZeUIgpOxJ4vZkDLxrd8xvr7+/Piiy8yb948YmJiMJlMPPXUUzVSpdiBg/86jpCUuxSNwcwfGQVcLjUhF2So5E6VNhAVBAFnJxlKJxlFRgvRWVouFelv0x7bsVqtnDp1ip9//plXX32Vd955h99//52srCxat27NuHHjmDt3Ls8//zz9+vVzCFIOHNzFeHt7061bN0pKSti9e3el1hVFkbi4OHx9falTp84tP2+z2fjuu+/Yv38/jRo14tlnn/3PClJltGnThvbt25OUlMSBAwcq34AgwOuvw19Fpuxs+PHHcouaNm0KUKkUPkEQcHZ2rplIKYAuXeCv1Z6++caeivgvYerUqYSEhCAIguS3VsaWLVto27YtERERdOzYURJ1K0qPHj1o3LixVBzkagqu+HX5+vqyZ88etmzZIr2XmZlJt27dkMvl1KtXD41Gw+zZs1mzZg1PPvkk+/bt45577qFt27bIZDLS09PJy8vD1bcWgpMcs8nA0jlvcXTvbnJzc8jPy0fm5IRSpcRqs5GfX0BmVhYGg57pDw7nwLZN0rYLtVpsNhvOSiX3hNYlPy8XUbRhsVgpKirGYDRisVoRELBabVisFg5uWkthXi7TXpzJ7NmzGTNmDBEREdcVpN566y2mXRE6v/nmG0aMGAHYy94/8MADlTq/DqpG79696d69OwUFBXz55ZeUlJSwZs2aGq8q17JlS1xcXDhy5Mh1fwNVoaq+Qa1atWLAgAFcunSJlStXVnh/tm/fTn5+Ph06dOChhx7C2dmZLVu21NjxAOh0OubPn09ycjL169fn+eefr5YglZeXR1paGk2aNKm2V1t6sR6bCHKZPeIpKCgIT09PnJ2VGAxGNAUF5Ofn4+rqilKpxGq1Ipc74eHhjsViJTc3j+zsbAwGPSDg5upGUFAQ7u5uWKwWcnJyyM/Pw8vLC3//Wjg5yTAbDeTpTCxZ8R3FxcW33EcfHx9eeOEF6tSpQ0JCAgsWLJAqgztw4KDqOESpuxCNwcyxLC0Giw2Vk6zaaXcyQUDlJMNmEzmRW1zjwpROpyM6OpolS5YwY8YM5s2bx65du7BarXTv3p0pU6bw8ccfM2HCBDp27PifMCt24ODfwsCBA1EoFGzbtg2DwVDh9dLT09FoNERFRd2yY2+z2VixYgUHDx6kSZMmPPvss6gcKVsAPPTQQ3h5ebF69Wpyc3Mr34BcDh98AH/1NvnLd1m3bl1cXV1JSUmp1ABILpfXnCglCPZIqauvF70e1q2rmfbvAkaNGsWBAweoX79+ueUajYYxY8awYsUKEhIS+OijjxgzZkyF2z1z5gxnzpxBqVSyd+/ea97Pz8/H2dkZpVJ5jSgVFBTE/v37pdcLFy7kjTfeIC4ujjZt2nDy5EmGDx/Ok08+yaxZs/j444+ZOnUqHbr1wNlZgUIu5/GX3qRF2/ZYrFb0eh1ajYaiwkLMJhNms5nSkhKysrIwmU1YrfY0PLPZRHFxMWazhaKiIsDuT2YwGNAb9IiIOCsUODs74+buhl8tP4Lr1uWPrZu4nH4Jlad3lUWDtm3bSuljDm4vgiDw4IMP0qxZM1JTU5k5cyYFBQX06dOHWrVq1dh2FAoFbdq0ISsrq5y3WFWoCRFoxIgRhIWFcejQoXK/rxtRVonQ2dmZkSNH4ubmRrdu3cjMzCQxMbHa+wNQWFjI3LlzOX/+vGTgXd2KtjdK3ausyC6KIvl6E/NfepY1yxcBIJcrqFXLn8CgQDw9PREEgaLiIjQaDTKZDCe5nNLSUgRBoE6dOri7u2EymVg0510+mvkcJpMRmcwJHx9fAgMCcFY6s/HH71g6dw4ms5nEQ/v4/OVpOCkUHI1PpG3bthw/fhytVsucOXNuuK8eHh7MmDGDkJAQTp06xfz586U0YgcOHFQNhyh1l6EzW4nN1mK02mq0gl5Z1JSIyIm8YnJ11VP18/Pz2b17N/Pnz2fGjBksWbKE6OhofH19GTJkCK+88gpz5sxhzJgxtGzZ0hHa6sDBPxQvLy969OhBaWkpu3btAkBvsZJZYiAlv4ToTA37LuazNy2PfRfzic7UkJJfwvEzqShd3W+Zumez2Vi+fDmHDx8mNDSUKVOmOFJwrkKtVjN27FiMRiPLly/HZrNVvhEXF/j0UygzTA8MhL9EKAiCQNOmTdFoNFKqV0VwdnaumfS9Mpo2haFDyy/7F0VKde/eXfLVuZpz587h6+srGSN369aNixcvSgO+W7Fs2TIeeeQRnnjiCZYuXSotv3DhAl5eXqxZs4ZffvmFL774goULF/LDDz8QFRXFO++8I30G7JFc+/fv55VXXpHSOAVBQKvVAnDy5Enuu+8+HnroIZ5/ahx71v5C3bp1mf/iFM4lxlLLz4/ko4f4ePozvD9xHO889Sgx+3ZhMpkoKSnBZDKTnZVNVlYm2dnZFBYWodOVoistlfbZ2VnJW+MeZPvP3/PhtAnMfGgEW1auwFXtyuZVKzmdGMeS99+gf5eObNpkj7qaO3cu7du3p3Xr1gwcOJC0tLSbnq89e/aUSzVatGgRTZs2pXXr1rz77rvl+l7R0dH07t2btm3b0qpVK1avXl3u3L755pu0adOGxo0bS/sD8Mcff9C1a1fJquD3338H7ALi4MGDadeuHRERESxYsKBC3/E/GScnJ5566im8vLzYvXs3eXl5Va5OdzPK0twOHz5c421XFplMxhNPPIG3tzc//fQTqVf75V2HNWvWYDKZGDRokPR77NevHzKZrEaipfLy8vjoo4/IyMggIiKCqVOn1sjkT1nqXuvWraVlVRHZdWYrZqt4nSRfUClVBAUFEhgYhJurq13oLi3FarFgtdrIyclBRMTHx5egoCCcnRVYLFaysrLJy8vFbDHj7KwkMCCAUY8/xT0P/w+tRkthYSFyuRwXFzUt2nWkZ8+eLFq0iIULF95UlAJ7QYnnnnuOpk2bcv78eT7++OMKRVo5cODg+jg8pe4iRFEkOa8YvaVmBakyBMFukG602kjOLaZTXUWFK/OJosjFixclf6iyWSiZTEZoaKjU6fq7zCUdOHBw+xgwYAB79+7lSGIy/pEdyDdasdj+7CDbgzkFQKTYBDk6EwafOrR/YBw6z9rk6Uz4uiiuLcxgs7F06VJiYmJo1qwZEydOxNn5zvne/VNo1qwZPXv2ZM+ePWzfvp0BAwZUvhEvL/jqKygosP9/HXPWpk2bEhsbS0pKSoXNeRUKRc1FSpUxdaq9+t7p0+DnB/fdV7Pt34U0adKE/Px8Dh06ROfOnVm3bh3FxcVcuHCB1q1b88YbbxAUFMTTTz99zbpWq5UVK1awa9cu/Pz8ePvttyksLJTM8QsLC3F1deXll19m6tSpaLVatFot8+fPByhXhe+zzz4jISGBadOmSaluZVgsFoYPH87bb7/Ngw8+yJGMAs6lZ2E2WxARkQkynJ2VdOrTn74jRmG2WMhMS+WNJx4hvH0nBEEGoojRaCQzM1OqGCwIglQZT+nsjMJZAYgUagp49YtlFGs1zLh/KFHde9Gqex9CQlcy+NHxNGlQn2PHYli+fDmpqamMGDECJycnYmNjGTBgAOPGjePgwYMYDAbmzp1LTEwMZ8+eZd68eZw9e5bc3Fw+/fRTsrKy+Oqrr3jxxRfx8vJi4xUPtq+++gq9Xs/8+fOZPHky3t7eFBcX8/TTT5OWlobNZqOwsJC8vDymTp1KQkIC48eP58MPP6S0tJSXXnqJqVOn0rx5c2w2G7m5ufz444+89tprTJkyhTp16mA2m3n55ZfR6XQ0adIEQRCk+2TZ/3/9u9F7lV0HkAzG79R7zs7OWK1WSkpK2Lp1K61bt67QehU9rsDAQFxdXTl06BCDBg2SfO8qci5qus8N9mIBTz/9NB999BGLFi3i1VdfvW5k0vnz5zly5Ai+vr7069dPWu7t7U3Hjh05dOgQZ8+epUmTJlXaj8zMTObPn09hYSEdO3bkscceqxGD7vz8fC5cuHBN6t7NRParxaurKTZZsIpiuUDZFfM/5OLZ0xj0ejIvXsCnlj+vf7EEDw8P4o4e5odPP8JkNGAxmegycAiTXn0buVyBWu1KVloqc2dMpCDnMrXr1uPZ9z6kbv0Qfl3yFcWFWh6aPB2r1YbRYMRsNmETbWzatIl77rmHL774gqKiIkJDQ3F3d2fhwoU88sgjnDx5UrpOOnfuzOuvv86UKVNYtGgRSUlJfPTRRzz33HPVSod04OC/ikOUuotILzaQozOikNW8IFVGWcRUidnK6YISWta6cf632WwmJSWF+Ph4EhISpJlStVpN+/btiYyMpEWLFv953xcHDv7tOLmo6fXoUxhkzlzUluCqcrmpcG6xWtAVFeLm4UFmiZHsUiN+Ls40r+WOq8L+2LFarSxZsoTjx4/TvHlzJk6c6IiovAkjR44kOTmZ33//nRYtWlw32uaWCAJcPXEQHw9vvgk6HUyeTOiV9IuUlBS6dOlSoSadnZ1r3k/Dy8vuJZWRAQEB9kivfzmenp788ssvvPzyy5SUlNCpUyeaN28uiTXvvPPODdfdtGkTISEhkmF03759WblyJc888wxgFw6bNGmCj48PJpMJo9GITqcjLS0No9HI2bNnsVqt7N27F4PBQF5eHvv370er1Uopu5988gm5ublkZ2dz+PBh9u7dS4v+w/Gt34jMzExMRhNabSG5ubmknkrmt6Vfocm9jMxJTmlRIZrcy/jUDgSuDP4FQQrVl8lk2K5Egeh0ehQqPaIIHfoMQBRF3Dy9qBVUh5yMDLz9/EEUEa+IW4WFhSQkJJCdnc1nn32GeOU9gIyMDIqKijAYDFy4cIHc3FxKS0s5ffo0GRkZGI1GkpOTSUpKIiAggIsXL3Lx4kVpQBkXF8fFixfJzs7mww8/lM630Whkz549V6oFOmE2mzl06BAmk4nLly9z4MABLl68iFqtJicnh5ycHGldjUZDWloa7733nrTMZDKxefNmzp07V+Xr559AYWEh8fHxKBQKMjIyeOWVV4iIiKi2D9FfSU1N5dKlS2RkZFRaHCgTqfLz8zlx4gRpaWns2rWr2qJccXExhw4d4tixY3To0AHZlX5+2ToHDhxAq9XSrl07Pvjgg3LvFRcXExcXx4wZM+jatWulhcb8/Hz27t2LyWQiNDQUg8HAkiVLakRoTEhI4Ny5c9SuXZvVq1dLy3U6HVlZWcyZM4ewsDCio6MpLi5m9erVZGZm8v333+Pr68vgwYOldSxu3pi8AzGbzRgMRoqKizAajZyIjeHjn37Hw8uHuS9O5bcVSxj9xESahUfw0vyF6A0GdKWlfPHqdFp16krn3n0BOHEsmq8370Ht4cm8V2bwzbwPGffCa1f8psDX1w9PTw9kMnvxhJy8ApydnXn88ccxm8388MMP9OzZk44dO9K8eXN8fX3Zvn07/fv3JzY2ltzcXAYOHIggCDzzzDMsXbqU48ePS8JUTaamOnDwX8AhSt0lWG0iZzWlIILc6fYIUmXIBAG5IJBebKC+pxp35z8vg5KSEhITE4mPjyc5OVkabPj6+tKnTx8iIiJo0qSJowSqAwf/AURR5FKRntMFpSh9aqHLy6W4QIdHnTr2qIcboNfpQBRxcVagcpJhFe3RU4XpGpr6uBKoVrB06VJiY2Np2bIlTz/9tEOQugVKpZJx48bx4Ycfsnz5cl5++WVJsKgys2ZBmffKO+8Q9OqruLm5Sb5SFZkcUSgUlJSUVG8/roezMzRo8Odrmw2qWTb+bqdXr1706tULsAsfAQEBNG/eHIvFgsFgkP70ej1GoxG9Xo/BYGD27NkkJSXh7+8viTVHjx6luLiYzMxMBEHgjz/+ICMjg/3790tVo95//30AqcLVypUrAbspelJSUrnvNTc3F7PZjCAIBAUF4eLigo+np92nysMduVyOm5srvr4+vDLrdcZOf4mOfQZQXFzMhAHd7FX4/EUEmYCrqyuNGjbE09MTk8lEUXExpSVX0vcEMJtMiKIN65VjcXFRI5crcFW7EBAQgFKpxMXFhf59+xD2wAjS0tKYMWMGTz311DXn9K233pKiwr755hvWrl3LV199xZ49e7h48SKLFi3i008/JTY2lq+++gqbzUZGRgYrV67k888/Z9OmTWg0Gvbs2SMJXmV/Fy5cYNOmTcydOxdRtFcK++abb5g9ezZbt25Fq9Uya9ascuucOnWK/fv3c/z48Wvau1pQq6n3ACnl9+98z2azsXr1aurVq8eIESMoKipi586d6HQ6+vfvj4eHR41tr0mTJqxbtw5XV1cpKqey5zEzM5NLly5Ru3Zt6tevf8v1btVevXr10Gq1XLp0iZMnT9K0adNy4mlubi7e3t6o1Wo0Gs01bbq6unL+/Hn8/PxQq9U3Paar0Wg0JCcnY7VaqV+/Pk5OTtcUWKgOcXFxFBcXc/HiRS5fvlzuvZ49e/LZZ59hNpvx9/fH29ub48ePU1BQgKenJxaLRUppBajTohWNu3hhMtqr7WkKNOj1elq06YDFZr8vBTcOJe3MGXu1PU0BP305j4tnTiGKoM3PJSUxnvphzTEajXTo2RefWvZiSqPHT+CNCWORy50wGIzoS0soKrKn7ilVSlxdXUEmo7CwkG3btjFq1Ch++uknwJ4KeurUKe69914WLFhA//79+eKLL5g4caL0jJTL5Tz55JN89913HDp0SBKmAgMDa+xcO3Dwb8chSt0l5OiM6M3WCqfTVRe5TMBgtZFRbMDbUipFQ509e1Z6qIWEhBAVFUVkZCSBgYG3LXrLgQMHdx+iKJKSX0JqoQ5RBBe5HJOLC4WFRRQVFUueF9dDp9cjCKBycbGn5gjgJNhTh5Nyi9mVkkhsbBwRERFMmDCh+uLKf4SGDRsyaNAgNm3axPr167n33nur1+BfzM6F2bPp0b07G7VacnNz8ff3v2UTCoWiZj2lrse338LChfYIqg8+gPDw27u9GsBms5UTkq4nJu3fv59z585Jry9fvoxSqcRgMLB582b8/PyYN28eFovlhtvR6XTExMTw8MMPS15soijyww8/EBcXJ0WhuLi40LRpU0JDQykqKiIrK4tBgwbh4uKCRqNh/fr1TJw4EZVKRXx8PA899BAjR45EpVKxePFiZs+ejZubGwcOHKBevXo89NBDnNWUcvRMGgH+/nZfFrULzkolJUVa5C5q0tPTObJzK7qSYhQKObVq1cLFRY1/7dp4edkjWJRKFbWUKmr52aMK6terBzInBEGGANL5sljM5Oblc/HiRQS5HE1+HudOnkDm78PgwYP57LPPGDVqFD4+PpjNZpKSkmjVqlWFvqvevXvzwQcfkJeXh7+/PytWrADsUYA9evTgmWee4cCBA/Tta4/AiIuLo3nz5lLRlrJzXDZZ5+Pjw8CBA5k+fTonT56kW7du2Gw2tFotXbp0wcvLiy1btjBu3DgAzp49i4+PDz4+PhW+vv5pHDp0CLVazahRo3jyyScBCAsLY9OmTaSlpfHSSy/VaNS9Xq8nNzeXcePGVSklPCEhgaKiIgYMGMDIkSNrZJ/MZjMfffQRaWlpjB49mtatW2M0Gnn99ddxdXXl1VdfJTg4+LrrXrhwgdmzZ9OuXTueeOKJm26nTKSKjY1lyZIldOrUidGjR9OzZ88aFT4LCgqYNWsWISEhUlTmjdYxGAy0b9+el1566YYin0aUcxkVKhcV7u5u+Nf2t4tFNiv+/vb7g4enBwqFAi9vL1bMnYWrhycvfrYEBIFl77+JxWLGYrag1+sp1ZWi1Wpx93AHBGQyJ4KCglCr1Rh0pWg0WjRaLVaLFZVKRS0fX1xcXEhPT+fkyZMAjB49mg0bNqDVaikoKOCPP/7g8OHDrFu3jrlz55Y77zKZjMceewylUsnu3bv56KOPePbZZ68pauHAgYPr4xgJ3CVcKtIjYo9iuv2ImExGjCYzMbk5HPphMVazCYVCQXh4OBEREUREREh+FA4cOPhvIYoiKQUlnNfqcBIEFHK7WO7h4UFxcTHFxUV4eLgjk10bMWmz2TAaDKhUKmRXRVMJgoDSSUaeRoNz7WA6D7uPh/v3dAhSlWTw4MEkJiaydetWIiIiaNSoUdUbe+IJuDotzGajx5YtxIWFkZKSUiFRytnZueY9pa4mJwcWLLBHSuXkwIwZsHYtXIkWqElEUcRkMkki0Y3EpKuXX094MhgMNxTq9u3bx6VLl9DpdLz00ksoFAoefPBB6b3s7GzAXg3xgQcewNvbG5VKxdatW/Hz82PIkCGoVCpcXFxQKpX8/PPP9OzZkzfffFNarlKpcHV1xWq1Mn36dL7//ntatWrF5MmTadSokTTQfuuttxg5cqTkL1NWlEClUuHl5XVNWpVcLuf3339nypQpvP/++9gQ6H3/owx58BEsFgt5eXmkpqZy7xOT+PLNmajd3GnRpj21AoMIDq5Hbf/at+zjqNWuuHl4IpfLCQoKIiioDjq97krKnz3VrfPAoaxZvICf5n9Am9ataNiwIYGBgURFReHs7IyTkxNPPvlkhUWp8PBwXnvtNbp06YK7uzsDBw6U+j/e3t5s3LiR559/nhkzZmA2m6lXrx5r1669aZve3t789ttvzJgxg+LiYmQyGe+++y5Dhw5lw4YNTJs2jXnz5mG1WvHz85Oi1P6NGAwGfvvtNxQKBfdd5Q83bNgwsrOzOX78OF9//TWTJ0+W0sSqS4cOHfj1119JSEigbVmBh78ZhULBhAkTmDVrFt988w1BQUEcPnyYwsJCunXrdkNBCpDSc2NiYhg+fPhNU8MEQeDQoUN89913CILA+PHj6dixY40fT0JCAmq1ml69ehEUFHTN+1lZWVKk0GuvvUbfvn3p3bv3DdvLLjGQn12Ik5MTCoUCF5ULCoVCMiIHEUSwmE1oNVpKirSEhNktRLS5OZxJOE6XPv3w8fFGJpORcPggF1PP4+Xry5pvlhDVqSsg2Kt5urrh7eMt3fMLi4qwmAz4+vry3HPPsXTpUoxGI+vWraN///6cO3eO5ORkGjZsSP/+/cuZ0V+NIAg88MADqFQqNm/ezCeffMKUKVNo3LhxDZ11Bw7+vQjiX2M9HdxxzFYbu9LyQATFbYqUEkUbeoMBvU6HXq/HarUhyGQo1a5YL5ykZaP6NGvWzFH1yoEDB2QU60nIKUKGcM09SVuopVBbiKenhxTtcDWlpaXk5eXh6+uDm9ufhq6iKJKbm4Neb8DV0xN3d3ci/D2p41796j//NTIzM5k1axZeXl688cYb1btvf/EFLF8uvTSZzZzPyyNu8mQefPnlW66+cOFCYmNjWbhw4e2JptVo4CrjXwDGj4erZubL0tuqKyYZjcZr0l8qgpOTUzlB6Oq/vy4rE5Out1ylUtXYoPxqyqpbzpkzp8YMeDUaDUeOx6LxDMKgN6ArKcJmsyGXy1EoFHhe+Y07O9dMn8Jms9r7MHo9FpuI2WRk0+cfUKjVoFQqEQQBd3d3XK5EZ6pUKkJCQmjQoIH0dzPvouLiYsmA+tNPP2XLli1s3ry5Rvb9v85vv/3Gli1bGDx4MMOGDSv3nslk4uOPP+bChQv07NmThx56qEa2qdVqmTlzJuHh4UyaNKnS6yckJPDFF18wcODA6kek/oXk5GQ+++wzPDw8KCoqQqlU8t57713XAP1qTp48yfz58+nevftNK9nt2LGD1atXI5fLeeqpp25ZAbeqfPDBB5w/f/6G95Unn3yS/fv3Y7FY6NSpE59//rkk5FyvcEOpycL+SwV88uJUmrRoyX2PP82K+R9SXKjlsedeori4mK2rVnIh5SST3p7N2ROJLHr3NWROTtRr2BhRFInq1OXKeh9wNvkE2oJ8yeh8/Mw3qRUQwPpvl2DQ6Zj0xiw2r17J3k3ree7jL9iz6jvWrVjCrl27aNKkCUOGDOHIkSPI5XKmTZtG06ZN2bZtG0uWLGHUqFHce++93HfffTd8/m7evJm1a9eiUCiYNGkSzZo1uy3fgwMH/xb+caKUwWDgwQcfJDk5GRcXF/z9/fnqq68kFfro0aNMnToVo9GIwWBg3LhxvPjii7ds99KlS0yaNEkq2erk5MQnn3xyU1W/umi1WhYuXMhTz07nSKYGuUyG05VOfUpCHB/PnAZAcaGW0uIiAurWA6DP8FE8MGHyLdu3Wq3o9Tp0ej0Gvd04FEChkKNWq1G5uCA6KWju504Dr5qfdY6Li+PUqVPSLPDNKDsXM2fOlJY98cQTjBkzRvLYcODAwe1Hb7FyKL0Ao9WG6jrecXbPlXREoE6dOjj9JVoqLy+X0lIddevWwcnJHgUlijZycnMx6A24uqrx9fPDaLWhdJLRpa4PKrnDo66ybN++nV9++eWWA5RbIor2aKn16+0vgfT0dErUasL++AOhdu2brr506VKOHj3KggULKuULZrVabygS/VVMarlkCX4pKdhsNkSbDbNMxrf33ku+kxN6vV7ylKkMZcJFTYhJd3u039y5czl37hxffPFFtUSv4uJijh07RnR0NHFxcWRlZdH1gbE0jmqLoaQItYsL7u4euLq5louSrElEUcRgteIpmtGciiMpKYkLFy4giiI6nT2iqiytzmKxlDteX19fGjRoQMOGDWnQoAHBwcHSNTtp0iQOHjyI2WwmKCiIRYsW0bBhw9tyDP8lcnNzeeutt3Bzc+Odd9657gC+sLCQ2bNno9FoePDBB2uszzdv3jxOnz7Nhx9+eEvB56/cTlEK7MUJZs+ejSAIvP766+Uq7t0IURSZPXs2GRkZvP/++9dkM4iiyLp169i0aRMqlYpJkybRtGnTGt93sIvSM2fOpFGjRhUaY1UEURTZlZaH2Sri7CTDbDFTXFRESWkpos3uR+fm6oarmyuaggKMRhMqlZJa/v43ud9cKYhQVIRep5eWOjsr8PDwQO3qCiLoLRZKz51gz++/YrPZCAsL495778Xd3Z1Vq1YRFxeHIAjYbDZ27dpFnz59APDz82Ps2LE3rIq4e/dufvrpJ8lzKioqqkbOlQMH/0bu7p7UDXjqqacYNGgQgiCwYMECnnjiCfbs2SO998477zBs2DAKCgoICwtjyJAhNG/e/KZtPvPMM/Tp04d169YBkJeXh06nu23HYLFY0Gq1zJkzh4eemYpNhKtvqaERUSzetAeALb/8yMFtm3l38bfXtGO1WHCSOsQiZrMZnU6PXq/DaLySPiCASqnExUWNi9oFhfzPgYPeYqXIWPOpFxaLhbi4ONauXVthUWrOnDnlRKklS5bU+H45cODg5pzKK8FgsaG6QdSmTCbDw8MDrbaQosKicjOkIiJ6vR6l0rm8IJWTg8FgxNXVFT8/X0BAKZNhsNg4mVdCqwBHqnBl6dOnD/Hx8ezbt4/IyEhatmxZtYYEAV59FQoK4OBBBOzpW7biYoxPPYXqu+/gSoSJzWaTJnzKxKPc3Fzy8vLYt28fgiDcMq2t7K8yKX9xPj48odMhE0UEmQyZINA5NpbDgwZVWUxydnb+z/gkFhQU4OPjUyVBSqfTERcXR3R0NCdOnCAnJ4esrCxkMhm1atXCkp+N2sUFXy8PXJRK4PaeU6soIhNktKgbgHeToQwdOpSioiKSk5NJTEwkOTlZ6rs5OTnh6+uLm5sbMpmMvLw8YmJiiImJkd4PDg6mQYMGPPbYY7z55pvUqlXrP3Nd3Al+/fVXLBYLI0eOvGFEiaenJ5MmTeKjjz7i559/xt/fnxYtWlR72x06dODUqVMcO3aMnj17Vru9mqRhw4aSkGq1Wiu0jiAIDBw4kEWLFrFz585yXleiKPLjjz+yd+9eXF1db7uX0fHjxwFoc6Via00gCAJ+Ls5c0JSgzdei19s9D+VyJ9w93XFzc0cURS7nXMZsMuPiorrye73ZfU1AqVThX0uF2WKmqKiI0pISTCYzeXn5yLVa3Dy8UKldGNK7J73bRLJu3TqOHj3K7Nmzad26NSNHjqRr166MGDGC3Nxchg8fTnh4OKdOnSIvL4+PP/6Y3r17M2LEiGv8y3r16oVKpWLFihUsWrSIsWPH0qFDhxo7Zw4c/Jv4x4lSKpWKe+65R3rdsWPHcmZzgiCg1WoBexqJs7Nzhcwj09PTqVOnjvTaz89P+v+tt94iOTkZvV5PSkoKTZs2Zc6cOcyYMYPU1FTatGnDDz/8gEwmY+XKlXz66aeYTCZsNhvvvfceQ4cOBeyVKCIiIoiOjsbFxQVnZ2eKi4sZ2LUjFgQWrd95y/3MTr/IU/f0YsjD/+PYgT30H3k/dRs14ZuP52Aw6LGYzfQf/TA9h96L2lXN4vdex8VFTebFC+RkZtAgtBmvfbYYhbMzh3ZsZencWSicnHAWRGbNmsXw4cPp2bMn4eHhHD58GI1Gw/Dhw5k7dy6CIHD27FmefvppcnJykMlkvPXWW4wYMUI692+88QabNm2iZcuW7Ny5k8LCQqKioujYsSMLFy5kzJgxpKSkYDKZCA4OZunSpQQEBPD0009TXFxMVFQUcrmcmJgYevbsybRp0xgxYgQ5OTk8/fTTnDlzBlEUmTJlChMmTADsufaPPfYY27dvJzs7m/Hjx/Paa6/d8lw6cOCgPMUmC5d1RuQy4aYDM3cPD4qKiikuLpbKooM9ktVmE3GRqgNdJUi5ueLnaxekwH6/kMsELuuMlJgsuDn/4x5HfysymYxx48bx9ttv8+233/Lmm2/aTWH/Qplnxq3S2kydO9MyLg6PtDQMej06vZ7sQ4fI69mTX3v2pNRikaqxXs25c+fIyMjgu+++u+GgU6FQSGKQl5dXlSKT3D7/HPm6dZLkUVeno9e990JYWE2e1n8dNpsNjUZTKU8Tk8lEQkIC0dHRJCUlScboer0eLy8vmjVrRr169ejevTsdOnYktsBIscmCKNo1ztuFKIqYbSK+Ls54Kf+8X3h4eNCxY0c6duyIzWbj/PnzJCUlkZiYSHp6Onl5eQDUqlWL9u3b4+7ujtVq5dKlS6SlpXHhwgV2794NgKura7mUvwYNGkjVzhxUjlOnThEbG0vDhg1p3779TT8bHBzME088wZdffsnixYt56aWXrutTVBlatWrFypUrOXLkyF0lSpVVIgwNDZV82ho2bFihqKaoqChq167N3r17GThwIGq1GqvVyvLly4mOjsbb25tnn332tld9O3bsGIBU3bC6GI1GDh8+zOGEE9Tt2BuL2YJKpcTd3f3K70/AYrVw+fJlLGYLalc1fn5+CJUQwRVyBb4+vnh5eVFSbO+/WCxW9CYTmedOURpbQp8+fRg/fjz9+/dn7dq1HD9+nLi4ODp37swff/zBkSNH2LJlC4mJidSuXRubzUZubi47d+4kMTGRcePGXRNh2alTJ5RKJUuWLGH58uUYjUa6d+9eI+fNgYN/E//4UcCnn37K8OHDpdfLly9n+PDhvPbaa+Tm5rJo0SICAgIAu/dFZmYm71xt7HqFl156ifHjx/Ppp5/SsWNHhg8fXu6mERMTw7Fjx/Dy8qJnz5488cQTbN++HRcXF9q2bcvmzZsZPHgwAwYM4KGHHkIQBC5cuEDHjh1JS0uTOuunT59m3759KBQKLly4QFRUFL/tOch5TcWjskqLiwhpEspTM98AICsjnRfnL0KhdMZqMvLSmPsYMGIUtfxqIZfLOXfyBB//+BsKZyXPPTCU/Vs20HvYSJZ/PJvJ735Ep06d6BjkRVFRkbSN5ORkDh06hNlspnv37vz44488/PDDjBkzhscff5wJEyZw5swZOnbsSKtWraQZGScnJ6KjowGk8stXG4LOnz9fMmicM2cOb731FgsXLmThwoVERUXdsFTtlClTCA0NZc2aNeTk5NCmTRsiIyMl80atVssff/xBXl4ejRo1Yty4ceVERgcOHNyajGI9Vpt4wyipMmSCDA9PD7QaLUVFhXh724V//ZUIBbWLC7YrgpTRYLxSKv5PQaoMuWCvAppebCDM1+22HNM/FYvFUiGPJD8/P3bv3s2ECRNo167ddSOTKpqlv6tBA/538SKeFgtWqxWT0UhAVhZDjxzhwNChuLi6XiMmxcTEEBcXx5gxYwgMDLxuZJLTddJAK83kybBjB1wdwTxvnr0qnyOy5YZotVpsNtuV39+NsVgsJCcnEx0dTXx8PHq9nry8PEpLS3FysletcnV1pXXr1nTv3p2mTZtKwnVzmYKYrEIsNhGF0+37Lkw2EYVMoLmf2w1Fc5lMRuPGjWncuDEjRoxAq9WSlJREUlISycnJHD16FLAb9IeFhXHffffh4+ODVqvl/PnzpKamSp8vo3bt2uVEqrp169bMNf0vxmazsWrVKgAeeOCBCkWfRUREMGrUKFavXs2CBQt4+eWXK512dzUuLi5ERERw7NgxcnNzb2oOfiNuR9TcgQMHSE9PJzIykpEjR/LBBx+wePFiXn311Vt6vslkMgYMGMC3337L3r176dOnD4sWLSIpKQl/f3+mTZt2y996ddFqtZw7d46GDRtW26MuPz+fPXv2cODAAXQ6HXK5nJB23XD3q4Wb8s+oI7PFzOXLl7FarLi5ueHr60NVozKdZE54etoLOZSU6tCbzGSciCfh4nl27txJ27Zt6devH1OmTOHMmTOsWbOGAwcOcOTIEXr16sXzzz/P+vXrOXHiBIIg4O/vT25uLjk5OXz44Yf079+foUOHlktnb926NRMnTmThwoX88MMPGAwG+vfvX61z58DBv41/tCj1/vvvc/bsWXbu/DPCaM6cOcyePZuHH36Y8+fP06NHD9q2bUvz5s3LGer9lYceeoiBAweye/duDh48yPDhw3nllVd44YUXAOjfv790823dujVKpVJ6WLZq1YozZ84AkJqaypgxY0hPT0cul1NQUEBqaiphV2ZzH3nkkWt8Nyqj9APIFQr63jtaem0xGlg2520y0y7g5OREcaGGC2dO4R9kF2W6DrgHlYt9pi8ssjWZaXbfrFZdurH4vddIHTIc9egR5XKdH3vsMRQKBQqFgkceeYQdO3YwdOhQjh8/zsGDBwFo0qQJXbt2Zf/+/ZIo9fjjj99031euXMl3331XbkBVEXbs2CHNzPj7+zNy5Eh27NghiVIPP/wwYI9wa9iwIampqQ5RyoGDSmC1iWQUG5AJN4+SKsPd3Z2ioqJy0VI6vR65Qo6Tk5ycy5cxGk24ubvh63P9DqQgCMgEgYxiPU28XXGS/bPFBZvNViOG2waDocIpHaJoT9s+duwYOp2O4OBgSRDy8vKqtGeSWqtFPXkyGQkJgN03rK7RSGebzS4MXefayM7OpkWLFtWObLgpPj4wbpzdmL2MY8dg/35wzDrfkPz8fIDrDlRtNhunT58mOjqa48ePo7tSCKW0tBSLxYK7uzv+/v74+vrSvXt3OnfufF2zcD+1kmAPFRcK9chEUfLGrEmsNnvZ+EY+bngoK+5d5uXlRdeuXenatSsWi4WzZ89KolNCQgIJV67zwMBAwsPDeeSRRwgICCA9PV0SqVJTU+1RHIcPA/bIv3r16pXzp/L29nak/V3FgQMHyMjIoGPHjoSEhFR4vT59+pCdnc3+/fv58ssvmT59eqW86v5Khw4dOHbsGEeOHGHIkCFVbqem0Ol0rF27FplMxujRowkMDOSxxx5jyZIlLF68mBkzZtzSo65Dhw6sW7eOLVu2EB8fT2pqKsHBwTz77LPVEvEqSmxsLFD11D1RFDl37hw7d+4kNjYWURTx8PBg6NChdO/enVKZM3GXC7HYbMhlMkwmIzk5OVitNjw83K+MxWrityYgV7kQ4u1B2JCBbN+2jbNnz3L06FGOHj1KWFgY/fr144UXXiAxMZG1a9eybds29u/fT//+/enQoQO//fYbOTk5yOVyBEHAZDKxdetWEhISGDt2bLlrv2XLlkydOpUFCxbw66+/YjAYGDp0qOO+4cDBFf6xotTcuXNZs2YNO3bskEKr8/Ly+O233/jpp58Ae852x44dOXjw4C09pcBewnfkyJGMHDmSdu3a8f7770uilEr1Z4Wosko7V7+2WCwAPPjgg8yZM4dRo0YB4OPjg8FgkD5bZsB5Nc5OMkTsN+qK3JyUKpdy3hCfvfES7Xv25Z1F3yIIAhOG9MZ0VZqF81UpFTKZkzTYmfjau5w6eYK02KP873//Y8yYMTc0LLzRfv11+fWOr4wDBw7w2Wef8ccff+Dv78+6det44403bnm8Fdnujb4PBw7+Sv/+/cnOzkYmk+Hu7s5nn31Gq1atbllEoSL06NGDjIwMzpw5U+4aFQQBjUZzTQnhdevWsXv3bubNm1fhbaxatYoPP/xQ8kUpY968eezevZs33nhD8uaoDMUmCyarDflN/Bmu9reTCTI8PTzQaLQUFhbh5uaK1WLlo+lPU3D5Mu9/vwYPD/cr6dPX3j/iDh/EZDTQpltvTFYbJSYLnqqqDz4qS9u2bZk7dy49evSQfJL0ej1nz56lZ8+eNG7cGIvFgtlspnnz5tx33324urreVEy6kU9SaWkpO3fuvKbyVBlKpVKKLvLz86u0AbfRaOTjjz9GEATeeuut65aqrjD+/vDFF8iHDMFUUIDZbMZZoYA1a6BWLXjyyXIfLxswmkymqm+zojz8MPzyC1y+/Oey+fOhc2e4y83G/y4KCgoAJBsDURRJTU0lOjqamJgYioqKEEVRSs20WCz4+voik8mIiIigR48eNG/e/JZ9k6a+bhSZLBTozSid7L5fNYXVJmKy2QhwVVarKItcLicsLIywsDBGjRpFfn6+JFCdPHmSbdu2sW3bNlQqFc2aNSM8PJxu3brh6elJTk6OJFCV/Z07d05q28PDQxKoGjRoQP369cv1S/5L6HQ6fv/9d5RKZaVNwgVB4KGHHiI3N5dTp06xYsUKxo8fX+WBe4sWLXB1deXIkSMMHjy4wu3crhpQGzZsoLS0lD59+kgpdu3atSM1NZWdO3eyevXqW1YglMvldO7cmffee4+AgAB69OjBpEmTcHFxuS37/FfKJohbtWpVqfUsFgsxMTHs3LmTixcvAlCvXj369OlD27ZtJTHOXRQJclORXmzAYjaQm5ODzSbi5eV5xdy9Zu4tJpsNhUygRS0P3OtEEhUZSWpqKtu3b+f48eOcOnWKU6dOERgYSL9+/Zg5cybHjx9n3bp1/P7773h4eNC/f38KCwvZuXMnVqtVEqaysrL44IMPGDhwIIMHD5aOrWnTpkyfPp1PP/2UjRs3YjAYGD16tEOYcuCAf6go9cknn/Djjz+yY8eOcp1vb29vXF1d2bVrF7179yYvL48jR44wffr0W7a5YcMGevfujVqtRhRFYmNjadSoUaX3TaPR0KBBAwC+//57NBrNDT/r4eFhNwXGiiDYqx5V5bZUXKildp26CIJAwpFDnD95okLrXTx3hvpNwhjQsS0NfNzZtm2b9N7333/Pww8/jMViYeXKlTz33HO4u7vTunVrli9fzpNPPsnZs2cloelGx1dYWCi91mg0uLu74+vri8lkYtGiRdecC5PJdI1RIEDfvn35+uuvmTVrFrm5uaxZs4bVq1dX9BQ5cCCxatUq6b7x22+/MXbsWOLj44GbF1G4FWfOnOHMmTN4e3uzd+/eCnlYDBs27IZCxY0YMWIEEydOJDExkfDwcGn5smXLeO+992jbtm2lBSmwi1I2ESrjhVwWLVVSUoyISPalNLLSLqB29+DSmZN06zeQ693VrBYL8YcPUlJUSLvuvbHZ7NuvqChVFh1U0ept1/tceno6n3/+OT/++GP581BcjFwul74/q9VKbGwszz33HKNHj5buT3K5XIou8vT0pHbt2jcVk6ZPn37dyCSVSlWtimhljB07loULF7JixQqmTp1avU5ukyZkv/ACnq++itFgsItSAIsWgZ8fXDXQLBOlKmNcXmWUSpg0Ca6ezLh40S6Y3X//7d/+P5D8/Hzp9/Lbb78RHR0tRU85OTmhVqulsvSCIBAQECBFFlUmNUchk9G6thfHsrVoDGYUMhnyGoh8NNtsWGwi/mpnImt71KjY5evrS48ePejRowdms5nTp09LXlSxsbFSREhwcDAtW7YkPDyc9u3bI5PJMJvNXLx4sZxIFRcXJ1kQCIJAUFCQJFI1bNiQgICAGvmt3+1s3LiRkpIShg8fXiWB3MnJiQkTJjBnzhyio6MJCAiocpSTXC6nbdu27N27l7S0tEpFbdU02dnZ7N69G1dX12uO57777iMtLY09e/bQoEEDKQvgeuTn53P48GEMBgNGo/GOClKFhYWcPXuWkJCQCqcJFhUVsW/fPvbu3UtRURGCINC6dWv69OlDo0aNrnlWCYJAmK8bGZoiCnV2n0pvH2883K+N0qwqZpsNEWji44b7VX6WDRo04KmnniIvL4+dO3dy8OBBsrKy+Pbbb1m7di29evVi5syZxMTEsGnTJn755Rdq1arFsGHDOHHiBGfOnMFms1FSUoKLiwubNm2SoqaCg4MBuw/u888/z/z589m5cydGo5ExY8b8J+4NDhzcjH+cKJWens6MGTNo2LChVDZWqVRy5MgRnJycWLVqFS+88II0wz1t2jQ6deoE3NxTau/evbzwwgvI5XJEUSQ0NJQFCxZUev8+/fRTRo0ahZeXF71796ZevXo3/KyPjw+PPfYYvTq2Q1So+Pz3bVXqcD3x4ut89saLfP/5xzRq3pKwqIqF1C758D0unT+Lh9oFDzdXvvrqK+m9Zs2a0aVLFwoKChg+fLhUQe+HH37g6aefZsGCBQiCwJIlS254jH369GHu3LlERETQuXNnPv/8c77//ntCQ0Px9fWlb9++ZGRklDsXERERuLm5XRMF8tlnn/HMM88QHh6OKIq8+uqrjgoWDqrE1Z3kwsJCqUN0qyIKt2LZsmU88sgjBAYGsnTp0gqJUlf7ru3Zs4fJkyfTvXt3Dh48iMViYcWKFbRt27bcOs7OzjzyyCMsW7ZMirA6evQoubm5DB48mD179jBt2jTi4uLIzc1lzJgxZGVlIQgCbdq0Yfny5df4vW3YsIF3Zn/Amyt+QZOXw3tTJ6ArKcZkNBLVsQuT35p93Q6TIMjw8PREU6BBo9GwZ/0aOvYbRO2guhzYtI5u/QYBVxdoeIxjB/bSZ/go1v/wjV3wOXSADv0GUTx8GB+99Jw0iK5Xrx6PPvroNWLStm3buHTpEjabDYVCQffu3aXvdPHixbRr144LFy5gMBho3bo1oaGh9n3IzpZSj8vSzPz8/GjRokU5oaiwsJB169bxyCOPlBOYHnjgAcLCwpg8eTIajYbp06dz4cIF9Hq95GNos9mYOnUqO3fuxNnZGblczsGDB8nOziYqKkoqwvH7778zc+ZMnJ2dGThwIEuXLiUmJoaQkJAqF25o1aoVHTt25PDhw+zbt48ePXrccp2bETR0KCvXrmVMUlL5lJDZs6F9e7iSHl0m0t2RSCmAgQPhp58gOfnPZYsWwaBBcAdSV/5J5OTksHPnTo4dO4bBYJAKrAQFBWEymcjNzcVqtaJQKGjevDk9evQgPDy8yoMjpVxG20AvEnOKuKwzYrGCUiarkkAqiiJGqw1BgGAPFc39PGpE5LoRCoWCFi1a0KJFCx544AFycnJITEwkKSmJ06dPc+nSJTZv3oxaraZ58+aEh4fTokWLcpOXRUVFkkB1/vx5Lly4QEZGBgcOHADsfdWQkJByEVXXS4f8J5Odnc2uXbvw9fWlX79+VW5HrVYzefJk5syZw/r166lduzbt2rWrUlsdOnRg7969HDly5G8VpVavXo3NZmPEiBHXmOc7OTnx1FNP8d577/H9999Tp04dScS4mqysLObPn49Wq6Vnz54YDAYSEhLuWH+4LN2uIql7Fy9eZOfOncTExGCxWFCr1fTv35+ePXveUtBKTkxgz2+/07zfMLxq+ePuUnNRh2arDYsoEuLpQojn9cU8Pz8/HnjgAYYOHcq+ffvYtWsXhYWF/P7772zatIkuXbpI/azt27ezdu1a6tatS69evYiJiaGwsFCalBdFkffff5/BgwczaNAgnJycqFOnDi+88AKffPIJBw4cwGAw8Pjjjzu86hz8pxHE2xWj6qBSHEwvoNBgRiW/czckk9WGTIAe9f1QXmVsfHXVOwcO/o089thjUrWlTZs2lYs4KuPRRx/Fx8eHTz/9FIA33niDoKCg63rTWa1WgoOD2bVrF35+fjRu3Ji0tLQroeY3Tt/7qyjVt29fDh48SIcOHVi4cCG//fYbW7duvWZ7iYmJ9OnTh4yMDBQKBU8//TSenp588MEH5USpefPmcerUKSkqsaw0/PVEqbfen8Pb3/6Kk9WM1WLBxdUNq9XK6089St8Ro+k99N5y6XtliKKNS5cukZeby7tPPcJL8xbiFxDAc/fdw/w1m1Gp3cjJTOf5+4cw/uW36DLAPkO8dvkidCUlPDxlBip3D36a9z6nYw5LBSYMBoOU/nJ1hJHFYqFWrVqoVCri4+M5dOgQ77zzDiqVioEDBzJlyhTGjx9PZmYmo0eP5vTp0zg7O9OqVSuWLVtGv3792LZtGwMGDGD37t3XiIdlBSjKBKQynn32WcxmM19++SUDBgzglVdeoUePHlgsFoYMGcL48eNp3LgxDz/8MCdOnEAmk1FYWIi7uzsXL16U2szJyaFZs2YcPHiQsLAwli9fzuOPP05qaqokSg0bNozPPvtMKtyQnJxcIY88nU7HO++8Q2lpKa+//jr+/v63XOdGiKLIzJkzaXHiBI9mZ5ePd3vlFbhSjvzw4cMsX76cZ555ppwv4W3l+HF46qnyyx57DKZOvTPbv4vRaDRSal5aWhqJiYkUFhYybtw4nJ2dSU9PlwZL7u7udOnShW7dulXY37EiiKJIerGBlPwSjFf6GQpZxVL6bKKIyWqPYlArnGjm60ZtV+Xfmt5iNBpJSUmRRKqylEhBEKhfv74URVW/fv1y+2mz2cjOzpZEqtTUVDIzM8ulhvn6+pYzUa9Xr161PJT+bj7//HOSkpKYMGFCjVRmO336NPPnz0cQBGlCurKUTWSaTCY++OCDCg384+Pj+fLLLxk0aFCN9IWTkpL4/PPPqVOnDq+99toNhd+zZ8/y8ccf4+PjwyuvvFKuompaWhqffvoppaWl9OzZkyFDhvDKK6/g5+fHG2+8cUd+Ix9//DGnT59m1qxZ171n2Gw24uLi2LVrl+S1GxAQQO/evenYseMNK7RezR9//MGKFSsQBIFHn5yAwacOeout2tGXoihitNkQgBBPNWG+Ny6Y8FcsFgvR0dFs27aNzMxMwP77j4qKolOnTpw6dYq9e/ditVqlip3JyckUFxej1WqltPx69eoxbtw4aWKsoKCAefPmkZOTQ0REBE899dQ/+vfvwEF1+MdFSv1bCXZXoTWYsYlijYan3whRFLGKIkHuLuUEKQcO/gt8+61dVFmxYgUvvfQSmzZtKvf+9YooXC/CsoxNmzYREhIiFTTo27cvK1eu5JlnnqnUfjVu3Fia8ezUqdMNI7XCw8MJCQlh/fr1DBo0iJ9//lky4b2ajh07Mm/ePGbMmEH37t0ZOHDgLffBZrOxeM47JMUcRRRFtPm5NGgaRu+h1/cGEQQZvr6+HNm9A59atXH3rYVVhLBWbTmwZSP97nsAJycnnORy+gy/Dye5HJkgoFIpsZrN+Ph4I8oV9B5wD0d3bMFqtdKlSxfuuecePD09pbSiMlauXMnnn39OcXExNptNiuYs45VXXiEgIIDIyEgUCgU2m43MzEzkcrk0c9+/f/9KD27KBpJl/lCXr/I1KikpISUlhf79+2OxWHj88cfp1asXgwcPvmbwcfjwYSIiIqRr5X//+981QmdVCzeo1WrGjh3LvHnzWL58OS+88EKVo14EQSA0NJSDWi3DOnfGa80a+xtKJVwlPt3R9L0yWreGnj3h6tTaH3+EUaPgdpqt36UUFxdz7NgxYmJipIGgTCajefPm5ObmolarOXfuHDabDYDQ0FC6d+9OVFTULU2Vq4IgCAR7uODn4szFIj3pxXoMFvu2BcDpSjEFASQ/TasoShYGLgongj1cCHZ3QSn/+/snSqWSiIgIIiIiEEWRrKwsyYvqzJkzXLhwgQ0bNuDu7k6LFi1o2bIlzZs3x9XVlaCgIIKCgujSpQtgF9vT0tLKRVTFxMRI0eEymYzg4OByQpW/v/8/wnOm7Jw0adKk0n5DN6Jp06Y88sgjrFixgi+//JKXX3650tXlBEGgQ4cObNq0iZMnT9KyZcsa2beKYrFYpEqE999//03vyY0bN2b06NH8/PPPLFu2jMmTJyMIAikpKXzxxRcYjUbuuecehg0bhiAIdOvWjZ07d5KYmEhERMRtPY6ioiLOnDlD/fr1rxGkdDodBw4cYM+ePVJ6cIsWLejTp0+FPOnK2L17Nz/99BMKhYIJEyYQHh6OzmwlOa+IHJ0Ji8Xuw1uZcZIoilhEEYtNRCWXEerrRh03VaV+U3K53F6pvGNHkpOT2b59OydPnpTSfBs2bMjo0aM5f/480dHRUrS3TqcjJydHygqx2WzMmjWLoUOH0r9/f3x8fHjhhReYN28eCQkJLFiwgIkTJ1ZIvCvDbLVRbLJgsNiwiSLClUkAd6UclVPVIlUdOPg7cIhSdwmBbipOF5Ritokob2NJ5TKsoohMgLru14bEVtRDx4GDfzplgkB+fr7U0b1eEYVbsXTpUk6fPi2lBuj1ei5cuFBpUaoyhv3jx49n+fLl6HQ6WrZsKaWpXU2nTp2Ii4tjx44drFmzhtdff53Y2Fjkcnm56m4Gg0HquPyy5Cu0+Xl8sXYLzkoVX773ernCCdfD1dWN2H27yM/O5O0nHgIRzCYjBTnZDH7oUdzd3VC5qKldO+CqY3XBYjLh7u6B3mKld/8BPHrPCXbs2MHGjRuZN28esbGx5TpUFy9eZPLkyURHR9OoUSMSEhKkyKrKnsPKdtSio6N59NFHJXHq8OHD1zUyTkpKYu/evezevZuXX36Zffv2VXrgX53CDWFhYfTu3Ztdu3axdetWBg0aVKltX03Tpk05cuQIsZ060atnT3vKXJcucJWgd0eNzq9m6lR75b2y69hshgUL4P337+x+/E3o9XpiY2OJiYnh5MmT2Gw2BEGgadOmtGjRAqPRSHR0NCkpKbi5uaFSqejcuTPdunUjICDg1huoAVwUToT6utHIW83lUiMavRmt0Uyp2YqtLFpIAJkAnkoFXioFPioF/mrlXVuJs8wrKigoiP79+2MwGDh58qQURVVWpU8QBBo2bEh4eDgtW7akbl2776dKpSI0NFS6X4uiiEajKRdNdfHiRclfCMDV1ZWQkJByQtXVETR3A1arldWrVyMIAg888ECNDoQ7d+5MdnY2W7duZcGCBbz00kuVNpEvE6WOHj16x0WpPXv2cPnyZVq1aiVNRtyMXr16kZqaytGjR9mwYQP16tVj8eLFWCwWRo8eTd++faXP9uvXj927d7NlyxbCw8NvqwBxvdS9snTNP/74Q/KE7dmzJ7169arUfUYURbZs2cLatWtRKv/P3nmHRXHnf/w1W2lLBwFRsGEXC2ADrLGlGXMaE9N7PZNc+l2KyV3KL7lLMWfaGU00RaNGjdHELmJjEZWmiCKChd4WtrC7M78/FkaJqKjY4ryexydhmJ35zuwyO9/3vD/vj54nn3ySqKgowOWYHBDiyxGTldyKWiwNArdW5ere25xAJUkSogQOSUKUJNQqgVAvPd0DDbhfQEWKIAhyme+RI0dYs2YNKSkp5OXlkZeXR1BQkOxi37t3LwBt2rRBq9VSVVVFTk4OISEh/Pzzz+zevZt7772XkJAQnnvuOT755BP27dvHRx99xFNPPXXG+8/aegdHTVZKzDbMDddT8aS6JwFQqQT0ahUB7lraGtzxd9MqApXCFY0iSl0haNUqIn08yKmovehuKUmSsIsSwZ46/C5htysFhctNVVUVZrNZtk4vXbqUgIAAuTPV6ZoonIni4mLWrVtHYWGh/BpRFAkPD2fPnj1ER0dfjEPh9ttv54UXXuDIkSNMnz692XUaHTZTpkxh3LhxBAcHU1tbS+fOnUlPT8disaDVavn+++9RCa4bGVN1Nf5Bwej0blSUFpO0cjkJ484cMltRWkL6ji38uHUPnt7e2KxWTLW1PDoukb17duPh6YUoiZSWleLp4YG7uzseXgaKjxYCrv2WHi2ga8+oU8baWAIJrgwwrVZLaGgokiS1OPevW7duOBwONmzYwIgRI1i7dm2Tzllnor6+nnfeeYcjR44wbdo0vLy8GDFiBO+++y5vvPEGAMeOHUMURfR6PWq1mjFjxnDdddexadMmsrOzmzzBHjRoEOnp6eTk5NC1a1fmz5/f6oLOpEmTyM7OZvny5fTq1avZbJKW0DhxzsnJYcSjj7q63DVSUgJLlxJgMqF2Oi+tUwqgfXuYPNmVL9XI6tWu7oANzUb+bNTX15Oenk5qaioZGRmyWBkZGUlMTAx+fn7s2bOHX375Rc7V9PLyYuTIkbz55puXrSxEo1LR1uBOW4Mrv8Uuitidknyvo1O3Tij65cDNzY1+/frRr18/V9nikSNyWHpeXh4HDx5k6dKl+Pj40KtXL3r16kX37t3lYGpBEPD398ff31+e7DudTo4cOdIkRD0rK4usrBNNbIKDg+UA9Q4dOtC2bduL4nprKRs3bqSoqIiEhITzvt6ciVtuuYWSkhJ27drFV199xRNPPHFOLtCQkBAiIiLYtWsXNputxU6UC53Em0wmVqxYgUajkbtyt2Sfd955J0eOHGH27NnodDr8/f255557GHLyNRhXg6dBgwaxdetWDhw4QJcuXS5ovGeisete//79ycrKYt26dfJnMiAggOHDhxMfH9/ih3mNSJIkRxV4enry17/+9ZTsr0b3ZaiXnqI6G4U1FqptDhwNpb5N1sXlwGwsG25rcCfc4I5B37p/H+Hh4dx3331MnDiRDRs2kJSURGlpKWvXrsXT05N+/frJLilJkggICECv13P06FGKioqw2Wz885//ZOLEiYwcOZJnnnmG//73v+zfv59///vfPP30003zHIEqq50DlXWUWepxipLLeaoS0KpUCA3nSWpwnYqShNUhUlhj5ajJikGnoYOvJ2Fel7ccWkHhdCii1BVEB18Pis02qqz2i2q5tDlF9GoVPQO9lQuTwjVFdXU1kydPxmKxoFKpCAoKYsWKFQiCcMYmCnD6TKlvvvmGMWPGNBGxVCoVU6dOZfbs2aftTnmheHt7M3HiRH7++WcmT57c7DobN27kP//5j+y2ef/99/Hx8WHQoEFMmDCBXr16ERoaytChQykqLUMCbrn3Id584gHuHxNPQHAI/YcmNrvtk1m9eAExCcPx8nYJSG5u7ri5uTNq4q3s3LiasbfdCYC5zoy5zoygEugRO4jVi3/koQnDGXzdBGK6dWb63befMtaT6d27N1OnTqVnz54EBAS0OOtDp9OxYMECHn/8cZxOJ7GxsWcUC00mE3379pUn9gkJCWzdulUez3fffcezzz5Lr169EAQBT09PvvjiC5xOJw899BB2u10uQxw/frxs3QfXZPJ///sfEydORK/Xc9111+Hl5XVeXapOh1ar5b777uO9997j66+/5pVXXjkvQSIwMBA/Pz/279+PJEknvi9EER54AI4fJ8Bm4w67Hes5tn5vFR56CH79FUymE8v27v1TiVIOh4Ps7GyMRiN79uzB1uBaDA0NJS4ujh49enDo0CE2bdrE8ePHAZdQEh8fT2RkJHPnziU2NvaKyinRqlRoL39VXqsjCALt2rWjXbt2jB8/nrq6OrKzs+Wyti1btrBlyxZUKhWdO3eWXVShoaFN7sXUajURERFERETImXdms7mJSHXo0CF27Nghfz9pNBoiIiKauKn8/f0vyT1ebW0tK1aswM3NrUkpdWsiCAL33Xcf5eXlZGZmsmjRIqacY8fNgQMHsnDhQnbv3n3JgsGXL1+OxWJh/Pjx55Tbptfr6dmzJ4sWLUKlUvHhhx+eIkg1MmbMGLZt28Zvv/120UQpk8nE3r175YdBRUVFAHTp0oWRI0fSt2/f8yoVF0WRH374gaSkJLy9vXnmmWfkh4bNoVGpCDe409bLDYvDVbZmqndgaXALqQQBjUrAS6fB0PDvYrsu/fz8mDRpEhMmTGDLli2sW7eO8vJydu3ahVqtpn379lRUVFBbWwu4BFKr1Up2djaBgYEsWLCAXbt2cc899/DUU0/xxRdfkJmZyfvvv88zzzyDn58fTlEir6qOvCozDlFCoxJOO09sLI1WCQIaTrjGamwO9pRUU1x34Y4xBYWLgRJ0foVRZbWTcqwShySdd9eaM2F3ijiR6BXkTXvvS9NCVkFB4cqnrt7B5iMVqHDd+LU+ElarlTqzGYvZjNPpsuBrdDrc3N1p5zTRr1ePc8pSuFoxmUzyE9ClS5fy8ssvy1b/1uSXX35hxYoVjBkzhltvvfW8tjFnzhy2b9/Oq6++Snh4uGthQYEcdF5fX8/x48dxJiTQ8aef4FJ3D1q+HBrz3vR618/nmDlzpSGKIvv378doNJKWlobZbAZcImFsbCwxMTE4HA42bdqE0WiUXWrt2rVj2LBhxMXFodfrSUtL44svvuCOO+644G6MCheGJEkcPnxYdlEdPnxYLgX29/eXw9K7du3aomugJEmUlpY2EakKCwublGV7e3s3EakiIyPPueytJfzwww9s3LiRW2+9lTFjxrT69k+mqqqKd955h6qqqnP+XNfU1PDCCy/Qo0cP/nqWpgjPRAISAAEAAElEQVS7d+/ms88+Y8KECecttBUWFvKvf/0Lb29vuRlHS5AkiRUrVrBixQpMJhNOp5NevXrx4osvyt1O/8jnn3/Orl27ml6nW4ny8nJmzZrFwoUL5byzmJgYRo0adcYO42fD6XQyd+5cUlJSCAgI4JlnniEoKKgVR355EEWRtLQ0Vq9ezeHDhwHXe2owGKitrUUURWpqaqivr6empobq6mo6d+5MUFAQkyZNIj4+nq+//pq0tDQCAgJ4YvrTFDg0VFjsqAUBrUo477mhQxSxixLuGhV92/jg797850lB4XKgOKWuMHzdtPQK8ia9tEZ2NLWWMGV3ijgliQ6+HrRrJktKQUHh2sVDq8ZLq6bG5uDiZAsLsoMKf3+sVitmsxk7KiqOH2Xt0h+Yr9XQq1cvBgwYQO/evS/KBOpKYObMmSxYsACn04m3tzfffffdRdnPhAkTyMjIYM2aNfTp0+e8nqJ37dqV7du3k5OTc2KyEx4OkZGQny9/P/mlp8N778HLL8OldODedBOEhMD+/TBy5FUrSEmSxKFDh+TOeTU1NQD4+PgwatQoYmNjCQ0NxWg0MnfuXAoLXaWvWq2WoUOHkpiYeEr3t8bA4XMNhlZofQRBkLtr3nDDDZhMJrKyssjMzCQrK4ukpCQ5fy4qKkoWqU7XQVMQBIKDgwkODpZdP3a7ncLCwib5VHv27GHPnj3ya0JDQ5sIVWFhYefdDAHg6NGjbNq0ieDgYEaOHHne22kpvr6+PPHEE7z//vv8+OOPBAUF0aNHjxa91tvbm+7du5OdnU1NTQ3e3t4XbZySJLFw4UIkSeKWW245J0FqwYIFbNiwAU9PT15++WX27NnDypUr+e6777j33nubnROMGzeOXbt28dtvv/Hggw+2yvgPHjzIunXr2LVrF3v27EGlUnHHHXdw0003XfC5s9vtfPXVV+zZs4eQkBCefvpp/Pz8LnjcVwIqlYqYmBgGDBjAgQMHWL16Nenp6bIg5XQ60Wg0uLm5YbfbUalU5OTkcPz4cWpra9m1axd33XUXer2enXsy+D0rj6DwCNy0GtQX+N2qUalQCxIWh8jOoir6tfEl0EMRphSuDBSn1BXKUZOFzFITDlFCf46dJv6IJEnYnCKCcO5tUBUUFK4dCqrNZJSaLvia01LEhmtToKOWg2k7SEtLw9RQiqXVaunZsycDBgygT58+f1qB6mJz/Phx+Wn9a6+9ds7nsby8nFdeeYXo6Ggef/zxE784cAAefBBHVRVHjx7F4O2Nv58fPPyw65/CWZEkiaNHj2I0GjEajbKI5OnpSf/+/YmNjaVLly4cO3aMpKQkduzYgdVqBSAsLIzExEQGDhx42gyXH3/8kQ0bNvD666+fsSRG4fIiiiKHDh2Sw9IbBUdwlfs2ZlFFRUWdcxlmTU1NEzdVfn6+/BkCV5lYY9lfYz7VH8umT4ckSXz00Ufs27ePJ5544qJ3fzuZ3bt38/nnn6PX63nppZcIDQ1t0eu2b9/OnDlzmDJlCqNGjTrj9i/EKdXoUoyMjOSll15q0T230+nkm2++YceOHfj6+jJ9+nTCwsIQRZGZM2eSnZ3N7bffLpd0/pEPP/yQnJwc3nrrrfN2HDkcDlJTU1m3bh0FBQWAK6g7IyODfv368dprr53Xdk/GZrMxa9Ys9u3bR7t27Zg+ffop2Ul/NoqKili7di3btm3D4XDgdDqpqqrC6XSiVqspKyvDarVSW1srNzX4y5QplOj9cGj02C1mgoMC0elax0neOC/UqVXEhvnio79yyrsVrl0UUeoKptxST1ZpDaZ653lZNhvbLNsbhK2uAV6EG86tDaqCgsK1g90psqmgHLsoor8EZVg2hxOtWsWw9gFo1SpEUeTAgQPs3LmTtLQ02S2i0WhkgSo6OloRqM6RdevWsXDhQuLj47nrrrvO+fWvvPIKFouFf//7301dFWlpOB57jKN5eXgZDAQ0NAzglVfk8r5Lzq+/wm+/Qc+eLnHsopSiXhglJSWyENWYA6XX6+nbty+xsbF0794dSZJITU0lKSmJvLw8wPV3MGDAABITE+nUqdNZv8tnzZrFnj17+OSTT66Jstg/C1VVVWRlZZGRkcHevXtlEUmr1dKtWzfZRXU+DjhRFCkqKmoiVDUGMTfi5+cnC1QdOnSgffv2zZaN7dmzh1mzZtG9e3emT59+ye8tV69ezeLFiwkMDOSll15qkbBhs9l47rnnCA0N5ZVXXjntehciStntdl5//XXKy8t58cUX6XhSt9IzvebLL78kPT2doKAgnnnmmSbvb11dHf/617+oqqriueeea3abe/fu5aOPPiIxMZFp06ad05hrampISkpi06ZN1NTUIAgC/fr1Y9SoURw7dozvvvuOiRMnXlA3V3Blo82cOZO8vDw6derEk08+ec7B6FczJpOJjRs3snHjRmpra7Hb7RQVFeF0OpEkSRanPD09ufH+R+k+ZASIDmprTKhULnekXt869z+SJGF1ivi6aRkU5nfFdjxVuHZQyveuYALcdQwO9ye3oo7CGgtWp4hKcNkvVTTfFaSx64JDdAlSKkGgjaeOHoHeeGiVUDsFBYXTo1Wr6OznSXaZCacoXdSbFKfoulZ19vdEq3YJByqViqioKKKiorjtttuaCFSNZSgnC1R9+vSRu1gpnJ6RI0eyZ88ekpOTiY6OPmdHQ9euXdm6dStHjx5t2lmrf3/EGTOQ7r67yaSWd98Ff384zRP9i0ZGBrz+uuv/t20DqxWefvrSjuE0VFZWkpqaitFolHNGNBoN/fr1Iy4ujl69eqHT6SgqKmLJkiVs27ZNzpIKDg4mISGBIUOG4OXl1eJ9lpeX4+npqQhSVxm+vr4MHTqUoUOH4nA4OHjwoByWnpGRQUZGBj/88AOhoaGyi6pz584t6r6nUqkICwsjLCyMoUOHAi6h5vDhw7JIlZeXx86dO+VuayqVivDw8CZuKn9/f3766SdUKhVTpky5LA87r7vuOoqKitiyZQufffYZzz777FnPQaP4m5KSQnFxMW3atGn1ca1Zs4by8nIGDhzYIkHKarXKXdfCw8OZPn36KeVxnp6ePPLII/zf//0fX3zxBX//+99PWadbt25ERESwdetWbrjhhhY53goKCli3bh2pqak4HA48PDwYM2YMw4cPl0WxFStWAK6uexdCTU0NH3/8MUeOHKFHjx48+uij19y1yWAwcOONNzJu3Di2bdvGmjVr0Gq1WK1WCgsL8fDwQK1W4x3SltAefTHVVKOSRNzc9FitVoqLSwgODnLFIFwgQkPn0yqrnUPVZjr7ebbCESoonD+KU+oqoc7u4KjJypEaCzaniNjwrp18G9D4RgoCaFUCoV5utDW446vXKO4oBQWFFiFKEsZjVZRZ6i9aF9DGJ3SBHjriQn3Pug9RFDl48KAsUFVXVwOuSX2PHj1kgepaeuJ6rlRUVDBjxgx0Oh2vvfbaOZVLbNu2jblz5zJ58mRGjx7d5HdOp5P/jRvHpNxcgk7uLqXTwaxZ0LdvKx1BC/j11xOiFLhC13/6CS4gjPdCMJlMpKWlYTQayc3NBVwT/O7duxMXF0d0dDTu7u44HA527dpFUlIS+/fvl9fr27cvw4YNo2vXruf1d/j0008TGBjIP/7xj1Y9LoXLR3l5ueyi2rdvH/X19YBLbOnRo4csUl1IN09JkqiqqmoiUh0+fFgO1AeX26+kpIQhQ4Zwzz330KFDBzw9L/2k1uFw8PHHH7N//34GDhzIfffdd9a/lczMTGbOnMn111/PTTfd1Ow6u3bt4vPPPz9np1RVVRWvvvoqAG+++eZZc5JMJhOffPIJBQUFLXIObdmyhW+//ZaoqCieeeaZU/LAGssGx44dy6TTuFVFUWT37t2sX79evi6FhIQwcuRIBg0a1EQoqq2t5fnnnycsLEw+rvOhoqKCDz/8kJKSEvr168eDDz7YIhH1z44kSaSnp7NmzRpyc3Opq6sjPz+fGx5/jpAOnagqK0WtUqHXu6HX63A6nahUKgKDgvBwb537nfoGw0NCuwDcFfOCwmVEuSJcJXhqNUT5e9HJ15Nqmx1TvYMamwOLw4lTklA3KN7eelcLVB+9Fp36yitbUFBQuLJRCQI9gwzsOFaJ1SG2ujDVKEi5aVT0DDS0aNsqlYouXbrQpUuXJg6qXbt2kZ6eTnp6Omq1WhaooqOjFYHqD/j7+zN16lTmzp3Ld999xyOPPNLi97Vr164A5OTknCJKqdVqdnfuTLfAQIY1THAAqK+HZ56B2bOhBW6BViEmBrRaaJw8O50wcya8//6l2T9gsVjYvXs3RqORvXv3IooigiDQpUsX4uLi6NevnywIlpWVsWrVKrZu3Spnqfn7+5OQkMDQoUNbnO1zunFYLBYl5PxPRkBAAImJiSQmJmK328nNzZUdVLt27WLXrl0AhIeH07t3b3r27EmnTp3OKcxcEAT8/Pzw8/OT3TFOp5Njx46Rl5dHdnY2c+fOxWw2U15ezsyZMwGXo+/kEPXw8PCLLjxoNBoeffRR3n33XXbs2EFISAgTJkw442u6d++OwWBgx44d3HjjjWe8Dp7rd9/PP/9MfX09N99881kFqcrKSj788EOKi4vp2bMnjzzyyFmdQ0OHDuXQoUNs3ryZJUuW8Je//KXJ7/v27UubNm3YtGkT48aNa/I9aDabSU5OZsOGDVRUVADQs2dPRo0aRY8ePZo91j179iCKIgMGDGjpKTiF4uJiPvzwQyorKxk0aBD33HPPBYXr/5kQBIHo6Giio6PJz89nzZo1hHWKom2nLpjr6hAQGjKo6rDb69FqtQiCQGlpKYEBAXh6ttw5ezq0KgGrU+RorVVxSylcVhRR6ipDrRLwd9cpbTwVFBQuGl46Df3a+LCzqNolILWSMNUoSOnUKvq18cFLd+5fQY0T/EaB6uRSk8bSFrVaTffu3RkwYAB9+/ZVBKoGBg0axJ49e9i1axcpKSly166z4e/vT2BgILm5uYiieMqEQqvVsisujmE9e8LSpSd+YTLBk0/CnDlwEcpkTqFNG7j9dvj22xPLNmyAtDS4wNKTM1FfX096ejqpqalkZGTgcDgAiIiIIC4ujgEDBsgT1EaXQlJSEllZWYDrM92nTx8SExPp2bNnq0zYlM57f360Wi09evSgR48eTJkyhZKSErnMLycnhyNHjrBq1So8PDxkF1XPnj3Pq3OaWq2mXbt2tGvXjsOHD9O3b18mTpxIREREE0fVjh072LFjB+ASjNq3b99EqAoICGh1962npydPPvkk7777LsuWLaNNmzZnFFHUajUxMTFs2LBBzjZqDfLy8ti+fTsBAQFcd911Z1z3ZKEmJiaG++67r8UC3tSpUyksLGTNmjVERkYSExMj/06lUjF27Fi+/fZbNm3axPjx4ykqKmL9+vVs27aN+vp6dDodw4cPZ8SIEYSEhJxxX40lnOcrSh05coSPPvoIk8nEiBEjuO2225TKjdMQGRnJQw89RMrhIgpNVpz1NlSeHtisNuz2eqxWG3a7Ha1Wi93hoLS0DEmS8PK6sJB4QRAQgCM1Fjr6elySJjcKCs2hiFIKCgoKCqfg765jQIgPu4qrsTpEtCoBzQVMlh2iiF2UcNeo6NvGp1WEdUEQ6NSpE506dWLy5MmyQJWWliZPzubPny8LVNHR0ZelxORKQRAEpk2bxoEDB/jhhx+IiopqcRvurl27smXLFgoLC4mIiGjyO51Oh93hgJdfhooKSEo68cuSEpcwNXs2XMQW7DL33QfLlkFDiScAH30Ec+e2aui5w+EgOzub1NRUdu/ejc1mAyA0NJS4uDhiYmIIDg6W16+srCQ5OZnk5GSqqqoA8PHxIT4+nvj4ePwbQ+JbiUYnRGtvV+HKJTg4mJEjRzJy5EhsNhs5OTlyqV9qaiqpqamASyzt3bs3vXr1IiIi4pxE0IKCArZu3UpoaChjxoyRHaqAHNTcKFAdOnSIw4cPy0H94MrUaRSoOnbsSGRkZKs0rmjTpg2PPvooH330EXPmzCEgIIDIyMjTrj9o0CA2bNhASkpKq4hSkiSxYMECAG699dYzdkksKCjgk08+wWQykZCQwB133HFO74FGo+GRRx7hX//6F99++y1t27Zt0n1w4MCBLFu2jAULFrBv3z727dsHuATq4cOHEx8f36IHNXV1dezdu5ewsLDzyt7Ky8tj5syZmM1mJkyYwE033aQIUmdBlCSqRTWe7h74eHhQW2uipqYGm82GxWLBbrfLHfscdjtOpwNRFPH2Pn9XLbjyRC0OJ1VWu2J6ULhsKKKUgoKCgkKz+LvrGNzWn71lJorNNhxOJ1qVCvU53Fi6OoCKAIR46ukRaLgouQV/FKgOHTokO6gaBarGPJ9GB9W1KFAZDAbuuusuZs2axdy5c3n66adbNFFoFKVycnJOEaW0Wq0rb0athrffhscfh/T0EyscOuQq5Zs1Cy52sK3BAI88Av/3fyeWZWfD77/DBXaOEkWR/fv3k5qaSlpaGnV1dQAEBgYycuRIYmNjCQsLk8+nKIpkZ2eTlJREenq6HAbfvXt3hg0bRp8+fVBfpC6XilPq2kav19OnTx/69OnD1KlTKSoqkq+D+/fv5/Dhw6xYsQIvLy969uxJ79696dGjxxmviY3CiyRJTJky5ZTPriAIBAUFERQURFxcHODqKldYWNik219jyXXja0JCQpp0+wsLCzsvt2DXrl2ZNm0a8+bN47///S8vv/zyaUXZiIgIgoODMRqNTJ48+YLLDHfs2EF+fj5dunQ5YyB4bm4un376KVarlXHjxjFx4sTzEmr8/f156KGH+Oijj/jss8945ZVXcHNzw2azsX37do4fP05qairl5eUMGzaMUaNGER0dfU7n9UJK9/bt28esWbOw2WxMmjSJsWPHnvM2LjVjxoyhqKgIlUqFwWDgk08+oV+/fpSXlzNq1Ch5PbPZTF5eHiUlJWcV/e+9917WrFlDUFCQvGz69Oncd999za5fW+/AIUpoBAGVSsDb2weDtzfmujqqq6s5nHeQfz56N299uxgEV2mf3W7H4XTi7+dHY9JwWXERbz35IB//tKJFx64CRAlq6h1NRClBEKisrGw2o+5Mvzsbr7/+Ov/85z/Jy8trcj8xfPhwnn76aSZOnHjO21S4+lFEKQUFBQWF0+KhVdM/xIejJisHK+uoczipl0AtCKgFAZXQNHdDkiREySVGOSUJQQBPrZpOvp60NbhdkielgiDQsWNHOnbsyF/+8hdZoEpLSyMrK4usrCzmz59Pt27dGDBgAP369bumBKro6GiGDBnC1q1b2bhxIyNGjDjra6KiogBXrtSYMWOa/E6r1cqBy7i5uZxJDzzgEqMa2bMHZsxwiVYXm0mTYMECaOhyB8Cnn8LIkecsikmSxKFDhzAajaSmplJTUwO4XE6jRo0iNjaWyMjIJp/rmpoatmzZwubNm2VxyMvLi6FDhxIfH9/EQXWxUJxSCo0IgkBoaCihoaFcd911WK1W9u7dK4tUjSV3jdfNxrD0du3aNflc79y5kwMHDtCnTx/ZHXU2tFqtfC1uxGQyNRGpDh06xJYtW9iyZQvgEtQiIiKalP21dOIbHx9PcXExq1ev5r///S/PP/98s04sQRAYOHAgv/zyC9nZ2efckfRkbDYbS5YsQRCEM5anZWRk8MUXX2C321tFqOnWrRu33HILS5Ys4dNPPyUyMpItW7ZgNpvx9PSkXbt2RERE8Oyzz56XyHe+pXt79uzhyy+/xOl0Mm3aNBITE89535eDhQsXyp+zn3/+mXvvvZc9e/YQEBDA7t275fU++OADNm3a1OJr6/PPP8/TLewCa6p3IEoSqpM6HwsIeHp64enpid1Sh0pQ4enpidliwSmK1JnNFBYUYLNaGxxzAoFtQlosSMGJeziTzdHi15wvoigyd+5chg8fzpw5c3jjjTcu+j4Vrg4UUUpBQUFB4YwIgkC4tzthBjdKzfUcqbFQYa3HIUqIouR6NicAkqsLqEoQ0KggyE1PuLc7QR66y5ZT8EeB6vDhw7KDKjs7m+zsbL777ju6du0qC1ReXhceHnqlc9ttt5GTk8PixYvp3r37WbNF/Pz8CA4O5sCBA6fkSjW2tJbx9nYFjN9/v6t8r5HVq10uqvDw1j6cpmg0MH06PPvsiWXFxfD9967yvrMgSRJHjx7FaDRiNBplYcnDw4OEhARiY2Pp0qVLk3MgSRI5OTkkJSWxa9cuxAZ3YJcuXRg2bBj9+vW7pN2mGscceHJHRAUFwM3NjX79+tGvXz/5s56RkUFmZiYHDx7k4MGDLFu2DG9vb3r16kXv3r3p3LkzixcvRq1WnxKufa4YDAbZxQWuv52ioqImIlVubq7ciRJc15+TRaqIiAh0uubLjG655RaKi4vZs2cPs2fP5rHHHmtWlImLi+OXX35hx44dpxWlWvIQZdWqVVRXV5OQkEC7du2aXSclJYU5c+YgSRJ33XUX8fHxZ93u2ZAkiQ4dOlBbW8vXX39NZGQkPXv25MYbbyQxMZFNmzaxYsUKjEZji/MDGzGbzezdu1cWM1vKjh07mDt3LgD333+/7Ji7GjhZ+Kyurj7tez979mzeeeedC9qXxWJh0KBBvPrqq/zlL39h27Zt3H777SxYs5GSo6U8ddNoJtx2J6mbNyKKTp547V8MiB+GXu96sNehY0eqq6p4/4XpFBcexmG34xsYxF3PvETckKGUHDvKwxNGsDz9IACjOgRx/3OvsGX1Kqoryrnrr39j3OQ7APj8X6+TnrKV+no73j7eLPhmjtzcBFwi3K+//kpdXR2vv/4606ZNO+V4cnNzefrppykpKcFms/Hwww/z5JNPNnvsa9asoU2bNnzwwQdMnDiR1157TQm+VwAUUUpBQUFBoYWoBIE2nnraeOoRJYnaegemegc2p4gkgSCAXq3CoNPgpdNccYGZgiAQGRlJZGQkkyZNaiJQ7d27l7179/L999/LAlXfvn3lTml/Ntzc3Lj33nv5z3/+w5w5c3jxxRfPemPYtWtXNm/eTEFBQZO8Fp1OJzuIZEJCXMLUAw9Abe2J5ZfKkZaQAAMGQMPTfsAVuH7zzXCaJ9wlJSWyEHX8+HHA5doYOHAgsbGxdO/e/RRhqa6ujm3btpGUlERxcTHgEq8GDx5MQkLCOU3oWpPy8nL0er0S8q9wRgRBIDw8nPDwcMaPH4/ZbCY7O5uMjAyysrLYunUrW7dupbCwkMrKSkaNGoXT6USSpFZzvZ7s5BoyZAjgch8VFBQ0yadKS0sjLS0NcAV6t23btkk+VZs2bRAEAZVKxQMPPMD7779Peno6ixcvZvLkyafsNzg4mI4dO7Jnzx6sVut5ZVuVlZWxZs0a3NzcuPnmm5tdZ+PGjfz444+oVCoeeuihM5b3tQSHw0Fqaipr166lsLAQd3d32rRpg16v55577qFXr14AjBgxgtWrV/Pbb78RFxd3Tu/Xnj17cDqd5+SSSkpK4vvvv0etVvPII49ckPvscnH33XezYcMGAFauXHnK77du3UplZSU33HCDvOy1114jLCyMRx99tNltvv/++7JQBzBz5kwSEhL46aefGDVqFBEREXLZqZ9/IBwtpc5UQ/vOXXj07zPI3mXk1QfvYvbarVhtVkCi1mTC6XRy19MvoNbqsFitrF+ygOXfzqZbr+bPu1anZ9ay1RQczOXxm6/julumoNZomProUzz69xnYHE5Sfl/O9OnT+e233+TXCYLArl27yMvLIyYmhqFDhzb5/nc6ndx+++2y+9xsNjNo0CD5e/OPzJ49m/vvv59+/foREBDA2rVrT3FfK1ybKKKUgoKCgsI5oxIEvPVavPWnD3S9kvmjQFVQUNCsQBUVFSU7qP5sAlVUVBSjRo1i7dq1rFq1iuuvv/6s62/evJmcnJwmN6VyptQf6dTJlSP1zjtQVeVyTrUwWP2CEQRXjtVdd0FDlhNmM3z5Jbz0krxaZWUlqampGI1GDjeU+2k0Gvr160dsbCy9e/c+xZEhSRJ5eXkkJSWRmpoqd9vr0KEDiYmJxMTEnNbFcamoqKjA399fCRZWOCc8PDyIiYkhJiYGSZIoKChg27ZtfPLJJ5jNZo4fP86MGTPw8/OTw9K7deuGvpWz4vR6vdxltZHKysombqrDhw9TWFhIUkNjBXd3dyIjI+V8qnvuuYeZM2eydu1aQkJCSEhIOGU/cXFx5OXlkZaWJgtigJz/djYWL16Mw+Fg4sSJp3w/SJLEqlWrWLZsGTqdjscee6zFZY/NUVNTQ1JSEps2baKmpgZBEOjfvz+jRo3Cw8ODd999lzlz5vD3v/8df39/vLy8SEhIYN26dWRkZJyTSHSupXu///47S5YsQa/X8/jjj9OtW7fzOsbLzbcNnVu/+eYbXnzxxVOEqdmzZ3P33Xc3eTjx5ptvnnGbpyvfi4qK4q233mLw4ME89dRT6HQ69u/PwWq1oVZriB46jIKCw+i9/fHy9WPzutX4BQYhiqL80CTp12UYN6zBUV9PfX09Xt4+LpeXo/6U/Y2eeCsA7Tt1Qa3WUFFaQlBoGDuTN/HzN//DXGtCQMJSU93kdQ8++CAAHTt2JDExkaSkpCbf/40NFaZOnSovM5lMZGdnnyJKlZeXs3r1ar766ivA5aabPXu2IkopAIoopaCgoKBwjSMIAhEREURERHDLLbc0Eagauxf9UaA6n7bqVyITJ04kKyuLFStWyN24TkejpT8nJ6dJHsppRSmAHj1g3rymy0QRyspcZX6t0HnrtHTrBhMmwK+/nli2ZAm111/PzooKjEYjBw4cQJIkVCoVPXv2JDY2lr59++Lu7n7K5iwWCzt27GDTpk0cO3YMcE2ehwwZQmJi4mlLdy41drudmpoa2rdvf7mHonAV03hdXLduHb1792bSpEn4+vrKLqqkpCSSkpLQaDR06dJFFqmCg4Mvihjq5+eHn5+f7DQSRZGjR482EaoaHyg0otVqyc3N5f3338dmszF8+PAmgkJMTAwLFy5kx44dRMfEUdPg/q3QGug2fBzOwHD2lddi0KlPcQDv37+ftLQ0goODT8nlkySJRYsWsXbtWjw8PHjqqaea5GqdCwUFBaxbt04WwD08PBgzZgzDhw9v0sjg7rvv5quvvuKLL77g+eefR6PRMHr0aDZs2MBvv/1G79695ffF5hSptTW4nJEQENA1uJyd9Vays7MJCQk5q9NTkiSWLVvGqlWrLvg4ryTuueceHn30UcrLy+VzXFtby8KFCzEajWd9vd1up7q6mpqaGvn9q6qqorq6msrKSqqrq6mqqmLjxo3odDqWL19Obm4uHfoPJLLfQCQkKioqUGlcn7fGWAS1WgMI+Pr6kbc3gy2rfuHDBcsIDg1j29rVzP63K7OxsqrylDHp9Ce+a1VqNU6ng+KjR5j5+kvMWrYav7btqc7P5fG/3HDKa0/mj3/bkiTh7+/fJHfrdMybNw+Hw0F0dDTgclmVl5c3Oc8K1y6KKKWgoKCgoNDAHwWqI0eOyAJVTk4OOTk5/PDDD3Tp0oUBAwbQv3//q1qg0mq13HfffU2esp+unbmPjw9t2rThwIEDcltqcJXvORyOlpX0mM0uB9POndCmDfzrX9C3bysf1Uk88QSsXYtosWC2WKirqyNr2jQWDB4MuDKfYmNj6d+//2mdcIcPHyYpKYmUlBQ50D08PJxhw4YRFxfXKi3tWxMl5FyhtcjLy2PHjh2Eh4dz3XXXoVKpGDhwIKIocujQITIzM8nIyJDFoIULFxIUFCSHpXft2vW015MLRaVS0a5dO9q1ayeHaZvNZg4fPtxEqPLz8yM7O5tnnnmGmJgYunbtKpf8hUdEEjN6AqK3P5sOlyE1XL/sGndCuvZC1Os5WOnqsqkSBNw0Ktp5uxPqqWPBggUATJkypYnQJYoi8+bNY+vWrXh7e/P000/Ttm3bczo2URTZvXs369evJzc3F4CQkBBGjhzJoEGDmnWmxcTEcOjQIdauXcuPP/7InXfeib+/P4MGDWLr1q1k5uah9guizGLH4nDilCRONoQJgquBid1cR4eBiUSFnFkkaOzGuGHDBry9vZk+fTrhFzsv8CJRVVWF2WwmLCwMgKVLlxIQENDkGrpgwQKio6MJCQkhPz+fqqoqWWhq/P/Gnxs7s2ZlZVFUVERNTQ0WiwWLxYLZbMZms1FaWkpeXh7R0dFkZWXh7e1NeNdaVCoVotNJtnEbo2+ZzKF92dRWVZIwaizm2mq5dPXw3ky8DAYC24TisDtY8cM3qFUq9G56HHZni9x+daYa1Bot/sFtkCSJpd/OPmWdxjDy/Px8Nm/ezEcffdTk9127dsXb25s5c+bIXQUPHDiAv7//Kd9Bs2fPZtGiRYwbN05edttttzF//nymT5/esjdL4U+LIkopKCgoKCg0gyAI8qTn5ptvbiJQ7d+/n/379/Pjjz9e9QJVREQEN9xwA8uXL2fp0qXN5q800rVrV5KSkjh8+LD8RLxx0mm3289etpaSciLnqbgYnn4a/vc/6Ny5NQ6lCfX19WQUFlLXvj0R69bJZXzdnU7u79WLqDvvxO805YQ2mw2j0SgfK7iOs9EV9ceOe1cSjaKU8uRZ4UJoFB3ANXE8OXNOpVLRqVMnOnXqxM0330xVVRVZWVlkZmaSnZ3Nhg0b2LBhA1qtlq5du8ouqosdvO/h4UH37t3p3r27fAzl5eV89913/PLLLxw+fBitVkt+QQEHKutoZ9fhFhGFw2GnqrISH28v9Ho9Ur0Tq6kGN7UP7p4ecldZi91JTnktmcesuLXvQq+AADnDCVzXwP/973/s3r2bwMBAnn76aYKCglo8frPZTHJyMhs2bJD/jnv27MmoUaPo0aPHWa85t956KwUFBWzevJkOHTowdOhQBo0cQ51/GHvNEp4qCyrBJbDpVCoEXN9zkiQh4eqaa3aIhPfuj9rLix3Hqujk50GQR1MRTBRFvvnmG7Zv346/vz/PPPPMJekqerGoqqri1ltvpa6uDkmSMBgMvPDCC3z//fey2DRr1iy6dOnCiy++2OS1qamp8ufO6XSiUqkQBAGn04nT6WTXrl1kZWXJeWedOnWiS5cuGI1G7r77bnr37g24ygAnjh9DkcYbT4M3lUXHeWnarTidDv7+8Rd4+/pirj2R3Rg3bCTrlv7EvaMG4e3rT/+hiZQVHScgIIBj+YeQkKi316PTnv47uWO3Hoy4cSIPjEnAy9eXWybecso6TqeTfv36UVdXxyeffNKkdA9c5e4rVqzg6aef5sMPP8TpdBIYGMj333/fZL2UlBRKSkoYPXp0k+XTpk3jH//4hyJKKSBILS2cVlBQUFBQUJA7VjUKVI0B14Ig0LlzZ1mg8vHxucwjbTmiKPLee++Rn5/Ps88+26T7zsmkpqby1VdfMXHiRMaPHw/A/Pnz2bx5M//5z3/wPFuQ+c6d8MgjTZcFBblCyM/SAbAlOBwO9u7di9FoZPfu3dhsNrQOB89s3EigSoWHpydajQaiolzd+P7A0aNHSUpKYvv27XJHwZCQEBITExk8ePBVERyenJzMvHnzePDBB5sNmlVQaAnbt29nzpw59O/fn0f++Dd7BpxOJwcPHpRdVI2lruD6Wzq5o9+l6kgpSRLffPMN27Zto3vfAfQcOZ5ap4TDbsdaV0tVZRUqlYCHh6fcSdZqs+Lj7Y1/QAA6rRbXL1zHV1JejkqjIdDbQN8wf4I89FitVj777DP27dtHWFgY06dPb9LR7UwUFRWxfv16tm3bRn19PTqdjiFDhjBixIizdkb9IzU1NfzrX//CUl/P1Cf+Ro2gw1RXh6W2lqDAAPRneHAgSiJHCgvRaDQEh4RiFyXUgkA7bzei/L3QqlU4HA7+97//sWvXLoKDg3nmmWeuWFemJElYrdYzupoa/+t0Os+4LYPBgI+PD97e3qhUKiRJor6+HqvVSm1tLTU1NTgcjlOEQ71eT0hIyCn/goODT/n8S5LEwq27eWD8cLlz3vnQeFx6va7h83NmMdMuikhAQrg/njrFr6JweVA+eQoKCgoKCufAyR2rbrrppiYCVW5uLrm5uSxYsIBOnTrJAlVLJyeXC5VKxf33389bb73F3Llzef3115stS4uKigJcuVKNolTjjXV9ff3ZRan+/WH4cNi48cSy0lJ48kmYPRvOQ8gTRZHc3FyMRiNpaWly6URAQAAjR44kJiaGtikpCG+/feJF+/e79hsUhN1uZ+fOnSQlJXHwoGsioFariY2NZdiwYXTu3PmKdUU1R3l5OaCU7ymcPzabjSVLlqDRaLj11lvP6bVqtZqoqCiioqKYNGkSFRUVZGZmkpmZyd69e1m7di1r165Fr9fTvXt3udTvdK7F1kAQBO68807qBA2GLn2ornfi4+WB2sMDfHzQabXUmEx4eXnicDqpq6vDYbdjMpmw2eoRVAJ6nQ6dXo/NasVmteLj40s9KnYWVdPRS8vi2Z+Tn59Phw4deOqpp856LZQkiezsbNatW0dWVhbgumYNHz6c+Pj48xbAvb29uffhR9lyqIjCWiveXhq89DpqK+sx1VSjDzy9c8tiNiNJ4OHhiUalQi1IOESJ/GoL5ZZ6evp7MO9/X7J3717Cw8OZPn36ZXMH19fXnyIsNSc4NZZcnw53d3eCg4Px8fHB19dX/qfX67Hb7VgsFmprayktLaWoqIh9+/YhiuIp2/Hz82tWfPLx8Wnx94cgCIQaXK60C+lw6e3jjdlch81Wj8lkwmA483vkECWCPHSKIKVwWVE+fQoKCgoKCufJHwWq48ePywLVgQMHOHDgAAsXLqRjx44MGDCAAQMGXLECVZs2bbj11lv58ccfWbBgAffcc88p63h7exMaGsrBgwdxOBxoNBq5ZO+0YecnIwiuHKnHHoP09BPL8/NdWVOzZrUo/FySJPLz8zEajaSmplJdXS2Pb9SoUcTGxjYtsQsLg0WLXGIUgI8PxWYzST/9xLZt22QhKzAwkMTERIYMGXLVdltUyvcULpTffvuN6upqxo8ff8Eld/7+/iQmJpKYmIjD4SA3N5eMjAwyMzPZvXu3HJDctm1b2UXVsWNHObOutSi3Oek0dDRVJhOminI0khNvb5cIbjAYMJstqNVqAgICMZvrKC4uwd3DHZ1Wi81mw2azYTZbMJvrEAQBtUbjuga6uZFabsPm7kP37t157LHHztiN0GazsX37dtatWye7bLt06cKoUaOIjo5uUiZ5PpjqHRRpDASEaaguL0OqtxEcHIybuxt1ZjO+DjsaTfM5X2azGQAPT5cgJggCWrWAWpKosTn4PfMgBcWldOzYkaeeeuqiOEedTic1NTVNAsGbE5wax3o6tFqtLDD9UXBq/Nnb2xuz2UxRURHHjx+nqKiIvLw8OQfqj2g0mmaFpzZt2rRatmBcj64s2Z2LXZTQqc9PlBIQCAgI4HhREZVVVbi7e5zWlShKEgLQzvvU5h4KCpcSpXxPQUFBQUHhInDs2DFZoGps4Qw0cVBdTHfA+SBJEh9//DF79+7lscceo28zIeQ//PADGzdu5IUXXqBTp0788ssvrFixgldffbXlQbc1NfDgg5CX13R5QgJ88AE0MyFtLJtMTU3FaDRSVlYGuHJkBgwYQGxsLF26dDn9pK6iAvE//6E0L4/VYWEkm0yAyyUWHR1NYmIi3bt3v6pcUc3xwQcfkJeXx3//+9+r/lgULj3l5eW89tpreHp68tZbb51RYLlQSkpKyMrKIiMjg5ycHBwOB+Byr/To0UN2UV2oG6fGZmfHsUrsTgmVJFJcdBxRlAgKCmoQViSOHDmCIAi0bdsWs9lMaWkZvr4++Pj4AiBJIsePH6fObMbdzQ1BEKi327GYLbgbDKgEgfJMIyFe7nTs2JEOHToQEhIi/w2Wl5ezceNGkpOTMZvNaDQaYmNjGTVqVKt17rQ6nOw4Wkmt3YmbWqC8ooK62jp8fHxwc9NTXFyCweCFv/+pgvXJpXuuwO8T1w6n6KSkuBiV3g2p3sb1vTvj43luIoYkSZhMpmZL504WoEwN1+XToVKpmohMpxOc3N3d5XNvt9spLi6mqKioyb/i4uJmnVSenp6EhoaeIj4FBARcsGjYErJKa8ivtqBXq+Ruj+dDZWUFNTUm3N3dGjK/Tu2cZ3WKGHQa4tv5X9C+FBQuFMUppaCgoKCgcBEICwsjLCyMG2+8sYmD6uDBgxw8ePAUB9WVIFAJgsA999zDjBkzmD9/Pp06dTrFMRQVFcXGjRvJycmhU6dOslOqcULZIry9YeZMuO8+KCk5sXzzZnj7bfjHP1yuKlwT19TUVFJSUmRxT6/XM3DgQGJjY+nevftZs2nKyspITk4m2WrFZDCAyYSfnx8JCQkMHTr0inWvnQ8VFRX4+fkpgpTCebF48WIcDge33HLLRRWkAIKDgwkODmbEiBHU19eTk5MjZ1E1Xi/B1YyhUaCKjIw8J2FAlCSyykzUOyXc1CoEQU1QUBAlJSWUlZUREtIGnU6Pp6cnNTUmbDZbs9uxWm3Y7Q68GgSLerudoqIi9Ho9GiTcvbyhWz+2/+zK2APXdcpgMFBRUUFZWRleXl4EBgZy4403kpiY2Kqlb5IkkV1WS63diV7tCtsO8PfHXl9PdXU1On0QOr2O2tpafHx8T3GiWcyWhtI9D5oIUk4HxcXF2O0OPDQaPAOCOFhjo5+HmxySbrFYmi2dO/nn6urqZsveGhEEAYPBQLt27c4oOBkMhmavbZIkUVtbS1FREQcPHmwiPpWXl5/SjU4QBAIDA5t1Pnl5eV3Ym3GBdPH3otRcT53d2fCZPb9rua+vL2azGYvFSl1dHZ6eTY/LLkqoVQI9gwyKIKVw2VGcUgoKCgoKCpeQkwWqk0OAO3ToIDuoLnfp1Y4dO/j666+Jjo7msccea3JTbDKZeO655+jWrRtP/nU6G7dsY8369dxx++10iIjAQ6dG29JJY14ePPAA/OHpeN3tt7MtOpqUlBS5+51Go6F3797ExsbSu3fvs3b6E0WRjIwMkpKSyMrKkjM6evbsybBhw+gliqhycmDwYGjf/txO0BWKKIo88cQTdOnShWefffZyD0fhKmP//v38+9//JjIykpdeeumyCZuSJFFcXCwLVLm5uXIQtaenpyxQ9ezZ86zZTQcr68gpr0WrVqE+6Xhqa02Ul1egVqsJDQ3B6XRy/HgRXgYv3N3cmjilJCSOHzuG3e6gTZtgBEGgpKQEUZTw9vHGz9cXUQKbU8RPcFBfmMv69etJTk6mqKgISZLw8vKibdu2dO/enU6dOtGhQwc6dOhA+/btWyXw/ajJSnpJNWpBQHPS9dfhsHP8eBEg4ePrS2VFJT4+3vj6Nn0IUlpaitlsJjQsVO7YVm+vp7ioCLvdjt7NDS8vL0RJQhRUlKYbObo3nerq6rOWbnt4eJzR1dRYSteSkk1RFOV8pz/+a66k73RB40FBQXLn2CuR4jobu4pcZek69fm7syxWCyXFJajUKsLCwlCrXOfYKUrUiyIdfT3oHnh1lqor/LlQRCkFBQUFBYXLRFFREWlpaezcuZMjR47IyyMjI2UH1eUQqCRJ4ssvvyQtLY17772XwYMHy8vLLfUs+n0dGi8f2nXqgsVqxWy24OXliVarRSUIeGrV+LlpCfFyw99Ne+bJ7e7d8PjjOK1WzHV11JnN2KxWfuvbl92dO9O9e3diY2Pp27cv7u5nLxmpqqpyuaKSk6msrARcWVPx8fHEx8e7zuemTfC3v9HwS/jf/6Bjxws9bZed8vJyXnnlFYYMGdJsJpiCwukQRZG3336bwsJCXnzxRTpeQX8PVquVffv2ySJVVVUV4HK7dOjQQRap2rdv3+RaY3eKbCooxy6K6JsRPBrLm3Q6LW1CQig6XoTT6cTf34+ysnJZlKox1VBZUYmHhwdeBi9KS0qRJAlfP198vL1pdBbZHA4sFgu7ln5PyZECBEGgV69edOnSBafTyaFDhzh06FCTEjW1Wk27du1kkapjx44EBgaekyDoFCWSCsuxOJy4NXOcFouZkpJStFoNkiThFEVCQkKQRBGn04nD4aC4uARBcOVrOZ1O7HY7dXV1SJKEVqttcM25xqT39MRWV8vupd/h7eV1RsHJx8fnrA8QmsNqtTYrPJWUlDTbKc/X17dZ8cnX1/eqdY3mVtSSW1mHCuGChKmy8jLqauvw9PQgMDBIFqSCPHT0D/FFo7o6z4/CnwtFlFJQUFBQULgCKC4ulh1UzQlU/fv3v+DQ4XOhtraWGTNmUF9fzz9efRWz1oOCGgu19Q7MFgtWixUfby9Eh4OKikoCAgJwc3NHlCSckoQEqAQw6DRE+HjQ1uB2SomA1Wpl165dHPv+ewYsWIDQcEuid3PDw9MTzQcf4HHDDWcda2Mnq6SkJNLT0+UykW7dujFs2DCio6ObPoV/4w1YseLEz3Fx8N//yiWDVyu5ubl88MEH3HDDDdx4442XezgKVxHJycnMmzePuLg4Hnjggcs9nNPSmC3X2NHv4MGD8t+7t7e3LFB1796dcodAeknNGbJ5JEpKS7GYLXh4uKPT6aiqqsZg8MJkqsXX1wcvg4FjR482iFB+VFVWIgEB/v54ebkcJvX1NmpMJsx1dei9DBzLTCPSU8vw4cNPeaggSRIVFRXk5eXJIlVBQUGT8mcvLy8iIyPlbKrIyMgzhoofM1nZXVyNTi0giRJOpwOn0+kSnJxOnA4ntbWmBieRgCg60en1siPK4bBjtVrR6nTodXpEUcRqtYLgcjkZvAxoNGrUatc/lUqDUxCIbuND+AUEZEuSRFVVVbPiU6PweDJqtZrg4GBZcGrMfWrNoPErCUmS2F9RS16VGSSXY+p8BDZRdHLs2DGcTpHA4GBUWh1BHjr6tfFBewFil4JCa6KIUgoKCgoKClcYxcXFsoOqsLBQXh4RESE7qC6FQJWRkcGc73+k39ib8Q+PQBBAK6iwWS2Ulpbi6+uDVqultLSMwMDAJqU0kiQhSmBvmDAGuOvoGWRAL0ikp6djNBrJyMiQJ2Njamu5zmh0iVGNApJW6xKL+vdvdnwmk4mtW7eSlJQkB597enoyZMgQEhISaNOmTfMHtmABvP9+02UffwxDh17A2br8bN++nTlz5nDPPfcwZMiQyz0chasEi8XCq6++itVq5a233roi8u1aitlsJjs7m6ysLDIzM+WuaSqViqG3P4BHQDCeOk1DqdapE3pREikuKqK+3o6Xlye1tXVoNGocDie+vj44nU5Mplp0Oi31djsCri6dHh4emM1makwmbFZXDpVWq8HTxw+DuxvDI4Na7EBxOBwcOXJEFqkOHTpEyUlZe5Ik4e/vT3BwMP7+/nh7e6PT6aipqaGqqgqPqL64+Qdhqa2B087qJCxWK2KDy0ij0RAQEIBGo8FkMmGrryekTRsEQaCsvBxJbHSC+TS7NavDib+7loFhZ8+vs9vtlJSUNBs03lyGl4eHR7NB44GBgZckaPxKQpIkCmos7K+opd4poVOpUJ+Hs6nWXEetxYogQfe2QfRq46c4pBSuKBRRSkFBQUFB4QqmpKREdlBdaoGqoNpMyqFj2EURd60W74bQc1F0Ulh4BDc3Pd7e3pSUlBIQEHDagFiHKGKpr6feYmHf5jUcydoDQGhoKLGxscTGxrq6A335pevfyXh5ucrrOncGXDfpubm5JCUlkZaWJpdydO7cmcTERPr373/2rBCrFSZNahqy3qED/Phjs53/rhZWrlzJsmXLeOaZZ+jWrdvlHo7CVcLixYtZvXo1N954Ize0wJl4pSJJEgUFBWRmZrI39wAhg0cjOkWc9no0GjVu7u54uLvj5uaGIJyUu+R0UHT8OE6niCCA3eFArVZj8PKitrYOh9OBRq1GEFQEBAbgdDgwmUw4HK5rj7u7GwZvb9zd3HBKruvdwDA//N3PXrZmtVqb7UhXVFREfn4+hYWFsnPoZDeVSqXCYDDQJrwdk559FZUgICChUTc6mjSo1eomDicEgaLjRVgsZlQqV+C7l5cnhYVHUKtV+Pv7U1paJotgf2xycTIOUUQEEtsF4KF1XTNNJlOzrqfTBY0HBAScNmj8ai25u1jU1jvILjNRZqlHkkCjEtAIwhnP08kPhiSgpqyE9LW/Et05kqlTp166wSsotABFlFJQUFBQULhKKC0tlQWqgoICeXm7du1kgcrV+vnCyausI6ei1pUjVVyM0+kgNDRMFnyOHz+G3W5v6GRVir+/HwbDyd2kJKw2G3V1dZjNZkSniM7DE5VKQF9dSlxUJG3btm16Uy1J8M47sGRJ08H070/dhx+yfft2kpKSKCoqAsDNzY3BgweTmJjY0Mb8HFixwlXGdzIvvwy33npu27mCmDdvHsnJyfzzn/8kKCjocg9H4SqgpKSEN954A29vb958883zyv9pjjlz5nD//ffz888/M3HiRHlfd999NwcPHkSv1zNr1iwSExPPuq17772XNWvWEBQUhNVqJTY2li+++OKMJW2lZhspRytx1luxWqxYrBZEp8u1KQjw43//Q1ryJkqPHeWLX9fRvnNXioqKqbfXU1R4mG/e/yd1NTW4eXhw7wuvEtE5Cjc3N2z19UiihKAS8PL0wuBtQKs5IYKLosidw2Lo2KEjb772Dz788ENmzJhBTk4ODz/8MJ988oksPO3cuROtVouHhweLFy/m+uuvZ8+ePYwePRqA7OxsMjMz0ev1PPzww8yfP5+HHnqI2tpaKisrqaqqIrRzN4xpaRg3rOWTpWuY9caLPPjiq3To2p37Rw3hzS+/oXOP3vL46u31HD9+nOcm38DT735I37jBlJWVoXfTU2+zUXb8GG88NI3l6XmnObMSDoeDerudJd/MZkC3ztSVHKeoqIi6urpT1tbpdISEhLBy5Up69uzJI488wnfffYfD4eCTTz5h+fLlbNiwgQ8//PCsn4NrHUmSKDHXU1hjpsxixym6pvACNIiSLqOchEuMEnB91g06De283XG3W/jnm66S/Oeff55OnTpdxqNRUGjKhbd7UFBQUFBQULgkBAUFMW7cOMaNG0dZWZksUB0+fJjCwkKWLl3aKgJVQY2FnIpaBAT0GjWBgQEUFRdTVl5GSEgIAgJubm7U19vlp/euZ1wStvp6V2B5nVl2ManVKgzeBjw8PBE0GgRfPwSfZlp7CwK89BJUVMDGjUhAvc1GZVIS/3zhBewN+4qMjCQxMZGYmJjzb1s/YQL88APk5JxY9sUXMG4cnKWj15VKeXk5giBcVeVXCpeXRYsW4XQ6ufXWW1tNkMrPz+err75i0KBBTZa/9NJLDBo0iN9++w2j0cgtt9zCoUOHWtQF7fnnn+fpp5/GZrMxcuRIPv30U1544YXTrl9jc4DgEo68PL1ovDZZzBYsFgt9hw7nur9M452nHnSJ6iHheBm8qKmuZv6H7zJozPUMum48u5I3Mvf/3uLVz7/BarWh0ajxMHji7uaGKElYLVbqnHVyjtPu7Vtw8/QifXcas2fPJjw8nK+++qrBWeUgJSUFcDmdCgsLiYiIoFevXixbtoxHHnmkSVj4sGHDWLlypdxo4s0332xyjHa7nc2ZOXz58X+IiOqKceMa/vq2S9wpLirG4XRQVlqKX0U5ep0evV6HTqslMCAABFfpY2VVJXa7HVF0olar8fP3BwREScRht2O327HbHdgdrv932O002hl++XY2Hvc9iL3sOD4+PnTt2vUU15Ofn6u8Lzc3lx49ejBgwAB++eUXOTPqpptu4qabbmrBp0pBEATaeOpp46mntt5BuaUek81Blc2OxeFEahCidGo1vm5aDDoNvm7ak5qNeHDLLbfw448/Mm/ePP7xj3+0SudHBYXWQPkkKigoKCgoXIUEBgYyduxYxo4dS1lZmZxB1VjysXTpUsLDw2WB6rT5Sn/AVO9gX5nJFayqcZW46PVueHt7U1NdQ011NT4+vujd3KDGlUUiik5MtbWYTLWySKVSqfAyeOHp4dEQQusSoCRJwuYU2VtWi69ei6fuD7ciKhXWV1+l4uBBSEnBXl9PSufOCCoVCQkJJCQkEBERceEnUKWCZ56BRx89sayiAr75Bh5//MK3fxmoqKjAx8dHmWgotIi9e/eyZ88eOnXqRExMTKtsUxRFHnzwQWbOnMnfGjtcNrBw4UIOHDgAQGxsLGFhYWzatEl2BrUEvV5PfHw8hw8fBlzCzKuvvsr69eupr68nKiqKL774gnqnht8XfseyOV+g1WoRRZG/vfMh3fsN4PEbRpIw/gYWffEJlWUlJK1cRtsOrvLgPdu3cCAzHVNVFZtX/MzN9z9GRUkxGak7+HLGK4yadBvp25Ox1NVx+5PP0nvgEOptVub831sczTtIVXkZfkHBxA0fRVZWFuXl5cyYMYOMjAzsdjtr167lyJEj+Pn5UVtbS0lJCfv27UMURWpqanj22Wd5//33ufvuu6moqGD48OH06tWLzz//nNGjR3PgwAEEQcBoNDJjxgzyDhcgiiJ9Bw5h2+pfWfbNV7z80eeEd+yMta6OT19/2VXCp9Fw+1+fI6pXNDq9HkEQcDiclJeVodFoXM0lPDworShHkkQKC1yl4vcPj2HSg4+zK3kjpqoqbrn/EUZNnMzPX39OVWkJy3+Yh6+XJ99++y09e/bk1Vdf5aOPPmryXpxJJJ87dy5Lly5l6dKlALz++ut89913+Pn5MXbsWObPn09+fj4Av//+O2+99RYWiwW1Ws17773HiBEj2LhxI08++SSJiYls2bIFh8PBN998I3+mf/31V9544w3q6+sRBIEvvviCgQMHYjQaefHFF6mpqcHpdPLKK68wefLkFn8WLydeOg1ef/jubCx+OlNJ37Bhw0hJSSEvL49Vq1YpDTEUrhiUuxYFBQUFBYWrnMDAQMaMGcOYMWMoLy+XHVT5+fkcOXKEZcuWtUigEiWJrFITdlHC7Q9deXx9fbFYLFRXV+Pu7o5GrabeXo+13IrD7nJMubm54enl6RKi3N0RmgkWFgQBvVqF1SmSVWYiNvREy+7CwkI2bdpESkoKtqAgOsTG4h8SQtRtt/F/gwbh7n7+nZ6aJSYGEhMhKenEsvnzXSV8LRTxrhQau3q1b9/+cg9F4SpAFEUWLlyIIAjcdtttrZbh85///IehQ4cyYMCAJsvLy8ux2+2EhITIyyIjI+Uy5Ndee42wsDAePVkkbobq6mo2btzIO++8A8D777+Pp6en7EB66623+Mc//sHjM95l9jtvMHfdVgKCQ1yun/oTodrV5eV8sWI9tw/pS+rGdYy9ZQrhnbvwzfv/xNvPn799+Dl52Rl8839v4hMQSGVJMZa6Wvan72L8Hfei0WpZMOtDesYOJtO4HXNtLS/N/IqXp03i+Y++oOTwQT588Wk8PDwwGo0cOHAASZLw8vLi3nvvpbi4mBUrVtCzZ086depEQUEB3377LcePH+fuu+9m/PjxLF26lGHDhrFx40b+9a9/YbVa+cc//oHVauWnn35i9OjRHCst596X3ySsXXtWLfwBlUpFdVU1PqZadG7uPPKPNwnv1IXcjHS+fmcGr345D5PJhCiKOBx2HE4ngiCgUqmwWm3YrDYkQK/XyQ42Xz8/PvtlLccOH+KJm8cw+b6HefjFV9nwyxL+78u5TB2dAMDbb7/d7Hvx3//+t0WfnV9//ZXFixeza9cuvLy8uP/+++Xf5eXl8cYbb/D777/j7e3NgQMHSEhIkAWrffv2MXv2bGbNmsXnn3/O3//+d37//Xf279/PfffdR1JSEt26dcNut2M2m6mqquLhhx9m5cqVhIaGUlZWRv/+/RkyZAht27Zt0XivNFryN6xSqbj77rt56623WLVqFQMGDDj30ncFhYuAIkopKCgoKCj8iQgICGgiUDU6qA4dOiQLVGFhYbJAFRoaKr/2qMlKhaUenerU1tMCAn6+fhw9epT8/Hz0ej0Oux1RFFFrNK7Q3TZtmgQInw5BENCpVJRZ6imoquVIdjpJSUnyBEOj0TCoISuqY8eOrrGIInz1FWRkwOjRcOONrnK/C+Wvf4XkZNf2AerrXR3//lAqc6VjMpmw2+34+/tf7qEoXAUkJSVx7NgxhgwZ0jrOQyAzM5PFixeTdLLI20L+WJr2R95//32+/vpr9u/fz/XXX8+IESMAWLp0KdXV1SxevBiA+vp6IiMjUQHRgxN499knGDRqDHHDRtOu44kMnfFT7nCJMWo1/QYOIsO4HR8/f9RqNVo3N3x8fIi/bhwrv/0fDruDwMBAdHo9/zd/EQICdaZqPnv9RUJC2tA3dhA/ffYxn7/xMu07dyE4LIxO7doyLzAQh8PB5MmTWb9+PevXr+edd95BrVYjSRLr1q0jODiY6667juXLlzNkyBCMRiMmk4nk5GQsFgu7du3C3d2dyMhINBoNY8aMITU1lcjISIYNG8bWHTuIHT4Swelg2A03s3bJQjw8PTAYvBCdDr7599s47HZUajXFRwrQatSIkhoBAZ1Oh5+fHwYvL9zd3dFqtWgEEZWgIiTkxPfC+Mm3o9VoiegUhVqtoaK0hKBQl5Bx8iX4dO9FS1m3bh2TJ0+WA9YfeOABNmzYAMBvv/3GgQMHmmSQqVQqWdTs3LkzAwcOBGDw4MF88MEHAKxZs4Zx48bJjR+0Wi0+Pj6sXLmSvLw8xo8f32QMOTk5V60o1VJCQ0OZMGECv/zyC/PmzeP555+/5roaKlx5KKKUgoKCgoLCn5SAgACuu+46rrvuOioqKmSBKi8vj2PHjvHLL7/IAlX//gMoEF2ZMie3nBZFJ2azmbq6Oqw2GxISdrsdnU6Hr68fVpsVSRTR6XQtEqTk7TrtWGz1/L59LzuX/gBAmzZtSExMZPDgwXj+Mddp0SJX5hPA1q1w5EjrlNlFRsJf/gILF55YtnIlTJ0KPXpc+PYvERUVFYDrPVdQOBN1dXUsX74cvV7PLbfc0mrb3bx5M/n5+XTp0gWAoqIiHn74YY4fP85jjz2GRqOhqKhIdkvl5+e32NnXmClVUFBAQkICn3/+OY899hiSJDFz5kzGjBnTZP2DlXW88t/ZFO7NZM/2Lbxy/1Tu+9srjLyx+eOVY6IFgerycvz9/PDzD0Cj0VBRUkzbiEi0Oj0GL5dgohZAdDrx8jLQuXtP5q7dyoPjEqksK+OuwX0IDgmlrqYalUrF6NGjKSsrA2Ds2LGuTni4BJLIyEhGjBiBRqNh8ODBfPXVV3Ts2JGtW7cSGRnJ0qVL6du3L/n5+cydO5dbb70VNzc3tmzZQmFhIfVWG09OGIaAgMNhx2Yx4+XlhcHLQHVlBY/9400GXzee4uIiHh49BLvNjsHXB7VaTUREBB07dGxyHtSqU7uP6vRu8v+r1GqczhNdANUnqVKney/OF+EP277uuuv4/vvvT1nv6NGjDSXiDWNSq5t0KmwOSZLo2bMnW7dubZWxXm2MGzeO1NRU8vLy2LRpkyzyKihcLhRZVEFBQUFB4RrA39+f0aNH8+KLL/Luu+8yZcoUOnXqJItTH335PwpLyrGa67DV26irq6WkpJgjR45QXl6B1WrDTa8npE0b/P39EQQV7u7uqAQBp9OJ2IJmvhISdXV1FBcXcezYcepqavAMbMPAYSN59tlnmTFjBqNHjz5VkAJocFHJfP11UyHpQnjooVPDzT/6CK6iBsXl5eWAIkopnJ1ffvmFuro6rr/+ery9vc/+ghby2GOPcfz4cfLz88nPz2fQoEF8+eWXPPbYYwBMnjyZzz//HACj0cjRo0cZNmzYOe2jffv2zJw5kzfffBOLxcLEiRP58MMPMZvNgCu8OysrC3cVFBXk06V3NFMefoLE8Teyb0+avJ3fF/8IuET33VuT6T80Af8Gd1BQaBg71q8ma2cKRUcKadM2nJDw04tnpcePcSA7E7vdzpK0HAKCQ/h6wSK+//57TCYTpaWl8rrz5s0DICUlBavVKruCGvHw8ODQoUOsXbtWXrZ7927q6+vln4cMGcL+/ftdeUxrN/C/9Sl89staFm7PQKXWkJGyjVpTNUgSDlSUl1ew6kfXfgOCAmgbHo5Kpbqg7DlJkvDwMuC0nOi4d7r3oqWMHDmSxYsXU1vr6vr69ddfy78bO3Ysa9euJT09XV7WWCZ4JsaOHcvvv//Ovn37AFcGWXV1NUOGDDnref4zo9FouPvuuxEEgZ9//ll+qKGgcLlQRCkFBQUFBYVrDD8/P0aNGsULL7wgC1SdowfgdIoUHz/GgdxcCgoKqK6udnVk8vMlPLwtbdqEYDB4ExQUhKASqK01IQEOp1MOWW0Oh8NOZVUlR48coaysTO5iZfDyxMfXl6Fjr6dr165nzsS44QZXOPnJvP8+rFvXGicEHnig6bK0NNi06cK3fYloFKWU8j2FM3H8+HE2bdpEYGAgo0aNuqT7fu+999i6dStdunTh3nvvZf78+XJu0WuvvSYLVmfjpptuolu3bsyaNYsXX3yR2NhYBg4cSJ8+fRg0aBC7d+/GQyPw8cvP8ODYBB6eMJz9GelMfuAxeRu5mRmM6RJK6fFjmOvqePfZJ6itreOJN99Hq9Pxyasv8rc7JuEfFMSL/z6RifTBi0+zdc1vTcaTl5PNa4/cg8Nu5/Gbr2PkxL8wsH8/l2PJYJCFKJVKRWZmJtHR0dx33328//77LFu2jAkTJshiiEaj4ddff+Xtt9/m2LFjTJo0iZdeeqnJ9dXPz48nn3wSh8PBU/ffzdMTryNjZwqi6ETv7s6GFcuoqTXj4WXgq3/+g38+dg8BAYEAeLh7NJv1d66IwE13P8jfn36Svn37snv37tO+Fy3lhhtu4Oabb6Zv377ExsbKXQjBVZ73/fff88gjjxAdHU337t356KOPzrrNzp07M2fOHO68806io6MZOHAgOTk5+Pn5yec5OjqaHj168NJLLyE2lnFfA3Ts2JHhw4djs9n47rvvzvgdrqBwsREk5ROooKCgoKBwzlitVqZOnUp2djbu7u4EBwfz2Wef0bmzq4tTSUkJd999NwcPHkSv1zNr1qwmeRhnY9iwYRw9epTc3NwzijUbN27EarUybtw4AI4dO8Ztt93G5s2bAVi2bBkvvfQSer2eefPmcdddd7F582YMBgNOp5O9e/eSkpKCI6wzngHB1FVX8s2/32bgyLH0jB2ISlCh1Wrw8PDEw9MDnVYLuASpF+78CyMn3Ub3AXEEBgXRJvhEOPioDkH8sG0PkkqN1WJ1LRTAw90dL4MB94aOfL8s+I7BgwcxJXHgWc/JG7fdRtXGjXzUrh1zy8pYWlXF0u7dSX38cd5fsYIFCxa0+PyeQn29K+D8+PETy9q3hwULoAUt6y83P/74Ixs2bOCNN95okhOmoNCIJEl88sknZGdn8+ijj9KvX7/LPaSLhiRJbDlSQY3NgZumaUnaHfH9efPLb+jco7e8rKKiHJOpFi8vrwtyG9qcIlq1wPD2AWguQU6P3Snye+4xLFYrdTXVSK4KRDw8PPDy8mrS+bQ1qXeKqFUwvH0gWnXrHafJZMJgMCBJEn/729+wWCx89tlnrbZ9haZYrVbeeOMNKisreeCBB4iLi7vcQ1K4RlEypRQUFBQUFM6Thx9+mPHjxyMIAp9++ikPPvggGzduBOCll15i0KBB/PbbbxiNRm655RYOHTokOwPORG5uLrm5ufj5+bFp0yaGDx/e7HoOh4ONGzdSVVUli1JhYWGyIAXw+eef89prr3H77bcDkJaWRm5uLkajkbS0NOrq6lBpNMT3Goi7XkdARARvffY1TqcrS8psNmO12aiurqa6urqJQKVSqxBFEUmScNjtrjE5HdSaagEoL6vAw2BArVFj8PLCy8sLtbrprce6JQvx9fVFTIhDdbbg8u7dobwcqqpOLLPbifnf/1jw1VdnPa9nRKeDp56CV145saygABYvduVLXeEoTimFs5GRkUF2djZdu3alb9++l3s4FxVBEGjv7U5GqQlRks54bbHV2zDV1qJSq/Dz8z3vfUqShChJhBs8LrogVVlZydatW9myZQt+XfsQ3rs/Go0WL4MXnp6ezWZDtRaSJOGUJMK93FtVkAK4++67yc/Px2q10rNnzxa75xTODzc3N+68805mzpzJggUL6NGjB15eXpd7WArXIEr5noKCgoKCwnng5ubGhAkTZBfToEGD5O5xAAsXLpTbm8fGxhIWFsamFpaDff3119x55508+OCDzJ49W16en5+Pr68vL774Iv379+fTTz/l888/57vvvqNv3768+eab8joAf/3rX9m8eTOvvPIKAwYMYOHChajVat555x02b95MVVUV27dvZ/26dfzj7slsWr4YnVbHs1Mnsm3dagwGbzK3b+G9vz7EW4/ezRsP3oFx03qqq6s5fuw4kighIeFwODCbzZSUlnD06FGqq6td58hdT3BwEC/cdhNLZn/O9Mk3Mi1hAPNn/huAX3+cR27mbj7756v07duPlStXAvDBBx8QFxdH//79GTduHIcPHz5xcnr2dDmaTmJjURF9Y2Lg2DEAvvjiC6Kioujfvz9vvfVWE6eZ0Whk5MiRxMTE0K9fP3766acT53bKFF53OBiwdy+dMzNZWV0Ny5cDsG3bNuLj44mOjqZPnz4sW7YMcAmI119/PbGxsfTp04dPP/20Re9xa1NRUYGnpyd6vf6y7F/hysbhcPDTTz8hCAJTpkxpUfv4q51QLzf0ahV2sWlRyPfJaSe5pCQqystBcpXFqS5AzHFIEmqVQFuD29lXPg+cTie7d+/m008/5eWXX2b58uWYTCZCPLR4eXoSHBKCt8H7ogpSAM4Gka+twb3Vt/3zzz+za9cu9u7dy6JFiwgMDGz1fSg0pVevXsTFxVFbWyt/HyooXGoUp5SCgoKCgkIr8PHHH3PzzTcDLteK3W6Xu0wBREZGyu2rX3vtNcLCwmTR6mScTifffPMN69evJzAwkBkzZlBdXY2Pjw8A1dXV9OzZk/feew+Aqqoqqqqq5HyNk4WxF198kfXr19OtWzcCAgJY15C/NGjQIOLj45k0aRIzZsxg/C1/YdvRCuqqKk8ZT0ziCEbeNAlBECg6UsCTt4wjYcx47A4HoiQhOSWcTpHaujpUKjV6vU5+0hoUFIy7uwcAdTXVfLpkFdUV5dw1PJaxk+/g+ql3sXbpIm669yFeuP9ODDoN33//PTk5OWzbtg21Ws28efN4/PHH+fXXX10DEgR48UVISoJt204M1OGAJ58k87nneOONN9i1axchISG8/vrr8ipVVVU8/PDDrFy5ktDQUMrKyujfvz9DhgyRz22fu+5ixg8/8Ft1NdMLC5nQrx8VFRVMnDiRRYsWkZCQgCiKVFVV4XQ6uf3225k/fz7dunXDbDYzaNAgBg4cSGxsbMs+OK1EeXk5QUFBl3SfClcPGzdupKSkhMTERMLDwy/3cC4JWrWKSF8PcsprcUpSk05xjZhMJurr7ejd9Hg112ChhYiShEOUCPd2w6Br3elVSUkJycnJbNu2jZqaGgAiIiKIj48nNjYWNzc3UouqKKmrRy1IF1VwlCQJuygR5KHDV69MI/8sTJkyhaysLLZv305cXBw9e/a83ENSuMZQriYKCgoKCgoXyNtvv82BAwdk0edsvPnmm6f93cqVK4mMjKRbt24AjB49mu+//17uYKXVarnzzjtP+/ry8nIcDgczZszg2LFjVFRUYLFYiIuLIzY2li+//JKpU6dy9OhRrFYrt99+O9VWV+mdj/+pWSpFhQW88/SjlBYdR61WY6qq4kj+IfzbhCAAGo0KDw93VCoVICGoVGiaKVEcefOt8j5C20VQVHiYoJBTs4+WLl2K0WhkwIABgEukOwWVyuWW2ru36fKCAtY/8wzjRo+WBcGHHnpIPt9bt24lLy+P8ePHN3lZTk4OHTt2xM3NjUnPPgtt2zL4P//h4MGD8MwzbNu2ja5du5KQkNCwexX+/v5kZ2eTlZXF1JPK+0wmE9nZ2ZdUlLJYLFgsFqXznkKzmEwmVqxYgbu7OzfddNPlHs4lpYOPByV1NiqtdtzUqiaCjdPpoKqqCkGAAH9/LiR7qd4p4qFV083fcPaVW4DdbictLY3k5GT2798PuHKiRowYwdChQ2nXrl2T9XsEGKiyVlLvFNFrLp5Tql4U0akFegQargm33bWCwWDgtttu4+uvv+a7777j9ddfV1y3CpcURZRSUFBQUFC4AD744AOWLFnC2rVr8fBwuYICAgLQaDQUFRXJ4kh+fj7t25++rXgjs2fPZv/+/URGRgIuwSE/P18WpTw8PBoEoBPYbDbWrl2L0WgkIyMDu91OSUkJ/fr1IzU1lXvvvZfJkyefdp9qleDqyCRxyrzsn089xJ3Tn6Nf/HCsVitP3jCS6spKAkJCUWs0+AcE0q17dxx2BzU11dTV1VFe5so3MplMeDa0PNeddIOrUqubiE0CyC4GSZJ4+eWXefjhh898ojQa6NULPD3h5A5Px4+DyeRyTmk0TSZOkiTRs2dPtm7desrm8vPz0ev1rvWnTkV9/fU4vb1h8GBodGn9AUmS8Pf3P6cOUxcDJU9K4UwsW7YMi8XClClTMBhaRzS5WlCrBHoGGdhxtBKbKKJXnRCmKiorEUUJHx9vtFrdee/D5hRRCQLdA73Qay4sGeXIkSMkJyezY8cOzGYzAFFRUcTHx9O/f//TZhJ66jRE+XuSVWrCIYoXJdPKIYpIEnTx88Krld1gCpefuLg4duzYQVZWFsuWLWPKlCmXe0gK1xBKppSCgoKCgsJ58p///IcffviBNWvWyDlOjUyePFkOaTUajRw9epRhw4adcXvFxcWsW7eOAwcOkJ+fT35+PsePH+fYsWPs2bOnybq1tbUkJSWRlpbG+vXr+emnnygoKKBLly7odDo++OADHn30UQwGQ7MTma5du+Lh4cEPP/yAh1aNWiVQUV4GSIiSiLmujuPHj1FdVYmblw8Wi5WU9aupM9UQGBRI27Zt0Wo06HQ6BAS0Wi0BAa7l3t6uiW9VZRVHjh5FFMXTttp29/TCVmfCvWEyN3HiRD7//HMqKioAl2Ng165dzZ8wjQZmzgQ/P3nRCIOB3w8coOTll0GSmmRyDRkyhEOHDrF27Vp52e7du+V27E04Scwa0r07uTk5bE5KAkAURSoqKujatSve3t7MmTNHXvfAgQPy2C8VjaKU4pRS+CONIkebNm1O2zDhz46PXkufYG/UgoCtoTGDxWLBXGdGo1HLpdHng80pAhJRAZ6EeJ5flpTVamXz5s28/fbbvPXWW2zYsAGNRsPYsWN58803+dvf/sbAgQPP2iSjvbc74d7u2EUJx2mut+eLQxSxixJtDW5E+LR+lpTC5UcQBKZNm4Zer2f9+vUcOnTocg9J4RpCEaUUFBQUFBTOgyNHjvC3v/2NqqoqRowYQd++fRk4cKD8+/fee4+tW7fSpUsX7r33XubPny9PKl577bVmuwp98803jBkzponApVKpmDp1KrNnz8Zms+F0Opk5cybPP/883333HZ6entTW1rJu3Tr8/f257777UKvVuLufeeKg0WhYtmwZc+bMoU/v3jwyLpH1vyzhyNGj1NvqqaszY7c7uPdvL/P5my/zr8fvpfRIIcFh4Q3H0Xzphlqtwc/P5djx8fEGXCJOSUkJlZUVOJ2OJuuPve1Ofpz1Cf36uYLOp02bxr333suIESOIjo6mb9++rF+//vQHEhwM06eD2lWy0tvdnX+EhDB05kz6t2+P1WqVJ51+fn78+uuvvP3220RHR9OjRw9eeuml0wpmAKxejd+dd/Kznx8v3XUXffr0oX///mzZsgWNRsOKFStYsmQJffr0oWfPnjzwwANYLJYznvvWplEEU5xSCicjSRILFixAkiSmTJmCWn1xA7CvZEK83IgO9kYjCFidTiobOnj6+/sjCOc+HRIlCYvDiQB0CzDQwcfjnF4vSRIHDx7km2++4fnnn2f+/PkUFBTQq1cvHn30Ud59910mTZpEmzZtWrxNQRDoFWQg3OCGQ5Sod7oEuAtBklzbaRSkegd7K2V7f2ICAgK4+eabkSSJb7/9FofDcfYXKSi0AoJ0oVcrBQUFBQUFhYuG3W4nIyODlJQUMjIy5JvEiIgIYmJiiI2Nxe8kp1BLqa6uJj09nfT0dPbu3Ut434FE9B+I3WLGw90dd3d33NzcL3gCIkkitbW11NTU4HA4EQTw9PTE28cHjVqD1SkS5e9JF/8LbEOdng6PPQY2GyanE0PDBPzjgQP5LS+PVatWnd92p0yBvLwTP7/9NowZc2FjbWUWLVrEmjVr+Pvf/96iElGFa4O0tDS++OILevbsyV//+tfLPZwrgiqrnfVZB7ChRq1WEeDjc07XOKkh0NwhSXhq1fQINBDs2fLsndraWrZv305ycjLHjx8HXELA0KFDGTJkyHldy/+IKEkcrKwjr8qMQ5TQq1WozuM6LkoSNqeIRiUQ6eNOF3+v89qOwtWFKIq899575Ofnc/PNNzNhwoTLPSSFawClIFhBQUFBQeEKw+l0snfvXlJSUti9ezc2mw2AkJAQYmNjiY2NPacn6OCaTB05ckQWok7u0hcREUGP9mGovLzQ+fq2ah6JIKgwGLzxMhioq6ujprqa2to6auvq8PTyxsPTgxCvVmih3qcPvPMOPPccLxUUsKW2FrskEVZczBebNp3/dv84Sfz0Uxg+HHTnn0HT2ijlewp/xG63s2jRIlQq1Rnz5K41rFXlrJ/7Ge37xdE7YRRWp+hq2KBSoRZoVqCSJAlRAockIkqgUQm0N7jTNcALnfrs10pJkti3bx/Jycns2rULp9OJWq0mJiaG+Ph4unXr1qruI5Ug0MXfi0APPVmlNdTYXA8yNCoBtSCccV+SJOFs6LAH4KPX0DPIgJ/blXO9U7i4qFQq7r77bv75z3/y66+/0q9fP0JDT21KoqDQmiiilIKCgoKCwhWAKIocOHCAlJQU0tLSqKurA1xCw4gRI4iNjaVt27bnNHmx2+3k5OTIQlRlZSXg6uDXu3dv+vTpQ58+ffD19UWSJHYcq6LcUs8FZvU2i4CAl6cXXp6emM0WamqqcUoSh7LSyV25j3Hjxl345CwxEf7+d/771lsnlk2ZAh07nv82b7sNdu488fOxY7BgAdx11/lvs5WpqKhAr9fLQfsKCmvXrqW8vJxRo0YpE8oGJEni+++/x15vI7ptEMM6BHO81kZBjRmL3VWiJuDq9/BHVALo1SraebsTZnDDU3v2KVRlZSXbtm0jOTlZFo5DQ0OJj49n4MCBFz103s9Ny+C2/hTVWSmssVBldWBvKFVWCa5rcuPxSriEN9fvBPzdtbTzdifU0w21SnFHXWu0bduWcePGsXLlSubNm8fzzz+vlG0qXFQUUUpBQUFBQeEyIUkShw8fJiUlhZ07d1LVkHPi7e3NyJEjiY2NpUOHDud0M2gymcjIyCA9PZ3s7GzZZeXt7U18fDx9+vShe/fu6P7g9BEEgQgfdyqs9Rete1PDnvDw8EDn5obVbqe6rorMffvYt28f7du3Z9y4cfTr1++UDoMt5uabXe6mhQuhfXu40LKlESOgXz84OWx99my48Ub4Q7j95aK8vLwhG0eZNChAVVUVq1atwtPTkxtuuOFyD+eKISUlhZycHMLCwhg9ejRqtZoOvh5E+rhTa3disjkw1TuwOpyIkku40alVGHQaDDoNXjrNWQUap9NJRkYGycnJZGZmIkkSOp2OIUOGEB8fT8eOHS/p36laJdDW4E6YlxvVNgeVVjs1NjtVNjs2h0ugEgC9Ro2vXou3XoufmxYfvUa5nlzjXH/99aSlpXHw4EGSkpLO2qhFQeFCUEQpBQUFBQWFS8yxY8dISUnBaDRSVlYGgIeHB/Hx8cTGxhIVFdViUUaSJI4dOya7oQ4dOiSH24aHh9OnTx+io6OJiIg46yQjxFNPGw89RXU21IJ00SYlUkN5SHtfL268cyoFiUP4/fffSUtL48svvyQ4OJixY8cyaNAgNJrzuFVJTHT9O5mcHCgrg4EDXV37WoogwDPPwN13n1hWWwtffQXPP3/uY2tl7HY7JpOJiIiIyz0UhSuEpUuXYrPZuPXWWxX3XANms5mffvoJgGnTpjUJfRcEQRaezpeSkhKSk5PZtm0bNTU1gKssuvGafrbGExcbQRDwddPi63aig58kSUi4RClFgFL4IxqNhrvuuov3339fbubRGplnCgrNoYhSCgoKCgoKl4DS0lKMRiNGo5Fjx44BoNfriYuLIzY2lh49erRYgHE4HOTm5rJnzx7S09Pl0hCNRkOPHj3ksrxz7cYmCAI9Ag3yU3S9WtXqkxVJkrA6Rdw1KroFeLkcWhERPPzwwxQXF7N69Wq2bdvGvHnzWL58OaNHjyYxMRE3twvInVqyxBVQDtClC8yadWpW1Jno0QPGjYPffjuxbNEiV2nfZQ4Wb+y8p+RJKQDk5+ezbds2wsLCSEhIuNzDuWL4+eefMZlMDB06lM6dO7fKNu12O2lpaSQnJ7N//34A3N3dGT58OPHx8bRr165V9nOxEAThND1UFRRcdO7cmWHDhrFp0ya+//57Hn/8cUXAVLgoKKKUgoKCgoLCRaKqqorU1FSMRqMcLK7RaOjbty+xsbH07t0bvb5lnZtqa2vJzMxkz549ZGdnY7VaATAYDAwZMkQuy7sg8QZw16rpFeTN7uJqbM7WFaYkScImimhVAr2DvXHTNG1R36ZNG+666y5uvPFG1q5dS1JSEosXL2bVqlUMHz6ckSNHnl8Oy9KlJ/4/NxemT4fPP4dzcZE88QSsXw/19a6fnU74+GP497/PfTytiBJyrtCIJEksWLAAgNtuu+38S2D/ZOTn57N582Y8PT2ZNGnSBW/vyJEjJCcns2PHDsxmMwBRUVHEx8fTv39/tFrtWbagoHD1MGnSJPkB2M6dO4mJibncQ1L4E6KIUgoKCgoKCq1IbW0taWlpGI1GcnNzkSQJlUpFjx49iI2NpV+/fi0q5ZAkiaKiItLT09mzZw95eXlyWV5YWBjR0dH06dOHyMjIVp98tvHU0yvIm8zSmlYTphodUlqVQJ9gb4I8Ti/G+fr68pe//IXx48ezadMm1q1bx8qVK1mzZg3x8fFcd9115ybCdO4M2dknfs7OhhdfhA8/bHkpX2go3HEHzJ17YtmmTZCWBv37t3wsrUyjKHWurjiFPx9Go5G8vDyio6Pp1q3b5R7OFYEoisyfPx9Jkrj11lvx8vI6r+1YrVaMRiPJycnyAwZvb2/Gjh3L0KFDz7kbqoLC1YKbmxt33HEHs2bN4scff6R79+54enpe7mEp/MlQRCkFBQUFBYULxGq1snv3boxGI9nZ2YgNHY46d+5MbGwsAwYMaJHDx+l0kpubK+dDlZaWAqBWq+nWrZtclhcYGHhRjwegrcENrUogs7QGi8MlJp1v+LlDdHW28tCq6RVkOKMgdTKenp5MmDCB0aNHs2XLFlavXs2GDRvYtGkTcXFxjB07lrCwsLNv6LHHICUFiopOLNu2Dd58E2bMcOVGtYT77oNly6ChiyEA//kPfPstXCZXilK+pwBgs9lYsmQJGo2Gv/zlL5d7OFcMGzZsoLCwkE6dOjFkyJBzeq0kSRw6dIjNmzeTmppKfX09giDQq1cvuWnEydlUCgp/VqKjo4mJiSE1NZVFixZxzz33XO4hKfzJUEQpBQUFBQWF88But5ORkYHRaCQjIwO73Q5A+/btiY2NJTY2tkWhoGazmczMTNLT08nMzMRisQAuQWbQoEH06dOHnj17XnBZ3vkQ7KlniN6fvWW1FNVZsTucaFQCGkE4q3NKkiQckoRDlFAJEG5wo1uAAb3m3MUbnU7HiBEjSExMxGg08ttvv7F9+3a2b99OdHQ048aNo2PHjqffQFAQfPopPPAAVFefWL5yJQQGtrxDn6cnPPIIvPvuiWX79rmypiZMOOfjag0Up5QCwOrVq6msrGTs2LEEBwdf7uFcEVRVVbF8+XJUKhXTpk1rsduztraW7du3k5yczPHjxwGX6Dt06FCGDBmihD0rXJPcdtttZGdns3XrVuLi4ujevfvlHpLCnwhBaqwFUFBQUFBQUDgjTqeTvXv3YjQa2b17t5zrFBISIgtRLSnjKC4ult1QBw4ckJ1VISEhcllex44dr5hMGEmSKDXXU1BjocxSj1N03TqoBAG1AMhxuRJOCcSGWwuNSiDIXUc7H3cC3XWtmk2Vnp7Ob7/9Rl5eHgBdunRh/Pjx9OjR4/T7yciARx8Fm63p8mefdZXmtQSnE6ZOhUOHTiwLDnaFqV8G4fCDDz7g0KFDfPrpp0oA7TVKRUUFr732Gu7u7rz11luXRcC+Evnyyy/ZuXMnY8aM4dZbbz3jupIksW/fPpKTk9m1axdOpxO1Wk3fvn2Jj4+ne/fuyt+XwjXP1q1b+eabbwgMDOT1119Hp9Nd7iEp/ElQnFIKCgoKCgpnQBRFDhw4gNFoZOfOndTV1QGuJ+fDhg0jLi6Otm3bnnHCIooiBw8elMNCi4uLAVCpVHTp0kUuy7tSHQ6CIBDsqSfYU09tvYPiOhvVNjtVVgd2UcTVWNwlTblpVPjqtXjrNYR46vG8gDbrZxpPo3h34MABfvvtNzIzM8nNzSU8PJxx48YxYMCAU0W93r3hvfdcIlSDEAi4SvACA2HMmLPvXK12BaU//fSJZSUl8P33cP/9rXJ850J5eTl+fn7KhPkaZsmSJdjtdm6//XZFkGogKyuLnTt34ufnxw033HDa9SorK9m2bRvJycmy6zA0NJT4+HgGDhx4fo0VFBT+pAwePJiUlBT27t3L8uXLlVJhhVZDcUopKCgoKCj8AUmSOHz4MCkpKezcuZOqqirAFWw7YMAA4uLi6NChwxmFAIvFQlZWFunp6WRkZMhdmjw8POjVq5dcludxLh3grjAkSaLeKeJsuJNQCwI69dlL+y4GhYWF/P7776SmpiJJEoGBgYwdO5bBgwef2g1r+XJXntTJaDTwyScQF3f2nUkSPP44GI0nlnl4wM8/wyXMdhJFkSeeeIKoqCieeeaZS7ZfhSuHgwcP8n//93+0b9+eV155RREncZVWv/HGG5SVlfH4448THR3d5PdOp5OMjAySk5PJzMxEkiR0Oh0xMTHEx8fTsWNH5TwqKJyGsrIy3njjDRwOBy+//DIRERGXe0gKfwIUUUpBQUFBQaGBY8eOkZKSgtFopKysDHCJSP379yc2NpaoqKgzltSVlpbKZXn79++Xy/KCg4Pp06cP0dHRdOrUSQnHvYiUlpayevVqtm7disPhwNvbm9GjR5OYmNi06+HXX8OsWU1f7OEBX30FXbuefUf798O0aS6BqpEHH3SVB14iysvLeeWVVxgyZIgSPHsNIkkS77zzDocPH+a5556jS5cul3tIVwTLly/n119/pU+fPjzxxBPy8pKSErZs2cLWrVupqakBICIigvj4eGJjY1vUFVVBQQHWrFnDokWLCA8P55VXXlHuaRQuGKV8T0FBQUHhmqa0tBSj0YjRaOTYsWMA6PV64uLiiI2NpUePHmg0zX9diqLIoUOH5LK8xlBcQRDo3LmzLEQp7cIvHUFBQUybNo0bbriBdevWsWnTJpYsWcLKlSsZMWIEI0eOxNvb29VJr6wMFi488WKzGZ56CubMgbZtz7yjqCi44Qb45ZcTywoKLs5BnQal8961zbZt2zh8+DAxMTGKINVAcXExv//+O1qtlqlTp2K320lLSyM5OZn9+/cD4O7uzvDhw4mPj6ddu3aXecQKClcfo0aNwmg0cvjwYVavXs348eMv95AUrnIUp5SCgoKCwjVHVVUVqampGI1G8vPzAdBoNPTq1YvY2Fh69+6NXq9v9rVWq5Xs7Gz27NlDZmYmtbW1ALi5uclleb169cLT0/NSHY7CGTCbzSQlJbF27VpMJhMajYahQ4cyZswYAv394eWXYd26pi9q1w5mz4azdbQrL4eHHnKJUVotfPxxy8r/Wont27czZ84c7rnnnnNud69wdWO1Wnn11VexWCzMmDFDESZxOcc++ugj9u3bR0JCAhqNhh07dsil01FRUcTHx9O/f/9TS3oVFBTOiSNHjvCvf/0LlUrFa6+9pjx8U7ggFKeUgoKCgsI1QV1dHTt37sRoNJKbm4skSahUKnr06EFsbCx9+/Y9bb5TeXm5XJaXk5OD0+kEIDAwkIEDB9KnTx86d+58WkeVwuXDw8ODcePGMWrUKLZu3crq1avZtGkTmzdvJiYmhrGPPEJ4VRXs3HniRYWFriDzr76C04iTgCs/au5cyMqCiAgIC7vIR9OUxmBmRZC49li1ahU1NTVcf/31yvvfQHJyMhs2bKCurg5RFFGpVBgMBsaOHcvQoUOVSbOCQisSHh7O2LFjWbVqFfPnz+fZZ59VstgUzhvl7llBQUFB4U+L1Wpl9+7dGI1GsrOz5Yynzp07Exsby4ABA5rtriRJEocOHZKFqKNHjwKusryOHTvKZXkhISHKTdhVglarZdiwYSQkJJCamspvv/1GSkoKKSkp9OvShWlHj2IoKjrxguxsWLkSbrnlzBv29obBgy/u4E+DIkpdm5SVlbF27Vp8fX0ZO3bs5R7OZaXxWr127Vo+++wzrFYrffv2pU+fPsTHx9OnTx8l70ZB4SJx/fXXs3PnTvbv309ycjIJCQmXe0gKVymKKKWgoKCg8KfCbreTkZGB0WgkIyMDu90OQPv27YmNjSUmJgb/ZsqybDYbe/fulYUok8kEuPKl+vfvL5flKS3Cr25UKpWcF5aVlcWqVavYlZtLrr8/j+XlESYIuLu7IwA0fAZazMaN8Omn4OkJr74KnTtfhCM4QUVFBYIg4Ovre1H3o3BlsWjRIhwOB5MmTTptmfGfndraWrZv305ycjLHjx/nwIEDAIwfP55XX30VPz+/yzxCBYU/P1qtlrvuuot///vfLFq0iN69eyvfRwrnhSJKKSgoKChc9TidTvbu3YvRaGT37t1YrVYAQkJCiI2NJTY2ttnSjcrKSlmE2rdvHw6HAwB/f3+GDx9OdHQ0UVFRSlnenxBBEOjVqxe9evXiwIED/P7778x2OLh1xw7CKitxi4rCd8wYTt9r8Q+YzfDGG9CQMcYTT8DPP7s6+l0kysvL8fHxUT6f1xA5OTns2rWLjh07EncJ88uuBCRJYt++fSQnJ7N7924cDgdqtZqIiAiqqqro06cPM2bMUB4cKChcQqKiokhISGDz5s38+OOPPHoJO9Aq/HlQ7mIUFBQUFK5KJEkiNzcXo9HIzp07qaurA1ylTMOGDSM2Npbw8PAm5XWSJFFQUCB3yyssLARcAkVkZCR9+vShT58+tG3bVinLu4bo3LkznTt35ujEiaxetYrFmzZRrdfj+8knjBkzhqFDh7YsGLnhMwi4QtC//RYu0g26JElUVFQQERFxUbavcOUhiiILG7pF3nbbbdfMNaqyspJt27aRnJwsl6yGhISQkJBAbGwsM2fOxNfXl1tvvVURpBQULgOTJk0iPT2dXbt2kZaWRv/+/S/3kBSuMhRRSkFBQUHhqkGSJA4fPozRaCQ1NZWqqioAvL29GTFiBHFxcXTo0KHJZK2+vp59+/bJjqjq6moAdDod0dHRREdH07t3b7y9vS/HISlcQbRt25b7HnyQsokTWbNmDVu2bGHbxx/j//DDBLVpg9+bb+I2YkTzL/bwgCFDYMuWE8vmzYNJkyA4uNXHajKZcDgczZaiKvw5SU5O5siRIwwaNIjIyMjLPZyLitPpJDMzk82bN5OZmYkkSWi1WoYMGUJ8fDwdO3ZEEATWr19PYWEhHTt2ZOjQoZd72AoK1yQeHh7ccccdfPbZZ/zwww9069bttI1jFBSaQxGlFBQUFBSueI4dO4bRaMRoNFJaWgq4boKGDh1KXFwcUVFRqFQnCq2qqqrIyMggPT2dvXv3yrlSvr6+JCYmEh0dTdeuXZW24ArNEhgYyO23384N11+PNT4eS3U19ZWVFN1+O3lPP82Axx7Dx8fn1BdOnw7btkFDoD42G8ya5Srra2WUkPNrC7PZzLJly9Dr9dxytvD9q5iSkhK2bNnC1q1bqampASAiIoL4+HhiY2Nxd3eX162qqmLZsmWoVCqmTZt2zTjHFBSuRPr27Uv//v1JS0tj8eLF3HXXXZd7SApXEYoopaCgoKBwRVJWVobRaCQlJYVjx44BLndTbGwscXFx9OjRQ87SkSSJwsJCuSzv8OHD8nYiIiLkbnl/LOdTUDgTBjc3DD4+iFotJpOJmpoa2n38MR+np9NxwgTGjBlD8MkuqI4dYeJEWLLkxLJff4Xbb4euXVt1bIoodW3x66+/Ultby8033/ynCxK22+2kpaWRnJzM/v37AXB3d2f48OHEx8fTrl27Zl/3008/YbVaue666wgPD7+UQ1ZQUGiGqVOnyrlvcXFxdG3l7z2FPy+KKKWgoKCgcMVQVVXFzp07SUlJIT8/HwCNRkN0dDRxcXH07t1b7jZlt9vJzMxkz549ZGRkUFlZCbi6wTRmQymdYBQuCJ0Obr8d1ddf4+PtjcFgoK6ujju2b+crQSA5OZkBAwbw/+zdd1wU59bA8d9soVdRsaASKzbAghUMdjSxJUaNGmMSU673vbkxN4mptpiYXk2PibFGjcZEo9gbVlCwYC/YUFCkwy5b5v1jZSOxoYKLcL73k/fV3Zlnzi64O3PmPOeJior6+8L5uecgOtrW+BxAVeHTT+Gbb6AEE6KXLl0CJClVEaSkpLB27Vr8/Pzo3r27o8MpMWfOnCEmJobt27eTd/nfS8OGDQkPD6dly5Y3rGTdv38/cXFx+Pr60qdPn7sVshDiBry9vRk4cCAzZsxg5syZjB8/XirSRbFIUkoIIYRD5ebmsmvXLnbs2MGRI0dQVRVFUWjcuDFt2rQhNDTU3psgKyuLuLg4+7Q8o9EI2HpKRUREEBwcTFBQEE5OTo58SaI8ee45OH0aVq1Coyh4enjgAbyanMy09u2Ji4sjLi6Opk2bEhUVRYMGDVBGjrRN2ysUFwebNkGnTiUWVmGllPSUKv/mz5+P1Wpl4MCB9/wFnsFgIDY2lpiYGPuNB09PT3r27EnHjh2vuUrqP5lMJubMmQPYGr4X3qgQQjhehw4d2L59O4cOHWLJkiU89NBDjg5J3AMkKSWEEOKuMxgMJCQkEBsby/79+7Fe7sFTr1492rRpQ6tWrfD09ERVVc6ePcv69evZs2cPSUlJqKoKQK1atewVUXXq1JFpeaJ0aDQwcSKkp9uSS4AC+GZn87/Tpznw3/+yfMMGEhMTSUxMpG7duvTq0oXm/v4oKSl/j/P557ZG6LqSOfUqrJSSpFT5lpiYyL59+2jQoAEtWrRwdDi3RVVVTpw4QUxMDHFxcRiNRhRFoVmzZoSHhxMcHIxWqy32eNHR0Vy4cIHg4GBCQ0NLL3AhxC1TFIXhw4czadIkVq1aRevWraldu7ajwxJlnCSlhBBC3BUmk4m9e/cSGxvL3r177c3Ha9euTVhYGK1bt6ZSpUqYzWYOHz5sXy2vsCJEp9PRtGlTeyLK19fXkS9HVCROTvDRR/DMM3C55w2AcuAATaZPp8mnn3L89Gmio6PZvXs3Xx0/TicfH/odP467uzsKwMmTtl5TgwaVSEhpaWl4eHhIlUg5ZrFYmD9/PoqiMHjw4Hsu8Z6Tk8O2bduIiYnh3LlzgG26ac+ePenQocNtfYanpKQQHR2NXq9nyJAh99x7IkRFULVqVfr06cOiRYuYMWMGr7/+epHFaIT4J0lKCSGEKDUWi4UDBw4QGxtLQkICBoMBAH9/f9q0aUNYWBj+/v5kZ2ezb98+9uzZQ2Jion1anqenJx06dCA4OJgmTZrIBbhwHA8P+OILePJJuNx4H4Bt22DSJOpOnMjo0aM5d+4cK1asYPO2bdQzmwk4exYvLy88PDzQfP899O5tG+sOpaWlFWuqk7h3rV+/nvPnz9+w2XdZo6qqvdFxQkICZrMZrVZLq1atCA8Pp3HjxredSFJVlTlz5mA2m+nfv7/0UxOiDOvevTuxsbGcPn2a1atX06NHD0eHJMowSUoJIYQoUaqqcuTIEWJjY9m5cye5ubmA7Q75/fffT1hYGDVr1iQlJYWEhAR2797N8ePH7dPyatasaa+Guu++++ROuCg7KleGqVNtiamMjL8fX77c9tx//0v16tUZOXIkffr0YWdgINZPPiH90iUyMzLwzMrC9ZtvcH755TsKIy8vD4PBIFP3yrGcnByWLl2Ki4sL/fr1c3Q4N5Wens7WrVuJiYmxV7dWq1aNiIgI2rZti6en5x0fIy4ujoMHD1K9evVy1fBdiPJIo9EwYsQIpkyZwp9//kloaGjR1WqFuIIkpYQQQtwxVVU5efIksbGxxMXFkXH5gt3Ly4vOnTsTFhZGnTp1OHr0KFu3bmX37t1cvHgRAK1WS1BQECEhIQQHB8vdb1G21a5t6w/17LNwufIPgJkzbYmpYcMAWxK2x6uvUnD2LHnR0WRnZZGZkUH6J5+wz8uL8EGDbnsKqqy8V/4tWbKEvLw8Hn74Yby8vBwdzjVZLBb27dtHTEwMe/fuRVVV9Ho9HTp0IDw8nLp165bYTYW8vDzmz58PwNChQ9GVUG82IUTpqV27Nt27d2fFihXMmjWLMWPGyI1GcU3yiS6EEOK2JScnExsbS2xsLBcuXADAzc2Njh07EhYWRkBAAPv372ft2rXs27fPPn3P3d2ddu3aERISQpMmTXBxcXHkyxDi1jRtCh98AGPGgMXy9+Offgp+fhAVZX/I6eWXcdqxAy8vL3Kys8nKykL37be8sXs37dq1o2fPnrc8DU9W3ivfzp49y4YNG6hatSpdunRxdDhXSU1NZfPmzWzZsoWsrCwA6tSpQ3h4OGFhYbi6upb4Mf/44w+ysrJo3749DRs2LPHxhRCl48EHH2TXrl0cOnSILVu20LFjR0eHJMogSUoJIYS4JRcvXrQnos6ePQuAk5MTYWFhtGnTBj8/PxITE/nrr784duyYfWW96tWr26fl1a1bV5peintbhw4wbhyMH1/08QkTwNcX2ra1/b12bRg4EM28eXh5eeHp6YlPbi6HFMV+Yd+iRQuioqKoU6dOsQ4tlVLll6qqzJ8/H1VVeeSRR8pMRZDJZCI+Pp6YmBgOHToEgKurK5GRkaXe8+rkyZNs2LABNzc3Hn744VI7jhCi5Dk5OTF8+HA+/fRTfvvtN5o1a4a3t7ejwxJlTNn4phNCCFGmZWRksHPnTnbs2EFSUhJgWw0vJCSE1q1b4+bmxoEDB1iwYAGpqamArZ9Aw4YN7YmoKlWqOPAVCFEKHngA0tJsDdALmc0wdiwsWwZubrbHnn4a/voLcnJQFAUPDw+ej4ggoWFDoqOj2bVrF7t27SIoKIhevXrRqFGjG05xKKyUkqRU+bNnzx4OHjxI48aNad68uaPD4cyZM8TExLB9+3by8vIAaNiwIeHh4bRs2RK9Xl+qx7darcyePRtVVXnooYdKpDeVEOLuCgoKomPHjmzevJlff/2VZ5991tEhiTJGklJCCCGuKTc3l127drFjxw6OHDmCqqooikLjxo0JDg5Gr9dz+PBh5s6da79YcXNzo02bNgQHB9O0aVPcCi/KhSivHnsMLl6EOXP+fiwnB3btgvBw2999fOD//g/ee8++iaZlS1o2bEiLFi04dOgQy5cv5+DBgxw8eJA6deoQFRVFixYtrpmckul75ZPZbGbBggVoNBoGDRrksN4rBoOB2NhYYmJi7DchPD096dmzJx07dryrqz5u2LCBkydPUrduXcIL/z0JIe45AwcOZO/evezatYuEhARCQ0MdHZIoQyQpJYQQpcCqquSbLFguryin0yi46rRlvsGjwWBg9+7d7Nixg/3799un3tWrV48GDRqg0Wg4duwYCxYssD/n7+9Px44dCQ4Opn79+jItT1QsigIvvGCrmFqxwvaYmxs0alR0u4EDwdMTdu+Grl3hcl8cRVEICgoiKCiIpKQkVqxYQXx8PN999x3+/v707NmTtm3bFpnGlZaWhrOzsyR9y5k1a9Zw4cIFIiMjqVGjxl09tqqqnDhxgpiYGOLi4jAajSiKQrNmzQgPDyc4OBitVntXY8rMzGTx4sVoNBqGDRtW5r8/hRDX5+bmxqOPPsp3333H3LlzadSoUan0nxP3JkUtXINbCCHEbVNVlXSDidQ8IxkGM9kFZixWFRXbR6yiKOgUBW9nHT4ueqq5u+DpXDbuC5hMJvbt28eOHTvYu3cvJpMJgJo1a1KrVi00Gg0nTpzg3LlzgG1aXr169QgODiYkJOSu3jUXosyyWm1T9E6dgu7d7Umn25GSksKKFSvYtm0bFosFHx8funfvTkREBM7Ozrz00kt4enoy/p/9rESZoaoqeSYL2QVmDBYrVqut0lSvVfDU6/Bw0qHV/J1kycrK4q233kKj0TB58mTc3d3vSpw5OTls27aNmJgY+2d8pUqV6NixIx07drztFSJLwo8//khsbCzdunXjkUcecVgcQoiSoaoq33zzDbt376ZTp04Mu7xarRCSlCqGwhMLg8WKVVVRsJ1UeOiLnlAIISoeq6qSnG3gZFY+WUYTVhUUQKMoaBSFwk8IFRWrir1ySqtRqOSip463G1XdnO76HWCLxcKBAweIjY0lISHBviqen58fVatWBeDUqVPk5uYC4OLiQrNmzQgODqZZs2Z37YJJiHtacjKsWgXVq9sSVVf+O9+7F5Yuhfr1bVVU1/gMSE9PZ/Xq1WzatAmj0YibmxsREREsXbqUFi1a8J///OcuvhhxM6qqkmE0cyYrn9Q8IyarisWqcuVPVgU0iu07wMdZT4CXK/5uzsyeNZPNmzczZMgQOnfuXOpxHjx4kJiYGBISEjCbzWi1WkJDQwkPDycoKMjhFa8HDhzgs88+w8fHh4kTJ8oKrUKUExkZGYwfPx6DwcBLL71EgwYNHB2SKAPKxm36MqjAYiU5x8DFPCOZRjMmi4oV1XY2odguOrUaBU8nHX4uTtTwdMHDSd5OISqSnAIziReyScsvAECn0eCk4ToJpr8fU1UVi6pyIa+AtPwCqrm70LiyBy660p0aoaoqR44cITY2ll27dpGTkwPYVlCqUaMGVquV1NRUe7+aypUr065dO/u0vLKyCpQQ94TsbBg5Ei6vlMfGjTBpEmg0kJICo0aBxWJ77sIFGD36qiF8fX155JFH6N27N+vWrWPt2rX8/vvvxMfH4+HhwaVLl6SvVBlxMa+AI5dyyDCasaoqGkVBq4BeqynynaCql29QWG3fARfzCtBYzZzMNlC9Rk06depUajFmZGSwZcsWYmJi7J/z1apVIyIigrZt25aZJuImk4k5l3u0DRkyRBJSQpQjPj4+PPzww8yePZuZM2fy1ltvlfqCCaLsk0qpf8gzWTiRkUtyjoECy+WKBkVBo9gqHwqplyserKptco5Wo1DZVc993u74uTk5KHohxN1yOiufg2nZFFhUnDSa266aNFutmKxWXHVamlf1ooqbc4nGqaoqJ0+eJDY2lri4ODIyMmwXRVYr3t7emM1m8vPzURQFRVGoW7cuISEhBAcHU61aNenhIcTt2rULnnmm6GNDh8KYMbB+Pbz88t+P63SwYAHUqnXDIY1GI7Nnz+aLL76gRo0a1KlTh7Zt29KzZ0+qV69e8q9B3JTJYuXIpRxOZRmwqCp6jYL28udpcVhVK2mZWVgsViq7OdO+bs0SndptsVjYt28fMTEx7N27F1VV0ev1hIWFER4eTt26dcvc5/zSpUtZsmQJzZo14//+7//KXHxCiDujqioff/wxR44coVevXvTv39/RIQkHk6TUZaqqcibbwKG0HIwWK1pFQa8p3kmFqqqYVRWzVUWrKNTycqFhJQ/0Wmn2K0R5dDwjl0NpOagqOP/jLvjtUFUVg8WKXqMQXNWLah53flc4OTnZnohKTU3FYrGQl5eHh4cHJpMJvV6Poig4OzvTtGlTQkJCaNasGR4eHnd8bCEEkJ8PDzwAWVlFH//vf6FXL+jTBy73bwOgSxf44IObDrtp0yZmzJhBu3btOH36tL0PUGhoKFFRUdx3330l+SrEDeSZLOw8n0GW0YxOUdAV87yxyBh5uVy4cBFXD3c8vX1x0io0q+JF9Tv8HkhNTWXz5s1s2bKFrMu/g3Xq1CE8PJywsLAy22A4NTWViRMnoigKEyZMoHLlyo4OSQhRClJSUpg0aRJWq5U33niDgIAAR4ckHEjmYgAmq5U9KVmk5BlBBZdbvMhUFAW9oqBTbImppMx8LuYX0MLfGy9nKUcUojw5lZnHobQcFBScdSWTeFYUBRetBqPVyp7ULHQahcq3UTF18eJFYmNjiY2N5ezZsxiNRjIzM3FxccFqteLl5YWiKFSvXp3g4GCCg4Np2LChTMsTojS4usI779hW5iucpgfw+efg5wdDhsDMmX8/vnYtxMdDixY3HDYtLQ2NRkPnzp2577772LNnD8uXLychIYGEhAQaNmxIVFQUTZo0kQqTUpRnshCbnE6OyYyzVlukmr64VFUlPT0dRQFfb290V3wPqCrU8Ly1xJTJZCI+Pp6YmBgOHToE2KZnR0ZGEh4eTq2bVOI5mqqqzJkzB7PZTP/+/SUhJUQ55u/vz4MPPsjixYuZMWMGr776qsN72QnHqfBXIiaLlZ3nM0nLL0Cv0aDT3v4JXOGqKlpVJafAQuy5DFpX88HbRRJTQpQHWUYTB9NsfZicSrgSUlEUnDUaDBYrey9k06GmvlhJr4yMDHbu3ElsbCzHjx8nJyeH9PR0dDoder0ePz8/dDodgYGB9ml5NWrUkItVIe6G9u1h/HgYN67o4xMn2hJW3t6Qmfn3459+CtOn2/pOXcelyz2q/Pz8UBTF/u/6yJEjREdHk5iYyOHDh6lVqxZRUVG0bNlSTvRLmMliZee5DHJMlttOSAFkZWViNlvw8vJEr7OdKzprbImpvReycNZp8HO9eUuIM2fOEBMTw/bt28nLywOgQYMGRERE0LJly3umX0tcXBwHDhygWrVqdO/e3dHhCCFKWY8ePYiLi+PkyZOsXbuWbt26OTok4SAVevqeVVWJO5fBhbwCnLQatCV4kVY4HcdNr6VNdR/cpQm6EPc0q6qyPTmdS/mmW66mvBWFnx0Bni4EV/W65nFyc3PZtWsXsbGxHDhwgPT0dPuFqqenJ5UrV8bNzY0mTZoQHBxM8+bN8fLyKpV4hRDFMHOmrULqSq6u0L8/zJ1b9PHJkyEqyv5Xo9VIhjUDk2pCRWXenHmcOnCKz9797JrJptOnTxMdHc3OnTtRVZWqVavSo0cP2rdvL1WRJSTxQhZJmfk4azW3nZCyWMycTU5GoyjUqFGzyM+y8HvAw0lLh5qVrtkOwmAwEBsbS0xMDElJSYDt879Dhw507NgRf3//24rLUfLz8xk3bhxZWVn873//o2HDho4OSQhxFyQlJfHee++h0+lkym4FVqGTUsfSczmYlnNHTYpvxHZSYaGymzNh1X1u+8RFCOF4JzPzSLyQjb6UPi+uZLJasaoqYdV97NP4DAYDu3fvZseOHcTHx3Px4kXS0tJQVRU/Pz8qV66Mv7+/fVpeo0aN7pm740KUe6pqq4K6vKKYnbc36PVw8eLfm1avxrl5X3GCM5y3nCfbmo1FtWBbVgWyMrPACjX8alBVW5VAfSC19bXRKUUTTqmpqaxcuZKtW7diNpvx9vamW7dudOrUSVYzuwMX8ozsPJeJAnfUO/Ri2kVyc3Lx86uEh8fVq95ZVRWjxUqgtytNq9huKqiqyokTJ4iJiSEuLg6j0YiiKDRt2pTw8HCCg4PRakt3FdfS8uuvv7Ju3TratWvHE0884ehwhBB30YIFC1i9ejWNGzfmv//9r1TzV0AVNimVZTSx7Ww6lsuNikuLxapislppUsWTQG+3UjuOEKL0qKpKzOlLZJvMuNylE/58swV/Nz3alJNs376drVu3kpKSwqVLl+zVD5UrV6ZRo0YEBwcTEhJCQECAfJELUVZZrfDWW7BiRdHHnZ0hNxerk54jneqwv2c9LjWpidXdFQ0atIoWHToUFNuiLGfP4OLmgpevFxYsKCh4aDxo5NSIps5NcVKKTvfKzMxk9erVbNiwAaPRiJubG5GRkXTp0gVPz6uTIeL6VFVly9lLZBjMd1Qxaywwcv7ceZyc9JdXTbz2OCaLFRQI9XVh3y5bVVRycjIAlSpVomPHjnTs2BFfX9/bfUllwsmTJ5kyZQqurq5MmjRJfi+FqGCMRiOTJk3i4sWLjBw5kvbt2zs6JHGXVciklKqqxF6etlea03AKGS0WdBoNnWpVwll3b97BEqIiu5BnJO5cBjql9KukVFQMBgN5+QbyDQYWfvw2J48eRqvVUqVKFWrUqEGrVq3s0/J8fHxKNR4hRAkymWyr7+3YUeThTHcrW/4vnLOh1QFwzjOjrR2Ioi1a/WQ2mzl79iweHh74+fkBYFEtGFUjVqz4anxp79aemrqaVx06Ly+PDRs2sGbNGrKzs9Hr9XTs2JEePXrYxxI3dim/gO3J6Xf4XaBy/vx5jMYC/Kv54+J8vao1lXyDgXyTmeNxWzm2bQNarZbQ0FDCw8MJCgoqF73CrFYr7733HidPnmTYsGF06tTJ0SEJIRzgwIEDfPbZZ7i5uTFx4kRpO1HBVMikVJbRxJYz6WgU0N2FL/TC3gBNKntyn49USwlxr9mbmsWprHxcSy2prGI0GsnOziYrK5sCUwEWswUvv8rEr/gTw7mTdOzYkZCQEIKCgnByunnjWyFEGZWXB888AwcPAnC8XQCbnwjB4OmES64JXYHVtp2vL1SrVmRXg8FASkoKPj4+eHt7F3nOqlrJU/PQKTqaOzWnlUura950M5lMbN68mZUrV9pX8gsLCyMqKooaNWqUzmsuJ3anZnImy3BHNzRzc3O4eDENN3c3qlSuctXzFouZnJxccnKyMZst6F3dwGKmam4q7du2KXdVROvXr2fu3LnUrVuXV155Rap9hajApk+fztatWwkLC2PUqFGODkfcRRWy4+WZrHwsqor+Lt1hUhQFBTidlUcdb1fpLSXEPSbDYOKtkYPJuHgBjUbB1d2D/5vwLg2aBgNw5sQx3n/pP2ReSsPDy4tXPvySwIZBNxlVpaCggIyMTP6vXzf8/Kvzf+98jKIo6HQ68vJyGP1oH6J37Se8Xk05UReivHBzgy++gCee4HA9HZufaoFFr8E9NQtFxdZjSlEgPR0qV4YrmpNbLBaAa/YN0iga3HHHiJEEYwJG1UgH1w5XfXbo9XoiIyOJiIggLi6O6Ohotm/fzvbt2wkODiYqKop69eqV6ltwL7KqKqm5BWgV5bY/j1XVSnpGBooCvj5/T7lTUTHk55Odk0N+fj6otnNHDw933D08QKunRUhDPC/3GCwvsrKy+P3331EUhaFDh8r3nBAV3COPPMK+ffuIjY2lTZs2BAcHOzokcZfc+3W/t0hVVc7lGtHcwUnF7dBrNOSaLGQaTXftmEKIO1dgsZJntvDG1B/4MXoD3y9bzyOj/sUHLz1v3+bTN17igUcfY8a67Qx+9j988PJ/rj+eqYDU1BSOHTvG0aPHiFm1HBc3d5KTjmPKy6NWrVrUq1ePGtWro6Bg0UtDYiHKnUqVOPnNW2x+uhVWnQa3dAOKTm/rO2U2/72d0VhkN/Pl5663ip6iKLgoLugVPQcKDrDTsPO6IWi1Wtq2bcu4ceP497//Tb169dizZw8ffPABH330Efv27aMsFdM///zzBAYGoigKCQkJxX7uZlRV5b777qNr165FHk9KSioyPTrXZMFiVW+6UnPMymXsj4+75nOZmVlsWLKYrLQL6HQ6zGYTi2ZM45XHBpGaeoH8vHycnJzw86tEQK0A/Pwq4+zkjApkG83XHLNQZGQk9913H6Ghofb/Vvyzf9llrVu3Zv369Tcc726YP38+BoOBrl27UqtWLUeHI4RwMHd3d4YMGQLAnDlzMBgMDo5I3C13nJSaMGECVapUKfIl+M4779zRmL179+bQoUN3Gto15ZksmCw3P6m4HTc6EdEoYFUh6/JJxfTp0+nfv/81tx05ciSKohAfH29/LDs7Gw8PD0JDQ+8oxri4OAYPHgxARkYG77333m2P9eeffzJmzJg7ikeIsi7XZMGqqnh5+9gfy8nOovAjJP3iBQ7vTaB7/0cA6NSrD6nJZzmbdNy+fUGBkZSU8xw9eoQjh49w4cIFDAYjer2OnetX02fo43QfMJD4jWvw9PRCe0UfGaPFisladi4MhRB3LteayxaPI1iq+OKaabS1uVYUW1WUxWJbrU+nt1VVXeFmSalCTooTWkXL3oK9nDWfveG2iqIQHBzMK6+8wksvvUSzZs04cuQIX375JZMnTyY2Nhar1XonL7dEDBw4kJiYGOrUqXNLz93MmjVr8PHxYc+ePZw4ceK622UZzVhUlZu1ktq8chkHrnEuaLaYycrKZMuKpZw/dZKUlPOcPZtMfl4+Kiqenp5Ur1Gd6tWq4+HhiUaxnaIX3kDNKrhxUgrg008/JSEhwf5fz549b7qPoxw4cIDY2Fh8fHzo06ePo8MRQpQRhX1T09PT+f333x0djrhLSmT63rBhw/jss89KYigAli1bds3HzWbzTU/EbiarwHx56l7JJ6U2r1xG/SbNaNKi9VXPFZ5UZBfjpAJs/yB/+uknvvzySwDmzZtH48aNMZnurNKqdevWzJs3D/g7KfXqq6/e8jhms5m+ffvSt2/fO4pH/E1V1Rv+Z7Vab7rNP7cFbrrfrW5bGOvtxHMvxq7z8qVyiw5YjAa+nvAa+3faGhS//MnXnD9/jhMH9+NdyY/UixdsF5KAb5Wq7N+7G8XJhe/fHUdQyzCat+0IgLOzMx6envh4e1NgyGffjq289vFUUs6e4Y2nhvL4mLFFmteqgKUMVSsIIe6Mqqpsz99OjjUHN70XSi09nDple1KnA60WatQALy/4xw20wqTUtabv/ZMzzuSquWzN20ofzz44Kzef+tWgQQMaNGjAmTNnWLFiBbGxsfz4448sXryYHj160KFDB/R6/a2/6BJwowbYd9Ice9q0aTz99NMcOnSIn376ibfffvua2xnMFhRs53O7Nm/kp4+nYDIaMJlMDHzqOXoPHs72davYunoFO2M2sOK3X+k34ikeGPIYABcvXmT17ws4cXA/P7w3CVd3D4b8+794enqA1crXE14l6fBB9E5OvDX1R2rUDgRg1aL5LPrlR7Ba8Pf15ssvvyQkJOSWXuOWLVsYPXo0ZrOZsLAw++8RwMGDB3niiSfIysqiUaNG5OTkMHToUEaOHEl2djYvvvgiu3fvxmAw0K5dO6ZOnXrHfQ1NJhNz5swBYPDgwbi4SEWwEMKmcDrv4cOH2bBhA23atJEp5RVAqfaUGjlyJM7Ozhw9epTTp0/TrFkzfv31V8xmM7Vq1SIxMZFql5t4TpgwgczMTD799FMCAwNZvHgxoaGhREZGEhwcTGxsLK6urqxatYpXX32V5cuXA9C5c2c+/vhjnJycrns8JycnJkyYwP79+7mYlcOhQ4eoVbceT7/yFt++M45zp0/RsHkIr3/2LRqNhrycHL6Z/BbHDiRSYDTSpEUr/jPxPfROTrw4pB8Nm4dyIGEnaakptAq/nzHvfHTNE5H2Xbsz+fnnyMvJpsBopFnbDox9+z3yPfQYjUYsFgvZ2dlA0Qtlo9FIVFQUM2fOZOzYsTg5OfH9998zcOBAZsyYQXJyMlarld9++43vvvsOgOrVq/POO+/g7+/Pb7/9xh9//IGvry9HjhxBr9fzySefUKtWLbZt28b777/PggULeO6558jOzqZRo0ZotVpmzZplX5Y3PT0dRVF46qmn6NSpE6qq0rFjR0aOHMm2bdsIDQ2lTp06xMTE8Pbbb7Nr1y6mTp1Ks2bNSExMxGKx8L///Y8GDRqgqirLli3j999/x8XFhbZt2zJ37lx+//13hyUd7jS5Utx4irtt4XbC8ZTLU3sL//OpUQvf5hZMBSZGvTYBUIiJXsLcqZ/wvw+/xGwxo6q2Xi9FLh9V2/959o23MRjycXd3x8fXFyf93yfzy3+dRZvIrnh4eePh5Y1v5SrEblxL28hud/U1CyHunjPmM5wwncBZcbZVw7i7Q61acP68bfpetWq2hNQ1mM1mtFptsdoPKIqCG26kW9NJNCbS0qVlsWMMCAjgqaeeol+/fqxcuZLNmzczZ84cli5dSteuXbn//vtxdXUt9niONGrUqOveRLt06RLR0dF88803nDp1igceeICJEydec1U76xXf0w2aBfP5gqVotVqyMtJ59oEuhHXqQtvO3WnfrSf1mzTj4Sefu2JvFYvZTPueD7Bz/Wr6jniSLn0GoNfpif5tLof3JvDdX+uoXqsOP7w/iV+//ZIX3/2YfXHbWbtkER/OXYyPhzvKyf0MHTqUxMTEa77WMWPGMGHCBPvfFy5cSK1atRg8eDA///wz3bp1Y+XKlUyfPt2+zWOPPcbo0aN54oknOHDgAC1atGDo0KEA/O9//yMiIoIffvgBVVV5+umn+fzzz3n55Zdv7YfwDytWrCA1NZVmzZrRokWLOxpLCFH++Pr6MmDAAObOncuMGTN466237rgwRZRtxf7pjhs3jkmTJl3zudmzZxeZm/7aa6/Zp4glJCSwbt06nJ2d6dSpEwsXLuTRRx/l4YcfZtasWbz00kuoqsovv/zCn3/+ec3xDx8+zMaNG9Hr9XzzzTfExsayc+dOtFotffv25dNPP2Xs2LE3PB7Ypq7NW72BVIue14c/xMevjuGDmb/h7OLCv/p2Y8f61bTr0oNv3xlH87B2/O+9T1FVlY9fHcOin79n8LP/h8Vq4dih/Yz54AvMZjNvjHiEtcuWUL9ZMMHtw6lVryE9HrF9mV9Kz+LZcVNwcXPDarEwddwrzPjua2ZdOsehQ4dISkripZdeuur17tq1i5MnT+Lm5sbIkSPx8/Pj1KlTxMTEkJKSwsSJE7l06RJ//fUXDz30EO7u7uzatYvBgwfTq1cvDh06RGxsLA8//DCRkZFs376d//73v3Tq1Ink5GQuXrzI1KlTqVOnDnFxcURGRgLw3Xff8fvvv9OoUSO6dOlCZmYm48eP56GHHrKv9rJ37177Hclt27Zx5swZfv31V5KTkzl58iShoaF0796d/fv38+GHH9K7d297rA8//DBubm7ExdnK2gsTi6Xln8mFf/5XeNJZ+Ofiblt4QVCc/wrHBW7pGCW57d2I51rHKGvxFOcY17rQSzeY2Hb2ErpKvvZpv48+PZoZH0/B092dZiEtyUpPo7p/NbQ6Haqqkn4hlSbBIdSocfWy7FdaPn82ly6kMjTcdrGYl5vD8nmziySlFCiV6cZCCMc4VHAIK1b0yhUVRx4eUL/+Tfe1WCy3VKWiUTRoVA2HCg4R7ByMTrm1k/rKlSszdOhQHnzwQdauXcu6dev4/fffWb58OZGRkXTt2rXML9v9448/Xve52bNn06tXL3x8fPDx8cHf358VK1bQq1evq7a98vshK/0SH419gTMnjl1OTF3ixOEDVKl+vdULFapXr4GPbz5Ozs64u3ug1/3982/SojXVa9W5/OcwFs+wxbx5VTTHDiQy5uHeaDQK7notly5dIj8//5pJwU8//fSq1hB79uxBp9PRrZvte6VHjx7UrVvX9jqyskhISGDEiBEANG7cmPDwcPu+ixcvZuvWrXzyyScA5OfnF6tK70ZSU1NZvnw5er2eRx99tFgJViFExXP//fezY8cOjh07xvLly2WabzlX7LOT6yWk4MbT9wYMGIDb5Z4Ibdq04dixYwA88cQTjBo1ipdeeon169fj5+dH8+bNrznG8OHD7eXiq1evtldEATz99NN89dVX9qTU9Y4Hti9iHx9fLqTn0qBZMHonJ9w8PACo37S5vQfM5lXL2R8fx2/TvgHAaDCgufwlrKDQoUdvXN3dUYDARkGkX0jBxdUVrVaLk5MeNzdXQMGoVZj9+Ucc3L0LVJXM9EvUrluXAV062aukwsPDr7roPnjwIIGBgTRs2JD58+fj7u7OgAEDqFGjBvv27aN379789ddftG/fniFDhqDRaOjatSvDhg2jX79+rF27ltzcXJ566ikURSEgIIDFixfz6KOPsnv3bg4ePMjw4cNJSUlhyZIl9h5WeXl5TJs2jQ8++AC9Xo9Go+H8+fM0adKEPn368P333zNlyhSqV6+OoigsXryYtWvXMmbMGHbs2EFiYiIffPABGo2GgwcPMnr0aF577TWmT5+Ooii8++67KIrCuXPnaNOmDRMmTCjVpIQQJcFdryUvOwtjfj7VLl9wxKxchpevL14+viiKQoOmwaxavICogY+ycfkSqlSvQc3Aujcc9/De3WRcSmP+9n323+2crEyGdAghI+2ifTtnraZUphsLIe6+TEsmZ8xniiakislisdimFN/i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q9ba/uEHKi46rouTUxXbrNlp13A6HIqIcCvC49HCP/+xqsiSpDsfmquU/lfqsXtu17gbblTGxB9qz45tuv2aq5R+zXerjjvbUq1z587Vrl279MEHH8jj8ejo0RPTCTt16qSVK1fK4/GovLxcAwYM0MiRI5WWlqZbb71Vx48f19NPPy3pxMi0k44cOaIbbrhBa9asUXJyshYsWKAJEybok08+kSTt2LFDL774ov74xz9q3rx5+vWvf63ly5dX62cJAEAo8a4eANAgtWrVSpMnT5bX69WyZcu0fv16/f3vf1dWVpZGjx6twYMHy+2um2kyOL8wSiq8tm7dqldffVVr166t8bknp+Gdyb333qsf/vCHWrVqldauXavBgwfrxRdf1MSJE7/1uk899ZTGfec7WpmTJ0lyf23K75jv36ClCxeouPC4vD+YrLzDB0+7RkSER23btpXL6dTEqXdo/C2nFmelxcX6dNtWjZ7wA0knpgX2vuyKU4452+LqS5Ys0eOPP141qqxVq1aSpPLyct1+++3Kzs6Ww+HQvn37lJ2dfdqUyK/bsGGDkpOTlZycLEmaNGmS7rjjDh04cECS1LVrV11xxYlsV155pZ544olvvB4AAOHC9D0AQIOWmJioSZMm6eGHH9bw4cNVWlqqf/7zn5o+fbpWrFghn88X7ogIoeLiYr3//vtq0aKFUlNTwx2nSVq3bp1ycnLUrVs3derUSe+9956mTp2q5557rtbXbtOmjX7wgx/oueee0wMPPKAFCxZU+1ynZclpWTrTYKVBo8Zq49rV+mz7J+o7cMg3XKVmO/adLKFsSU6XS7KDVc9VVFR86/nTp09Xy5Yt9eGHH+qjjz7SsGHDqnXet4n8yvRDp9PJ9GcAQINFKQUAOC80b95c119/vR555BGNHDlS5eXlWrRokaZPn67ly5fXyS9yaPjWrl2rQCCgYcOGsQB+mNx22206ePCgcnJylJOTo7S0ND3//PO67bbbanXd119/XX6/X5IUCAT08ccfq0uXLtU+37IsNfO4FDxDKxXhidTtM+bozocePee/NzFxceraM1krXjsxrS9n1w5t2bhBkmTbRu06XaSPN38gScrPz1dWVlbVud/5znf0zDPPVJXoJ6fvFRQUqH379nK5XNq5c6dWrFhRdU58fLwKCwvPmCUtLU1btmzR1q1bJUmvvPKK2rVrd8qaXAAAnA94NwcAOK80a9ZM3/ve9zR37lyNHj1afr9fr732mqZPn66srCyVl5eHOyLqSSAQ0FtvvSW3261BgwaFOw7O4uGHH1b79u317rvvasqUKWrfvn1VCTNz5kzNmzfvjOe99tpr6t27t1JSUtSnTx95PB7NmjWrWve8++67lZqaqsmjh+qnV4/QfxcvOu2YwWPGqf/QEdW63j+f/4OmZgyr+vPPP/1eknTfk3/Qkn+8rP8ZPVh/+d2JdaYkKWiMJvzoJuXn5alHjx6aPHnyKVPwpk2bposvvlh9+/ZVamqqbrzxRknSAw88oPnz5yslJUX33XffKVNSr7vuOmVnZ1ctdP5VrVq10oIFCzR58mSlpKToueee07/+9a+zTh8EAKChsszZVmQEAOA8UFpaqv/+979atWqVKioqFBUVpfT0dI0YMUIxMTHhjoc69P777+vFF1/UkCFDNGnSpHDHQQN0pNSnTYeOy+1wyBmigsYYo4qgrc4J0erRMi4k9wQAoLGglAIANAplZWVatWqVVq5cqbKyMnk8Hg0fPlwjR45UXBy/KDYGc+fOVU5Ojh588EElJSWFOw4aINsYrfsiX6X+oCJdzpDcM2Dbso00oH1zxXvYfAEAgJqglAIANCoVFRVavXq1VqxYodLSUkVERGjo0KEaNWqU4uPjwx0P5+jzzz/XY489ph49euiuu+4Kdxw0YJ8VlGpHfokinY56n852cpRUq+gI9U9qXq/3AgCgMaKUAgA0Sj6fT2+99ZbefPNNFRcXy+12a8iQIRo1apQSEhLCHQ819MILL2jjxo264447lJKSEu44aMB8AVvv7M9XRcCu99FSftuWMVK/ts3UKtpTr/cCAKAxopQCADRqlZWVWrdunZYvX67CwkK5XC4NGjRIo0ePVosWLcIdD9Vw/Phx3X///UpMTNScOXNYzBnf6mBJhbIPF8ppWXLV0y6NtjHyBW11bBal3q0YhQkAwLmglAIANAl+v1/vvPOOli1bpoKCAjmdTg0YMEBjxoxRy5Ytwx0P3+Df//63srKy9P3vf18jRlRv9zQ0bcYYfXSkSAeKKxThrPtFz09O24t1O3Vl+xaKcLKhNQAA54JSCgDQpAQCAb377rtaunSp8vPz5XA4lJaWprFjx6p169bhjoev8fv9uv/++1VZWanf/OY3ioyMDHcknCf8QVsfHDqu/HJ/nRZTJwupSJdDl7dNYHFzAABqgVIKANAkBYNBbdiwQUuXLtWRI0dkWZYuv/xyZWRkqG3btuGOhy+tX79ef/3rXzV8+HBdf/314Y6D80xl0NaHhwqVV14pl2XJ5bBqNf0zaBtV2kFFuZzqe0GCEiIppAAAqA1KKQBAk2bbtjZu3KisrCwdOnRIlmWpX79+ysjIULt27cIdr0kzxuiRRx7R/v37NXv2bEay4ZwEbFu78kv0RVGFgsbI43TIUcNiyhijyi8XNU+MjlDvlnGKiXDVU2IAAJoOSikAAHSinNq8ebMyMzOVm5srSbr00kvl9XrVoUOHMKdrmnbv3q0nnnhCycnJuvPOO8MdB+e5vLJKbcsrUkllUEaSy2HJZZ195JQxRraR/OZEGRXhdKhbixhdGB9V41ILAACcGaUUAABfYYxRdna2MjMztW/fPklSSkqKvF6vOnXqFN5wTcyf/vQnbd68WT//+c/Vs2fPcMdBIxC0jY6U+bSvqFzHKvwK2v/3NvirNdPJRx2WFON26cL4KLWNi5SHBc0BAKhTlFIAAJyBMUZbtmxRZmamcnJyJEm9evWS1+tVly5dwhuuCcjPz9evf/1rXXDBBXrwwQdrtQ4QcCallQEVVgZU4guoqNIvv21kjOR0WIqLcFX9aeZx8fcPAIB6wmR4AADOwLIspaSkKDk5Wdu2bVNmZqY++eQTffLJJ+revbu8Xq+6devGL6v1ZM2aNTLGKD09nZ8x6kVMhOvEulCx4U4CAEDTxUgpAACqwRijnTt3KjMzU7t27ZIkdevWTV6vV927d6c4qUM+n0/33XefJOmxxx6Tx+MJcyIAAADUB0opAABqaPfu3crMzNT27dslSZ07d5bX61WvXr0op+rA2rVrtWDBAo0aNUrjx48PdxwAAADUE0opAADO0Z49e5SZmamtW7dKkjp27Civ16uUlBTKqXNkjNGsWbN06NAhPfLII0pMTAx3JAAAANQTSikAAGpp7969yszM1EcffSRJat++vbxery699FLKqRravn27nn76aV166aW69dZbwx0HAAAA9YhSCgCAOrJv3z5lZWVp8+bNkqSkpCRlZGSoX79+cjjYSr46/vCHP+jjjz/Wvffeq4svvjjccQAAAFCPKKUAAKhjubm5ysrK0qZNm2SMUZs2bZSRkaH+/ftTTn2DI0eOaObMmWrXrp0eeOABRpkBAAA0cpRSAADUk0OHDmnp0qXasGGDjDFq2bKlMjIydMUVV8jlcoU7XoOzcOFCrVy5UpMnT9bAgQPDHQcAAAD1jFIKAIB6duTIES1btkzvvvuubNtWYmKixowZowEDBlBOfamiokLTpk2Ty+XSY489JrfbHe5IAAAAqGeUUgAAhEh+fr6WLVumd955R8FgUAkJCRozZowGDRrU5EuY1atX65VXXtHYsWN17bXXhjsOAAAAQoBSCgCAECsoKNDy5cu1bt06BQIBxcfHa/To0Ro8eLA8Hk+444WcMUYzZ85UXl6e5s6dq4SEhHBHAgAAQAhQSgEAECaFhYV688039dZbb8nv9ysuLk5XXXWVhg4dqsjIyHDHC5ktW7bo97//vS6//HJNmTIl3HEAAAAQIpRSAACEWXFxsVasWKE1a9bI5/MpJiZGI0eO1PDhwxUVFRXuePXumWee0bZt2zRt2jR17tw53HEAAAAQIpRSAAA0ECUlJVq5cqVWrVqliooKRUVFacSIEUpPT1dMTEy449WLgwcP6qGHHlKnTp103333ybKscEcCAABAiFBKAQDQwJSVlWnVqlVauXKlysrKFBkZqeHDh2vkyJGKjY0Nd7w6tWDBAq1du1a33HKLrrjiinDHAQAAQAhRSgEA0EBVVFRo9erVWrFihUpLS+XxeDR06FBdddVVio+PD3e8WisrK9O0adMUGRmpuXPnyuVyhTsSAAAAQohSCgCABs7n8+mtt97Sm2++qeLiYrndbg0ZMkSjRo06r3eqe/PNN/Xqq6/q6quv1rhx48IdBwAAACFGKQUAwHmisrJS69at0/Lly1VYWCiXy6VBgwZpzJgxat68ebjj1Yht23rggQdUWFiouXPnNoqRXwAAAKgZSikAAM4zfr9f77zzjpYtW6aCggI5nU4NGDBAY8aMUcuWLcMdr1o+/PBDzZs3T2lpabr55pvDHQcAAABhQCkFAMB5KhAI6N1339XSpUuVn58vh8OhtLQ0jR07Vq1btw53vG/0u9/9Trt27dL06dPVsWPHcMcBAABAGFBKAQBwngsGg9qwYYOysrJ09OhRWZal/v37a+zYsWrbtm24451m//79mjNnjrp06aJf/epX4Y4DAACAMKGUAgCgkbBtWxs3blRWVpYOHToky7LUr18/eb1eJSUl1e+9jVFJZUDFlQEVVwZVGbRlGyOHZSnS6VCsx6X4CJdi3E69/PLLeueddzR16lT169evXnMBAACg4aKUAgCgkbFtW5s3b1ZmZqZyc3MlSZdeeqm8Xq86dOhQp/cq8weVW1KhfUXlqgicKKLOxmlZ8jiM1i/9j8oPH9DsB2fI4XDUaR4AAACcPyilAABopIwxys7O1pIlS7R//35JUkpKirxerzp16lSra/uDtnYdK9H+4goFbCNLktvhkMOSLMs6Y5agkUrKy+Sr8Ckywq3e7Vqpc0KMnI7TjwcAAEDjRykFAEAjZ4zRli1btGTJEu3du1eS1KtXL3m9XnXp0qXG18sr8+mTo8Uq8QfltCy5HdYZi6jTcsjowIEDsm2j1m3byshSgselXq3ilRDprnEOAAAAnN8opQAAaCKMMdq2bZuWLFmiPXv2SJK6d+8ur9eriy++uFrX2FtYpu35JQraRh6nQ45qlFEnlZaVKu9onmLjYpXYIlG2MfIFbbkdllJax+uC2Mhzel0AAAA4P1FKAQDQxBhjtHPnTi1ZskS7d++WJHXr1k1er1fdu3c/66invYVl2pZXIskowuGo1uiorzp06KB8vkolJbWV2x1RlcVn23JalvpQTAEAADQplFIAADRhu3btUmZmpnbs2CFJ6ty5s7xer3r16nVK6XSk1KfNhwtljORx1nxx8spKnw4ePKTIqEi1ad3mlOdOFlMuy9IVSc3VjKl8AAAATQKlFAAA0GeffabMzEx98sknkqSOHTvK6/UqJSVFftto/f5jKvUHFems+QgpScrLz1NpSalat26lqKjo0543xqgiaCsh0q20pOYsfg4AANAEUEoBAIAqOTk5yszM1McffyxJ6tChg9KumShfVHyN15A6KRgM6sCB/XI6XWrXLknSma8RNEaVQVuXJMaqa/OY2rwMAAAAnAcopQAAwGn27dt3YlrfnhxdNv5Hcjqdio2OUkx0tM5WKp1NYeFxHT9eqOYtmis+Lv4bj/UFbbkcloZemKiIc5gmCAAAgPMHpRQAADirjZ8f0N6SShUXHJOM5Ha71KxZM8XExKg65ZSR0YH9+2WMUbv27eWwvrloOrkjX+9WcerY7PRpfgAAAGg8+AgSAACcUdA2KrIiFBMdraS2SYqJjZE/EFBeXr4O5OaqpKRERt/82VZZaamCQVsxMbHfWkhJksOyZEnaV1QuPjcDAABo3CilAADAGRVV+lUZtOVyOOR2u9UysaXaJSUpNjZGwUBA+fn5yj1wQCUlxWcpp4yKioolSXHxcdW+r8thqcQfVHnArqNXAgAAgIaIUgoAgCbiZz/7mTp16iTLspSdnX3GY+bPny/LsrR48WIV+wKyzalvFlwutxITWyopqZ1i42IVDAaVn39MuQcOqLi46JTRTT6fT5WVlYqKipTb5a56/IZBffXpti1nzemwLNm2UXFloOqx48eP67HHHjvn1w4AAICGh1IKAIAmYsKECXr77bfVsWPHMz6fk5OjP//5z0pLS5MkFX1ZClln2HHP5XIpsUWi2rVrp7i4OAWDQR07VqADBw6oqLhIxtgqKj45SuqbFzf/OodlyUiUUgAAAI2cK9wBAABAaAwZMuSsz9m2rSlTpujZZ5/VvffeK0nyVWP63LGjR/WHWdO1b8+nsm1bfQYM1nW33KYv9uzR/CceVl7uAblcLl174xRdfcONVeetXPyqnph2l0qLizTuBzdq4k/ulCTt/Dhbv581XWWlJYqNjtK8Z/+fBg4cqFtvvVXFxcVKTU2Vy+XSpk2b9PDDD2vBggXyeDySpH//+99nLdwAAADQ8FBKAQAAPfnkkxo4cKD69etX9ZhtjCxJ8598TC3bXKCrJ9102nlz775Nlw0epoeemy9Jyj96WA53hJ6bdb/ad+qi2fNeUmV5uW77zkh16dFLPS+9TJJUkHdUz73xXxUVHNOtV49Q78v66+LkVD10202659En1XvgUOVvz9b48eP16aefat68eUpNTa2adlhQUKAnnnhCBw8eVFRUlMrKyuRwMAAcAADgfEIpBQBAE7d161a9+uqrWrt27SmPn5xGd/M9953xvPLSEm3dtEGP/3Vh1WOJrdpIknZ8uEk/n/WoYmJiFRMTq0Gjvdr89ltVpdTY798gy7LUrEWiBo326oN31ioqJlaW5dDlQ9NVHgjqsisHqE2bNsrOzlb79u1PuXd8fLy6deumH/7whxo1apS8Xu9pxwAAAKBh4yNFAACauHXr1iknJ0fdunVTp06d9N5772nq1Kla/PJfanVdy3J85evT16U65Vid/nyE03HW85xOp9577z3dddddOnLkiNLS0rRu3bpa5QUAAEBoUUoBANDE3XbbbTp48KBycnKUk5OjtLQ0Pf/88/rxT26VpFN21PuqqJhYpfS/Uv964Y9Vjx3Pz5Mk9Rs4RJn/eLnqsbeXZ6rfoGFVxy1/9RVJUtHxAr29PEt9Bw5Wh85dZYytjWtXy5K0Y/NGHTp0SKmpqYqPj1d5ebkqKyslScXFxTp8+LAGDx6sGTNmaNCgQfrwww/r+kcDAACAesT0PQAAmoif/OQnyszM1KFDhzR69GjFxcXp008/PevxcR6XHJY0/6nH1KpN2zOuKXXfk3/U7x+6T7eMGiSXy6UBV43VTXdP0x0PPqpnZvxKU8YMkTFGN9xxt3pc+n/rVTVr0VK3Xj1CpcVFunby/6hXv/6SpIeee0nPPnS/yh99UIlxMVq0aJFiY2MlSZMnT1ZKSopiY2O1ePFiTZgwQaWlpbIsS926ddONN954Wj4AAAA0XJY528efAACgSQvaRmu+yFNl0JbH6QzZfSsCQcV7XBrYvsW3TvsDAADA+YvpewAA4IycDkvt46Jkm7NP4atrxhgZSR3ioyikAAAAGjlKKQAAcFbt4yLlclgK2KEppSptI4/TobaxkSG5HwAAAMKHUgoAAJxVTIRLSbGRChgju55HSwW/vEfHZlGKcPIWBQAAoLHjHR8AAPhGlyTGKsbtlC9o19s0PmOMKoO2EiLd6pwQUy/3AAAAQMNCKQUAAL5RhNOhni3j5HRYqqyHaXzGGPlsW26HpV5f3gcAAACNH6UUAAD4Vq1jPOqeGCtJdTpi6mQh5bQsJbeOV0Kku06uCwAAgIaPUgoAAFRLp2bR6tkyVpYlVQTtWq8xZRujiqAtl2UppXU8i5sDAAA0MZYJ1R7PAACgUTha5tO2o8Uq8QfltCy5HZYsq/pT7owx8ttGQWPUzONSr1bxas4IKQAAgCaHUgoAANSYP2hr17ES7S+uUMA2ckhyORxyWDpjQWWMUdBIAduWkeR2WOqUEK0uCTGsIQUAANBEUUoBAIBzVuYPKre4QvuKy1URODGlz5L01TcXJ793Wpai3A5dGB+ttrEeRbqc4QkNAACABoFSCgAA1JptjEoqAyquDKjIF1Bl0JatE0WUx+lQXIRLcR6XYt3OGk31AwAAQONFKQUAAAAAAICQY/c9AAAAAAAAhBylFAAAAAAAAEKOUgoAAAAAAAAhRykFAAAAAACAkKOUAgAAAAAAQMhRSgEAAAAAACDkKKUAAAAAAAAQcpRSAAAAAAAACDlKKQAAAAAAAIQcpRQAAAAAAABCjlIKAAAAAAAAIUcpBQAAAAAAgJCjlAIAAAAAAEDIUUoBAAAAAAAg5CilAAAAAAAAEHKUUgAAAAAAAAg5SikAAAAAAACEHKUUAAAAAAAAQo5SCgAAAAAAACFHKQUAAAAAAICQo5QCAAAAAABAyFFKAQAAAAAAIOQopQAAAAAAABBylFIAAAAAAAAIOUopAAAAAAAAhBylFAAAAAAAAEKOUgoAAAAAAAAhRykFAAAAAACAkKOUAgAAAAAAQMhRSgEAAAAAACDkKKUAAAAAAAAQcpRSAAAAAAAACDlKKQAAAAAAAIQcpRQAAAAAAABCjlIKAAAAAAAAIUcpBQAAAAAAgJCjlAIAAAAAAEDIucIdAAAAND2+QFBlAVu2bSRLclmWYiKccjn4vAwAAKCpoJQCAAD1zjZGR0p9Olzq03GfXxUBW7YxMl8+b0lyWpZi3C41j3KrbWykEjwuWZYVztgAAACoR5Yxxnz7YQAAADUXsG3tLSzXvqJylfmDMjJyWJYcliXnVwonY04UV8EviyqHZSnB41LHZtFqG+uhnAIAAGiEKKUAAEC9yC+v1CdHi1VcGZAlKcLpkKMa5ZL5spzy20aWJbWJ9qhHyzhFu531HxoAAAAhQykFAADqlDFGuwtKted4mYK2kaeaZdSZBGxbftso0uVQ71bxahPjqeO0AAAACBdKKQAAUGeMMdqWV6y9heVyWJbcDqvWU++MMfIFbTkdlpJbxyspNrKO0gIAACCc2OIGAADUmV3HSrW3sFxOh6UIp6NO1oKyLEsep0NBY7TlSJGOlvnqICkAAADCjVIKAADUibyySn1+vOzLEVJ1+xbDsix5HA4FbKOtR4vlC9p1en0AAACEHqUUAACoNX/Q1id5RQoaI7ejfnbKOzliqswf1I78YrECAQAAwPmNUgoAANRaTmGZSiqD8tTRlL2zcViWXA5LucU+Havw19t9AAAAUP8opQAAQK0EbKN9ReVyWDrnXfZqwmVZss2JewIAAOD8RSkFAABq5XBphSoCdp2vI3U2lmXJZVk6XOpTuT8YknsCAACg7lFKAQCAWjlc4pNRaEZJneRyWArYRkfYiQ8AAOC8RSkFAEAjMGrUKKWkpCg1NVWDBw/Whx9+WPXcsmXLdNlllyklJUVpaWn66KOPqnXNm266Se3atVNqaqqSk5M1ZMgQ7dix45RjjDEq8PlPK6SmZgxTWUmJJOmGQX316bYtZ7zHQ7fdrGWL/iFJmv/kY/rv4kXVynZy3aoiX+Abj3vppZdOy1wXnn76aR06dKjOrwsAANCUUEoBANAILFy4UB9//LGys7N1zz336KabbpIkFRQUaNKkSfrrX/+qjz/+WL/97W81adKkal/3l7/8pbKzs7VlyxZlZGRoxowZpzxfHrDlt42cXxsk9XzWGkXHxtboNdx8z30aee2Eah9vSTru++bFzr+tlAoGz236H6UUAABA7VFKAQDQCCQkJFR9XVhYWDWS6LPPPlNiYqJ69eolSRo8eLC++OILbd68uUbXN8aoqKhIzZs3lyTl5OQoISFBpf6AbGPkKyvViItaVR0/4qJWKikqPO06X3y2Wz8dn6FbRg3SjKmTq0ZTSdLjv7hTr/5lniTpr0//RnPunKJf/88k3XzVQN17w3UqOl4gSQr4/Xpmxq809aoBmvqdUbr7nns0bNiw0+71wgsvaNOmTbr77ruVmpqqrKwsvfTSSxo+fLjGjx+v5ORkvf/++xo2bJgWL15cdd6ECRP00ksvVV2jZ8+eVaPFNmzYoNmzZys3N1cTJ05UamqqsrOza/SzBAAAwAmucAcAAAB1Y/LkyVq9erUkKSsrS5LUrVs35efna/369RowYIDeeOMNFRcXKycnR3379tXMmTOVlJSkW2+99YzX/O1vf6uXXnpJR48eldPp1Nq1a0953jaSMSdGLVXHY/fcrnE33KiMiT/Unh3bdPs1Vyn9mu+e8djt2Zv13H/+q2bNW2jOT3+sJX//q264/S4t+cfftP/zPfrTshNZnrrjxjOeP2XKFP3v//6v7rrrLl177bWSToyc2rBhgz788ENdcskl35r33nvv1Y4dO9S2bVv5/X75fD5dccUV+stf/qJ//vOfSk1NreYrBwAAwNcxUgoAgEbib3/7m/bt26eHH35Y06ZNkyQ1a9ZMixYt0v33369+/frpzTffVM+ePeVynfhcavbs2WctpKT/m7534MABzZo1SxMmVH963deVFhfr021bNXrCDyRJnbv3VO/Lrjjr8ZcPTVez5i0kST37XqbcvTmSpA/Xr9PI6ybI5XbL5Xbrh5Mn1yjHgAEDqlVISdKIESP0ox/9SM8884w+//xzxdZwSiIAAADOjlIKAIBG5sYbb9Tq1auVn58vSRo+fLjeeustffDBB/rd736n3Nxc9ezZs8bXnThxoj744AMdPXpULpdLwWBQTsuSZUk+37ntgmd9w459ER5P1ddOh1PB4KmLmp8coeV01OztzNeLpZOv5aSKioqqr1999VU99thj8vv9ysjI0CuvvFKjewEAAODsKKUAADjPHT9+XLm5uVXfL168WImJiWrR4sQoo4MHD1Y9N2fOHKWnp6tr1641vs/KlSvVsmVLJSYm6oILLpAxRvs+3SmnZenN1xZ+6/kxcXHq2jNZK177pyQpZ9cObdm4ocY5Lr1ykFb9+1VVVlbKYxn978svn/XY+Ph4FRaevrbVV3Xt2lUbNpzI8fnnn+vtt9+WJAUCAX322We67LLL9Itf/EITJkzQ+++/X+3rAgAA4JuxphQAAOe5wsJCfe9731N5ebkcDodatWqlJUuWVI1CmjlzptatW6dAIKArr7xSL774YtW51V1Tyhgjj8ejRYsWyeFwyOFw6Nlnn9X4a69RRFwzDRjtrVbW+578g37zy5/pXy88p3adOiul/5U1fr3jbrhRe3Zu161jhyixRXMNTrvilFLuq6ZOnap7771XTz31lB599NEzHvOrX/1KEydOVHJysnr16qUrrjgxpTAYDOqWW27RsWPH5HK51KpVK82fP1+S9LOf/Uw//vGPFR0drZdeeom1pQAAAM6BZYwx4Q4BAADOX9mHC3WguEJRLmfI7llaXCxnVLS6N4/SfbdNUb9+/arW0QIAAMD5gZFSAACgVpJiI5VbUqGgMXJ+wxpRdemXPxovf2WlXHZAgwcN0s9+9rOQ3BcAAAB1h5FSAACgVmxjtG5fvkorg4oMwWgpY4wqgrY6NYtSr1bx9X4/AAAA1A8WOgcAALXisCx1jI+WJAVD8FmX3zZyOSy1j4+q93sBAACg/lBKAQCAWruwWZSaR7lVGbRVn4OwbWMUNEYdm0Wpmcddb/cBAABA/aOUAgAAteawLPVqGSe3w1Jl0K6Xexhj5AvaauZxqWvz2Hq5BwAAAEKHUgoAANSJeI9bPVrGSZYlXx0XUyfXkYp0OZTcOl4uR2gWVAcAAED9oZQCAAB1pkN8lHokxsqSVBEI1slUPvsrhdSlbZoxbQ8AAKCRYPc9AABQ5w4Ul2t7Xol8QVsRDoec5zCyyRgjv31iDan4CJdSWserWSSFFAAAQGNBKQUAAOpFqT+gbUeLdbS8UsZIboclp2XJsr65oPpqGeV0WOoYH6VuLWLkcjDAGwAAoDGhlAIAAPXGGKNDpT59UVSugnK/gl++7XBYlpxf6aaMTkzTs798V+J2WLog1qMO8dFqzugoAACARolSCgAAhESRz68jZZUqrPCr0OeX3zY6+SbEkhTlcioh0qV4j1sXxHgU6XKGMy4AAADqGaUUAAAIOWOMKoMnpuhZluSyLLmdTM8DAABoSiilAAAAAAAAEHJ8JAkAAAAAAICQo5QCAAAAAABAyFFKAQAAAAAAIOQopQAAAAAAABBylFIAAAAAAAAIOUopAAAAAAAAhBylFAAAAAAAAEKOUgoAAAAAAAAhRykFAAAAAACAkKOUAgAAAAAAQMhRSgEAAAAAACDkKKUAAAAAAAAQcpRSAAAAAAAACDlKKQAAAAAAAIQcpRQAAAAAAABCjlIKAAAAAAAAIUcpBQAAAAAAgJCjlAIAAAAAAEDIUUoBAAAAAAAg5CilAAAAAAAAEHKUUgAAAAAAAAg5SikAAAAAAACEHKUUAAAAAAAAQo5SCgAAAAAAACFHKQUAAAAAAICQo5QCAAAAAABAyFFKAQAAAAAAIOQopQAAAAAAABBylFIAAAAAAAAIOUopAAAAAAAAhBylFAAAAAAAAEKOUgoAAAAAAAAhRykFAAAAAACAkKOUAgAAAAAAQMhRSgEAAAAAACDk/j8qXR1qGCHC6QAAAABJRU5ErkJggg==", + "text/plain": [ + "
    " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "=== ANSWER ===\n", + "The provided context does not mention transformers in natural language processing. The context discusses various topics such as machine learning, deep learning, reinforcement learning, and AI applications, but transformers are not mentioned.\n", + "Extracting text from data/AI_Information.pdf...\n", + "Created 42 text chunks\n", + "Building knowledge graph...\n", + "Creating embeddings for chunks...\n", + "Adding nodes to the graph...\n", + "Extracting concepts for chunk 1/42...\n", + "Extracting concepts for chunk 2/42...\n", + "Extracting concepts for chunk 3/42...\n", + "Extracting concepts for chunk 4/42...\n", + "Extracting concepts for chunk 5/42...\n", + "Extracting concepts for chunk 6/42...\n", + "Extracting concepts for chunk 7/42...\n", + "Extracting concepts for chunk 8/42...\n", + "Extracting concepts for chunk 9/42...\n", + "Extracting concepts for chunk 10/42...\n", + "Extracting concepts for chunk 11/42...\n", + "Extracting concepts for chunk 12/42...\n", + "Extracting concepts for chunk 13/42...\n", + "Extracting concepts for chunk 14/42...\n", + "Extracting concepts for chunk 15/42...\n", + "Extracting concepts for chunk 16/42...\n", + "Extracting concepts for chunk 17/42...\n", + "Extracting concepts for chunk 18/42...\n", + "Extracting concepts for chunk 19/42...\n", + "Extracting concepts for chunk 20/42...\n", + "Extracting concepts for chunk 21/42...\n", + "Extracting concepts for chunk 22/42...\n", + "Extracting concepts for chunk 23/42...\n", + "Extracting concepts for chunk 24/42...\n", + "Extracting concepts for chunk 25/42...\n", + "Extracting concepts for chunk 26/42...\n", + "Extracting concepts for chunk 27/42...\n", + "Extracting concepts for chunk 28/42...\n", + "Extracting concepts for chunk 29/42...\n", + "Extracting concepts for chunk 30/42...\n", + "Extracting concepts for chunk 31/42...\n", + "Extracting concepts for chunk 32/42...\n", + "Extracting concepts for chunk 33/42...\n", + "Extracting concepts for chunk 34/42...\n", + "Extracting concepts for chunk 35/42...\n", + "Extracting concepts for chunk 36/42...\n", + "Extracting concepts for chunk 37/42...\n", + "Extracting concepts for chunk 38/42...\n", + "Extracting concepts for chunk 39/42...\n", + "Extracting concepts for chunk 40/42...\n", + "Extracting concepts for chunk 41/42...\n", + "Extracting concepts for chunk 42/42...\n", + "Creating edges between nodes...\n", + "Knowledge graph built with 42 nodes and 107 edges\n", + "\n", + "\n", + "=== Evaluating Query 1/1 ===\n", + "Query: How do transformers handle sequential data compared to RNNs?\n", + "Traversing graph for query: How do transformers handle sequential data compared to RNNs?\n", + "Starting traversal from 5 nodes\n", + "Graph traversal found 9 relevant chunks\n", + "\n", + "Response: The provided context does not specifically discuss transformers. However, I can provide a general comparison between transformers and RNNs.\n", + "\n", + "Transformers are a type of neural network architecture that have gained popularity in recent years, particularly in natural language processing tasks. They are designed to handle sequential data, but they do so in a different way compared to RNNs.\n", + "\n", + "RNNs are designed to process sequential data by maintaining a hidden state that captures information from previous time steps. This allows RNNs to learn patterns and relationships in sequential data, such as text or time series.\n", + "\n", + "Transformers, on the other hand, use self-attention mechanisms to process sequential data. Instead of using a hidden state to capture information, transformers use attention weights to weigh the importance of different input elements at different positions in the sequence. This allows transformers to capture long-range dependencies in sequential data more effectively than RNNs.\n", + "\n", + "In terms of handling sequential data, transformers are generally more efficient and effective than RNNs, particularly for tasks such as language translation, text generation, and sentiment analysis. However, transformers do require more computational resources and training data than RNNs, which can be a limitation in certain applications.\n", + "\n", + "It's worth noting that the context does not provide a detailed comparison between transformers and RNNs, but I can provide a general overview of the differences between these two architectures.\n", + "\n", + "Comparison: Comparison of the AI-generated response with the reference answer:\n", + "\n", + "* Correctness: The AI response is mostly correct, but it lacks the specific detail about vanishing gradient problems in RNNs, which is mentioned in the reference answer.\n", + "* Completeness: The AI response provides a more comprehensive overview of the differences between transformers and RNNs, including their strengths and limitations.\n", + "* Relevance to the query: The AI response is highly relevant to the query, as it directly compares the handling of sequential data by transformers and RNNs.\n", + "\n", + "Brief analysis: The AI response provides a more detailed and comprehensive comparison between transformers and RNNs, but it could benefit from the specific detail about vanishing gradient problems in RNNs to make it more accurate. Overall, the AI response is a good match for the reference answer, but with some minor improvements.\n", + "\n", + "\n", + "=== EVALUATION SUMMARY ===\n", + "Graph nodes: 42\n", + "Graph edges: 107\n", + "\n", + "Query 1: How do transformers handle sequential data compared to RNNs?\n", + "Path length: 9\n", + "Chunks used: 9\n" + ] + } + ], + "source": [ + "# Path to the PDF document containing AI information\n", + "pdf_path = \"data/AI_Information.pdf\"\n", + "\n", + "# Define an AI-related query for testing Graph RAG\n", + "query = \"What are the key applications of transformers in natural language processing?\"\n", + "\n", + "# Execute the Graph RAG pipeline to process the document and answer the query\n", + "results = graph_rag_pipeline(pdf_path, query)\n", + "\n", + "# Print the response generated from the Graph RAG system\n", + "print(\"\\n=== ANSWER ===\")\n", + "print(results[\"response\"])\n", + "\n", + "# Define a test query and reference answer for formal evaluation\n", + "test_queries = [\n", + " \"How do transformers handle sequential data compared to RNNs?\"\n", + "]\n", + "\n", + "# Reference answer for evaluation purposes\n", + "reference_answers = [\n", + " \"Transformers handle sequential data differently from RNNs by using self-attention mechanisms instead of recurrent connections. This allows transformers to process all tokens in parallel rather than sequentially, capturing long-range dependencies more efficiently and enabling better parallelization during training. Unlike RNNs, transformers don't suffer from vanishing gradient problems with long sequences.\"\n", + "]\n", + "\n", + "# Run formal evaluation of the Graph RAG system with the test query\n", + "evaluation = evaluate_graph_rag(pdf_path, test_queries, reference_answers)\n", + "\n", + "# Print evaluation summary statistics\n", + "print(\"\\n=== EVALUATION SUMMARY ===\")\n", + "print(f\"Graph nodes: {evaluation['graph_stats']['nodes']}\")\n", + "print(f\"Graph edges: {evaluation['graph_stats']['edges']}\")\n", + "for i, result in enumerate(evaluation['results']):\n", + " print(f\"\\nQuery {i+1}: {result['query']}\")\n", + " print(f\"Path length: {result['traversal_path_length']}\")\n", + " print(f\"Chunks used: {result['relevant_chunks_count']}\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv-new-specific-rag", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 97b71f5746cb8181df45dee038279e3cb9be2637 Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Sun, 9 Mar 2025 19:43:44 +0500 Subject: [PATCH 09/32] Hierar rag --- 18_hierarchy_rag.ipynb | 1108 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1108 insertions(+) create mode 100644 18_hierarchy_rag.ipynb diff --git a/18_hierarchy_rag.ipynb b/18_hierarchy_rag.ipynb new file mode 100644 index 0000000..6da3837 --- /dev/null +++ b/18_hierarchy_rag.ipynb @@ -0,0 +1,1108 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "vscode": { + "languageId": "markdown" + } + }, + "source": [ + "# Hierarchical Indices for RAG\n", + "\n", + "In this notebook, I implement a hierarchical indexing approach for RAG systems. This technique improves retrieval by using a two-tier search method: first identifying relevant document sections through summaries, then retrieving specific details from those sections.\n", + "\n", + "Traditional RAG approaches treat all text chunks equally, which can lead to:\n", + "\n", + "- Lost context when chunks are too small\n", + "- Irrelevant results when the document collection is large\n", + "- Inefficient searches across the entire corpus\n", + "\n", + "Hierarchical retrieval solves these problems by:\n", + "\n", + "- Creating concise summaries for larger document sections\n", + "- First searching these summaries to identify relevant sections\n", + "- Then retrieving detailed information only from those sections\n", + "- Maintaining context while preserving specific details" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting Up the Environment\n", + "We begin by importing necessary libraries." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import numpy as np\n", + "import json\n", + "import fitz\n", + "from openai import OpenAI\n", + "import re\n", + "import pickle" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting Up the OpenAI API Client\n", + "We initialize the OpenAI client to generate embeddings and responses." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize the OpenAI client with the base URL and API key\n", + "client = OpenAI(\n", + " base_url=\"https://api.studio.nebius.com/v1/\",\n", + " api_key=os.getenv(\"OPENAI_API_KEY\") # Retrieve the API key from environment variables\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Document Processing Functions" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def extract_text_from_pdf(pdf_path):\n", + " \"\"\"\n", + " Extract text content from a PDF file with page separation.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF file\n", + " \n", + " Returns:\n", + " List[Dict]: List of pages with text content and metadata\n", + " \"\"\"\n", + " print(f\"Extracting text from {pdf_path}...\") # Print the path of the PDF being processed\n", + " pdf = fitz.open(pdf_path) # Open the PDF file using PyMuPDF\n", + " pages = [] # Initialize an empty list to store the pages with text content\n", + " \n", + " # Iterate over each page in the PDF\n", + " for page_num in range(len(pdf)):\n", + " page = pdf[page_num] # Get the current page\n", + " text = page.get_text() # Extract text from the current page\n", + " \n", + " # Skip pages with very little text (less than 50 characters)\n", + " if len(text.strip()) > 50:\n", + " # Append the page text and metadata to the list\n", + " pages.append({\n", + " \"text\": text,\n", + " \"metadata\": {\n", + " \"source\": pdf_path, # Source file path\n", + " \"page\": page_num + 1 # Page number (1-based index)\n", + " }\n", + " })\n", + " \n", + " print(f\"Extracted {len(pages)} pages with content\") # Print the number of pages extracted\n", + " return pages # Return the list of pages with text content and metadata" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def chunk_text(text, metadata, chunk_size=1000, overlap=200):\n", + " \"\"\"\n", + " Split text into overlapping chunks while preserving metadata.\n", + " \n", + " Args:\n", + " text (str): Input text to chunk\n", + " metadata (Dict): Metadata to preserve\n", + " chunk_size (int): Size of each chunk in characters\n", + " overlap (int): Overlap between chunks in characters\n", + " \n", + " Returns:\n", + " List[Dict]: List of text chunks with metadata\n", + " \"\"\"\n", + " chunks = [] # Initialize an empty list to store the chunks\n", + " \n", + " # Iterate over the text with the specified chunk size and overlap\n", + " for i in range(0, len(text), chunk_size - overlap):\n", + " chunk_text = text[i:i + chunk_size] # Extract the chunk of text\n", + " \n", + " # Skip very small chunks (less than 50 characters)\n", + " if chunk_text and len(chunk_text.strip()) > 50:\n", + " # Create a copy of metadata and add chunk-specific info\n", + " chunk_metadata = metadata.copy()\n", + " chunk_metadata.update({\n", + " \"chunk_index\": len(chunks), # Index of the chunk\n", + " \"start_char\": i, # Start character index of the chunk\n", + " \"end_char\": i + len(chunk_text), # End character index of the chunk\n", + " \"is_summary\": False # Flag indicating this is not a summary\n", + " })\n", + " \n", + " # Append the chunk with its metadata to the list\n", + " chunks.append({\n", + " \"text\": chunk_text,\n", + " \"metadata\": chunk_metadata\n", + " })\n", + " \n", + " return chunks # Return the list of chunks with metadata" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Simple Vector Store Implementation" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "class SimpleVectorStore:\n", + " \"\"\"\n", + " A simple vector store implementation using NumPy.\n", + " \"\"\"\n", + " def __init__(self):\n", + " self.vectors = [] # List to store vector embeddings\n", + " self.texts = [] # List to store text content\n", + " self.metadata = [] # List to store metadata\n", + " \n", + " def add_item(self, text, embedding, metadata=None):\n", + " \"\"\"\n", + " Add an item to the vector store.\n", + " \n", + " Args:\n", + " text (str): Text content\n", + " embedding (List[float]): Vector embedding\n", + " metadata (Dict, optional): Additional metadata\n", + " \"\"\"\n", + " self.vectors.append(np.array(embedding)) # Append the embedding as a numpy array\n", + " self.texts.append(text) # Append the text content\n", + " self.metadata.append(metadata or {}) # Append the metadata or an empty dict if None\n", + " \n", + " def similarity_search(self, query_embedding, k=5, filter_func=None):\n", + " \"\"\"\n", + " Find the most similar items to a query embedding.\n", + " \n", + " Args:\n", + " query_embedding (List[float]): Query embedding vector\n", + " k (int): Number of results to return\n", + " filter_func (callable, optional): Function to filter results\n", + " \n", + " Returns:\n", + " List[Dict]: Top k most similar items\n", + " \"\"\"\n", + " if not self.vectors:\n", + " return [] # Return an empty list if there are no vectors\n", + " \n", + " # Convert query embedding to numpy array\n", + " query_vector = np.array(query_embedding)\n", + " \n", + " # Calculate similarities using cosine similarity\n", + " similarities = []\n", + " for i, vector in enumerate(self.vectors):\n", + " # Skip if doesn't pass the filter\n", + " if filter_func and not filter_func(self.metadata[i]):\n", + " continue\n", + " \n", + " # Calculate cosine similarity\n", + " similarity = np.dot(query_vector, vector) / (np.linalg.norm(query_vector) * np.linalg.norm(vector))\n", + " similarities.append((i, similarity)) # Append index and similarity score\n", + " \n", + " # Sort by similarity (descending)\n", + " similarities.sort(key=lambda x: x[1], reverse=True)\n", + " \n", + " # Return top k results\n", + " results = []\n", + " for i in range(min(k, len(similarities))):\n", + " idx, score = similarities[i]\n", + " results.append({\n", + " \"text\": self.texts[idx], # Add the text content\n", + " \"metadata\": self.metadata[idx], # Add the metadata\n", + " \"similarity\": float(score) # Add the similarity score\n", + " })\n", + " \n", + " return results # Return the list of top k results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating Embeddings" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def create_embeddings(texts, model=\"BAAI/bge-en-icl\"):\n", + " \"\"\"\n", + " Create embeddings for the given texts.\n", + " \n", + " Args:\n", + " texts (List[str]): Input texts\n", + " model (str): Embedding model name\n", + " \n", + " Returns:\n", + " List[List[float]]: Embedding vectors\n", + " \"\"\"\n", + " # Handle empty input\n", + " if not texts:\n", + " return []\n", + " \n", + " # Process in batches if needed (OpenAI API limits)\n", + " batch_size = 100\n", + " all_embeddings = []\n", + " \n", + " # Iterate over the input texts in batches\n", + " for i in range(0, len(texts), batch_size):\n", + " batch = texts[i:i + batch_size] # Get the current batch of texts\n", + " \n", + " # Create embeddings for the current batch\n", + " response = client.embeddings.create(\n", + " model=model,\n", + " input=batch\n", + " )\n", + " \n", + " # Extract embeddings from the response\n", + " batch_embeddings = [item.embedding for item in response.data]\n", + " all_embeddings.extend(batch_embeddings) # Add the batch embeddings to the list\n", + " \n", + " return all_embeddings # Return all embeddings" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summarization Function" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_page_summary(page_text):\n", + " \"\"\"\n", + " Generate a concise summary of a page.\n", + " \n", + " Args:\n", + " page_text (str): Text content of the page\n", + " \n", + " Returns:\n", + " str: Generated summary\n", + " \"\"\"\n", + " # Define the system prompt to instruct the summarization model\n", + " system_prompt = \"\"\"You are an expert summarization system.\n", + " Create a detailed summary of the provided text. \n", + " Focus on capturing the main topics, key information, and important facts.\n", + " Your summary should be comprehensive enough to understand what the page contains\n", + " but more concise than the original.\"\"\"\n", + "\n", + " # Truncate input text if it exceeds the maximum token limit\n", + " max_tokens = 6000\n", + " truncated_text = page_text[:max_tokens] if len(page_text) > max_tokens else page_text\n", + "\n", + " # Make a request to the OpenAI API to generate the summary\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\", # Specify the model to use\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt}, # System message to guide the assistant\n", + " {\"role\": \"user\", \"content\": f\"Please summarize this text:\\n\\n{truncated_text}\"} # User message with the text to summarize\n", + " ],\n", + " temperature=0.3 # Set the temperature for response generation\n", + " )\n", + " \n", + " # Return the generated summary content\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Hierarchical Document Processing" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def process_document_hierarchically(pdf_path, chunk_size=1000, chunk_overlap=200):\n", + " \"\"\"\n", + " Process a document into hierarchical indices.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF file\n", + " chunk_size (int): Size of each detailed chunk\n", + " chunk_overlap (int): Overlap between chunks\n", + " \n", + " Returns:\n", + " Tuple[SimpleVectorStore, SimpleVectorStore]: Summary and detailed vector stores\n", + " \"\"\"\n", + " # Extract pages from PDF\n", + " pages = extract_text_from_pdf(pdf_path)\n", + " \n", + " # Create summaries for each page\n", + " print(\"Generating page summaries...\")\n", + " summaries = []\n", + " for i, page in enumerate(pages):\n", + " print(f\"Summarizing page {i+1}/{len(pages)}...\")\n", + " summary_text = generate_page_summary(page[\"text\"])\n", + " \n", + " # Create summary metadata\n", + " summary_metadata = page[\"metadata\"].copy()\n", + " summary_metadata.update({\"is_summary\": True})\n", + " \n", + " # Append the summary text and metadata to the summaries list\n", + " summaries.append({\n", + " \"text\": summary_text,\n", + " \"metadata\": summary_metadata\n", + " })\n", + " \n", + " # Create detailed chunks for each page\n", + " detailed_chunks = []\n", + " for page in pages:\n", + " # Chunk the text of the page\n", + " page_chunks = chunk_text(\n", + " page[\"text\"], \n", + " page[\"metadata\"], \n", + " chunk_size, \n", + " chunk_overlap\n", + " )\n", + " # Extend the detailed_chunks list with the chunks from the current page\n", + " detailed_chunks.extend(page_chunks)\n", + " \n", + " print(f\"Created {len(detailed_chunks)} detailed chunks\")\n", + " \n", + " # Create embeddings for summaries\n", + " print(\"Creating embeddings for summaries...\")\n", + " summary_texts = [summary[\"text\"] for summary in summaries]\n", + " summary_embeddings = create_embeddings(summary_texts)\n", + " \n", + " # Create embeddings for detailed chunks\n", + " print(\"Creating embeddings for detailed chunks...\")\n", + " chunk_texts = [chunk[\"text\"] for chunk in detailed_chunks]\n", + " chunk_embeddings = create_embeddings(chunk_texts)\n", + " \n", + " # Create vector stores\n", + " summary_store = SimpleVectorStore()\n", + " detailed_store = SimpleVectorStore()\n", + " \n", + " # Add summaries to summary store\n", + " for i, summary in enumerate(summaries):\n", + " summary_store.add_item(\n", + " text=summary[\"text\"],\n", + " embedding=summary_embeddings[i],\n", + " metadata=summary[\"metadata\"]\n", + " )\n", + " \n", + " # Add chunks to detailed store\n", + " for i, chunk in enumerate(detailed_chunks):\n", + " detailed_store.add_item(\n", + " text=chunk[\"text\"],\n", + " embedding=chunk_embeddings[i],\n", + " metadata=chunk[\"metadata\"]\n", + " )\n", + " \n", + " print(f\"Created vector stores with {len(summaries)} summaries and {len(detailed_chunks)} chunks\")\n", + " return summary_store, detailed_store" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Hierarchical Retrieval" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def retrieve_hierarchically(query, summary_store, detailed_store, k_summaries=3, k_chunks=5):\n", + " \"\"\"\n", + " Retrieve information using hierarchical indices.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " summary_store (SimpleVectorStore): Store of document summaries\n", + " detailed_store (SimpleVectorStore): Store of detailed chunks\n", + " k_summaries (int): Number of summaries to retrieve\n", + " k_chunks (int): Number of chunks to retrieve per summary\n", + " \n", + " Returns:\n", + " List[Dict]: Retrieved chunks with relevance scores\n", + " \"\"\"\n", + " print(f\"Performing hierarchical retrieval for query: {query}\")\n", + " \n", + " # Create query embedding\n", + " query_embedding = create_embeddings(query)\n", + " \n", + " # First, retrieve relevant summaries\n", + " summary_results = summary_store.similarity_search(\n", + " query_embedding, \n", + " k=k_summaries\n", + " )\n", + " \n", + " print(f\"Retrieved {len(summary_results)} relevant summaries\")\n", + " \n", + " # Collect pages from relevant summaries\n", + " relevant_pages = [result[\"metadata\"][\"page\"] for result in summary_results]\n", + " \n", + " # Create a filter function to only keep chunks from relevant pages\n", + " def page_filter(metadata):\n", + " return metadata[\"page\"] in relevant_pages\n", + " \n", + " # Then, retrieve detailed chunks from only those relevant pages\n", + " detailed_results = detailed_store.similarity_search(\n", + " query_embedding, \n", + " k=k_chunks * len(relevant_pages),\n", + " filter_func=page_filter\n", + " )\n", + " \n", + " print(f\"Retrieved {len(detailed_results)} detailed chunks from relevant pages\")\n", + " \n", + " # For each result, add which summary/page it came from\n", + " for result in detailed_results:\n", + " page = result[\"metadata\"][\"page\"]\n", + " matching_summaries = [s for s in summary_results if s[\"metadata\"][\"page\"] == page]\n", + " if matching_summaries:\n", + " result[\"summary\"] = matching_summaries[0][\"text\"]\n", + " \n", + " return detailed_results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Response Generation with Context" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_response(query, retrieved_chunks):\n", + " \"\"\"\n", + " Generate a response based on the query and retrieved chunks.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " retrieved_chunks (List[Dict]): Retrieved chunks from hierarchical search\n", + " \n", + " Returns:\n", + " str: Generated response\n", + " \"\"\"\n", + " # Extract text from chunks and prepare context parts\n", + " context_parts = []\n", + " \n", + " for i, chunk in enumerate(retrieved_chunks):\n", + " page_num = chunk[\"metadata\"][\"page\"] # Get the page number from metadata\n", + " context_parts.append(f\"[Page {page_num}]: {chunk['text']}\") # Format the chunk text with page number\n", + " \n", + " # Combine all context parts into a single context string\n", + " context = \"\\n\\n\".join(context_parts)\n", + " \n", + " # Define the system message to guide the AI assistant\n", + " system_message = \"\"\"You are a helpful AI assistant answering questions based on the provided context.\n", + "Use the information from the context to answer the user's question accurately.\n", + "If the context doesn't contain relevant information, acknowledge that.\n", + "Include page numbers when referencing specific information.\"\"\"\n", + "\n", + " # Generate the response using the OpenAI API\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\", # Specify the model to use\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_message}, # System message to guide the assistant\n", + " {\"role\": \"user\", \"content\": f\"Context:\\n\\n{context}\\n\\nQuestion: {query}\"} # User message with context and query\n", + " ],\n", + " temperature=0.2 # Set the temperature for response generation\n", + " )\n", + " \n", + " # Return the generated response content\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Complete RAG Pipeline with Hierarchical Retrieval" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def hierarchical_rag(query, pdf_path, chunk_size=1000, chunk_overlap=200, \n", + " k_summaries=3, k_chunks=5, regenerate=False):\n", + " \"\"\"\n", + " Complete hierarchical RAG pipeline.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " pdf_path (str): Path to the PDF document\n", + " chunk_size (int): Size of each detailed chunk\n", + " chunk_overlap (int): Overlap between chunks\n", + " k_summaries (int): Number of summaries to retrieve\n", + " k_chunks (int): Number of chunks to retrieve per summary\n", + " regenerate (bool): Whether to regenerate vector stores\n", + " \n", + " Returns:\n", + " Dict: Results including response and retrieved chunks\n", + " \"\"\"\n", + " # Create store filenames for caching\n", + " summary_store_file = f\"{os.path.basename(pdf_path)}_summary_store.pkl\"\n", + " detailed_store_file = f\"{os.path.basename(pdf_path)}_detailed_store.pkl\"\n", + " \n", + " # Process document and create stores if needed\n", + " if regenerate or not os.path.exists(summary_store_file) or not os.path.exists(detailed_store_file):\n", + " print(\"Processing document and creating vector stores...\")\n", + " # Process the document to create hierarchical indices and vector stores\n", + " summary_store, detailed_store = process_document_hierarchically(\n", + " pdf_path, chunk_size, chunk_overlap\n", + " )\n", + " \n", + " # Save the summary store to a file for future use\n", + " with open(summary_store_file, 'wb') as f:\n", + " pickle.dump(summary_store, f)\n", + " \n", + " # Save the detailed store to a file for future use\n", + " with open(detailed_store_file, 'wb') as f:\n", + " pickle.dump(detailed_store, f)\n", + " else:\n", + " # Load existing summary store from file\n", + " print(\"Loading existing vector stores...\")\n", + " with open(summary_store_file, 'rb') as f:\n", + " summary_store = pickle.load(f)\n", + " \n", + " # Load existing detailed store from file\n", + " with open(detailed_store_file, 'rb') as f:\n", + " detailed_store = pickle.load(f)\n", + " \n", + " # Retrieve relevant chunks hierarchically using the query\n", + " retrieved_chunks = retrieve_hierarchically(\n", + " query, summary_store, detailed_store, k_summaries, k_chunks\n", + " )\n", + " \n", + " # Generate a response based on the retrieved chunks\n", + " response = generate_response(query, retrieved_chunks)\n", + " \n", + " # Return results including the query, response, retrieved chunks, and counts of summaries and detailed chunks\n", + " return {\n", + " \"query\": query,\n", + " \"response\": response,\n", + " \"retrieved_chunks\": retrieved_chunks,\n", + " \"summary_count\": len(summary_store.texts),\n", + " \"detailed_count\": len(detailed_store.texts)\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Standard (Non-Hierarchical) RAG for Comparison" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def standard_rag(query, pdf_path, chunk_size=1000, chunk_overlap=200, k=15):\n", + " \"\"\"\n", + " Standard RAG pipeline without hierarchical retrieval.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " pdf_path (str): Path to the PDF document\n", + " chunk_size (int): Size of each chunk\n", + " chunk_overlap (int): Overlap between chunks\n", + " k (int): Number of chunks to retrieve\n", + " \n", + " Returns:\n", + " Dict: Results including response and retrieved chunks\n", + " \"\"\"\n", + " # Extract pages from the PDF document\n", + " pages = extract_text_from_pdf(pdf_path)\n", + " \n", + " # Create chunks directly from all pages\n", + " chunks = []\n", + " for page in pages:\n", + " # Chunk the text of the page\n", + " page_chunks = chunk_text(\n", + " page[\"text\"], \n", + " page[\"metadata\"], \n", + " chunk_size, \n", + " chunk_overlap\n", + " )\n", + " # Extend the chunks list with the chunks from the current page\n", + " chunks.extend(page_chunks)\n", + " \n", + " print(f\"Created {len(chunks)} chunks for standard RAG\")\n", + " \n", + " # Create a vector store to hold the chunks\n", + " store = SimpleVectorStore()\n", + " \n", + " # Create embeddings for the chunks\n", + " print(\"Creating embeddings for chunks...\")\n", + " texts = [chunk[\"text\"] for chunk in chunks]\n", + " embeddings = create_embeddings(texts)\n", + " \n", + " # Add chunks to the vector store\n", + " for i, chunk in enumerate(chunks):\n", + " store.add_item(\n", + " text=chunk[\"text\"],\n", + " embedding=embeddings[i],\n", + " metadata=chunk[\"metadata\"]\n", + " )\n", + " \n", + " # Create an embedding for the query\n", + " query_embedding = create_embeddings(query)\n", + " \n", + " # Retrieve the most relevant chunks based on the query embedding\n", + " retrieved_chunks = store.similarity_search(query_embedding, k=k)\n", + " print(f\"Retrieved {len(retrieved_chunks)} chunks with standard RAG\")\n", + " \n", + " # Generate a response based on the retrieved chunks\n", + " response = generate_response(query, retrieved_chunks)\n", + " \n", + " # Return the results including the query, response, and retrieved chunks\n", + " return {\n", + " \"query\": query,\n", + " \"response\": response,\n", + " \"retrieved_chunks\": retrieved_chunks\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluation Functions" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def compare_approaches(query, pdf_path, reference_answer=None):\n", + " \"\"\"\n", + " Compare hierarchical and standard RAG approaches.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " pdf_path (str): Path to the PDF document\n", + " reference_answer (str, optional): Reference answer for evaluation\n", + " \n", + " Returns:\n", + " Dict: Comparison results\n", + " \"\"\"\n", + " print(f\"\\n=== Comparing RAG approaches for query: {query} ===\")\n", + " \n", + " # Run hierarchical RAG\n", + " print(\"\\nRunning hierarchical RAG...\")\n", + " hierarchical_result = hierarchical_rag(query, pdf_path)\n", + " hier_response = hierarchical_result[\"response\"]\n", + " \n", + " # Run standard RAG\n", + " print(\"\\nRunning standard RAG...\")\n", + " standard_result = standard_rag(query, pdf_path)\n", + " std_response = standard_result[\"response\"]\n", + " \n", + " # Compare results from hierarchical and standard RAG\n", + " comparison = compare_responses(query, hier_response, std_response, reference_answer)\n", + " \n", + " # Return a dictionary with the comparison results\n", + " return {\n", + " \"query\": query, # The original query\n", + " \"hierarchical_response\": hier_response, # Response from hierarchical RAG\n", + " \"standard_response\": std_response, # Response from standard RAG\n", + " \"reference_answer\": reference_answer, # Reference answer for evaluation\n", + " \"comparison\": comparison, # Comparison analysis\n", + " \"hierarchical_chunks_count\": len(hierarchical_result[\"retrieved_chunks\"]), # Number of chunks retrieved by hierarchical RAG\n", + " \"standard_chunks_count\": len(standard_result[\"retrieved_chunks\"]) # Number of chunks retrieved by standard RAG\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def compare_responses(query, hierarchical_response, standard_response, reference=None):\n", + " \"\"\"\n", + " Compare responses from hierarchical and standard RAG.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " hierarchical_response (str): Response from hierarchical RAG\n", + " standard_response (str): Response from standard RAG\n", + " reference (str, optional): Reference answer\n", + " \n", + " Returns:\n", + " str: Comparison analysis\n", + " \"\"\"\n", + " # Define the system prompt to instruct the model on how to evaluate the responses\n", + " system_prompt = \"\"\"You are an expert evaluator of information retrieval systems. \n", + "Compare the two responses to the same query, one generated using hierarchical retrieval\n", + "and the other using standard retrieval.\n", + "\n", + "Evaluate them based on:\n", + "1. Accuracy: Which response provides more factually correct information?\n", + "2. Comprehensiveness: Which response better covers all aspects of the query?\n", + "3. Coherence: Which response has better logical flow and organization?\n", + "4. Page References: Does either response make better use of page references?\n", + "\n", + "Be specific in your analysis of the strengths and weaknesses of each approach.\"\"\"\n", + "\n", + " # Create the user prompt with the query and both responses\n", + " user_prompt = f\"\"\"Query: {query}\n", + "\n", + "Response from Hierarchical RAG:\n", + "{hierarchical_response}\n", + "\n", + "Response from Standard RAG:\n", + "{standard_response}\"\"\"\n", + "\n", + " # If a reference answer is provided, include it in the user prompt\n", + " if reference:\n", + " user_prompt += f\"\"\"\n", + "\n", + "Reference Answer:\n", + "{reference}\"\"\"\n", + "\n", + " # Add the final instruction to the user prompt\n", + " user_prompt += \"\"\"\n", + "\n", + "Please provide a detailed comparison of these two responses, highlighting which approach performed better and why.\"\"\"\n", + "\n", + " # Make a request to the OpenAI API to generate the comparison analysis\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt}, # System message to guide the assistant\n", + " {\"role\": \"user\", \"content\": user_prompt} # User message with the query and responses\n", + " ],\n", + " temperature=0 # Set the temperature for response generation\n", + " )\n", + " \n", + " # Return the generated comparison analysis\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "def run_evaluation(pdf_path, test_queries, reference_answers=None):\n", + " \"\"\"\n", + " Run a complete evaluation with multiple test queries.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF document\n", + " test_queries (List[str]): List of test queries\n", + " reference_answers (List[str], optional): Reference answers for queries\n", + " \n", + " Returns:\n", + " Dict: Evaluation results\n", + " \"\"\"\n", + " results = [] # Initialize an empty list to store results\n", + " \n", + " # Iterate over each query in the test queries\n", + " for i, query in enumerate(test_queries):\n", + " print(f\"Query: {query}\") # Print the current query\n", + " \n", + " # Get reference answer if available\n", + " reference = None\n", + " if reference_answers and i < len(reference_answers):\n", + " reference = reference_answers[i] # Retrieve the reference answer for the current query\n", + " \n", + " # Compare hierarchical and standard RAG approaches\n", + " result = compare_approaches(query, pdf_path, reference)\n", + " results.append(result) # Append the result to the results list\n", + " \n", + " # Generate overall analysis of the evaluation results\n", + " overall_analysis = generate_overall_analysis(results)\n", + " \n", + " return {\n", + " \"results\": results, # Return the individual results\n", + " \"overall_analysis\": overall_analysis # Return the overall analysis\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_overall_analysis(results):\n", + " \"\"\"\n", + " Generate an overall analysis of the evaluation results.\n", + " \n", + " Args:\n", + " results (List[Dict]): Results from individual query evaluations\n", + " \n", + " Returns:\n", + " str: Overall analysis\n", + " \"\"\"\n", + " # Define the system prompt to instruct the model on how to evaluate the results\n", + " system_prompt = \"\"\"You are an expert at evaluating information retrieval systems.\n", + "Based on multiple test queries, provide an overall analysis comparing hierarchical RAG \n", + "with standard RAG.\n", + "\n", + "Focus on:\n", + "1. When hierarchical retrieval performs better and why\n", + "2. When standard retrieval performs better and why\n", + "3. The overall strengths and weaknesses of each approach\n", + "4. Recommendations for when to use each approach\"\"\"\n", + "\n", + " # Create a summary of the evaluations\n", + " evaluations_summary = \"\"\n", + " for i, result in enumerate(results):\n", + " evaluations_summary += f\"Query {i+1}: {result['query']}\\n\"\n", + " evaluations_summary += f\"Hierarchical chunks: {result['hierarchical_chunks_count']}, Standard chunks: {result['standard_chunks_count']}\\n\"\n", + " evaluations_summary += f\"Comparison summary: {result['comparison'][:200]}...\\n\\n\"\n", + "\n", + " # Define the user prompt with the evaluations summary\n", + " user_prompt = f\"\"\"Based on the following evaluations comparing hierarchical vs standard RAG across {len(results)} queries, \n", + "provide an overall analysis of these two approaches:\n", + "\n", + "{evaluations_summary}\n", + "\n", + "Please provide a comprehensive analysis of the relative strengths and weaknesses of hierarchical RAG \n", + "compared to standard RAG, with specific focus on retrieval quality and response generation.\"\"\"\n", + "\n", + " # Make a request to the OpenAI API to generate the overall analysis\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt}, # System message to guide the assistant\n", + " {\"role\": \"user\", \"content\": user_prompt} # User message with the evaluations summary\n", + " ],\n", + " temperature=0 # Set the temperature for response generation\n", + " )\n", + " \n", + " # Return the generated overall analysis\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluation of Hierarchical and Standard RAG Approaches" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Processing document and creating vector stores...\n", + "Extracting text from data/AI_Information.pdf...\n", + "Extracted 15 pages with content\n", + "Generating page summaries...\n", + "Summarizing page 1/15...\n", + "Summarizing page 2/15...\n", + "Summarizing page 3/15...\n", + "Summarizing page 4/15...\n", + "Summarizing page 5/15...\n", + "Summarizing page 6/15...\n", + "Summarizing page 7/15...\n", + "Summarizing page 8/15...\n", + "Summarizing page 9/15...\n", + "Summarizing page 10/15...\n", + "Summarizing page 11/15...\n", + "Summarizing page 12/15...\n", + "Summarizing page 13/15...\n", + "Summarizing page 14/15...\n", + "Summarizing page 15/15...\n", + "Created 47 detailed chunks\n", + "Creating embeddings for summaries...\n", + "Creating embeddings for detailed chunks...\n", + "Created vector stores with 15 summaries and 47 chunks\n", + "Performing hierarchical retrieval for query: What are the key applications of transformer models in natural language processing?\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\faree\\AppData\\Local\\Temp\\ipykernel_9608\\2918097221.py:62: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n", + " \"similarity\": float(score) # Add the similarity score\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Retrieved 3 relevant summaries\n", + "Retrieved 10 detailed chunks from relevant pages\n", + "\n", + "=== Response ===\n", + "I couldn't find any information about transformer models in the provided context. The context appears to focus on various applications of Artificial Intelligence (AI) and Machine Learning (ML), including computer vision, deep learning, reinforcement learning, and more. However, transformer models are not mentioned.\n", + "\n", + "If you're looking for information on transformer models, I'd be happy to try and help you find it. Alternatively, if you have any other questions based on the provided context, I'd be happy to try and assist you.\n", + "Query: How do transformers handle sequential data compared to RNNs?\n", + "\n", + "=== Comparing RAG approaches for query: How do transformers handle sequential data compared to RNNs? ===\n", + "\n", + "Running hierarchical RAG...\n", + "Loading existing vector stores...\n", + "Performing hierarchical retrieval for query: How do transformers handle sequential data compared to RNNs?\n", + "Retrieved 3 relevant summaries\n", + "Retrieved 10 detailed chunks from relevant pages\n", + "\n", + "Running standard RAG...\n", + "Extracting text from data/AI_Information.pdf...\n", + "Extracted 15 pages with content\n", + "Created 47 chunks for standard RAG\n", + "Creating embeddings for chunks...\n", + "Retrieved 15 chunks with standard RAG\n", + "\n", + "=== OVERALL ANALYSIS ===\n", + "Based on the provided evaluation, I will provide a comprehensive analysis of the relative strengths and weaknesses of hierarchical RAG compared to standard RAG.\n", + "\n", + "**Overview of Hierarchical RAG and Standard RAG**\n", + "\n", + "Hierarchical RAG (Retrieval Algorithm for Generating) is an extension of the standard RAG approach, which involves dividing the input text into smaller chunks or sub-sequences to facilitate more efficient and effective retrieval. The hierarchical approach further divides these chunks into smaller sub-chunks, allowing for more granular and detailed retrieval.\n", + "\n", + "Standard RAG, on the other hand, uses a single chunk size to retrieve relevant information from the input text.\n", + "\n", + "**Strengths of Hierarchical RAG**\n", + "\n", + "1. **Improved Retrieval Quality**: Hierarchical RAG's ability to divide the input text into smaller sub-chunks allows for more precise retrieval, as it can capture subtle nuances and relationships between words and phrases that may be missed by standard RAG.\n", + "2. **Enhanced Response Generation**: By considering multiple levels of granularity, hierarchical RAG can generate more accurate and informative responses, as it can take into account the context and relationships between different parts of the input text.\n", + "3. **Better Handling of Complex Input Text**: Hierarchical RAG is particularly well-suited for handling complex input text, such as long documents or texts with multiple layers of abstraction.\n", + "\n", + "**Weaknesses of Hierarchical RAG**\n", + "\n", + "1. **Increased Computational Complexity**: The hierarchical approach requires more computational resources and processing power, as it needs to handle multiple levels of granularity.\n", + "2. **Higher Risk of Overfitting**: The increased number of parameters and complexity of the hierarchical model can lead to overfitting, particularly if the training data is limited or biased.\n", + "\n", + "**Strengths of Standard RAG**\n", + "\n", + "1. **Simpler and Faster**: Standard RAG is a simpler and faster approach, as it only requires a single chunk size and less computational resources.\n", + "2. **Less Risk of Overfitting**: The standard model has fewer parameters and is less prone to overfitting, making it a more robust and reliable choice.\n", + "\n", + "**Weaknesses of Standard RAG**\n", + "\n", + "1. **Limited Retrieval Quality**: Standard RAG's single chunk size can lead to limited retrieval quality, as it may not capture the full range of nuances and relationships between words and phrases.\n", + "2. **Less Effective for Complex Input Text**: Standard RAG is less effective for handling complex input text, as it may struggle to capture the context and relationships between different parts of the text.\n", + "\n", + "**When to Use Each Approach**\n", + "\n", + "1. **Use Hierarchical RAG**:\n", + "\t* When dealing with complex input text, such as long documents or texts with multiple layers of abstraction.\n", + "\t* When high retrieval quality and response generation are critical, such as in applications requiring accurate and informative responses.\n", + "\t* When computational resources are not a concern, and the benefits of hierarchical retrieval outweigh the costs.\n", + "2. **Use Standard RAG**:\n", + "\t* When dealing with simple input text, such as short documents or texts with a clear and concise structure.\n", + "\t* When computational resources are limited, and speed is a priority.\n", + "\t* When the goal is to quickly retrieve relevant information, rather than generating accurate and informative responses.\n", + "\n", + "In conclusion, hierarchical RAG offers improved retrieval quality and response generation, but at the cost of increased computational complexity and risk of overfitting. Standard RAG, on the other hand, is simpler and faster, but may have limited retrieval quality and be less effective for complex input text. The choice of approach depends on the specific requirements and constraints of the application.\n" + ] + } + ], + "source": [ + "# Path to the PDF document containing AI information\n", + "pdf_path = \"data/AI_Information.pdf\"\n", + "\n", + "# Example query about AI for testing the hierarchical RAG approach\n", + "query = \"What are the key applications of transformer models in natural language processing?\"\n", + "result = hierarchical_rag(query, pdf_path)\n", + "\n", + "print(\"\\n=== Response ===\")\n", + "print(result[\"response\"])\n", + "\n", + "# Test query for formal evaluation (using only one query as requested)\n", + "test_queries = [\n", + " \"How do transformers handle sequential data compared to RNNs?\"\n", + "]\n", + "\n", + "# Reference answer for the test query to enable comparison\n", + "reference_answers = [\n", + " \"Transformers handle sequential data differently from RNNs by using self-attention mechanisms instead of recurrent connections. This allows transformers to process all tokens in parallel rather than sequentially, capturing long-range dependencies more efficiently and enabling better parallelization during training. Unlike RNNs, transformers don't suffer from vanishing gradient problems with long sequences.\"\n", + "]\n", + "\n", + "# Run the evaluation comparing hierarchical and standard RAG approaches\n", + "evaluation_results = run_evaluation(\n", + " pdf_path=pdf_path,\n", + " test_queries=test_queries,\n", + " reference_answers=reference_answers\n", + ")\n", + "\n", + "# Print the overall analysis of the comparison\n", + "print(\"\\n=== OVERALL ANALYSIS ===\")\n", + "print(evaluation_results[\"overall_analysis\"])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv-new-specific-rag", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From dfdd941e8199a8597085f582b26fa29f69753c05 Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Sun, 9 Mar 2025 20:32:13 +0500 Subject: [PATCH 10/32] hyde rag --- 19_HyDE_rag.ipynb | 1070 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1070 insertions(+) create mode 100644 19_HyDE_rag.ipynb diff --git a/19_HyDE_rag.ipynb b/19_HyDE_rag.ipynb new file mode 100644 index 0000000..0940de4 --- /dev/null +++ b/19_HyDE_rag.ipynb @@ -0,0 +1,1070 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "vscode": { + "languageId": "markdown" + } + }, + "source": [ + "# Hypothetical Document Embedding (HyDE) for RAG\n", + "\n", + "In this notebook, I implement HyDE (Hypothetical Document Embedding) - an innovative retrieval technique that transforms user queries into hypothetical answer documents before performing retrieval. This approach bridges the semantic gap between short queries and lengthy documents.\n", + "\n", + "Traditional RAG systems embed the user's short query directly, but this often fails to capture the semantic richness needed for optimal retrieval. HyDE solves this by:\n", + "\n", + "- Generating a hypothetical document that answers the query\n", + "- Embedding this expanded document instead of the original query\n", + "- Retrieving documents similar to this hypothetical document\n", + "- Creating more contextually relevant answers" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting Up the Environment\n", + "We begin by importing necessary libraries." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import numpy as np\n", + "import json\n", + "import fitz\n", + "from openai import OpenAI\n", + "import re\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting Up the OpenAI API Client\n", + "We initialize the OpenAI client to generate embeddings and responses." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize the OpenAI client with the base URL and API key\n", + "client = OpenAI(\n", + " base_url=\"https://api.studio.nebius.com/v1/\",\n", + " api_key=os.getenv(\"OPENAI_API_KEY\") # Retrieve the API key from environment variables\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Document Processing Functions" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def extract_text_from_pdf(pdf_path):\n", + " \"\"\"\n", + " Extract text content from a PDF file with page separation.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF file\n", + " \n", + " Returns:\n", + " List[Dict]: List of pages with text content and metadata\n", + " \"\"\"\n", + " print(f\"Extracting text from {pdf_path}...\") # Print the path of the PDF being processed\n", + " pdf = fitz.open(pdf_path) # Open the PDF file using PyMuPDF\n", + " pages = [] # Initialize an empty list to store the pages with text content\n", + " \n", + " # Iterate over each page in the PDF\n", + " for page_num in range(len(pdf)):\n", + " page = pdf[page_num] # Get the current page\n", + " text = page.get_text() # Extract text from the current page\n", + " \n", + " # Skip pages with very little text (less than 50 characters)\n", + " if len(text.strip()) > 50:\n", + " # Append the page text and metadata to the list\n", + " pages.append({\n", + " \"text\": text,\n", + " \"metadata\": {\n", + " \"source\": pdf_path, # Source file path\n", + " \"page\": page_num + 1 # Page number (1-based index)\n", + " }\n", + " })\n", + " \n", + " print(f\"Extracted {len(pages)} pages with content\") # Print the number of pages extracted\n", + " return pages # Return the list of pages with text content and metadata" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def chunk_text(text, chunk_size=1000, overlap=200):\n", + " \"\"\"\n", + " Split text into overlapping chunks.\n", + " \n", + " Args:\n", + " text (str): Input text to chunk\n", + " chunk_size (int): Size of each chunk in characters\n", + " overlap (int): Overlap between chunks in characters\n", + " \n", + " Returns:\n", + " List[Dict]: List of chunks with metadata\n", + " \"\"\"\n", + " chunks = [] # Initialize an empty list to store the chunks\n", + " \n", + " # Iterate over the text in steps of (chunk_size - overlap)\n", + " for i in range(0, len(text), chunk_size - overlap):\n", + " chunk_text = text[i:i + chunk_size] # Extract the chunk of text\n", + " if chunk_text: # Ensure we don't add empty chunks\n", + " chunks.append({\n", + " \"text\": chunk_text, # Add the chunk text\n", + " \"metadata\": {\n", + " \"start_pos\": i, # Start position of the chunk in the original text\n", + " \"end_pos\": i + len(chunk_text) # End position of the chunk in the original text\n", + " }\n", + " })\n", + " \n", + " print(f\"Created {len(chunks)} text chunks\") # Print the number of chunks created\n", + " return chunks # Return the list of chunks with metadata" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Simple Vector Store Implementation" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "class SimpleVectorStore:\n", + " \"\"\"\n", + " A simple vector store implementation using NumPy.\n", + " \"\"\"\n", + " def __init__(self):\n", + " self.vectors = [] # List to store vector embeddings\n", + " self.texts = [] # List to store text content\n", + " self.metadata = [] # List to store metadata\n", + " \n", + " def add_item(self, text, embedding, metadata=None):\n", + " \"\"\"\n", + " Add an item to the vector store.\n", + " \n", + " Args:\n", + " text (str): Text content\n", + " embedding (List[float]): Vector embedding\n", + " metadata (Dict, optional): Additional metadata\n", + " \"\"\"\n", + " self.vectors.append(np.array(embedding)) # Append the embedding as a numpy array\n", + " self.texts.append(text) # Append the text content\n", + " self.metadata.append(metadata or {}) # Append the metadata or an empty dict if None\n", + " \n", + " def similarity_search(self, query_embedding, k=5, filter_func=None):\n", + " \"\"\"\n", + " Find the most similar items to a query embedding.\n", + " \n", + " Args:\n", + " query_embedding (List[float]): Query embedding vector\n", + " k (int): Number of results to return\n", + " filter_func (callable, optional): Function to filter results\n", + " \n", + " Returns:\n", + " List[Dict]: Top k most similar items\n", + " \"\"\"\n", + " if not self.vectors:\n", + " return [] # Return an empty list if there are no vectors\n", + " \n", + " # Convert query embedding to numpy array\n", + " query_vector = np.array(query_embedding)\n", + " \n", + " # Calculate similarities using cosine similarity\n", + " similarities = []\n", + " for i, vector in enumerate(self.vectors):\n", + " # Skip if doesn't pass the filter\n", + " if filter_func and not filter_func(self.metadata[i]):\n", + " continue\n", + " \n", + " # Calculate cosine similarity\n", + " similarity = np.dot(query_vector, vector) / (np.linalg.norm(query_vector) * np.linalg.norm(vector))\n", + " similarities.append((i, similarity)) # Append index and similarity score\n", + " \n", + " # Sort by similarity (descending)\n", + " similarities.sort(key=lambda x: x[1], reverse=True)\n", + " \n", + " # Return top k results\n", + " results = []\n", + " for i in range(min(k, len(similarities))):\n", + " idx, score = similarities[i]\n", + " results.append({\n", + " \"text\": self.texts[idx], # Add the text content\n", + " \"metadata\": self.metadata[idx], # Add the metadata\n", + " \"similarity\": float(score) # Add the similarity score\n", + " })\n", + " \n", + " return results # Return the list of top k results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating Embeddings" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def create_embeddings(texts, model=\"BAAI/bge-en-icl\"):\n", + " \"\"\"\n", + " Create embeddings for the given texts.\n", + " \n", + " Args:\n", + " texts (List[str]): Input texts\n", + " model (str): Embedding model name\n", + " \n", + " Returns:\n", + " List[List[float]]: Embedding vectors\n", + " \"\"\"\n", + " # Handle empty input\n", + " if not texts:\n", + " return []\n", + " \n", + " # Process in batches if needed (OpenAI API limits)\n", + " batch_size = 100\n", + " all_embeddings = []\n", + " \n", + " # Iterate over the input texts in batches\n", + " for i in range(0, len(texts), batch_size):\n", + " batch = texts[i:i + batch_size] # Get the current batch of texts\n", + " \n", + " # Create embeddings for the current batch\n", + " response = client.embeddings.create(\n", + " model=model,\n", + " input=batch\n", + " )\n", + " \n", + " # Extract embeddings from the response\n", + " batch_embeddings = [item.embedding for item in response.data]\n", + " all_embeddings.extend(batch_embeddings) # Add the batch embeddings to the list\n", + " \n", + " return all_embeddings # Return all embeddings" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Document Processing Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def process_document(pdf_path, chunk_size=1000, chunk_overlap=200):\n", + " \"\"\"\n", + " Process a document for RAG.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF file\n", + " chunk_size (int): Size of each chunk in characters\n", + " chunk_overlap (int): Overlap between chunks in characters\n", + " \n", + " Returns:\n", + " SimpleVectorStore: Vector store containing document chunks\n", + " \"\"\"\n", + " # Extract text from the PDF file\n", + " pages = extract_text_from_pdf(pdf_path)\n", + " \n", + " # Process each page and create chunks\n", + " all_chunks = []\n", + " for page in pages:\n", + " # Pass the text content (string) to chunk_text, not the dictionary\n", + " page_chunks = chunk_text(page[\"text\"], chunk_size, chunk_overlap)\n", + " \n", + " # Update metadata for each chunk with the page's metadata\n", + " for chunk in page_chunks:\n", + " chunk[\"metadata\"].update(page[\"metadata\"])\n", + " \n", + " all_chunks.extend(page_chunks)\n", + " \n", + " # Create embeddings for the text chunks\n", + " print(\"Creating embeddings for chunks...\")\n", + " chunk_texts = [chunk[\"text\"] for chunk in all_chunks]\n", + " chunk_embeddings = create_embeddings(chunk_texts)\n", + " \n", + " # Create a vector store to hold the chunks and their embeddings\n", + " vector_store = SimpleVectorStore()\n", + " for i, chunk in enumerate(all_chunks):\n", + " vector_store.add_item(\n", + " text=chunk[\"text\"],\n", + " embedding=chunk_embeddings[i],\n", + " metadata=chunk[\"metadata\"]\n", + " )\n", + " \n", + " print(f\"Vector store created with {len(all_chunks)} chunks\")\n", + " return vector_store" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Hypothetical Document Generation" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_hypothetical_document(query, desired_length=1000):\n", + " \"\"\"\n", + " Generate a hypothetical document that answers the query.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " desired_length (int): Target length of the hypothetical document\n", + " \n", + " Returns:\n", + " str: Generated hypothetical document\n", + " \"\"\"\n", + " # Define the system prompt to instruct the model on how to generate the document\n", + " system_prompt = f\"\"\"You are an expert document creator. \n", + " Given a question, generate a detailed document that would directly answer this question.\n", + " The document should be approximately {desired_length} characters long and provide an in-depth, \n", + " informative answer to the question. Write as if this document is from an authoritative source\n", + " on the subject. Include specific details, facts, and explanations.\n", + " Do not mention that this is a hypothetical document - just write the content directly.\"\"\"\n", + "\n", + " # Define the user prompt with the query\n", + " user_prompt = f\"Question: {query}\\n\\nGenerate a document that fully answers this question:\"\n", + " \n", + " # Make a request to the OpenAI API to generate the hypothetical document\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\", # Specify the model to use\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt}, # System message to guide the assistant\n", + " {\"role\": \"user\", \"content\": user_prompt} # User message with the query\n", + " ],\n", + " temperature=0.1 # Set the temperature for response generation\n", + " )\n", + " \n", + " # Return the generated document content\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Complete HyDE RAG Implementation" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def hyde_rag(query, vector_store, k=5, should_generate_response=True):\n", + " \"\"\"\n", + " Perform RAG using Hypothetical Document Embedding.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " vector_store (SimpleVectorStore): Vector store with document chunks\n", + " k (int): Number of chunks to retrieve\n", + " generate_response (bool): Whether to generate a final response\n", + " \n", + " Returns:\n", + " Dict: Results including hypothetical document and retrieved chunks\n", + " \"\"\"\n", + " print(f\"\\n=== Processing query with HyDE: {query} ===\\n\")\n", + " \n", + " # Step 1: Generate a hypothetical document that answers the query\n", + " print(\"Generating hypothetical document...\")\n", + " hypothetical_doc = generate_hypothetical_document(query)\n", + " print(f\"Generated hypothetical document of {len(hypothetical_doc)} characters\")\n", + " \n", + " # Step 2: Create embedding for the hypothetical document\n", + " print(\"Creating embedding for hypothetical document...\")\n", + " hypothetical_embedding = create_embeddings([hypothetical_doc])[0]\n", + " \n", + " # Step 3: Retrieve similar chunks based on the hypothetical document\n", + " print(f\"Retrieving {k} most similar chunks...\")\n", + " retrieved_chunks = vector_store.similarity_search(hypothetical_embedding, k=k)\n", + " \n", + " # Prepare the results dictionary\n", + " results = {\n", + " \"query\": query,\n", + " \"hypothetical_document\": hypothetical_doc,\n", + " \"retrieved_chunks\": retrieved_chunks\n", + " }\n", + " \n", + " # Step 4: Generate a response if requested\n", + " if should_generate_response:\n", + " print(\"Generating final response...\")\n", + " response = generate_response(query, retrieved_chunks)\n", + " results[\"response\"] = response\n", + " \n", + " return results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Standard (Direct) RAG Implementation for Comparison" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def standard_rag(query, vector_store, k=5, should_generate_response=True):\n", + " \"\"\"\n", + " Perform standard RAG using direct query embedding.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " vector_store (SimpleVectorStore): Vector store with document chunks\n", + " k (int): Number of chunks to retrieve\n", + " generate_response (bool): Whether to generate a final response\n", + " \n", + " Returns:\n", + " Dict: Results including retrieved chunks\n", + " \"\"\"\n", + " print(f\"\\n=== Processing query with Standard RAG: {query} ===\\n\")\n", + " \n", + " # Step 1: Create embedding for the query\n", + " print(\"Creating embedding for query...\")\n", + " query_embedding = create_embeddings([query])[0]\n", + " \n", + " # Step 2: Retrieve similar chunks based on the query embedding\n", + " print(f\"Retrieving {k} most similar chunks...\")\n", + " retrieved_chunks = vector_store.similarity_search(query_embedding, k=k)\n", + " \n", + " # Prepare the results dictionary\n", + " results = {\n", + " \"query\": query,\n", + " \"retrieved_chunks\": retrieved_chunks\n", + " }\n", + " \n", + " # Step 3: Generate a response if requested\n", + " if should_generate_response:\n", + " print(\"Generating final response...\")\n", + " response = generate_response(query, retrieved_chunks)\n", + " results[\"response\"] = response\n", + " \n", + " return results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Response Generation" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_response(query, relevant_chunks):\n", + " \"\"\"\n", + " Generate a final response based on the query and relevant chunks.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " relevant_chunks (List[Dict]): Retrieved relevant chunks\n", + " \n", + " Returns:\n", + " str: Generated response\n", + " \"\"\"\n", + " # Concatenate the text from the chunks to create context\n", + " context = \"\\n\\n\".join([chunk[\"text\"] for chunk in relevant_chunks])\n", + " \n", + " # Generate response using OpenAI API\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": \"You are a helpful assistant. Answer the question based on the provided context.\"},\n", + " {\"role\": \"user\", \"content\": f\"Context:\\n{context}\\n\\nQuestion: {query}\"}\n", + " ],\n", + " temperature=0.5,\n", + " max_tokens=500\n", + " )\n", + " \n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluation Functions" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def compare_approaches(query, vector_store, reference_answer=None):\n", + " \"\"\"\n", + " Compare HyDE and standard RAG approaches for a query.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " vector_store (SimpleVectorStore): Vector store with document chunks\n", + " reference_answer (str, optional): Reference answer for evaluation\n", + " \n", + " Returns:\n", + " Dict: Comparison results\n", + " \"\"\"\n", + " # Run HyDE RAG\n", + " hyde_result = hyde_rag(query, vector_store)\n", + " hyde_response = hyde_result[\"response\"]\n", + " \n", + " # Run standard RAG\n", + " standard_result = standard_rag(query, vector_store)\n", + " standard_response = standard_result[\"response\"]\n", + " \n", + " # Compare results\n", + " comparison = compare_responses(query, hyde_response, standard_response, reference_answer)\n", + " \n", + " return {\n", + " \"query\": query,\n", + " \"hyde_response\": hyde_response,\n", + " \"hyde_hypothetical_doc\": hyde_result[\"hypothetical_document\"],\n", + " \"standard_response\": standard_response,\n", + " \"reference_answer\": reference_answer,\n", + " \"comparison\": comparison\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "def compare_responses(query, hyde_response, standard_response, reference=None):\n", + " \"\"\"\n", + " Compare responses from HyDE and standard RAG.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " hyde_response (str): Response from HyDE RAG\n", + " standard_response (str): Response from standard RAG\n", + " reference (str, optional): Reference answer\n", + " \n", + " Returns:\n", + " str: Comparison analysis\n", + " \"\"\"\n", + " system_prompt = \"\"\"You are an expert evaluator of information retrieval systems.\n", + "Compare the two responses to the same query, one generated using HyDE (Hypothetical Document Embedding) \n", + "and the other using standard RAG with direct query embedding.\n", + "\n", + "Evaluate them based on:\n", + "1. Accuracy: Which response provides more factually correct information?\n", + "2. Relevance: Which response better addresses the query?\n", + "3. Completeness: Which response provides more thorough coverage of the topic?\n", + "4. Clarity: Which response is better organized and easier to understand?\n", + "\n", + "Be specific about the strengths and weaknesses of each approach.\"\"\"\n", + "\n", + " user_prompt = f\"\"\"Query: {query}\n", + "\n", + "Response from HyDE RAG:\n", + "{hyde_response}\n", + "\n", + "Response from Standard RAG:\n", + "{standard_response}\"\"\"\n", + "\n", + " if reference:\n", + " user_prompt += f\"\"\"\n", + "\n", + "Reference Answer:\n", + "{reference}\"\"\"\n", + "\n", + " user_prompt += \"\"\"\n", + "\n", + "Please provide a detailed comparison of these two responses, highlighting which approach performed better and why.\"\"\"\n", + "\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0\n", + " )\n", + " \n", + " return response.choices[0].message.content\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def run_evaluation(pdf_path, test_queries, reference_answers=None, chunk_size=1000, chunk_overlap=200):\n", + " \"\"\"\n", + " Run a complete evaluation with multiple test queries.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF document\n", + " test_queries (List[str]): List of test queries\n", + " reference_answers (List[str], optional): Reference answers for queries\n", + " chunk_size (int): Size of each chunk in characters\n", + " chunk_overlap (int): Overlap between chunks in characters\n", + " \n", + " Returns:\n", + " Dict: Evaluation results\n", + " \"\"\"\n", + " # Process document and create vector store\n", + " vector_store = process_document(pdf_path, chunk_size, chunk_overlap)\n", + " \n", + " results = []\n", + " \n", + " for i, query in enumerate(test_queries):\n", + " print(f\"\\n\\n===== Evaluating Query {i+1}/{len(test_queries)} =====\")\n", + " print(f\"Query: {query}\")\n", + " \n", + " # Get reference answer if available\n", + " reference = None\n", + " if reference_answers and i < len(reference_answers):\n", + " reference = reference_answers[i]\n", + " \n", + " # Compare approaches\n", + " result = compare_approaches(query, vector_store, reference)\n", + " results.append(result)\n", + " \n", + " # Generate overall analysis\n", + " overall_analysis = generate_overall_analysis(results)\n", + " \n", + " return {\n", + " \"results\": results,\n", + " \"overall_analysis\": overall_analysis\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_overall_analysis(results):\n", + " \"\"\"\n", + " Generate an overall analysis of the evaluation results.\n", + " \n", + " Args:\n", + " results (List[Dict]): Results from individual query evaluations\n", + " \n", + " Returns:\n", + " str: Overall analysis\n", + " \"\"\"\n", + " system_prompt = \"\"\"You are an expert at evaluating information retrieval systems.\n", + "Based on multiple test queries, provide an overall analysis comparing HyDE RAG (using hypothetical document embedding)\n", + "with standard RAG (using direct query embedding).\n", + "\n", + "Focus on:\n", + "1. When HyDE performs better and why\n", + "2. When standard RAG performs better and why\n", + "3. The types of queries that benefit most from HyDE\n", + "4. The overall strengths and weaknesses of each approach\n", + "5. Recommendations for when to use each approach\"\"\"\n", + "\n", + " # Create summary of evaluations\n", + " evaluations_summary = \"\"\n", + " for i, result in enumerate(results):\n", + " evaluations_summary += f\"Query {i+1}: {result['query']}\\n\"\n", + " evaluations_summary += f\"Comparison summary: {result['comparison'][:200]}...\\n\\n\"\n", + "\n", + " user_prompt = f\"\"\"Based on the following evaluations comparing HyDE vs standard RAG across {len(results)} queries, \n", + "provide an overall analysis of these two approaches:\n", + "\n", + "{evaluations_summary}\n", + "\n", + "Please provide a comprehensive analysis of the relative strengths and weaknesses of HyDE compared to standard RAG,\n", + "focusing on when and why one approach outperforms the other.\"\"\"\n", + "\n", + " response = client.chat.completions.create(\n", + " model=\"meta-llama/Llama-3.2-3B-Instruct\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0\n", + " )\n", + " \n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Visualization Functions" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "def visualize_results(query, hyde_result, standard_result):\n", + " \"\"\"\n", + " Visualize the results of HyDE and standard RAG approaches.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " hyde_result (Dict): Results from HyDE RAG\n", + " standard_result (Dict): Results from standard RAG\n", + " \"\"\"\n", + " # Create a figure with 3 subplots\n", + " fig, axs = plt.subplots(1, 3, figsize=(20, 6))\n", + " \n", + " # Plot the query in the first subplot\n", + " axs[0].text(0.5, 0.5, f\"Query:\\n\\n{query}\", \n", + " horizontalalignment='center', verticalalignment='center',\n", + " fontsize=12, wrap=True)\n", + " axs[0].axis('off') # Hide the axis for the query plot\n", + " \n", + " # Plot the hypothetical document in the second subplot\n", + " hypothetical_doc = hyde_result[\"hypothetical_document\"]\n", + " # Shorten the hypothetical document if it's too long\n", + " shortened_doc = hypothetical_doc[:500] + \"...\" if len(hypothetical_doc) > 500 else hypothetical_doc\n", + " axs[1].text(0.5, 0.5, f\"Hypothetical Document:\\n\\n{shortened_doc}\", \n", + " horizontalalignment='center', verticalalignment='center',\n", + " fontsize=10, wrap=True)\n", + " axs[1].axis('off') # Hide the axis for the hypothetical document plot\n", + " \n", + " # Plot comparison of retrieved chunks in the third subplot\n", + " # Shorten each chunk text for better visualization\n", + " hyde_chunks = [chunk[\"text\"][:100] + \"...\" for chunk in hyde_result[\"retrieved_chunks\"]]\n", + " std_chunks = [chunk[\"text\"][:100] + \"...\" for chunk in standard_result[\"retrieved_chunks\"]]\n", + " \n", + " # Prepare the comparison text\n", + " comparison_text = \"Retrieved by HyDE:\\n\\n\"\n", + " for i, chunk in enumerate(hyde_chunks):\n", + " comparison_text += f\"{i+1}. {chunk}\\n\\n\"\n", + " \n", + " comparison_text += \"\\nRetrieved by Standard RAG:\\n\\n\"\n", + " for i, chunk in enumerate(std_chunks):\n", + " comparison_text += f\"{i+1}. {chunk}\\n\\n\"\n", + " \n", + " # Plot the comparison text in the third subplot\n", + " axs[2].text(0.5, 0.5, comparison_text, \n", + " horizontalalignment='center', verticalalignment='center',\n", + " fontsize=8, wrap=True)\n", + " axs[2].axis('off') # Hide the axis for the comparison plot\n", + " \n", + " # Adjust layout to prevent overlap\n", + " plt.tight_layout()\n", + " # Display the plot\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluation of Hypothetical Document Embedding (HyDE) vs. Standard RAG" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Extracting text from data/AI_Information.pdf...\n", + "Extracted 15 pages with content\n", + "Created 4 text chunks\n", + "Created 4 text chunks\n", + "Created 3 text chunks\n", + "Created 3 text chunks\n", + "Created 3 text chunks\n", + "Created 3 text chunks\n", + "Created 3 text chunks\n", + "Created 3 text chunks\n", + "Created 3 text chunks\n", + "Created 3 text chunks\n", + "Created 3 text chunks\n", + "Created 3 text chunks\n", + "Created 3 text chunks\n", + "Created 4 text chunks\n", + "Created 3 text chunks\n", + "Creating embeddings for chunks...\n", + "Vector store created with 48 chunks\n", + "\n", + "=== Processing query with HyDE: What are the main ethical considerations in artificial intelligence development? ===\n", + "\n", + "Generating hypothetical document...\n", + "Generated hypothetical document of 3364 characters\n", + "Creating embedding for hypothetical document...\n", + "Retrieving 5 most similar chunks...\n", + "Generating final response...\n", + "\n", + "=== HyDE Response ===\n", + "The main ethical considerations in artificial intelligence development include:\n", + "\n", + "1. Bias and Fairness: Ensuring that AI systems are fair, non-discriminatory, and do not perpetuate existing biases present in the data they are trained on.\n", + "\n", + "2. Transparency and Explainability: Making AI decisions more understandable and assessable to build trust and accountability.\n", + "\n", + "3. Privacy and Data Protection: Ensuring responsible data handling, implementing privacy-preserving techniques, and complying with data protection regulations.\n", + "\n", + "4. Accountability and Responsibility: Establishing clear guidelines and frameworks for AI development and deployment to address potential harms and ensure ethical behavior.\n", + "\n", + "5. Job Displacement: Addressing the potential economic and social impacts of AI-driven automation.\n", + "\n", + "6. Autonomy and Control: Establishing guidelines and frameworks to ensure that AI systems are developed and deployed in a way that prioritizes human well-being and safety.\n", + "\n", + "7. Weaponization of AI: Addressing the risks associated with the potential use of AI in autonomous weapons systems.\n", + "\n", + "8. Respect for Human Rights: Prioritizing the respect and protection of human rights, particularly in the development and deployment of AI systems.\n", + "\n", + "These considerations are guided by principles of Ethical AI, which include respect for human rights, privacy, non-discrimination, and beneficence.\n", + "\n", + "=== Processing query with Standard RAG: What are the main ethical considerations in artificial intelligence development? ===\n", + "\n", + "Creating embedding for query...\n", + "Retrieving 5 most similar chunks...\n", + "Generating final response...\n", + "\n", + "=== Standard RAG Response ===\n", + "The main ethical considerations in artificial intelligence development include:\n", + "\n", + "1. Bias and Fairness: Ensuring that AI systems do not inherit and amplify biases present in the data they are trained on, leading to unfair or discriminatory outcomes.\n", + "2. Transparency and Explainability: Making it possible to understand how AI systems arrive at their decisions and ensuring that these decisions are transparent and accountable.\n", + "3. Respect for Human Rights, Privacy, Non-Discrimination, and Beneficence: Guiding the development and deployment of AI systems to ensure they are fair, transparent, accountable, and beneficial to society.\n", + "4. Job Displacement: Addressing the potential economic and social impacts of AI-driven automation, particularly in industries with repetitive or routine tasks.\n", + "5. Autonomy and Control: Establishing clear guidelines and ethical frameworks for AI development and deployment, particularly as AI systems become more autonomous.\n", + "6. Weaponization of AI: Addressing the risks associated with AI-powered autonomous weapons and establishing international discussions and regulations.\n", + "7. Cybersecurity: Protecting sensitive information and ensuring responsible data handling, as well as using AI to detect and respond to threats, analyze network traffic, and identify vulnerabilities.\n", + "\n", + "These considerations are essential to ensure that AI development aligns with societal values and promotes the well-being of individuals and society as a whole.\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAB8YAAAM+CAYAAABoiWs3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdeVzWVf7//ydCbqOIa2M2hQ6KAtfFxSIICYqiuBQpWZorLri12WRpZuqYmamj5lJoLphKlllqaTqhMrmhol7gBolKTZrpCJKmyHb9/vDn+yuxiGVhfB73283bjes657zO6xz878U5x85ms9kEAAAAAAAAAAAAAEAFVam8EwAAAAAAAAAAAAAA4PdEYRwAAAAAAAAAAAAAUKFRGAcAAAAAAAAAAAAAVGgUxgEAAAAAAAAAAAAAFRqFcQAAAAAAAAAAAABAhUZhHAAAAAAAAAAAAABQoVEYBwAAAAAAAAAAAABUaBTGAQAAAAAAAAAAAAAVGoVxAAAAAAAAAAAAAECFRmEcAAAAAAAAAAAAAFChURgHAAAAAAAAAAAAAFRoFMYBAAAAAAAAAAAAABUahXEAAAAAAAAAAAAAQIVGYRwAAAAAAAAAAAAAUKFRGAcAAAAAAAAAAAAAVGgUxgEAAAAAAAAAAAAAFRqFcQAAAAAAAAAAAABAhUZhHAAAAAAAAAAAAABQoVEYBwAAAAAAAAAAAABUaBTGAQAAAAAAAAAAAAAVGoVxAAAAAAAAAAAAAECFRmEcAAAAAAAAAAAAAFChURgHAAAAAAAAAAAAAFRoFMYBAAAAAAAAAAAAABUahXEAAAAAAAAAAAAAQIVGYRwAAAAAAAAAAAAAUKFRGAcAAAAAAAAAAAAAVGgUxgEAAAAAAAAAAAAAFRqFcQAAAAAAAAAAAABAhUZhHAAAAAAAAAAAAABQoVEYBwAAAAAAAAAAAABUaBTGAQAAAAAAAAAAAAAVGoVxAAAAAAAAAAAAAECFRmEcAAAAAAAAAAAAAFChURgHAAAAAAAAAAAAAFRoFMYBAAAAAAAAAAAAABUahXEAAAAAAAAAAAAAQIVGYRwAAAAAAAAAAAAAUKFRGAcAAAAAAAAAAAAAVGgUxgEAAAAAAAAAAAAAFRqFcQAAAAAAAAAAAABAhUZhHAAAAAAAAAAAAABQoVEYBwAAAAAAAAAAAABUaBTGAQAAAAAAAAAAAAAVGoVxAAAAAAAAAAAAAH8qzs7OcnV1lcVikaurq6ZNm1amcXPmzNG5c+dK7dOlSxelpqbejTRv64svvlDbtm2LbWvbtq3WrVv3m+JPmjRJo0aNKvRdTEyMunXrVqax9evXl5eXl5o1a6aWLVvqnXfeUX5+vtHHzs5OJpNJFovF+Hfx4sXflPPvxaG8EwAAAAAAAAAAAACAO/XRRx/JYrHozJkzcnNzU7t27eTn51fqmDlz5qht27b661//WqStoKBAkrRp06bfJd8/oz59+mjOnDmSpFOnTqlv3746efKk5s6da/TZsWOHnJycyifBO8CJcQAAAAAAAAAAAAB/Wo0aNVLz5s317bffSpLOnTunp556Sn5+fjKZTBo/frwkafLkyTp79qx69uwpi8Uiq9WqSZMm6YknnlBYWJg8PDz0ww8/yNnZWVartdRYq1at0qOPPmrkYLPZ1KRJEyUlJUmSVqxYIX9/f3l7eys4ONj4Pjc3VyNHjlTTpk3l5+en7du3l7q2rVu3qmXLlnJxcdFLL70km82mxMRENW/eXDabzegXGBioL7/88o737tFHH1VsbKzx+d///rf8/f2L7dukSRMtXbpU7733nrKysu54rvJGYRwAAAAAAAAAAADAn1ZKSoouXrxoXEk+YMAAPfPMM9q3b58OHTqkxMRErVmzRhMmTNADDzygjz76SFarVRaLRZK0Z88effDBBzp27JgaNWpUKHZJsSIiIpSQkGBcyx4fH6/atWvL09NTu3bt0ocffqivv/5aBw8e1JtvvqnevXtLkhYtWqTU1FQdPXpUO3fu1MGDB0td27Fjx7R7924lJyfrP//5jz788EP5+vqqbt26+uqrryRJhw4d0oULF9SpU6diY6xatarQVecTJkww2l544QXNnz/f+LxgwQI9++yzJebTvHlzVa9evdBV80FBQUbskJAQ4/suXbooMTGx1PX9kbhKHQAAAAAAAAAAAMCfTs+ePVWpUiWlpqZq9uzZql+/vn7++Wdt3bpVP/74o9HvypUrpb4Z3qVLF91///1Fvi8t1pNPPqknnnhCK1as0Msvv6yYmBgNHDhQkrR+/XolJSUVOnmdkZGha9euaevWrerfv78qV64sSRo0aJCWLFlSYm79+/fXfffdp/vuu099+/ZVXFycevfubRS0O3bsqAULFmjkyJGys7Mr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bd++XS1bttRPP/2kWrVq6fr164UK4/b29kpISNDu3bsVHx+vVq1a6cMPP5TNZpO7u7t2795923nXrl2rAwcOKD4+Xl26dNGUKVPUq1evUsfY2dkV+ly1atVCOeXl5d123rKIjY3Vtm3b9J///EeOjo6aO3eutm3b9pvntdlsGjBggKZOnVrmXH7LGnv16qVp06apR48ekqQ6deooOzu7zONv4o1xAAAAAAAAAAAAAHdFq1atdPjwYR05ckSStHr1ajVq1KjISetf+vHHH7V161alpaUpPT1d6enp+uGHH3T27FklJSXdUQ7Z2dnKycnRQw89JEmaN29esf0uX76sH3/8UUFBQXr99dfVunVrHTp0SIGBgTp9+rTi4uKMvlar1Xj7+6a8vDydPHlSvr6+Gj16tHr06KF9+/YV6uPo6ChPT0+tXLlS0o1T5zt37ryj9dzOY489ppUrV+qHH36QJF29elVXr15VZmam6tWrJ0dHR12+fLnQ9eulcXR01LVr14qs96bw8HCtXLlS3333naQbJ9Nvvk/u6OiorKysO15DjRo1FBwcrH/961/GdzevUs/MzFTjxo0lSStXrlRmZuYdx5cojAMAAAAAAAAAAAC4S+rXr69Vq1apf//+MpvNeu+997RmzZoip6R/afny5erYsWOht8crVaqkXr16acmSJXeUg6Ojo6ZMmSI/Pz/5+PiocuXKxfbLyspSRESETCaTzGazcnNzNWDAANWuXVsbN27U1KlT5enpKTc3N40dO1YFBQWFxufn52vQoEHy8PCQxWLRgQMHjHfNb/XBBx/ovffek4eHh8aMGaOWLVsW+8b6rxUcHKyJEycqLCxMnp6eatOmjS5cuKD+/fvr6tWrcnV1VefOnRUUFFSmeHXq1DF+f76+vkXag4KCNH36dHXv3l2enp5yd3fX6tWrJd24Wv769esym80aPnz4Ha1jxYoVSkxMlLu7uywWi+bPny9Jeuedd9SjRw95eXnp0KFDxh883Ck7m81m+1UjAQAAAAAAAAAAAAClunLliv7yl7/Izs5Op0+fVkBAgPbv36+//e1v5Z3a/ym8MQ4AAAAAAAAAAAAAv5Pdu3fr5ZdflnTjlPns2bMpipcDTowDAAAAAAAAAAAAACo03hgHAAAAAAAAAAAAUKHUq1dP6enpv+scQ4YM0fbt22/bLyYmRikpKWWK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zc1NFotFJpNJe/fu1SeffKKOHTsaffLz8/Xwww/r2LFjOnHihB555BF5enrKZDJp/Pjxslqtio6O1qpVq2SxWIyi7pYtW9S6dWv5+PjIz89P27dvl3Sj0Ovh4aERI0bIbDbLZDIpOTlZkZGRMplM8vf315kzZyRJCQkJ8vHxkcVikYeHh957771i17Fx40a1bNlSnp6eslgs2rt3rySpT58+8vX1ldlsVteuXXXu3DlJUnp6upycnDRx4kT5+PjIxcVFmzZtKjb2pEmTNGrUKElSTEyMQkND9fTTT8tkMsnX11enTp0y+ubl5WnkyJHy9PSUu7u7EhMTjbbS9sPd3V2DBw+WxWLRZ599psjISM2ZM6fEvb1VbGys/P395eXlJU9PT33++edGW9u2bTV69GgFBQXp73//e6Ei/w8//KCwsDC5ubkpNDRU33//fbHrLytOjAMAAAAAAAAAAAD4XR07dkz//e9/FRYWpry8PE2bNq3IlerFeemll5SSkqKGDRsqNzdX169fl6+vr0aPHq3U1FS5urpqw4YNcnFxkZubm1544QU9+uijevXVVyVJGRkZqlOnjoYPH65Lly5pzpw5kqRTp05p0qRJ2rJlixwdHZWWlqagoCClp6dLklJSUrR8+XK99957ev3119WuXTvt3LlTzZs31zPPPKM5c+ZoxowZeuuttzR69Gg9/fTTkqTMzMwia/jmm280cOBAff3112revLlyc3N19epVSdKcOXNUv359SdK0adM0adIkRUdHS5KysrJkNpv1z3/+U5s3b9YLL7ygLl263HbP9u/fL6vVqsaNG2vs2LF6++23tXDhQmNdS5Ys0bvvvqvo6Gi99tpr2rJly2334/jx43r33Xe1ZMkSSTcK/ZJksViK7O0vhYWF6emnn5adnZ3S09PVqlUrffvtt6pSpYok6eTJk9q+fbtyc3Pl5uamPXv2KCAgQM8//7z8/Py0ZcsWnTlzRhaLRc2bN7/t+kvCiXEAAAAAAAAAAAAAv6slS5aof//+sre3V5cuXXT69GkdP378tuPat2+vfv366Z133tHp06dVo0YN2dvba+TIkVqwYIEkacGCBXr22WclScHBwXr//ff12muv6d///recnJyKjbt582alpaUpODhYFotFPXr0UKVKlfTdd99JklxcXOTj4yNJ8vX1lYuLi1GU9fPz04kT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zZslSXZ2dsrMzJSTk5Mk6eLFi6pTp47s7OyUnp6uVq1a6dtvv1WVKlUKzRkfH69Ro0YVujrd2dlZ4eHhmjt3rv73v//p73//u44dO6ZGjRopLCxM48aNU5s2bZSXl6dHH31UgwcPVkREhP7+979ry5YtcnV11Weffab58+dr69atRdZ56zoSEhIUGRmplJQUY+7Q0FC9//77srOz09SpU5Wfn6/XX39dkvTGG2/o3LlzWrBgQaGY6enpslgsunTpkvFd27ZtVbVqVX3++ee67777ZLPZlJGRobp168pms2nkyJF6+OGHNXbs2EL7kJ6ersaNG+uTTz7RE088oc2bN+uFF15QamqqLl26pJCQEG3atEkNGzbU//73P3l7e2vPnj1q1KjRr//l/04cyjsBAAAAAAAAAAAAALhVQkKCzGaz3NzcJEmDBw/Wc889Z7R/9dVXmjdvni5fvqyCggJlZGSUGOv06dPq06ePvv/+ezk4OCgjI0OnT59W8+bNy5RL7969Jd1447xJkyY6ffq0nJyctHXrVv34449GvytXrig1NVX29vYaOXKkFixYoLlz52rBggV69tlni4196NAhvfnmm7p48aIcHByUmpqqa9euqVq1apKkyMhI2dnZSZLWrVunrKwsrV27VpKUk5MjZ2fnMq1Bkvr27av77rtPkmSz2TR79mxt3LhReXl5ysrKUmBgYLHjqlatqoiICElSQECATp48KUnavXu3Tp06pc6dOxfqn5qaSmEcAAAAAAAAAAAAAO7UzeKwJH333Xd69tlntX//fv39739XcnKygoODSxzbq1cvTZs2TT169JAk1alT547eIK9atarxs729vfLy8nTzUu6EhIRC7TdFRUXJzc1N/fv3V1paWqGr2W/KyclRRESEtm/frpYtW+qnn35SrVq1dP36daMwXqNGDaO/zWbTvHnzCl3TfidujRUbG6tt27bpP//5jxwdHTV37lxt27at2HFVqlQx9t/e3l75+flGPu7u7tq9e/evyuePxhvjAAAAAAAAAAAAAO4pAQEBSk5ONq4VX7p0qXJyciRJWVlZuu+++9SwYUPZbDbNnz+/0NiaNWsqKyvL+JyZmanGjRtLklauXFnsu9yS5OjoWGhcaWrUqKGQkBBNmzbN+O7s2bP6/vvvJUm1a9fW448/ru7du2vYsGGyt7cvEiM7O1s5OTl66KGHJEnz5s0rdc5u3bpp9uzZunr1qiTp6tWrOnr0aLHruHbtmrFfxcnMzFS9evXk6Oioy5cvKyYm5rZr/qXAwECdPn1acXFxxndWq7XUecsThXEAAAAAAAAAAAAA95T69etr6dKl6t69uzw9PXXixAnVrVtXkmQymdSrVy+5u7urZcuWRmH5ppdeekkdOnSQxWLR+fPn9c4776hHjx7y8vLSoUOHivS/yWw2y93dXR4eHsWe8P6lVatWKS0tTR4eHjKZTIqIiNDFixeN9qioKF24cEFRUVHFjnd0dNSUKVPk5+cnHx8fVa5cudT5xowZo5YtW8rf319ms1mtWrUq9B76TXXq1FH//v1lNpvl6+tbbKz+/fvr6tWrcnV1VefOnRUUFHTb9f5S7dq1tXHjRk2dOlWenp5yc3PT2LFjVVBQIEnq0qWLEhMTJUmJiYnq0qWLMXbChAmKjo6+4zl/CzvbzXP+AAAAAAAAAAAAAIC7YubMmTp+/LiWLFlS3qlAvDEOAAAAAAAAAAAAAHeVu7u77OzstHnz5vJOBf8/TowDAAAAAAAAAAAAACo03hgHAAAAAAAAAAAAAFRoFMYBAAAAAAAAAAAAABUahXEAAAAAAAAAAAAAQIVGYRwAAAAAAAAAAAAAUKFRGAcAAAAAAAAAAAAAVGgUxgEAAAAAAAAAAAAAFRqFcQAAAAAAAAAAAABAhUZhHAAAAAAAAAAAAABQoVEYBwAAAAAAAAAAAABUaBTGAQAAAAAAAAAAAAAVGoVxAAAAAAAAAAAAAECFRmEcAAAAAAAAAAAAAFChOZR3AgAAAAAAAAAAAADwf0HHjh117tw5VapUSTVr1tTcuXPl5eVV3mn9n2Bns9ls5Z0EAAAAAAAAAAAAAFR0ly5dkpOTkyTps88+06RJk5SUlFS+Sf0fwVXqAAAAAAAAAAAAAPAHuFkUl6SsrCzZ2dmVXzL/x3CVOgAAAAAAAAAAAAD8Qfr376/t27dLkjZt2lTO2fzfwVXqAAAAAAAAAAAAAPAHW758uT766COK438QCuMAAAAAAAAAAAAAUA6qVaum77//XnXr1i3vVCo83hgHAAAAAAAAAAAAgN/ZpUuXdPbsWePzunXrVLduXdWpU6ccs/q/gzfGAQAAAAAAAAAAAOB3lpWVpSeffFLXrl1TpUqVVL9+fX3xxReys7OTJA0ZMkTh4eEKDw8v50wrJq5SBwAAAAAAAAAAAABUaFylDgAAAAAAAAAAAACo0CiMAwAAAAAAAAAAAAAqNArjAAAAAAAAAAAAAIAKjcI4AAAAAAAAAAAAgHuWs7OzXF1dZbFY5ObmpgULFpTYt0uXLkpNTf0Ds/v91KtXT+np6UW+z83N1fPPPy93d3d5enrKzc1Ns2bN+sPyio6O1owZMyRJVqtVq1ev/sPm/i0cyjsBAAAAAAAAAAAAACjNRx99JIvFom+//VZms1lBQUEym81Ge0FBgSRp06ZN5ZXiH+add97R2bNnlZSUJAcHB2VnZ+vkyZN/yNx5eXkaPny48dlqtWrdunXq1avXHzL/b8GJcQAAAAAAAAAAAAB/Cg8//LBcXV31zTffaNKkSXriiScUFhYmDw8P/fDDD3J2dpbVatWuXbtkMpkKjW3btq3Wr1+vvLw8hYWFydfXV+7u7urdu7d+/vlno9+yZctksVjk6ekpX19fpaen69lnn9XUqVONPqmpqfrb3/6mvLy8Ijn26dNHvr6+MpvN6tq1q86dOydJSk9Pl5OTkyZOnCgfHx+5uLgUKuRv2LBBLVq0kNls1iuvvFLiHnz//fdq0KCBHBxunIGuWrWq3N3djfYVK1bI399f3t7eCg4OVlJSktH29ttvy2QyydPTU61atdLVq1cVHx8vi8Vi9Dly5IicnZ0L5TxmzBh5e3tr/vz5mjRpkkaNGqXz589rwoQJ2r59uywWi4YPH66ZM2dq6NChRqxLly6pXr16ysjIKHE9fxQK4wAAAAAAAAAAAAD+FA4fPqyUlBR5enpKkvbs2aMPPvhAx44dU6NGjYx+jzzyiK5fv67ExERJ0qlTp5SamqquXbvK3t5esbGxSkxM1JEjR1SrVi3NmzdPkhQfH6/Jkyfryy+/VFJSkr7++ms1aNBAzz33nBYtWqT8/HxJ0rvvvquhQ4caxelbzZkzR4mJiUpOTlZQUJAmTZpktGVlZclsNuvAgQOaP3++XnzxRUnS+fPnNXDgQK1du1bJyclycXHRxYsXi92DqKgoff7552rRooWioqK0evVqI69du3bpww8/1Ndff62DBw/qzTffVO/evSVJy5cv19q1a7Vz504lJSXpyy+/VJUqVW6751lZWXJ3d9fBgwc1atQo4/sGDRpo8uTJCgkJkdVqVXR0tIYMGaJ169bp0qVLkm78kcHjjz+uOnXq3Hae3xtXqQMAAAAAAAAAAAC4p/Xs2VPVqlVT9erVtXTpUjVt2lTSjTfF77///mLHDBw4UMuWLZOvr6+WL1+uPn36yMHBQQUFBZo9e7Y2btyovLw8ZWVlKTAwUJK0ceNG9evXTw0bNpQkVa9eXZLk6uoqNzc3rV+/XmFhYfrwww91+PDhYueNjY3VihUrlJ2drezsbNWrV89oq1q1qiIiIiRJAQEBxhXoCQkJMpvNcnNzkyQNHjxYzz33XLHx3d3ddfLkSe3cuVO7d+/WxIkTtWLFCm3cuFHr169XUlKS/P39jf4ZGRm6du2avvjiCw0fPly1atWSJNWuXbsMOy/dd9996tu3b5n6Ojk5qUePHlq6dKlefPFFvffee/roo4/KNPb3RmEcAAAAAAAAAAAAwD3t5hvjv1SjRo0SxwwYMECenp6aOXOmPvjgA33xxReSbhSut23bpv/85z9ydHTU3LlztW3bttvm8MILL+jtt9/WhQsX1KFDh2IL8jt37tTcuXO1Z88eNWjQQBs2bNCECROM9ipVqsjOzk6SZG9vb5z0/qWbfUpSuXJltWvXTu3atdOQIUPUsGFDZWRkyGazacCAAYWufb8dBweHQnlkZ2cXaq9evboqVSr7ReTPP/+8wsPD1aJFC9WvX19eXl5lHvt74ip1AAAAAAAAAAAAABXOAw88oJYtW+rFF19UgwYNjHe4MzMzVa9ePTk6Oury5cuKiYkxxjz22GNauXKlfvjhB0nS1atXdfXqVUlSx44dde7cOU2ZMkXPPvtssXNmZmaqZs2aqlu3rnJycrRw4cIy5RoQEKDk5GSlpKRIkpYuXaqcnJxi+3799ddGfpJ04MAB1alTR05OTgoPD9fKlSv13XffSZIKCgqM6+TDw8MVHR2trKwsSTfe/87Pz1eTJk307bff6sKFC5JuvFFeVo6Ojka8m5o3b64mTZpo6NChJe5TeaAwDgAAAAAAAAAAAKBCGjhwoBYuXKiBAwca3/Xv319Xr16Vq6urOnfurKCgIKMtODhYEydOVFhYmDw9PdWmTRujYGxnZ6fBgwerQYMGCggIKHa+Tp06ydXVVa6urgoKCir2lHtx6tevr6VLl6p79+7y9PTUiRMnVLdu3WL7fvfdd+ratavc3NxksVj01ltvaf369apUqZKCgoI0ffp0I467u7tWr14tSerXr5+eeOIJBQYGytPTU126dNH169f1wAMP6JVXXpGfn59atWp1R++Bt2/fXtevX5fZbNbw4cON76OiopSXl6cePXqUOdbvzc5ms9nKOwkAAAAAAAAAAAAAuNc9+uij6tmzp/r161feqdzTnn32Wd1///16/fXXyzsVAyfGAQAAAAAAAAAAAKAUiYmJcnFxUaVKldS7d+/yTueedfbsWTVv3lwHDx7UqFGjyjudQjgxDgAAAAAAAAAAAACo0DgxDgAAAAAAAAAAAOA3uXz5smrUqKHBgwcX+j4+Pr7M72z/WvHx8dq8efPvOsevNXjwYLm5ual79+5at26dEhISyjWfSZMmldtJbmdnZ1mt1nKZW6IwDgAAAAAAAAAAAOA3+uijj+Tj46NPP/1UV65c+UPnvlcL4z/++KNWr16tw4cP67PPPvtDCuN5eXm/a/w/2t1cD4VxAAAAAAAAAAAAAL/JkiVLNGbMGAUHB+ujjz4q05jFixfLzc1NFotFJpNJe/fu1SeffKKOHTsaffLz8/Xwww/r2LFjOnHihB555BF5enrKZDJp/Pjxslqtio6O1qpVq2SxWDR58mRJ0pYtW9S6dWv5+PjIz89P27dvl3SjiO7h4aERI0bIbDbLZDIpOTlZkZGRMplM8vf315kzZyRJCQkJ8vHxkcVikYeHh957771i17FixQqZzWaZzWZ17dpVZ86c0aVLlxQSEqLs7Gz5+Pho6tSp2rBhg2bMmCGLxaLFixcbY/39/eXt7a3g4GAlJSVJkmJiYhQaGqqnn35aJpNJvr6+OnXqVLHzt23bVs8//7wCAgKMvZs5c6b8/Pzk7e2tTp066dtvvy0yzmQyaffu3cbnRYsWqWfPnsXOMWPGDLm7u8tkMqlPnz7KysqSdOMEes+ePfXYY4/Jzc1N7dq1U0ZGRgm/8f9n1qxZatmypSwWi1q2bKk9e/YYbc7OzhozZoz8/Pw0YMAAXb58WT179lTz5s0VFBSkYcOGKTIy0uhflrVKksNtswIAAAAAAAAAAACAEhw7dkz//e9/FRYWpry8PE2bNq3IlerFeemll5SSkqKGDRsqNzdX169fl6+vr0aPHq3U1FS5urpqw4YNcnFxkZubm1544QU9+uijevXVVyVJGRkZqlOnjoYPH65Lly5pzpw5kqRTp05p0qRJ2rJlixwdHZWWlqagoCClp6dLklJSUrR8+XK99957ev3119WuXTvt3LlTzZs31zPPPKM5c+ZoxowZeuuttzR69Gg9/fTTkqTMzMwiazhy5IhefvllHThwQI0aNdKbb76pIUOG6Msvv9SmTZtksViM68O/+eYbWSwW4yrzXbt26cMPP9TXX3+tKlWqaMeOHerdu7eOHj0qSdq/f7+sVqsaN26ssWPH6u2339bChQuL3ctvvvlGX3/9te677z7FxsYqNTVVe/bskb29vVasWKGRI0dq48aNhcY8//zzmj9/vgIDAyVJCxYs0Pz584vE/vLLL7V06VLt2bNHTk5OGjp0qMaOHWv8ocDevXt14MAB1a1bV7169dLChQuN31FJ+vXrp3/84x+SbvwBQmRkpFJSUoz2ixcvau/evbKzs9PLL7+satWq6fjx47py5YoCAwPl4+MjSWVeq0RhHAAAAAAAAAAAAMBvsGTJEvXv31/29vbq0qWLhg0bpuPHj6tFixaljmvfvr369eunxx57TJ07d1azZs0kSSNHjtSCBQs0d+5cLViwQM8++6wkKTg4WC+//LKuXLmiNm3aKDQ0tNi4mzdvVlpamoKDg43vKlWqpO+++06S5OLiYhRWfX195eLioubNm0uS/Pz89Nlnn0mSQkJC9MYbb+jEiRNq166dWrduXWSu7du3q1OnTmrUqJGR++TJk5Wfn3/bfVu/fr2SkpLk7+9vfJeRkaFr165JkgICAtS4cWPj53nz5pUYq2/fvrrvvvskSevWrdP+/fuNNZaUS9++fTVhwgT9+OOPOnHihOzs7BQUFFSkX1xcnHr27CknJydJ0ogRI/Tkk08a7Z06dVLdunWNPA8fPnzbtR86dEhvvvmmLl68KAcHB6WmpuratWuqVq2aJCkyMlJ2dnaSpK1bt2r27Nmys7NTzZo11bNnT6Wlpd3RWiUK4wAAAAAAAAAAAAB+pdzcXK1YscI4qSxJV69e1ZIlSzRz5sxSx65du1YHDhxQfHy8unTpoilTpqhXr16KioqSm5ub+vfvr7S0NIWHh0uSnnjiCQUGBuqrr77S/PnzNWfOHG3atKlIXJvNpg4dOhj53OrMmTOqWrWq8dne3r7I55vvWo8aNUqPP/644uLiNG7cOHl4eOjdd98tdU03i7llYbPZNGDAAE2dOrXY9pLyKk6NGjUKxX311Vc1dOjQUuevVq2aIiMjtXDhQh0/flzPPPNMmfL+5RrvJE9JysnJUUREhLZv366WLVvqp59+Uq1atXT9+nWjMH7rekqbv6xrlXhjHAAAAAAAAAAAAMCvtGHDBjVp0kRnzpxRenq60tPTlZCQoBUrVig3N7fEcXl5eTp58qRxdXqPHj20b98+SVLt2rX1+OOPq3v37ho2bJjs7e0lSSdOnND999+v/v37a/r06UpISJAkOTo6Gm9eS1JYWJji4uKUnJxsfHcz9p1ITU1V48aNFRUVpXHjxhnz3SokJESbN2/W2bNnJUnR0dFq3769kfOtfplneHi4Vq5caZxkLygoUGJi4h3n+UvdunVTdHS08dZ3bm6uDh06VGzfZ555RosWLdK2bdvUp0+fYvuEhobq448/1k8//SRJWrhwYaF34O9Udna2cnJy9NBDD0lSqSfhJaldu3Zavny5bDabrly5oo8//thou5O1cmIcAAAAAAAAAAAAwK+yZMmSIgXVFi1aqFGjRvr8889Vp06dYsfl5+dr0KBBysjIkIODg+rXr69ly5YZ7VFRUYqJiVFUVJTx3SeffKKVK1eqcuXKKigoUHR0tCSpe/fuWrFihSwWiyIiIjRhwgTFxsZq2LBhunr1qnJycuTl5VXsCfLSzJ8/X9u2bVPlypVlb2+vf/3rX0X6eHh4aMaMGerUqZMk6W9/+5vef//9YuP169dPkZGRWrdunZ555hkNGTJE06dPV/fu3ZWXl6ecnBx17dpVvr6+d5TnL/Xp00cXL15USEiIpBt/hDBo0CB5eXkV6fvggw/Ky8tLzZo1U/Xq1YuN17lzZx05ckQBAQGqVKmSzGbzbU/Ol8bR0VFTpkyRn5+f6tWrp169epXaf8KECRo8eLBatGihevXqydPT07jW/U7Wamez2Wy/OmsAAAAAAAAAAAAAuMtmzpyp48ePa8mSJeWdSoX2888/y9XVVTt27DDeM7/X5ObmKj8/X1WrVtXPP/+ssLAwPffcc+rZs+cdxeHEOAAAAAAAAAAAAIB7hru7u+zs7LR58+byTqVCi46O1ptvvqmRI0fes0VxScrMzFTnzp2Vn5+v7OxsPf7443rqqafuOA4nxgEAAAAAAAAAAAAAFVql8k4AAAAAAAAAAAAAAIDfE4VxAAAAAAAAAAAAALhFenq6oqOj72rMhIQEmUwmeXl5acuWLaX2/eKLL9S2bdvbxrRarVq9evVdyrDsJkyYoFWrVpXaZ8iQIdq+ffsflNHtURgHAAAAAAAAAAAAgFv8HoXx5cuXq3fv3jp06JDCwsLuSszfqzCel5dXavvkyZPVp0+fUvssXrxYISEhdzOt34TCOAAAAAAAAAAAAIBy0adPH/n6+spsNqtr1646d+6cpBuFaScnJ73++uvy9vZW06ZNtWvXLr344ouyWCzy8PDQkSNHjDgzZsyQu7u7TCaT+vTpo6ysLEnSpEmTNGrUKKPf/PnzFRkZKUmKiYlRaGionn76aZlMJvn6+urUqVOSpOHDhys1NVUWi0Xh4eEqKCjQs88+qxYtWsjT01M+Pj7Kzs4usp7z588rIiJCJpNJHh4eWrhwoSRp2rRp+uijjzR//nxZLBZdunSp0Ljc3FyNHDlSTZs2lZ+fX6GT1ufOnVNISIh8fHzk7u6uZ599VgUFBTp//rwmTJig7du3y2KxaPjw4aXuaWlu7veYMWPk7e2t+fPna+vWrQoICJCXl5fc3d21ZMkSo39kZKTmzJkjSfr8889lNpuN38v69eslSW3bttW6deuM/sOGDVP79u3VrFkzRUREKCcnR5J0+fJl9ezZU82bN1dQUJCGDRtm/I7uJgrjAAAAAAAAAAAAAMrFnDlzlJiYqOTkZAUFBWnSpElGW1ZWlnx8fHTw4EGNHTtWYWFhCg8Pl9Vq1YABA/TPf/5TkvTll19q6dKl2rVrlw4fPqy//OUvGjt2bJnm379/v6ZOnarDhw8rNDRUb7/9tiQpOjparq6uslqt2rBhg5KSkrR161YdPXpUSUlJ2rZtmypXrlwk3nPPPSdXV1cdPnxY27Zt05QpU5SQkKCxY8cqPDxcL7/8sqxWq5ycnAqNW7RokVJTU3X06FHt3LlTBw8eNNqcnJz0+eef68CBA0pOTlZ6ero+/vhjNWjQQJMnT1ZISIisVqtxwr20PS1NVlaW3N3ddfDgQY0aNUre3t7auXOnDh06pB07dmjy5Mn6/vvvi4wbP368Fi5cKKvVquTkZLVp06bY+FarVZ9//rmOHz+uH3/8UWvXrpV04/R5tWrVdPz4cW3atEm7d+8uU753isI4AAAAAAAAAAAAgHIRGxsrX19feXh4aPHixbJarUZb1apV1a1bN0mSr6+vatSoYVzN7efnpxMnTkiS4uLi1LNnT6PYPGLECH311Vdlmj8gIECNGzc2fj558mSx/Zo0aaK8vDwNGjRIy5cvV25uripVKlpqjYuL07BhwyRJDRo0UEREhOLi4m6bx9atW9W/f39VrlxZlStX1qBBg4y2goICjRkzRp6envLy8lJiYmKhffql0va0NPfdd5/69u1rfL548aKefPJJeXh4qF27drp48WKhU/o3tW/fXi+88IKmT5+u5OTkIkX/m7p3767q1avL3t5efn5+xl5v3bpVAwcOlJ2dnWrWrKmePXuWKd87RWEcAAAAAAAAAAAAwB9u586dmjt3rjZt2qQjR45o1qxZha4nr1KlivGzvb29qlatWuhzSe9g29nZGT87ODgoPz/f+PzL68/LGrNWrVo6cuSIevfurZSUFJnNZqWlpd12jbfmciduHTdr1iydP39ee/fuVXJysnr37l3sNe7S7fe0NNWrVy9U7B8+fLhat26tw4cPy2q1qlmzZsXGmjVrlpYtW6bq1atrwIABmj59erHxf83v726iMA4AAAAAAAAAAADgD5eZmamaNWuqbt26ysnJMd7jvlOhoaH6+OOP9dNPP0mSFi5cqI4dO0qSXFxclJiYqPz8fF29etW4vvt2HB0djXfKJenChQv6+eef1bFjR02dOlXOzs46duxYsbm8//77xphPP/1UHTp0KNMaVq5cqdzcXOXk5GjZsmVGW2Zmpv7617+qatWqOnfunNasWVNinrfb0/bt22vfvn1l2oPMzEw9/PDDsrOz09dff62kpKRi+6WkpBhvn48YMUIJCQllin9Tu3bttHz5ctlsNl25ckUff/zxHY0vKwrjAAAAAAAAAAAAAP5wnTp1kqurq1xdXRUUFCSLxfKr4nTu3FkDBw5UQECATCaTfvrpJ7311luSpIiICD3wwANq0aKFHn30UXl5eZUpptlslru7uzw8PBQeHq7//ve/6tChg8xmszw8POTh4aHOnTsXGTd37lwdP35cJpNJISEheu211+Tv73/b+aKiotS0aVO5ubmpdevWhfbihRde0N69e+Xu7q5+/fopNDTUaGvfvr2uX78us9ms4cOHl7qn+fn5SkpK0oMPPlimPZg2bZrGjh0ri8WipUuXlriOcePGyd3dXV5eXlqxYkWZ3zS/acKECbp8+bJatGihTp06ydPTs8Tr2H8LO5vNZrvrUQEAAAAAAAAAAAAA94z9+/dr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RHp6Ovr164eGDRvC29v7oy1H6mHHOBERERERERERERERERFRMXF2dsbbt2/x5s0bNGvWDKtXr4auru5HW47Uw45xIiIiIiIiIiIiIiIiIiL6ommUdAaIiIiIiIiIiIiIiIiIiIg+JnaMExERERERERERERERERHlYmZmBgsLC8jlcukvIiJCZVxTU1MkJCR8lHwEBAQgOjpamj506BC+/fbbj7KuL5lWSWeAiIiIiIiIiIiIiIiIiOhztGfPHsjl8hLNQ0BAAMqWLYv69esDADp37ozOnTuXaJ7+jfjGOBERERERERERERERERFRERw6dAiWlpaws7PDtGnTlMLMzMygUCikaUdHRwQHBwMAHj58iJ49e8LW1hZ2dnb4/vvvAQA7d+6Es7MzHBwcYG9vj8OHDwMANm7ciGvXruHbb7+FXC7HsWPHEBAQgK5du0rpL1myBNbW1rC1tUW/fv2QnJwMAPDx8YGnpyc6deoEKysrtG7dGs+ePft4hfKZY8c4EREREREREREREREREZEKnp6eSkOpv379Gk+ePMGQIUOwb98+hIeHw9zcHE+fPlUrvf79+6Nhw4aIiIhAeHg4xo8fDwBwd3fH5cuXERYWhoMHD2L48OF4+/Ythg0bBkdHR/j5+UGhUKB9+/ZK6R0/fhybN29GSEgIIiIioK+vj+nTp0vhV65cQUBAACIjI1GhQgX4+/sXX+H8y3AodSIiIiIiIiIiIiIiIiIiFVQNpX769GnY2dnBysoKADB06FB88803haaVmpqKixcv4uTJk9K88uXLAwDi4+PRr18/PHjwAFpaWnj27Bni4+Ol4dPzc+bMGXh6eqJs2bIAgNGjR+Prr7+Wwj08PGBiYgIAcHFxyfcb6f8FfGOciIiIiIiIiIiIiIiIiOg9yWQypWktLS1kZmZK02/evCk0jd69e2PYsGG4desWFAoFDAwM1FqusLzo6OhI/2tqaiIjI6PIaX4p2DFORERERERERERERERERKQmFxcXhIeHIzo6GgCwefNmpKWlSeHm5ua4cuUKAODq1auIiYkBABgYGKBFixZYtmyZFPeff/4BACQlJaFWrVoAgO3btyMpKUmKY2RkJH03PDc3Nzfs3bsXL168AAD4+/ujbdu2xbWpXxR2jBMRERERERERERERERERqZD7G+Nnz55F+fLlsXnzZnTr1g329vaIjY2VhisHgPnz52Pt2rWwt7fH5s2bYW1tLYUFBgbi2rVrsLa2hlwux5o1awAAK1euRM+ePeHg4ICwsDDUqFFDWmbEiBH44YcfIJfLcezYMaX8tWvXDkOGDIGLiwtsbW3x4sULLFy48COXyr+TTAghSjoTREREREREREREREREREREHwvfGCciIiIiIiIiIiIiIiIioi8aO8aJiIiIiIiIiIiIiIiIiOiLxo5xIiIiIiIiIiIiIiIiIvqsmJmZwcLCQun73hERESWSl2HDhuHs2bPFmuaKFSvw+PFjadrHxwcTJ04s1nUUhZmZGRQKRaFh71MWcrkcKSkpH5jDD6dV0hkgIiIiIiIiIiIiIiIiIsptz549kMvlJZ0NbNy4sdjTXLFiBVxdXVGpUqViT/tjep+yyK/D/VPjG+NERERERERERERERERE9K8hk8nwww8/oFGjRqhVqxa2bNkihf3xxx+Qy+WwtbWFl5cX7O3tERwcDABYvnw5nJycIJfL4eTkhEuXLqm1nKurKw4cOAAAGDx4MEaOHIk2bdqgXr166N69O9LS0gAAKSkp8PT0RP369dG8eXOMHDkSgwcPzpN/X19fPHr0CJ6enpDL5VLHcWJiIjp16gQrKyu0bt0az549k5ZZunQpGjVqhAYNGsDDwwP37t3Lt2xmzZoFBwcH1KtXDzt27FAKe/78uTRtamqKhIQEaXrHjh1o2LAhzM3NsWTJEpXp5yyL5ORkDBs2DDY2NrC3t4eXl1e+ecper5mZGWbPng0XFxfUqlUL8+fPV7nMx8COcSIiIiIiIiIiIiIiIiL67GR3HGf/vX79WgorXbo0rl69iuPHj2P8+PHIyMhAWloaPD094efnh4iICAwYMADh4eHSMgMGDEBoaCgUCgVWr16NIUOGAEChy+WmUChw+PBhREVF4e+//8a+ffsAvOvw1tXVRVRUFI4dO4Y//vhD5fKzZ89GlSpVsGfPHigUCumt+CtXriAgIACRkZGoUKEC/P39AQA7d+5ETEwMLl26hBs3bqBfv34YM2ZMvvmTyWQICwvDiRMn8M033yh1fhfk77//xrVr13D58mWsXr063/xnmzhxIkqVKoXw8HDcvHkTixcvVms9z58/x6VLlxAaGoolS5bg4cOHai33oTiUOhERERERERERERERERF9dgoaSr1fv34AgPr160NLSwuPHz/Gs2fPoKWlhVatWgEAWrVqhTp16kjLhIWFYcGCBXj69Cm0tLQQExOD169fIzY2tsDlcuvWrRv09PQAAI0aNUJcXBwAICgoCH5+fpDJZDA0NISnpyfu3r2r9vZ6eHjAxMQEAODi4iJ9U/3AgQMIDQ1Fw4YNAQCZmZkFpjNs2DAAQO3atdGiRQucP38eZmZmha5/6NChkMlkMDU1Rffu3XHmzBk0adIk3/hHjhzBlStXoKHx7l3s8uXLF7oOAOjbty+Ad2+s165dG/Hx8ahatapay34IdowTERERERERERERERER0b+Kjo6O9L+mpiYyMjJUxpPJZADevRXevXt3nD17Fk5OTnjx4gXKlCmDt2/fFrhccaxbXfmlK4TAjBkzMGLEiCKllzsfmpqaSp3qb968UWu54qZu+RU3DqVORERERERERERERERERP96FhYWSE9Px7lz5wAA586dk97YfvPmDdLS0lCjRg0AwOrVq9Varihat26NrVu3QgiB1NRU7N27N9+4RkZGSE5OVivdrl27Yv369dI3x9PT0xEWFpZv/OxvrickJODChQto3rw5AMDc3BxXrlwBAOzfvx8vX75UWi4gIAAA8OzZM/z2229o06ZNgfnq3Lkzli5diqysLADAP//8o9b2lBS+MU5EREREREREREREREREnx1PT0/o6upK035+ftJw56qULl0au3fvxtixY5GVlYWGDRvCwsICZcuWhZGREebPn49GjRrB1NQUvXv3Vmu5opg9ezaGDh0KS0tLmJqawt7ePt80xo8fj+HDh0NPT0/qkM5Pv3798PTpU2nbMzIy4OXlBQcHB5XxMzMz4eDggJcvX2LVqlXSMOp+fn4YP348Zs2ahQ4dOkjDtmcrX748GjZsiOTkZIwbN67AYdSz0/v2229ha2sLbW1tODk54eeffy5wmZIkE0KIks4EEREREREREREREREREdGHSklJgaGhIQAgNDQUnTt3RlxcnPRN8OJeLqf09HRkZmZCR0cHL1++hLu7O7755ht4enq+/wYVkUwmQ1JSUpE79f8L+MY4EREREREREREREREREX0R9u3bBz8/PwghoKWlhcDAQLU6t993uZySkpLQrl07ZGZm4s2bN+jSpQt69er1vptCxYxvjBMRERERERERERERERER0RdNo6QzQERERERERERERERERERE9DGx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t956C09PTz777LObipEXm83GokWLqFWrVqF933rrLSpVqsSePXtwcHAgPDyc9PT0m5qvINfn7ujoaPxtb29PVlZWvmOvbliNjY3NNe5aZcqUKVL8oq713fJ/4ih1EREREREREREREREREbm3paam4uTkRMWKFcnIyMj1nu+CBAQEkJiYyMGDBwGYOXMmGRkZefZNSkqievXq9OjRg7feess4wjwkJIQvv/wSgL/++ovvvvuOZ599FldXV0qXLs0333xjxPjf//53Q9xWrVoxduxYoyicmprK4cOHAShbtixpaWm5nvOxxx7DwcGBpKQk1q5dW+gz5peHk5MTderUMd4dfvjwYbZu3UrDhg1vKV6ZMmUIDg7mww8/NO6fPHmS33//vdAcr5ffWhcXFcZFREREREREREREREREpNg1a9YMV1dXXF1dCQoKwmKxFGlc5cqVmTlzJq1bt8bb25tDhw4ZR3tfb+rUqXh4eODj48Pw4cP5+OOPAZg8eTIHDhzAy8uL4OBg3n77berVq4eDgwNLlixh1qxZeHl54e3tzaJFi26IO3HiREqVKoXFYsFsNtOkSROSk5MB6NmzJ2PGjMFisbBy5UqGDx/OrFmzMJvNDBs2jMaNGxf6jAXlMXfuXBYsWIC3tzdt2rRh+vTpPPHEE/8o3uHDh/H09MTLy4vw8PB839lekPzWeunSpXTv3v2m4/1TJpte4CwiIiIiIiIiIiIiIiIiIvcx7RgXEREREREREREREREREZH7mgrjIiIiIiIiIiIiIiIiIiJyX1NhXERERERERERERERERERE7msqjIuIiIiIiIiIiIiIiIhIsbNYLFgsFtzd3bG3tzeuIyIi2LRpExaLpbhTvG8sXbqUQYMG/aMYJpOJs2fP3p6E7gKTzWazFXcSIiIiIiIiIiIiIiIiIiIAycnJWCyWXEXXTZs2MXDgQKxWa7Hlda/IysrCwcGhuNPAZDKRmppK+fLlizuVItGOcRERERERERERERERERG552VlZdG3b1+8vb3x8PAgPj7eaFuzZg0NGjTA19cXf39/Nm7cCMChQ4d4+umn8fb2xsvLi+HDhwOQmZnJsGHD8Pf3x2Kx0K5dO1JTU/Ocd8WKFdStWxdvb28sFgs7duww5qxTpw5ms5lnnnmG/fv3A1eK+J6envnmml+8uLg4GjdujJ+fHz4+PixcuBC48kOB8uXLM3ToUOrUqcPUqVNp1KgRgwcPJigoiKeeeorevXsb8adPn467uzsWiwUvLy8j/rViYmJo1arVP8r3Ws7Ozrl+tODn58emTZvy/iCLSfH/lEBEREREREREREREREREpBAHDx5kxowZfPbZZ0RHR/P222+zZs0afv31V6KiolizZg1ly5bl8OHDBAUFkZyczNSpU3n++ed58803AUhJSQFg3LhxPPjgg+zcuROA9957j+HDh/Ppp5/mmvOXX36hS5cubN68mdq1a5OZmcnFixc5ffo07du3Z9OmTXh5eTF37lzatGnDzz//XGCu+cU7e/YsPXv2ZOXKlVStWpX//e9/1KlTh8DAQADS0tLw8PBg7NixACxevJgjR46wceNGMjMzcXd3Z/v27QQEBPD6669z8OBBqlatSmZmJpcvX77ltc0v338j7RgXERERERERERERERERkXuei4sL9erVAyAgIIAjR44AsHr1ag4fPkzDhg2xWCy0adMGOzs7jh8/TsOGDfnyyy95++23+eGHH4xjvxcvXszXX39tvMf8m2++4ejRozfMuXbtWpo1a0bt2rUBeOCBByhXrhw7duzAy8sLLy8vACIjIzl58iQnTpwoMNf84v3000/8+uuvNG/eHIvFQkhICABJSUlGv1deeSVXbhERETg4OFCqVCksFosxR5MmTejQoQOffPIJR48epUyZMre8tvnl+2+kHeMiIiIiIiIiIiIiIiIics9zdHQ0/ra3tycrKwsAm83Gs88+y7x5824YU7NmTQIDA1m7di1Tp05l0qRJrFy5EpvNxpQpU2jatOldzTU/NpsNDw8PfvrppxvakpOTKV26NHZ2ufc85zfHokWL2LVrF5s2baJFixaMHj2al1566bbmez0HBweys7ON6/T09Jsafzdox7iIiIiIiIiIiIiIiIiI/GuFhoaybt06EhMTjXtXj0g/dOgQDz/8MB07duSjjz4iNjYWgFatWjFx4kTjWPCLFy8ax6BfH3vNmjUcPHgQuPJu8rS0NOrXr8/evXvZt28fAPPnz6datWpUq1at0FzzihcYGMjRo0dZt26d0ddqtZKRkXFTa5GVlcWRI0fw8/Nj8ODBtGnTxliLW5FfvtdzcXEx3j2+c+dOY6f7vUSFcRERERERkfuQzWajZ8+eVKhQAZPJhNVqLfJYZ2dnJk2a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jAyysrKYPn06TZs2zTNGSEgICxcu5Ny5c9hsNr744gujLTQ0lHXr1pGYmGjcyy+Xm8n7XqF3jIuIiIiIiIiIiIiIiIjIPe/333/n9ddfp0aNGgQHBwNQsmRJduzYAcCIESN49NFH6d27d65xaWlptGnThgsXLmAymahZsyadOnW6If6HH35I3759ee+997BYLNSrV89omzhxIoMGDcLLy4sHHniAunXr8uWXX94Qw9PTk3HjxtGsWTMAHn/8caPf1KlT2bBhAyVKlMDe3p6PP/6Y7OxsunbtSkpKCg4ODlSuXJlZs2bl+fyBgYEMHTqUw4cPU7FiRb766ivgyrHqR44coU6dOgA0atSIgQMH5hmjRYsW7Ny5kzp16lC2bFmaN29utLm4uDBv3jx69erFxYsXycjIwMfHh3nz5t0Qp6C88/scipvJZrPZijsJERERERERERERERERERGRO0VHqYuIiIiIiIiIiIiIiIiIyH1NhXEREREREREREREREREREbmvqTAuIiIiIiIiIiIiIiIiIiL3NRXGRURERERERERERERERKRYOTs74+rqisViwd3dnU8//bTQMTExMbRq1arQtvj4eCIiIm4qn5iYGMqVK4fFYjH+vfrqqzcV436xadMmVq9efcfnGTx4MFFRUXcsvsMdiywiIiIiIiIiIiIiIiIiUkQLFizAYrFw7NgxzGYzQUFBmM3mfxzXz8+PBQsW3PS44OBgFi9e/I/n/7fbtGkTZ8+epVmzZsWdyj+iHeMiIiIiIiIiIiIiIiIics948skncXV15ZdffiEqKoqBAwcabVOnTqVz587G9d9//01YWBju7u40bNiQ5OTkG+Jt2rQJi8ViXK9YsYK6devi7e2NxWJhx44dN5VfVFQUERERtGzZEnd3dxo3bkxKSgoAmZmZ9O3bl1q1alG/fn1ef/11GjVqBMCpU6cIDg7G19cXDw8P+vXrR05OTqHjAObMmUO9evWoU6cODRs2JCEhAbiysz0kJISXX34Zd3d3AgMD2b9/P61bt8bNzY2mTZty/vx5Y45hw4bh7++PxWKhXbt2pKamAtC5c2d69epFkyZNqFWrFuHh4WRkZGC1WomOjmbu3LlYLBZGjRp1w3rMmzePevXq4ePjg7e3N8uWLTPaGjVqxODBgwkKCuKpp56id+/eRtsff/xBaGgo7u7uhISE8Pvvv9/U53CzVBgXERERERERERERERERkXvG3r17OXjwIN7e3oX23bZtG2PHjmX//v08//zz9OzZs8D+v/zyC126dGHOnDkkJCQQFxdH7dq18+y7cePGXEepT5w40WjbsWMHMTEx7N+/nypVqjBt2jQAvvjiCw4dOsTPP//Mli1bSExMNMaUL1+eZcuWsWvXLhITE0lOTubbb78tdNy2bdv45ptv2Lx5M7t37+b999+nffv2RntcXJyxBk899RQtW7YkOjqaAwcOUKJECWbPng3AuHHjePDBB9m5cydWqxUvLy+GDx9uxLFarSxbtowDBw7w559/smjRIiwWC7179yYyMhKr1cqIESNuWKfQ0FBiY2PZs2cPS5YsoUePHly+fNloP3LkCBs3bmTfvn2sWbOG7du3AzBgwAD8/f3Zv38/s2fPZv369QV+dv+UjlIXERERERERERERERERkWIXERFBqVKlKF26NDNnzqRmzZqFjgkMDMTNzQ2Anj17Mnz4cLKzs/Ptv3btWpo1a2YUwx944AHKlSuXZ9+CjlJv1qwZFStWBCAgIIC9e/cCsH79el555RUeeOABADp16sT06dMByMnJYejQoWzduhWbzcbp06fx9PTkpZdeKnDckiVLSEhIoF69esb8KSkpXLp0yZj/iSeeAK4cG5+ZmcnDDz8MQN26dTl06BAAixcvJi0tjUWLFgGQkZGBs7OzEbN169aULl0aAH9/f44cOZLvOl7r6NGjREZG8vvvv+Pg4EBKSgpHjx411jgiIgIHBwccHBywWCwcOXKEgIAA1q9fz/jx4wGoVq0aYWFhRZrvVqkwLiIiIiIiIiIiIiIiIiLF7uo7xq/l4OCQq9Cdnp5+l7PKm6Ojo/G3vb09WVlZefYzmUzG3xMmTOD06dPs2LEDR0dH/vOf/+T7PNeOs9lsdOrUiTFjxhQpl/xys9lsTJkyhaZNm/6jZ7reSy+9xIcffkibNm0AqFChQq7nupW1uhN0lLqIiIiIiIiIiIiIiIiI3JNcXFyIj48nOzubixcvGrudr9q+fTsHDx4EYPr06QQHB2Nvb59vvNDQUNasWWOMyczMJC0t7bbl27hxY+bNm0dmZiaZmZl89dVXRltqaiqPPPIIjo6OnDp1ioULFxZpXFhYGF9//TXHjx8Hruw8j4+Pv+ncWrVqxcSJE7l48SIAFy9e5Oeffy50XNmyZQtco9TUVKpXrw7A119/bby3vDAhISHMnDkTuPK+8aVLlxZp3K3SjnERERERERERERERERERuSeFh4ezcOFC3NzceOyxx/Dx8TEKu3DlKPWhQ4dy+PBhKlasmKugnBcXFxdmzZrFK6+8QmZmJvb29kRHR+Pv739D36vvGL/K1dWVBQsWFBi/V69e7N27F3d3dx566CH8/Pw4efIkAK+99hpt2rTBw8ODRx99lJCQkCKNCwoK4qOPPqJ169ZkZWWRkZHBc889h5+fX6Hrd62hQ4dy+fJl6tWrZ+zOHjp0KB4eHgWOa926NXPmzMFisRAeHn7De8Y/+eQT2rRpQ/ny5WncuLFxrHthPvnkEzp37oy7uzvVqlWjcePGN/U8N8tks9lsd3QGEREREREREREREREREZH/I86dO4eTkxOZmZlERkbi6+vL0KFD79g4KRoVxkVEREREREREREREREREbpN69epx+fJl0tPTadCgAVOmTKFUqVJ3bJwUjQrjIiIiIiIiIiIiIiIiIiJyX7Mr7gRERERERERERERERERERO41zs7OuLq6YrFYjH979+7Ns2+lSpVITk6+I3nExMRw8OBB43rp0qUMGjTojsx1P3Mo7gRERERERERERERERERERO5FCxYswGKxFGsOMTExlC9fntq1awMQFhZGWFhYseb0b6Qd4yIiIiIiIiIiIiIiIiIiN2Hp0qW4ublhNpt54403crU5OztjtVqNaz8/PzZt2gTAiRMnaNOmDV5eXpjNZt555x0A5s2bR7169fDx8cHb25tly5YBMH36dOLj4xk0aBAWi4WVK1cSExNDq1atjPjjxo3Dw8MDLy8vIiMjSUtLAyAqKoqIiAhatmyJu7s7jRs3JiUl5c4tyj1OhXERERERERERERERERERkTxERETkOkr90qVLnD59mi5durBo0SISExNxcXHhzJkzRYr3yiuv4Ovry969e0lMTGTAgAEAhIaGEhsby549e1iyZAk9evTg8uXLdO/eHT8/PyZOnIjVaqVFixa54q1atYqZM2eybds29u7dy4MPPsiwYcOM9h07dhATE8P+/fupUqUK06ZNu32L8y+jo9RFRERERERERERERERERPKQ11Hqa9euxWw24+7uDkC3bt3o379/obHOnz/P1q1bWbNmjXGvcuXKABw9epTIyEh+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w8Px8vLCbDaTmZlJp06deOihh/j+++8ZNmwYZrOZOnXqsG3bNgBGjx7Np59+ire3NzNnzsTDw6PAWHv37uXpp5/G29sbHx8fOnTogNlszpWHp6cn48aNo1mzZpjNZrZs2cKXX35Z6HP+97//xcvLCx8fHyIiIoz3hl+rWbNmuLq6GkfDWyyWXO1Xd197e3vTpUsX5s2bh5OTU4E51a9fnxYtWuDp6UmjRo2oWbOmEc9sNuPh4YGnpydhYWG55jp58iTr16+nbdu2ue5HRkby9ddf5/njhbz89ttvPPvss5jNZjw9PfH09KR58+Y39Js4cSKXL1/Gy8sLi8XCW2+9BUB8fDwtWrQw+o0YMSLX2lksFuMHAbfKZLPZbP8ogoiIiIiIiIiIiIiIiIiIyD1MO8ZFREREREREREREREREROS+psK4iIiIiIiIiIiIiIiIiIjc11QYFxERERERERERERERERGR+5oK4yIiIiIiIiIiIiIiIiIicl9TYVxERERERERERERERERERO5rKoyLiIiIiIiIiIiIiIiIiMh9TYVxERERERERERERERERERG5r6kwLiIiIiIiIiIiIiIiIiIi9zUVxkVERERERERERERERERE5L6mwriIiIiIiIiIiIiIiIiIiNzXVBgXEREREREREREREREREZH7mgrjIiIiIiIiIiIiIiIiIiJyX1NhXERERERERERERERERERE7msqjIuIiIiIiIiIiIiIiIiIyH3NobgTEBERERERERERERERERH5v6Bp06acOnUKOzs7nJycmDx5Mj4+PsWd1v8JJpvNZivuJERERERERERERERERERE7ndnz56lfPnyAHz//fdERUWRkJBQvEn9H6Gj1EVERERERERERERERERE7oKrRXGAtLQ0TCZT8SXzf4yOUhcRERERERERERERERERuUs6duzIxo0bAVi5cmUxZ/N/h45SFxERERERERERERERERG5y2bPns2CBQtUHL9LVBgXERERERERERERERERESkGpUqV4vfff6dixYrFncp9T+8YFxERERERERERERERERG5w86ePcvJkyeN68WLF1OxYkUqVKhQjFn936F3jIuIiIiIiIiIiIiIiIiI3GFpaWm0bduWS5cuYWdnR+XKlVm+fDkmkwmA7t27ExYWRlhYWDFnen/SUeoiIiIiIiIiIiIi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md69exv3e/ToQVZWFm3atClyrDvNZLPZbMWdhIiIiIiIiIiIiIiIiIjIve75558nIiKCDh06FHcq97R+/frx8MMP88477xR3KgbtGBcRERERERERERERERERKUB8fDwuLi7Y2dnRvn374k7nnnXy5Elq167N7t27GThwYHGnk4t2jIuIiIiIiIiIiIiIiIiIyH1NO8ZFREREREREREREREREROS+psK4iIiIiIiIiIiIiIiIiPwj586do0yZMnTr1i3X/U2bNmGxWO7o3Js2bWL16tV3dI5b1a1bN9zd3WndujWLFy8mNja2WPOJiooqtiPOnZ2dsVqtxTI3qDAuIiIiIiIiIiIiIiIiIv/QggUL8PX15bvvvuP8+fN3de57tTD+559/Mn/+fPbu3cv3339/VwrjWVlZdzT+3XY7n0eFcRERERERERERERERERH5R2bMmMHQoUNp2LAhCxYsKNKY6dOn4+7ujsViwcvLix07dvDf//6Xpk2bGn2ys7N58skn2b9/P4cOHeLpp5/G29sbLy8vhg8fjtVqJTo6mrlz52KxWBg1ahQAa9asoUGDBvj6+uLv78/GjRuBK0V0T09P+vTpg9lsxsvLi8TERDp37oyXlxf16tXjxIkTAMTGxuLr64vFYsHT05PPP/88z+eYM2cOZrMZs9nMc889x4kTJzh79izBwcGkp6fj6+vLmDFjWLp0KePGjcNisTB9+nRjbL169ahTpw4NGzYkISEBgJiYGEJCQnj55Zfx8vLCz8+PX3/9Nc/5GzVqxIABAwgICDDWbvz48fj7+1OnTh2aNWvGsWPHbhjn5eXFTz/9ZFx/8cUXRERE5DnHuHHj8PDwwMvLi8jISNLS0oArO9AjIiJo2bIl7u7uNG7cmJSUlHw+8f9nwoQJ1K1bF4vFQt26ddm+fbvR5uzszNChQ/H396dTp06cO3eOiIgIateuTVBQEL169aJz585G/6I8K4BDoVmJiIiIiIiIiIiIiIiIiORj//79/Pbbb4SGhpKVlcWHH354w5HqeXn99dc5ePAgVatWJTMzk8uXL+Pn58fgwYNJSkrC1dWVpUuX4uLigru7O6+99hrPP/88b775JgApKSlUqFCB3r17c/bsWSZNmgTAr7/+SlRUFGvWrKFs2bIcPnyYoKAgkpOTATh48CCzZ8/m888/55133qFx48Zs3bqV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v349HTt2pESJEpQoUYKuXbsabTk5OQwdOhRvb298fHyIj4/PtU7XK2hNC/LAAw/wyiuvGNdnzpyhbdu2eHp60rhxY86cOZNrl/5VTZo04bXXXuOjjz4iMTHxhqL/Va1bt6Z06dLY29vj7+9vrPX69evp0qULJpMJJycnIiIiipTvzVJhXERERERERERERERERETuuq1btzJ58mRWrlzJvn37mDBhQq7jyUuWLGn8bW9vj6OjY67r/N6DbTKZjL8dHBzIzs42rq8//ryoMcuVK8e+ffto3749Bw8exGw2c/jw4UKf8dpcbsa14yZMmMDp06fZsWMHiYmJtG/fPs9j3KHwNS1I6dKlcxX7e/fuTYMGDdi7dy9Wq5VatWrlGWvChAnMmjWL0qVL06lTJz766KM849/K53c7qTAuIiIiIiIiIiIiIiIiInddamoqTk5OVKxYkYyMDON93DcrJCSEb7/9lr///huAadOm0bRpUwBcXFyIj48nOzubixcvGsd3F6Zs2bLGe8oB/vrrLy5cuEDTpk0ZM2YMzs7O7N+/P89cvvzyS2PMd999x7PPPlukZ/j666/JzMwkIyODWbNmGW2pqak88sgjODo6curUKRYuXJhvnoWtaZMmTdi5c2eR1iA1NZUnn3wSk8nE5s2bSUhIyLPfwYMHjXef9+nTh9jY2CLFv6px48bMnj0bm83G+fPn+fbbb29qfFGpMC4iIiIiIiIiIiIiIiIid12zZs1wdXXF1dWVoKAgLBbLLcVp3rw5Xbp0ISAgAC8vL/7++28++OADAMLDw3n00Udxc3Pj+eefx8fHp0gxzWYzHh4eeHp6EhYWxm+//cazzz6L2WzG09MTT09PmjdvfsO4yZMnc+DAAby8vAgODubtt9+mXr16hc7Xo0cPatasibu7Ow0aNMi1Fq+99ho7duzAw8ODDh06EBISYrQ1adKEy5cvYzab6d27d4Frmp2dTUJCAo899liR1uDDDz9k2LBhWCwWZs6cme9zvPXWW3h4eODj48OcOXOK/E7zq0aMGMG5c+dwc3OjWbNmeHt753sc+z9hstlsttseVURERERERERERERERERE7hlxcXFMmzaN6dOnF3cquWRmZpKdnY2joyMXLlwgNDSU/v373/Z3jaswLiIiIiIiIiIiIiIiIiIixeL06dM0b96c7Oxs0tPTeeGFF/jwww9v+7vGVRgXEREREREREREREREREZH7mt4xLiIiIiIiIiIiIiIiIiJSDGJiYmjVqtVtjblp0yZWr1592+JZLBbOnTt32+IVFxXGRURERERERERERERERETykJWVVdwp3LTbVRi/+uxWqxUnJ6d/HK+4qTAuIiIiIiIiIiIiIiIiIveE7du306BBA7y9vTGbzSxZsgSA+Ph4AgMDMZvN+Pv7s23bNgCSk5MpX748I0eOxNfXFxcXF1auXFlovEOHDvHcc89Rt25dzGYzU6dONcaYTCZGjhxJ3bp1efPNN+ncuTO9evWiSZMm1KpVi/DwcDIyMgBYtmwZZrMZi8WCp6enEf9ap06dIjg4GF9fXzw8POjXrx85OTlG+99//01YWBju7u40bNiQ5ORkALKzsxkyZAienp54enrSv39/Y97OnTszadIkI8bgwYOJiorCarUSHR3N3LlzsVgsjBo16oZ8OnfuTNeuXQkMDKRWrVp06tSJS5cu5Wpr2LAhnp6exnqcPXuWuXPn8vzzzxtxbDYbNWrUICEhodBnvBeoMC4iIiIiIiIiIiIiIiIixS4lJYVWrVrxwQcfkJCQgNVqJSgoiIyMDMLDwxk5ciSJiYlMmDCBF198kfPnzwOQlpaG2Wxm165dTJ06lUGDBhUYLzs7m5dffpmPP/6YuLg4YmNj+eKLL4iLizNysbe3Jy4ujnHjxgFXdk0vW7aMAwcO8Oeff7Jo0SIAhg8fzrRp07BarSQmJvLMM8/c8Fzly5dn2bJl7Nq1i8TERJKTk/n222+N9m3btjF27Fj279/P888/T8+ePQGMnHbt2oXVauXIkSNMnDixwDW0WCz07t2byMhIrFYrI0aMyLPfjh07WLNmDQcOHCAlJSVX3F27drFixQoOHjyYa0x4eDixsbGcOnUKuLIz/aGHHsLb27vQZ7wXqDAuIiIiIiIiIiIiIiIiIsVu+/btuLq6EhQUBICdnR0VKlQgKSkJOzs7QkNDAWjQoAEPP/wwVqsVAEdHR8LDwwEICAjgyJEjhcb7+eefeemll7BYLAQGBnLu3Dn2799v5NK1a9dcubVu3ZrSpUtjb2+Pv7+/MUeTJk147bXX+Oijj0hMTKR8+fI3PFdOTg5Dhw7F29sbHx8f4uPjjdwBAgMDcXNzA6Bnz55s2rSJ7Oxs1q1bR+fOnSlZsiQODg706NGDtWvX/sNVvqJdu3Y4OTlhb29Pt27dWLdundHWtm3bPI9OL1WqFC+++CJz5swBrrwfvUuXLkV6xnuBQ3EnICIiIiIiIiIiIiIiIiJyM0wmk/F3yZIljWt7e3uys7MLHGuz2ahQoUKBhdsyZcrkunZ0dDT+tre3N96/PWHCBH7++Wc2btxIp06diIyM5I033sg1dsKECZw+fZodO3bg6OjIf/7zH9LT04v0nNe69pkdHBxyPWd6evoNOd9q7ILidO3alS5dutCnTx+WL19u7DS/Xc94J2nHuIiIiIiIiIiIiIiIiIgUu8DAQA4dOsSWLVuAK7uQU1JScHV1JScnx9gt/dNPP3Hq1CksFsstxytbtiyzZs0y+h4+fJiUlJSbzvngwYPGO7X79OlDbGzsDX1SU1N55JFHcHR05NSpUyxcuDBX+/bt241jy6dPn05wcDD29vaEhITw1VdfkZGRQVZWFtOnT6dp06YAuLi4sHPnTgDOnDmT673qZcuWJS0trcC8//vf/3L+/Hmys7OZNWsWISEhRXreevXqAVfeaR4SEkKFChWK9Iz3AhXGRURERERERERERERERKTYPfTQQ3z//fcMGzYMs9lMnTp12LZtGyVKlOC7775j5MiRmM1mBg4cyH//+99Cd0jnF8/BwYHly5fz3XffYTab8fDwoFu3bly6dOmmc37rrbfw8PDAx8eHOXPmEBUVdUOf1157jR07duDh4UGHDh1uKEIHBgYydOhQPDw8WLp0KdOmTQOuHKtep04d6tSpg8ViwdnZmYEDBxptf/31F25ubnTs2JH69esb8Vq3bo3VasVisTBq1Kg8865bty6hoaG4ublRvnx5I25RdOnShWnTphnHqBf2jCdPnsz1I4bo6Ohc7z5v0aIF8fHxRZ7/VplsNpvtjs8iIiIiIiIiIiIiIiIiIiLFrnPnzlgslpsqht8PtGNcRERERERERERERERERETua9oxLiIiIiIiIiIiIiIiIiIi9zXtGBcRERERERERERERERERkfuaCuMiIiIiIiIiIiIiIiIiInJfU2FcRERERERERERERERERETuayqMi4iIiIiIiIiIiIiIiIjIfU2FcRERERERERERERERERERua+pMC4iIiIiIiIiIiIiIiIiIvc1FcZFREREREREREREREREROS+psK4iIiIiIiIiIiIiIiIiIjc11QYFxERERERERERERERERGR+5oK4yIiIiIiIiIiIiIiIiIicl9TYVxERERERERERERERERERO5rKoyLiIiIiIiIiIiIiIiIiMh9TYVxEREREREREREREREREZHbaNasWZhMJhYvXlzcqcj/T4VxEREREREREREREREREZHbJDk5mS+//JL69esXdypyDRXGRURERERERERERERERERug5ycHLp3786UKVMoWbJkkccdPnyYkJAQzGYzFosl105zk8nEmDFj8Pf3p3r16syaNesOZH7/U2FcREREREREREREREREROQ2mDBhAk8//TS+vr43NS4yMpK2bduSmJjIwoUL6datG8eOHTPaS5Ysyc6dO1m1ahUDBgwgKyvrdqd+33Mo7gRERERERERERERERERERP7t9u3bx6JFi9i8efNNjTt37hy7d+9m27ZtANSsWZMGDRqwZcsWnnzySeBK4Rygdu3aODg4cOrUKR577LHb+wD3ORXGRURERERERERERERERET+oS1btpCcnEzNmjUBOHXqFD179uSPP/6gT58+NxXLZDLlunZ0dDT+tre3147xW6Cj1EVERERERERERERERERE/qE+ffrwxx9/kJycTHJyMvXr1+eLL74otCju5OREnTp1jHeHHz58mK1bt9KwYcO7kfb/GSqMi4iIiIiIiIiIiIiIiIjcYSNGjCA6OjrPtrlz57JgwQK8vb1p06YN06dP54knnrjLGd7fTDabzVbcSYiIiIiIiIiIiIiIiIiIiNwp2jEuIiIiIiIiIiIiIiIiIiL3NRXGRURERERERERERERERETkvqbCuIiIiIiIiIiIiIiIiIiI3NdUGBcRERERERERERERERGRu+bcuXOUKVOGbt265bq/adMmLBZLnmNGjBjB3Llz73huBeVwJ1gsFs6dO3fX5rvWvn37cHZ2vmPxo6KiSE9PN67v1meYHxXGRUREREREREREREREROSuWbBgAb6+vnz33XecP3++SGNGjRpFZGTkHc7s7rNarTg5ORV3GnfEu+++m6swXtyfoQrjIiIiIiIiIiIiIiIiInLXzJgxg6FDh9KwYUMWLFhQpDGdO3dm0qRJACxbtgyz2YzFYsHT05MlS5bkOWbOnDnUq1ePOnXq0LBhQxISEgCIiYkhJCSEl19+GS8vL/z8/Pj111+NcVlZWfTt2xdvb288PDyIj4837oeGhuLn54eHhwft27fnwoULwJWd5p6ennmOA1ixYgV169bF29sbi8XCjh07ADCZTJw9exYAZ2dnRowYQUBAANWrV2f06NHG+IMHDxIQEICHhwfh4eE0bdqUmJiYPJ97zZo1NGjQAF9fX/z9/dm4caPRFhUVRc2aNfH19WX+/PnG/eTkZMqXL29cnz9/HpPJZFxv376dBg0a4O3tjdlsNtZ88ODB1K1bF4vFQsOGDUlKSgKgd+/eAAQFBWGxWDh9+nSuz/D8+fN07doVT09PPD09effdd425GjVqxODBgwkKCuKpp54yYv1TKoyLiIiIiIiIiIiIiIiIyF2xf/9+fvvtN0JDQ+nWrRszZsy46RjDhw9n2rRpWK1WEhMTeeaZZ27os23bNr755hs2b97M7t27ef/992nfvr3RHhcXx5gxY9i7dy8hISGMHTvWaDt48CCdOnUiISGB/v378/bbbwNgb2/PvHnziI+PZ9++fZQrV44pU6YUOu6XX36hS5cuzJkzh4SEBOLi4qhdu3aez3b27Fm2b99OXFwc48aN48SJEwB06NCBnj178vPPP/P++++zefPmPMf/+uuvREVFsXLlSnbt2sW8efNo3749ly9fZsWKFSxcuJBdu3YRHx9PcnJykdY7JSWFVq1a8cEHH5CQkIDVaiUoKAiAoUOHEhcXh9VqpW/fvrz22msAREdHA7BlyxasVitVqlTJFfO9997j8uXLJCYmsmPHDhYvXpzrRxJHjhxh48aN7Nu3jzVr1rB9+/Yi5VoQFcZFRERERERERERERERE5K6YMWMGHTt2xN7enhYtWnD06FEOHDhwUzGaNGnCa6+9xkcffURiYmKunc5XLVmyhISEBOrVq4fFYqF///6kpKRw6dIlAGNX9tW/jxw5Yox1cXGhXr16N7TZbDYmTpyIj48PZrOZFStWYLVaCx23du1amjVrZhTDH3jgAcqVK5fns10t3leqVIkaNWpw9OhR/v77b6xWKx07dgTAzc2NBg0a5Dl+9erVHD58mIYNG2KxWGjTpg12dnYcP36c9evX065dO8qWLYvJZKJXr16FLzZXdou7uroaxXA7OzsqVKhgPFtAQACenp6MGjUq13oUZN26dfTo0QM7OzsefPBBOnbsyNq1a432iIgIHBwcKFWqFBaLJdfnc6sc/nEEEREREREREREREREREZFCZGZmMmfOHB544AHmzZsHwMWLF5kxYwbjx48vcpwJEybw888/s3HjRjp16kRkZCRvvPFGrj42m41OnToxZsyYPGM4Ojoaf9vb25OVlVVo27x589iwYQM//vgjZcuWZfLkyWzYsKFIMYuqqDGuPeb8WjabjWeffdZY34JcG8PBwYHs7Gzj+tp3g+fn+PHj9OvXj7i4OJ566ikSExNp2LBhoeMKywVuz1peTzvGRUREREREREREREREROSOW7p0KTVq1ODEiRMkJyeTnJxMbGwsc+bMITMzs8hxDh48iIeHB/369aNPnz7Exsbe0CcsLIyvv/6a48ePA5CTk5Prnd+3IjU1lUqVKlG2bFnOnTuX7zu+rxcaGsqaNWs4ePAgcOUHAmlpaUWet2zZsnh7e/P1118DkJSUxNatW/Oda926dSQmJhr3du7cCUBISAgLFy7k3Llz2Gw2vvjiC6PPI488gs1mY//+/QB89dVXRltgYCCHDh1iy5YtwJW1TElJIS0tjQceeICqVatis9mYOnVqrlycnJzyfc6QkBBmzJiBzWbjwoULzJkzh6ZNmxZ5TW6FdoyLiIiIiIiIiIiIiIiIyB03Y8YMIiMjc91zc3OjWrVqLFu2zDieuzBvvfUWSUlJlChRgtKlS/P555/f0CcoKIiPPvqI1q1bk5WVRUZGBs899xx+fn63nH/Hjh1ZsmQJrq6uVK5cmaCgII4dO1boOBcXF2bNmsUrr7xCZmYm9vb2REdH4+/vX+S5v/rqK7p27cq4ceNwcXGhbt26eR4h7+Liwrx58+jVqxcXL14kIyMDHx8f5s2bR4sWLdi5cyd16tShbNmyNG/e3Bjn4ODAlClTeP7556lYsSJt2rQx2h566CG+//57Xn/9dc6dO4ednR3vvfceLVu25KWXXsLDw4OKFSvSqlWrXLm8/vrrPPvss5QuXZoffvghV9s777zDgAED8PLyAqBt27a0a9euyOtxK0w2m812R2cQEREREREREREREREREZFbdv78eR588EFMJhNHjx4lICCAuLg4Hn/88eJO7V9DO8ZFRERERERERERERERERO5hP/30E0OGDAEgOzubiRMnqih+k7RjXERERERERERERERERERE7mt2xZ2AiIiIiIiIiIiIiIiIiIjInaTCuIiIiIiIiIiIiIiIiIjckqioKNLT043rzp07M2nSpGLLJzk5mfLlyxfb/HdaVFQUAwcOBGDp0qUMGjTotsWeOnUqnTt3zrPN2dkZq9V62+YqTHR0NOPGjbutMfWOcRERERERERERERERERG5Je+++y4DBw7E0dHxpsbl5OQAYGf3797Hm5WVhYND8ZRcw8LCCAsLK5a5/6nC1q137963fc5/9zdNRERERERERERERERERIrF1eJlUFAQFouF06dPA3DgwAGaNGlCrVq1CA8PJyMjA7iy2/nFF18kNDQUT09P/vjjD+bMmYPZbMZsNvPcc89x4sQJAGJiYmjVqpUx1/Lly2nUqJFxPXLkSFxcXKhbty7Dhw/H2dk5V24jR47E19cXFxcXVq5cmWf+V/Np3LgxtWvXpmXLlpw5cwaAzMxMhg0bhr+/PxaLhXbt2pGamgpc2RXftWtXGjZsiKenJ5cuXSIiIgJ3d3e8vb1p2rSpMce4cePw8PDAy8uLyMhI0tLSjLkjIiJo2bIl7u7uNG7cmJSUFAD27t1LgwYNqFOnDu7u7owePTrP/K9do1GjRmGxWLBYLHh6emIymTh27BgA48ePx9/fnzp16tCsWTPj/rlz54iIiMDV1ZUGDRqwd+/efD7p3E6dOkW7du3w9/fHy8uL4cOHG22DBw+mbt26WCwWGjZsSFJSktFmMpkYOXIkdevW5c0336Rz58706tUr3+/K1Z3xMTExhISE8PLLL+Pl5YWfnx+//vqrEbew78JVKoyLiIiIiIiIiIiIiIiIyE2Ljo4GYMuWLVitVqpUqQKA1Wpl2bJlHDhwgD///JNFixYZY7Zv385XX33F/v37SU1NZciQIaxatYrExEQCAwPp3r17ofOuWLGCRYsWsWfPHnbu3GkU069KS0vDbDaza9cupk6dWuBx41u2bGHevHkcPHiQxx9/nDfffBO4UtB+8MEH2blzJ1ar9YYC8K5du1ixYgUHDx5k9erVnD17lv3795OQkMD8+fMBWLVqFTNnzmTbtm3s3buXBx98kGHDhhkxduzYQUxMDPv376dKlSpMmzYNuHJs+fr169m9eze7du1i0aJFxMbGFrgmI0aMwGq1YrVaCQwMpGvXrjz55JPMmzePpKQktm/fzu7du4mMjKRv377AlWJ6yZIlOXjwICtWrGDz5s2Frj1Ap06dePXVV9m5cyd79uwhPj6ehQsXAjB06FDi4uKwWq307duX1157LddYe3t74uLijGPSC/quXCsuLo4xY8awd+9eQkJCGDt2LFD4d+FaOkpdRERERERERERERERERG6b1q1bU7p0aQD8/f05cuSI0daiRQsefvhhADZu3EizZs2oVq0aAH379mXUqFFkZ2cXGH/9+vW0bdsWJycnALp168bGjRuNdkdHR8LDwwEICAjINf/1nnvuOR555BEAevbsaYxbvHgxaWlpRqE2IyMj107ka+f39vbmwIED9O3bl2eeeYYWLVoAsG7dOiIiIox3nvfp04e2bdsaMZo1a0bFihWNPK/u2L506RJ9+/bFarViZ2fHb7/9htVqpX79+gWuC8Do0aM5fvw4y5cvN54jLi4OX19fgFxru379eiZOnIjJZKJcuXK0b9++wLUCuHDhAuvXr+fPP/807p0/f97YGb527VqmTJnCuXPnyMnJMXbBX9W1a9dc1wV9V64VEBBA9erVjb+nTJliPENB34VrqTAuIiIiIiIiIiIiIiIiIrfNte8bt7e3Jysry7guU6ZMvuNMJpPxt4ODQ64ibnp6epHGAZQsWdK4Z29vX2ihPa9YNpuNKVOm5DoW/VrXPkeNGjXYv38/GzZsYN26dbzxxhtYrdZC88xvnd566y0qVarEnj17cHBwIDw8vMDnv+qrr77iu+++Y/Pmzcb7u202G2+++SY9e/YsdPz1+eXFZrMBEBsbe8N75Y8fP06/fv2Ii4vjqaeeIjExkYYNG+bqc/3nX9B35Vb6FfQMOkpdRERERERERERERERERG6Jk5OT8d7smxUcHMzq1as5efIkcOVo9iZNmmBvb4+LiwuJiYlcunSJrKws5s2bZ4xr3LgxixYt4vz589hsNmbOnHnL+a9cudLY/Tx9+nRCQkIAaNWqFRMnTuTixYsAXLx4kZ9//jnPGL///jsmk4mwsDDGjx+PzWbjt99+IyQkhG+//Za///4bgGnTpuVbaL9Wamoqjz32GA4ODiQlJbF27dpCx6xbt4733nuPFStW5Co+t2rViujoaGPndmZmJnv27AEgJCSEWbNmYbPZ+Pvvv/nmm28KnadMmTIEBwfz4YcfGvdOnjzJ77//TlpaGg888ABVq1bFZrMxderUQuP9UzfzXdCOcRERERERERERERERERG5Ja+//jrPPvsspUuX5ocffripsZ6enowbN45mzZoB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", + "text/plain": [ + "
    " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Extracting text from data/AI_Information.pdf...\n", + "Extracted 15 pages with content\n", + "Created 4 text chunks\n", + "Created 4 text chunks\n", + "Created 3 text chunks\n", + "Created 3 text chunks\n", + "Created 3 text chunks\n", + "Created 3 text chunks\n", + "Created 3 text chunks\n", + "Created 3 text chunks\n", + "Created 3 text chunks\n", + "Created 3 text chunks\n", + "Created 3 text chunks\n", + "Created 3 text chunks\n", + "Created 3 text chunks\n", + "Created 4 text chunks\n", + "Created 3 text chunks\n", + "Creating embeddings for chunks...\n", + "Vector store created with 48 chunks\n", + "\n", + "\n", + "===== Evaluating Query 1/1 =====\n", + "Query: How does neural network architecture impact AI performance?\n", + "\n", + "=== Processing query with HyDE: How does neural network architecture impact AI performance? ===\n", + "\n", + "Generating hypothetical document...\n", + "Generated hypothetical document of 3438 characters\n", + "Creating embedding for hypothetical document...\n", + "Retrieving 5 most similar chunks...\n", + "Generating final response...\n", + "\n", + "=== Processing query with Standard RAG: How does neural network architecture impact AI performance? ===\n", + "\n", + "Creating embedding for query...\n", + "Retrieving 5 most similar chunks...\n", + "Generating final response...\n", + "\n", + "=== OVERALL ANALYSIS ===\n", + "**Overall Analysis: HyDE RAG vs Standard RAG**\n", + "\n", + "Based on the evaluation of Query 1, we can observe that both HyDE RAG and standard RAG provide accurate information about the impact of neural network architecture on AI performance. However, a more in-depth analysis of the strengths and weaknesses of each approach reveals the following:\n", + "\n", + "**Strengths and Weaknesses of HyDE RAG:**\n", + "\n", + "Strengths:\n", + "\n", + "1. **Improved contextual understanding**: HyDE RAG's use of document embedding allows it to capture the context and relationships between different concepts, leading to more accurate and informative responses.\n", + "2. **Better handling of complex queries**: HyDE RAG's ability to represent documents as vectors enables it to capture the nuances of complex queries, such as the impact of neural network architecture on AI performance.\n", + "\n", + "Weaknesses:\n", + "\n", + "1. **Higher computational requirements**: HyDE RAG's use of document embedding requires more computational resources, which can lead to slower response times.\n", + "2. **Overfitting to training data**: HyDE RAG's reliance on document embedding can lead to overfitting to the training data, which can result in poor performance on unseen queries.\n", + "\n", + "**Strengths and Weaknesses of Standard RAG:**\n", + "\n", + "Strengths:\n", + "\n", + "1. **Faster response times**: Standard RAG's use of direct query embedding allows it to respond quickly, even to complex queries.\n", + "2. **Robustness to overfitting**: Standard RAG's direct query embedding approach is less prone to overfitting, as it does not rely on document representation.\n", + "\n", + "Weaknesses:\n", + "\n", + "1. **Limited contextual understanding**: Standard RAG's direct query embedding approach can lead to limited contextual understanding, resulting in less accurate and informative responses.\n", + "2. **Difficulty handling complex queries**: Standard RAG's direct query embedding approach can struggle to capture the nuances of complex queries, such as the impact of neural network architecture on AI performance.\n", + "\n", + "**When HyDE RAG Outperforms Standard RAG:**\n", + "\n", + "HyDE RAG is likely to outperform Standard RAG in the following scenarios:\n", + "\n", + "1. **Complex queries**: HyDE RAG's ability to capture the nuances of complex queries, such as the impact of neural network architecture on AI performance, makes it a better choice for these types of queries.\n", + "2. **Contextual understanding**: HyDE RAG's improved contextual understanding, enabled by document embedding, makes it a better choice when the query requires a deep understanding of the context and relationships between different concepts.\n", + "\n", + "**When Standard RAG Outperforms HyDE RAG:**\n", + "\n", + "Standard RAG is likely to outperform HyDE RAG in the following scenarios:\n", + "\n", + "1. **Simple queries**: Standard RAG's direct query embedding approach can respond quickly and accurately to simple queries, making it a better choice for these types of queries.\n", + "2. **Real-time applications**: Standard RAG's faster response times make it a better choice for real-time applications, such as search engines or chatbots.\n", + "\n", + "**Recommendations:**\n", + "\n", + "1. **Use HyDE RAG for complex queries**: When dealing with complex queries that require a deep understanding of the context and relationships between different concepts, HyDE RAG is a better choice.\n", + "2. **Use Standard RAG for simple queries**: When dealing with simple queries that require a quick and accurate response, Standard RAG is a better choice.\n", + "3. **Use HyDE RAG for applications requiring contextual understanding**: When the application requires a deep understanding of the context and relationships between different concepts, HyDE RAG is a better choice.\n", + "4. **Use Standard RAG for applications requiring real-time responses**: When the application requires a quick and accurate response, Standard RAG is a better choice.\n" + ] + } + ], + "source": [ + "# Path to the AI information document\n", + "pdf_path = \"data/AI_Information.pdf\"\n", + "\n", + "# Process document and create vector store\n", + "# This loads the document, extracts text, chunks it, and creates embeddings\n", + "vector_store = process_document(pdf_path)\n", + "\n", + "# Example 1: Direct comparison for a single query related to AI\n", + "query = \"What are the main ethical considerations in artificial intelligence development?\"\n", + "\n", + "# Run HyDE RAG approach\n", + "# This generates a hypothetical document answering the query, embeds it, \n", + "# and uses that embedding to retrieve relevant chunks\n", + "hyde_result = hyde_rag(query, vector_store)\n", + "print(\"\\n=== HyDE Response ===\")\n", + "print(hyde_result[\"response\"])\n", + "\n", + "# Run standard RAG approach for comparison\n", + "# This directly embeds the query and uses it to retrieve relevant chunks\n", + "standard_result = standard_rag(query, vector_store)\n", + "print(\"\\n=== Standard RAG Response ===\")\n", + "print(standard_result[\"response\"])\n", + "\n", + "# Visualize the differences between HyDE and standard RAG approaches\n", + "# Shows the query, hypothetical document, and retrieved chunks side by side\n", + "visualize_results(query, hyde_result, standard_result)\n", + "\n", + "# Example 2: Run full evaluation with multiple AI-related queries\n", + "test_queries = [\n", + " \"How does neural network architecture impact AI performance?\"\n", + "]\n", + "\n", + "# Optional reference answers for better evaluation\n", + "reference_answers = [\n", + " \"Neural network architecture significantly impacts AI performance through factors like depth (number of layers), width (neurons per layer), connectivity patterns, and activation functions. Different architectures like CNNs, RNNs, and Transformers are optimized for specific tasks such as image recognition, sequence processing, and natural language understanding respectively.\",\n", + "]\n", + "\n", + "# Run comprehensive evaluation comparing HyDE and standard RAG approaches\n", + "evaluation_results = run_evaluation(\n", + " pdf_path=pdf_path,\n", + " test_queries=test_queries,\n", + " reference_answers=reference_answers\n", + ")\n", + "\n", + "# Print the overall analysis of which approach performs better across queries\n", + "print(\"\\n=== OVERALL ANALYSIS ===\")\n", + "print(evaluation_results[\"overall_analysis\"])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv-new-specific-rag", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 9b934465e154e85265ab95478aed69ab77cc52f0 Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Sun, 9 Mar 2025 21:52:59 +0500 Subject: [PATCH 11/32] crag --- 20_crag.ipynb | 1189 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1189 insertions(+) create mode 100644 20_crag.ipynb diff --git a/20_crag.ipynb b/20_crag.ipynb new file mode 100644 index 0000000..1bca015 --- /dev/null +++ b/20_crag.ipynb @@ -0,0 +1,1189 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "vscode": { + "languageId": "markdown" + } + }, + "source": [ + "# Corrective RAG (CRAG) Implementation\n", + "\n", + "In this notebook, I implement Corrective RAG - an advanced approach that dynamically evaluates retrieved information and corrects the retrieval process when necessary, using web search as a fallback.\n", + "\n", + "CRAG improves on traditional RAG by:\n", + "\n", + "- Evaluating retrieved content before using it\n", + "- Dynamically switching between knowledge sources based on relevance\n", + "- Correcting the retrieval with web search when local knowledge is insufficient\n", + "- Combining information from multiple sources when appropriate" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting Up the Environment\n", + "We begin by importing necessary libraries." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import numpy as np\n", + "import json\n", + "import fitz # PyMuPDF\n", + "from openai import OpenAI\n", + "import requests\n", + "from typing import List, Dict, Tuple, Any\n", + "import re\n", + "from urllib.parse import quote_plus\n", + "import time" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting Up the OpenAI API Client\n", + "We initialize the OpenAI client to generate embeddings and responses." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize the OpenAI client with the base URL and API key\n", + "client = OpenAI(\n", + " base_url=\"https://api.studio.nebius.com/v1/\",\n", + " api_key=os.getenv(\"OPENAI_API_KEY\") # Retrieve the API key from environment variables\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Document Processing Functions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def extract_text_from_pdf(pdf_path):\n", + " \"\"\"\n", + " Extract text content from a PDF file.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF file\n", + " \n", + " Returns:\n", + " str: Extracted text content\n", + " \"\"\"\n", + " print(f\"Extracting text from {pdf_path}...\")\n", + " \n", + " # Open the PDF file\n", + " pdf = fitz.open(pdf_path)\n", + " text = \"\"\n", + " \n", + " # Iterate through each page in the PDF\n", + " for page_num in range(len(pdf)):\n", + " page = pdf[page_num]\n", + " # Extract text from the current page and append it to the text variable\n", + " text += page.get_text()\n", + " \n", + " return text" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def chunk_text(text, chunk_size=1000, overlap=200):\n", + " \"\"\"\n", + " Split text into overlapping chunks for efficient retrieval and processing.\n", + " \n", + " This function divides a large text into smaller, manageable chunks with\n", + " specified overlap between consecutive chunks. Chunking is critical for RAG\n", + " systems as it allows for more precise retrieval of relevant information.\n", + " \n", + " Args:\n", + " text (str): Input text to be chunked\n", + " chunk_size (int): Maximum size of each chunk in characters\n", + " overlap (int): Number of overlapping characters between consecutive chunks\n", + " to maintain context across chunk boundaries\n", + " \n", + " Returns:\n", + " List[Dict]: List of text chunks, each containing:\n", + " - text: The chunk content\n", + " - metadata: Dictionary with positional information and source type\n", + " \"\"\"\n", + " chunks = []\n", + " \n", + " # Iterate through the text with a sliding window approach\n", + " # Moving by (chunk_size - overlap) ensures proper overlap between chunks\n", + " for i in range(0, len(text), chunk_size - overlap):\n", + " # Extract the current chunk, limited by chunk_size\n", + " chunk_text = text[i:i + chunk_size]\n", + " \n", + " # Only add non-empty chunks\n", + " if chunk_text:\n", + " chunks.append({\n", + " \"text\": chunk_text, # The actual text content\n", + " \"metadata\": {\n", + " \"start_pos\": i, # Starting position in the original text\n", + " \"end_pos\": i + len(chunk_text), # Ending position\n", + " \"source_type\": \"document\" # Indicates the source of this text\n", + " }\n", + " })\n", + " \n", + " print(f\"Created {len(chunks)} text chunks\")\n", + " return chunks" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Simple Vector Store Implementation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "class SimpleVectorStore:\n", + " \"\"\"\n", + " A simple vector store implementation using NumPy.\n", + " \"\"\"\n", + " def __init__(self):\n", + " # Initialize lists to store vectors, texts, and metadata\n", + " self.vectors = []\n", + " self.texts = []\n", + " self.metadata = []\n", + " \n", + " def add_item(self, text, embedding, metadata=None):\n", + " \"\"\"\n", + " Add an item to the vector store.\n", + " \n", + " Args:\n", + " text (str): The text content\n", + " embedding (List[float]): The embedding vector\n", + " metadata (Dict, optional): Additional metadata\n", + " \"\"\"\n", + " # Append the embedding, text, and metadata to their respective lists\n", + " self.vectors.append(np.array(embedding))\n", + " self.texts.append(text)\n", + " self.metadata.append(metadata or {})\n", + " \n", + " def add_items(self, items, embeddings):\n", + " \"\"\"\n", + " Add multiple items to the vector store.\n", + " \n", + " Args:\n", + " items (List[Dict]): List of items with text and metadata\n", + " embeddings (List[List[float]]): List of embedding vectors\n", + " \"\"\"\n", + " # Iterate over items and embeddings and add them to the store\n", + " for i, (item, embedding) in enumerate(zip(items, embeddings)):\n", + " self.add_item(\n", + " text=item[\"text\"],\n", + " embedding=embedding,\n", + " metadata=item.get(\"metadata\", {})\n", + " )\n", + " \n", + " def similarity_search(self, query_embedding, k=5):\n", + " \"\"\"\n", + " Find the most similar items to a query embedding.\n", + " \n", + " Args:\n", + " query_embedding (List[float]): Query embedding vector\n", + " k (int): Number of results to return\n", + " \n", + " Returns:\n", + " List[Dict]: Top k most similar items\n", + " \"\"\"\n", + " # Return an empty list if there are no vectors in the store\n", + " if not self.vectors:\n", + " return []\n", + " \n", + " # Convert query embedding to numpy array\n", + " query_vector = np.array(query_embedding)\n", + " \n", + " # Calculate similarities using cosine similarity\n", + " similarities = []\n", + " for i, vector in enumerate(self.vectors):\n", + " similarity = np.dot(query_vector, vector) / (np.linalg.norm(query_vector) * np.linalg.norm(vector))\n", + " similarities.append((i, similarity))\n", + " \n", + " # Sort by similarity (descending)\n", + " similarities.sort(key=lambda x: x[1], reverse=True)\n", + " \n", + " # Return top k results\n", + " results = []\n", + " for i in range(min(k, len(similarities))):\n", + " idx, score = similarities[i]\n", + " results.append({\n", + " \"text\": self.texts[idx],\n", + " \"metadata\": self.metadata[idx],\n", + " \"similarity\": float(score)\n", + " })\n", + " \n", + " return results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating Embeddings" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def create_embeddings(texts, model=\"text-embedding-3-small\"):\n", + " \"\"\"\n", + " Create vector embeddings for text inputs using OpenAI's embedding models.\n", + " \n", + " Embeddings are dense vector representations of text that capture semantic meaning,\n", + " allowing for similarity comparisons. In RAG systems, embeddings are essential\n", + " for matching queries with relevant document chunks.\n", + " \n", + " Args:\n", + " texts (str or List[str]): Input text(s) to be embedded. Can be a single string\n", + " or a list of strings.\n", + " model (str): The embedding model name to use. Defaults to \"text-embedding-3-small\".\n", + " \n", + " Returns:\n", + " List[List[float]]: If input is a list, returns a list of embedding vectors.\n", + " If input is a single string, returns a single embedding vector.\n", + " \"\"\"\n", + " # Handle both single string and list inputs by converting single strings to a list\n", + " input_texts = texts if isinstance(texts, list) else [texts]\n", + " \n", + " # Process in batches to avoid API rate limits and payload size restrictions\n", + " # OpenAI API typically has limits on request size and rate\n", + " batch_size = 100\n", + " all_embeddings = []\n", + " \n", + " # Process each batch of texts\n", + " for i in range(0, len(input_texts), batch_size):\n", + " # Extract the current batch of texts\n", + " batch = input_texts[i:i + batch_size]\n", + " \n", + " # Make API call to generate embeddings for the current batch\n", + " response = client.embeddings.create(\n", + " model=model,\n", + " input=batch\n", + " )\n", + " \n", + " # Extract the embedding vectors from the response\n", + " batch_embeddings = [item.embedding for item in response.data]\n", + " all_embeddings.extend(batch_embeddings)\n", + " \n", + " # If the original input was a single string, return just the first embedding\n", + " if isinstance(texts, str):\n", + " return all_embeddings[0]\n", + " \n", + " # Otherwise return the full list of embeddings\n", + " return all_embeddings" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Document Processing Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def process_document(pdf_path, chunk_size=1000, chunk_overlap=200):\n", + " \"\"\"\n", + " Process a document into a vector store.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF file\n", + " chunk_size (int): Size of each chunk in characters\n", + " chunk_overlap (int): Overlap between chunks in characters\n", + " \n", + " Returns:\n", + " SimpleVectorStore: Vector store containing document chunks\n", + " \"\"\"\n", + " # Extract text from the PDF file\n", + " text = extract_text_from_pdf(pdf_path)\n", + " \n", + " # Split the extracted text into chunks with specified size and overlap\n", + " chunks = chunk_text(text, chunk_size, chunk_overlap)\n", + " \n", + " # Create embeddings for each chunk of text\n", + " print(\"Creating embeddings for chunks...\")\n", + " chunk_texts = [chunk[\"text\"] for chunk in chunks]\n", + " chunk_embeddings = create_embeddings(chunk_texts)\n", + " \n", + " # Initialize a new vector store\n", + " vector_store = SimpleVectorStore()\n", + " \n", + " # Add the chunks and their embeddings to the vector store\n", + " vector_store.add_items(chunks, chunk_embeddings)\n", + " \n", + " print(f\"Vector store created with {len(chunks)} chunks\")\n", + " return vector_store" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Relevance Evaluation Function" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def evaluate_document_relevance(query, document):\n", + " \"\"\"\n", + " Evaluate the relevance of a document to a query.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " document (str): Document text\n", + " \n", + " Returns:\n", + " float: Relevance score (0-1)\n", + " \"\"\"\n", + " # Define the system prompt to instruct the model on how to evaluate relevance\n", + " system_prompt = \"\"\"\n", + " You are an expert at evaluating document relevance. \n", + " Rate how relevant the given document is to the query on a scale from 0 to 1.\n", + " 0 means completely irrelevant, 1 means perfectly relevant.\n", + " Provide ONLY the score as a float between 0 and 1.\n", + " \"\"\"\n", + " \n", + " # Define the user prompt with the query and document\n", + " user_prompt = f\"Query: {query}\\n\\nDocument: {document}\"\n", + " \n", + " try:\n", + " # Make a request to the OpenAI API to evaluate the relevance\n", + " response = client.chat.completions.create(\n", + " model=\"gpt-3.5-turbo\", # Specify the model to use\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt}, # System message to guide the assistant\n", + " {\"role\": \"user\", \"content\": user_prompt} # User message with the query and document\n", + " ],\n", + " temperature=0, # Set the temperature for response generation\n", + " max_tokens=5 # Very short response needed\n", + " )\n", + " \n", + " # Extract the score from the response\n", + " score_text = response.choices[0].message.content.strip()\n", + " # Use regex to find the float value in the response\n", + " score_match = re.search(r'(\\d+(\\.\\d+)?)', score_text)\n", + " if score_match:\n", + " return float(score_match.group(1)) # Return the extracted score as a float\n", + " return 0.5 # Default to middle value if parsing fails\n", + " \n", + " except Exception as e:\n", + " # Print the error message and return a default value on error\n", + " print(f\"Error evaluating document relevance: {e}\")\n", + " return 0.5 # Default to middle value on error" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Web Search Function" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def duck_duck_go_search(query, num_results=3):\n", + " \"\"\"\n", + " Perform a web search using DuckDuckGo.\n", + " \n", + " Args:\n", + " query (str): Search query\n", + " num_results (int): Number of results to return\n", + " \n", + " Returns:\n", + " Tuple[str, List[Dict]]: Combined search results text and source metadata\n", + " \"\"\"\n", + " # Encode the query for URL\n", + " encoded_query = quote_plus(query)\n", + " \n", + " # DuckDuckGo search API endpoint (unofficial)\n", + " url = f\"https://api.duckduckgo.com/?q={encoded_query}&format=json\"\n", + " \n", + " try:\n", + " # Perform the web search request\n", + " response = requests.get(url, headers={\n", + " \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36\"\n", + " })\n", + " data = response.json()\n", + " \n", + " # Initialize variables to store results text and sources\n", + " results_text = \"\"\n", + " sources = []\n", + " \n", + " # Add abstract if available\n", + " if data.get(\"AbstractText\"):\n", + " results_text += f\"{data['AbstractText']}\\n\\n\"\n", + " sources.append({\n", + " \"title\": data.get(\"AbstractSource\", \"Wikipedia\"),\n", + " \"url\": data.get(\"AbstractURL\", \"\")\n", + " })\n", + " \n", + " # Add related topics\n", + " for topic in data.get(\"RelatedTopics\", [])[:num_results]:\n", + " if \"Text\" in topic and \"FirstURL\" in topic:\n", + " results_text += f\"{topic['Text']}\\n\\n\"\n", + " sources.append({\n", + " \"title\": topic.get(\"Text\", \"\").split(\" - \")[0],\n", + " \"url\": topic.get(\"FirstURL\", \"\")\n", + " })\n", + " \n", + " return results_text, sources\n", + " \n", + " except Exception as e:\n", + " # Print error message if the main search fails\n", + " print(f\"Error performing web search: {e}\")\n", + " \n", + " # Fallback to a backup search API\n", + " try:\n", + " backup_url = f\"https://serpapi.com/search.json?q={encoded_query}&engine=duckduckgo\"\n", + " response = requests.get(backup_url)\n", + " data = response.json()\n", + " \n", + " # Initialize variables to store results text and sources\n", + " results_text = \"\"\n", + " sources = []\n", + " \n", + " # Extract results from the backup API\n", + " for result in data.get(\"organic_results\", [])[:num_results]:\n", + " results_text += f\"{result.get('title', '')}: {result.get('snippet', '')}\\n\\n\"\n", + " sources.append({\n", + " \"title\": result.get(\"title\", \"\"),\n", + " \"url\": result.get(\"link\", \"\")\n", + " })\n", + " \n", + " return results_text, sources\n", + " except Exception as backup_error:\n", + " # Print error message if the backup search also fails\n", + " print(f\"Backup search also failed: {backup_error}\")\n", + " return \"Failed to retrieve search results.\", []" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def rewrite_search_query(query):\n", + " \"\"\"\n", + " Rewrite a query to be more suitable for web search.\n", + " \n", + " Args:\n", + " query (str): Original query\n", + " \n", + " Returns:\n", + " str: Rewritten query\n", + " \"\"\"\n", + " # Define the system prompt to instruct the model on how to rewrite the query\n", + " system_prompt = \"\"\"\n", + " You are an expert at creating effective search queries.\n", + " Rewrite the given query to make it more suitable for a web search engine.\n", + " Focus on keywords and facts, remove unnecessary words, and make it concise.\n", + " \"\"\"\n", + " \n", + " try:\n", + " # Make a request to the OpenAI API to rewrite the query\n", + " response = client.chat.completions.create(\n", + " model=\"gpt-3.5-turbo\", # Specify the model to use\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt}, # System message to guide the assistant\n", + " {\"role\": \"user\", \"content\": f\"Original query: {query}\\n\\nRewritten query:\"} # User message with the original query\n", + " ],\n", + " temperature=0.3, # Set the temperature for response generation\n", + " max_tokens=50 # Limit the response length\n", + " )\n", + " \n", + " # Return the rewritten query from the response\n", + " return response.choices[0].message.content.strip()\n", + " except Exception as e:\n", + " # Print the error message and return the original query on error\n", + " print(f\"Error rewriting search query: {e}\")\n", + " return query # Return original query on error" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def perform_web_search(query):\n", + " \"\"\"\n", + " Perform web search with query rewriting.\n", + " \n", + " Args:\n", + " query (str): Original user query\n", + " \n", + " Returns:\n", + " Tuple[str, List[Dict]]: Search results text and source metadata\n", + " \"\"\"\n", + " # Rewrite the query to improve search results\n", + " rewritten_query = rewrite_search_query(query)\n", + " print(f\"Rewritten search query: {rewritten_query}\")\n", + " \n", + " # Perform the web search using the rewritten query\n", + " results_text, sources = duck_duck_go_search(rewritten_query)\n", + " \n", + " # Return the search results text and source metadata\n", + " return results_text, sources" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Knowledge Refinement Function" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def refine_knowledge(text):\n", + " \"\"\"\n", + " Extract and refine key information from text.\n", + " \n", + " Args:\n", + " text (str): Input text to refine\n", + " \n", + " Returns:\n", + " str: Refined key points from the text\n", + " \"\"\"\n", + " # Define the system prompt to instruct the model on how to extract key information\n", + " system_prompt = \"\"\"\n", + " Extract the key information from the following text as a set of clear, concise bullet points.\n", + " Focus on the most relevant facts and important details.\n", + " Format your response as a bulleted list with each point on a new line starting with \"• \".\n", + " \"\"\"\n", + " \n", + " try:\n", + " # Make a request to the OpenAI API to refine the text\n", + " response = client.chat.completions.create(\n", + " model=\"gpt-3.5-turbo\", # Specify the model to use\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt}, # System message to guide the assistant\n", + " {\"role\": \"user\", \"content\": f\"Text to refine:\\n\\n{text}\"} # User message with the text to refine\n", + " ],\n", + " temperature=0.3 # Set the temperature for response generation\n", + " )\n", + " \n", + " # Return the refined key points from the response\n", + " return response.choices[0].message.content.strip()\n", + " except Exception as e:\n", + " # Print the error message and return the original text on error\n", + " print(f\"Error refining knowledge: {e}\")\n", + " return text # Return original text on error" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Core CRAG Process" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def crag_process(query, vector_store, k=3):\n", + " \"\"\"\n", + " Run the Corrective RAG process.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " vector_store (SimpleVectorStore): Vector store with document chunks\n", + " k (int): Number of initial documents to retrieve\n", + " \n", + " Returns:\n", + " Dict: Process results including response and debug info\n", + " \"\"\"\n", + " print(f\"\\n=== Processing query with CRAG: {query} ===\\n\")\n", + " \n", + " # Step 1: Create query embedding and retrieve documents\n", + " print(\"Retrieving initial documents...\")\n", + " query_embedding = create_embeddings(query)\n", + " retrieved_docs = vector_store.similarity_search(query_embedding, k=k)\n", + " \n", + " # Step 2: Evaluate document relevance\n", + " print(\"Evaluating document relevance...\")\n", + " relevance_scores = []\n", + " for doc in retrieved_docs:\n", + " score = evaluate_document_relevance(query, doc[\"text\"])\n", + " relevance_scores.append(score)\n", + " doc[\"relevance\"] = score\n", + " print(f\"Document scored {score:.2f} relevance\")\n", + " \n", + " # Step 3: Determine action based on best relevance score\n", + " max_score = max(relevance_scores) if relevance_scores else 0\n", + " best_doc_idx = relevance_scores.index(max_score) if relevance_scores else -1\n", + " \n", + " # Track sources for attribution\n", + " sources = []\n", + " final_knowledge = \"\"\n", + " \n", + " # Step 4: Execute the appropriate knowledge acquisition strategy\n", + " if max_score > 0.7:\n", + " # Case 1: High relevance - Use document directly\n", + " print(f\"High relevance ({max_score:.2f}) - Using document directly\")\n", + " best_doc = retrieved_docs[best_doc_idx][\"text\"]\n", + " final_knowledge = best_doc\n", + " sources.append({\n", + " \"title\": \"Document\",\n", + " \"url\": \"\"\n", + " })\n", + " \n", + " elif max_score < 0.3:\n", + " # Case 2: Low relevance - Use web search\n", + " print(f\"Low relevance ({max_score:.2f}) - Performing web search\")\n", + " web_results, web_sources = perform_web_search(query)\n", + " final_knowledge = refine_knowledge(web_results)\n", + " sources.extend(web_sources)\n", + " \n", + " else:\n", + " # Case 3: Medium relevance - Combine document with web search\n", + " print(f\"Medium relevance ({max_score:.2f}) - Combining document with web search\")\n", + " best_doc = retrieved_docs[best_doc_idx][\"text\"]\n", + " refined_doc = refine_knowledge(best_doc)\n", + " \n", + " # Get web results\n", + " web_results, web_sources = perform_web_search(query)\n", + " refined_web = refine_knowledge(web_results)\n", + " \n", + " # Combine knowledge\n", + " final_knowledge = f\"From document:\\n{refined_doc}\\n\\nFrom web search:\\n{refined_web}\"\n", + " \n", + " # Add sources\n", + " sources.append({\n", + " \"title\": \"Document\",\n", + " \"url\": \"\"\n", + " })\n", + " sources.extend(web_sources)\n", + " \n", + " # Step 5: Generate final response\n", + " print(\"Generating final response...\")\n", + " response = generate_response(query, final_knowledge, sources)\n", + " \n", + " # Return comprehensive results\n", + " return {\n", + " \"query\": query,\n", + " \"response\": response,\n", + " \"retrieved_docs\": retrieved_docs,\n", + " \"relevance_scores\": relevance_scores,\n", + " \"max_relevance\": max_score,\n", + " \"final_knowledge\": final_knowledge,\n", + " \"sources\": sources\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Response Generation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_response(query, knowledge, sources):\n", + " \"\"\"\n", + " Generate a response based on the query and knowledge.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " knowledge (str): Knowledge to base the response on\n", + " sources (List[Dict]): List of sources with title and URL\n", + " \n", + " Returns:\n", + " str: Generated response\n", + " \"\"\"\n", + " # Format sources for inclusion in prompt\n", + " sources_text = \"\"\n", + " for source in sources:\n", + " title = source.get(\"title\", \"Unknown Source\")\n", + " url = source.get(\"url\", \"\")\n", + " if url:\n", + " sources_text += f\"- {title}: {url}\\n\"\n", + " else:\n", + " sources_text += f\"- {title}\\n\"\n", + " \n", + " # Define the system prompt to instruct the model on how to generate the response\n", + " system_prompt = \"\"\"\n", + " You are a helpful AI assistant. Generate a comprehensive, informative response to the query based on the provided knowledge.\n", + " Include all relevant information while keeping your answer clear and concise.\n", + " If the knowledge doesn't fully answer the query, acknowledge this limitation.\n", + " Include source attribution at the end of your response.\n", + " \"\"\"\n", + " \n", + " # Define the user prompt with the query, knowledge, and sources\n", + " user_prompt = f\"\"\"\n", + " Query: {query}\n", + " \n", + " Knowledge:\n", + " {knowledge}\n", + " \n", + " Sources:\n", + " {sources_text}\n", + " \n", + " Please provide an informative response to the query based on this information.\n", + " Include the sources at the end of your response.\n", + " \"\"\"\n", + " \n", + " try:\n", + " # Make a request to the OpenAI API to generate the response\n", + " response = client.chat.completions.create(\n", + " model=\"gpt-4\", # Using GPT-4 for high-quality responses\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0.2\n", + " )\n", + " \n", + " # Return the generated response\n", + " return response.choices[0].message.content.strip()\n", + " except Exception as e:\n", + " # Print the error message and return an error response\n", + " print(f\"Error generating response: {e}\")\n", + " return f\"I apologize, but I encountered an error while generating a response to your query: '{query}'. The error was: {str(e)}\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluation Functions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def evaluate_crag_response(query, response, reference_answer=None):\n", + " \"\"\"\n", + " Evaluate the quality of a CRAG response.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " response (str): Generated response\n", + " reference_answer (str, optional): Reference answer for comparison\n", + " \n", + " Returns:\n", + " Dict: Evaluation metrics\n", + " \"\"\"\n", + " # System prompt for the evaluation criteria\n", + " system_prompt = \"\"\"\n", + " You are an expert at evaluating the quality of responses to questions.\n", + " Please evaluate the provided response based on the following criteria:\n", + " \n", + " 1. Relevance (0-10): How directly does the response address the query?\n", + " 2. Accuracy (0-10): How factually correct is the information?\n", + " 3. Completeness (0-10): How thoroughly does the response answer all aspects of the query?\n", + " 4. Clarity (0-10): How clear and easy to understand is the response?\n", + " 5. Source Quality (0-10): How well does the response cite relevant sources?\n", + " \n", + " Return your evaluation as a JSON object with scores for each criterion and a brief explanation for each score.\n", + " Also include an \"overall_score\" (0-10) and a brief \"summary\" of your evaluation.\n", + " \"\"\"\n", + " \n", + " # User prompt with the query and response to be evaluated\n", + " user_prompt = f\"\"\"\n", + " Query: {query}\n", + " \n", + " Response to evaluate:\n", + " {response}\n", + " \"\"\"\n", + " \n", + " # Include reference answer in the prompt if provided\n", + " if reference_answer:\n", + " user_prompt += f\"\"\"\n", + " Reference answer (for comparison):\n", + " {reference_answer}\n", + " \"\"\"\n", + " \n", + " try:\n", + " # Request evaluation from the GPT-4 model\n", + " evaluation_response = client.chat.completions.create(\n", + " model=\"gpt-4\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " response_format={\"type\": \"json_object\"},\n", + " temperature=0\n", + " )\n", + " \n", + " # Parse the evaluation response\n", + " evaluation = json.loads(evaluation_response.choices[0].message.content)\n", + " return evaluation\n", + " except Exception as e:\n", + " # Handle any errors during the evaluation process\n", + " print(f\"Error evaluating response: {e}\")\n", + " return {\n", + " \"error\": str(e),\n", + " \"overall_score\": 0,\n", + " \"summary\": \"Evaluation failed due to an error.\"\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def compare_crag_vs_standard_rag(query, vector_store, reference_answer=None):\n", + " \"\"\"\n", + " Compare CRAG against standard RAG for a query.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " vector_store (SimpleVectorStore): Vector store with document chunks\n", + " reference_answer (str, optional): Reference answer for comparison\n", + " \n", + " Returns:\n", + " Dict: Comparison results\n", + " \"\"\"\n", + " # Run CRAG process\n", + " print(\"\\n=== Running CRAG ===\")\n", + " crag_result = crag_process(query, vector_store)\n", + " crag_response = crag_result[\"response\"]\n", + " \n", + " # Run standard RAG (directly retrieve and respond)\n", + " print(\"\\n=== Running standard RAG ===\")\n", + " query_embedding = create_embeddings(query)\n", + " retrieved_docs = vector_store.similarity_search(query_embedding, k=3)\n", + " combined_text = \"\\n\\n\".join([doc[\"text\"] for doc in retrieved_docs])\n", + " standard_sources = [{\"title\": \"Document\", \"url\": \"\"}]\n", + " standard_response = generate_response(query, combined_text, standard_sources)\n", + " \n", + " # Evaluate both approaches\n", + " print(\"\\n=== Evaluating CRAG response ===\")\n", + " crag_eval = evaluate_crag_response(query, crag_response, reference_answer)\n", + " \n", + " print(\"\\n=== Evaluating standard RAG response ===\")\n", + " standard_eval = evaluate_crag_response(query, standard_response, reference_answer)\n", + " \n", + " # Compare approaches\n", + " print(\"\\n=== Comparing approaches ===\")\n", + " comparison = compare_responses(query, crag_response, standard_response, reference_answer)\n", + " \n", + " return {\n", + " \"query\": query,\n", + " \"crag_response\": crag_response,\n", + " \"standard_response\": standard_response,\n", + " \"reference_answer\": reference_answer,\n", + " \"crag_evaluation\": crag_eval,\n", + " \"standard_evaluation\": standard_eval,\n", + " \"comparison\": comparison\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def compare_responses(query, crag_response, standard_response, reference_answer=None):\n", + " \"\"\"\n", + " Compare CRAG and standard RAG responses.\n", + " \n", + " Args:\n", + " query (str): User query\n", + " crag_response (str): CRAG response\n", + " standard_response (str): Standard RAG response\n", + " reference_answer (str, optional): Reference answer\n", + " \n", + " Returns:\n", + " str: Comparison analysis\n", + " \"\"\"\n", + " # System prompt for comparing the two approaches\n", + " system_prompt = \"\"\"\n", + " You are an expert evaluator comparing two response generation approaches:\n", + " \n", + " 1. CRAG (Corrective RAG): A system that evaluates document relevance and dynamically switches to web search when needed.\n", + " 2. Standard RAG: A system that directly retrieves documents based on embedding similarity and uses them for response generation.\n", + " \n", + " Compare the responses from these two systems based on:\n", + " - Accuracy and factual correctness\n", + " - Relevance to the query\n", + " - Completeness of the answer\n", + " - Clarity and organization\n", + " - Source attribution quality\n", + " \n", + " Explain which approach performed better for this specific query and why.\n", + " \"\"\"\n", + " \n", + " # User prompt with the query and responses to be compared\n", + " user_prompt = f\"\"\"\n", + " Query: {query}\n", + " \n", + " CRAG Response:\n", + " {crag_response}\n", + " \n", + " Standard RAG Response:\n", + " {standard_response}\n", + " \"\"\"\n", + " \n", + " # Include reference answer in the prompt if provided\n", + " if reference_answer:\n", + " user_prompt += f\"\"\"\n", + " Reference Answer:\n", + " {reference_answer}\n", + " \"\"\"\n", + " \n", + " try:\n", + " # Request comparison from the GPT-4 model\n", + " response = client.chat.completions.create(\n", + " model=\"gpt-4\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0\n", + " )\n", + " \n", + " # Return the comparison analysis\n", + " return response.choices[0].message.content.strip()\n", + " except Exception as e:\n", + " # Handle any errors during the comparison process\n", + " print(f\"Error comparing responses: {e}\")\n", + " return f\"Error comparing responses: {str(e)}\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Complete Evaluation Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def run_crag_evaluation(pdf_path, test_queries, reference_answers=None):\n", + " \"\"\"\n", + " Run a complete evaluation of CRAG with multiple test queries.\n", + " \n", + " Args:\n", + " pdf_path (str): Path to the PDF document\n", + " test_queries (List[str]): List of test queries\n", + " reference_answers (List[str], optional): Reference answers for queries\n", + " \n", + " Returns:\n", + " Dict: Complete evaluation results\n", + " \"\"\"\n", + " # Process document and create vector store\n", + " vector_store = process_document(pdf_path)\n", + " \n", + " results = []\n", + " \n", + " for i, query in enumerate(test_queries):\n", + " print(f\"\\n\\n===== Evaluating Query {i+1}/{len(test_queries)} =====\")\n", + " print(f\"Query: {query}\")\n", + " \n", + " # Get reference answer if available\n", + " reference = None\n", + " if reference_answers and i < len(reference_answers):\n", + " reference = reference_answers[i]\n", + " \n", + " # Run comparison between CRAG and standard RAG\n", + " result = compare_crag_vs_standard_rag(query, vector_store, reference)\n", + " results.append(result)\n", + " \n", + " # Display comparison results\n", + " print(\"\\n=== Comparison ===\")\n", + " print(result[\"comparison\"])\n", + " \n", + " # Generate overall analysis from individual results\n", + " overall_analysis = generate_overall_analysis(results)\n", + " \n", + " return {\n", + " \"results\": results,\n", + " \"overall_analysis\": overall_analysis\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_overall_analysis(results):\n", + " \"\"\"\n", + " Generate an overall analysis of evaluation results.\n", + " \n", + " Args:\n", + " results (List[Dict]): Results from individual query evaluations\n", + " \n", + " Returns:\n", + " str: Overall analysis\n", + " \"\"\"\n", + " # System prompt for the analysis\n", + " system_prompt = \"\"\"\n", + " You are an expert at evaluating information retrieval and response generation systems.\n", + " Based on multiple test queries, provide an overall analysis comparing CRAG (Corrective RAG) \n", + " with standard RAG.\n", + " \n", + " Focus on:\n", + " 1. When CRAG performs better and why\n", + " 2. When standard RAG performs better and why\n", + " 3. The overall strengths and weaknesses of each approach\n", + " 4. Recommendations for when to use each approach\n", + " \"\"\"\n", + " \n", + " # Create summary of evaluations\n", + " evaluations_summary = \"\"\n", + " for i, result in enumerate(results):\n", + " evaluations_summary += f\"Query {i+1}: {result['query']}\\n\"\n", + " if 'crag_evaluation' in result and 'overall_score' in result['crag_evaluation']:\n", + " crag_score = result['crag_evaluation'].get('overall_score', 'N/A')\n", + " evaluations_summary += f\"CRAG score: {crag_score}\\n\"\n", + " if 'standard_evaluation' in result and 'overall_score' in result['standard_evaluation']:\n", + " std_score = result['standard_evaluation'].get('overall_score', 'N/A')\n", + " evaluations_summary += f\"Standard RAG score: {std_score}\\n\"\n", + " evaluations_summary += f\"Comparison summary: {result['comparison'][:200]}...\\n\\n\"\n", + " \n", + " # User prompt for the analysis\n", + " user_prompt = f\"\"\"\n", + " Based on the following evaluations comparing CRAG vs standard RAG across {len(results)} queries, \n", + " provide an overall analysis of these two approaches:\n", + " \n", + " {evaluations_summary}\n", + " \n", + " Please provide a comprehensive analysis of the relative strengths and weaknesses of CRAG \n", + " compared to standard RAG, focusing on when and why one approach outperforms the other.\n", + " \"\"\"\n", + " \n", + " try:\n", + " # Generate the overall analysis using GPT-4\n", + " response = client.chat.completions.create(\n", + " model=\"gpt-4\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=0\n", + " )\n", + " \n", + " return response.choices[0].message.content.strip()\n", + " except Exception as e:\n", + " print(f\"Error generating overall analysis: {e}\")\n", + " return f\"Error generating overall analysis: {str(e)}\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluation of CRAG with Test Queries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Path to the AI information PDF document\n", + "pdf_path = \"data/AI_Information.pdf\"\n", + "\n", + "# Run comprehensive evaluation with multiple AI-related queries\n", + "test_queries = [\n", + " \"How does machine learning differ from traditional programming?\",\n", + "]\n", + "\n", + "# Optional reference answers for better quality evaluation\n", + "reference_answers = [\n", + " \"Machine learning differs from traditional programming by having computers learn patterns from data rather than following explicit instructions. In traditional programming, developers write specific rules for the computer to follow, while in machine learning\",\n", + "]\n", + "\n", + "# Run the full evaluation comparing CRAG vs standard RAG\n", + "evaluation_results = run_crag_evaluation(pdf_path, test_queries, reference_answers)\n", + "print(\"\\n=== Overall Analysis of CRAG vs Standard RAG ===\")\n", + "print(evaluation_results[\"overall_analysis\"])\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv-new-specific-rag", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From d4a778781a55214ed0812c25abe5ed52423fd250 Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Mon, 10 Mar 2025 09:01:39 +0500 Subject: [PATCH 12/32] Required dependencies --- requirements.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..8943bbd --- /dev/null +++ b/requirements.txt @@ -0,0 +1,10 @@ +fitz +numpy +openai +requests +rank-bm25 +scikit-learn +networkx +matplotlib +tqdm +Pillow \ No newline at end of file From 38a6def47bb3c13a4f96ef23058af71ea90d8ac0 Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Mon, 10 Mar 2025 10:05:07 +0500 Subject: [PATCH 13/32] doc --- README.md | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 134 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 85e96d6..39e20ef 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,134 @@ -# all-rag-techniques -Applied all RAG techniques in a simpler way +# All RAG Techniques: A Simpler, Hands-On Approach ✨ + +[![Python 3.7+](https://img.shields.io/badge/python-3.7+-blue.svg)](https://www.python.org/downloads/release/python-370/) [![Nebius AI](https://img.shields.io/badge/Nebius%20AI-API-brightgreen)](https://cloud.nebius.ai/services/llm-embedding) [![OpenAI](https://img.shields.io/badge/OpenAI-API-lightgrey)](https://openai.com/) [![Medium](https://img.shields.io/badge/Medium-Blog-black?logo=medium)](https://medium.com/@fareedkhandev/testing-every-rag-technique-to-find-the-best-094d166af27f) + +This repository takes a clear, hands-on approach to **Retrieval-Augmented Generation (RAG)**, breaking down advanced techniques into straightforward, understandable implementations. Instead of relying on frameworks like `LangChain` or `FAISS`, everything here is built using familiar Python libraries `openai`, `numpy`, `matplotlib`, and a few others. + +The goal is simple: provide code that is readable, modifiable, and educational. By focusing on the fundamentals, this project helps demystify RAG and makes it easier to understand how it really works. + +## 🚀 What's Inside? + +This repository contains a collection of Jupyter Notebooks, each focusing on a specific RAG technique. Each notebook provides: + +* A concise explanation of the technique. +* A step-by-step implementation from scratch. +* Clear code examples with inline comments. +* Evaluations and comparisons to demonstrate the technique's effectiveness. +* Visualization to visualize the results. + +Here's a glimpse of the techniques covered: + +| Notebook | Description | +| :-------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| [1. Simple RAG](1_simple_rag.ipynb) | A basic RAG implementation. A great starting point! | +| [2. Semantic Chunking](2_semantic_chunking.ipynb) | Splits text based on semantic similarity for more meaningful chunks. | +| [3. Chunk Size Selector](3_chunk_size_selector.ipynb) | Explores the impact of different chunk sizes on retrieval performance. | +| [4. Context Enriched RAG](4_context_enriched_rag.ipynb) | Retrieves neighboring chunks to provide more context. | +| [5. Contextual Chunk Headers](5_contextual_chunk_headers_rag.ipynb) | Prepends descriptive headers to each chunk before embedding. | +| [6. Document Augmentation RAG](6_doc_augmentation_rag.ipynb) | Generates questions from text chunks to augment the retrieval process. | +| [7. Query Transform](7_query_transform.ipynb) | Rewrites, expands, or decomposes queries to improve retrieval. Includes **Step-back Prompting** and **Sub-query Decomposition**. | +| [8. Reranker](8_reranker.ipynb) | Re-ranks initially retrieved results using an LLM for better relevance. | +| [9. RSE](9_rse.ipynb) | Relevant Segment Extraction: Identifies and reconstructs continuous segments of text, preserving context. | +| [10. Contextual Compression](10_contextual_compression.ipynb) | Implements contextual compression to filter and compress retrieved chunks, maximizing relevant information. | +| [11. Feedback Loop RAG](11_feedback_loop_rag.ipynb) | Incorporates user feedback to learn and improve RAG system over time. | +| [12. Adaptive RAG](12_adaptive_rag.ipynb) | Dynamically selects the best retrieval strategy based on query type. | +| [13. Self RAG](13_self_rag.ipynb) | Implements Self-RAG, dynamically decides when and how to retrieve, evaluates relevance, and assesses support and utility. | +| [14. Proposition Chunking](14_proposition_chunking.ipynb) | Breaks down documents into atomic, factual statements for precise retrieval. | +| [15. Multimodel RAG](15_multimodel_rag.ipynb) | Combines text and images for retrieval, generating captions for images using LLaVA. | +| [16. Fusion RAG](16_fusion_rag.ipynb) | Combines vector search with keyword-based (BM25) retrieval for improved results. | +| [17. Graph RAG](17_graph_rag.ipynb) | Organizes knowledge as a graph, enabling traversal of related concepts. | +| [18. Hierarchy RAG](18_hierarchy_rag.ipynb) | Builds hierarchical indices (summaries + detailed chunks) for efficient retrieval. | +| [19. HyDE RAG](19_HyDE_rag.ipynb) | Uses Hypothetical Document Embeddings to improve semantic matching. | +| [20. CRAG](20_crag.ipynb) | Corrective RAG: Dynamically evaluates retrieval quality and uses web search as a fallback. | + +## 🗂️ Repository Structure + +``` +fareedkhan-dev-all-rag-techniques/ +├── README.md <- You are here! +├── 1_simple_rag.ipynb +├── 2_semantic_chunking.ipynb +├── 3_chunk_size_selector.ipynb +├── 4_context_enriched_rag.ipynb +├── 5_contextual_chunk_headers_rag.ipynb +├── 6_doc_augmentation_rag.ipynb +├── 7_query_transform.ipynb +├── 8_reranker.ipynb +├── 9_rse.ipynb +├── 10_contextual_compression.ipynb +├── 11_feedback_loop_rag.ipynb +├── 12_adaptive_rag.ipynb +├── 13_self_rag.ipynb +├── 14_proposition_chunking.ipynb +├── 15_multimodel_rag.ipynb +├── 16_fusion_rag.ipynb +├── 17_graph_rag.ipynb +├── 18_hierarchy_rag.ipynb +├── 19_HyDE_rag.ipynb +├── 20_crag.ipynb +├── requirements.txt <- Python dependencies +└── data/ + └── val.json <- Sample validation data (queries and answers) + └── AI_information.pdf <- A sample PDF document for testing. + └── attention_is_all_you_need.pdf <- A sample PDF document for testing (for Multi-Modal RAG). +``` + +## 🛠️ Getting Started + +1. **Clone the repository:** + + ```bash + git clone https://github.com/fareed-khan/fareedkhan-dev-all-rag-techniques.git # Replace with your repo URL + cd fareedkhan-dev-all-rag-techniques + ``` + +2. **Install dependencies:** + + ```bash + pip install -r requirements.txt + ``` + +3. **Set up your OpenAI API key:** + + * Obtain an API key from [Nebius AI](https://cloud.nebius.ai/services/llm-embedding). + * Set the API key as an environment variable: + ```bash + export OPENAI_API_KEY='YOUR_NEBIUS_AI_API_KEY' + ``` + or + ```bash + setx OPENAI_API_KEY "YOUR_NEBIUS_AI_API_KEY" # On Windows + ``` + or, within your Python script/notebook: + + ```python + import os + os.environ["OPENAI_API_KEY"] = "YOUR_NEBIUS_AI_API_KEY" + ``` + +4. **Run the notebooks:** + + Open any of the Jupyter Notebooks (`.ipynb` files) using Jupyter Notebook or JupyterLab. Each notebook is self-contained and can be run independently. The notebooks are designed to be executed sequentially within each file. + + **Note:** The `data/AI_information.pdf` file provides a sample document for testing. You can replace it with your own PDF. The `data/val.json` file contains sample queries and ideal answers for evaluation. + The 'attention_is_all_you_need.pdf' is for testing Multi-Modal RAG Notebook. + +## 💡 Core Concepts + +* **Embeddings:** Numerical representations of text that capture semantic meaning. We use Nebius AI's embedding API and, in many notebooks, also the `BAAI/bge-en-icl` embedding model. + +* **Vector Store:** A simple database to store and search embeddings. We create our own `SimpleVectorStore` class using NumPy for efficient similarity calculations. + +* **Cosine Similarity:** A measure of similarity between two vectors. Higher values indicate greater similarity. + +* **Chunking:** Dividing text into smaller, manageable pieces. We explore various chunking strategies. + +* **Retrieval:** The process of finding the most relevant text chunks for a given query. + +* **Generation:** Using a Large Language Model (LLM) to create a response based on the retrieved context and the user's query. We use the `meta-llama/Llama-3.2-3B-Instruct` model via Nebius AI's API. + +* **Evaluation:** Assessing the quality of the RAG system's responses, often by comparing them to a reference answer or using an LLM to score relevance. + +## 🤝 Contributing + +Contributions are welcome! \ No newline at end of file From b97883447ee603a7887e828eab7963e89d44cdec Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Mon, 10 Mar 2025 10:06:34 +0500 Subject: [PATCH 14/32] correct link --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 39e20ef..21064fb 100644 --- a/README.md +++ b/README.md @@ -78,8 +78,8 @@ fareedkhan-dev-all-rag-techniques/ 1. **Clone the repository:** ```bash - git clone https://github.com/fareed-khan/fareedkhan-dev-all-rag-techniques.git # Replace with your repo URL - cd fareedkhan-dev-all-rag-techniques + git clone https://github.com/FareedKhan-dev/all-rag-techniques.git + cd all-rag-techniques ``` 2. **Install dependencies:** From 5f9b46ef8c0433b6754021d955dcd07c64d1716a Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Mon, 10 Mar 2025 10:07:39 +0500 Subject: [PATCH 15/32] nebius provider --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 21064fb..e01e5f8 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ fareedkhan-dev-all-rag-techniques/ 3. **Set up your OpenAI API key:** - * Obtain an API key from [Nebius AI](https://cloud.nebius.ai/services/llm-embedding). + * Obtain an API key from [Nebius AI](https://studio.nebius.com/). * Set the API key as an environment variable: ```bash export OPENAI_API_KEY='YOUR_NEBIUS_AI_API_KEY' From 34e2f404c4707ed957b5a76fcae52a5758bc915a Mon Sep 17 00:00:00 2001 From: Fareed Khan Date: Mon, 10 Mar 2025 10:13:57 +0500 Subject: [PATCH 16/32] Create LICENSE --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4f1b584 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Fareed Khan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 50f146c16ed98df1fdb20365605cd9be6bce91c0 Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Thu, 20 Mar 2025 18:35:48 +0500 Subject: [PATCH 17/32] RL with RAG --- 21_rag_with_rl.ipynb | 2172 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2172 insertions(+) create mode 100644 21_rag_with_rl.ipynb diff --git a/21_rag_with_rl.ipynb b/21_rag_with_rl.ipynb new file mode 100644 index 0000000..9cc4297 --- /dev/null +++ b/21_rag_with_rl.ipynb @@ -0,0 +1,2172 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "vscode": { + "languageId": "markdown" + } + }, + "source": [ + "# Simple RAG with RL\n", + "\n", + "[![Python 3.7+](https://img.shields.io/badge/python-3.7+-blue.svg)](https://www.python.org/downloads/release/python-370/) [![Nebius AI](https://img.shields.io/badge/Nebius%20AI-LLM-brightgreen)](https://cloud.nebius.ai/services/llm-embedding) [![OpenAI](https://img.shields.io/badge/OpenAI-API-lightgrey)](https://openai.com/) [![Medium](https://img.shields.io/badge/Medium-Blog-black?logo=medium)](https://medium.com/@fareedkhandev/maximizing-simple-rag-performance-using-rl-rewards-in-python-d4c14cbadf59)\n", + "\n", + "A simple RAG works in three simple steps:\n", + "\n", + "1. **Indexing**: Break documents into chunks and convert to vector embeddings.\n", + "\n", + "2. **Retrieval**: When a question is asked, find the most relevant chunks.\n", + "\n", + "3. **Generation**: Combine the question with retrieved chunks and let the AI generate an answer using this information.\n", + "\n", + "The actual problem is to generate an answer to a given question using the provided documents. Simple RAG often fails to generate accurate answers due to the lack of context in the retrieved chunks. In this notebook, we will use the `RL RAG` approach to generate answers to the given questions using the provided documents." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Table of Contents\n", + "\n", + "- [Setting Up the Environment](#setting-up-the-environment)\n", + "- [Data Preprocessing](#data-preprocessing)\n", + "- [Document Embedding Generation](#document-embedding-generation)\n", + "- [Vector Store Implementation](#vector-store-implementation)\n", + "- [Simple Retrieval Implementation](#simple-retrieval-implementation)\n", + " - [Cosine Similarity](#cosine-similarity)\n", + " - [Similarity Search](#similarity-search)\n", + " - [LLM Response Generation](#llm-response-generation)\n", + " - [Basic RAG Pipeline](#basic-rag-pipeline)\n", + " - [Evaluation of Basic RAG](#evaluate-the-basic-rag-pipeline)\n", + "- [Reinforcement Learning for RAG](#reinforcement-learning-for-rag)\n", + " - [State, Action Space, and Reward Methodology](#state-action-space-and-reward-methodology)\n", + " - [Policy Network](#policy-network)\n", + " - [Single RL Step](#single-rl-step)\n", + " - [Training Parameters and Policy Update](#training-parameters-and-policy-update)\n", + " - [Training Loop](#training-loop)\n", + " - [Performance Comparison Logic](#performance-comparison-logic)\n", + "- [Evaluation Framework](#evaluation-framework)\n", + "- [Evaluating RL vs Simple RAG](#evaluating-rl-vs-simple-rag)\n", + "- [Saving Comparison Results](#saving-the-comparison-results)\n", + "- [Conclusion](#what-can-we-conclude)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting Up the Environment\n", + "\n", + "First, we need to import the necessary libraries and set up the environment. We will be using HuggingFace Models hosted under **Nebius** platform. Obviously, you can use your own models as long as they are compatible with OpenAI's API." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Importing the os module for interacting with the operating system\n", + "import os\n", + "\n", + "# Importing the OpenAI module for working with OpenAI's API\n", + "from openai import OpenAI\n", + "\n", + "# Importing numpy for numerical operations\n", + "import numpy as np\n", + "\n", + "# Importing json for working with JSON data\n", + "import json\n", + "\n", + "# Typing module for type hints\n", + "from typing import Dict, List, Tuple, Optional, Union" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we need to initialize the client responsible for response and embedding generation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Set up the API connection using the OpenAI client\n", + "# Replace the base_url and api_key with your own values\n", + "\n", + "client = OpenAI(\n", + " base_url=\"https://api.studio.nebius.com/v1/\", # Base URL for (eg. ollama api, anyother llm api provider)\n", + " api_key= os.environ[\"OPENAI_API_KEY\"] # API key for authentication \n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Preprocessing\n", + "Now that we have moved onto the data preprocessing stage, we need to load the data and preprocess it. Let's create a function that will load all the `.txt` files from a directory and return a list of documents." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to load documents from a directory\n", + "def load_documents(directory_path: str) -> List[str]:\n", + " \"\"\"\n", + " Load all text documents from the specified directory.\n", + "\n", + " Args:\n", + " directory_path (str): Path to the directory containing text files.\n", + "\n", + " Returns:\n", + " List[str]: A list of strings, where each string is the content of a text file.\n", + " \"\"\"\n", + " documents = [] # Initialize an empty list to store document contents\n", + " for filename in os.listdir(directory_path): # Iterate through all files in the directory\n", + " if filename.endswith(\".txt\"): # Check if the file has a .txt extension\n", + " # Open the file in read mode with UTF-8 encoding and append its content to the list\n", + " with open(os.path.join(directory_path, filename), 'r', encoding='utf-8') as file:\n", + " documents.append(file.read())\n", + " return documents # Return the list of document contents" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We need to create a function that performs chunking of the documents once they are loaded. We are using a `chunk_size` of `100` characters, but you can adjust it as per your requirements." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to split documents into chunks\n", + "def split_into_chunks(documents: List[str], chunk_size: int = 30) -> List[str]:\n", + " \"\"\"\n", + " Split documents into smaller chunks of specified size.\n", + "\n", + " Args:\n", + " documents (List[str]): A list of document strings to be split into chunks.\n", + " chunk_size (int): The maximum number of words in each chunk. Default is 100.\n", + "\n", + " Returns:\n", + " List[str]: A list of chunks, where each chunk is a string containing up to `chunk_size` words.\n", + " \"\"\"\n", + " chunks = [] # Initialize an empty list to store the chunks\n", + " for doc in documents: # Iterate through each document\n", + " words = doc.split() # Split the document into words\n", + " # Create chunks of the specified size\n", + " for i in range(0, len(words), chunk_size):\n", + " chunk = \" \".join(words[i:i + chunk_size]) # Join words to form a chunk\n", + " chunks.append(chunk) # Add the chunk to the list\n", + " return chunks # Return the list of chunks" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This step is **optional**, where we preprocess each chunk by removing special characters, converting to lowercase, etc." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to preprocess text (e.g., lowercasing, removing special characters)\n", + "def preprocess_text(text: str) -> str:\n", + " \"\"\"\n", + " Preprocess the input text by converting it to lowercase and removing special characters.\n", + "\n", + " Args:\n", + " text (str): The input text to preprocess.\n", + "\n", + " Returns:\n", + " str: The preprocessed text with only alphanumeric characters and spaces.\n", + " \"\"\"\n", + " # Convert the text to lowercase\n", + " text = text.lower()\n", + " # Remove special characters, keeping only alphanumeric characters and spaces\n", + " text = ''.join(char for char in text if char.isalnum() or char.isspace())\n", + " return text" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "However, if you are using the previous preprocessing step, you can simply create a function to preprocess the entire document." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to preprocess all chunks\n", + "def preprocess_chunks(chunks: List[str]) -> List[str]:\n", + " \"\"\"\n", + " Apply preprocessing to all text chunks.\n", + "\n", + " Args:\n", + " chunks (List[str]): A list of text chunks to preprocess.\n", + "\n", + " Returns:\n", + " List[str]: A list of preprocessed text chunks.\n", + " \"\"\"\n", + " # Apply the preprocess_text function to each chunk in the list\n", + " return [preprocess_text(chunk) for chunk in chunks]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we have implemented all the functions for data preprocessing, we can load the documents from the directory, split them into chunks, and preprocess the chunks." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Specify the directory path containing the text files\n", + "directory_path = \"data\"\n", + "\n", + "# Load all text documents from the specified directory\n", + "documents = load_documents(directory_path)\n", + "\n", + "# Split the loaded documents into smaller chunks of text\n", + "chunks = split_into_chunks(documents)\n", + "\n", + "# Preprocess the chunks (e.g., lowercasing, removing special characters)\n", + "preprocessed_chunks = preprocess_chunks(chunks)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Print the first 200 characters of the first two chunks" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Chunk 1: quantum computing principles progress and possibil ... \n", + "--------------------------------------------------\n", + "Chunk 2: process information in binary digits bits quantum ... \n", + "--------------------------------------------------\n" + ] + } + ], + "source": [ + "# Print the first 2 preprocessed chunks, displaying only the first 200 characters of each chunk\n", + "for i in range(2):\n", + " # Use slicing to limit the output to the first 200\n", + " print(f\"Chunk {i+1}: {preprocessed_chunks[i][:50]} ... \")\n", + " print(\"-\" * 50) # Print a separator line" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Document Embedding Generation\n", + "\n", + "In the previous step, we chunked our document. Now it's time to generate embeddings for the chunk dataset. When working with RAG, our knowledge base is typically quite large. Therefore, we need to perform embedding generation in batches. Let's create a core function to generate embeddings for the chunks in batches.\n", + "\n", + "The embedding model we are using is `BAAI/bge-en-icl`." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to generate embeddings for a single batch of text chunks\n", + "def generate_embeddings_batch(chunks_batch: List[str], model: str = \"BAAI/bge-en-icl\") -> List[List[float]]:\n", + " \"\"\"\n", + " Generate embeddings for a batch of text chunks using the OpenAI client.\n", + "\n", + " Args:\n", + " chunks_batch (List[str]): A batch of text chunks to generate embeddings for.\n", + " model (str): The model to use for embedding generation. Default is \"BAAI/bge-en-icl\".\n", + "\n", + " Returns:\n", + " List[List[float]]: A list of embeddings, where each embedding is a list of floats.\n", + " \"\"\"\n", + " # Use the OpenAI client to create embeddings for the input batch\n", + " response = client.embeddings.create(\n", + " model=model, # Specify the model to use for embedding generation\n", + " input=chunks_batch # Provide the batch of text chunks as input\n", + " )\n", + " # Extract embeddings from the response and return them\n", + " embeddings = [item.embedding for item in response.data]\n", + " return embeddings" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we will define a function to generate embeddings for all text chunks in batches. This function will take a list of text chunks as input and generate embeddings for each batch of chunks using the OpenAI client. The function will return a list of embeddings corresponding to all the text chunks." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to generate embeddings for all chunks with batching\n", + "def generate_embeddings(chunks: List[str], batch_size: int = 10) -> np.ndarray:\n", + " \"\"\"\n", + " Generate embeddings for all text chunks in batches.\n", + "\n", + " Args:\n", + " chunks (List[str]): A list of text chunks to generate embeddings for.\n", + " batch_size (int): The number of chunks to process in each batch. Default is 10.\n", + "\n", + " Returns:\n", + " np.ndarray: A NumPy array containing embeddings for all chunks.\n", + " \"\"\"\n", + " all_embeddings = [] # Initialize an empty list to store all embeddings\n", + "\n", + " # Iterate through the chunks in batches\n", + " for i in range(0, len(chunks), batch_size):\n", + " # Extract the current batch of chunks\n", + " batch = chunks[i:i + batch_size]\n", + " # Generate embeddings for the current batch\n", + " embeddings = generate_embeddings_batch(batch)\n", + " # Extend the list of all embeddings with the embeddings from the current batch\n", + " all_embeddings.extend(embeddings)\n", + "\n", + " # Convert the list of embeddings to a NumPy array and return it\n", + " return np.array(all_embeddings)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's create another function to save the embeddings to a file in JSON format." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to save embeddings to a file\n", + "def save_embeddings(embeddings: np.ndarray, output_file: str) -> None:\n", + " \"\"\"\n", + " Save embeddings to a JSON file.\n", + "\n", + " Args:\n", + " embeddings (np.ndarray): A NumPy array containing the embeddings to save.\n", + " output_file (str): The path to the output JSON file where embeddings will be saved.\n", + "\n", + " Returns:\n", + " None\n", + " \"\"\"\n", + " # Open the specified file in write mode with UTF-8 encoding\n", + " with open(output_file, 'w', encoding='utf-8') as file:\n", + " # Convert the NumPy array to a list and save it as JSON\n", + " json.dump(embeddings.tolist(), file)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we have implemented all the functions for embedding generation, we can proceed to generate embeddings for the preprocessed text chunks and save them to a JSON file." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# Ensure the chunks are preprocessed before generating embeddings\n", + "preprocessed_chunks = preprocess_chunks(chunks)\n", + "\n", + "# Generate embeddings for the preprocessed chunks\n", + "embeddings = generate_embeddings(preprocessed_chunks)\n", + "\n", + "# Save the generated embeddings to a JSON file named \"embeddings.json\"\n", + "save_embeddings(embeddings, \"embeddings.json\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Vector Store Implementation\n", + "Since we are not using any python libraries for vector storage, we will implement a simple vector store using a dictionary." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize an in-memory vector store as a dictionary\n", + "# The keys will be unique identifiers (integers), and the values will be dictionaries containing embeddings and corresponding text chunks\n", + "vector_store: dict[int, dict[str, object]] = {}\n", + "\n", + "# Function to add embeddings and corresponding text chunks to the vector store\n", + "def add_to_vector_store(embeddings: np.ndarray, chunks: List[str]) -> None:\n", + " \"\"\"\n", + " Add embeddings and their corresponding text chunks to the vector store.\n", + "\n", + " Args:\n", + " embeddings (np.ndarray): A NumPy array containing the embeddings to add.\n", + " chunks (List[str]): A list of text chunks corresponding to the embeddings.\n", + "\n", + " Returns:\n", + " None\n", + " \"\"\"\n", + " # Iterate over embeddings and chunks simultaneously\n", + " for embedding, chunk in zip(embeddings, chunks):\n", + " # Add each embedding and its corresponding chunk to the vector store\n", + " # Use the current length of the vector store as the unique key\n", + " vector_store[len(vector_store)] = {\"embedding\": embedding, \"chunk\": chunk}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Simple Retrieval Implementation\n", + "\n", + "We do know for retrieving the most similar text chunks to a given query, we can use the cosine similarity between the query embedding and the embeddings of all text chunks. The higher the cosine similarity, the more similar the text chunks are. We can then sort the chunks based on their similarity scores and return the top-k most similar chunks.\n", + " \n", + "So, let's implement a simple cosine similarity-based retrieval function." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "vscode": { + "languageId": "tex" + } + }, + "source": [ + "The cosine similarity between two vectors $A$ and $B$ is calculated as:\n", + "\n", + "$$\\text{cosine similarity} = \\frac{A \\cdot B}{||A|| \\times ||B||} = \\frac{\\sum_{i=1}^{n} A_i B_i}{\\sqrt{\\sum_{i=1}^{n} A_i^2} \\times \\sqrt{\\sum_{i=1}^{n} B_i^2}}$$\n", + "\n", + "Where:\n", + "- $A \\cdot B$ is the dot product of vectors $A$ and $B$\n", + "- $||A||$ and $||B||$ are the Euclidean norms (magnitudes) of the vectors\n", + "- $n$ is the dimension of the vectors" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to compute cosine similarity between two vectors\n", + "def cosine_similarity(vec1: np.ndarray, vec2: np.ndarray) -> float:\n", + " \"\"\"\n", + " Compute the cosine similarity between two vectors.\n", + "\n", + " Args:\n", + " vec1 (np.ndarray): The first vector.\n", + " vec2 (np.ndarray): The second vector.\n", + "\n", + " Returns:\n", + " float: The cosine similarity between the two vectors, ranging from -1 to 1.\n", + " \"\"\"\n", + " # Compute the dot product of the two vectors\n", + " dot_product = np.dot(vec1, vec2)\n", + " # Compute the magnitude (norm) of the first vector\n", + " norm_vec1 = np.linalg.norm(vec1)\n", + " # Compute the magnitude (norm) of the second vector\n", + " norm_vec2 = np.linalg.norm(vec2)\n", + " # Return the cosine similarity as the ratio of the dot product to the product of the norms\n", + " return dot_product / (norm_vec1 * norm_vec2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When we calculate the cosine similarity between a query and all the chunks, we can perform a similarity search. Based on the `top_k` parameter, we retrieve the top k most similar chunks." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to perform similarity search in the vector store\n", + "def similarity_search(query_embedding: np.ndarray, top_k: int = 5) -> List[str]:\n", + " \"\"\"\n", + " Perform similarity search in the vector store and return the top_k most similar chunks.\n", + "\n", + " Args:\n", + " query_embedding (np.ndarray): The embedding vector of the query.\n", + " top_k (int): The number of most similar chunks to retrieve. Default is 5.\n", + "\n", + " Returns:\n", + " List[str]: A list of the top_k most similar text chunks.\n", + " \"\"\"\n", + " similarities = [] # Initialize a list to store similarity scores and corresponding keys\n", + "\n", + " # Iterate through all items in the vector store\n", + " for key, value in vector_store.items():\n", + " # Compute the cosine similarity between the query embedding and the stored embedding\n", + " similarity = cosine_similarity(query_embedding, value[\"embedding\"])\n", + " # Append the key and similarity score as a tuple to the list\n", + " similarities.append((key, similarity))\n", + "\n", + " # Sort the list of similarities in descending order based on the similarity score\n", + " similarities = sorted(similarities, key=lambda x: x[1], reverse=True)\n", + "\n", + " # Retrieve the top_k most similar chunks based on their keys\n", + " return [vector_store[key][\"chunk\"] for key, _ in similarities[:top_k]]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once we have the similarity search function ready, we can simply code a retrieval function on top of it that will provide the relevant chunks based on the query." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to retrieve relevant document chunks for a query\n", + "def retrieve_relevant_chunks(query_text: str, top_k: int = 5) -> List[str]:\n", + " \"\"\"\n", + " Retrieve the most relevant document chunks for a given query text.\n", + "\n", + " Args:\n", + " query_text (str): The query text for which relevant chunks are to be retrieved.\n", + " top_k (int): The number of most relevant chunks to retrieve. Default is 5.\n", + "\n", + " Returns:\n", + " List[str]: A list of the top_k most relevant text chunks.\n", + " \"\"\"\n", + " # Generate embedding for the query text using the embedding model\n", + " query_embedding = generate_embeddings([query_text])[0]\n", + " \n", + " # Perform similarity search to find the most relevant chunks\n", + " relevant_chunks = similarity_search(query_embedding, top_k=top_k)\n", + " \n", + " # Return the list of relevant chunks\n", + " return relevant_chunks" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we have implemented all the functions for retrieval, we can proceed to test the retrieval system with a sample query." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Chunk 1: quantum computing principles progress and possibil ... \n", + "--------------------------------------------------\n", + "Chunk 2: through distinct stages 1 nisq era current 2 error ... \n", + "--------------------------------------------------\n", + "Chunk 3: quantum advantage and practical applications quant ... \n", + "--------------------------------------------------\n", + "Chunk 4: process information in binary digits bits quantum ... \n", + "--------------------------------------------------\n", + "Chunk 5: measuring the correct answer quantum gates and cir ... \n", + "--------------------------------------------------\n" + ] + } + ], + "source": [ + "# Add the generated embeddings and their corresponding preprocessed chunks to the vector store\n", + "add_to_vector_store(embeddings, preprocessed_chunks)\n", + "\n", + "# Define a query text for which we want to retrieve relevant document chunks\n", + "query_text = \"What is Quantum Computing?\"\n", + "\n", + "# Retrieve the most relevant chunks from the vector store based on the query text\n", + "relevant_chunks = retrieve_relevant_chunks(query_text)\n", + "\n", + "# Print the first 50 characters of each retrieved relevant chunk\n", + "for idx, chunk in enumerate(relevant_chunks):\n", + " print(f\"Chunk {idx + 1}: {chunk[:50]} ... \")\n", + " print(\"-\" * 50) # Print a separator line" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## LLM Response Generation\n", + "\n", + "When we have a query and a set of relevant document chunks, we can use a large language model (LLM) to generate a response based on the query and the retrieved information. In this section, we will use the OpenAI API to generate a response to a query by providing the query text and the relevant document chunks as context to the LLM.\n", + "\n", + "First we need a function to construct the input prompt for the LLM, which includes the query text and the relevant document chunks as context." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to construct a prompt with context\n", + "def construct_prompt(query: str, context_chunks: List[str]) -> str:\n", + " \"\"\"\n", + " Construct a prompt by combining the query with the retrieved context chunks.\n", + "\n", + " Args:\n", + " query (str): The query text for which the prompt is being constructed.\n", + " context_chunks (List[str]): A list of relevant context chunks to include in the prompt.\n", + "\n", + " Returns:\n", + " str: The constructed prompt to be used as input for the LLM.\n", + " \"\"\"\n", + " # Combine all context chunks into a single string, separated by newlines\n", + " context = \"\\n\".join(context_chunks)\n", + " \n", + " # Define the system message to guide the LLM's behavior\n", + " system_message = (\n", + " \"You are a helpful assistant. Only use the provided context to answer the question. \"\n", + " \"If the context doesn't contain the information needed, say 'I don't have enough information to answer this question.'\"\n", + " )\n", + " \n", + " # Construct the final prompt by combining the system message, context, and query\n", + " prompt = f\"System: {system_message}\\n\\nContext:\\n{context}\\n\\nQuestion:\\n{query}\\n\\nAnswer:\"\n", + " \n", + " return prompt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To generate an LLM response, we need to implement a function that takes the constructed input prompt and sends it to the OpenAI API for response generation." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to generate a response using the OpenAI chat model\n", + "def generate_response(\n", + " prompt: str,\n", + " model: str = \"google/gemma-2-2b-it\",\n", + " max_tokens: int = 512,\n", + " temperature: float = 1,\n", + " top_p: float = 0.9,\n", + " top_k: int = 50\n", + ") -> str:\n", + " \"\"\"\n", + " Generate a response from the OpenAI chat model based on the constructed prompt.\n", + "\n", + " Args:\n", + " prompt (str): The input prompt to provide to the chat model.\n", + " model (str): The model to use for generating the response. Default is \"google/gemma-2-2b-it\".\n", + " max_tokens (int): Maximum number of tokens in the response. Default is 512.\n", + " temperature (float): Sampling temperature for response diversity. Default is 0.5.\n", + " top_p (float): Probability mass for nucleus sampling. Default is 0.9.\n", + " top_k (int): Number of highest probability tokens to consider. Default is 50.\n", + "\n", + " Returns:\n", + " str: The generated response from the chat model.\n", + " \"\"\"\n", + " # Use the OpenAI client to create a chat completion\n", + " response = client.chat.completions.create(\n", + " model=model, # Specify the model to use for generating the response\n", + " max_tokens=max_tokens, # Maximum number of tokens in the response\n", + " temperature=temperature, # Sampling temperature for response diversity\n", + " top_p=top_p, # Probability mass for nucleus sampling\n", + " extra_body={ # Additional parameters for the request\n", + " \"top_k\": top_k # Number of highest probability tokens to consider\n", + " },\n", + " messages=[ # List of messages to provide context for the chat model\n", + " {\n", + " \"role\": \"user\", # Role of the message sender (user in this case)\n", + " \"content\": [ # Content of the message\n", + " {\n", + " \"type\": \"text\", # Type of content (text in this case)\n", + " \"text\": prompt # The actual prompt text\n", + " }\n", + " ]\n", + " }\n", + " ]\n", + " )\n", + " # Return the content of the first choice in the response\n", + " return response.choices[0].message.content" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Basic RAG Pipeline\n", + "\n", + "We cannot run small pieces of code repeatedly. Therefore, we need to create a simple RAG pipeline that takes only one parameter, which is our query, and returns the LLM response." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to implement the basic Retrieval-Augmented Generation (RAG) pipeline\n", + "def basic_rag_pipeline(query: str) -> str:\n", + " \"\"\"\n", + " Implement the basic Retrieval-Augmented Generation (RAG) pipeline:\n", + " retrieve relevant chunks, construct a prompt, and generate a response.\n", + "\n", + " Args:\n", + " query (str): The input query for which a response is to be generated.\n", + "\n", + " Returns:\n", + " str: The generated response from the LLM based on the query and retrieved context.\n", + " \"\"\"\n", + " # Step 1: Retrieve the most relevant chunks for the given query\n", + " relevant_chunks: List[str] = retrieve_relevant_chunks(query)\n", + " \n", + " # Step 2: Construct a prompt using the query and the retrieved chunks\n", + " prompt: str = construct_prompt(query, relevant_chunks)\n", + " \n", + " # Step 3: Generate a response from the LLM using the constructed prompt\n", + " response: str = generate_response(prompt)\n", + " \n", + " # Return the generated response\n", + " return response" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluate the basic RAG pipeline\n", + "\n", + "Now that we have coded the basic RAG pipeline, we can use it for evaluation. Our evaluation queries contain different targeted segments, such as `factual_queries` and `complex_nature`. We are going to test the factual knowledge of our RAG pipeline.\n", + "\n", + "Let's load our evaluation queries and their expected answers." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sample Query: What is the mathematical representation of a qubit in superposition?\n", + "\n", + "Expected Answer: |ψ⟩ = α|0⟩ + β|1⟩, where α and β are complex numbers satisfying |α|² + |β|² = 1, representing the probability amplitudes for measuring the qubit in state |0⟩ or |1⟩ respectively.\n", + "\n" + ] + } + ], + "source": [ + "# Open the validation data file in read mode and load its content as a dictionary\n", + "with open('data/val.json', 'r') as file:\n", + " validation_data = json.load(file)\n", + "\n", + "# Test the basic RAG pipeline with a sample query\n", + "sample_query = validation_data['basic_factual_questions'][0]['question'] # Extract the query text\n", + "expected_answer = validation_data['basic_factual_questions'][0]['answer'] # Extract the ground truth answer\n", + "\n", + "# print the sample query and expected answer\n", + "print(f\"Sample Query: {sample_query}\\n\")\n", + "print(f\"Expected Answer: {expected_answer}\\n\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's test the basic RAG pipeline with this eval query and see how well it performs." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🔍 Running the Retrieval-Augmented Generation (RAG) pipeline...\n", + "📥 Query: What is the mathematical representation of a qubit in superposition?\n", + "\n", + "🤖 AI Response:\n", + "--------------------------------------------------\n", + "ψ α0 β1\n", + "--------------------------------------------------\n", + "✅ Ground Truth Answer:\n", + "--------------------------------------------------\n", + "|ψ⟩ = α|0⟩ + β|1⟩, where α and β are complex numbers satisfying |α|² + |β|² = 1, representing the probability amplitudes for measuring the qubit in state |0⟩ or |1⟩ respectively.\n", + "--------------------------------------------------\n" + ] + } + ], + "source": [ + "# Print a message to indicate the start of the RAG pipeline\n", + "print(\"🔍 Running the Retrieval-Augmented Generation (RAG) pipeline...\")\n", + "print(f\"📥 Query: {sample_query}\\n\")\n", + "\n", + "# Run the RAG pipeline and get the response\n", + "response = basic_rag_pipeline(sample_query)\n", + "\n", + "# Print the response with better formatting\n", + "print(\"🤖 AI Response:\")\n", + "print(\"-\" * 50)\n", + "print(response.strip())\n", + "print(\"-\" * 50)\n", + "\n", + "# Print the ground truth answer for comparison\n", + "print(\"✅ Ground Truth Answer:\")\n", + "print(\"-\" * 50)\n", + "print(expected_answer)\n", + "print(\"-\" * 50)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The simple RAG pipeline doesn't seem to perform well in its current state. The generated response is not only irrelevant to the ground truth but also misses critical information.\n", + "\n", + "But don't worry! In the upcoming steps, we will implement a Reinforcement Learning-based RAG pipeline to address these shortcomings. This will help us improve the retrieval and generation process, making the responses more accurate and contextually relevant.\n", + "\n", + "Stay tuned as we take our RAG pipeline to the next level! 🚀" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "vscode": { + "languageId": "julia" + } + }, + "source": [ + "## Reinforcement Learning for RAG\n", + "\n", + "Reinforcement Learning (RL) is a type of machine learning where an agent learns to make decisions by taking actions in an environment to maximize some notion of cumulative reward. Unlike supervised learning, the agent is not explicitly told which actions to take, but instead must discover which actions yield the most reward through trial and error.\n", + "\n", + "Follow are the main components of a reinforcement learning system:\n", + "\n", + "1. **Agent**: The learner or decision-maker\n", + "2. **Environment**: The world with which the agent interacts\n", + "3. **State (S)**: The current situation of the agent in the environment\n", + "4. **Action (A)**: A set of possible moves the agent can make\n", + "5. **Reward (R)**: Feedback from the environment after each action\n", + "6. **Policy (π)**: Strategy that the agent follows to determine the next action\n", + "\n", + "The goal in reinforcement learning is to learn a policy π that maximizes the expected cumulative reward:\n", + "\n", + "$$\\pi^* = \\arg\\max_\\pi \\mathbb{E}\\left[ \\sum_{t=0}^{T} \\gamma^t R_t \\right]$$\n", + "\n", + "Where:\n", + "- $\\pi^*$ is the optimal policy\n", + "- $\\gamma$ is the discount factor (0 ≤ γ ≤ 1)\n", + "- $R_t$ is the reward at time step t\n", + "- $T$ is the final time step\n", + "\n", + "In the context of RAG systems, reinforcement learning can be used to:\n", + "- Improve retrieval by learning which documents are most helpful\n", + "- Refine prompt construction based on user feedback\n", + "- Optimize the generation process by learning from successful responses" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## State, Action Space, and Reward Methodology\n", + "\n", + "The very first step when coding an RL algorithm is to define three things:\n", + "\n", + "- **State**: It is the current situation of the environment. In our case, the initial state is our simple RAG pipeline (query, context, response).\n", + "- **Action Space**: It is the decision that the agent takes based on the state. In our case, the actions can include changing the model, modifying the context, altering the query, etc.\n", + "- **Reward**: It is the feedback that the agent receives after taking an action. In our case, the reward can be the similarity between the generated response and the ground truth answer." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our state will be changing constantly as we perform training. For that, we need to save the state after each `training episode` so that our RL agent can learn from it and avoid making the same mistakes again." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to define the state representation for reinforcement learning\n", + "def define_state(\n", + " query: str, \n", + " context_chunks: List[str], \n", + " rewritten_query: str = None, \n", + " previous_responses: List[str] = None, \n", + " previous_rewards: List[float] = None\n", + ") -> dict:\n", + " \"\"\"\n", + " Define the state representation for the reinforcement learning agent.\n", + " \n", + " Args:\n", + " query (str): The original user query.\n", + " context_chunks (List[str]): Retrieved context chunks from the knowledge base.\n", + " rewritten_query (str, optional): A reformulated version of the original query.\n", + " previous_responses (List[str], optional): List of previously generated responses.\n", + " previous_rewards (List[float], optional): List of rewards received for previous actions.\n", + " \n", + " Returns:\n", + " dict: A dictionary representing the current state with all relevant information.\n", + " \"\"\"\n", + " state = {\n", + " \"original_query\": query, # The initial query from the user\n", + " \"current_query\": rewritten_query if rewritten_query else query, # Current version of the query (may be rewritten)\n", + " \"context\": context_chunks, # Retrieved context chunks from the knowledge base\n", + " \"previous_responses\": previous_responses if previous_responses else [], # History of generated responses\n", + " \"previous_rewards\": previous_rewards if previous_rewards else [] # History of received rewards\n", + " }\n", + " return state" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We have defined the state representation for the RL agent, including the user query, retrieved context chunks, rewritten query (if any), and histories of responses and rewards. This state will guide the agent in generating better responses. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next we need to define the action space for the reinforcement learning agent. The action space consists of the set of possible actions that the agent can take at each step. In this case, we define four actions:\n", + "- `rewrite_query`: Reformulate the original query to improve retrieval\n", + "- `expand_context`: Retrieve additional context chunks\n", + "- `filter_context`: Remove irrelevant context chunks\n", + "- `generate_response`: Generate a response based on the current query and context" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to define the action space for reinforcement learning\n", + "def define_action_space() -> List[str]:\n", + " \"\"\"\n", + " Define the set of possible actions the reinforcement learning agent can take.\n", + " \n", + " Actions include:\n", + " - rewrite_query: Reformulate the original query to improve retrieval\n", + " - expand_context: Retrieve additional context chunks\n", + " - filter_context: Remove irrelevant context chunks\n", + " - generate_response: Generate a response based on current query and context\n", + " \n", + " Returns:\n", + " List[str]: A list of available actions.\n", + " \"\"\"\n", + "\n", + " # Define the set of actions the agent can take\n", + " actions = [\"rewrite_query\", \"expand_context\", \"filter_context\", \"generate_response\"]\n", + " return actions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Obviously, when our RL agent takes an action, it will be based on the current state and the action space. It will be rewarded based on the quality of the response generated by the RAG pipeline. The reward function will be based on the cosine similarity between the generated response and the ground truth answer." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to calculate the reward based on response quality\n", + "def calculate_reward(response: str, ground_truth: str) -> float:\n", + " \"\"\"\n", + " Calculate a reward value by comparing the generated response to the ground truth.\n", + " \n", + " Uses cosine similarity between the embeddings of the response and ground truth\n", + " to determine how close the response is to the expected answer.\n", + " \n", + " Args:\n", + " response (str): The generated response from the RAG pipeline.\n", + " ground_truth (str): The expected correct answer.\n", + " \n", + " Returns:\n", + " float: A reward value between -1 and 1, where higher values indicate \n", + " greater similarity to the ground truth.\n", + " \"\"\"\n", + " # Generate embeddings for both the response and ground truth\n", + " response_embedding = generate_embeddings([response])[0]\n", + " ground_truth_embedding = generate_embeddings([ground_truth])[0]\n", + " \n", + " # Calculate cosine similarity between the embeddings as the reward\n", + " similarity = cosine_similarity(response_embedding, ground_truth_embedding)\n", + " return similarity" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our goal is to maximize the reward by generating responses that are similar to the ground truth answer. Higher reward values indicate that the generated response is more aligned with the expected answer." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Action Function Logic\n", + "\n", + "Now that we have defined the action space, we need to implement the logic for each action. This logic will determine how the RAG pipeline should be modified based on the action taken by the RL agent.\n", + "\n", + "Just to revisit, the four actions are:\n", + "- `rewrite_query`: Reformulate the original query to improve retrieval\n", + "- `expand_context`: Retrieve additional context chunks\n", + "- `filter_context`: Remove irrelevant context chunks\n", + "- `generate_response`: Generate a response based on the current query and context" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's create our first action logic for the agent. The first action we will implement is the `rewrite_query` action, which involves reformulating the original user query to improve retrieval performance. This action is crucial for enhancing the relevance of the retrieved context and generating more accurate responses." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to rewrite the query for better document retrieval\n", + "def rewrite_query(\n", + " query: str, \n", + " context_chunks: List[str], \n", + " model: str = \"google/gemma-2-2b-it\", \n", + " max_tokens: int = 100, \n", + " temperature: float = 0.3\n", + ") -> str:\n", + " \"\"\"\n", + " Use the LLM to rewrite the query for better document retrieval.\n", + "\n", + " Args:\n", + " query (str): The original query text.\n", + " context_chunks (List[str]): A list of context chunks retrieved so far.\n", + " model (str): The model to use for generating the rewritten query. Default is \"google/gemma-2-2b-it\".\n", + " max_tokens (int): Maximum number of tokens in the rewritten query. Default is 100.\n", + " temperature (float): Sampling temperature for response diversity. Default is 0.3.\n", + "\n", + " Returns:\n", + " str: The rewritten query optimized for document retrieval.\n", + " \"\"\"\n", + " # Construct a prompt for the LLM to rewrite the query\n", + " rewrite_prompt = f\"\"\"\n", + " You are a query optimization assistant. Your task is to rewrite the given query to make it more effective \n", + " for retrieving relevant information. The query will be used for document retrieval.\n", + " \n", + " Original query: {query}\n", + " \n", + " Based on the context retrieved so far:\n", + " {' '.join(context_chunks[:2]) if context_chunks else 'No context available yet'}\n", + " \n", + " Rewrite the query to be more specific and targeted to retrieve better information.\n", + " Rewritten query:\n", + " \"\"\"\n", + " \n", + " # Use the LLM to generate a rewritten query\n", + " response = client.chat.completions.create(\n", + " model=model, # Specify the model to use for generating the response\n", + " max_tokens=max_tokens, # Maximum number of tokens in the response\n", + " temperature=temperature, # Sampling temperature for response diversity\n", + " messages=[\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": rewrite_prompt\n", + " }\n", + " ]\n", + " )\n", + " \n", + " # Extract and return the rewritten query from the response\n", + " rewritten_query = response.choices[0].message.content.strip()\n", + " return rewritten_query" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This action is crucial for enhancing the relevance of the retrieved context and generating more accurate responses." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's code our next action logic, which is to expand the context by retrieving additional chunks. We will use the existing function `retrieve_relevant_chunks` to get more context chunks and then filter out any duplicates from the current context. We will limit the number of new chunks to be added to the context to a specified top_k value." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to expand the context by retrieving additional chunks\n", + "def expand_context(query: str, current_chunks: List[str], top_k: int = 3) -> List[str]:\n", + " \"\"\"\n", + " Expand the context by retrieving additional chunks.\n", + "\n", + " Args:\n", + " query (str): The query text for which additional context is needed.\n", + " current_chunks (List[str]): The current list of context chunks.\n", + " top_k (int): The number of additional chunks to retrieve. Default is 3.\n", + "\n", + " Returns:\n", + " List[str]: The expanded list of context chunks including new unique chunks.\n", + " \"\"\"\n", + " # Retrieve more chunks than currently available\n", + " additional_chunks = retrieve_relevant_chunks(query, top_k=top_k + len(current_chunks))\n", + " \n", + " # Filter out chunks that are already in the current context\n", + " new_chunks = []\n", + " for chunk in additional_chunks:\n", + " if chunk not in current_chunks:\n", + " new_chunks.append(chunk)\n", + " \n", + " # Add new unique chunks to the current context, limited to top_k\n", + " expanded_context = current_chunks + new_chunks[:top_k]\n", + " return expanded_context" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We need to filter the context to keep only the most relevant chunks for the query. This filtering step is crucial to ensure that the context provided to the language model is concise and focused on the most relevant information." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to filter the context to keep only the most relevant chunks\n", + "def filter_context(query: str, context_chunks: List[str]) -> List[str]:\n", + " \"\"\"\n", + " Filter the context to keep only the most relevant chunks.\n", + "\n", + " Args:\n", + " query (str): The query text for which relevance is calculated.\n", + " context_chunks (List[str]): The list of context chunks to filter.\n", + "\n", + " Returns:\n", + " List[str]: A filtered list of the most relevant context chunks.\n", + " \"\"\"\n", + " if not context_chunks:\n", + " return []\n", + " \n", + " # Generate embeddings for the query and each chunk\n", + " query_embedding = generate_embeddings([query])[0]\n", + " chunk_embeddings = [generate_embeddings([chunk])[0] for chunk in context_chunks]\n", + " \n", + " # Calculate relevance scores for each chunk\n", + " relevance_scores = []\n", + " for chunk_embedding in chunk_embeddings:\n", + " score = cosine_similarity(query_embedding, chunk_embedding)\n", + " relevance_scores.append(score)\n", + " \n", + " # Sort chunks by relevance scores in descending order\n", + " sorted_chunks = [x for _, x in sorted(zip(relevance_scores, context_chunks), reverse=True)]\n", + " \n", + " # Keep the top 5 most relevant chunks or fewer if less than 5 are available\n", + " filtered_chunks = sorted_chunks[:min(5, len(sorted_chunks))]\n", + " \n", + " return filtered_chunks" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This action will help the agent explore more information relevant to the query." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Policy Network\n", + "\n", + "Previously, we defined our state, actions, and reward logic. Next, we need to create a policy network that will select an action based on the current state.\n", + "\n", + "A policy network is a function that takes the current state and the action space as input and returns the selected action based on the state.\n", + "\n", + "The policy network can use a simple heuristic to select an action based on the current state. For example, if there are no previous responses, the policy network can prioritize rewriting the query. If the context has too many chunks, the policy network can choose to filter the context." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to define a policy network to select an action based on the state\n", + "def policy_network(\n", + " state: dict, \n", + " action_space: List[str], \n", + " epsilon: float = 0.2\n", + ") -> str:\n", + " \"\"\"\n", + " Define a policy network to select an action based on the current state using an epsilon-greedy strategy.\n", + "\n", + " Args:\n", + " state (dict): The current state of the environment, including query, context, responses, and rewards.\n", + " action_space (List[str]): The list of possible actions the agent can take.\n", + " epsilon (float): The probability of choosing a random action for exploration. Default is 0.2.\n", + "\n", + " Returns:\n", + " str: The selected action from the action space.\n", + " \"\"\"\n", + " # Use epsilon-greedy strategy: random exploration vs. exploitation\n", + " if np.random.random() < epsilon:\n", + " # Exploration: randomly select an action from the action space\n", + " action = np.random.choice(action_space)\n", + " else:\n", + " # Exploitation: select the best action based on the current state using a simple heuristic\n", + "\n", + " # If there are no previous responses, prioritize rewriting the query\n", + " if len(state[\"previous_responses\"]) == 0:\n", + " action = \"rewrite_query\"\n", + " # If there are previous responses but the rewards are low, try expanding the context\n", + " elif state[\"previous_rewards\"] and max(state[\"previous_rewards\"]) < 0.7:\n", + " action = \"expand_context\"\n", + " # If the context has too many chunks, try filtering the context\n", + " elif len(state[\"context\"]) > 5:\n", + " action = \"filter_context\"\n", + " # Otherwise, generate a response\n", + " else:\n", + " action = \"generate_response\"\n", + " \n", + " return action" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So our policy network works like this:\n", + "- If there are no previous responses, prioritize rewriting the query.\n", + "- If there are previous responses but the rewards are low, try expanding the context.\n", + "- If the context has too many chunks, try filtering the context.\n", + "- Otherwise, generate a response." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Single RL Step\n", + "\n", + "We have coded an important component of the RL pipeline. For any developer who has done any kind of training, there exists a training loop where each iteration is a single step in which the RL agent takes an action, rewards are calculated, states are updated, and so on. So, we need to code a single step of our training loop. Let's do that." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to perform a single RL step\n", + "def rl_step(\n", + " state: dict, \n", + " action_space: List[str], \n", + " ground_truth: str\n", + ") -> tuple[dict, str, float, str]:\n", + " \"\"\"\n", + " Perform a single RL step: select an action, execute it, and calculate the reward.\n", + "\n", + " Args:\n", + " state (dict): The current state of the environment, including query, context, responses, and rewards.\n", + " action_space (List[str]): The list of possible actions the agent can take.\n", + " ground_truth (str): The expected correct answer to calculate the reward.\n", + "\n", + " Returns:\n", + " tuple: A tuple containing:\n", + " - state (dict): The updated state after executing the action.\n", + " - action (str): The action selected by the policy network.\n", + " - reward (float): The reward received for the action.\n", + " - response (str): The response generated (if applicable).\n", + " \"\"\"\n", + " # Select an action using the policy network\n", + " action: str = policy_network(state, action_space)\n", + " response: str = None # Initialize response as None\n", + " reward: float = 0 # Initialize reward as 0\n", + "\n", + " # Execute the selected action\n", + " if action == \"rewrite_query\":\n", + " # Rewrite the query to improve retrieval\n", + " rewritten_query: str = rewrite_query(state[\"original_query\"], state[\"context\"])\n", + " state[\"current_query\"] = rewritten_query # Update the current query in the state\n", + " # Retrieve new context based on the rewritten query\n", + " new_context: List[str] = retrieve_relevant_chunks(rewritten_query)\n", + " state[\"context\"] = new_context # Update the context in the state\n", + "\n", + " elif action == \"expand_context\":\n", + " # Expand the context by retrieving additional chunks\n", + " expanded_context: List[str] = expand_context(state[\"current_query\"], state[\"context\"])\n", + " state[\"context\"] = expanded_context # Update the context in the state\n", + "\n", + " elif action == \"filter_context\":\n", + " # Filter the context to keep only the most relevant chunks\n", + " filtered_context: List[str] = filter_context(state[\"current_query\"], state[\"context\"])\n", + " state[\"context\"] = filtered_context # Update the context in the state\n", + "\n", + " elif action == \"generate_response\":\n", + " # Construct a prompt using the current query and context\n", + " prompt: str = construct_prompt(state[\"current_query\"], state[\"context\"])\n", + " # Generate a response using the LLM\n", + " response: str = generate_response(prompt)\n", + " # Calculate the reward based on the similarity between the response and the ground truth\n", + " reward: float = calculate_reward(response, ground_truth)\n", + " # Update the state with the new response and reward\n", + " state[\"previous_responses\"].append(response)\n", + " state[\"previous_rewards\"].append(reward)\n", + "\n", + " # Return the updated state, selected action, reward, and response\n", + " return state, action, reward, response" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In our single step function, we first select an action using the policy network. The policy network uses an epsilon-greedy strategy to balance exploration and exploitation. If the random number is less than epsilon, we choose a random action from the action space for exploration. Otherwise, we select the best action based on the current state using a simple heuristic." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Training Parameters and Policy Update\n", + "\n", + "We need to define some training parameters for our training loop and also define a function to update the policy based on the rewards received.\n", + "\n", + "Though the training parameters function is **optional**, it can be used for advanced implementations of the RL pipeline." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to initialize training parameters\n", + "def initialize_training_params() -> Dict[str, Union[float, int]]:\n", + " \"\"\"\n", + " Initialize training parameters such as learning rate, number of episodes, and discount factor.\n", + "\n", + " Returns:\n", + " Dict[str, Union[float, int]]: A dictionary containing the initialized training parameters.\n", + " \"\"\"\n", + " params = {\n", + " \"learning_rate\": 0.01, # Learning rate for policy updates\n", + " \"num_episodes\": 100, # Total number of training episodes\n", + " \"discount_factor\": 0.99 # Discount factor for future rewards\n", + " }\n", + " return params" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Similar to how our state changes after each step in the RL process, the policy also needs to be updated based on the rewards received. The update_policy function takes the current policy, state, action, reward, and learning rate as input and returns the updated policy." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to update policy based on reward\n", + "def update_policy(\n", + " policy: Dict[str, Dict[str, Union[float, str]]], \n", + " state: Dict[str, object], \n", + " action: str, \n", + " reward: float, \n", + " learning_rate: float\n", + ") -> Dict[str, Dict[str, Union[float, str]]]:\n", + " \"\"\"\n", + " Update the policy based on the reward received.\n", + "\n", + " Args:\n", + " policy (Dict[str, Dict[str, Union[float, str]]]): The current policy to be updated.\n", + " state (Dict[str, object]): The current state of the environment.\n", + " action (str): The action taken by the agent.\n", + " reward (float): The reward received for the action.\n", + " learning_rate (float): The learning rate for updating the policy.\n", + "\n", + " Returns:\n", + " Dict[str, Dict[str, Union[float, str]]]: The updated policy.\n", + " \"\"\"\n", + " # Example: Simple policy update (to be replaced with a proper RL algorithm)\n", + " policy[state[\"query\"]] = {\n", + " \"action\": action, # Store the action taken\n", + " \"reward\": reward # Store the reward received\n", + " }\n", + " return policy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the above `update_policy` logic, we store the action taken and the reward received for each query in the policy dictionary. In a more advanced RL algorithm, the policy update would involve more sophisticated methods such as policy gradients or Q-learning." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, we need to implement progress tracking logic to monitor the training process. This will help us understand how the model is learning and improving over time." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to track training progress\n", + "def track_progress(\n", + " episode: int, \n", + " reward: float, \n", + " rewards_history: List[float]\n", + ") -> List[float]:\n", + " \"\"\"\n", + " Track the training progress by storing rewards for each episode.\n", + "\n", + " Args:\n", + " episode (int): The current episode number.\n", + " reward (float): The reward received in the current episode.\n", + " rewards_history (List[float]): A list to store the rewards for all episodes.\n", + "\n", + " Returns:\n", + " List[float]: The updated rewards history.\n", + " \"\"\"\n", + " # Append the current reward to the rewards history\n", + " rewards_history.append(reward)\n", + " \n", + " # Print progress every 10 episodes\n", + " print(f\"Episode {episode}: Reward = {reward}\")\n", + " \n", + " return rewards_history" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Training Loop\n", + "\n", + "Now that we have coded every part of the training loop, we can put it all together in a single function that implements the training loop for the RL-enhanced RAG system." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to implement the training loop\n", + "def training_loop(\n", + " query_text: str, \n", + " ground_truth: str, \n", + " params: Optional[Dict[str, Union[float, int]]] = None\n", + ") -> Tuple[Dict[str, Dict[str, Union[float, str]]], List[float], List[List[str]], Optional[str]]:\n", + " \"\"\"\n", + " Implement the training loop for RL-enhanced RAG.\n", + "\n", + " Args:\n", + " query_text (str): The input query text for the RAG pipeline.\n", + " ground_truth (str): The expected correct answer for the query.\n", + " params (Optional[Dict[str, Union[float, int]]]): Training parameters such as learning rate, \n", + " number of episodes, and discount factor. If None, default parameters are initialized.\n", + "\n", + " Returns:\n", + " Tuple: A tuple containing:\n", + " - policy (Dict[str, Dict[str, Union[float, str]]]): The updated policy after training.\n", + " - rewards_history (List[float]): A list of rewards received in each episode.\n", + " - actions_history (List[List[str]]): A list of actions taken in each episode.\n", + " - best_response (Optional[str]): The best response generated during training.\n", + " \"\"\"\n", + " # Initialize training parameters if not provided\n", + " if params is None:\n", + " params = initialize_training_params()\n", + " \n", + " # Initialize variables to track progress\n", + " rewards_history: List[float] = [] # List to store rewards for each episode\n", + " actions_history: List[List[str]] = [] # List to store actions taken in each episode\n", + " policy: Dict[str, Dict[str, Union[float, str]]] = {} # Policy dictionary to store actions and rewards\n", + " action_space: List[str] = define_action_space() # Define the action space\n", + " best_response: Optional[str] = None # Variable to store the best response\n", + " best_reward: float = -1 # Initialize the best reward to a very low value\n", + " \n", + " # Get initial performance from the simple RAG pipeline for comparison\n", + " simple_response: str = basic_rag_pipeline(query_text)\n", + " simple_reward: float = calculate_reward(simple_response, ground_truth)\n", + " print(f\"Simple RAG reward: {simple_reward:.4f}\")\n", + "\n", + " # Start the training loop\n", + " for episode in range(params[\"num_episodes\"]):\n", + " # Reset the environment with the same query\n", + " context_chunks: List[str] = retrieve_relevant_chunks(query_text)\n", + " state: Dict[str, object] = define_state(query_text, context_chunks)\n", + " episode_reward: float = 0 # Initialize the reward for the current episode\n", + " episode_actions: List[str] = [] # Initialize the list of actions for the current episode\n", + " \n", + " # Maximum number of steps per episode to prevent infinite loops\n", + " for step in range(10):\n", + " # Perform a single RL step\n", + " state, action, reward, response = rl_step(state, action_space, ground_truth)\n", + " episode_actions.append(action) # Record the action taken\n", + " \n", + " # If a response is generated, end the episode\n", + " if response:\n", + " episode_reward = reward # Update the episode reward\n", + " \n", + " # Track the best response and reward\n", + " if reward > best_reward:\n", + " best_reward = reward\n", + " best_response = response\n", + " \n", + " break # Exit the loop as the episode ends\n", + " \n", + " # Update rewards and actions history\n", + " rewards_history.append(episode_reward)\n", + " actions_history.append(episode_actions)\n", + " \n", + " # Print progress every 5 episodes\n", + " if episode % 5 == 0:\n", + " print(f\"Episode {episode}: Reward = {episode_reward:.4f}, Actions = {episode_actions}\")\n", + " \n", + " # Compare the best RL-enhanced RAG reward with the simple RAG reward\n", + " improvement: float = best_reward - simple_reward\n", + " print(f\"\\nTraining completed:\")\n", + " print(f\"Simple RAG reward: {simple_reward:.4f}\")\n", + " print(f\"Best RL-enhanced RAG reward: {best_reward:.4f}\")\n", + " print(f\"Improvement: {improvement:.4f} ({improvement * 100:.2f}%)\")\n", + "\n", + " return policy, rewards_history, actions_history, best_response" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This function will take the input query text, the expected ground truth answer, and optionally some training parameters. It will return the updated policy, a list of rewards received in each episode, a list of actions taken in each episode, and the best response generated during training.\n", + "\n", + "In more detail, the `training_loop` function will:\n", + "- Initialize training parameters if not provided.\n", + "- Get the initial performance from the simple RAG pipeline for comparison.\n", + "- Start the training loop for the specified number of episodes.\n", + "- Perform a single RL step in each episode.\n", + "- Update rewards and actions history for each episode.\n", + "- Print progress every 5 episodes.\n", + "- Compare the best RL-enhanced RAG reward with the simple RAG reward.\n", + "- Return the updated policy, rewards history, actions history, and the best response generated during training." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Performance Comparison Logic\n", + "\n", + "Although we can manually compare the simple RAG pipeline with the RL-based RAG pipeline, a function can definitely help us in this regard. So, let's define a function to compare the performance of the simple RAG pipeline with the RL-enhanced RAG pipeline." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to compare Simple RAG vs RL-Enhanced RAG\n", + "def compare_rag_approaches(query_text: str, ground_truth: str) -> Tuple[str, str, float, float]:\n", + " \"\"\"\n", + " Compare the outputs of simple RAG versus RL-enhanced RAG.\n", + "\n", + " Args:\n", + " query_text (str): The input query text for the RAG pipeline.\n", + " ground_truth (str): The expected correct answer for the query.\n", + "\n", + " Returns:\n", + " Tuple[str, str, float, float]: A tuple containing:\n", + " - simple_response (str): The response generated by the simple RAG pipeline.\n", + " - best_rl_response (str): The best response generated by the RL-enhanced RAG pipeline.\n", + " - simple_similarity (float): The similarity score of the simple RAG response to the ground truth.\n", + " - rl_similarity (float): The similarity score of the RL-enhanced RAG response to the ground truth.\n", + " \"\"\"\n", + " print(\"=\" * 80)\n", + " print(f\"Query: {query_text}\")\n", + " print(\"=\" * 80)\n", + " \n", + " # Step 1: Generate a response using the simple RAG pipeline\n", + " # The basic RAG pipeline retrieves relevant chunks and generates a response without reinforcement learning.\n", + " simple_response: str = basic_rag_pipeline(query_text)\n", + " # Calculate the similarity score between the simple RAG response and the ground truth.\n", + " simple_similarity: float = calculate_reward(simple_response, ground_truth)\n", + " \n", + " print(\"\\nSimple RAG Output:\")\n", + " print(\"-\" * 40)\n", + " print(simple_response)\n", + " print(f\"Similarity to ground truth: {simple_similarity:.4f}\")\n", + " \n", + " # Step 2: Train the RL-enhanced RAG model\n", + " print(\"\\nTraining RL-enhanced RAG model...\")\n", + " # Initialize training parameters (e.g., learning rate, number of episodes, discount factor).\n", + " params: Dict[str, float | int] = initialize_training_params()\n", + " # Set the number of episodes to a smaller value for demonstration purposes.\n", + " params[\"num_episodes\"] = 5\n", + " \n", + " # Run the training loop for the RL-enhanced RAG model.\n", + " # This loop trains the model to optimize its responses using reinforcement learning.\n", + " _, rewards_history, actions_history, best_rl_response = training_loop(\n", + " query_text, ground_truth, params\n", + " )\n", + " \n", + " # If no response was generated during training, generate one using the current query and context.\n", + " if best_rl_response is None:\n", + " # Retrieve relevant chunks for the query.\n", + " context_chunks: List[str] = retrieve_relevant_chunks(query_text)\n", + " # Construct a prompt using the query and retrieved context.\n", + " prompt: str = construct_prompt(query_text, context_chunks)\n", + " # Generate a response using the language model.\n", + " best_rl_response: str = generate_response(prompt)\n", + " \n", + " # Calculate the similarity score between the RL-enhanced RAG response and the ground truth.\n", + " rl_similarity: float = calculate_reward(best_rl_response, ground_truth)\n", + " \n", + " print(\"\\nRL-enhanced RAG Output:\")\n", + " print(\"-\" * 40)\n", + " print(best_rl_response)\n", + " print(f\"Similarity to ground truth: {rl_similarity:.4f}\")\n", + " \n", + " # Step 3: Evaluate and compare the results\n", + " # Calculate the improvement in similarity score achieved by the RL-enhanced RAG model.\n", + " improvement: float = rl_similarity - simple_similarity\n", + " \n", + " print(\"\\nEvaluation Results:\")\n", + " print(\"-\" * 40)\n", + " print(f\"Simple RAG similarity to ground truth: {simple_similarity:.4f}\")\n", + " print(f\"RL-enhanced RAG similarity to ground truth: {rl_similarity:.4f}\")\n", + " print(f\"Improvement: {improvement * 100:.2f}%\")\n", + " \n", + " # Step 4: Plot the reward history (if there are enough episodes and matplotlib is available)\n", + " if len(rewards_history) > 1:\n", + " try:\n", + " import matplotlib.pyplot as plt\n", + " # Create a plot to visualize the reward history during RL training.\n", + " plt.figure(figsize=(10, 6))\n", + " plt.plot(rewards_history)\n", + " plt.title('Reward History During RL Training')\n", + " plt.xlabel('Episode')\n", + " plt.ylabel('Reward')\n", + " plt.grid(True)\n", + " plt.show()\n", + " except ImportError:\n", + " # If matplotlib is not available, print a message instead of plotting.\n", + " print(\"Matplotlib not available for plotting rewards\")\n", + " \n", + " # Return the results: responses and similarity scores for both approaches.\n", + " return simple_response, best_rl_response, simple_similarity, rl_similarity" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So our performance comparison logic is not very complicated but is based on 4 steps:\n", + "1. Generate a response using the simple RAG pipeline.\n", + "2. Train the RL-enhanced RAG model using the training loop.\n", + "3. Evaluate and compare the results.\n", + "4. Plot the reward history (if available)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluation Framework (**Optional**)\n", + "\n", + "This step is optional but in case you want to evaluate all the eval queries in the validation data, you can use the following code.\n", + "\n", + "First, to check the relevance of the retrieved chunks and the ground truth, we need to have a function that evaluates the relevance of the retrieved chunks." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to evaluate relevance of retrieved chunks\n", + "def evaluate_relevance(retrieved_chunks: List[str], ground_truth_chunks: List[str]) -> float:\n", + " \"\"\"\n", + " Evaluate the relevance of retrieved chunks by comparing them to ground truth chunks.\n", + "\n", + " Args:\n", + " retrieved_chunks (List[str]): A list of text chunks retrieved by the system.\n", + " ground_truth_chunks (List[str]): A list of ground truth text chunks for comparison.\n", + "\n", + " Returns:\n", + " float: The average relevance score between the retrieved chunks and the ground truth chunks.\n", + " \"\"\"\n", + " relevance_scores: List[float] = [] # Initialize a list to store relevance scores\n", + "\n", + " # Iterate through pairs of retrieved and ground truth chunks\n", + " for retrieved, ground_truth in zip(retrieved_chunks, ground_truth_chunks):\n", + " # Calculate the cosine similarity between the embeddings of the retrieved and ground truth chunks\n", + " relevance: float = cosine_similarity(\n", + " generate_embeddings([retrieved])[0],\n", + " generate_embeddings([ground_truth])[0]\n", + " )\n", + " # Append the relevance score to the list\n", + " relevance_scores.append(relevance)\n", + "\n", + " # Return the average relevance score\n", + " return np.mean(relevance_scores)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To evaluate the accuracy of the generated responses, we can use the cosine similarity between the embeddings of the generated responses and the ground truth. So let's define a function to evaluate the accuracy of the responses based on this similarity metric." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to evaluate the accuracy of generated responses\n", + "def evaluate_accuracy(responses: List[str], ground_truth_responses: List[str]) -> float:\n", + " \"\"\"\n", + " Evaluate the accuracy of generated responses by comparing them to ground truth responses.\n", + "\n", + " Args:\n", + " responses (List[str]): A list of generated responses to evaluate.\n", + " ground_truth_responses (List[str]): A list of ground truth responses to compare against.\n", + "\n", + " Returns:\n", + " float: The average accuracy score, calculated as the mean cosine similarity \n", + " between the embeddings of the generated responses and the ground truth responses.\n", + " \"\"\"\n", + " accuracy_scores: List[float] = [] # Initialize a list to store accuracy scores\n", + "\n", + " # Iterate through each pair of generated response and ground truth response\n", + " for response, ground_truth in zip(responses, ground_truth_responses):\n", + " # Calculate the cosine similarity between the embeddings of the response and ground truth\n", + " accuracy: float = cosine_similarity(\n", + " generate_embeddings([response])[0],\n", + " generate_embeddings([ground_truth])[0]\n", + " )\n", + " # Append the accuracy score to the list\n", + " accuracy_scores.append(accuracy)\n", + "\n", + " # Return the mean of the accuracy scores\n", + " return np.mean(accuracy_scores)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We also need to measure the response quality and assign a relevant score for it to be used in the reinforcement learning process." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to evaluate response quality\n", + "def evaluate_response_quality(responses: List[str]) -> float:\n", + " \"\"\"\n", + " Evaluate the quality of responses using a heuristic or external model.\n", + "\n", + " Args:\n", + " responses (List[str]): A list of generated responses to evaluate.\n", + "\n", + " Returns:\n", + " float: The average quality score of the responses, ranging from 0 to 1.\n", + " \"\"\"\n", + " quality_scores: List[float] = [] # Initialize a list to store quality scores for each response\n", + "\n", + " for response in responses:\n", + " # Example heuristic: Calculate a quality score based on response length\n", + " # Normalize the length by a maximum of 100 words and cap the score at 1.0\n", + " quality: float = len(response.split()) / 100\n", + " quality_scores.append(min(quality, 1.0)) # Append the capped quality score to the list\n", + "\n", + " # Return the average quality score across all responses\n", + " return np.mean(quality_scores)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Then we can evaluate the performance of the RL-enhanced RAG model on the validation dataset:" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to evaluate RAG performance\n", + "def evaluate_rag_performance(\n", + " queries: List[str], \n", + " ground_truth_chunks: List[str], \n", + " ground_truth_responses: List[str]\n", + ") -> Dict[str, float]:\n", + " \"\"\"\n", + " Evaluate the performance of the RAG pipeline using relevance, accuracy, and response quality metrics.\n", + "\n", + " Args:\n", + " queries (List[str]): A list of query strings to evaluate.\n", + " ground_truth_chunks (List[str]): A list of ground truth text chunks corresponding to the queries.\n", + " ground_truth_responses (List[str]): A list of ground truth responses corresponding to the queries.\n", + "\n", + " Returns:\n", + " Dict[str, float]: A dictionary containing the average relevance, accuracy, and quality scores.\n", + " \"\"\"\n", + " # Initialize lists to store scores for each metric\n", + " relevance_scores: List[float] = []\n", + " accuracy_scores: List[float] = []\n", + " quality_scores: List[float] = []\n", + "\n", + " # Iterate through each query and its corresponding ground truth data\n", + " for query, ground_truth_chunk, ground_truth_response in zip(queries, ground_truth_chunks, ground_truth_responses):\n", + " # Retrieve relevant chunks for the query\n", + " retrieved_chunks: List[str] = retrieve_relevant_chunks(query)\n", + " \n", + " # Evaluate the relevance of the retrieved chunks compared to the ground truth chunk\n", + " relevance: float = evaluate_relevance(retrieved_chunks, [ground_truth_chunk])\n", + " relevance_scores.append(relevance)\n", + "\n", + " # Generate a response using the basic RAG pipeline\n", + " response: str = basic_rag_pipeline(query)\n", + " \n", + " # Evaluate the accuracy of the generated response compared to the ground truth response\n", + " accuracy: float = evaluate_accuracy([response], [ground_truth_response])\n", + " accuracy_scores.append(accuracy)\n", + "\n", + " # Evaluate the quality of the generated response\n", + " quality: float = evaluate_response_quality([response])\n", + " quality_scores.append(quality)\n", + "\n", + " # Calculate the average scores for each metric\n", + " avg_relevance: float = np.mean(relevance_scores)\n", + " avg_accuracy: float = np.mean(accuracy_scores)\n", + " avg_quality: float = np.mean(quality_scores)\n", + "\n", + " # Return the average scores as a dictionary\n", + " return {\n", + " \"average_relevance\": avg_relevance,\n", + " \"average_accuracy\": avg_accuracy,\n", + " \"average_quality\": avg_quality\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluating (RL vs Simple) RAG\n", + "\n", + "Ah, the moment of truth! Let's evaluate the performance of the simple RAG pipeline against the RL-enhanced RAG pipeline on our factual query, where the simple RAG previously failed to provide the correct answer. Let's see if the RL-enhanced RAG pipeline can perform better." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's revisit our evaluation query and see what the simple RAG pipeline generates for it." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🔍 Running the Retrieval-Augmented Generation (RAG) pipeline...\n", + "📥 Query: What is the mathematical representation of a qubit in superposition?\n", + "\n", + "🤖 AI Response:\n", + "--------------------------------------------------\n", + "ψ α0 β1\n", + "--------------------------------------------------\n", + "✅ Ground Truth Answer:\n", + "--------------------------------------------------\n", + "|ψ⟩ = α|0⟩ + β|1⟩, where α and β are complex numbers satisfying |α|² + |β|² = 1, representing the probability amplitudes for measuring the qubit in state |0⟩ or |1⟩ respectively.\n", + "--------------------------------------------------\n" + ] + } + ], + "source": [ + "# Print a message to indicate the start of the RAG pipeline\n", + "print(\"🔍 Running the Retrieval-Augmented Generation (RAG) pipeline...\")\n", + "print(f\"📥 Query: {sample_query}\\n\")\n", + "\n", + "# Run the RAG pipeline and get the response\n", + "response = basic_rag_pipeline(sample_query)\n", + "\n", + "# Print the response with better formatting\n", + "print(\"🤖 AI Response:\")\n", + "print(\"-\" * 50)\n", + "print(response.strip())\n", + "print(\"-\" * 50)\n", + "\n", + "# Print the ground truth answer for comparison\n", + "print(\"✅ Ground Truth Answer:\")\n", + "print(\"-\" * 50)\n", + "print(expected_answer)\n", + "print(\"-\" * 50)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "================================================================================\n", + "Query: What is the mathematical representation of a qubit in superposition?\n", + "================================================================================\n", + "\n", + "Simple RAG Output:\n", + "----------------------------------------\n", + "ψ α0 β1 \n", + "\n", + "Similarity to ground truth: 0.6726\n", + "\n", + "Training RL-enhanced RAG model...\n", + "Simple RAG reward: 0.6772\n", + "Episode 0: Reward = 0.0000, Actions = ['rewrite_query', 'rewrite_query', np.str_('rewrite_query'), 'rewrite_query', np.str_('rewrite_query'), 'rewrite_query', 'rewrite_query', 'rewrite_query', np.str_('expand_context'), 'rewrite_query']\n", + "\n", + "Training completed:\n", + "Simple RAG reward: 0.6772\n", + "Best RL-enhanced RAG reward: 0.8652\n", + "Improvement: 0.1879 (18.79%)\n", + "\n", + "RL-enhanced RAG Output:\n", + "----------------------------------------\n", + "The mathematical representation of a qubit in superposition is: \n", + "ψ = α0 + β1 \n", + "\n", + "Where:\n", + "\n", + "* α and β are complex numbers.\n", + "* α² + β² = 1 \n", + "\n", + "\n", + "Let me know if you would like a deeper explanation of any of these terms! \n", + "\n", + "Similarity to ground truth: 0.8652\n", + "\n", + "Evaluation Results:\n", + "----------------------------------------\n", + "Simple RAG similarity to ground truth: 0.6726\n", + "RL-enhanced RAG similarity to ground truth: 0.8652\n", + "Improvement: 19.26%\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAIjCAYAAAA0vUuxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAACF8UlEQVR4nO3dB3yUVbr48SeT3iGQRhLS6NJBelexra676lpREUEp+3fXLVf37up6vXfde3fXu3sFQRCwi2t3FbHRe0dAWkIagRQI6aTNzP9zzmTGAIEQyOSd8vt+PiFvJpPJw8lk8j7vc85zfKxWq1UAAAAAABdkuvCnAAAAAAAKiRMAAAAAtIDECQAAAABaQOIEAAAAAC0gcQIAAACAFpA4AQAAAEALSJwAAAAAoAUkTgAAAADQAhInAAAAAGgBiRMAuBkfHx/54x//2OaP+9BDD0lKSkqbP663efXVV/XPKDs72+hQ3NqVPB/V74f6GQBAWyJxAuBxJ6z2Nz8/P0lISNAnYPn5+eJN1Em7GoO//vWvFz2xPHny5BV9n++//14/lismCern3vT5EBYWJmlpaXLHHXfIBx98IBaLRTyN/edqf/P399fJx//7f/9PSktLz7u/+tyPfvSjVn2Ppo9/sbfVq1e34f8MAIznZ3QAANDW/uM//kNSU1OlpqZGNm/erBOq9evXy759+yQoKMjo8FzWokWLWp1MqMTp2WeflQkTJrhktSowMFBeeeUVfXzmzBnJycmRf/3rXzp5UjF/8sknEhER0abfc8qUKXL33Xfr722U+fPn60SxqqpKvv32W3nxxRdl586d+vfgSr3xxhtnffz666/L119/fd7tvXv3bvfno93vf/97efLJJ6/o+wPAuUicAHicG2+8UYYOHaqPH3nkEencubP893//t3z66afys5/9TFydOtkNDQ1t9++rqhOuorq6WkJCQq74cVTV8f777z/rtv/8z/+UP//5z/LUU0/J9OnT5d1335W2/Ln5+vrqNyOpxFA975VHH31UJ3Lq/7l161YZNmzYFT32ueOpLk6oxOnc26/0Z3olz0f1c1dvANCWmKoHwOONHTtWv8/MzDzr9oMHD+oTzKioKF2JUsmWSq7s1NQmdQL8f//3f47b1NQ2k8kknTp1EqvV6rh95syZEhcX5/h43bp1cuedd0rXrl115SEpKUl++ctf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0fvDeT7ceUxOlNVITHig3DnEdgUagOdL6RwqP+pvqzC/tJqqU3uyX6z62dBE6RgaYHQ4AOBVDE+c3n33XXniiSfkmWeekZ07d8qAAQPk+uuvl6Ki5vcJWb16tdxzzz2yatUq2bRpkyQlJcnkyZMlP9+2CSDaR4PZIvPXZDpa4TJdBPAusyd20++/2FcgGUUVRofjFdQeWmsPF+tq37QxtCAHAK9LnF544QWZPn26TJ06Vfr06SMLFiyQkJAQWbJkSbP3f+utt2TWrFkycOBA6dWrl7zyyitisVjk22+/bffYvdnne09Izqlq6RjiL/cO72p0OADaWc+4cJncJ1bUdk4vrbZdRIFzLVpnqzap7qVdO4UYHQ4AeB0/I795XV2d7NixQ5566inHbSaTSU+/U9WkS1FdXS319fUSFRXV7Odra2v1m115ebl+r75GvRnNHoMrxHKpLBarvPjtEX380Mhk8fexumz87ji+7oTx9e7xfWxcinz1faF8svu4zJmQKkkd3etk3tXHtyk1LfrT3cf18dRRXd0iZncaX3fE+DoX4+s941vfihh8rAZu/378+HFJSEiQjRs3ysiRIx23//a3v5U1a9bIli1bWnwMVX368ssvZf/+/XqN1Ln++Mc/yrPPPnve7W+//baubKH19pzykSWHfSXI1yrPDDZLiKHpNwAjzf/eJAfLTDIq1iJ3pVmMDsdjfZJjkpXHTZIebpX/19dsdDgA4DFUEebee++VsrIyiYiIuOh93fqU989//rMsW7ZMr3tqLmlSVDVLraFqWnGyr4tqaXDaK8v9+uuv5brrrhN/f39xdSrPXrRAJbTlMnV0mtxxXXdxZe42vu6G8XUudxjf6D6n5d7F22TbSV/57wcmSFxE86/FrsgdxlepqGmQf//rWrW6VH7748EyqWe0uAN3GV93xfg6F+PrPeNb3jgb7VIYmjh17txZfH19pbCw8Kzb1cdxcXEX/dq//vWvOnH65ptvpH///he8X2BgoH47l/ohGf2DcuV4LmT1oSLZ19gK95Fx6W4RszuNr7tifL13fEd1j5FhKVGyNbtEXt2UJ3/4UR9xN648vsoHm/KksrZB0qND5bo+8WJys43GXX183R3j61yMr+ePr38rvr+hzSECAgJkyJAhZzV2sDd6aDp171z/8z//I88995ysWLFChg4d2k7RoumGl6ohRKew8xNSAN5n9iRbh723tuTIqcof1pTiytWbLbJkQ5ajg6m7JU0A4EkM76qnptGpvZlee+01OXDggMycOVOqqqp0lz3lgQceOKt5xH//93/LH/7wB911T+39VFBQoN8qKysN/F94hy1HT8m27NMS4GvSf8ABQBnXvbP0S4iUmvofTvLRNv6157huDNE5LFBuG5RgdDgA4NUMT5zuuusuPe3u6aef1i3Gd+/erStJsbGx+vO5ubly4sQJx/3nz5+vu/HdcccdEh8f73hTjwHnmttYbbpjaKLEutE6BgDO5ePjI3Maq06vb8yRsjPGd0nyBGpN6cLGDW+njk6RQD/2ywMAI7lEc4g5c+bot+aoxg9NZWdnt1NUaGpPXqmsO3JSfE0+MnN8utHhAHAx1/WOlR6xYXK4sFLe2JQtcya5duMYd6Becw8WVEhIgK/cx355AGA4wytOcK9q048HdpGkKNq4AzibWnsze6Kt6rR4fZZU1TYYHZLbs1ebfjY0STqEBBgdDgB4PRIntOhgQbl8/X2h+PiIzJpgOzECgHPd3C9eUjqFyOnqenlna67R4bi1/cfLZH2Grco/bUyq0eEAAEiccCnmrcrU72/sGyfdYsKMDgeAi/LzNcnMCemOaklNPRu1Xq5FjdWmm/rFU+UHABdB4oSLyjpZJZ9/d1wf26fhAMCF/GRQonSJDJKiilp5b8cxo8NxS8dLz8i/vrM1RZoxlg6mAOAqSJxwUfNXZ4jFKjKpV4xc1SXS6HAAuLgAvx+2K1iwOlPvQ4TWWbI+S8wWq4xM6yT9EnndBQBXQeKEC8ovPSMf7szXx1SbAFyqu4d1lc5hAfo15JPdtoo1Lo1q5W5fH8Z+eQDgWkiccEEvr8mUBotVRqV3kiHJHY0OB4CbCPL3lUcap5i9tDpDV09waVTSVFVn1q3dJ/SMNjocAEATJE5oVlFFjSzblqeP51BtAtBK949IlshgfzlaXCVf7PthE3NcWF2DRZZuyNLH08em6Y2FAQCug8QJzVq8Lkv/ER/UtYOMTO9kdDgA3ExYoJ9MHZ3i6MxptVJ1asmne45LYXmtxIQHyq0DuxgdDgDgHCROOM/pqjp5Y3OOo9rEVU8Al+OhUSkSGuArB06Uy8qDRUaH49JUYmlvQT51dKoE+vkaHRIA4BwkTjjP0o3ZUl1nlt7xEbqbHgBcjg4hAXL/yGR9/OLKDKpOF7H6cLEcKqzQiea9w7saHQ4AoBkkTjhLRU29vNo4x55qE4Ar9ciYNAn0M8nuvFLZmHnK6HBclr3apDoSqrVhAADXQ+KEs7y5OVfKaxokLTpUbugbZ3Q4ANxcdHig3DPMVkGZuzLD6HBc0r78Mp1U+pp85OExqUaHAwC4ABInOJypM8sr62xXPWdP6Kb/iAPAlVL7Efn7+simo6dkR06J0eG4nJcbq00/6h8vCR2CjQ4HAHABJE5wWLYtV05V1Ulix2A6OgFoM106BMtPByXqY6pOZ8srqZble23t2tnwFgBcG4kTtNoGsyxsvOr52Ph08fflqQGg7cyckC6qiL3qULGemgabJRuy9AbBY7p1lqu6RBodDgDgIjg7hvbhznw5UVaj9w+5Y4jtyjAAtJWUzqFyywBbJful1VSdlLLqenm3caPx6VSbAMDlkThBGswWmb860zFVJMif/UMAtL1ZE7rp91/sK5CMogrxdm9uydFbP/SKC5dx3TsbHQ4AoAUkTpDPvjshuSXVEhUawP4hAJymZ1y4TO4TK2o7p5dW2S7WePP06Fc3Zuvj6WPT2PoBANwAiZOXs1isMm+VbdrMw6NTJCTAz+iQAHiwOZNsVadP9hyX3FPV4q0+2XVciitqJS4iyDGFEQDg2kicvNxX3xfIkaJKCQ/ykwdGpRgdDgAP1z+xg4zrEa0bIixYm+m1F6wWNm798PCYFAnw408xALgDXq29mNVqlbmN1aYHR6ZIRBC71QNwvjkTbVWn97cfk4KyGvE2qw8XSUZRpYQF+sndjZsDAwBcH4mTF1tzWLUFLpdgf192qwfQboalRum3OrPFsQ2CN3l5je3/rNaUcsEKANwHiZM3V5saN6JUf7xVYwgAaO+q09tbc+RUZa3R4bSbPXmlsiWrRPxMPjJ1NNOjAcCdkDh5KfWHe3vOaQnwNbFbPYB2N7Z7Z+mfGCk19RZZvD5LvIV9bdOtA7pIfGSw0eEAAFqBxMlL2Tvp3Tk0UWIjgowOB4CXUe23ZzdWnd7YlCNlZ+rF06kugl/sPaGP2fAWANwPiZMX2p1XKuuOnBRfk488Nj7d6HAAeKnresdKz9hwqahtkNcb9zTyZIvXHxWL1VZt6x0fYXQ4AIBWInHyQva1TbcNTJCkqBCjwwHgpUwmH5k10XbxZsmGLKmqbRBPdbqqTv65/Zg+fnQcF6wAwB2ROHmZgwXl8s2BQlGb1NtPWADAKD/q30VSOoXI6ep6eXtLrniqNzfnyJl6s/SJj5DR3ToZHQ4A4DKQOHmZeatsG07e1Dde0qPDjA4HgJdTU4ZnTejmaJxQU28WT6P+T69tsk1FVM141PouAID7IXHyIkeLK+Wz747rY6pNAFzFbYMSpEtkkBRX1Mp7O2zT2TzJR7vy5WRlnf4/3tw/3uhwAACXicTJi8xfnSlWq8g1vWLkqi6RRocDAFqAn0kebWxUs2B1ptSbLeIpLBarLGpsQa42Gvf35c8uALgrXsG9xLHT1fqqpzJ7km1aDAC4iruuTpLOYYGSX3pGPm58rfIE3x4skqPFVRIe5Cd3D+tqdDgAgCtA4uQlXl5zVBosVhmV3kkGd+1odDgAcJYgf1+ZPjbVUR03q77dHmDhWtu60vuGJ0tYoJ/R4QAArgCJkxcoKq+Rd7fn6eM5VJsAuKj7RiRLZLC/HD1ZJV/ss20U68525p6Wbdmnxd/XR6aOTjE6HADAFSJx8gKvrM+SugaLDO7aQUam0QYXgGtSFRl7gqH2m7OqRZlubNFa29qmHw9MkNiIIKPDAQBcIRInD6c2XVT7h9irTbTBBeDKHhqVohOogwUV8u2BInFX2SerZMX+AkcLcgCA+yNx8nBLN2RJdZ1t08WJPWOMDgcALqpDSIDcPyJZH89d5b5Vp8Xrs3QX0wk9o6VHbLjR4QAA2gCJkwerqKmXVzfaNl2k2gTAXUwbkyqBfibZnVcqGzJOibspqaqT93bY1pVSbQIAz0Hi5MHe2Jwj5TUNkh4dKjdcFWd0OABwSaLDA+Wextbdc1cdEXfz+qZsqam3SN+ECNaVAoAHIXHyUGfqzLJ4XZY+njWhm5hMVJsAuA9VqVHd6DYfLZHt2SXiLmrqzfL6Jtu60hnj0qn0A4AHIXHyUO9szZVTVXWSFBUstw7sYnQ4ANAqXToEy+2DEx1rndzF+zuO6al6CR2C5aa+VPoBwJOQOHmg2gazLGxsg/vY+HTx9+XHDMD9qNcvVSxffahY9uWXiatTm/aqphD2dVp+vPYCgEfhVd0DfbgzXwrKayQ2IlDuGGK7YgsA7ialc6jcOsBWMZ/nBlWnr78vlKyTVRIR5Cd3XZ1kdDgAgDZG4uRhGswWmb86Ux9PH5smgX6+RocEAJdt1sRu+r3aE+lIYYW4soVrba+9qp16aKCf0eEAANoYiZOH+dd3xyW3pFqiQgPk3uG2rlQA4K7UHkjXXxWr90R6qfGikCvakVMiO3NLJcDXpDfxBQB4HhInD2KxWGXeqkzH/PqQAK54AnB/cyZ21+8/3XNcck9Viyt6eY1tXelPBiVITESQ0eEAAJyAxMmDfLm/QDKKKiU8yE+mjEw2OhwAaBP9EiNlfI9o3Xxh/hrXqzodLa6Urw8U6uPp41KNDgcA4CQkTh7CarU6WvaqaSIRQf5GhwQAbWbOJNtap/d35MmJsjPiSl5Zn6WnEl7TK0a6xYQbHQ4AwElInDzE6sPFsv94uQT7+8rU0VzxBOBZrk6JkmGpUVJvtjq2W3AFJytr9d5N9k17AQCei8TJU6pNK23VpvuGd9WNIQDA0/y8seqkNvhWCYsreH1TjtQ1WGRAYqRO7AAAnovEyQNsPloiO3JO625O07niCcBDjenWWScoNfUWWdK40ayRztSZ5Y1N2fp4xrh08fHxMTokAIATkTh5APvGkD+7OlFi6eYEwEOpxGR2475OqtJTVl1vaDzv7ciT09X1khQVrFumAwA8G4mTm9uVe1rWZ5wUX5OPPDou3ehwAMCpru0dKz1jw6WytkFea6z2GEF1+Htlna3q9ciYNPHz5c8pAHg6Xuk9pNp028AESYoKMTocAHAqk8lHZjeudVqyIUuqahsM2/5BbTbeIcRf7hyaaEgMAID2ReLkxg6cKJdvDhSJmlY/ayLVJgDe4eZ+8ZLaOVRKq+vlrS05hjTkebmxs9+UEclsNg4AXoLEyQOqTTf1i5f06DCjwwGAdqGmJs8cb7tYtGhdltTUm9v1+2/LPi178kolwM8kD4xMadfvDQAwDomTm8osrpTP957Qx7Mn2KatAIC3uG1QgiR0CJbiilp5b3teu37vhWsz9fvbBydIdHhgu35vAIBxSJzc1PzVmY6d6vt0iTA6HABoV6ra8+h42/YLC9YclXqzpV2+b0ZRpWOK9CNj2f4BALwJiZMbOna6Wj7ela+P7YukAcDb/GxoknQOC5T80jPyUeNrorO9su6oo7sfU6QBwLuQOLmhl9cclQaLVUZ36ySDu3Y0OhwAMESQv6/MGJfqqMKrFuHOVFRRIx/utCVoM9hsHAC8DomTmykqr5F3G+fz2zeCBABvdd/wZN0SPOtklSxvXPfpLK9vzJE6s0UGde0gQ5O5aAUA3obEyc0sWndU6hosMiS5o4xM62R0OABgqNBAP5k6KtXRadTipKqT2i/qjc221uePjksTH7XICQDgVUic3Mjpqjp5a0uuPp4zsRt/uAFARB4alSJhgX5ysKBCvj1Y5JTvoTr3lZ2pl5ROIXJdnzinfA8AgGsjcXIjSzdkSXWdWa7qEiETekYbHQ4AuITIEH+ZMjJZH89dlaE3qG1LDWaLvLI+Sx9PG5um95ECAHgfEic3UV5TL0s3ZjvWNlFtAoAfTBuTKkH+Jr0x7YaMU2362F/sK5Bjp89IVGiA3DE4sU0fGwDgPkic3MQbm3KkoqZBusWEyQ1XMU0EAJpSbcnvvrqrPn5x5ZE2e1xVvVq41taCfMqIZAkO8G2zxwYAuBcSJzdQXdcgixunicyakC4mpokAwHnUhrj+vj6yJatEtmeXtMljbj5aInvzyyTQzyQPNE4HBAB4JxInN/DO1jwpqaqTpKhguXVAF6PDAQCXFB8ZLHcMSXSsdWqrTqaKetxOYYFt8pgAAPdE4uTiahvMsnBtpj6eOb6b+PnyIwOAC3lsfLqoovzqQ8Wy91jZFT3WkcIKWXmwSNSS0kfGsuEtAHg7zsJd3Ac78qWwvFbiIoLk9iEJRocDAC4tuVOoozKv9nW6Eva1TZP7xEpq59A2iQ8A4L5InFyYaoE7f43tD//0cWkS6MeiZABoieo8qqzYX6CrRpejqLxGPt6dr49njEtv0/gAAO6JxMmFfbrnuOSV2Frg3jMsyehwAMAtdI8Nd3QffWm1bapza6ntH+rNVhma3FGGJHds4wgBAO6IxMlFWSxWxx98tT9JSICf0SEBgNtVnT7ZnS85p6pa9bWVtQ3y5uYcR7UfAACFxMlFfbm/QDKKKiU8yE+m0AIXAFqlX2KkTOgZLRaryII1ras6vbstT++bl9Y5VK7rHeu0GAEA7oXEyQWpDRftrXQfGpUiEUH+RocEAG5nTmPV6f0dx+RE2ZlL+pp6s0WWNO6bpzrpsW8eAMCOxMkFqTa6+4+XS0iAr0wdnWp0OADgloamRMnw1Ci9VunlNbYOeS1ZvveE5JeekU6hAfLTwXQyBQD8gMTJBatNL648oo/vG95VN4YAAFyeOZNsVadl23LlZGVti6+/9hbkD45KkSB/OpkCAH5A4uRiNh09JTtzSyXAzyTT2XARAK7ImG6dZUBSB6mpt8jixil4F7Ix85Su9gf5m+T+EawtBQCcjcTJxdg3bPzZ0ESJiQgyOhwAcGs+Pj6OtU5vbMqRsur6C97XXm362dAkqv0AgPOQOLmQXbmnZUPGKfEz+cijbLgIAG3iml4x0isuXLcZf3VjdrP3OVhQLmsOF4vqBaG2gAAA4FwkTi5YbbptUIIkRYUYHQ4AeATVGc++r9PSjVlSVdtw3n0WrbVN47uhb5wkdwpt9xgBAK6PxMlFHDhRId8cKBIfH5GZE6g2AUBbuqlfvN6XqbS6Xt7aYtvc1q6gvEY+3ZOvj1lbCgC4EBInF7GgcW79zf3iJT06zOhwAMCj+Jp85LHGi1IL12ZJTb3Z8bnXNuXqluXDUqJkUNeOBkYJAHBlJE4uoPCMyBf7C/WxfToJAKBt/WRQgiR0CNZtyf+5PU/fVtOgWpUf08czxlFtAgBcGImTC/gm3yRWq8i1vWOkd3yE0eEAgEfy9zXJY+NtyZHaELfebJGNRT66aUR6dKhM6hVjdIgAABfmEonTvHnzJCUlRYKCgmT48OGydevWi97/vffek169eun79+vXT5YvXy7u6tjpM7K92EcfU20CAOe6c2iSRIcHSn7pGflg53FZc8LkWNukmkgAAOCyidO7774rTzzxhDzzzDOyc+dOGTBggFx//fVSVFTU7P03btwo99xzj0ybNk127dolt912m37bt2+fuKNF67PEIj4yKp259QDgbEH+vjJ9rK3d+HPLD0ppnY90DgvQ3UwBAHDpxOmFF16Q6dOny9SpU6VPnz6yYMECCQkJkSVLljR7/3/84x9yww03yG9+8xvp3bu3PPfcczJ48GCZO3euuJvC8hp5f+dxfTyrcfoIAMC57hueLB1C/KWuwaI/fmBEV51QAQBwMX5ioLq6OtmxY4c89dRTjttMJpNce+21smnTpma/Rt2uKlRNqQrVxx9/3Oz9a2tr9ZtdeXm5fl9fX6/fjPTy6gz9hzs13CqDEsIMj8cT2ceUsXUOxte5GF/nCDCJPDiiq/xjZaYEmKxyx6A4xtgJeP46F+PrXIyv94xvfStiMDRxOnnypJjNZomNjT3rdvXxwYMHm/2agoKCZu+vbm/O888/L88+++x5t3/11Ve6smWkumIf6RRokskJFvnmm28MjcXTff3110aH4NEYX+difNteF7PIsGiT9Ii0yrb1q40Ox6Px/HUuxte5GF/PH9/q6mr3SJzag6pmNa1QqYpTUlKSTJ48WSIijO1gd5OI/La2VlZ+861cd9114u/vb2g8nkhdRVC/lIyvczC+zsX4OtctjK9T8fx1LsbXuRhf7xnf8sbZaC6fOHXu3Fl8fX2lsNC2h5Gd+jguLq7Zr1G3t+b+gYGB+u1c6odk9A/KzsfHteLxRIyvczG+zsX4Ohfj61yMr3Mxvs7F+Hr++Pq34vsb2hwiICBAhgwZIt9++63jNovFoj8eOXJks1+jbm96f0VlrBe6PwAAAABcKcOn6qlpdA8++KAMHTpUhg0bJn//+9+lqqpKd9lTHnjgAUlISNBrlZTHH39cxo8fL3/729/k5ptvlmXLlsn27dtl4cKFBv9PAAAAAHgqwxOnu+66S4qLi+Xpp5/WDR4GDhwoK1ascDSAyM3N1Z327EaNGiVvv/22/P73v5ff/e530r17d91Rr2/fvgb+LwAAAAB4MsMTJ2XOnDn6rTmrV5/f7ejOO+/UbwAAAADgFRvgAgAAAICrI3ECAAAAgBaQOAEAAABAC0icAAAAAKAFJE4AAAAA0AISJwAAAABoAYkTAAAAALSAxAkAAAAAWkDiBAAAAAAtIHECAAAAgBaQOAEAAABAC0icAAAAAKAFJE4AAAAA0AI/8TJWq1W/Ly8vF1dQX18v1dXVOh5/f3+jw/E4jK9zMb7Oxfg6F+PrXIyvczG+zsX4es/4ljfmBPYc4WK8LnGqqKjQ75OSkowOBQAAAICL5AiRkZEXvY+P9VLSKw9isVjk+PHjEh4eLj4+PkaHo7NclcTl5eVJRESE0eF4HMbXuRhf52J8nYvxdS7G17kYX+difL1nfK1Wq06aunTpIibTxVcxeV3FSQ1IYmKiuBr1pDH6iePJGF/nYnydi/F1LsbXuRhf52J8nYvx9Y7xjWyh0mRHcwgAAAAAaAGJEwAAAAC0gMTJYIGBgfLMM8/o92h7jK9zMb7Oxfg6F+PrXIyvczG+zsX4Olegm46v1zWHAAAAAIDWouIEAAAAAC0gcQIAAACAFpA4AQAAAEALSJwAAAAAoAUkTk42b948SUlJkaCgIBk+fLhs3br1ovd/7733pFevXvr+/fr1k+XLl7dbrN4wxq+++qr4+Pic9aa+Dudbu3at3HLLLXonbTVOH3/8cYtfs3r1ahk8eLDuktOtWzc93mib8VVje+5zV70VFBS0W8zu5Pnnn5err75awsPDJSYmRm677TY5dOhQi1/Ha7DzxpfX30s3f/586d+/v2Nz0JEjR8oXX3xx0a/hueu88eW5e2X+/Oc/6zH7xS9+4fbPYRInJ3r33XfliSee0O0Wd+7cKQMGDJDrr79eioqKmr3/xo0b5Z577pFp06bJrl279B8i9bZv3752j91Tx1hRL5InTpxwvOXk5LRrzO6iqqpKj6dKTC9FVlaW3HzzzTJx4kTZvXu3foF85JFH5Msvv3R6rN4wvnbq5LTp81edtOJ8a9askdmzZ8vmzZvl66+/lvr6epk8ebIe9wvhNdi546vw+ntpEhMT9cnmjh07ZPv27TJp0iT58Y9/LPv372/2/jx3nTu+Cs/dy7Nt2zZ5+eWXdaJ6MW7zHFbtyOEcw4YNs86ePdvxsdlstnbp0sX6/PPPN3v/n/3sZ9abb775rNuGDx9uffTRR50eq7eM8dKlS62RkZHtGKFnUC8VH3300UXv89vf/tZ61VVXnXXbXXfdZb3++uudHJ13jO+qVav0/U6fPt1ucXmSoqIiPX5r1qy54H14DXbu+PL6e2U6duxofeWVV5r9HM9d544vz93LU1FRYe3evbv166+/to4fP976+OOPX/C+7vIcpuLkJHV1dfpKxrXXXuu4zWQy6Y83bdrU7Neo25veX1HVkwvd39tdzhgrlZWVkpycLElJSS1eYcKl4/nbPgYOHCjx8fFy3XXXyYYNG4wOx22UlZXp91FRURe8D89h546vwutv65nNZlm2bJmu5qkpZc3huevc8VV47raeqkqrmSjnPjfd+TlM4uQkJ0+e1L+MsbGxZ92uPr7QmgR1e2vu7+0uZ4x79uwpS5YskU8++UTefPNNsVgsMmrUKDl27Fg7Re25LvT8LS8vlzNnzhgWl6dQydKCBQvkgw8+0G/qj/eECRP0FFVcnPo9V1NHR48eLX379r3g/XgNdu748vrbOnv37pWwsDC9ZvSxxx6Tjz76SPr06dPsfXnuOnd8ee623rJly/TfJ7Ue8lK4y3PYz+gAgPakriY1vaKkXvh69+6t598+99xzhsYGXIz6w63emj53MzMz5X//93/ljTfeMDQ2d7jqqebJr1+/3uhQvHp8ef1tHfX7rtaLqmre+++/Lw8++KBeW3ahk3s4b3x57rZOXl6ePP7443r9o6c10SBxcpLOnTuLr6+vFBYWnnW7+jguLq7Zr1G3t+b+3u5yxvhc/v7+MmjQIMnIyHBSlN7jQs9ftaA2ODjYsLg82bBhw0gGWjBnzhz57LPPdBdDtSD8YngNdu74novX34sLCAjQ3UmVIUOG6EX2//jHP/TJ+rl47jp3fM/Fc/fi1DIK1aRLddm1UzOE1OvE3Llzpba2Vp+/ueNzmKl6TvyFVL+I3377reM2VdpVH19oDq26ven9FZWtX2zOrTe7nDE+l/pFVuV6NQ0KV4bnb/tTV0t57jZP9dxQJ/Vq+s3KlSslNTW1xa/hOezc8T0Xr7+to/6+qRPO5vDcde74novn7sVdc801enzU3yj729ChQ+W+++7Tx+cmTW71HDa6O4UnW7ZsmTUwMND66quvWr///nvrjBkzrB06dLAWFBToz0+ZMsX65JNPOu6/YcMGq5+fn/Wvf/2r9cCBA9ZnnnnG6u/vb927d6+B/wvPGuNnn33W+uWXX1ozMzOtO3bssN59993WoKAg6/79+w38X7huN5xdu3bpN/VS8cILL+jjnJwc/Xk1rmp87Y4ePWoNCQmx/uY3v9HP33nz5ll9fX2tK1asMPB/4Tnj+7//+7/Wjz/+2HrkyBH9mqC6E5lMJus333xj4P/Cdc2cOVN3wVq9erX1xIkTjrfq6mrHfXgNbt/x5fX30qlxUx0Ks7KyrN99953+2MfHx/rVV1/pz/Pcbd/x5bl75caf01XPXZ/DJE5O9uKLL1q7du1qDQgI0K2zN2/efNaT6MEHHzzr/v/85z+tPXr00PdXrZ0///xzA6L23DH+xS9+4bhvbGys9aabbrLu3LnToMhdm7399blv9vFU79X4nvs1AwcO1OOblpamW7iibcb3v//7v63p6en6j3VUVJR1woQJ1pUrVxr4P3BtzY2temv6nOQ1uH3Hl9ffS/fwww9bk5OT9VhFR0dbr7nmGsdJvcJzt33Hl+du2ydO4930Oeyj/jG66gUAAAAArow1TgAAAADQAhInAAAAAGgBiRMAAAAAtIDECQAAAABaQOIEAAAAAC0gcQIAAACAFpA4AQAAAEALSJwAAAAAoAUkTgAAj5OdnS0+Pj6ye/dup32Phx56SG677TanPT4AwLWQOAEAXI5KSlTic+7bDTfccElfn5SUJCdOnJC+ffs6PVYAgHfwMzoAAACao5KkpUuXnnVbYGDgJX2tr6+vxMXFOSkyAIA3ouIEAHBJKklSyU/Tt44dO+rPqerT/Pnz5cYbb5Tg4GBJS0uT999//4JT9U6fPi333XefREdH6/t37979rKRs7969MmnSJP25Tp06yYwZM6SystLxebPZLE888YR06NBBf/63v/2tWK3Ws+K1WCzy/PPPS2pqqn6cAQMGnBUTAMC9kTgBANzSH/7wB7n99ttlz549Oim6++675cCBAxe87/fffy9ffPGFvo9Kujp37qw/V1VVJddff71OyrZt2ybvvfeefPPNNzJnzhzH1//tb3+TV199VZYsWSLr16+XkpIS+eijj876Hippev3112XBggWyf/9++eUvfyn333+/rFmzxskjAQBoDz7Wcy+ZAQDgAmuc3nzzTQkKCjrr9t/97nf6TVWTHnvsMZ0A2Y0YMUIGDx4sL730kq44qcrPrl27ZODAgXLrrbfqREklPudatGiR/Nu//Zvk5eVJaGiovm358uVyyy23yPHjxyU2Nla6dOmiE6Hf/OY3+vMNDQ368YcMGSIff/yx1NbWSlRUlE64Ro4c6XjsRx55RKqrq+Xtt9924mgBANoDa5wAAC5p4sSJZyVGikpO7JomKPaPL9RFb+bMmbo6tXPnTpk8ebLuhjdq1Cj9OVWBUtPq7EmTMnr0aD317tChQzp5U40mhg8f7vi8n5+fDB061DFdLyMjQydI11133Vnft66uTgYNGnRF4wAAcA0kTgAAl6QSmW7durXJY6m1UDk5ObqS9PXXX8s111wjs2fPlr/+9a9t8vj29VCff/65JCQkXFZDCwCAa2ONEwDALW3evPm8j3v37n3B+6vGEA8++KCeAvj3v/9dFi5cqG9XX6PWSam1TnYbNmwQk8kkPXv2lMjISImPj5ctW7Y4Pq+m6u3YscPxcZ8+fXSClJubq5O9pm+qNToAwP1RcQIAuCS1bqigoOCs29QUOXtTB9XEQU2XGzNmjLz11luydetWWbx4cbOP9fTTT+v1SFdddZV+3M8++8yRZKnGEs8884xOqv74xz9KcXGx/PznP5cpU6bo9U3K448/Ln/+8591N75evXrJCy+8IKWlpY7HDw8Pl1//+td6HZSa4qdiKisr0wlYRESEfmwAgHsjcQIAuKQVK1boSk9TqgJ08OBBffzss8/KsmXLZNasWfp+77zzjq78NCcgIECeeuop3TRCtQofO3as/lolJCREvvzyS50cXX311fpjtR5KJUd2v/rVr/Q6J5UAqUrUww8/LD/5yU90cmT33HPP6aqW6q539OhR3bpcNatQzSwAAO6PrnoAALejuuqpduCqyQMAAO2BNU4AAAAA0AISJwAAAABoAWucAABuh1nmAID2RsUJAAAAAFpA4gQAAAAALSBxAgAAAIAWkDgBAAAAQAtInAAAAACgBSROAAAAANACEicAAAAAaAGJEwAAAADIxf1/ca9w/ggdBLkAAAAASUVORK5CYII=", + "text/plain": [ + "
    " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Compare the performance of the simple RAG pipeline and the RL-enhanced RAG pipeline\n", + "# using the sample query and its expected answer.\n", + "# The function returns:\n", + "# - simple_response: The response generated by the simple RAG pipeline.\n", + "# - rl_response: The best response generated by the RL-enhanced RAG pipeline.\n", + "# - simple_sim: The similarity score of the simple RAG response to the ground truth.\n", + "# - rl_sim: The similarity score of the RL-enhanced RAG response to the ground truth.\n", + "simple_response, rl_response, simple_sim, rl_sim = compare_rag_approaches(sample_query, expected_answer)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can clearly see that the response generated by the RL-enhanced RAG model is more accurate and relevant compared to the simple RAG pipeline. The improvement in similarity to the ground truth is evident, indicating that the RL-enhanced model has learned to generate better responses through training." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Saving the Comparison Results\n", + "\n", + "After implementing the RL algorithm, we can save the comparison results to check the performance of the RL implementation later." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Results saved to rl_rag_results.json\n" + ] + } + ], + "source": [ + "# Save the results for later comparison\n", + "results = {\n", + " \"query\": query_text, # The input query text\n", + " \"ground_truth\": expected_answer, # The expected correct answer for the query\n", + " \"simple_rag\": {\n", + " \"response\": simple_response, # The response generated by the simple RAG pipeline\n", + " \"similarity\": float(simple_sim) # The similarity score of the simple RAG response to the ground truth\n", + " },\n", + " \"rl_rag\": {\n", + " \"response\": rl_response, # The response generated by the RL-enhanced RAG pipeline\n", + " \"similarity\": float(rl_sim) # The similarity score of the RL-enhanced RAG response to the ground truth\n", + " },\n", + " \"improvement\": float(rl_sim - simple_sim) # The improvement in similarity score achieved by RL-enhanced RAG\n", + "}\n", + "\n", + "# Save the results to a JSON file for future reference\n", + "with open('rl_rag_results.json', 'w') as f:\n", + " json.dump(results, f, indent=2) # Write the results dictionary to the file with indentation for readability\n", + "\n", + "# Print a confirmation message to indicate that the results have been saved\n", + "print(\"\\nResults saved to rl_rag_results.json\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## What can we conclude?\n", + "\n", + "- The performance of the simple RAG is lower compared to the RL-enhanced RAG on factual queries.\n", + "- The RL-enhanced RAG achieved a 19.5% improvement in the similarity score within 5 episodes.\n", + "- Further improvements can be achieved by:\n", + " - Training for more episodes.\n", + " - Tuning hyperparameters.\n", + "- Time is a key constraint for training.\n", + "- Parallel implementation of the RL algorithm can help reduce training time." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".vene-rag-rl", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From b46c6b2ecb1c8c71ba9fc291d380f3692be9bc4a Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Thu, 20 Mar 2025 18:36:06 +0500 Subject: [PATCH 18/32] RL RAG Addition --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e01e5f8..f1db524 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ Here's a glimpse of the techniques covered: | [18. Hierarchy RAG](18_hierarchy_rag.ipynb) | Builds hierarchical indices (summaries + detailed chunks) for efficient retrieval. | | [19. HyDE RAG](19_HyDE_rag.ipynb) | Uses Hypothetical Document Embeddings to improve semantic matching. | | [20. CRAG](20_crag.ipynb) | Corrective RAG: Dynamically evaluates retrieval quality and uses web search as a fallback. | +| [21. Rag with RL](21_rag_with_rl.ipynb) | Maximize the reward of the RAG model using Reinforcement Learning. | ## 🗂️ Repository Structure @@ -66,6 +67,7 @@ fareedkhan-dev-all-rag-techniques/ ├── 18_hierarchy_rag.ipynb ├── 19_HyDE_rag.ipynb ├── 20_crag.ipynb +├── 21_rag_with_rl.ipynb ├── requirements.txt <- Python dependencies └── data/ └── val.json <- Sample validation data (queries and answers) From 2c13669f715bd084c01f8fdcf4ceda1515859290 Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Thu, 20 Mar 2025 19:00:04 +0500 Subject: [PATCH 19/32] Updates --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index f1db524..ff9df7e 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,10 @@ This repository takes a clear, hands-on approach to **Retrieval-Augmented Genera The goal is simple: provide code that is readable, modifiable, and educational. By focusing on the fundamentals, this project helps demystify RAG and makes it easier to understand how it really works. +## Update: 📢 +- (20-Mar-2025) Added a new notebook on RAG with Reinforcement Learning. +- (07-Mar-2025) Added 20 RAG techniques to the repository. + ## 🚀 What's Inside? This repository contains a collection of Jupyter Notebooks, each focusing on a specific RAG technique. Each notebook provides: From ff4d4263af267cc10c3f9cc7a50f67c0552c9f09 Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Thu, 20 Mar 2025 19:05:48 +0500 Subject: [PATCH 20/32] RL Data --- data/quantum.txt | 89 +++++++++++++++++++++++++++++++++++++++++++ data/reward_plot.png | Bin 0 -> 34436 bytes data/val_rl.json | 68 +++++++++++++++++++++++++++++++++ 3 files changed, 157 insertions(+) create mode 100644 data/quantum.txt create mode 100644 data/reward_plot.png create mode 100644 data/val_rl.json diff --git a/data/quantum.txt b/data/quantum.txt new file mode 100644 index 0000000..b708cd2 --- /dev/null +++ b/data/quantum.txt @@ -0,0 +1,89 @@ +Quantum Computing: Principles, Progress, and Possibilities + +Introduction + +Quantum computing represents one of the most significant paradigm shifts in computational theory since the advent of electronic computers. Unlike classical computers that process information in binary digits (bits), quantum computers leverage quantum mechanical phenomena to process information in quantum bits, or qubits. This fundamental difference enables quantum computers to potentially solve certain problems exponentially faster than classical computers, challenging our current understanding of computational complexity and creating new possibilities across various domains including cryptography, material science, optimization, and artificial intelligence. + +The field traces its conceptual origins to the early 1980s when physicist Richard Feynman proposed the idea of quantum computers. Feynman observed that simulating quantum systems on classical computers was exponentially complex and suggested that computers based on quantum principles might be more efficient for such simulations. This insight laid the foundation for quantum computing as we understand it today. + +Quantum Mechanical Foundations + +Superposition + +At the heart of quantum computing lies the principle of superposition. While a classical bit must be either 0 or 1, a qubit can exist in a state that is effectively both 0 and 1 simultaneously until measured. Mathematically, we represent this as: + +|ψ⟩ = α|0⟩ + β|1⟩ + +Where α and β are complex numbers satisfying |α|² + |β|² = 1, representing the probability amplitudes for measuring the qubit in state |0⟩ or |1⟩ respectively. This property allows quantum computers to process multiple possibilities simultaneously, contributing to their computational advantage. + +Entanglement + +Quantum entanglement represents another cornerstone of quantum computing. When qubits become entangled, the state of one qubit becomes intrinsically linked to the state of another, regardless of the physical distance separating them. This phenomenon, which Einstein famously referred to as "spooky action at a distance," enables quantum computers to establish correlations that have no classical analog. + +A simple representation of an entangled state is the Bell state: + +|Φ⁺⟩ = (|00⟩ + |11⟩)/√2 + +In this state, measuring one qubit immediately determines the state of the other, regardless of separation distance. Entanglement allows quantum algorithms to perform operations with an efficiency unattainable in classical computing. + +Quantum Interference + +Quantum interference occurs when the probability amplitudes of quantum states interact. Through careful manipulation, constructive interference can enhance desired computational outcomes while destructive interference can suppress undesired ones. Quantum algorithms are specifically designed to harness interference patterns to increase the probability of measuring the correct answer. + +Quantum Gates and Circuits + +Quantum computers process information through quantum gates, analogous to logic gates in classical computing but operating according to quantum mechanical principles. Common quantum gates include: + +- Pauli-X Gate: The quantum equivalent of a classical NOT gate, flipping |0⟩ to |1⟩ and vice versa. +- Hadamard Gate (H): Creates superposition by transforming |0⟩ to (|0⟩ + |1⟩)/√2 and |1⟩ to (|0⟩ - |1⟩)/√2. +- CNOT Gate: A two-qubit gate that flips the second qubit's state if the first qubit is |1⟩, critical for creating entanglement. +- Phase Gates (S, T): Introduce phase shifts in quantum states, essential for quantum algorithms. + +Quantum circuits combine these gates in specific sequences to implement algorithms. Unlike classical circuits, quantum circuits are inherently reversible until measurement occurs, a property termed quantum coherence. + +Major Quantum Algorithms + +Shor's Algorithm + +Developed by Peter Shor in 1994, Shor's algorithm represents a watershed moment in quantum computing. It provides an efficient method for finding the prime factors of large integers, a problem believed to be computationally difficult for classical computers. The security of widely-used RSA encryption relies precisely on this difficulty. Shor's algorithm can theoretically factor large numbers in polynomial time, posing a significant threat to current cryptographic systems once sufficiently powerful quantum computers become available. + +The algorithm works by reducing the factoring problem to the task of finding the period of a function, which can be solved efficiently using the quantum Fourier transform. The time complexity is O((log N)³), exponentially faster than the best-known classical algorithms. + +Grover's Algorithm + +Developed by Lov Grover in 1996, Grover's algorithm provides a quadratic speedup for unstructured search problems. While a classical computer requires O(N) operations to search an unsorted database of N items, Grover's algorithm accomplishes this in O(√N) operations. + +Quantum Error Correction + +One of the greatest challenges in quantum computing is maintaining quantum coherence in the presence of environmental noise. Quantum error correction (QEC) addresses this challenge by encoding logical qubits across multiple physical qubits, enabling the detection and correction of errors without directly measuring the quantum state (which would collapse superposition). + +Current Quantum Hardware Approaches + +Superconducting Qubits + +Currently the most advanced quantum computing platform, superconducting qubits operate using Josephson junctions—two superconductors separated by a thin insulating barrier. + +Trapped Ions + +Trapped ion quantum computers use electromagnetic fields to suspend individual ions (charged atoms) in vacuum. + +Quantum Advantage and Practical Applications + +Quantum Chemistry and Materials Science + +Quantum computers are naturally suited to simulating quantum systems, potentially revolutionizing our ability to design new materials and chemical compounds. + +Optimization Problems + +Many industrial processes involve complex optimization challenges that quantum computers may address more efficiently than classical methods. + +Future Outlook + +The path to practical quantum computing will likely proceed through distinct stages: +1. NISQ Era (current) +2. Error-Corrected Systems +3. Fault-Tolerant Quantum Computing + +Conclusion + +Quantum computing represents both a revolutionary computational paradigm and one of the most ambitious engineering projects of our time. While current quantum computers remain limited in capability, the field is advancing rapidly through global investment from governments, corporations, and academic institutions. \ No newline at end of file diff --git a/data/reward_plot.png b/data/reward_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..4a6c75478b48458f8e2cd23dc1be3dacc375922d GIT binary patch literal 34436 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 U9{QanD1b?d$==AicK7lB0m)}UkN^Mx literal 0 HcmV?d00001 diff --git a/data/val_rl.json b/data/val_rl.json new file mode 100644 index 0000000..00b0451 --- /dev/null +++ b/data/val_rl.json @@ -0,0 +1,68 @@ +{ + "basic_factual_questions": [ + { + "question": "What is the mathematical representation of a qubit in superposition?", + "answer": "|ψ⟩ = α|0⟩ + β|1⟩, where α and β are complex numbers satisfying |α|² + |β|² = 1, representing the probability amplitudes for measuring the qubit in state |0⟩ or |1⟩ respectively." + }, + { + "question": "Who proposed the original concept of quantum computers in the 1980s?", + "answer": "Physicist Richard Feynman proposed the idea of quantum computers in the early 1980s, observing that simulating quantum systems on classical computers was exponentially complex and suggesting that computers based on quantum principles might be more efficient for such simulations." + }, + { + "question": "What temperature do superconducting qubits typically operate at?", + "answer": "Superconducting qubits operate when cooled to near absolute zero, typically 10-15 millikelvin." + }, + { + "question": "What is the time complexity of Shor's algorithm for factoring large numbers?", + "answer": "The time complexity of Shor's algorithm is O((log N)³), which is exponentially faster than the best-known classical algorithms for factoring large numbers." + } + ], + "complex_synthesis_questions": [ + { + "question": "How do quantum error correction codes protect information without violating the no-cloning theorem?", + "answer": "Quantum error correction codes protect information by encoding a single logical qubit across multiple physical qubits, creating an entangled state that distributes quantum information redundantly across a larger system. This approach doesn't violate the no-cloning theorem because it doesn't make perfect copies of unknown quantum states. Instead, it uses syndrome measurements that detect error patterns without directly measuring the encoded quantum information. These measurements collapse only the error information while preserving the quantum state in the code space. The surface code mentioned in the document is a prominent example that can detect and correct both bit-flip and phase-flip errors without measuring the logical qubit state itself." + }, + { + "question": "Compare and contrast the hardware approaches used by Google and IonQ for their quantum computers, including their relative advantages and disadvantages.", + "answer": "Google uses superconducting qubits, which operate using Josephson junctions cooled to near absolute zero (10-15 millikelvin). Advantages include faster gate operations and a more straightforward path to scalability using established semiconductor fabrication techniques. Disadvantages include extremely low operating temperatures, shorter coherence times, and higher error rates. IonQ uses trapped ion technology, which suspends individual ions in electromagnetic fields with quantum information stored in their electronic states. Advantages include significantly longer coherence times, extremely high fidelity operations (lower error rates), and the ability to have all-to-all connectivity between qubits. Disadvantages include slower gate operations compared to superconducting qubits and greater challenges in scaling to very large numbers of qubits. Google demonstrated 'quantum supremacy' with its 53-qubit Sycamore processor in 2019, while IonQ focuses on achieving higher-quality qubits even at lower counts." + }, + { + "question": "Explain how Grover's algorithm achieves quadratic speedup and why it cannot achieve exponential speedup for unstructured search problems.", + "answer": "Grover's algorithm achieves quadratic speedup through amplitude amplification, which iteratively increases the probability amplitude of the target state in a superposition. Starting with an equal superposition of all possible states, it applies a series of operations (oracle consultation followed by diffusion) approximately π√N/4 times to gradually amplify the amplitude of the solution state while diminishing others. It cannot achieve exponential speedup because of fundamental limits in quantum mechanics. Mathematically, each iteration can only increase the probability amplitude of the correct answer by O(1/√N). Therefore, O(√N) iterations are necessary to reach a high probability of measuring the correct answer. This quadratic limit was proven by Bennett, Bernstein, Brassard, and Vazirani to be the theoretical maximum possible speedup for any quantum algorithm solving unstructured search problems." + } + ], + "nuanced_evaluation_questions": [ + { + "question": "What are the most significant technical barriers to achieving fault-tolerant quantum computing, and which ones might be overcome first?", + "answer": "The most significant technical barriers include: 1) Quantum Decoherence: Current quantum systems lose quantum properties (coherence) in microseconds to milliseconds due to environmental interactions. 2) High Error Rates: Current quantum gates have error rates between 0.1% and 1% per operation, several orders of magnitude too high for complex algorithms. 3) Scalability Issues: Building larger systems introduces challenges like cross-talk between qubits, increased error rates with system size, and complex control electronics. 4) Qubit Quality and Quantity: Creating enough high-quality qubits (estimated 1,000 physical qubits per logical qubit for error correction) with sufficient coherence times. 5) Quantum-Classical Interface: Efficiently transferring information between classical and quantum systems. Error reduction in individual physical qubits will likely be overcome first, as incremental improvements continue through better materials and control techniques. The development of small-scale error correction demonstrations will follow. The most challenging barriers are likely the massive scale-up required for fully fault-tolerant systems and the engineering complexities of maintaining quantum coherence across thousands of interacting qubits." + }, + { + "question": "How might quantum computing impact modern cryptographic systems, and what timeline concerns should cybersecurity experts consider?", + "answer": "Quantum computing primarily threatens public key cryptography systems that rely on mathematical problems like integer factorization (RSA) and discrete logarithm (ECC, DSA). Shor's algorithm can theoretically solve these problems exponentially faster than classical algorithms, potentially breaking most current internet security. Cybersecurity experts should consider: Near-term (5-10 years): While fully fault-tolerant quantum computers aren't expected during this period, organizations should begin inventorying cryptographic dependencies and planning transitions. Medium-term (10-20 years): The emergence of error-corrected quantum computers with hundreds of logical qubits could begin to threaten 1024 or 2048-bit RSA keys. Long-term considerations: Data with long-term sensitivity is already at risk from 'harvest now, decrypt later' attacks where encrypted data is stored until quantum computers can break it. Timeline uncertainties are substantial, with expert estimates for fault-tolerant systems ranging from 5 to 30+ years. Organizations should implement quantum-resistant cryptographic algorithms (post-quantum cryptography) well before quantum computers can break current systems, with NIST currently standardizing such algorithms." + }, + { + "question": "For what specific types of machine learning tasks might quantum computers offer the most significant advantages over classical approaches?", + "answer": "Quantum computers may offer the most significant advantages for: 1) Dimensionality Reduction: Quantum principal component analysis could exponentially speed up the processing of high-dimensional data, benefiting image and speech recognition. 2) Kernel Methods: Quantum computers can implement kernel functions that would be computationally prohibitive classically, potentially improving support vector machines and other kernel-based algorithms. 3) Sampling from Complex Distributions: Quantum computers could more efficiently sample from complex probability distributions, beneficial for generative models and Boltzmann machines. 4) Optimization Problems: Finding optimal parameters in deep learning models could be accelerated using quantum optimization algorithms for certain classes of problems. 5) Recommendation Systems: Quantum recommendation systems could process large user-item matrices more efficiently for personalized recommendations. The advantages would be most pronounced for problems involving large feature spaces, complex correlation structures, or where quantum states can naturally represent the problem structure." + } + ], + "application_questions": [ + { + "question": "How could quantum computing potentially revolutionize drug discovery processes?", + "answer": "Quantum computing could revolutionize drug discovery by: 1) Molecular Modeling: Accurately simulating molecular structures and interactions at the quantum level, allowing precise modeling of drug candidates and their interactions with biological targets. 2) Protein Folding: Better predicting three-dimensional protein structures from amino acid sequences, critical for understanding disease mechanisms and designing targeted therapies. 3) Binding Affinity Calculations: More accurately calculating how strongly potential drug molecules bind to their targets, improving lead compound selection. 4) Metabolic Pathway Simulation: Modeling complex biochemical pathways to predict drug metabolism and potential side effects. 5) Combinatorial Optimization: Efficiently searching vast chemical spaces to identify novel drug candidates with desired properties. These capabilities could dramatically reduce the time and cost of bringing new drugs to market by minimizing failed clinical trials due to unforeseen side effects or efficacy issues. Companies like Zapata Computing are already developing quantum algorithms specifically for chemical simulations applicable to pharmaceutical research." + }, + { + "question": "What industries might see the earliest practical benefits from quantum computing, and why?", + "answer": "Industries likely to see earliest benefits include: 1) Materials Science & Chemical Industries: Problems in these fields directly map to quantum mechanical simulations. Even modest quantum advantage could immediately impact catalyst design, battery development, and novel materials discovery. 2) Financial Services: Portfolio optimization, risk assessment, and fraud detection could benefit from quantum algorithms for optimization and machine learning, with direct profit incentives driving adoption. 3) Logistics & Supply Chain: Combinatorial optimization problems like routing, scheduling, and resource allocation could see improvements from quantum approaches to optimization, with immediate cost-saving applications. 4) Pharmaceuticals: Drug discovery processes could be accelerated through better molecular simulations, with high-value outcomes justifying investment in early quantum capabilities. 5) Energy Sector: Grid optimization, material design for solar cells, and more efficient carbon capture technologies could benefit from quantum computation. These industries share characteristics of high-value problems that map well to quantum algorithms, the ability to benefit from even partial quantum advantage, and sufficient profit potential to justify investment in early-stage quantum technologies." + } + ], + "conceptual_understanding_questions": [ + { + "question": "Explain the relationship between quantum entanglement and the potential computational advantage of quantum computers.", + "answer": "Quantum entanglement establishes correlations between qubits that have no classical equivalent, creating a computational resource essential to quantum advantage. When qubits become entangled, their states cannot be described independently—the quantum state of the entire system must be considered as a whole. This enables: 1) Exponential State Space: An n-qubit system can represent 2^n states simultaneously through entanglement, allowing quantum computers to process multiple possibilities in parallel. 2) Non-local Correlations: Entanglement enables information to be distributed across multiple qubits in ways that classical bits cannot, creating computational patterns inaccessible to classical systems. 3) Algorithm Speedups: Entanglement is crucial for quantum algorithms like Shor's and Grover's. Without entanglement, quantum computation can be efficiently simulated on classical computers, eliminating any potential speed advantage. 4) Multi-qubit Operations: Entangling operations like the CNOT gate are fundamental building blocks for quantum circuits, establishing the correlations necessary for complex quantum algorithms. Simply put, entanglement is the resource that allows quantum computers to perform calculations in ways fundamentally different from classical computers, accessing computational paths that scale exponentially better for certain problems." + }, + { + "question": "How does the principle of quantum interference contribute to the functioning of quantum algorithms?", + "answer": "Quantum interference is a fundamental mechanism that enables quantum algorithms to outperform classical counterparts: 1) Probability Amplitude Manipulation: Quantum interference occurs when probability amplitudes (not just probabilities) of quantum states interact. Through careful algorithm design, constructive interference can enhance desired computational outcomes while destructive interference cancels out undesired ones. 2) Path Selection: In algorithms like Deutsch-Jozsa or Shor's, quantum interference effectively allows the system to evaluate multiple computational paths simultaneously and have the correct answers 'interfere constructively' while incorrect answers 'interfere destructively.' 3) Amplitude Amplification: Grover's algorithm specifically exploits interference to gradually increase the amplitude of target states through repeated application of operations that cause interference patterns. 4) Phase Information Processing: Quantum algorithms encode information in the phases of quantum states. Interference allows these phases to interact, performing computational work that has no classical counterpart. Quantum interference, combined with superposition and entanglement, forms the computational basis that allows quantum algorithms to solve certain problems more efficiently than any known classical algorithm. Without interference, the advantages of quantum computing would largely disappear, as the system would behave more like probabilistic classical computing." + } + ] +} \ No newline at end of file From 45645cae2566797abb6de599e117a8a751850a5f Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Thu, 20 Mar 2025 19:07:24 +0500 Subject: [PATCH 21/32] Fix val query path --- 21_rag_with_rl.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/21_rag_with_rl.ipynb b/21_rag_with_rl.ipynb index 9cc4297..87302d8 100644 --- a/21_rag_with_rl.ipynb +++ b/21_rag_with_rl.ipynb @@ -796,7 +796,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -812,7 +812,7 @@ ], "source": [ "# Open the validation data file in read mode and load its content as a dictionary\n", - "with open('data/val.json', 'r') as file:\n", + "with open('data/val_rl.json', 'r') as file:\n", " validation_data = json.load(file)\n", "\n", "# Test the basic RAG pipeline with a sample query\n", From 325273e4404c82fa7ca17a4db74cd9015f1dad4f Mon Sep 17 00:00:00 2001 From: A1pine Date: Mon, 24 Mar 2025 23:17:27 +0800 Subject: [PATCH 22/32] =?UTF-8?q?Fix:=20The=20=E2=80=9CAI=5Finformation.pd?= =?UTF-8?q?f=E2=80=9D=20used=20in=20the=20books=20=20is=20not=20aligned=20?= =?UTF-8?q?with=20the=20actual=20file=20name.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 12_adaptive_rag.ipynb | 2 +- 1_simple_rag.ipynb | 2 +- 2_semantic_chunking.ipynb | 2 +- 3_chunk_size_selector.ipynb | 4 ++-- 4_context_enriched_rag.ipynb | 2 +- 5_contextual_chunk_headers_rag.ipynb | 2 +- 6_doc_augmentation_rag.ipynb | 4 ++-- 7_query_transform.ipynb | 2 +- 8_reranker.ipynb | 2 +- 9_rse.ipynb | 2 +- README.md | 4 ++-- 11 files changed, 14 insertions(+), 14 deletions(-) diff --git a/12_adaptive_rag.ipynb b/12_adaptive_rag.ipynb index 2f8ba81..460006a 100644 --- a/12_adaptive_rag.ipynb +++ b/12_adaptive_rag.ipynb @@ -1240,7 +1240,7 @@ "source": [ "# Path to your knowledge source document\n", "# This PDF file contains the information that the RAG system will use\n", - "pdf_path = \"data/AI_information.pdf\"\n", + "pdf_path = \"data/AI_Information.pdf\"\n", "\n", "# Define test queries covering different query types to demonstrate \n", "# how adaptive retrieval handles various query intentions\n", diff --git a/1_simple_rag.ipynb b/1_simple_rag.ipynb index c4f9325..611959f 100644 --- a/1_simple_rag.ipynb +++ b/1_simple_rag.ipynb @@ -176,7 +176,7 @@ ], "source": [ "# Define the path to the PDF file\n", - "pdf_path = \"data/AI_information.pdf\"\n", + "pdf_path = \"data/AI_Information.pdf\"\n", "\n", "# Extract text from the PDF file\n", "extracted_text = extract_text_from_pdf(pdf_path)\n", diff --git a/2_semantic_chunking.ipynb b/2_semantic_chunking.ipynb index 61ff12e..f7c43a9 100644 --- a/2_semantic_chunking.ipynb +++ b/2_semantic_chunking.ipynb @@ -92,7 +92,7 @@ " return all_text.strip()\n", "\n", "# Define the path to the PDF file\n", - "pdf_path = \"data/AI_information.pdf\"\n", + "pdf_path = \"data/AI_Information.pdf\"\n", "\n", "# Extract text from the PDF file\n", "extracted_text = extract_text_from_pdf(pdf_path)\n", diff --git a/3_chunk_size_selector.ipynb b/3_chunk_size_selector.ipynb index 7f00868..b30cc86 100644 --- a/3_chunk_size_selector.ipynb +++ b/3_chunk_size_selector.ipynb @@ -70,7 +70,7 @@ "metadata": {}, "source": [ "## Extracting Text from the PDF\n", - "First, we will extract text from the `AI_information.pdf` file." + "First, we will extract text from the `AI_Information.pdf` file." ] }, { @@ -116,7 +116,7 @@ " return all_text.strip()\n", "\n", "# Define the path to the PDF file\n", - "pdf_path = \"data/AI_information.pdf\"\n", + "pdf_path = \"data/AI_Information.pdf\"\n", "\n", "# Extract text from the PDF file\n", "extracted_text = extract_text_from_pdf(pdf_path)\n", diff --git a/4_context_enriched_rag.ipynb b/4_context_enriched_rag.ipynb index 33c274f..6ad52bf 100644 --- a/4_context_enriched_rag.ipynb +++ b/4_context_enriched_rag.ipynb @@ -175,7 +175,7 @@ ], "source": [ "# Define the path to the PDF file\n", - "pdf_path = \"data/AI_information.pdf\"\n", + "pdf_path = \"data/AI_Information.pdf\"\n", "\n", "# Extract text from the PDF file\n", "extracted_text = extract_text_from_pdf(pdf_path)\n", diff --git a/5_contextual_chunk_headers_rag.ipynb b/5_contextual_chunk_headers_rag.ipynb index b681ce1..e65951f 100644 --- a/5_contextual_chunk_headers_rag.ipynb +++ b/5_contextual_chunk_headers_rag.ipynb @@ -212,7 +212,7 @@ ], "source": [ "# Define the PDF file path\n", - "pdf_path = \"data/AI_information.pdf\"\n", + "pdf_path = \"data/AI_Information.pdf\"\n", "\n", "# Extract text from the PDF file\n", "extracted_text = extract_text_from_pdf(pdf_path)\n", diff --git a/6_doc_augmentation_rag.ipynb b/6_doc_augmentation_rag.ipynb index a626655..a3107d9 100644 --- a/6_doc_augmentation_rag.ipynb +++ b/6_doc_augmentation_rag.ipynb @@ -428,7 +428,7 @@ ], "source": [ "# Define the path to the PDF file\n", - "pdf_path = \"data/AI_information.pdf\"\n", + "pdf_path = \"data/AI_Information.pdf\"\n", "\n", "# Process the document (extract text, create chunks, generate questions, build vector store)\n", "text_chunks, vector_store = process_document(\n", @@ -846,7 +846,7 @@ ], "source": [ "# Define the path to the PDF file\n", - "pdf_path = \"data/AI_information.pdf\"\n", + "pdf_path = \"data/AI_Information.pdf\"\n", "\n", "# Extract text from the PDF file\n", "extracted_text = extract_text_from_pdf(pdf_path)\n", diff --git a/7_query_transform.ipynb b/7_query_transform.ipynb index 85e4a64..fb61415 100644 --- a/7_query_transform.ipynb +++ b/7_query_transform.ipynb @@ -1033,7 +1033,7 @@ "reference_answer = data[0]['ideal_answer']\n", "\n", "# pdf_path\n", - "pdf_path = \"data/AI_information.pdf\"\n", + "pdf_path = \"data/AI_Information.pdf\"\n", "\n", "# Run evaluation\n", "evaluation_results = evaluate_transformations(pdf_path, query, reference_answer)" diff --git a/8_reranker.ipynb b/8_reranker.ipynb index d4e449f..2496cd1 100644 --- a/8_reranker.ipynb +++ b/8_reranker.ipynb @@ -609,7 +609,7 @@ "reference_answer = data[0]['ideal_answer']\n", "\n", "# pdf_path\n", - "pdf_path = \"data/AI_information.pdf\"" + "pdf_path = \"data/AI_Information.pdf\"" ] }, { diff --git a/9_rse.ipynb b/9_rse.ipynb index f638d28..ae9f263 100644 --- a/9_rse.ipynb +++ b/9_rse.ipynb @@ -871,7 +871,7 @@ "reference_answer = data[0]['ideal_answer']\n", "\n", "# pdf_path\n", - "pdf_path = \"data/AI_information.pdf\"\n", + "pdf_path = \"data/AI_Information.pdf\"\n", "\n", "# Run evaluation\n", "results = evaluate_methods(pdf_path, query, reference_answer)" diff --git a/README.md b/README.md index ff9df7e..9dc57a2 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ fareedkhan-dev-all-rag-techniques/ ├── requirements.txt <- Python dependencies └── data/ └── val.json <- Sample validation data (queries and answers) - └── AI_information.pdf <- A sample PDF document for testing. + └── AI_Information.pdf <- A sample PDF document for testing. └── attention_is_all_you_need.pdf <- A sample PDF document for testing (for Multi-Modal RAG). ``` @@ -116,7 +116,7 @@ fareedkhan-dev-all-rag-techniques/ Open any of the Jupyter Notebooks (`.ipynb` files) using Jupyter Notebook or JupyterLab. Each notebook is self-contained and can be run independently. The notebooks are designed to be executed sequentially within each file. - **Note:** The `data/AI_information.pdf` file provides a sample document for testing. You can replace it with your own PDF. The `data/val.json` file contains sample queries and ideal answers for evaluation. + **Note:** The `data/AI_Information.pdf` file provides a sample document for testing. You can replace it with your own PDF. The `data/val.json` file contains sample queries and ideal answers for evaluation. The 'attention_is_all_you_need.pdf' is for testing Multi-Modal RAG Notebook. ## 💡 Core Concepts From edfc6567e7c8a0a1900123360f0df275cf059091 Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Sun, 27 Apr 2025 11:49:13 +0500 Subject: [PATCH 23/32] Best RAG Pipeline --- best_rag_finder.ipynb | 1415 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1415 insertions(+) create mode 100644 best_rag_finder.ipynb diff --git a/best_rag_finder.ipynb b/best_rag_finder.ipynb new file mode 100644 index 0000000..f860d72 --- /dev/null +++ b/best_rag_finder.ipynb @@ -0,0 +1,1415 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "intro-header-v5", + "metadata": {}, + "source": [ + "# Learning RAG: Testing Configurations Step-by-Step\n", + "## An Educational End-to-End Pipeline with Enhanced Evaluation\n", + "\n", + "This notebook is designed as a learning project to understand how different settings impact Retrieval-Augmented Generation (RAG) systems. We'll build and test a pipeline step-by-step using the **Nebius AI API**.\n", + "\n", + "**What we'll learn:**\n", + "* How text chunking (`chunk_size`, `chunk_overlap`) affects what the RAG system retrieves.\n", + "* How the number of retrieved documents (`top_k`) influences the context provided to the LLM.\n", + "* The difference between three common RAG strategies (Simple, Query Rewrite, Rerank).\n", + "* How to use an LLM (like Nebius AI) to automatically evaluate the quality of generated answers using multiple metrics: **Faithfulness**, **Relevancy**, and **Semantic Similarity** to a ground truth answer.\n", + "* How to combine these metrics into an average score for easier comparison.\n", + "\n", + "We'll focus on understanding *why* we perform each step and observing the outcomes clearly, with detailed explanations and commented code." + ] + }, + { + "cell_type": "markdown", + "id": "toc-v5", + "metadata": {}, + "source": [ + "### Table of Contents\n", + "1. **Setup: Installing Libraries**: Get the necessary tools.\n", + "2. **Setup: Importing Libraries**: Bring the tools into our workspace.\n", + "3. **Configuration: Setting Up Our Experiment**: Define API details, models, evaluation prompts, and parameters to test.\n", + "4. **Input Data: The Knowledge Source & Our Question**: Define the documents the RAG system will learn from and the question we'll ask.\n", + "5. **Core Component: Text Chunking Function**: Create a function to break documents into smaller pieces.\n", + "6. **Core Component: Connecting to Nebius AI**: Establish the connection to use Nebius models.\n", + "7. **Core Component: Cosine Similarity Function**: Create a function to measure semantic similarity between texts.\n", + "8. **The Experiment: Iterating Through Configurations**: The main loop where we test different settings.\n", + " * 8.1 Processing a Chunking Configuration (Chunk, Embed, Index)\n", + " * 8.2 Testing RAG Strategies for a `top_k` Value\n", + " * 8.3 Running & Evaluating a Single RAG Strategy (including Similarity)\n", + "9. **Analysis: Reviewing the Results**: Use Pandas to organize and display the results.\n", + "10. **Conclusion: What Did We Learn?**: Reflect on the findings and potential next steps." + ] + }, + { + "cell_type": "markdown", + "id": "setup-install-v5", + "metadata": {}, + "source": [ + "### 1. Setup: Installing Libraries\n", + "\n", + "First, we need to install the Python packages required for this notebook. \n", + "- `openai`: Interacts with the Nebius API (which uses an OpenAI-compatible interface).\n", + "- `pandas`: For creating and managing data tables (DataFrames).\n", + "- `numpy`: For numerical operations, especially with vectors (embeddings).\n", + "- `faiss-cpu`: For efficient similarity search on vectors (the retrieval part).\n", + "- `ipywidgets`, `tqdm`: For displaying progress bars in Jupyter.\n", + "- `scikit-learn`: For calculating cosine similarity." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "install-libs-v5", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Install libraries (run this cell only once if needed)\n", + "# !pip install openai pandas numpy faiss-cpu ipywidgets tqdm scikit-learn" + ] + }, + { + "cell_type": "markdown", + "id": "install-note-v5", + "metadata": {}, + "source": [ + "**Remember!** After the installation finishes, you might need to **Restart the Kernel** (or Runtime) for Jupyter/Colab to recognize the newly installed packages. Look for this option in the menu (e.g., 'Kernel' -> 'Restart Kernel...' or 'Runtime' -> 'Restart Runtime')." + ] + }, + { + "cell_type": "markdown", + "id": "setup-import-v5", + "metadata": {}, + "source": [ + "### 2. Setup: Importing Libraries\n", + "\n", + "With the libraries installed, we import them into our Python environment to make their functions available." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "import-code-v5", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Libraries imported successfully!\n" + ] + } + ], + "source": [ + "import os # For accessing environment variables (like API keys)\n", + "import time # For timing operations\n", + "import re # For regular expressions (text cleaning)\n", + "import warnings # For controlling warning messages\n", + "import itertools # For creating parameter combinations easily\n", + "import getpass # For securely prompting for API keys if not set\n", + "\n", + "import numpy as np # Numerical library for vector operations\n", + "import pandas as pd # Data manipulation library for tables (DataFrames)\n", + "import faiss # Library for fast vector similarity search\n", + "from openai import OpenAI # Client library for Nebius API interaction\n", + "from tqdm.notebook import tqdm # Library for displaying progress bars\n", + "from sklearn.metrics.pairwise import cosine_similarity # For calculating similarity score\n", + "\n", + "# Configure display options for Pandas DataFrames for better readability\n", + "pd.set_option('display.max_colwidth', 150) # Show more text content in table cells\n", + "pd.set_option('display.max_rows', 100) # Display more rows in tables\n", + "warnings.filterwarnings('ignore', category=FutureWarning) # Suppress specific non-critical warnings\n", + "\n", + "print(\"Libraries imported successfully!\")" + ] + }, + { + "cell_type": "markdown", + "id": "config-params-v5", + "metadata": {}, + "source": [ + "### 3. Configuration: Setting Up Our Experiment\n", + "\n", + "Here, we define all the settings and parameters for our experiment directly as Python variables. This makes it easy to see and modify the configuration in one place.\n", + "\n", + "**Key Configuration Areas:**\n", + "* **Nebius API Details:** Credentials and model identifiers for connecting to Nebius AI.\n", + "* **LLM Settings:** Parameters controlling the behavior of the language model during answer generation (e.g., `temperature` for creativity).\n", + "* **Evaluation Prompts:** The specific instructions (prompts) given to the LLM when it acts as an evaluator for Faithfulness and Relevancy.\n", + "* **Tuning Parameters:** The different values for chunk size, overlap, and retrieval `top_k` that we want to systematically test.\n", + "* **Reranking Setting:** Configuration for the simulated reranking strategy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "config-setup-v5", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--- Configuration Check --- \n", + "Attempting to load Nebius API Key from environment variable 'NEBIUS_API_KEY'...\n", + "Nebius API Key loaded successfully from environment variable.\n", + "Models: Embed='BAAI/bge-multilingual-gemma2', Gen='deepseek-ai/DeepSeek-V3', Eval='deepseek-ai/DeepSeek-V3'\n", + "Chunk Sizes to Test: [150, 250]\n", + "Overlaps to Test: [30, 50]\n", + "Top-K Values to Test: [3, 5]\n", + "Generation Temp: 0.1, Max Tokens: 400\n", + "Configuration ready.\n", + "-------------------------\n" + ] + } + ], + "source": [ + "# --- NebiusAI API Configuration ---\n", + "# It's best practice to store API keys as environment variables rather than hardcoding them.\n", + "# Provide your actual key here or set it as an environment variable\n", + "NEBIUS_API_KEY = os.getenv('NEBIUS_API_KEY', None) # Load API key from environment variable\n", + "if NEBIUS_API_KEY is None:\n", + " print(\"Warning: NEBIUS_API_KEY not set. Please set it in your environment variables or provide it directly in the code.\") \n", + "NEBIUS_BASE_URL = \"https://api.studio.nebius.com/v1/\" \n", + "NEBIUS_EMBEDDING_MODEL = \"BAAI/bge-multilingual-gemma2\" # Model for converting text to vector embeddings\n", + "NEBIUS_GENERATION_MODEL = \"deepseek-ai/DeepSeek-V3\" # LLM for generating the final answers\n", + "NEBIUS_EVALUATION_MODEL = \"deepseek-ai/DeepSeek-V3\" # LLM used for evaluating the generated answers\n", + "\n", + "# --- Text Generation Parameters (for RAG answer generation) ---\n", + "GENERATION_TEMPERATURE = 0.1 # Lower values (e.g., 0.1-0.3) make output more focused and deterministic, good for fact-based answers.\n", + "GENERATION_MAX_TOKENS = 400 # Maximum number of tokens (roughly words/sub-words) in the generated answer.\n", + "GENERATION_TOP_P = 0.9 # Nucleus sampling parameter (alternative to temperature, usually fine at default).\n", + "\n", + "# --- Evaluation Prompts (Instructions for the Evaluator LLM) ---\n", + "# Faithfulness: Does the answer stay true to the provided context?\n", + "FAITHFULNESS_PROMPT = \"\"\"\n", + "System: You are an objective evaluator. Evaluate the faithfulness of the AI Response compared to the True Answer, considering only the information present in the True Answer as the ground truth.\n", + "Faithfulness measures how accurately the AI response reflects the information in the True Answer, without adding unsupported facts or contradicting it.\n", + "Score STRICTLY using a float between 0.0 and 1.0, based on this scale:\n", + "- 0.0: Completely unfaithful, contradicts or fabricates information.\n", + "- 0.1-0.4: Low faithfulness with significant inaccuracies or unsupported claims.\n", + "- 0.5-0.6: Partially faithful but with noticeable inaccuracies or omissions.\n", + "- 0.7-0.8: Mostly faithful with only minor inaccuracies or phrasing differences.\n", + "- 0.9: Very faithful, slight wording differences but semantically aligned.\n", + "- 1.0: Completely faithful, accurately reflects the True Answer.\n", + "Respond ONLY with the numerical score.\n", + "\n", + "User:\n", + "Query: {question}\n", + "AI Response: {response}\n", + "True Answer: {true_answer}\n", + "Score:\"\"\"\n", + "\n", + "# Relevancy: Does the answer directly address the user's query?\n", + "RELEVANCY_PROMPT = \"\"\"\n", + "System: You are an objective evaluator. Evaluate the relevance of the AI Response to the specific User Query.\n", + "Relevancy measures how well the response directly answers the user's question, avoiding unnecessary or off-topic information.\n", + "Score STRICTLY using a float between 0.0 and 1.0, based on this scale:\n", + "- 0.0: Not relevant at all.\n", + "- 0.1-0.4: Low relevance, addresses a different topic or misses the core question.\n", + "- 0.5-0.6: Partially relevant, answers only a part of the query or is tangentially related.\n", + "- 0.7-0.8: Mostly relevant, addresses the main aspects of the query but might include minor irrelevant details.\n", + "- 0.9: Highly relevant, directly answers the query with minimal extra information.\n", + "- 1.0: Completely relevant, directly and fully answers the exact question asked.\n", + "Respond ONLY with the numerical score.\n", + "\n", + "User:\n", + "Query: {question}\n", + "AI Response: {response}\n", + "Score:\"\"\"\n", + "\n", + "# --- Parameters to Tune (The experimental variables) ---\n", + "CHUNK_SIZES_TO_TEST = [150, 250] # List of chunk sizes (in words) to experiment with.\n", + "CHUNK_OVERLAPS_TO_TEST = [30, 50] # List of chunk overlaps (in words) to experiment with.\n", + "RETRIEVAL_TOP_K_TO_TEST = [3, 5] # List of 'k' values (number of chunks to retrieve) to test.\n", + "\n", + "# --- Reranking Configuration (Only used for the Rerank strategy) ---\n", + "RERANK_RETRIEVAL_MULTIPLIER = 3 # For simulated reranking: retrieve K * multiplier chunks initially.\n", + "\n", + "# --- Validate API Key --- \n", + "print(\"--- Configuration Check --- \")\n", + "print(f\"Attempting to load Nebius API Key from environment variable 'NEBIUS_API_KEY'...\")\n", + "if not NEBIUS_API_KEY:\n", + " print(\"Nebius API Key not found in environment variables.\")\n", + " # Prompt the user securely if the key is not found.\n", + " NEBIUS_API_KEY = getpass.getpass(\"Please enter your Nebius API Key: \")\n", + "else:\n", + " print(\"Nebius API Key loaded successfully from environment variable.\")\n", + "\n", + "# Print a summary of key settings for verification\n", + "print(f\"Models: Embed='{NEBIUS_EMBEDDING_MODEL}', Gen='{NEBIUS_GENERATION_MODEL}', Eval='{NEBIUS_EVALUATION_MODEL}'\")\n", + "print(f\"Chunk Sizes to Test: {CHUNK_SIZES_TO_TEST}\")\n", + "print(f\"Overlaps to Test: {CHUNK_OVERLAPS_TO_TEST}\")\n", + "print(f\"Top-K Values to Test: {RETRIEVAL_TOP_K_TO_TEST}\")\n", + "print(f\"Generation Temp: {GENERATION_TEMPERATURE}, Max Tokens: {GENERATION_MAX_TOKENS}\")\n", + "print(\"Configuration ready.\")\n", + "print(\"-\" * 25)" + ] + }, + { + "cell_type": "markdown", + "id": "input-data-v5", + "metadata": {}, + "source": [ + "### 4. Input Data: The Knowledge Source & Our Question\n", + "\n", + "Every RAG system needs a knowledge base to draw information from. Here, we define:\n", + "* `corpus_texts`: A list of strings, where each string is a document containing information (in this case, about renewable energy sources).\n", + "* `test_query`: The specific question we want the RAG system to answer using the `corpus_texts`.\n", + "* `true_answer_for_query`: A carefully crafted 'ground truth' answer based *only* on the information available in `corpus_texts`. This is essential for evaluating Faithfulness and Semantic Similarity accurately." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "corpus-def-v5", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loaded 5 documents into our corpus.\n", + "Test Query: 'Compare the consistency and environmental impact of solar power versus hydropower.'\n", + "Reference (True) Answer for evaluation: 'Solar power's consistency varies with weather and time of day, requiring storage like batteries. Hydropower is generally reliable, but large dams have significant environmental impacts on ecosystems and communities, unlike solar power's primary impact being land use for panels.'\n", + "Input data is ready.\n", + "-------------------------\n" + ] + } + ], + "source": [ + "# Our knowledge base: A list of text documents about renewable energy\n", + "corpus_texts = [\n", + " \"Solar power uses PV panels or CSP systems. PV converts sunlight directly to electricity. CSP uses mirrors to heat fluid driving a turbine. It's clean but varies with weather/time. Storage (batteries) is key for consistency.\", # Doc 0\n", + " \"Wind energy uses turbines in wind farms. It's sustainable with low operating costs. Wind speed varies, siting can be challenging (visual/noise). Offshore wind is stronger and more consistent.\", # Doc 1\n", + " \"Hydropower uses moving water, often via dams spinning turbines. Reliable, large-scale power with flood control/water storage benefits. Big dams harm ecosystems and displace communities. Run-of-river is smaller, less disruptive.\", # Doc 2\n", + " \"Geothermal energy uses Earth's heat via steam/hot water for turbines. Consistent 24/7 power, small footprint. High initial drilling costs, sites are geographically limited.\", # Doc 3\n", + " \"Biomass energy from organic matter (wood, crops, waste). Burned directly or converted to biofuels. Uses waste, provides dispatchable power. Requires sustainable sourcing. Combustion releases emissions (carbon-neutral if balanced by regrowth).\" # Doc 4\n", + "]\n", + "\n", + "# The question we will ask the RAG system\n", + "test_query = \"Compare the consistency and environmental impact of solar power versus hydropower.\"\n", + "\n", + "# !!! CRITICAL: The 'True Answer' MUST be derivable ONLY from the corpus_texts above !!!\n", + "# This is our ground truth for evaluation.\n", + "true_answer_for_query = \"Solar power's consistency varies with weather and time of day, requiring storage like batteries. Hydropower is generally reliable, but large dams have significant environmental impacts on ecosystems and communities, unlike solar power's primary impact being land use for panels.\"\n", + "\n", + "print(f\"Loaded {len(corpus_texts)} documents into our corpus.\")\n", + "print(f\"Test Query: '{test_query}'\")\n", + "print(f\"Reference (True) Answer for evaluation: '{true_answer_for_query}'\")\n", + "print(\"Input data is ready.\")\n", + "print(\"-\" * 25)" + ] + }, + { + "cell_type": "markdown", + "id": "chunking-func-md-v5", + "metadata": {}, + "source": [ + "### 5. Core Component: Text Chunking Function\n", + "\n", + "LLMs and embedding models have limits on the amount of text they can process at once. Furthermore, retrieval works best when searching over smaller, focused pieces of text rather than entire large documents. \n", + "\n", + "**Chunking** is the process of splitting large documents into smaller, potentially overlapping, segments.\n", + "\n", + "- **`chunk_size`**: Determines the approximate size (here, in words) of each chunk.\n", + "- **`chunk_overlap`**: Specifies how many words from the end of one chunk should also be included at the beginning of the next chunk. This helps prevent relevant information from being lost if it spans across the boundary between two chunks.\n", + "\n", + "We define a function `chunk_text` to perform this splitting based on word counts." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "chunking-func-v5", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Defining the 'chunk_text' function.\n", + "Test chunking on first doc (size=150 words, overlap=30 words): Created 1 chunks.\n", + "First sample chunk:\n", + "'Solar power uses PV panels or CSP systems. PV converts sunlight directly to electricity. CSP uses mirrors to heat fluid driving a turbine. It's clean but varies with weather/time. Storage (batteries) is key for consistency.'\n", + "-------------------------\n" + ] + } + ], + "source": [ + "def chunk_text(text, chunk_size, chunk_overlap):\n", + " \"\"\"Splits a single text document into overlapping chunks based on word count.\n", + "\n", + " Args:\n", + " text (str): The input text to be chunked.\n", + " chunk_size (int): The target number of words per chunk.\n", + " chunk_overlap (int): The number of words to overlap between consecutive chunks.\n", + "\n", + " Returns:\n", + " list[str]: A list of text chunks.\n", + " \"\"\"\n", + " words = text.split() # Split the text into a list of individual words\n", + " total_words = len(words) # Calculate the total number of words in the text\n", + " chunks = [] # Initialize an empty list to store the generated chunks\n", + " start_index = 0 # Initialize the starting word index for the first chunk\n", + "\n", + " # --- Input Validation ---\n", + " # Ensure chunk_size is a positive integer.\n", + " if not isinstance(chunk_size, int) or chunk_size <= 0:\n", + " print(f\" Warning: Invalid chunk_size ({chunk_size}). Must be a positive integer. Returning the whole text as one chunk.\")\n", + " return [text]\n", + " # Ensure chunk_overlap is a non-negative integer smaller than chunk_size.\n", + " if not isinstance(chunk_overlap, int) or chunk_overlap < 0:\n", + " print(f\" Warning: Invalid chunk_overlap ({chunk_overlap}). Must be a non-negative integer. Setting overlap to 0.\")\n", + " chunk_overlap = 0\n", + " if chunk_overlap >= chunk_size:\n", + " # If overlap is too large, adjust it to a reasonable fraction (e.g., 1/3) of chunk_size\n", + " # This prevents infinite loops or nonsensical chunking.\n", + " adjusted_overlap = chunk_size // 3\n", + " print(f\" Warning: chunk_overlap ({chunk_overlap}) >= chunk_size ({chunk_size}). Adjusting overlap to {adjusted_overlap}.\")\n", + " chunk_overlap = adjusted_overlap\n", + "\n", + " # --- Chunking Loop ---\n", + " # Continue chunking as long as the start_index is within the bounds of the text\n", + " while start_index < total_words:\n", + " # Determine the end index for the current chunk.\n", + " # It's the minimum of (start + chunk_size) and the total number of words.\n", + " end_index = min(start_index + chunk_size, total_words)\n", + " \n", + " # Extract the words for the current chunk and join them back into a single string.\n", + " current_chunk_text = \" \".join(words[start_index:end_index])\n", + " chunks.append(current_chunk_text) # Add the generated chunk to the list\n", + " \n", + " # Calculate the starting index for the *next* chunk.\n", + " # Move forward by (chunk_size - chunk_overlap) words.\n", + " next_start_index = start_index + chunk_size - chunk_overlap\n", + " \n", + " # --- Safety Checks ---\n", + " # Check 1: Prevent infinite loops if overlap causes no progress.\n", + " # This can happen if chunk_size is very small or overlap is very large relative to chunk_size.\n", + " if next_start_index <= start_index:\n", + " if end_index == total_words: # If we are already at the end, we can safely break.\n", + " break\n", + " else: \n", + " # Force progress by moving forward by at least one word.\n", + " print(f\" Warning: Chunking logic stuck (start={start_index}, next_start={next_start_index}). Forcing progress.\")\n", + " next_start_index = start_index + 1 \n", + " \n", + " # Check 2: If the calculated next start index is already at or beyond the total number of words, we are done.\n", + " if next_start_index >= total_words:\n", + " break\n", + " \n", + " # Move the start_index to the calculated position for the next iteration.\n", + " start_index = next_start_index\n", + " \n", + " return chunks # Return the complete list of text chunks\n", + "\n", + "# --- Quick Test ---\n", + "# Test the function with the first document and sample parameters.\n", + "print(\"Defining the 'chunk_text' function.\")\n", + "sample_chunk_size = 150\n", + "sample_overlap = 30\n", + "sample_chunks = chunk_text(corpus_texts[0], sample_chunk_size, sample_overlap) \n", + "print(f\"Test chunking on first doc (size={sample_chunk_size} words, overlap={sample_overlap} words): Created {len(sample_chunks)} chunks.\")\n", + "if sample_chunks: # Only print if chunks were created\n", + " print(f\"First sample chunk:\\n'{sample_chunks[0]}'\")\n", + "print(\"-\" * 25)" + ] + }, + { + "cell_type": "markdown", + "id": "client-setup-md-v5", + "metadata": {}, + "source": [ + "### 6. Core Component: Connecting to Nebius AI\n", + "\n", + "To use the Nebius AI models (for embedding, generation, evaluation), we need to establish a connection to their API. We use the `openai` Python library, which provides a convenient way to interact with OpenAI-compatible APIs like Nebius.\n", + "\n", + "We instantiate an `OpenAI` client object, providing our API key and the specific Nebius API endpoint URL." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "client-setup-v5", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Attempting to initialize the Nebius AI client...\n", + "Nebius AI client initialized successfully. Ready to make API calls.\n", + "Client setup step complete.\n", + "-------------------------\n" + ] + } + ], + "source": [ + "client = None # Initialize client variable to None globally\n", + "\n", + "print(\"Attempting to initialize the Nebius AI client...\")\n", + "try:\n", + " # Check if the API key is actually available before creating the client\n", + " if not NEBIUS_API_KEY:\n", + " raise ValueError(\"Nebius API Key is missing. Cannot initialize client.\")\n", + " \n", + " # Create the OpenAI client object, configured for the Nebius API.\n", + " client = OpenAI(\n", + " api_key=NEBIUS_API_KEY, # Pass the API key loaded earlier\n", + " base_url=NEBIUS_BASE_URL # Specify the Nebius API endpoint\n", + " )\n", + " \n", + " # Optional: Add a quick test call to verify the client connection,\n", + " # e.g., listing models (if supported and desired). This might incur costs.\n", + " # try:\n", + " # client.models.list() \n", + " # print(\"Client connection verified by listing models.\")\n", + " # except Exception as test_e:\n", + " # print(f\"Warning: Could not verify client connection with test call: {test_e}\")\n", + " \n", + " print(\"Nebius AI client initialized successfully. Ready to make API calls.\")\n", + " \n", + "except Exception as e:\n", + " # Catch any errors during client initialization (e.g., invalid key, network issues)\n", + " print(f\"Error initializing Nebius AI client: {e}\")\n", + " print(\"!!! Execution cannot proceed without a valid client. Please check your API key and network connection. !!!\")\n", + " # Setting client back to None to prevent further attempts if initialization failed\n", + " client = None \n", + "\n", + "print(\"Client setup step complete.\")\n", + "print(\"-\" * 25)" + ] + }, + { + "cell_type": "markdown", + "id": "similarity-func-md-v5", + "metadata": {}, + "source": [ + "### 7. Core Component: Cosine Similarity Function\n", + "\n", + "To evaluate how semantically similar the generated answer is to our ground truth answer, we use **Cosine Similarity**. This metric measures the cosine of the angle between two vectors (in our case, the embedding vectors of the two answers).\n", + "\n", + "- A score of **1** means the vectors point in the same direction (maximum similarity).\n", + "- A score of **0** means the vectors are orthogonal (no similarity).\n", + "- A score of **-1** means the vectors point in opposite directions (maximum dissimilarity).\n", + "\n", + "For text embeddings, scores typically range from 0 to 1, where higher values indicate greater semantic similarity.\n", + "\n", + "We define a function `calculate_cosine_similarity` that takes two text strings, generates their embeddings using the Nebius client, and returns their cosine similarity score." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "similarity-func-v5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Defining the 'calculate_cosine_similarity' function.\n", + "Testing similarity function: Similarity between 'apple' and 'orange' = 0.77\n", + "-------------------------\n" + ] + } + ], + "source": [ + "def calculate_cosine_similarity(text1, text2, client, embedding_model):\n", + " \"\"\"Calculates cosine similarity between the embeddings of two texts.\n", + "\n", + " Args:\n", + " text1 (str): The first text string.\n", + " text2 (str): The second text string.\n", + " client (OpenAI): The initialized Nebius AI client.\n", + " embedding_model (str): The name of the embedding model to use.\n", + "\n", + " Returns:\n", + " float: The cosine similarity score (between 0.0 and 1.0), or 0.0 if an error occurs.\n", + " \"\"\"\n", + " if not client:\n", + " print(\" Error: Nebius client not available for similarity calculation.\")\n", + " return 0.0\n", + " if not text1 or not text2:\n", + " # Handle cases where one or both texts might be empty or None\n", + " return 0.0\n", + " \n", + " try:\n", + " # Generate embeddings for both texts in a single API call if possible\n", + " response = client.embeddings.create(model=embedding_model, input=[text1, text2])\n", + " \n", + " # Extract the embedding vectors\n", + " embedding1 = np.array(response.data[0].embedding)\n", + " embedding2 = np.array(response.data[1].embedding)\n", + " \n", + " # Reshape vectors to be 2D arrays as expected by cosine_similarity\n", + " embedding1 = embedding1.reshape(1, -1)\n", + " embedding2 = embedding2.reshape(1, -1)\n", + " \n", + " # Calculate cosine similarity using scikit-learn\n", + " # cosine_similarity returns a 2D array, e.g., [[similarity]], so we extract the value.\n", + " similarity_score = cosine_similarity(embedding1, embedding2)[0][0]\n", + " \n", + " # Clamp the score between 0.0 and 1.0 for safety/consistency\n", + " return max(0.0, min(1.0, similarity_score))\n", + " \n", + " except Exception as e:\n", + " print(f\" Error calculating cosine similarity: {e}\")\n", + " return 0.0 # Return 0.0 in case of any API or calculation errors\n", + "\n", + "# --- Quick Test ---\n", + "print(\"Defining the 'calculate_cosine_similarity' function.\")\n", + "if client: # Only run test if client is initialized\n", + " test_sim = calculate_cosine_similarity(\"apple\", \"orange\", client, NEBIUS_EMBEDDING_MODEL)\n", + " print(f\"Testing similarity function: Similarity between 'apple' and 'orange' = {test_sim:.2f}\")\n", + "else:\n", + " print(\"Skipping similarity function test as Nebius client is not initialized.\")\n", + "print(\"-\" * 25)" + ] + }, + { + "cell_type": "markdown", + "id": "main-loop-md-v5", + "metadata": {}, + "source": [ + "### 8. The Experiment: Iterating Through Configurations\n", + "\n", + "This section contains the main experimental loop. We will systematically iterate through all combinations of the tuning parameters we defined earlier (`CHUNK_SIZES_TO_TEST`, `CHUNK_OVERLAPS_TO_TEST`, `RETRIEVAL_TOP_K_TO_TEST`).\n", + "\n", + "**Workflow for Each Parameter Combination:**\n", + "\n", + "1. **Prepare Data (Chunking/Embedding/Indexing - Step 8.1):**\n", + " * **Check if Re-computation Needed:** If the `chunk_size` or `chunk_overlap` has changed from the previous iteration, we need to re-process the corpus.\n", + " * **Chunking:** Split all documents in `corpus_texts` using the current `chunk_size` and `chunk_overlap` via the `chunk_text` function.\n", + " * **Embedding:** Convert each text chunk into a numerical vector (embedding) using the specified Nebius embedding model (`NEBIUS_EMBEDDING_MODEL`). We do this in batches for efficiency.\n", + " * **Indexing:** Build a FAISS index (`IndexFlatL2`) from the generated embeddings. FAISS allows for very fast searching to find the chunks whose embeddings are most similar to the query embedding.\n", + " * *Optimization:* If chunk settings haven't changed, we reuse the existing chunks, embeddings, and index from the previous iteration to save time and API calls.\n", + "\n", + "2. **Test RAG Strategies (Step 8.2):**\n", + " * For the current `top_k` value, run each of the defined RAG strategies:\n", + " * **Simple RAG:** Retrieve `top_k` chunks based on similarity to the original query.\n", + " * **Query Rewrite RAG:** First, ask the LLM to rewrite the original query to be potentially better for vector search. Then, retrieve `top_k` chunks based on similarity to the *rewritten* query.\n", + " * **Rerank RAG (Simulated):** Retrieve more chunks initially (`top_k * RERANK_RETRIEVAL_MULTIPLIER`). Then, *simulate* reranking by simply taking the top `top_k` results from this larger initial set. (A real implementation would use a more sophisticated reranking model).\n", + "\n", + "3. **Evaluate & Store Results (Step 8.3 within `run_and_evaluate`):**\n", + " * For each strategy run:\n", + " * **Retrieve:** Find the relevant chunk indices using the FAISS index.\n", + " * **Generate:** Construct a prompt containing the retrieved chunk(s) as context and the *original* `test_query`. Send this to the Nebius generation model (`NEBIUS_GENERATION_MODEL`) to get the final answer.\n", + " * **Evaluate (Faithfulness):** Use the LLM evaluator (`NEBIUS_EVALUATION_MODEL`) with the `FAITHFULNESS_PROMPT` to score how well the generated answer aligns with the `true_answer_for_query`.\n", + " * **Evaluate (Relevancy):** Use the LLM evaluator with the `RELEVANCY_PROMPT` to score how well the generated answer addresses the `test_query`.\n", + " * **Evaluate (Similarity):** Use our `calculate_cosine_similarity` function to get the semantic similarity score between the generated answer and the `true_answer_for_query`.\n", + " * **Calculate Average Score:** Compute the average of Faithfulness, Relevancy, and Similarity scores.\n", + " * **Record:** Store all parameters (`chunk_size`, `overlap`, `top_k`, `strategy`), the retrieved indices, the rewritten query (if applicable), the generated answer, the individual scores, the average score, and the execution time for this specific run.\n", + "\n", + "We use `tqdm` to display a progress bar for the outer loop iterating through parameter combinations." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "main-loop-exec-v5", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "=== Starting RAG Experiment Loop ===\n", + "\n", + "Total parameter combinations to test: 8\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "29485f798215461b910fc4eb4c8546d7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Testing Configurations: 0%| | 0/8 [00:00 ntotal)\n", + " retrieved_indices_all = indices[0]\n", + " valid_indices = retrieved_indices_all[retrieved_indices_all != -1].tolist()\n", + " \n", + " # 4. Apply simulated reranking (if applicable)\n", + " # In this simulation, we just take the top 'k_retrieve' results from the initially retrieved set.\n", + " # A real reranker would re-score these 'k_for_search' candidates based on relevance to the query.\n", + " if use_simulated_rerank:\n", + " final_indices = valid_indices[:k_retrieve]\n", + " # print(f\" Rerank: Selected top {len(final_indices)} indices after simulated rerank.\") # Uncomment for verbose logging\n", + " else:\n", + " final_indices = valid_indices # Use all valid retrieved indices up to k_retrieve\n", + " \n", + " result['retrieved_indices'] = final_indices\n", + " \n", + " # 5. Get the actual text chunks corresponding to the final indices\n", + " retrieved_chunks = [current_chunks[i] for i in final_indices]\n", + " \n", + " # Handle case where no chunks were retrieved (should be rare with valid indices)\n", + " if not retrieved_chunks:\n", + " print(f\" Warning: No relevant chunks found for {strategy_name} (C={chunk_size}, O={chunk_overlap}, K={k_retrieve}). Setting answer to indicate this.\")\n", + " result['answer'] = \"No relevant context found in the documents based on the query.\"\n", + " # Keep scores at 0.0 as no answer was generated from context\n", + " else:\n", + " # --- Generation Step --- \n", + " # Combine the retrieved chunks into a single context string\n", + " context_str = \"\\n\\n\".join(retrieved_chunks)\n", + " \n", + " # Define the system prompt for the generation LLM\n", + " sys_prompt_gen = \"You are a helpful AI assistant. Answer the user's query based strictly on the provided context. If the context doesn't contain the answer, state that clearly. Be concise.\"\n", + " \n", + " # Construct the user prompt including the context and the *original* query\n", + " # It's important to use the original query here for generating the final answer, even if a rewritten query was used for retrieval.\n", + " user_prompt_gen = f\"Context:\\n------\\n{context_str}\\n------\\n\\nQuery: {test_query}\\n\\nAnswer:\"\n", + " \n", + " # Make the API call to the Nebius generation model\n", + " gen_response = client.chat.completions.create(\n", + " model=NEBIUS_GENERATION_MODEL, \n", + " messages=[\n", + " {\"role\": \"system\", \"content\": sys_prompt_gen},\n", + " {\"role\": \"user\", \"content\": user_prompt_gen}\n", + " ],\n", + " temperature=GENERATION_TEMPERATURE,\n", + " max_tokens=GENERATION_MAX_TOKENS,\n", + " top_p=GENERATION_TOP_P\n", + " )\n", + " # Extract the generated text answer\n", + " generated_answer = gen_response.choices[0].message.content.strip()\n", + " result['answer'] = generated_answer\n", + " # Optional: print a snippet of the generated answer\n", + " # print(f\" Generated Answer: {generated_answer[:100].replace('\\n', ' ')}...\") \n", + "\n", + " # --- Evaluation Step --- \n", + " # Evaluate the generated answer using Faithfulness, Relevancy, and Similarity\n", + " # print(f\" Evaluating answer... (Faithfulness, Relevancy, Similarity)\") # Uncomment for verbose logging\n", + " \n", + " # Prepare parameters for evaluation calls (use low temperature for deterministic scoring)\n", + " eval_params = {'model': NEBIUS_EVALUATION_MODEL, 'temperature': 0.0, 'max_tokens': 10}\n", + " \n", + " # 1. Faithfulness Evaluation Call\n", + " prompt_f = FAITHFULNESS_PROMPT.format(question=test_query, response=generated_answer, true_answer=true_answer_for_query)\n", + " try:\n", + " resp_f = client.chat.completions.create(messages=[{\"role\": \"user\", \"content\": prompt_f}], **eval_params)\n", + " # Attempt to parse the score, clamp between 0.0 and 1.0\n", + " result['faithfulness'] = max(0.0, min(1.0, float(resp_f.choices[0].message.content.strip())))\n", + " except Exception as eval_e:\n", + " print(f\" Warning: Faithfulness score parsing error for {strategy_name} - {eval_e}. Score set to 0.0\")\n", + " result['faithfulness'] = 0.0\n", + "\n", + " # 2. Relevancy Evaluation Call\n", + " prompt_r = RELEVANCY_PROMPT.format(question=test_query, response=generated_answer)\n", + " try:\n", + " resp_r = client.chat.completions.create(messages=[{\"role\": \"user\", \"content\": prompt_r}], **eval_params)\n", + " # Attempt to parse the score, clamp between 0.0 and 1.0\n", + " result['relevancy'] = max(0.0, min(1.0, float(resp_r.choices[0].message.content.strip())))\n", + " except Exception as eval_e:\n", + " print(f\" Warning: Relevancy score parsing error for {strategy_name} - {eval_e}. Score set to 0.0\")\n", + " result['relevancy'] = 0.0\n", + " \n", + " # 3. Similarity Score Calculation\n", + " result['similarity_score'] = calculate_cosine_similarity(\n", + " generated_answer, \n", + " true_answer_for_query, \n", + " client, \n", + " NEBIUS_EMBEDDING_MODEL\n", + " )\n", + " \n", + " # 4. Calculate Average Score (Faithfulness, Relevancy, Similarity)\n", + " result['avg_score'] = (result['faithfulness'] + result['relevancy'] + result['similarity_score']) / 3.0\n", + " \n", + " except Exception as e:\n", + " # Catch any unexpected errors during the retrieve/generate/evaluate process\n", + " error_message = f\"ERROR during {strategy_name} (C={chunk_size}, O={chunk_overlap}, K={k_retrieve}): {str(e)[:200]}...\"\n", + " print(f\" {error_message}\")\n", + " result['answer'] = error_message # Store the error in the answer field\n", + " # Ensure scores remain at their default error state (0.0)\n", + " result['faithfulness'] = 0.0\n", + " result['relevancy'] = 0.0\n", + " result['similarity_score'] = 0.0\n", + " result['avg_score'] = 0.0\n", + " \n", + " # Record the total time taken for this run\n", + " run_end_time = time.time()\n", + " result['time_sec'] = run_end_time - run_start_time\n", + " \n", + " # Print a summary line for this run (useful for monitoring progress)\n", + " print(f\" Finished: {strategy_name} (C={chunk_size}, O={chunk_overlap}, K={k_retrieve}). AvgScore={result['avg_score']:.2f}, Time={result['time_sec']:.2f}s\")\n", + " return result\n", + " # --- End of run_and_evaluate nested function ---\n", + "\n", + " # --- Execute the RAG Strategies using the run_and_evaluate function --- \n", + " \n", + " # Strategy 1: Simple RAG (Use original query for retrieval)\n", + " result_simple = run_and_evaluate(\"Simple RAG\", test_query, top_k)\n", + " all_results.append(result_simple)\n", + "\n", + " # Strategy 2: Query Rewrite RAG \n", + " rewritten_q = test_query # Default to original query if rewrite fails\n", + " try:\n", + " # print(\" Attempting query rewrite for Rewrite RAG...\") # Uncomment for verbose logging\n", + " # Define prompts for the query rewriting task\n", + " sys_prompt_rw = \"You are an expert query optimizer. Rewrite the user's query to be ideal for vector database retrieval. Focus on key entities, concepts, and relationships. Remove conversational fluff. Output ONLY the rewritten query text.\"\n", + " user_prompt_rw = f\"Original Query: {test_query}\\n\\nRewritten Query:\"\n", + " \n", + " # Call the LLM to rewrite the query\n", + " resp_rw = client.chat.completions.create(\n", + " model=NEBIUS_GENERATION_MODEL, # Can use the generation model for this task too\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": sys_prompt_rw},\n", + " {\"role\": \"user\", \"content\": user_prompt_rw}\n", + " ],\n", + " temperature=0.1, # Low temp for focused rewrite\n", + " max_tokens=100, \n", + " top_p=0.9\n", + " )\n", + " # Clean up the LLM's response to get just the query text\n", + " candidate_q = resp_rw.choices[0].message.content.strip()\n", + " # Remove potential prefixes like \"Rewritten Query:\" or \"Query:\"\n", + " candidate_q = re.sub(r'^(rewritten query:|query:)\\s*', '', candidate_q, flags=re.IGNORECASE).strip('\"')\n", + " \n", + " # Use the rewritten query only if it's reasonably different and not too short\n", + " if candidate_q and len(candidate_q) > 5 and candidate_q.lower() != test_query.lower(): \n", + " rewritten_q = candidate_q\n", + " # print(f\" Using rewritten query: '{rewritten_q}'\") # Uncomment for verbose logging\n", + " # else: \n", + " # print(\" Rewrite failed, too short, or same as original. Using original query.\") # Uncomment for verbose logging\n", + " except Exception as e:\n", + " print(f\" Warning: Error during query rewrite: {e}. Using original query.\")\n", + " rewritten_q = test_query # Fallback to original query on error\n", + " \n", + " # Run evaluation using the (potentially) rewritten query for retrieval\n", + " result_rewrite = run_and_evaluate(\"Query Rewrite RAG\", rewritten_q, top_k)\n", + " all_results.append(result_rewrite)\n", + "\n", + " # Strategy 3: Rerank RAG (Simulated)\n", + " # Use original query for retrieval, but simulate the reranking process\n", + " result_rerank = run_and_evaluate(\"Rerank RAG (Simulated)\", test_query, top_k, use_simulated_rerank=True)\n", + " all_results.append(result_rerank)\n", + "\n", + " print(\"\\n=== RAG Experiment Loop Finished ===\")\n", + " print(\"-\" * 25)" + ] + }, + { + "cell_type": "markdown", + "id": "analysis-v5", + "metadata": {}, + "source": [ + "### 9. Analysis: Reviewing the Results\n", + "\n", + "Now that the experiment loop has completed and `all_results` contains the data from each run, we'll use the Pandas library to analyze the findings.\n", + "\n", + "1. **Create DataFrame:** Convert the list of result dictionaries (`all_results`) into a Pandas DataFrame for easy manipulation and viewing.\n", + "2. **Sort Results:** Sort the DataFrame by the `avg_score` (the average of Faithfulness, Relevancy, and Similarity) in descending order, so the best-performing configurations appear first.\n", + "3. **Display Top Configurations:** Show the top N rows of the sorted DataFrame, including key parameters, scores, and the generated answer, to quickly identify promising settings.\n", + "4. **Summarize Best Run:** Print a clear summary of the single best-performing configuration based on the average score, showing its parameters, individual scores, time taken, and the full answer it generated." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "compare-results-v5", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--- Analyzing Experiment Results ---\n", + "Total results collected: 24\n", + "\n", + "--- Top 10 Performing Configurations (Sorted by Average Score) ---\n" + ] + }, + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    chunk_sizeoverlaptop_kstrategyavg_scorefaithfulnessrelevancysimilarity_scoretime_secanswer
    0250503Simple RAG0.8994170.91.00.7982518.975824Solar power and hydropower differ significantly in consistency and environmental impact:\\n\\n- **Consistency**: \\n - **Solar Power**: Inconsisten...
    1250503Query Rewrite RAG0.8968590.91.00.7905786.550637**Consistency:**\\n- **Hydropower** is highly reliable and provides consistent, large-scale power, as it is not dependent on weather conditions onc...
    2150303Rerank RAG (Simulated)0.8941250.91.00.7823749.526656**Consistency:** \\n- **Hydropower** is highly reliable and consistent, providing large-scale power 24/7, as it is not dependent on weather or tim...
    3150503Query Rewrite RAG0.8938230.91.00.7814689.675948**Consistency:** \\n- **Hydropower** is highly reliable and provides consistent, large-scale power, as it is not dependent on weather conditions o...
    4150303Query Rewrite RAG0.8936660.91.00.78099710.357061**Consistency:**\\n- **Hydropower** is highly reliable and consistent, providing large-scale power 24/7, as it relies on the continuous flow of wat...
    5150503Simple RAG0.8927740.91.00.7783219.777294**Consistency:** \\n- **Hydropower** is highly consistent and reliable, providing large-scale power 24/7, especially with dams that store water fo...
    6250503Rerank RAG (Simulated)0.8915700.91.00.77470941.228211**Consistency:** \\n- **Hydropower** is highly reliable and provides consistent, large-scale power, especially with dams that can store water and ...
    7250303Query Rewrite RAG0.8908780.91.00.7726358.359087**Consistency:** \\n- **Hydropower** is highly reliable and provides consistent, large-scale power, especially with dams that can store water and ...
    8250305Simple RAG0.8908670.91.00.7726018.767287**Consistency:** \\n- **Solar Power:** Inconsistent due to dependence on weather and daylight. Requires storage solutions (e.g., batteries) for re...
    9150505Simple RAG0.8906560.91.00.7719679.743746**Consistency:** \\n- **Solar Power:** Inconsistent due to dependence on weather and daylight. Requires storage solutions (e.g., batteries) for re...
    \n", + "
    " + ], + "text/plain": [ + " chunk_size overlap top_k strategy avg_score \\\n", + "0 250 50 3 Simple RAG 0.899417 \n", + "1 250 50 3 Query Rewrite RAG 0.896859 \n", + "2 150 30 3 Rerank RAG (Simulated) 0.894125 \n", + "3 150 50 3 Query Rewrite RAG 0.893823 \n", + "4 150 30 3 Query Rewrite RAG 0.893666 \n", + "5 150 50 3 Simple RAG 0.892774 \n", + "6 250 50 3 Rerank RAG (Simulated) 0.891570 \n", + "7 250 30 3 Query Rewrite RAG 0.890878 \n", + "8 250 30 5 Simple RAG 0.890867 \n", + "9 150 50 5 Simple RAG 0.890656 \n", + "\n", + " faithfulness relevancy similarity_score time_sec \\\n", + "0 0.9 1.0 0.798251 8.975824 \n", + "1 0.9 1.0 0.790578 6.550637 \n", + "2 0.9 1.0 0.782374 9.526656 \n", + "3 0.9 1.0 0.781468 9.675948 \n", + "4 0.9 1.0 0.780997 10.357061 \n", + "5 0.9 1.0 0.778321 9.777294 \n", + "6 0.9 1.0 0.774709 41.228211 \n", + "7 0.9 1.0 0.772635 8.359087 \n", + "8 0.9 1.0 0.772601 8.767287 \n", + "9 0.9 1.0 0.771967 9.743746 \n", + "\n", + " answer \n", + "0 Solar power and hydropower differ significantly in consistency and environmental impact:\\n\\n- **Consistency**: \\n - **Solar Power**: Inconsisten... \n", + "1 **Consistency:**\\n- **Hydropower** is highly reliable and provides consistent, large-scale power, as it is not dependent on weather conditions onc... \n", + "2 **Consistency:** \\n- **Hydropower** is highly reliable and consistent, providing large-scale power 24/7, as it is not dependent on weather or tim... \n", + "3 **Consistency:** \\n- **Hydropower** is highly reliable and provides consistent, large-scale power, as it is not dependent on weather conditions o... \n", + "4 **Consistency:**\\n- **Hydropower** is highly reliable and consistent, providing large-scale power 24/7, as it relies on the continuous flow of wat... \n", + "5 **Consistency:** \\n- **Hydropower** is highly consistent and reliable, providing large-scale power 24/7, especially with dams that store water fo... \n", + "6 **Consistency:** \\n- **Hydropower** is highly reliable and provides consistent, large-scale power, especially with dams that can store water and ... \n", + "7 **Consistency:** \\n- **Hydropower** is highly reliable and provides consistent, large-scale power, especially with dams that can store water and ... \n", + "8 **Consistency:** \\n- **Solar Power:** Inconsistent due to dependence on weather and daylight. Requires storage solutions (e.g., batteries) for re... \n", + "9 **Consistency:** \\n- **Solar Power:** Inconsistent due to dependence on weather and daylight. Requires storage solutions (e.g., batteries) for re... " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "--- Best Configuration Summary ---\n", + "Chunk Size: 250 words\n", + "Overlap: 50 words\n", + "Top-K Retrieved: 3 chunks\n", + "Strategy: Simple RAG\n", + "---> Average Score (Faith+Rel+Sim): 0.899\n", + " (Faithfulness: 0.900, Relevancy: 1.000, Similarity: 0.798)\n", + "Time Taken: 8.98 seconds\n", + "\n", + "Best Answer Generated:\n", + "Solar power and hydropower differ significantly in consistency and environmental impact:\n", + "\n", + "- **Consistency**: \n", + " - **Solar Power**: Inconsistent, as it depends on weather conditions and time of day. Requires storage solutions (like batteries) for reliable supply. \n", + " - **Hydropower**: Highly consistent, providing large-scale, reliable power 24/7, especially with dams. \n", + "\n", + "- **Environmental Impact**: \n", + " - **Solar Power**: Clean with minimal emissions during operation, but manufacturing panels and disposal can have environmental impacts. \n", + " - **Hydropower**: Large dams can severely harm ecosystems, disrupt fish migration, and displace communities. Run-of-river systems are less disruptive but still impact local environments. \n", + "\n", + "In summary, hydropower is more consistent but has greater environmental risks, while solar power is cleaner but less reliable without storage.\n", + "\n", + "--- Analysis Complete --- \n" + ] + } + ], + "source": [ + "print(\"--- Analyzing Experiment Results ---\")\n", + "\n", + "# First, check if any results were actually collected\n", + "if not all_results:\n", + " print(\"No results were generated during the experiment. Cannot perform analysis.\")\n", + "else:\n", + " # Convert the list of result dictionaries into a Pandas DataFrame\n", + " results_df = pd.DataFrame(all_results)\n", + " print(f\"Total results collected: {len(results_df)}\")\n", + " \n", + " # Sort the DataFrame based on the 'avg_score' column in descending order (best first)\n", + " # Use reset_index(drop=True) to get a clean 0-based index after sorting.\n", + " results_df_sorted = results_df.sort_values(by='avg_score', ascending=False).reset_index(drop=True)\n", + " \n", + " print(\"\\n--- Top 10 Performing Configurations (Sorted by Average Score) ---\")\n", + " # Define the columns we want to display in the summary table\n", + " display_cols = [\n", + " 'chunk_size', 'overlap', 'top_k', 'strategy', \n", + " 'avg_score', 'faithfulness', 'relevancy', 'similarity_score', # Added similarity\n", + " 'time_sec', \n", + " 'answer' # Including the answer helps qualitatively assess the best runs\n", + " ]\n", + " # Filter out any columns that might not exist (e.g., if an error occurred before population)\n", + " display_cols = [col for col in display_cols if col in results_df_sorted.columns]\n", + " \n", + " # Display the head (top 10 rows) of the sorted DataFrame using the selected columns\n", + " # The display() function provides richer output in Jupyter environments.\n", + " display(results_df_sorted[display_cols].head(10))\n", + " \n", + " # --- Summary of the Single Best Run --- \n", + " print(\"\\n--- Best Configuration Summary ---\")\n", + " # Check if the sorted DataFrame is not empty before accessing the first row\n", + " if not results_df_sorted.empty:\n", + " # Get the first row (index 0), which corresponds to the best score after sorting\n", + " best_run = results_df_sorted.iloc[0]\n", + " \n", + " # Print the parameters and results of the best configuration\n", + " print(f\"Chunk Size: {best_run.get('chunk_size', 'N/A')} words\")\n", + " print(f\"Overlap: {best_run.get('overlap', 'N/A')} words\")\n", + " print(f\"Top-K Retrieved: {best_run.get('top_k', 'N/A')} chunks\")\n", + " print(f\"Strategy: {best_run.get('strategy', 'N/A')}\")\n", + " # Use .get(col, default) for robustness in case a column is missing\n", + " avg_score = best_run.get('avg_score', 0.0)\n", + " faithfulness = best_run.get('faithfulness', 0.0)\n", + " relevancy = best_run.get('relevancy', 0.0)\n", + " similarity = best_run.get('similarity_score', 0.0)\n", + " time_sec = best_run.get('time_sec', 0.0)\n", + " best_answer = best_run.get('answer', 'N/A')\n", + " \n", + " print(f\"---> Average Score (Faith+Rel+Sim): {avg_score:.3f}\")\n", + " print(f\" (Faithfulness: {faithfulness:.3f}, Relevancy: {relevancy:.3f}, Similarity: {similarity:.3f})\")\n", + " print(f\"Time Taken: {time_sec:.2f} seconds\")\n", + " print(f\"\\nBest Answer Generated:\")\n", + " # Print the full answer generated by the best configuration\n", + " print(best_answer)\n", + " else:\n", + " # Handle the case where no results were successfully processed\n", + " print(\"Could not determine the best configuration (no valid results found).\")\n", + " \n", + "print(\"\\n--- Analysis Complete --- \")" + ] + }, + { + "cell_type": "markdown", + "id": "conclusion-v5", + "metadata": {}, + "source": [ + "### 10. Conclusion: What Did We Learn?\n", + "\n", + "We have successfully constructed and executed an end-to-end pipeline to experiment with various RAG configurations and evaluate their performance using multiple metrics on the Nebius AI platform.\n", + "\n", + "By examining the results table and the best configuration summary above, we can gain insights specific to *our chosen corpus, query, and models*.\n", + "\n", + "**Reflection Points:**\n", + "\n", + "* **Chunking Impact:** Did a specific `chunk_size` or `overlap` tend to produce better average scores? Consider why smaller chunks might capture specific facts better, while larger chunks might provide more context. How did overlap seem to influence the results?\n", + "* **Retrieval Quantity (`top_k`):** How did increasing `top_k` affect the scores? Did retrieving more chunks always lead to better answers, or did it sometimes introduce noise or irrelevant information, potentially lowering faithfulness or similarity?\n", + "* **Strategy Comparison:** Did the 'Query Rewrite' or 'Rerank (Simulated)' strategies offer a consistent advantage over 'Simple RAG' in terms of the average score? Was the potential improvement significant enough to justify the extra steps (e.g., additional LLM call for rewrite, larger initial retrieval for rerank)?\n", + "* **Evaluation Metrics:** \n", + " * Look at the 'Best Answer' and compare it to the `true_answer_for_query`. Do the individual scores (Faithfulness, Relevancy, Similarity) seem to reflect the quality you perceive?\n", + " * Did high similarity always correlate with high faithfulness? Could an answer be similar but unfaithful, or faithful but dissimilar? \n", + " * How reliable do you feel the automated LLM evaluation (Faithfulness, Relevancy) is compared to the more objective Cosine Similarity? What are the potential limitations of LLM-based evaluation (e.g., sensitivity to prompt wording, model biases)?\n", + "* **Overall Performance:** Did any configuration achieve a near-perfect average score? What might be preventing a perfect score (e.g., limitations of the source documents, inherent ambiguity in language, imperfect retrieval)?\n", + "\n", + "**Key Takeaway:** Optimizing a RAG system is an iterative process. The best configuration often depends heavily on the specific dataset, the nature of the user queries, the chosen embedding and LLM models, and the evaluation criteria. Systematic experimentation, like the process followed in this notebook, is crucial for finding settings that perform well for a particular use case.\n", + "\n", + "**Potential Next Steps & Further Exploration:**\n", + "\n", + "* **Expand Test Parameters:** Try a wider range of `chunk_size`, `overlap`, and `top_k` values.\n", + "* **Different Queries:** Test the same configurations with different types of queries (e.g., fact-based, comparison, summarization) to see how performance varies.\n", + "* **Larger/Different Corpus:** Use a more extensive or domain-specific knowledge base.\n", + "* **Implement True Reranking:** Replace the simulated reranking with a dedicated cross-encoder reranking model (e.g., from Hugging Face Transformers or Cohere Rerank) to re-score the initially retrieved documents based on relevance.\n", + "* **Alternative Models:** Experiment with different Nebius AI models for embedding, generation, or evaluation to see their impact.\n", + "* **Advanced Chunking:** Explore more sophisticated chunking strategies (e.g., recursive character splitting, semantic chunking).\n", + "* **Human Evaluation:** Complement the automated metrics with human judgment for a more nuanced understanding of answer quality." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv-best-rag-finder", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 5e894dbafc9a4e23619d33c34460fbf6022c4d32 Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Sun, 27 Apr 2025 11:49:25 +0500 Subject: [PATCH 24/32] New modules --- requirements.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 8943bbd..a533f79 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,4 +7,7 @@ scikit-learn networkx matplotlib tqdm -Pillow \ No newline at end of file +Pillow +faiss-cpu +pandas +ipywidgets \ No newline at end of file From bcc6ceb5537bd13495473bf20df48a6a0d21e25b Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Sun, 27 Apr 2025 11:53:17 +0500 Subject: [PATCH 25/32] Updating Doc --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 9dc57a2..85dc92b 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ This repository takes a clear, hands-on approach to **Retrieval-Augmented Genera The goal is simple: provide code that is readable, modifiable, and educational. By focusing on the fundamentals, this project helps demystify RAG and makes it easier to understand how it really works. ## Update: 📢 +- (27-April-2025) Added a new notebook which finds best RAG technique for a given query (Simple RAG + Reranker + Query Rewrite). - (20-Mar-2025) Added a new notebook on RAG with Reinforcement Learning. - (07-Mar-2025) Added 20 RAG techniques to the repository. @@ -45,6 +46,7 @@ Here's a glimpse of the techniques covered: | [19. HyDE RAG](19_HyDE_rag.ipynb) | Uses Hypothetical Document Embeddings to improve semantic matching. | | [20. CRAG](20_crag.ipynb) | Corrective RAG: Dynamically evaluates retrieval quality and uses web search as a fallback. | | [21. Rag with RL](21_rag_with_rl.ipynb) | Maximize the reward of the RAG model using Reinforcement Learning. | +| [Best RAG Finder](best_rag_finder.ipynb) | Finds the best RAG technique for a given query using Simple RAG + Reranker + Query Rewrite. | ## 🗂️ Repository Structure @@ -72,6 +74,7 @@ fareedkhan-dev-all-rag-techniques/ ├── 19_HyDE_rag.ipynb ├── 20_crag.ipynb ├── 21_rag_with_rl.ipynb +├── best_rag_finder.ipynb ├── requirements.txt <- Python dependencies └── data/ └── val.json <- Sample validation data (queries and answers) From 2c073d53ead9569557935d9feb8bce840f4e3c98 Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Mon, 12 May 2025 16:05:11 +0500 Subject: [PATCH 26/32] Big Data KG --- 22_Big_data_with_KG.ipynb | 3257 +++++++++++++++++++++++++++++++++++++ 1 file changed, 3257 insertions(+) create mode 100644 22_Big_data_with_KG.ipynb diff --git a/22_Big_data_with_KG.ipynb b/22_Big_data_with_KG.ipynb new file mode 100644 index 0000000..17cd636 --- /dev/null +++ b/22_Big_data_with_KG.ipynb @@ -0,0 +1,3257 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "intro-0", + "metadata": {}, + "source": [ + "## End-to-End Pipeline: Big Data with Knowledge Graph (Book-Referenced)\n", + "\n", + "### Goal:\n", + "Transform news articles about technology company acquisitions into a structured Knowledge Graph, using modern techniques for extraction, refinement, and reasoning — guided by foundational principles outlined in a conceptual book.\n", + "\n", + "### Dataset: CNN/DailyMail\n", + "\n", + "### Approach Overview:\n", + "This notebook walks through a multi-phase process:\n", + "1. **Data Acquisition & Preparation:** Sourcing and cleaning raw news text.\n", + "2. **Information Extraction:** Identifying key entities (organizations, people, money, dates) and the relationships between them (e.g., 'acquire', 'invested_in').\n", + "3. **Knowledge Graph Construction:** Structuring the extracted information into RDF triples, forming the nodes and edges of our KG.\n", + "4. **KG Refinement (Conceptual):** Using embeddings to represent KG components and conceptually exploring link prediction.\n", + "5. **Persistence & Utilization:** Storing, querying (SPARQL), and visualizing the KG.\n", + "\n", + "We will leverage Large Language Models (LLMs) for complex NLP tasks like nuanced entity and relationship extraction, while also using traditional libraries like spaCy for initial exploration and `rdflib` for KG management." + ] + }, + { + "cell_type": "markdown", + "id": "b94b29f8", + "metadata": {}, + "source": [ + "# Table of Contents\n", + "\n", + "- [End-to-End Pipeline: Big Data with Knowledge Graph (Book-Referenced)](#intro-0)\n", + " - [Initial Setup: Imports and Configuration](#intro-setup)\n", + " - [Initialize LLM Client and spaCy Model](#llm-spacy-init-desc)\n", + " - [Define RDF Namespaces](#namespace-init-desc)\n", + "- [Phase 1: Data Acquisition and Preparation](#phase1)\n", + " - [Step 1.1: Data Acquisition](#step1-1-desc)\n", + " - [Execute Data Acquisition](#data-acquisition-exec-desc)\n", + " - [Step 1.2: Data Cleaning & Preprocessing](#step1-2-desc)\n", + " - [Execute Data Cleaning](#data-cleaning-exec-desc)\n", + "- [Phase 2: Information Extraction](#phase2)\n", + " - [Step 2.1: Entity Extraction (Named Entity Recognition - NER)](#step2-1-desc)\n", + " - [2.1.1: Entity Exploration with spaCy - Function Definition](#step2-1-1-spacy-desc)\n", + " - [2.1.1: Entity Exploration with spaCy - Plotting Function Definition](#plot_entity_distribution_func_def_desc)\n", + " - [2.1.1: Entity Exploration with spaCy - Execution](#spacy-ner-exec-desc)\n", + " - [Generic LLM Call Function Definition](#llm-call-func-def-desc)\n", + " - [2.1.2: Entity Type Selection using LLM - Execution](#step2-1-2-llm-type-selection-desc)\n", + " - [LLM JSON Output Parsing Function Definition](#parse_llm_json_func_def_desc)\n", + " - [2.1.3: Targeted Entity Extraction using LLM - Execution](#step2-1-3-llm-ner-exec-desc)\n", + " - [Step 2.2: Relationship Extraction](#step2-2-desc)\n", + "- [Phase 3: Knowledge Graph Construction](#phase3)\n", + " - [Step 3.1: Entity Disambiguation & Linking (Simplified) - Normalization Function](#step3-1-normalize-entity-text-func-def-desc)\n", + " - [Execute Entity Normalization and URI Generation](#entity-normalization-exec-desc)\n", + " - [Step 3.2: Schema/Ontology Alignment - RDF Type Mapping Function](#step3-2-rdf-type-func-def-desc)\n", + " - [Schema/Ontology Alignment - RDF Predicate Mapping Function](#step3-2-rdf-predicate-func-def-desc)\n", + " - [Schema/Ontology Alignment - Examples](#schema-alignment-example-desc)\n", + " - [Step 3.3: Triple Generation](#step3-3-triple-generation-exec-desc)\n", + "- [Phase 4: Knowledge Graph Refinement Using Embeddings](#phase4)\n", + " - [Step 4.1: Generate KG Embeddings - Embedding Function Definition](#step4-1-embedding-func-def-desc)\n", + " - [Generate KG Embeddings - Execution](#kg-embedding-exec-desc)\n", + " - [Step 4.2: Link Prediction (Knowledge Discovery - Conceptual) - Cosine Similarity Function](#step4-2-cosine-sim-func-def-desc)\n", + " - [Link Prediction (Conceptual) - Similarity Calculation Example](#link-prediction-exec-desc)\n", + " - [Step 4.3: Add Predicted Links (Optional & Conceptual) - Function Definition](#step4-3-add-inferred-func-def-desc)\n", + " - [Add Predicted Links (Conceptual) - Execution Example](#add-predicted-links-exec-desc)\n", + "- [Phase 5: Persistence and Utilization](#phase5)\n", + " - [Step 5.1: Knowledge Graph Storage - Save Function Definition](#step5-1-save-graph-func-def-desc)\n", + " - [Knowledge Graph Storage - Execution](#kg-storage-exec-desc)\n", + " - [Step 5.2: Querying and Analysis - SPARQL Execution Function](#step5-2-sparql-func-def-desc)\n", + " - [SPARQL Querying and Analysis - Execution Examples](#sparql-querying-exec-desc)\n", + " - [Step 5.3: Visualization (Optional) - Visualization Function Definition](#step5-3-viz-func-def-desc)\n", + " - [KG Visualization - Execution](#visualization-exec-desc)\n", + "- [Conclusion and Future Work](#conclusion)" + ] + }, + { + "cell_type": "markdown", + "id": "intro-setup", + "metadata": {}, + "source": [ + "### Initial Setup: Imports and Configuration\n", + "\n", + "**Theory:**\n", + "Before any data processing or analysis can begin, we need to set up our environment. This involves:\n", + "* **Importing Libraries:** Bringing in the necessary Python packages. These include `datasets` for data loading, `openai` for interacting with LLMs, `spacy` for foundational NLP, `rdflib` for Knowledge Graph manipulation, `re` for text processing with regular expressions, `json` for handling LLM outputs, `matplotlib` and `pyvis` for visualization, and standard libraries like `os`, `collections`, and `tqdm`.\n", + "* **API Configuration:** Setting up credentials and endpoints for external services, specifically the Nebius LLM API. **Security Note:** In a production environment, API keys should never be hardcoded. Use environment variables or secure secret management systems.\n", + "* **Model Initialization:** Loading pre-trained models like spaCy's `en_core_web_sm` for basic NLP tasks and configuring the LLM client to use specific models deployed on Nebius for generation and embeddings.\n", + "* **Namespace Definitions:** For RDF-based Knowledge Graphs, namespaces (like `EX` for our custom terms, `SCHEMA` for schema.org) are crucial for creating unique and resolvable URIs for entities and properties. This aligns with the Linked Data principles." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "setup-code", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Libraries imported.\n" + ] + } + ], + "source": [ + "# Import necessary libraries\n", + "import os\n", + "import re\n", + "import json\n", + "from collections import Counter\n", + "import matplotlib.pyplot as plt\n", + "from tqdm.auto import tqdm\n", + "import pandas as pd\n", + "import time\n", + "\n", + "# NLP and KG libraries\n", + "import spacy\n", + "from rdflib import Graph, Literal, Namespace, URIRef\n", + "from rdflib.namespace import RDF, RDFS, XSD, SKOS # Added SKOS for altLabel\n", + "\n", + "# OpenAI client for LLM\n", + "from openai import OpenAI\n", + "\n", + "# Visualization\n", + "from pyvis.network import Network\n", + "\n", + "# Hugging Face datasets library\n", + "from datasets import load_dataset\n", + "\n", + "# For embedding similarity\n", + "import numpy as np\n", + "from sklearn.metrics.pairwise import cosine_similarity\n", + "\n", + "# --- API Configuration (IMPORTANT: Replace with your actual credentials and model names) ---\n", + "NEBIUS_API_KEY = os.getenv(\"NEBIUS_API_KEY\", \"your_nebius_api_key_here\") # Replace with your actual API key\n", + "NEBIUS_BASE_URL = \"https://api.studio.nebius.com/v1/\"\n", + "\n", + "# --- Model Names (IMPORTANT: Replace with your deployed model names) ---\n", + "TEXT_GEN_MODEL_NAME = \"deepseek-ai/DeepSeek-V3\" # e.g., phi-4, deepseek or any other model\n", + "EMBEDDING_MODEL_NAME = \"BAAI/bge-multilingual-gemma2\" # e.g., text-embedding-ada-002, BAAI/bge-multilingual-gemma2 or any other model\n", + "\n", + "print(\"Libraries imported.\")" + ] + }, + { + "cell_type": "markdown", + "id": "setup-code-output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "This block simply confirms that the necessary libraries have been imported without error." + ] + }, + { + "cell_type": "markdown", + "id": "llm-spacy-init-desc", + "metadata": {}, + "source": [ + "#### Initialize LLM Client and spaCy Model\n", + "\n", + "**Theory:**\n", + "Here, we instantiate the clients for our primary NLP tools:\n", + "* **OpenAI Client:** Configured to point to the Nebius API. This client will be used to send requests to the deployed LLM for tasks like entity extraction, relation extraction, and generating embeddings. A basic check is performed to see if the configuration parameters are set.\n", + "* **spaCy Model:** We load `en_core_web_sm`, a small English model from spaCy. This model provides efficient capabilities for tokenization, part-of-speech tagging, lemmatization, and basic Named Entity Recognition (NER). It's useful for initial text exploration and can complement LLM-based approaches." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "llm-spacy-init-code", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "OpenAI client initialized for base_url: https://api.studio.nebius.com/v1/ using model: deepseek-ai/DeepSeek-V3\n", + "spaCy model 'en_core_web_sm' loaded.\n" + ] + } + ], + "source": [ + "client = None # Initialize client to None\n", + "if NEBIUS_API_KEY != \"YOUR_NEBIUS_API_KEY\" and NEBIUS_BASE_URL != \"YOUR_NEBIUS_BASE_URL\" and TEXT_GEN_MODEL_NAME != \"YOUR_TEXT_GENERATION_MODEL_NAME\":\n", + " try:\n", + " client = OpenAI(\n", + " base_url=NEBIUS_BASE_URL,\n", + " api_key=NEBIUS_API_KEY \n", + " )\n", + " print(f\"OpenAI client initialized for base_url: {NEBIUS_BASE_URL} using model: {TEXT_GEN_MODEL_NAME}\")\n", + " except Exception as e:\n", + " print(f\"Error initializing OpenAI client: {e}\")\n", + " client = None # Ensure client is None if initialization fails\n", + "else:\n", + " print(\"Warning: OpenAI client not fully configured. LLM features will be disabled. Please set NEBIUS_API_KEY, NEBIUS_BASE_URL, and TEXT_GEN_MODEL_NAME.\")\n", + "\n", + "nlp_spacy = None # Initialize nlp_spacy to None\n", + "try:\n", + " nlp_spacy = spacy.load(\"en_core_web_sm\")\n", + " print(\"spaCy model 'en_core_web_sm' loaded.\")\n", + "except OSError:\n", + " print(\"spaCy model 'en_core_web_sm' not found. Downloading... (This might take a moment)\")\n", + " try:\n", + " spacy.cli.download(\"en_core_web_sm\")\n", + " nlp_spacy = spacy.load(\"en_core_web_sm\")\n", + " print(\"spaCy model 'en_core_web_sm' downloaded and loaded successfully.\")\n", + " except Exception as e:\n", + " print(f\"Failed to download or load spaCy model: {e}\")\n", + " print(\"Please try: python -m spacy download en_core_web_sm in your terminal and restart the kernel.\")\n", + " nlp_spacy = None # Ensure nlp_spacy is None if loading fails" + ] + }, + { + "cell_type": "markdown", + "id": "llm-spacy-init-output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "This block prints messages indicating the status of the OpenAI client and spaCy model initialization. Warnings are shown if configurations are missing or models can't be loaded." + ] + }, + { + "cell_type": "markdown", + "id": "namespace-init-desc", + "metadata": {}, + "source": [ + "#### Define RDF Namespaces\n", + "\n", + "**Theory:**\n", + "In RDF, namespaces are used to avoid naming conflicts and to provide context for terms (URIs). \n", + "* `EX`: A custom namespace for terms specific to our project (e.g., our entities and relationships if not mapped to standard ontologies).\n", + "* `SCHEMA`: Refers to Schema.org, a widely used vocabulary for structured data on the internet. We'll try to map some of our extracted types to Schema.org terms for better interoperability.\n", + "* `RDFS`: RDF Schema, provides basic vocabulary for describing RDF vocabularies (e.g., `rdfs:label`, `rdfs:Class`).\n", + "* `RDF`: The core RDF vocabulary (e.g., `rdf:type`).\n", + "* `XSD`: XML Schema Datatypes, used for specifying literal data types (e.g., `xsd:string`, `xsd:date`).\n", + "* `SKOS`: Simple Knowledge Organization System, useful for thesauri, taxonomies, and controlled vocabularies (e.g., `skos:altLabel` for alternative names)." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "namespace-init-code", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Custom namespace EX defined as: http://example.org/kg/\n", + "Schema.org namespace SCHEMA defined as: http://schema.org/\n" + ] + } + ], + "source": [ + "EX = Namespace(\"http://example.org/kg/\")\n", + "SCHEMA = Namespace(\"http://schema.org/\")\n", + "\n", + "print(f\"Custom namespace EX defined as: {EX}\")\n", + "print(f\"Schema.org namespace SCHEMA defined as: {SCHEMA}\")" + ] + }, + { + "cell_type": "markdown", + "id": "namespace-init-output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "This confirms the definition of our primary custom namespace (`EX`) and the `SCHEMA` namespace from Schema.org." + ] + }, + { + "cell_type": "markdown", + "id": "phase1", + "metadata": {}, + "source": [ + "## Phase 1: Data Acquisition and Preparation\n", + "**(Ref: Ch. 1 – Big Data Ecosystem; Ch. 3 – Value Chain of Big Data Processing)**\n", + "\n", + "**Theory (Phase Overview):**\n", + "This initial phase is critical in any data-driven project. It corresponds to the early stages of the Big Data value chain: \"Data Acquisition\" and parts of \"Data Preparation/Preprocessing\". The goal is to obtain the raw data and transform it into a state suitable for further processing and information extraction. Poor quality input data (the \"Garbage In, Garbage Out\" principle) will inevitably lead to a poor quality Knowledge Graph." + ] + }, + { + "cell_type": "markdown", + "id": "step1-1-desc", + "metadata": {}, + "source": [ + "### Step 1.1: Data Acquisition\n", + "**Task:** Gather a collection of news articles.\n", + "\n", + "**Book Concept:** (Ch. 1, Figures 1 & 2; Ch. 3 - Data Acquisition stage)\n", + "This step represents the \"Data Sources\" and \"Ingestion\" components of a Big Data ecosystem. We're tapping into an existing dataset (CNN/DailyMail via Hugging Face `datasets`) rather than scraping live news, but the principle is the same: bringing external data into our processing pipeline.\n", + "\n", + "**Methodology:**\n", + "We will define a function `acquire_articles` to load the CNN/DailyMail dataset. To manage processing time and costs for this demonstration, and to focus on potentially relevant articles, this function will:\n", + "1. Load a specified split (e.g., 'train') of the dataset.\n", + "2. Optionally filter articles based on a list of keywords. For our goal of technology company acquisitions, keywords like \"acquire\", \"merger\", \"technology\", \"startup\" would be relevant. This is a simple heuristic; more advanced topic modeling or classification could be used for better filtering on larger datasets.\n", + "3. Take a small sample of the (filtered) articles.\n", + "\n", + "**Output:** A list of raw article data structures (typically dictionaries containing 'id', 'article' text, etc.)." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "acquire_articles_func_def", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Function 'acquire_articles' defined.\n" + ] + } + ], + "source": [ + "def acquire_articles(dataset_name=\"cnn_dailymail\", version=\"3.0.0\", split='train', sample_size=1000, keyword_filter=None):\n", + " \"\"\"Loads articles from the specified Hugging Face dataset, optionally filters them, and takes a sample.\"\"\"\n", + " print(f\"Attempting to load dataset: {dataset_name} (version: {version}, split: '{split}')...\")\n", + " try:\n", + " full_dataset = load_dataset(dataset_name, version, split=split, streaming=False) # Use streaming=False for easier slicing on smaller datasets\n", + " print(f\"Successfully loaded dataset. Total records in split: {len(full_dataset)}\")\n", + " except Exception as e:\n", + " print(f\"Error loading dataset {dataset_name}: {e}\")\n", + " print(\"Please ensure the dataset is available or you have internet connectivity.\")\n", + " return [] # Return empty list on failure\n", + " \n", + " raw_articles_list = []\n", + " if keyword_filter:\n", + " print(f\"Filtering articles containing any of keywords: {keyword_filter}...\")\n", + " # This is a simple keyword search. For very large datasets, this can be slow.\n", + " # Consider .filter() method of Hugging Face datasets for more efficiency if not streaming.\n", + " count = 0\n", + " # To avoid iterating the whole dataset if it's huge and we only need a small sample after filtering:\n", + " # We'll iterate up to a certain point or until we have enough filtered articles.\n", + " # This is a heuristic for balancing filtering with performance on potentially large datasets.\n", + " iteration_limit = min(len(full_dataset), sample_size * 20) # Look through at most 20x sample_size articles\n", + " for i in tqdm(range(iteration_limit), desc=\"Filtering articles\"):\n", + " record = full_dataset[i]\n", + " if any(keyword.lower() in record['article'].lower() for keyword in keyword_filter):\n", + " raw_articles_list.append(record)\n", + " count += 1\n", + " if count >= sample_size:\n", + " print(f\"Found {sample_size} articles matching filter criteria within {i+1} records checked.\")\n", + " break\n", + " if not raw_articles_list:\n", + " print(f\"Warning: No articles found with keywords {keyword_filter} within the first {iteration_limit} records. Returning an empty list.\")\n", + " return []\n", + " # If we found articles but less than sample_size, we take what we found.\n", + " # If we found more, we still only take sample_size.\n", + " raw_articles_list = raw_articles_list[:sample_size]\n", + " else:\n", + " print(f\"Taking the first {sample_size} articles without keyword filtering.\")\n", + " # Ensure sample_size does not exceed dataset length\n", + " actual_sample_size = min(sample_size, len(full_dataset))\n", + " raw_articles_list = list(full_dataset.select(range(actual_sample_size)))\n", + " \n", + " print(f\"Acquired {len(raw_articles_list)} articles.\")\n", + " return raw_articles_list\n", + "\n", + "print(\"Function 'acquire_articles' defined.\")" + ] + }, + { + "cell_type": "markdown", + "id": "acquire_articles_func_def_output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "This cell defines the `acquire_articles` function. It will print a confirmation once the function is defined in the Python interpreter's memory." + ] + }, + { + "cell_type": "markdown", + "id": "data-acquisition-exec-desc", + "metadata": {}, + "source": [ + "#### Execute Data Acquisition\n", + "\n", + "**Theory:**\n", + "Now we call the `acquire_articles` function. We define keywords relevant to our goal (technology company acquisitions) to guide the filtering process. A `SAMPLE_SIZE` is set to keep the amount of data manageable for this demonstration. Smaller samples allow for faster iteration, especially when using LLMs which can have associated costs and latency." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "data-acquisition-exec-code", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Attempting to load dataset: cnn_dailymail (version: 3.0.0, split: 'train')...\n", + "Successfully loaded dataset. Total records in split: 287113\n", + "Filtering articles containing any of keywords: ['acquire', 'acquisition', 'merger', 'buyout', 'purchased by', 'acquired by', 'takeover']...\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a09b9f3b82bc4649af79f8216c3b5034", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Filtering articles: 0%| | 0/200 [00:00', '', text)\n", + " # Remove email addresses\n", + " text = re.sub(r'\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b', '[EMAIL]', text)\n", + " # Normalize whitespace: replace newlines, tabs with a single space, then multiple spaces with a single space\n", + " text = text.replace('\\n', ' ').replace('\\r', ' ').replace('\\t', ' ')\n", + " text = re.sub(r'\\s+', ' ', text).strip()\n", + " # Optional: escape quotes if LLM has issues, but usually not needed for good models\n", + " # text = text.replace('\"', \"\\\\\\\"\").replace(\"'\", \"\\\\'\") \n", + " return text\n", + "\n", + "print(\"Function 'clean_article_text' defined.\")" + ] + }, + { + "cell_type": "markdown", + "id": "clean_article_text_func_def_output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "Confirms that the `clean_article_text` function, which will be used to preprocess article content, has been defined." + ] + }, + { + "cell_type": "markdown", + "id": "data-cleaning-exec-desc", + "metadata": {}, + "source": [ + "#### Execute Data Cleaning\n", + "\n", + "**Theory:**\n", + "This block iterates through the `raw_data_sample` (acquired in the previous step). For each article, it calls the `clean_article_text` function. The cleaned text, along with the original article ID and potentially other useful fields like 'summary' (if available from the dataset as 'highlights'), is stored in a new list called `cleaned_articles`. This new list will be the primary input for the subsequent Information Extraction phase." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "data-cleaning-exec-code", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Cleaning 3 acquired articles...\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9aeade12fca241dfbf636992cddfdc44", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Cleaning articles: 0%| | 0/3 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "spacy_entity_counts = Counter() # Initialize an empty counter\n", + "\n", + "if cleaned_articles and nlp_spacy:\n", + " # Use a small, fixed sample size for spaCy analysis to keep it quick\n", + " spacy_analysis_sample_size = min(len(cleaned_articles), 20) \n", + " print(f\"Running spaCy NER on a sample of {spacy_analysis_sample_size} cleaned articles...\")\n", + " spacy_entity_counts = get_spacy_entity_counts(cleaned_articles, sample_size_spacy=spacy_analysis_sample_size)\n", + " \n", + " if spacy_entity_counts:\n", + " print(\"\\nspaCy Entity Counts (from sample):\")\n", + " for label, count in spacy_entity_counts.most_common():\n", + " print(f\" {label}: {count}\")\n", + " plot_entity_distribution(spacy_entity_counts)\n", + " else:\n", + " print(\"spaCy NER did not return any entity counts from the sample.\")\n", + "else:\n", + " print(\"Skipping spaCy entity analysis: No cleaned articles available or spaCy model not loaded.\")" + ] + }, + { + "cell_type": "markdown", + "id": "spacy-ner-exec-output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "This block will print:\n", + "* The frequency of different entity types found by spaCy in the sample.\n", + "* A bar chart visualizing this distribution.\n", + "If prerequisites are not met, it will print a message indicating why this step was skipped." + ] + }, + { + "cell_type": "markdown", + "id": "llm-call-func-def-desc", + "metadata": {}, + "source": [ + "#### Generic LLM Call Function Definition\n", + "\n", + "**Theory:**\n", + "To interact with the LLM for various tasks (entity type selection, NER, relation extraction), we define a reusable helper function `call_llm_for_response`. This function encapsulates the logic for:\n", + "* Taking a system prompt (instructions for the LLM) and a user prompt (the specific input/query).\n", + "* Making the API call to the configured LLM endpoint.\n", + "* Extracting the textual content from the LLM's response.\n", + "* Basic error handling if the LLM client is not initialized or if the API call fails.\n", + "Using a helper function promotes code reusability and makes the main logic cleaner." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "llm-call-func-def", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Function 'call_llm_for_response' defined.\n" + ] + } + ], + "source": [ + "def call_llm_for_response(system_prompt, user_prompt, model_to_use=TEXT_GEN_MODEL_NAME, temperature=0.2):\n", + " \"\"\"Generic function to call the LLM and get a response, with basic error handling.\"\"\"\n", + " if not client:\n", + " print(\"LLM client not initialized. Skipping LLM call.\")\n", + " return \"LLM_CLIENT_NOT_INITIALIZED\"\n", + " try:\n", + " print(f\"\\nCalling LLM (model: {model_to_use}, temperature: {temperature})...\")\n", + " # For debugging, uncomment to see prompts (can be very long)\n", + " # print(f\"System Prompt (first 200 chars): {system_prompt[:200]}...\")\n", + " # print(f\"User Prompt (first 200 chars): {user_prompt[:200]}...\")\n", + " \n", + " response = client.chat.completions.create(\n", + " model=model_to_use,\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ],\n", + " temperature=temperature # Lower temperature for more focused/deterministic output\n", + " )\n", + " content = response.choices[0].message.content.strip()\n", + " print(\"LLM response received.\")\n", + " return content\n", + " except Exception as e:\n", + " print(f\"Error calling LLM: {e}\")\n", + " return f\"LLM_ERROR: {str(e)}\"\n", + "\n", + "print(\"Function 'call_llm_for_response' defined.\")" + ] + }, + { + "cell_type": "markdown", + "id": "llm-call-func-def-output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "Confirms the definition of the `call_llm_for_response` helper function." + ] + }, + { + "cell_type": "markdown", + "id": "step2-1-2-llm-type-selection-desc", + "metadata": {}, + "source": [ + "#### 2.1.2: Entity Type Selection using LLM - Execution\n", + "\n", + "**Theory:**\n", + "While spaCy provides a general set of entity types, not all may be relevant for our specific goal of building a KG about technology company acquisitions. For instance, `WORK_OF_ART` might be less important than `ORG` (organization) or `MONEY`. \n", + "In this step, we leverage the LLM's understanding to refine this list. \n", + "1. **System Prompt:** We craft a detailed system prompt instructing the LLM to act as an expert in KG construction for technology news. It's asked to select the *most relevant* entity labels from the spaCy-derived list, focusing on our domain, and to provide an explanation for each chosen type.\n", + "2. **User Prompt:** The user prompt contains the actual list of entity labels and their frequencies obtained from spaCy.\n", + "3. **LLM Call:** We use our `call_llm_for_response` function.\n", + "The LLM's output should be a comma-separated string of chosen entity types with their descriptions (e.g., `ORG (Organizations involved in acquisitions, e.g., Google, Microsoft)`). This curated list forms a more targeted schema for our subsequent LLM-based NER." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "llm-entity-type-selection-exec-code", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Calling LLM (model: deepseek-ai/DeepSeek-V3, temperature: 0.2)...\n", + "LLM response received.\n", + "\n", + "LLM Suggested Entity Types for Tech Acquisitions KG:\n", + "\n", + "Final list of Entity Types to be used for NER: ORG (Company involved in acquisition, e.g., Google, Microsoft), PERSON (Key individuals like CEOs or founders, e.g., Satya Nadella), DATE (Date of acquisition announcement or closing, e.g., July 26, 2023), MONEY (Transaction value or investment, e.g., $1 billion), PRODUCT (Technology products or services involved, e.g., cloud computing platform), GPE (Geopolitical entities related to the acquisition, e.g., United States, California), CARDINAL (Numerical values relevant to the deal, e.g., number of employees transferred)\n" + ] + } + ], + "source": [ + "ENTITY_TYPE_SELECTION_SYSTEM_PROMPT = (\n", + " \"You are an expert assistant specializing in Knowledge Graph construction for technology news analysis. \"\n", + " \"You will be provided with a list of named entity labels and their frequencies, derived from news articles. \"\n", + " \"Your task is to select and return a comma-separated list of the MOST RELEVANT entity labels for building a Knowledge Graph focused on **technology company acquisitions**. \"\n", + " \"Prioritize labels like organizations (acquirer, acquired), financial amounts (deal value), dates (announcement/closing), key persons (CEOs, founders), and relevant technology products/services or sectors. \"\n", + " \"For EACH entity label you include in your output list, provide a concise parenthetical explanation or a clear, illustrative example. \"\n", + " \"Example: ORG (Company involved in acquisition, e.g., Google, Microsoft), MONEY (Transaction value or investment, e.g., $1 billion), DATE (Date of acquisition announcement or closing, e.g., July 26, 2023). \"\n", + " \"The output MUST be ONLY the comma-separated list of labels and their parenthetical explanations. \"\n", + " \"Do not include any introductory phrases, greetings, summaries, or any other text whatsoever outside of this formatted list.\"\n", + ")\n", + "\n", + "llm_selected_entity_types_str = \"\" # Initialize\n", + "DEFAULT_ENTITY_TYPES_STR = \"ORG (Acquiring or acquired company, e.g., TechCorp), PERSON (Key executives, e.g., CEO), MONEY (Acquisition price, e.g., $500 million), DATE (Date of acquisition announcement), PRODUCT (Key product/service involved), GPE (Location of companies, e.g., Silicon Valley)\"\n", + "\n", + "if spacy_entity_counts and client: # Proceed if we have spaCy counts and LLM client is available\n", + " # Create a string from spaCy entity counts for the prompt\n", + " spacy_labels_for_prompt = \", \".join([f\"{label} (frequency: {count})\" for label, count in spacy_entity_counts.most_common()])\n", + " user_prompt_for_types = f\"From the following entity labels and their frequencies found in news articles: [{spacy_labels_for_prompt}]. Please select and format the most relevant entity types for a knowledge graph about technology company acquisitions, as per the instructions.\"\n", + " \n", + " llm_selected_entity_types_str = call_llm_for_response(ENTITY_TYPE_SELECTION_SYSTEM_PROMPT, user_prompt_for_types)\n", + " \n", + " if \"LLM_CLIENT_NOT_INITIALIZED\" in llm_selected_entity_types_str or \"LLM_ERROR\" in llm_selected_entity_types_str or not llm_selected_entity_types_str.strip():\n", + " print(\"\\nLLM entity type selection failed or returned empty. Using default entity types.\")\n", + " llm_selected_entity_types_str = DEFAULT_ENTITY_TYPES_STR\n", + " else:\n", + " print(\"\\nLLM Suggested Entity Types for Tech Acquisitions KG:\")\n", + " # Post-process to ensure it's a clean list if LLM adds extra verbiage despite instructions\n", + " # This is a simple heuristic, more robust parsing might be needed for less compliant LLMs\n", + " if not re.match(r\"^([A-Z_]+ \\(.*?\\))(, [A-Z_]+ \\(.*?\\))*$\", llm_selected_entity_types_str.strip()):\n", + " print(f\"Warning: LLM output for entity types might not be in the expected strict format. Raw: '{llm_selected_entity_types_str}'\")\n", + " # Attempt a simple cleanup: take the longest line that looks like a list of terms\n", + " lines = llm_selected_entity_types_str.strip().split('\\n')\n", + " best_line = \"\"\n", + " for line in lines:\n", + " if '(' in line and ')' in line and len(line) > len(best_line):\n", + " best_line = line\n", + " if best_line:\n", + " llm_selected_entity_types_str = best_line\n", + " print(f\"Attempted cleanup: '{llm_selected_entity_types_str}'\")\n", + " else:\n", + " print(\"Cleanup failed, falling back to default entity types.\")\n", + " llm_selected_entity_types_str = DEFAULT_ENTITY_TYPES_STR\n", + "else:\n", + " print(\"\\nSkipping LLM entity type selection (spaCy counts unavailable or LLM client not initialized). Using default entity types.\")\n", + " llm_selected_entity_types_str = DEFAULT_ENTITY_TYPES_STR\n", + "\n", + "print(f\"\\nFinal list of Entity Types to be used for NER: {llm_selected_entity_types_str}\")" + ] + }, + { + "cell_type": "markdown", + "id": "llm-entity-type-selection-exec-output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "This block will print:\n", + "* The comma-separated list of entity types and their descriptions as suggested by the LLM (or the default list if the LLM call fails/is skipped).\n", + "* This list will guide the next step: targeted Named Entity Recognition." + ] + }, + { + "cell_type": "markdown", + "id": "parse_llm_json_func_def_desc", + "metadata": {}, + "source": [ + "#### LLM JSON Output Parsing Function Definition\n", + "\n", + "**Theory:**\n", + "LLMs, even when prompted for specific formats like JSON, can sometimes produce output that includes extra text, markdown formatting (like ` ```json ... ``` `), or slight deviations from perfect JSON. The `parse_llm_json_output` function is a utility to robustly parse the LLM's string output into a Python list of dictionaries (representing entities or relations).\n", + "It attempts to:\n", + "1. Handle common markdown code block syntax.\n", + "2. Use `json.loads()` for parsing.\n", + "3. Include error handling for `JSONDecodeError` and provide fallback mechanisms like regex-based extraction if simple parsing fails.\n", + "This function is crucial for reliably converting LLM responses into usable structured data." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "parse_llm_json_func_def", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Function 'parse_llm_json_output' defined.\n" + ] + } + ], + "source": [ + "def parse_llm_json_output(llm_output_str):\n", + " \"\"\"Parses JSON output from LLM, handling potential markdown code blocks and common issues.\"\"\"\n", + " if not llm_output_str or \"LLM_CLIENT_NOT_INITIALIZED\" in llm_output_str or \"LLM_ERROR\" in llm_output_str:\n", + " print(\"Cannot parse LLM output: LLM did not run, errored, or output was empty.\")\n", + " return [] # Return empty list\n", + "\n", + " # Attempt to extract JSON from within markdown code blocks\n", + " match = re.search(r'```json\\s*([\\s\\S]*?)\\s*```', llm_output_str, re.IGNORECASE)\n", + " if match:\n", + " json_str = match.group(1).strip()\n", + " else:\n", + " # If no markdown block, assume the whole string is the JSON (or needs cleaning)\n", + " # LLMs sometimes add introductory text before the JSON list. Try to find the start of the list.\n", + " list_start_index = llm_output_str.find('[')\n", + " list_end_index = llm_output_str.rfind(']')\n", + " if list_start_index != -1 and list_end_index != -1 and list_start_index < list_end_index:\n", + " json_str = llm_output_str[list_start_index : list_end_index+1].strip()\n", + " else:\n", + " json_str = llm_output_str.strip() # Fallback to the whole string\n", + "\n", + " try:\n", + " parsed_data = json.loads(json_str)\n", + " if isinstance(parsed_data, list):\n", + " return parsed_data\n", + " else:\n", + " print(f\"Warning: LLM output was valid JSON but not a list (type: {type(parsed_data)}). Returning empty list.\")\n", + " print(f\"Problematic JSON string (or part of it): {json_str[:200]}...\")\n", + " return []\n", + " except json.JSONDecodeError as e:\n", + " print(f\"Error decoding JSON from LLM output: {e}\")\n", + " print(f\"Problematic JSON string (or part of it): {json_str[:500]}...\")\n", + " # Optional: A more aggressive regex fallback if standard parsing fails badly\n", + " # This is risky as it might grab partial JSONs. Use with caution.\n", + " # entities_found = []\n", + " # for match_obj in re.finditer(r'\\{\\s*\"text\":\\s*\".*?\",\\s*\"type\":\\s*\".*?\"\\s*\\}', json_str):\n", + " # try:\n", + " # entities_found.append(json.loads(match_obj.group(0)))\n", + " # except json.JSONDecodeError: continue # Skip malformed individual objects\n", + " # if entities_found:\n", + " # print(f\"Warning: Recovered {len(entities_found)} entities using aggressive regex due to JSON error.\")\n", + " # return entities_found\n", + " return []\n", + " except Exception as e:\n", + " print(f\"An unexpected error occurred during LLM JSON output parsing: {e}\")\n", + " return []\n", + "\n", + "print(\"Function 'parse_llm_json_output' defined.\")" + ] + }, + { + "cell_type": "markdown", + "id": "parse_llm_json_func_def_output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "Confirms the definition of the `parse_llm_json_output` utility function." + ] + }, + { + "cell_type": "markdown", + "id": "step2-1-3-llm-ner-exec-desc", + "metadata": {}, + "source": [ + "#### 2.1.3: Targeted Entity Extraction using LLM - Execution\n", + "\n", + "**Theory:**\n", + "Now, equipped with our curated list of entity types (`llm_selected_entity_types_str`), we instruct the LLM to perform NER on each (cleaned) article. \n", + "1. **System Prompt:** The system prompt for NER is carefully constructed. It tells the LLM:\n", + " * Its role (expert NER system for tech acquisitions).\n", + " * The specific entity types to focus on (from `llm_selected_entity_types_str`).\n", + " * The required output format: a JSON list of objects, where each object has `\"text\"` (the exact extracted entity span) and `\"type\"` (one of the specified entity types).\n", + " * An example of the desired JSON output.\n", + " * To output an empty JSON list `[]` if no relevant entities are found.\n", + "2. **User Prompt:** For each article, the user prompt is simply its `cleaned_text`.\n", + "3. **Processing Loop:** We iterate through a small sample of `cleaned_articles` (defined by `MAX_ARTICLES_FOR_LLM_NER` to manage time/cost). For each:\n", + " * The article text is (optionally truncated if too long for LLM context window).\n", + " * `call_llm_for_response` is invoked.\n", + " * `parse_llm_json_output` processes the LLM's response.\n", + " * The extracted entities are stored alongside the article data in a new list, `articles_with_entities`.\n", + "A small delay (`time.sleep`) is added between API calls to be polite to the API endpoint and avoid potential rate limiting." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "llm-ner-exec-code", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Starting LLM NER for 3 articles...\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "84d4cca6263341858b79d2b43219c17a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "LLM NER Processing: 0%| | 0/3 [00:00 3000 words for some models)\n", + " # Character count is a rough proxy for token count. Adjust as needed based on model limits.\n", + " max_text_chars = 12000 # Approx 3000 words. Should be safe for many models.\n", + " article_text_for_llm = article_dict['cleaned_text'][:max_text_chars]\n", + " if len(article_dict['cleaned_text']) > max_text_chars:\n", + " print(f\" Warning: Article text truncated from {len(article_dict['cleaned_text'])} to {max_text_chars} characters for LLM NER.\")\n", + "\n", + " llm_ner_raw_output = call_llm_for_response(ner_system_prompt, article_text_for_llm)\n", + " extracted_entities_list = parse_llm_json_output(llm_ner_raw_output)\n", + " \n", + " # Store results\n", + " current_article_data = article_dict.copy() # Make a copy to avoid modifying original list items directly\n", + " current_article_data['llm_entities'] = extracted_entities_list\n", + " articles_with_entities.append(current_article_data)\n", + " \n", + " print(f\" Extracted {len(extracted_entities_list)} entities for article ID {article_dict['id']}.\")\n", + " if extracted_entities_list:\n", + " # Print a sample of entities, max 3\n", + " print(f\" Sample entities: {json.dumps(extracted_entities_list[:min(3, len(extracted_entities_list))], indent=2)}\")\n", + " \n", + " if i < num_articles_to_process_ner - 1: # Avoid sleeping after the last article\n", + " time.sleep(1) # Small delay to be polite to API\n", + " \n", + " if articles_with_entities:\n", + " print(f\"\\nFinished LLM NER. Processed {len(articles_with_entities)} articles and stored entities.\")\n", + "else:\n", + " print(\"Skipping LLM NER: Prerequisites (cleaned articles, LLM client, or valid entity types string) not met.\")\n", + " # If NER is skipped, ensure articles_with_entities is populated with empty entity lists for subsequent steps\n", + " if cleaned_articles: # only if we have cleaned articles to begin with\n", + " num_articles_to_fallback = min(len(cleaned_articles), MAX_ARTICLES_FOR_LLM_NER)\n", + " for article_dict_fallback in cleaned_articles[:num_articles_to_fallback]:\n", + " fallback_data = article_dict_fallback.copy()\n", + " fallback_data['llm_entities'] = []\n", + " articles_with_entities.append(fallback_data)\n", + " print(f\"Populated 'articles_with_entities' with {len(articles_with_entities)} entries having empty 'llm_entities' lists.\")\n", + "\n", + "# Ensure articles_with_entities is defined\n", + "if 'articles_with_entities' not in globals():\n", + " articles_with_entities = []\n", + " print(\"Initialized 'articles_with_entities' as an empty list.\")" + ] + }, + { + "cell_type": "markdown", + "id": "llm-ner-exec-output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "This block will show the progress of LLM-based NER:\n", + "* For each processed article: its ID, a message about truncation (if any), the number of entities extracted, and a sample of the extracted entities in JSON format.\n", + "* A final message indicating completion or why the step was skipped.\n", + "The `articles_with_entities` list now contains the original article data plus a new key `llm_entities` holding the list of entities extracted by the LLM for that article." + ] + }, + { + "cell_type": "markdown", + "id": "step2-2-desc", + "metadata": {}, + "source": [ + "### Step 2.2: Relationship Extraction\n", + "**Task:** Identify semantic relationships between extracted entities, such as acquisition events or affiliations.\n", + "\n", + "**Book Concept:** (Ch. 2 - Relationships as edges)\n", + "Relationships define how entities are connected, forming the *edges* in our Knowledge Graph. Extracting these relationships is crucial for capturing the actual knowledge (e.g., \"Company A *acquired* Company B\", \"Acquisition *has_price* $X Million\").\n", + "\n", + "**Methodology:**\n", + "Similar to NER, we'll use the LLM for Relationship Extraction (RE). For each article:\n", + "1. **System Prompt:** We design a system prompt that instructs the LLM to act as a relationship extraction expert for technology acquisitions. It specifies:\n", + " * The desired relationship types (predicates) like `ACQUIRED`, `HAS_PRICE`, `ANNOUNCED_ON`, `ACQUIRER_IS`, `ACQUIRED_COMPANY_IS`, `INVOLVES_PRODUCT`. These are chosen to capture key aspects of an acquisition event.\n", + " * The requirement that the subject and object of a relationship must be exact text spans from the list of entities provided for that article.\n", + " * The desired output format: a JSON list of objects, each with `subject_text`, `subject_type`, `predicate`, `object_text`, and `object_type`.\n", + " * An example of the output format.\n", + "2. **User Prompt:** The user prompt for each article will contain:\n", + " * The article's `cleaned_text`.\n", + " * The list of `llm_entities` extracted in the previous step for that specific article (serialized as a JSON string within the prompt).\n", + "3. **Processing Loop:** Iterate through `articles_with_entities`. If an article has entities:\n", + " * Construct the user prompt.\n", + " * Call the LLM.\n", + " * Parse the JSON output.\n", + " * Optionally, validate that the subject/object texts in the extracted relations indeed come from the provided entity list to maintain consistency.\n", + " * Store the extracted relations in a new list, `articles_with_relations` (each item will be the article data augmented with `llm_relations`)." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "relationship-extraction-exec-code", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Starting LLM Relationship Extraction for 3 articles (that have entities)...\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4a06030691d84109b131e4b83754c510", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "LLM Relationship Extraction: 0%| | 0/3 [00:00 max_text_chars_re:\n", + " print(f\" Warning: Article text truncated from {len(article_text_content)} to {max_text_chars_re} characters for LLM RE.\")\n", + " \n", + " # Serialize entities list to a JSON string for the prompt\n", + " # Ensure quotes within entity text are escaped for valid JSON string in prompt\n", + " entities_for_prompt_str = json.dumps([{'text': e['text'], 'type': e['type']} for e in entities_for_article])\n", + " \n", + " user_prompt_for_relations = (\n", + " f\"Article Text:\\n```\\n{article_text_for_llm_re}\\n```\\n\\n\" \n", + " f\"Extracted Entities (use these exact texts for subjects/objects):\\n```json\\n{entities_for_prompt_str}\\n```\\n\\n\" \n", + " f\"Identify and extract relationships between these entities based on the system instructions.\"\n", + " )\n", + " \n", + " llm_relations_raw_output = call_llm_for_response(relation_system_prompt, user_prompt_for_relations)\n", + " extracted_relations_list = parse_llm_json_output(llm_relations_raw_output)\n", + " \n", + " # Optional: Validate that subject/object texts in relations are from the provided entities\n", + " valid_relations_list = []\n", + " entity_texts_in_article = {e['text'] for e in entities_for_article}\n", + " for rel in extracted_relations_list:\n", + " # Check structure and presence of texts\n", + " if isinstance(rel, dict) and rel.get('subject_text') in entity_texts_in_article and rel.get('object_text') in entity_texts_in_article:\n", + " valid_relations_list.append(rel)\n", + " else:\n", + " print(f\" Warning: Discarding relation due to missing fields or mismatched entity text: {str(rel)[:100]}...\")\n", + " \n", + " current_article_output = article_data_with_ents.copy()\n", + " current_article_output['llm_relations'] = valid_relations_list\n", + " articles_with_relations.append(current_article_output)\n", + " \n", + " print(f\" Extracted {len(valid_relations_list)} valid relationships for article ID {article_data_with_ents['id']}.\")\n", + " if valid_relations_list:\n", + " print(f\" Sample relations: {json.dumps(valid_relations_list[:min(2, len(valid_relations_list))], indent=2)}\")\n", + " \n", + " if i < len(articles_with_entities) - 1:\n", + " time.sleep(1) # Small delay\n", + " \n", + " if articles_with_relations:\n", + " print(f\"\\nFinished LLM Relationship Extraction. Processed {len(articles_with_relations)} articles and stored relations.\")\n", + "else:\n", + " print(\"Skipping LLM Relationship Extraction: Prerequisites (articles with entities, LLM client) not met.\")\n", + " # If RE is skipped, populate articles_with_relations with empty relation lists\n", + " if articles_with_entities: # only if we have articles from NER step\n", + " for article_data_fallback_re in articles_with_entities:\n", + " fallback_data_re = article_data_fallback_re.copy()\n", + " fallback_data_re['llm_relations'] = []\n", + " articles_with_relations.append(fallback_data_re)\n", + " print(f\"Populated 'articles_with_relations' with {len(articles_with_relations)} entries having empty 'llm_relations' lists.\")\n", + "\n", + "# Ensure articles_with_relations is defined\n", + "if 'articles_with_relations' not in globals():\n", + " articles_with_relations = []\n", + " print(\"Initialized 'articles_with_relations' as an empty list.\")" + ] + }, + { + "cell_type": "markdown", + "id": "relationship-extraction-exec-output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "This block will show the progress of LLM-based Relationship Extraction:\n", + "* For each processed article: its ID, number of relationships extracted, and a sample of these relations in JSON format.\n", + "* Warnings if any extracted relations are discarded due to validation failures.\n", + "* A final message indicating completion or why the step was skipped.\n", + "The `articles_with_relations` list now contains items that have `llm_entities` and `llm_relations`." + ] + }, + { + "cell_type": "markdown", + "id": "phase3", + "metadata": {}, + "source": [ + "## Phase 3: Knowledge Graph Construction\n", + "**(Ref: Ch. 2 – KG Layers; Ch. 4 – Mapping and Materialization)**\n", + "\n", + "**Theory (Phase Overview):**\n", + "Having extracted entities and relationships, this phase focuses on formally constructing the Knowledge Graph. This involves several key sub-tasks:\n", + "* **Entity Disambiguation & Linking:** Ensuring that different textual mentions of the same real-world entity are resolved to a single, canonical identifier (URI). This is crucial for graph coherence and data integration (Ch. 6, Ch. 8 concepts like COMET).\n", + "* **Schema/Ontology Alignment:** Mapping the extracted entity types and relationship predicates to a predefined schema or ontology (Ch. 2 - Ontology Layer; Ch. 4 - R2RML-like mapping). This provides semantic structure and enables interoperability and reasoning.\n", + "* **Triple Generation:** Converting the structured entity and relation data into Subject-Predicate-Object (S-P-O) triples, the fundamental data model of RDF-based KGs (Ch. 2, Ch. 4 - RML output).\n", + "The output of this phase is a populated `rdflib.Graph` object." + ] + }, + { + "cell_type": "markdown", + "id": "step3-1-normalize-entity-text-func-def-desc", + "metadata": {}, + "source": [ + "### Step 3.1: Entity Disambiguation & Linking (Simplified) - Normalization Function\n", + "**Task:** Resolve different mentions of the same real-world entity.\n", + "\n", + "**Book Concept:** (Ch. 6 - Entity Resolution; Ch. 8 - Context-aware linking)\n", + "True entity disambiguation and linking (EDL) is a complex NLP task, often involving linking entities to large external KGs like Wikidata or DBpedia, or using sophisticated clustering and coreference resolution. \n", + "\n", + "**Methodology (Simplified):**\n", + "For this demonstration, we'll perform a simplified version: **text normalization**. The `normalize_entity_text` function will:\n", + "* Trim whitespace.\n", + "* For `ORG` entities, attempt to remove common corporate suffixes (e.g., \"Inc.\", \"Ltd.\", \"Corp.\") to group variations like \"Example Corp\" and \"Example Corporation\" under a common normalized form like \"Example\".\n", + "* (Optionally, one might consider lowercasing, but this can sometimes lose important distinctions, e.g., between \"IT\" the pronoun and \"IT\" the sector).\n", + "This normalized text will then be used to create a unique URI for each distinct entity." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "normalize_entity_text_func_def", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Function 'normalize_entity_text' defined.\n" + ] + } + ], + "source": [ + "def normalize_entity_text(text_to_normalize, entity_type_str):\n", + " \"\"\"Normalizes entity text for better linking (simplified version).\"\"\"\n", + " normalized_t = text_to_normalize.strip()\n", + " \n", + " if entity_type_str == 'ORG':\n", + " # Common suffixes to remove for ORG names. Order can matter for nested suffixes.\n", + " # More comprehensive list would be needed for production.\n", + " suffixes = [\n", + " 'Inc.', 'Incorporated', 'Ltd.', 'Limited', 'LLC', 'L.L.C.', \n", + " 'Corp.', 'Corporation', 'PLC', 'Public Limited Company', \n", + " 'GmbH', 'AG', 'S.A.', 'S.A.S.', 'B.V.', 'Pty Ltd', 'Co.', 'Company',\n", + " 'Solutions', 'Technologies', 'Systems', 'Group', 'Holdings'\n", + " ]\n", + " # Sort suffixes by length descending to remove longer matches first (e.g., 'Pty Ltd' before 'Ltd')\n", + " suffixes.sort(key=len, reverse=True)\n", + " for suffix in suffixes:\n", + " # Case-insensitive suffix removal from the end of the string\n", + " if normalized_t.lower().endswith(suffix.lower()):\n", + " # Find the actual start of the suffix to preserve casing of the main name\n", + " suffix_start_index = normalized_t.lower().rfind(suffix.lower())\n", + " normalized_t = normalized_t[:suffix_start_index].strip()\n", + " break # Remove one suffix type, then re-evaluate if more complex logic is needed\n", + " \n", + " # Remove trailing commas or periods that might be left after suffix removal\n", + " normalized_t = re.sub(r'[-,.]*$', '', normalized_t).strip()\n", + " \n", + " # General cleaning: remove possessives like 's sometimes caught by NER\n", + " if normalized_t.endswith(\"'s\") or normalized_t.endswith(\"s'\"):\n", + " normalized_t = normalized_t[:-2].strip()\n", + " \n", + " # Consider lowercasing carefully. For ORGs it might be okay, for PERSONs less so.\n", + " # For this demo, we'll keep original casing for the most part after suffix stripping.\n", + " # normalized_t = normalized_t.lower() # Uncomment if aggressive normalization is desired\n", + " \n", + " return normalized_t.strip() if normalized_t else text_to_normalize # Return original if normalization results in empty\n", + "\n", + "print(\"Function 'normalize_entity_text' defined.\")" + ] + }, + { + "cell_type": "markdown", + "id": "normalize_entity_text_func_def_output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "Confirms the definition of the `normalize_entity_text` function." + ] + }, + { + "cell_type": "markdown", + "id": "entity-normalization-exec-desc", + "metadata": {}, + "source": [ + "#### Execute Entity Normalization and URI Generation\n", + "\n", + "**Theory:**\n", + "This block processes the `articles_with_relations` list. For each entity extracted by the LLM:\n", + "1. Its text is normalized using `normalize_entity_text`.\n", + "2. A unique URI (Uniform Resource Identifier) is generated for each distinct normalized entity. We use a simple scheme: `EX:_`. The `EX` is our custom namespace. This creates a canonical identifier for each unique real-world concept (as per our normalization). A `unique_entities_map` dictionary stores the mapping from `(normalized_text, entity_type)` to its URI, ensuring that the same normalized entity always gets the same URI across all articles.\n", + "3. The normalized text and the URI are added to the entity's dictionary.\n", + "The results are stored in `articles_with_normalized_entities`." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "entity-normalization-exec-code", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Normalizing entities and preparing for triple generation...\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7e3112e4d60f4ffea53ceea5e7230a73", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Normalizing Entities & URI Gen: 0%| | 0/3 [00:00 URI, to ensure URI consistency\n", + "\n", + "if articles_with_relations: # Process only if we have articles with relations (which implies entities)\n", + " print(\"Normalizing entities and preparing for triple generation...\")\n", + " for article_data_rel in tqdm(articles_with_relations, desc=\"Normalizing Entities & URI Gen\"):\n", + " current_article_normalized_ents = []\n", + " # Ensure 'llm_entities' key exists and is a list\n", + " if 'llm_entities' in article_data_rel and isinstance(article_data_rel['llm_entities'], list):\n", + " for entity_dict in article_data_rel['llm_entities']:\n", + " # Ensure entity_dict is a dictionary with 'text' and 'type'\n", + " if not (isinstance(entity_dict, dict) and 'text' in entity_dict and 'type' in entity_dict):\n", + " print(f\" Skipping malformed entity object: {str(entity_dict)[:100]} in article {article_data_rel['id']}\")\n", + " continue\n", + "\n", + " original_entity_text = entity_dict['text']\n", + " entity_type_val = entity_dict['type'] \n", + " # LLM might return type with description, e.g. \"ORG (Company)\". We need just \"ORG\".\n", + " # We'll take the first word as the type for simplicity, assuming it's the label like ORG, PERSON.\n", + " simple_entity_type = entity_type_val.split(' ')[0].upper()\n", + " entity_dict['simple_type'] = simple_entity_type # Store the simplified type\n", + " \n", + " normalized_entity_text = normalize_entity_text(original_entity_text, simple_entity_type)\n", + " if not normalized_entity_text: # if normalization resulted in empty string, use original\n", + " normalized_entity_text = original_entity_text \n", + " \n", + " # Create a unique key for the map using normalized text and simple type\n", + " entity_map_key = (normalized_entity_text, simple_entity_type)\n", + " \n", + " if entity_map_key not in unique_entities_map:\n", + " # Sanitize text for URI: replace spaces and special characters not allowed in URIs\n", + " # A more robust IRI->URI conversion might be needed for non-ASCII characters.\n", + " safe_uri_text_part = re.sub(r'[^a-zA-Z0-9_\\-]', '_', normalized_entity_text.replace(' ', '_'))\n", + " # Prevent extremely long URIs from very long entity texts (rare but possible)\n", + " safe_uri_text_part = safe_uri_text_part[:80] \n", + " if not safe_uri_text_part: # If sanitization results in empty string, use a hash or generic id\n", + " import hashlib\n", + " safe_uri_text_part = f\"entity_{hashlib.md5(normalized_entity_text.encode()).hexdigest()[:8]}\"\n", + " unique_entities_map[entity_map_key] = EX[f\"{safe_uri_text_part}_{simple_entity_type}\"]\n", + " \n", + " # Update the entity dictionary\n", + " entity_dict_copy = entity_dict.copy()\n", + " entity_dict_copy['normalized_text'] = normalized_entity_text\n", + " entity_dict_copy['uri'] = unique_entities_map[entity_map_key]\n", + " current_article_normalized_ents.append(entity_dict_copy)\n", + " \n", + " # Store results for the current article\n", + " article_data_output_norm = article_data_rel.copy()\n", + " article_data_output_norm['normalized_entities'] = current_article_normalized_ents\n", + " articles_with_normalized_entities.append(article_data_output_norm)\n", + " \n", + " if articles_with_normalized_entities and articles_with_normalized_entities[0].get('normalized_entities'):\n", + " print(\"\\nExample of first article's normalized entities (first 3):\")\n", + " for ent_example in articles_with_normalized_entities[0]['normalized_entities'][:3]:\n", + " print(f\" Original: '{ent_example['text']}', Type: {ent_example['type']} (Simple: {ent_example['simple_type']}), Normalized: '{ent_example['normalized_text']}', URI: <{ent_example['uri']}>\")\n", + " print(f\"\\nProcessed {len(articles_with_normalized_entities)} articles for entity normalization and URI generation.\")\n", + " print(f\"Total unique canonical entity URIs created: {len(unique_entities_map)}\")\n", + "else:\n", + " print(\"Skipping entity normalization and URI generation: No articles with relations available.\")\n", + "\n", + "# Ensure articles_with_normalized_entities is defined\n", + "if 'articles_with_normalized_entities' not in globals():\n", + " articles_with_normalized_entities = []\n", + " print(\"Initialized 'articles_with_normalized_entities' as an empty list.\")" + ] + }, + { + "cell_type": "markdown", + "id": "entity-normalization-exec-output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "This block will show:\n", + "* Progress of the normalization and URI generation process.\n", + "* Examples of original entity text vs. their normalized versions and the generated URIs for the first few entities in the first processed article.\n", + "* The total count of unique entity URIs created across all processed articles." + ] + }, + { + "cell_type": "markdown", + "id": "step3-2-rdf-type-func-def-desc", + "metadata": {}, + "source": [ + "### Step 3.2: Schema/Ontology Alignment - RDF Type Mapping Function\n", + "**Task:** Map extracted entities and relationships to a consistent schema or ontology.\n", + "\n", + "**Book Concept:** (Ch. 2 - Ontology Layer; Ch. 4 - Mapping)\n", + "Schema/Ontology alignment involves mapping our locally defined entity types (e.g., \"ORG\", \"PERSON\" from the LLM NER step) and relationship predicates to standard vocabularies (like Schema.org) or custom-defined RDF classes and properties. This adds semantic rigor and enables interoperability.\n", + "\n", + "**Methodology:**\n", + "The `get_rdf_type_for_entity` function takes our simple entity type string (e.g., \"ORG\") and maps it to an RDF Class. \n", + "* It uses a predefined dictionary (`type_mapping`) to link common types to `SCHEMA` (Schema.org) classes (e.g., `ORG` -> `SCHEMA.Organization`).\n", + "* If a type is not in the map, it defaults to creating a class within our custom `EX` namespace (e.g., `EX.CUSTOM_TYPE`).\n", + "This function ensures that each entity in our KG will be assigned a formal RDF type." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "get_rdf_type_for_entity_func_def", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Function 'get_rdf_type_for_entity' defined.\n" + ] + } + ], + "source": [ + "def get_rdf_type_for_entity(simple_entity_type_str):\n", + " \"\"\"Maps our simple entity type string (e.g., 'ORG') to an RDF Class.\"\"\"\n", + " type_mapping = {\n", + " 'ORG': SCHEMA.Organization,\n", + " 'PERSON': SCHEMA.Person,\n", + " 'MONEY': SCHEMA.PriceSpecification, # Or a custom EX.MonetaryValue\n", + " 'DATE': SCHEMA.Date, # Note: schema.org/Date is a datatype, consider schema.org/Event for events with dates\n", + " 'PRODUCT': SCHEMA.Product,\n", + " 'GPE': SCHEMA.Place, # Geopolitical Entity\n", + " 'LOC': SCHEMA.Place, # General Location\n", + " 'EVENT': SCHEMA.Event,\n", + " # Add other mappings as derived from llm_selected_entity_types_str if needed\n", + " 'CARDINAL': RDF.Statement, # Or more specific if context known, often just a literal value\n", + " 'FAC': SCHEMA.Place # Facility\n", + " }\n", + " return type_mapping.get(simple_entity_type_str.upper(), EX[simple_entity_type_str.upper()]) # Fallback to custom type\n", + "\n", + "print(\"Function 'get_rdf_type_for_entity' defined.\")" + ] + }, + { + "cell_type": "markdown", + "id": "get_rdf_type_for_entity_func_def_output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "Confirms the definition of the `get_rdf_type_for_entity` mapping function." + ] + }, + { + "cell_type": "markdown", + "id": "step3-2-rdf-predicate-func-def-desc", + "metadata": {}, + "source": [ + "#### Schema/Ontology Alignment - RDF Predicate Mapping Function\n", + "\n", + "**Theory:**\n", + "The `get_rdf_predicate` function maps our string-based relationship predicates (e.g., \"ACQUIRED\", \"HAS_PRICE\" from the LLM RE step) to RDF Properties. For simplicity and custom control, these are typically mapped to properties within our `EX` namespace. The function ensures that predicate strings are converted into valid URI components (e.g., by replacing spaces with underscores)." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "get_rdf_predicate_func_def", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Function 'get_rdf_predicate' defined.\n" + ] + } + ], + "source": [ + "def get_rdf_predicate(predicate_str_from_llm):\n", + " \"\"\"Maps our predicate string (from LLM relation extraction) to an RDF Property in our EX namespace.\"\"\"\n", + " # Predicates are already somewhat like properties (e.g., 'ACQUIRED')\n", + " # We'll ensure they are valid URI components for our custom namespace EX\n", + " # Replace spaces with underscores and ensure it's a simple, clean string\n", + " sanitized_predicate = predicate_str_from_llm.strip().replace(\" \", \"_\").upper()\n", + " return EX[sanitized_predicate]\n", + "\n", + "print(\"Function 'get_rdf_predicate' defined.\")" + ] + }, + { + "cell_type": "markdown", + "id": "get_rdf_predicate_func_def_output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "Confirms the definition of the `get_rdf_predicate` mapping function." + ] + }, + { + "cell_type": "markdown", + "id": "schema-alignment-example-desc", + "metadata": {}, + "source": [ + "#### Schema/Ontology Alignment - Examples\n", + "\n", + "**Theory:**\n", + "This block simply prints out a few examples of how our entity types and relationship predicates would be mapped to RDF terms using the functions defined above. This serves as a quick check and illustration of the mapping logic." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "schema-alignment-example-code", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Schema alignment functions ready. Example mappings:\n", + " Entity Type 'ORG' maps to RDF Class: \n", + " Predicate 'ACQUIRED' maps to RDF Property: \n", + " Entity Type 'MONEY' maps to RDF Class: \n", + " Predicate 'HAS_PRICE' maps to RDF Property: \n" + ] + } + ], + "source": [ + "print(\"Schema alignment functions ready. Example mappings:\")\n", + "example_entity_type = 'ORG'\n", + "example_predicate_str = 'ACQUIRED'\n", + "print(f\" Entity Type '{example_entity_type}' maps to RDF Class: <{get_rdf_type_for_entity(example_entity_type)}>\")\n", + "print(f\" Predicate '{example_predicate_str}' maps to RDF Property: <{get_rdf_predicate(example_predicate_str)}>\")\n", + "\n", + "example_entity_type_2 = 'MONEY'\n", + "example_predicate_str_2 = 'HAS_PRICE'\n", + "print(f\" Entity Type '{example_entity_type_2}' maps to RDF Class: <{get_rdf_type_for_entity(example_entity_type_2)}>\")\n", + "print(f\" Predicate '{example_predicate_str_2}' maps to RDF Property: <{get_rdf_predicate(example_predicate_str_2)}>\")" + ] + }, + { + "cell_type": "markdown", + "id": "schema-alignment-example-output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "Shows example RDF URIs that would be generated for sample entity types and predicate strings, illustrating the mapping functions." + ] + }, + { + "cell_type": "markdown", + "id": "step3-3-triple-generation-exec-desc", + "metadata": {}, + "source": [ + "### Step 3.3: Triple Generation\n", + "**Task:** Convert the structured entity and relation data into subject–predicate–object triples.\n", + "\n", + "**Book Concept:** (Ch. 2 - KG structure; Ch. 4 - RML output)\n", + "This is where the Knowledge Graph materializes. We iterate through our processed articles (`articles_with_normalized_entities`) and convert the extracted information into RDF triples using `rdflib`.\n", + "\n", + "**Methodology:**\n", + "1. **Initialize Graph:** An `rdflib.Graph` object (`kg`) is created.\n", + "2. **Bind Namespaces:** Namespaces (EX, SCHEMA, RDFS, etc.) are bound to prefixes for cleaner serialization of the RDF (e.g., `ex:AcmeCorp` instead of the full URI).\n", + "3. **Iterate Articles:** For each article:\n", + " * An RDF resource is created for the article itself (e.g., `ex:article_123`), typed as `schema:Article`.\n", + " * Its summary (or ID) can be added as a `schema:headline` or `rdfs:label`.\n", + "4. **Iterate Entities:** For each `normalized_entity` within an article:\n", + " * The entity's URI (from `entity['uri']`) is used as the subject.\n", + " * A triple `(entity_uri, rdf:type, rdf_entity_type)` is added, where `rdf_entity_type` comes from `get_rdf_type_for_entity()`.\n", + " * A triple `(entity_uri, rdfs:label, Literal(normalized_text))` is added to provide a human-readable label.\n", + " * If the original text differs from the normalized text, `(entity_uri, skos:altLabel, Literal(original_text))` can be added for the original mention.\n", + " * A triple `(article_uri, schema:mentions, entity_uri)` links the article to the entities it mentions.\n", + " * A local map (`entity_uri_map_for_article`) is built for the current article, mapping original entity texts to their canonical URIs. This is crucial for resolving relations in the next step, as relations were extracted based on original text spans.\n", + "5. **Iterate Relations:** For each `llm_relation` within an article:\n", + " * The URIs for the subject and object entities are looked up from `entity_uri_map_for_article` using their original text spans.\n", + " * The predicate string is converted to an RDF property using `get_rdf_predicate()`.\n", + " * If both subject and object URIs are found, the triple `(subject_uri, predicate_rdf, object_uri)` is added to the graph.\n", + "\n", + "**Output:** A populated `rdflib.Graph` (`kg`) containing all the extracted knowledge as RDF triples." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "triple-generation-exec-code", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating RDF triples for 3 processed articles...\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "818e44fbf2b24002a0c9ff572e0266ed", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Generating Triples: 0%| | 0/3 [00:00 canonical URI\n", + " # This is important because relations were extracted based on original text spans.\n", + " entity_text_to_uri_map_current_article = {}\n", + "\n", + " # Add entity triples\n", + " for entity_obj in article_data_final.get('normalized_entities', []):\n", + " entity_uri_val = entity_obj['uri'] # This is the canonical URI from unique_entities_map\n", + " rdf_entity_type_val = get_rdf_type_for_entity(entity_obj['simple_type'])\n", + " normalized_label = entity_obj['normalized_text']\n", + " original_label = entity_obj['text']\n", + " \n", + " kg.add((entity_uri_val, RDF.type, rdf_entity_type_val))\n", + " kg.add((entity_uri_val, RDFS.label, Literal(normalized_label, lang='en')))\n", + " triples_generated_count += 2\n", + " if normalized_label != original_label:\n", + " kg.add((entity_uri_val, SKOS.altLabel, Literal(original_label, lang='en')))\n", + " triples_generated_count += 1\n", + " \n", + " # Link article to mentioned entities\n", + " kg.add((article_uri, SCHEMA.mentions, entity_uri_val))\n", + " triples_generated_count += 1\n", + " \n", + " # Populate the local map for resolving relations within this article\n", + " entity_text_to_uri_map_current_article[original_label] = entity_uri_val\n", + "\n", + " # Add relation triples\n", + " for relation_obj in article_data_final.get('llm_relations', []):\n", + " subject_orig_text = relation_obj.get('subject_text')\n", + " object_orig_text = relation_obj.get('object_text')\n", + " predicate_str = relation_obj.get('predicate')\n", + " \n", + " # Resolve subject and object texts to their canonical URIs using the article-specific map\n", + " subject_resolved_uri = entity_text_to_uri_map_current_article.get(subject_orig_text)\n", + " object_resolved_uri = entity_text_to_uri_map_current_article.get(object_orig_text)\n", + " \n", + " if subject_resolved_uri and object_resolved_uri and predicate_str:\n", + " predicate_rdf_prop = get_rdf_predicate(predicate_str)\n", + " kg.add((subject_resolved_uri, predicate_rdf_prop, object_resolved_uri))\n", + " triples_generated_count += 1\n", + " else:\n", + " if not subject_resolved_uri:\n", + " print(f\" Warning: Could not find URI for subject '{subject_orig_text}' in article {article_data_final['id']}. Relation skipped: {relation_obj}\")\n", + " if not object_resolved_uri:\n", + " print(f\" Warning: Could not find URI for object '{object_orig_text}' in article {article_data_final['id']}. Relation skipped: {relation_obj}\")\n", + "\n", + " print(f\"\\nFinished generating triples. Approximately {triples_generated_count} triples were candidates for addition.\")\n", + " print(f\"Total actual triples in the graph: {len(kg)}\")\n", + " if len(kg) > 0:\n", + " print(\"\\nSample of first 5 triples in N3 format:\")\n", + " for i, (s, p, o) in enumerate(kg):\n", + " # Use n3() for a readable representation respecting prefixes\n", + " print(f\" {s.n3(kg.namespace_manager)} {p.n3(kg.namespace_manager)} {o.n3(kg.namespace_manager)}.\")\n", + " if i >= 4: # Print first 5\n", + " break\n", + "else:\n", + " print(\"Skipping triple generation: No processed articles with normalized entities available.\")\n", + "\n", + "# Ensure kg is defined\n", + "if 'kg' not in globals():\n", + " kg = Graph()\n", + " print(\"Initialized 'kg' as an empty rdflib.Graph object.\")" + ] + }, + { + "cell_type": "markdown", + "id": "triple-generation-exec-output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "This block will show:\n", + "* Progress of triple generation.\n", + "* The approximate number of triples considered for addition and the final total number of triples in the `kg` graph.\n", + "* Warnings if subject/object entities for a relation couldn't be resolved to URIs.\n", + "* A sample of the first few triples in N3 (Notation3) format, which is a human-readable RDF serialization." + ] + }, + { + "cell_type": "markdown", + "id": "phase4", + "metadata": {}, + "source": [ + "## Phase 4: Knowledge Graph Refinement Using Embeddings\n", + "**(Ref: Ch. 6 – Embedding-Based Reasoning; Ch. 7 – ML on KGs with SANSA)**\n", + "\n", + "**Theory (Phase Overview):**\n", + "Knowledge Graph embeddings (KGEs) learn low-dimensional vector representations for entities and relations in a KG. These embeddings capture the semantic properties of KG components and their interactions. This phase explores using such embeddings for KG refinement, a concept aligned with embedding-based reasoning (Ch. 6).\n", + "Key tasks include:\n", + "* **Generating Embeddings:** Creating vector representations for nodes (entities).\n", + "* **Link Prediction (Knowledge Discovery):** Using embeddings to infer missing connections or predict new potential relationships (Ch. 6). This is a powerful way to discover implicit knowledge and enrich the KG.\n", + "While full KGE model training (like TransE, ComplEx, DistMult mentioned in Ch. 6) is beyond this demo's scope, we'll use pre-trained text embeddings for entity names as a proxy to demonstrate semantic similarity, a foundational concept for some link prediction approaches." + ] + }, + { + "cell_type": "markdown", + "id": "step4-1-embedding-func-def-desc", + "metadata": {}, + "source": [ + "### Step 4.1: Generate KG Embeddings - Embedding Function Definition\n", + "**Task:** Create vector representations for nodes (entities) in the graph.\n", + "\n", + "**Book Concept:** (Ch. 6 - Embeddings bridging symbolic & sub-symbolic)\n", + "Embeddings transform symbolic entities (represented by URIs and labels) into numerical vectors in a continuous vector space. This allows us to apply machine learning techniques and measure semantic similarity.\n", + "\n", + "**Methodology:**\n", + "The `get_embeddings_for_texts` function will:\n", + "* Take a list of unique entity texts (e.g., their normalized labels).\n", + "* Use the configured OpenAI/Nebius embedding API (with `EMBEDDING_MODEL_NAME`) to fetch pre-trained embeddings for these texts.\n", + "* Handle batching or individual requests as appropriate for the API.\n", + "* Return a dictionary mapping each input text to its embedding vector.\n", + "These embeddings represent the semantic meaning of the entity names." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "get_embeddings_for_texts_func_def", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Function 'get_embeddings_for_texts' defined.\n" + ] + } + ], + "source": [ + "def get_embeddings_for_texts(texts_list, embedding_model_name=EMBEDDING_MODEL_NAME):\n", + " \"\"\"Gets embeddings for a list of texts using the specified model via the LLM client.\"\"\"\n", + " if not client:\n", + " print(\"LLM client not initialized. Skipping embedding generation.\")\n", + " return {text: [] for text in texts_list} # Return dict with empty embeddings\n", + " if not texts_list:\n", + " print(\"No texts provided for embedding generation.\")\n", + " return {}\n", + " \n", + " embeddings_map_dict = {}\n", + " print(f\"Fetching embeddings for {len(texts_list)} unique texts using model '{embedding_model_name}'...\")\n", + " \n", + " # Process texts in batches to be efficient and respect potential API limits\n", + " # Some APIs handle list inputs directly, others might require batching.\n", + " # The OpenAI client's `embeddings.create` can often take a list of inputs.\n", + " # If your specific endpoint requires single inputs or smaller batches, adjust this loop.\n", + " # For this example, assuming the client can handle a list, but will iterate if not or for safety.\n", + "\n", + " # Check if the input texts_list itself is a list of strings\n", + " if not all(isinstance(text, str) for text in texts_list):\n", + " print(\"Error: Input 'texts_list' must be a list of strings.\")\n", + " return {text: [] for text in texts_list if isinstance(text, str)} # Try to salvage what we can\n", + " \n", + " # Remove empty strings to avoid API errors\n", + " valid_texts_list = [text for text in texts_list if text.strip()]\n", + " if not valid_texts_list:\n", + " print(\"No valid (non-empty) texts to embed.\")\n", + " return {}\n", + "\n", + " try:\n", + " # Assuming the client.embeddings.create can take a list of inputs.\n", + " # If it can only take one string at a time, you'd loop here.\n", + " response = client.embeddings.create(\n", + " model=embedding_model_name,\n", + " input=valid_texts_list # Pass the list of valid texts\n", + " )\n", + " # The response.data should be a list of embedding objects, in the same order as input\n", + " for i, data_item in enumerate(response.data):\n", + " embeddings_map_dict[valid_texts_list[i]] = data_item.embedding\n", + " \n", + " print(f\"Embeddings received for {len(embeddings_map_dict)} texts.\")\n", + " # For texts that were empty or failed, add them with empty embeddings if needed by caller\n", + " for text in texts_list:\n", + " if text not in embeddings_map_dict:\n", + " embeddings_map_dict[text] = []\n", + " return embeddings_map_dict\n", + " \n", + " except Exception as e:\n", + " print(f\"Error getting embeddings (batch attempt): {e}\")\n", + " print(\"Falling back to individual embedding requests if batch failed...\")\n", + " # Fallback to individual requests if batching failed or is not supported by the specific client/endpoint setup\n", + " embeddings_map_dict_fallback = {}\n", + " for text_input_item in tqdm(valid_texts_list, desc=\"Generating Embeddings (Fallback Mode)\"):\n", + " try:\n", + " response_item = client.embeddings.create(\n", + " model=embedding_model_name,\n", + " input=text_input_item\n", + " )\n", + " embeddings_map_dict_fallback[text_input_item] = response_item.data[0].embedding\n", + " if len(valid_texts_list) > 10: # Only sleep if processing many items\n", + " time.sleep(0.1) # Small delay per request in fallback\n", + " except Exception as e_item:\n", + " print(f\" Error getting embedding for text '{text_input_item[:50]}...': {e_item}\")\n", + " embeddings_map_dict_fallback[text_input_item] = [] # Store empty list on error for this item\n", + " \n", + " # For texts that were empty or failed, add them with empty embeddings if needed by caller\n", + " for text in texts_list:\n", + " if text not in embeddings_map_dict_fallback:\n", + " embeddings_map_dict_fallback[text] = []\n", + " return embeddings_map_dict_fallback\n", + "\n", + "print(\"Function 'get_embeddings_for_texts' defined.\")" + ] + }, + { + "cell_type": "markdown", + "id": "get_embeddings_for_texts_func_def_output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "Confirms the definition of the `get_embeddings_for_texts` function." + ] + }, + { + "cell_type": "markdown", + "id": "kg-embedding-exec-desc", + "metadata": {}, + "source": [ + "#### Generate KG Embeddings - Execution\n", + "\n", + "**Theory:**\n", + "This block orchestrates the generation of embeddings for our KG entities:\n", + "1. It extracts the set of unique, normalized entity texts from our `unique_entities_map` (which maps `(normalized_text, type)` to URIs). We are interested in embedding the textual representation of entities.\n", + "2. It calls `get_embeddings_for_texts` with this list of unique texts.\n", + "3. The returned embeddings (which are mapped to texts) are then re-mapped to our canonical entity URIs, creating the `entity_embeddings` dictionary: `{entity_uri: embedding_vector}`.\n", + "This dictionary will store the vector representation for each unique entity in our graph." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "kg-embedding-exec-code", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Preparing to fetch embeddings for 23 unique normalized entity texts.\n", + "Fetching embeddings for 23 unique texts using model 'BAAI/bge-multilingual-gemma2'...\n", + "Embeddings received for 23 texts.\n", + "\n", + "Successfully generated and mapped embeddings for 23 entity URIs.\n", + " Example embedding for URI (Label: 'United Nations'):\n", + " Vector (first 5 dims): [-0.00027251243591308594, 0.0006837844848632812, -0.01216888427734375, -0.01558685302734375, 0.0038166046142578125]...\n", + " Vector dimension: 3584\n" + ] + } + ], + "source": [ + "entity_embeddings = {} # Initialize: maps entity URI -> embedding vector\n", + "\n", + "if unique_entities_map and client: # Proceed if we have unique entities and LLM client\n", + " # Extract unique normalized entity texts for which we need embeddings.\n", + " # unique_entities_map maps (normalized_text, type) -> URI\n", + " # We need just the normalized_text part for embedding.\n", + " entity_normalized_texts_to_embed = list(set([key[0] for key in unique_entities_map.keys() if key[0].strip()]))\n", + " \n", + " if entity_normalized_texts_to_embed:\n", + " print(f\"Preparing to fetch embeddings for {len(entity_normalized_texts_to_embed)} unique normalized entity texts.\")\n", + " \n", + " # Get embeddings for these unique texts\n", + " text_to_embedding_map = get_embeddings_for_texts(entity_normalized_texts_to_embed)\n", + " \n", + " # Map these embeddings back to our entity URIs\n", + " for (normalized_text_key, entity_type_key), entity_uri_val_emb in unique_entities_map.items():\n", + " if normalized_text_key in text_to_embedding_map and text_to_embedding_map[normalized_text_key]:\n", + " entity_embeddings[entity_uri_val_emb] = text_to_embedding_map[normalized_text_key]\n", + " # else: # This case should be handled by get_embeddings_for_texts returning empty list for failed/empty texts\n", + " # print(f\" Warning: No embedding found or generated for text '{normalized_text_key}' (URI: {entity_uri_val_emb})\")\n", + " \n", + " if entity_embeddings:\n", + " print(f\"\\nSuccessfully generated and mapped embeddings for {len(entity_embeddings)} entity URIs.\")\n", + " # Show an example\n", + " first_uri_with_embedding = next(iter(entity_embeddings.keys()), None)\n", + " if first_uri_with_embedding:\n", + " emb_example = entity_embeddings[first_uri_with_embedding]\n", + " # Get label for this URI from KG\n", + " label_for_uri = kg.value(subject=first_uri_with_embedding, predicate=RDFS.label, default=str(first_uri_with_embedding))\n", + " print(f\" Example embedding for URI <{first_uri_with_embedding}> (Label: '{label_for_uri}'):\")\n", + " print(f\" Vector (first 5 dims): {str(emb_example[:5])}...\")\n", + " print(f\" Vector dimension: {len(emb_example)}\")\n", + " else:\n", + " print(\"No embeddings were successfully mapped to entity URIs.\")\n", + " else:\n", + " print(\"No unique entity texts found to generate embeddings for.\")\n", + "else:\n", + " print(\"Skipping embedding generation: No unique entities identified, or LLM client not available.\")\n", + "\n", + "# Ensure entity_embeddings is defined\n", + "if 'entity_embeddings' not in globals():\n", + " entity_embeddings = {}\n", + " print(\"Initialized 'entity_embeddings' as an empty dictionary.\")" + ] + }, + { + "cell_type": "markdown", + "id": "kg-embedding-exec-output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "This block will show:\n", + "* Progress of fetching embeddings.\n", + "* The number of unique entity texts for which embeddings are requested.\n", + "* The number of entity URIs for which embeddings were successfully generated and mapped.\n", + "* An example of an embedding vector (first few dimensions and total length) for one of the entities, along with its URI and label." + ] + }, + { + "cell_type": "markdown", + "id": "step4-2-cosine-sim-func-def-desc", + "metadata": {}, + "source": [ + "### Step 4.2: Link Prediction (Knowledge Discovery - Conceptual) - Cosine Similarity Function\n", + "**Task:** Use embeddings to infer new or missing connections.\n", + "\n", + "**Book Concept:** (Ch. 6 - Link prediction as reasoning)\n", + "Link prediction aims to identify missing edges (triples) in a KG. KGE models are trained to score potential triples (s, p, o), and high-scoring triples not already in the KG are candidate new links. \n", + "\n", + "**Methodology (Simplified):**\n", + "A full link prediction model is complex. Here, we'll demonstrate a simpler, related concept: **semantic similarity** between entities based on their name embeddings. The `get_cosine_similarity` function calculates the cosine similarity between two embedding vectors. High cosine similarity (close to 1) between entity name embeddings suggests that the entities are semantically related in terms of their textual description. This *could* hint at potential relationships (e.g., two similarly named software products might be competitors or complementary), but it's not direct link prediction for specific predicates." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "get_cosine_similarity_func_def", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Function 'get_cosine_similarity' defined.\n" + ] + } + ], + "source": [ + "def get_cosine_similarity(embedding1, embedding2):\n", + " \"\"\"Calculates cosine similarity between two embedding vectors using sklearn.\"\"\"\n", + " if not isinstance(embedding1, (list, np.ndarray)) or not isinstance(embedding2, (list, np.ndarray)):\n", + " # print(\"Warning: One or both embeddings are not lists/arrays.\")\n", + " return 0.0\n", + " if not embedding1 or not embedding2:\n", + " # print(\"Warning: One or both embeddings are empty.\")\n", + " return 0.0\n", + " \n", + " # Ensure they are numpy arrays and 2D for cosine_similarity function\n", + " vec1 = np.array(embedding1).reshape(1, -1)\n", + " vec2 = np.array(embedding2).reshape(1, -1)\n", + " \n", + " # Check if dimensions match, though reshape should handle 1D to 2D conversion.\n", + " # Cosine similarity doesn't strictly require same length for this usage, but it's implied for valid comparison.\n", + " if vec1.shape[1] != vec2.shape[1]:\n", + " print(f\"Warning: Embedding dimensions do not match for cosine similarity: {vec1.shape[1]} vs {vec2.shape[1]}\")\n", + " return 0.0 # Or handle as an error\n", + " \n", + " return cosine_similarity(vec1, vec2)[0][0]\n", + "\n", + "print(\"Function 'get_cosine_similarity' defined.\")" + ] + }, + { + "cell_type": "markdown", + "id": "get_cosine_similarity_func_def_output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "Confirms the definition of the `get_cosine_similarity` function." + ] + }, + { + "cell_type": "markdown", + "id": "link-prediction-exec-desc", + "metadata": {}, + "source": [ + "#### Link Prediction (Conceptual) - Similarity Calculation Example\n", + "\n", + "**Theory:**\n", + "This block demonstrates the use of `get_cosine_similarity`. It selects a couple of entities (preferably organizations, if available with embeddings) from our `entity_embeddings` map and calculates the similarity between their name embeddings. A high similarity might suggest they operate in similar domains or have related roles, which could be a starting point for investigating potential (unobserved) connections if we had a more sophisticated link prediction model." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "link-prediction-exec-code", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Conceptual Link Prediction: Calculating semantic similarity between a sample of entities using their name embeddings.\n", + "Found at least two ORG entities with embeddings for similarity comparison.\n", + "\n", + " Similarity between 'United Nations' () and 'CNN' (): 0.7679\n", + " Interpretation: These entities show moderate similarity based on their name embeddings.\n", + "\n", + "Note: This is a conceptual demonstration of semantic similarity. True link prediction involves training specialized KGE models (e.g., TransE, ComplEx) on existing graph triples to predict missing (subject, predicate, object) facts with specific predicates, not just general entity similarity.\n" + ] + } + ], + "source": [ + "if len(entity_embeddings) >= 2:\n", + " print(\"\\nConceptual Link Prediction: Calculating semantic similarity between a sample of entities using their name embeddings.\")\n", + " \n", + " # Get all URIs that have embeddings\n", + " uris_with_embeddings = [uri for uri, emb in entity_embeddings.items() if emb] # Check if emb is not empty\n", + " \n", + " # Try to find two ORG entities for a more meaningful comparison\n", + " org_entity_uris_with_embeddings = []\n", + " for uri_cand in uris_with_embeddings:\n", + " # Check the type from the KG\n", + " rdf_types_for_uri = list(kg.objects(subject=uri_cand, predicate=RDF.type))\n", + " if SCHEMA.Organization in rdf_types_for_uri or EX.ORG in rdf_types_for_uri:\n", + " org_entity_uris_with_embeddings.append(uri_cand)\n", + " \n", + " entity1_uri_sim = None\n", + " entity2_uri_sim = None\n", + "\n", + " if len(org_entity_uris_with_embeddings) >= 2:\n", + " entity1_uri_sim = org_entity_uris_with_embeddings[0]\n", + " entity2_uri_sim = org_entity_uris_with_embeddings[1]\n", + " print(f\"Found at least two ORG entities with embeddings for similarity comparison.\")\n", + " elif len(uris_with_embeddings) >= 2: # Fallback to any two entities if not enough ORGs\n", + " entity1_uri_sim = uris_with_embeddings[0]\n", + " entity2_uri_sim = uris_with_embeddings[1]\n", + " print(f\"Could not find two ORGs with embeddings. Using two generic entities for similarity comparison.\")\n", + " else:\n", + " print(\"Not enough entities (less than 2) with valid embeddings to demonstrate similarity.\")\n", + "\n", + " if entity1_uri_sim and entity2_uri_sim:\n", + " embedding1_val = entity_embeddings.get(entity1_uri_sim)\n", + " embedding2_val = entity_embeddings.get(entity2_uri_sim)\n", + " \n", + " # Retrieve labels for these URIs from the graph for context\n", + " label1_val = kg.value(subject=entity1_uri_sim, predicate=RDFS.label, default=str(entity1_uri_sim))\n", + " label2_val = kg.value(subject=entity2_uri_sim, predicate=RDFS.label, default=str(entity2_uri_sim))\n", + "\n", + " calculated_similarity = get_cosine_similarity(embedding1_val, embedding2_val)\n", + " print(f\"\\n Similarity between '{label1_val}' (<{entity1_uri_sim}>) and '{label2_val}' (<{entity2_uri_sim}>): {calculated_similarity:.4f}\")\n", + " \n", + " # Interpret similarity (example thresholds)\n", + " if calculated_similarity > 0.8:\n", + " print(f\" Interpretation: These entities are highly similar based on their name embeddings.\")\n", + " elif calculated_similarity > 0.6:\n", + " print(f\" Interpretation: These entities show moderate similarity based on their name embeddings.\")\n", + " else:\n", + " print(f\" Interpretation: These entities show low similarity based on their name embeddings.\")\n", + " \n", + " print(\"\\nNote: This is a conceptual demonstration of semantic similarity. True link prediction involves training specialized KGE models (e.g., TransE, ComplEx) on existing graph triples to predict missing (subject, predicate, object) facts with specific predicates, not just general entity similarity.\")\n", + "else:\n", + " print(\"Skipping conceptual link prediction: Not enough entity embeddings available (need at least 2).\")" + ] + }, + { + "cell_type": "markdown", + "id": "link-prediction-exec-output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "This block will:\n", + "* Select two entities that have embeddings.\n", + " * Calculate and print the cosine similarity score between their embeddings.\n", + " * Provide a simple interpretation of the similarity score.\n", + " * Include a disclaimer that this is a simplified concept, not full link prediction." + ] + }, + { + "cell_type": "markdown", + "id": "step4-3-add-inferred-func-def-desc", + "metadata": {}, + "source": [ + "### Step 4.3: Add Predicted Links (Optional & Conceptual) - Function Definition\n", + "**Task:** Integrate high-confidence predicted links into the main graph.\n", + "\n", + "**Book Concept:** (Ch. 6 - KG enrichment and lifecycle)\n", + "If a link prediction model were to identify new, high-confidence relationships, these could be added to the KG, enriching it with inferred knowledge. This is part of the KG lifecycle, where the graph evolves and grows.\n", + "\n", + "**Methodology:**\n", + "The function `add_inferred_triples_to_graph` is a placeholder to illustrate this. It would take a list of (subject_uri, predicate_uri, object_uri) triples (presumably from a link prediction model) and add them to our main `rdflib.Graph`." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "add_inferred_triples_to_graph_func_def", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Function 'add_inferred_triples_to_graph' defined.\n" + ] + } + ], + "source": [ + "def add_inferred_triples_to_graph(target_graph, list_of_inferred_triples):\n", + " \"\"\"Adds a list of inferred (subject_uri, predicate_uri, object_uri) triples to the graph.\"\"\"\n", + " if not list_of_inferred_triples:\n", + " print(\"No inferred triples provided to add.\")\n", + " return target_graph, 0\n", + " \n", + " added_count = 0\n", + " for s_uri, p_uri, o_uri in list_of_inferred_triples:\n", + " # Basic validation: ensure they are URIRefs or Literals as appropriate\n", + " if isinstance(s_uri, URIRef) and isinstance(p_uri, URIRef) and (isinstance(o_uri, URIRef) or isinstance(o_uri, Literal)):\n", + " target_graph.add((s_uri, p_uri, o_uri))\n", + " added_count +=1\n", + " else:\n", + " print(f\" Warning: Skipping malformed conceptual inferred triple: ({s_uri}, {p_uri}, {o_uri})\")\n", + " \n", + " print(f\"Added {added_count} conceptually inferred triples to the graph.\")\n", + " return target_graph, added_count\n", + "\n", + "print(\"Function 'add_inferred_triples_to_graph' defined.\")" + ] + }, + { + "cell_type": "markdown", + "id": "add_inferred_triples_to_graph_func_def_output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "Confirms the definition of the `add_inferred_triples_to_graph` function." + ] + }, + { + "cell_type": "markdown", + "id": "add-predicted-links-exec-desc", + "metadata": {}, + "source": [ + "#### Add Predicted Links (Conceptual) - Execution Example\n", + "\n", + "**Theory:**\n", + "This block provides a conceptual example. Since we haven't trained a full link prediction model, we create a dummy `conceptual_inferred_triples` list. If this list contained actual high-confidence predictions (e.g., from a TransE model scoring `(CompanyX, ex:potentialAcquirerOf, CompanyY)` highly), the `add_inferred_triples_to_graph` function would integrate them into our `kg`. In this demo, it will likely state that no triples were added unless you manually populate the dummy list." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "add-predicted-links-exec-code", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "No conceptual inferred triples generated to add in this demonstration.\n" + ] + } + ], + "source": [ + "# Conceptual: Assume we have some high-confidence predicted links from a separate model.\n", + "# For example, if entity1_uri_sim and entity2_uri_sim from the similarity check showed very high similarity,\n", + "# and we had a predicate like ex:isSemanticallySimilarTo, we might add it.\n", + "conceptual_inferred_triples_list = [] \n", + "\n", + "# Example: If we had variables entity1_uri_sim, entity2_uri_sim, and calculated_similarity from the previous step\n", + "# This is just to illustrate, these variables might not be in scope if that cell wasn't run or had no valid entities\n", + "SIMILARITY_THRESHOLD_FOR_INFERENCE = 0.85 # Example threshold\n", + "if 'entity1_uri_sim' in locals() and 'entity2_uri_sim' in locals() and 'calculated_similarity' in locals():\n", + " if entity1_uri_sim and entity2_uri_sim and calculated_similarity > SIMILARITY_THRESHOLD_FOR_INFERENCE:\n", + " print(f\"Conceptual inference: Entities '{kg.label(entity1_uri_sim)}' and '{kg.label(entity2_uri_sim)}' are highly similar ({calculated_similarity:.2f}).\")\n", + " # Let's define a conceptual predicate for this\n", + " EX.isHighlySimilarTo = EX[\"isHighlySimilarTo\"] # Define if not already\n", + " conceptual_inferred_triples_list.append((entity1_uri_sim, EX.isHighlySimilarTo, entity2_uri_sim))\n", + " # Symmetrical relationship (optional, depends on predicate definition)\n", + " # conceptual_inferred_triples_list.append((entity2_uri_sim, EX.isHighlySimilarTo, entity1_uri_sim))\n", + "\n", + "if conceptual_inferred_triples_list:\n", + " print(f\"\\nAttempting to add {len(conceptual_inferred_triples_list)} conceptual inferred triples...\")\n", + " kg, num_added = add_inferred_triples_to_graph(kg, conceptual_inferred_triples_list)\n", + " if num_added > 0:\n", + " print(f\"Total triples in graph after adding conceptual inferences: {len(kg)}\")\n", + "else:\n", + " print(\"\\nNo conceptual inferred triples generated to add in this demonstration.\")" + ] + }, + { + "cell_type": "markdown", + "id": "add-predicted-links-exec-output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "This block will indicate if any conceptual inferred triples were added to the graph. If the dummy example for high similarity was triggered, it will show that these triples were added and the new total triple count." + ] + }, + { + "cell_type": "markdown", + "id": "phase5", + "metadata": {}, + "source": [ + "## Phase 5: Persistence and Utilization\n", + "**(Ref: Ch. 3 – Data Storage; Ch. 5 – Querying and Access)**\n", + "\n", + "**Theory (Phase Overview):**\n", + "Once the Knowledge Graph is constructed (and potentially refined), it needs to be stored for long-term access and utilized to derive insights. This phase covers:\n", + "* **KG Storage:** Persisting the graph. Options include RDF serialization formats (like Turtle, RDF/XML), native triple stores (e.g., Fuseki, GraphDB), or graph databases (e.g., Neo4j, if modeled appropriately) (Ch. 3).\n", + "* **Querying and Analysis:** Using query languages like SPARQL (for RDF KGs) to retrieve specific information, answer complex questions, and perform analytical tasks (Ch. 5).\n", + "* **Visualization:** Presenting parts of the KG or query results graphically for better human interpretation and understanding (Ch. 1 & 3 - Value of Visualization in Big Data)." + ] + }, + { + "cell_type": "markdown", + "id": "step5-1-save-graph-func-def-desc", + "metadata": {}, + "source": [ + "### Step 5.1: Knowledge Graph Storage - Save Function Definition\n", + "**Task:** Persist the KG in a suitable format (e.g., RDF/Turtle).\n", + "\n", + "**Book Concept:** (Ch. 3 - Data Storage options)\n", + "Serializing the KG to a file allows for persistence, sharing, and loading into other RDF-compliant tools or triple stores.\n", + "\n", + "**Methodology:**\n", + "The `save_graph_to_turtle` function uses `rdflib.Graph.serialize()` method to save the `kg` object into a file. Turtle (`.ttl`) is chosen as it's a human-readable and common RDF serialization format." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "save_graph_to_turtle_func_def", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Function 'save_graph_to_turtle' defined.\n" + ] + } + ], + "source": [ + "def save_graph_to_turtle(graph_to_save, output_filepath=\"knowledge_graph.ttl\"):\n", + " \"\"\"Saves the RDF graph to a Turtle file.\"\"\"\n", + " if not len(graph_to_save):\n", + " print(\"Graph is empty. Nothing to save.\")\n", + " return False\n", + " try:\n", + " # Ensure the format string is correct, e.g., 'turtle', 'xml', 'n3', 'nt'\n", + " graph_to_save.serialize(destination=output_filepath, format='turtle')\n", + " print(f\"Knowledge Graph with {len(graph_to_save)} triples successfully saved to: {output_filepath}\")\n", + " return True\n", + " except Exception as e:\n", + " print(f\"Error saving graph to {output_filepath}: {e}\")\n", + " return False\n", + "\n", + "print(\"Function 'save_graph_to_turtle' defined.\")" + ] + }, + { + "cell_type": "markdown", + "id": "save_graph_to_turtle_func_def_output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "Confirms the definition of the `save_graph_to_turtle` function." + ] + }, + { + "cell_type": "markdown", + "id": "kg-storage-exec-desc", + "metadata": {}, + "source": [ + "#### Knowledge Graph Storage - Execution\n", + "\n", + "**Theory:**\n", + "This block calls the `save_graph_to_turtle` function to persist our constructed `kg` to a file named `tech_acquisitions_kg.ttl`. If the graph contains triples, it will be saved; otherwise, a message indicating an empty graph will be shown." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "kg-storage-exec-code", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Attempting to save the graph with 75 triples...\n", + "Knowledge Graph with 75 triples successfully saved to: tech_acquisitions_kg.ttl\n" + ] + } + ], + "source": [ + "KG_OUTPUT_FILENAME = \"tech_acquisitions_kg.ttl\"\n", + "if len(kg) > 0:\n", + " print(f\"Attempting to save the graph with {len(kg)} triples...\")\n", + " save_graph_to_turtle(kg, KG_OUTPUT_FILENAME)\n", + "else:\n", + " print(f\"Knowledge Graph ('kg') is empty. Skipping save to '{KG_OUTPUT_FILENAME}'.\")" + ] + }, + { + "cell_type": "markdown", + "id": "kg-storage-exec-output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "This block will print a confirmation message if the graph is successfully saved, including the file path and the number of triples saved. If the graph is empty, it will state that." + ] + }, + { + "cell_type": "markdown", + "id": "step5-2-sparql-func-def-desc", + "metadata": {}, + "source": [ + "### Step 5.2: Querying and Analysis - SPARQL Execution Function\n", + "**Task:** Execute SPARQL queries to extract insights.\n", + "\n", + "**Book Concept:** (Ch. 5 - Querying and Access, SPARQL)\n", + "SPARQL (SPARQL Protocol and RDF Query Language) is the standard query language for RDF Knowledge Graphs. It allows for pattern matching against the graph structure to retrieve data, infer new information (through more complex queries), and answer analytical questions.\n", + "\n", + "**Methodology:**\n", + "The `execute_sparql_query` function takes our `rdflib.Graph` and a SPARQL query string. It uses `graph.query()` to execute the query and then iterates through the results, printing them in a readable format. This function will be used to run several example queries." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "execute_sparql_query_func_def", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Function 'execute_sparql_query' defined.\n" + ] + } + ], + "source": [ + "def execute_sparql_query(graph_to_query, query_string_sparql):\n", + " \"\"\"Executes a SPARQL query on the graph and prints results, returning them as a list of dicts.\"\"\"\n", + " if not len(graph_to_query):\n", + " print(\"Cannot execute SPARQL query: The graph is empty.\")\n", + " return []\n", + " \n", + " print(f\"\\nExecuting SPARQL Query:\\n{query_string_sparql}\")\n", + " try:\n", + " query_results = graph_to_query.query(query_string_sparql)\n", + " except Exception as e:\n", + " print(f\"Error executing SPARQL query: {e}\")\n", + " return []\n", + "\n", + " if not query_results:\n", + " print(\"Query executed successfully but returned no results.\")\n", + " return []\n", + " \n", + " results_list_of_dicts = []\n", + " print(f\"Query Results ({len(query_results)} found): \")\n", + " for row_idx, row_data in enumerate(query_results):\n", + " # Convert row to a dictionary for easier access and printing\n", + " # row_data is a ResultRow object, access by variable name from SELECT clause\n", + " result_item_dict = {}\n", + " if hasattr(row_data, 'labels'): # rdflib 6.x+ provides .labels and .asdict()\n", + " result_item_dict = {str(label): str(value) for label, value in row_data.asdict().items()}\n", + " else: # Fallback for older rdflib or if .asdict() is not available\n", + " # This part might need adjustment based on the actual structure of row_data in older versions\n", + " # For now, we'll assume it's an iterable of values corresponding to SELECT variables\n", + " # This requires knowing the SELECT variables' order, which is less robust\n", + " # For simplicity, if .labels is not present, we just make a list of string values\n", + " result_item_dict = {f\"col_{j}\": str(item_val) for j, item_val in enumerate(row_data)}\n", + " \n", + " results_list_of_dicts.append(result_item_dict)\n", + " \n", + " # Print a sample of results\n", + " if row_idx < 10: # Print up to 10 results\n", + " print(f\" Row {row_idx+1}: {result_item_dict}\")\n", + " elif row_idx == 10:\n", + " print(f\" ... ( dalších {len(query_results) - 10} výsledků )\") # and more results in Czech, should be English\n", + " print(f\" ... (and {len(query_results) - 10} more results)\")\n", + " \n", + " return results_list_of_dicts\n", + "\n", + "print(\"Function 'execute_sparql_query' defined.\")" + ] + }, + { + "cell_type": "markdown", + "id": "execute_sparql_query_func_def_output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "Confirms the definition of the `execute_sparql_query` function." + ] + }, + { + "cell_type": "markdown", + "id": "sparql-querying-exec-desc", + "metadata": {}, + "source": [ + "#### SPARQL Querying and Analysis - Execution Examples\n", + "\n", + "**Theory:**\n", + "This block demonstrates the power of SPARQL by executing several example queries against our constructed KG (`kg`). Each query targets different aspects of the acquisition data:\n", + "* **Query 1: List Organizations:** Retrieves all entities explicitly typed as `schema:Organization` (or `ex:ORG`) and their labels. This is a basic check to see what organizations are in our KG.\n", + "* **Query 2: Find Acquisition Relationships:** Identifies pairs of companies where one acquired the other, based on our `ex:ACQUIRED` predicate. This directly extracts acquisition events.\n", + "* **Query 3: Find Acquisitions with Price:** Retrieves companies (or acquisition events) that have an associated `ex:HAS_PRICE` relationship pointing to a monetary value (`schema:PriceSpecification` or `ex:MONEY`).\n", + "The results of each query are printed, showcasing how structured queries can extract specific insights from the graph." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "sparql-querying-exec-code", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "--- Executing Sample SPARQL Queries ---\n", + "\n", + "Executing SPARQL Query:\n", + "\n", + " PREFIX ex: \n", + " PREFIX schema: \n", + " PREFIX rdfs: \n", + " \n", + " SELECT DISTINCT ?org_uri ?org_label\n", + " WHERE {\n", + " ?org_uri a schema:Organization ;\n", + " rdfs:label ?org_label .\n", + " }\n", + " ORDER BY ?org_label\n", + " LIMIT 10\n", + " \n", + "Query Results (7 found): \n", + " Row 1: {'org_uri': 'http://example.org/kg/Algeria_Press_Agency_ORG', 'org_label': 'Algeria Press Agency'}\n", + " Row 2: {'org_uri': 'http://example.org/kg/CNN_ORG', 'org_label': 'CNN'}\n", + " Row 3: {'org_uri': 'http://example.org/kg/GSPC_ORG', 'org_label': 'GSPC'}\n", + " Row 4: {'org_uri': 'http://example.org/kg/Salafist_Group_for_Preaching_and_Combat_ORG', 'org_label': 'Salafist Group for Preaching and Combat'}\n", + " Row 5: {'org_uri': 'http://example.org/kg/UN_High_Commissioner_for_Refugees_ORG', 'org_label': 'UN High Commissioner for Refugees'}\n", + " Row 6: {'org_uri': 'http://example.org/kg/United_Nations_ORG', 'org_label': 'United Nations'}\n", + " Row 7: {'org_uri': 'http://example.org/kg/al_Qaeda_ORG', 'org_label': 'al Qaeda'}\n", + "\n", + "Executing SPARQL Query:\n", + "\n", + " PREFIX ex: \n", + " PREFIX rdfs: \n", + " PREFIX schema: \n", + " \n", + " SELECT ?acquiredCompanyLabel ?acquiringCompanyLabel\n", + " WHERE {\n", + " ?acquiredCompany ex:ACQUIRED ?acquiringCompany .\n", + " ?acquiredCompany rdfs:label ?acquiredCompanyLabel .\n", + " ?acquiringCompany rdfs:label ?acquiringCompanyLabel .\n", + " # Ensure both are organizations\n", + " ?acquiredCompany a schema:Organization .\n", + " ?acquiringCompany a schema:Organization .\n", + " }\n", + " LIMIT 10\n", + " \n", + "Query executed successfully but returned no results.\n", + "\n", + "Executing SPARQL Query:\n", + "\n", + " PREFIX ex: \n", + " PREFIX rdfs: \n", + " PREFIX schema: \n", + " \n", + " SELECT ?companyLabel ?priceLabel ?dateLabel\n", + " WHERE {\n", + " ?company ex:HAS_PRICE ?priceEntity .\n", + " ?company rdfs:label ?companyLabel .\n", + " ?priceEntity rdfs:label ?priceLabel .\n", + " # Ensure ?company is an ORG and ?priceEntity is a PriceSpecification (MONEY)\n", + " ?company a schema:Organization .\n", + " ?priceEntity a schema:PriceSpecification .\n", + " \n", + " # Optionally, try to find a date associated with this acquisition event/company\n", + " OPTIONAL { \n", + " ?company ex:ANNOUNCED_ON ?dateEntity .\n", + " ?dateEntity rdfs:label ?dateLabelRaw .\n", + " # If dateEntity is schema:Date, its label might be the date string directly\n", + " # If dateEntity is an Event, it might have a schema:startDate or similar\n", + " BIND(COALESCE(?dateLabelRaw, STR(?dateEntity)) As ?dateLabel) \n", + " }\n", + " }\n", + " LIMIT 10\n", + " \n", + "Query executed successfully but returned no results.\n", + "\n", + "Executing SPARQL Query:\n", + "\n", + " PREFIX ex: \n", + " PREFIX rdfs: \n", + " PREFIX schema: \n", + " \n", + " SELECT ?acquiringCompanyLabel (COUNT(?acquiredCompany) AS ?numberOfAcquisitions)\n", + " WHERE {\n", + " ?acquiredCompany ex:ACQUIRED ?acquiringCompany .\n", + " ?acquiringCompany rdfs:label ?acquiringCompanyLabel .\n", + " ?acquiringCompany a schema:Organization .\n", + " ?acquiredCompany a schema:Organization .\n", + " }\n", + " GROUP BY ?acquiringCompanyLabel\n", + " ORDER BY DESC(?numberOfAcquisitions)\n", + " LIMIT 10\n", + " \n", + "Query Results (1 found): \n" + ] + } + ], + "source": [ + "if len(kg) > 0:\n", + " print(\"\\n--- Executing Sample SPARQL Queries ---\")\n", + " # Query 1: Find all organizations mentioned in the KG and their labels\n", + " sparql_query_1 = \"\"\"\n", + " PREFIX ex: \n", + " PREFIX schema: \n", + " PREFIX rdfs: \n", + " \n", + " SELECT DISTINCT ?org_uri ?org_label\n", + " WHERE {\n", + " ?org_uri a schema:Organization ;\n", + " rdfs:label ?org_label .\n", + " }\n", + " ORDER BY ?org_label\n", + " LIMIT 10\n", + " \"\"\"\n", + " query1_results = execute_sparql_query(kg, sparql_query_1)\n", + "\n", + " # Query 2: Find companies that acquired another company, and the acquired company\n", + " # Assumes: ?acquiredCompany ex:ACQUIRED ?acquiringCompany.\n", + " sparql_query_2 = \"\"\"\n", + " PREFIX ex: \n", + " PREFIX rdfs: \n", + " PREFIX schema: \n", + " \n", + " SELECT ?acquiredCompanyLabel ?acquiringCompanyLabel\n", + " WHERE {\n", + " ?acquiredCompany ex:ACQUIRED ?acquiringCompany .\n", + " ?acquiredCompany rdfs:label ?acquiredCompanyLabel .\n", + " ?acquiringCompany rdfs:label ?acquiringCompanyLabel .\n", + " # Ensure both are organizations\n", + " ?acquiredCompany a schema:Organization .\n", + " ?acquiringCompany a schema:Organization .\n", + " }\n", + " LIMIT 10\n", + " \"\"\"\n", + " query2_results = execute_sparql_query(kg, sparql_query_2)\n", + "\n", + " # Query 3: Find acquisitions (represented by a company involved) with a price mentioned\n", + " sparql_query_3 = \"\"\"\n", + " PREFIX ex: \n", + " PREFIX rdfs: \n", + " PREFIX schema: \n", + " \n", + " SELECT ?companyLabel ?priceLabel ?dateLabel\n", + " WHERE {\n", + " ?company ex:HAS_PRICE ?priceEntity .\n", + " ?company rdfs:label ?companyLabel .\n", + " ?priceEntity rdfs:label ?priceLabel .\n", + " # Ensure ?company is an ORG and ?priceEntity is a PriceSpecification (MONEY)\n", + " ?company a schema:Organization .\n", + " ?priceEntity a schema:PriceSpecification .\n", + " \n", + " # Optionally, try to find a date associated with this acquisition event/company\n", + " OPTIONAL { \n", + " ?company ex:ANNOUNCED_ON ?dateEntity .\n", + " ?dateEntity rdfs:label ?dateLabelRaw .\n", + " # If dateEntity is schema:Date, its label might be the date string directly\n", + " # If dateEntity is an Event, it might have a schema:startDate or similar\n", + " BIND(COALESCE(?dateLabelRaw, STR(?dateEntity)) As ?dateLabel) \n", + " }\n", + " }\n", + " LIMIT 10\n", + " \"\"\"\n", + " query3_results = execute_sparql_query(kg, sparql_query_3)\n", + " \n", + " # Query 4: Count number of acquisitions per acquiring company\n", + " sparql_query_4 = \"\"\"\n", + " PREFIX ex: \n", + " PREFIX rdfs: \n", + " PREFIX schema: \n", + " \n", + " SELECT ?acquiringCompanyLabel (COUNT(?acquiredCompany) AS ?numberOfAcquisitions)\n", + " WHERE {\n", + " ?acquiredCompany ex:ACQUIRED ?acquiringCompany .\n", + " ?acquiringCompany rdfs:label ?acquiringCompanyLabel .\n", + " ?acquiringCompany a schema:Organization .\n", + " ?acquiredCompany a schema:Organization .\n", + " }\n", + " GROUP BY ?acquiringCompanyLabel\n", + " ORDER BY DESC(?numberOfAcquisitions)\n", + " LIMIT 10\n", + " \"\"\"\n", + " query4_results = execute_sparql_query(kg, sparql_query_4)\n", + "\n", + "else:\n", + " print(\"Knowledge Graph ('kg') is empty. Skipping SPARQL query execution.\")" + ] + }, + { + "cell_type": "markdown", + "id": "sparql-querying-exec-output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "This block will print:\n", + "* Each SPARQL query string.\n", + "* The results (up to a limit) for each query, typically as a list of dictionaries where keys are the `SELECT` variables.\n", + "If the KG is empty, it will indicate that queries are skipped." + ] + }, + { + "cell_type": "markdown", + "id": "step5-3-viz-func-def-desc", + "metadata": {}, + "source": [ + "### Step 5.3: Visualization (Optional) - Visualization Function Definition\n", + "**Task:** Visualize parts of the KG or results from queries for better interpretability.\n", + "\n", + "**Book Concept:** (Ch. 1 & 3 - Visualization in Big Data)\n", + "Visualizing graph structures can make complex relationships much easier to understand for humans. Interactive visualizations allow for exploration and discovery.\n", + "\n", + "**Methodology:**\n", + "The `visualize_subgraph_pyvis` function uses the `pyvis` library to create an interactive HTML-based network visualization. It:\n", + "* Takes the `rdflib.Graph` and an optional filename.\n", + " * (A more advanced version could take a central node URI and depth to explore from that node).\n", + "* For simplicity in this demo, it visualizes a sample of triples from the graph.\n", + "* Adds nodes and edges to a `pyvis.Network` object.\n", + "* Nodes are labeled with their `rdfs:label` (or a part of their URI if no label).\n", + "* Edges are labeled with the predicate name.\n", + "* Saves the visualization to an HTML file and attempts to display it inline if in a Jupyter environment." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "visualize_subgraph_pyvis_func_def", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Function 'visualize_subgraph_pyvis' defined.\n" + ] + } + ], + "source": [ + "def visualize_subgraph_pyvis(graph_to_viz, output_filename=\"kg_visualization.html\", sample_size_triples=75):\n", + " \"\"\"Visualizes a sample subgraph using pyvis and saves to HTML.\"\"\"\n", + " if not len(graph_to_viz):\n", + " print(\"Graph is empty, nothing to visualize.\")\n", + " return None\n", + "\n", + " net = Network(notebook=True, height=\"800px\", width=\"100%\", cdn_resources='remote', directed=True)\n", + " net.repulsion(node_distance=150, spring_length=200)\n", + " # net.show_buttons(filter_=['physics', 'nodes', 'edges', 'interaction'])\n", + " net.set_options(\"\"\"\n", + " var options = {\n", + " \"physics\": {\n", + " \"forceAtlas2Based\": {\n", + " \"gravitationalConstant\": -50,\n", + " \"centralGravity\": 0.01,\n", + " \"springLength\": 100,\n", + " \"springConstant\": 0.08,\n", + " \"damping\": 0.4,\n", + " \"avoidOverlap\": 0.5\n", + " },\n", + " \"maxVelocity\": 50,\n", + " \"minVelocity\": 0.1,\n", + " \"solver\": \"forceAtlas2Based\",\n", + " \"timestep\": 0.5,\n", + " \"stabilization\": {\"iterations\": 150}\n", + " }\n", + " }\n", + " \"\"\")\n", + "\n", + " added_nodes_set = set()\n", + " \n", + " # For a more meaningful visualization, focus on triples where subject and object are resources (URIs)\n", + " # And try to get a sample that includes some structure, not just attribute assignments to single nodes.\n", + " # Here, we'll take a sample of all triples for simplicity.\n", + " triples_for_visualization = list(graph_to_viz)[:min(sample_size_triples, len(graph_to_viz))]\n", + " \n", + " if not triples_for_visualization:\n", + " print(\"No triples selected from the sample for visualization.\")\n", + " return None\n", + " \n", + " print(f\"Preparing visualization for {len(triples_for_visualization)} sample triples...\")\n", + "\n", + " for s_uri, p_uri, o_val in tqdm(triples_for_visualization, desc=\"Building Pyvis Visualization\"):\n", + " # Get labels or use URI parts\n", + " s_label_str = str(graph_to_viz.value(subject=s_uri, predicate=RDFS.label, default=s_uri.split('/')[-1].split('#')[-1]))\n", + " p_label_str = str(p_uri.split('/')[-1].split('#')[-1])\n", + " \n", + " s_node_id = str(s_uri)\n", + " s_node_title = f\"{s_label_str}\\nURI: {s_uri}\"\n", + " s_node_group_uri = graph_to_viz.value(s_uri, RDF.type)\n", + " s_node_group = str(s_node_group_uri.split('/')[-1].split('#')[-1]) if s_node_group_uri else \"UnknownType\"\n", + "\n", + "\n", + " if s_uri not in added_nodes_set:\n", + " net.add_node(s_node_id, label=s_label_str, title=s_node_title, group=s_node_group)\n", + " added_nodes_set.add(s_uri)\n", + " \n", + " if isinstance(o_val, URIRef): # If object is a resource, add it as a node and draw an edge\n", + " o_label_str = str(graph_to_viz.value(subject=o_val, predicate=RDFS.label, default=o_val.split('/')[-1].split('#')[-1]))\n", + " o_node_id = str(o_val)\n", + " o_node_title = f\"{o_label_str}\\nURI: {o_val}\"\n", + " o_node_group_uri = graph_to_viz.value(o_val, RDF.type)\n", + " o_node_group = str(o_node_group_uri.split('/')[-1].split('#')[-1]) if o_node_group_uri else \"UnknownType\"\n", + " \n", + " if o_val not in added_nodes_set:\n", + " net.add_node(o_node_id, label=o_label_str, title=o_node_title, group=o_node_group)\n", + " added_nodes_set.add(o_val)\n", + " net.add_edge(s_node_id, o_node_id, title=p_label_str, label=p_label_str)\n", + " else: # If object is a literal, add it as a property to the subject node's title (tooltip)\n", + " # This avoids cluttering the graph with many literal nodes.\n", + " # Update subject node's title if it's already added\n", + " for node_obj in net.nodes:\n", + " if node_obj['id'] == s_node_id:\n", + " node_obj['title'] += f\"\\n{p_label_str}: {str(o_val)}\"\n", + " break\n", + " \n", + " try:\n", + " net.save_graph(output_filename)\n", + " print(f\"Interactive KG visualization saved to HTML file: {output_filename}\")\n", + " # In Jupyter Lab/Notebook, the graph should render inline if notebook=True was set and environment supports it.\n", + " # Sometimes, an explicit display is needed, or opening the HTML file manually.\n", + " except Exception as e:\n", + " print(f\"Error saving or attempting to show graph visualization: {e}\")\n", + " return net # Return the network object\n", + "\n", + "print(\"Function 'visualize_subgraph_pyvis' defined.\")" + ] + }, + { + "cell_type": "markdown", + "id": "visualize_subgraph_pyvis_func_def_output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "Confirms the definition of the `visualize_subgraph_pyvis` function." + ] + }, + { + "cell_type": "markdown", + "id": "visualization-exec-desc", + "metadata": {}, + "source": [ + "#### KG Visualization - Execution\n", + "\n", + "**Theory:**\n", + "This block calls `visualize_subgraph_pyvis` with our `kg`. It will generate an HTML file (e.g., `tech_acquisitions_kg_viz.html`) containing the interactive graph. If running in a compatible Jupyter environment, the visualization might also render directly in the notebook output. This allows for a visual exploration of the connections and entities within a sample of our KG." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "visualization-exec-code", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Attempting to visualize a sample of the graph with 75 triples...\n", + "Preparing visualization for 75 sample triples...\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "372adb1f2db1432cbc080375a0760437", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Building Pyvis Visualization: 0%| | 0/75 [00:00 0:\n", + " print(f\"Attempting to visualize a sample of the graph with {len(kg)} triples...\")\n", + " # Visualize a sample of up to 75 triples from the graph\n", + " pyvis_network_object = visualize_subgraph_pyvis(kg, output_filename=VIZ_OUTPUT_FILENAME, sample_size_triples=75)\n", + "else:\n", + " print(f\"Knowledge Graph ('kg') is empty. Skipping visualization.\")\n", + "\n", + "# Attempt to display inline in Jupyter (might require trusting the notebook or specific Jupyter setup)\n", + "if pyvis_network_object is not None:\n", + " try:\n", + " # This should trigger inline display in classic notebook or if properly configured in Lab\n", + " from IPython.display import HTML, display\n", + " # display(HTML(VIZ_OUTPUT_FILENAME)) # This loads from file, pyvis might render directly\n", + " # pyvis_network_object.show(VIZ_OUTPUT_FILENAME) # Alternative: opens in new tab/tries inline\n", + " print(f\"\\nTo view the visualization, open the file '{VIZ_OUTPUT_FILENAME}' in a web browser.\")\n", + " print(\"If in a Jupyter Notebook/Lab, the graph might also be rendered above this message.\")\n", + " # If pyvis_network_object is returned from a cell and notebook=True, it often renders automatically.\n", + " except Exception as e_display:\n", + " print(f\"Could not automatically display visualization inline ({e_display}). Please open '{VIZ_OUTPUT_FILENAME}' manually.\")\n", + " \n", + "# This cell will return the pyvis_network_object. If it's the last statement and notebook=True, \n", + "# Jupyter will attempt to render it.\n", + "if pyvis_network_object:\n", + " pyvis_network_object # This line is crucial for auto-display in some Jupyter environments" + ] + }, + { + "cell_type": "markdown", + "id": "visualization-exec-output", + "metadata": {}, + "source": [ + "**Output Explanation:**\n", + "This block will:\n", + "* Generate an HTML file (e.g., `tech_acquisitions_kg_interactive_viz.html`) with the interactive graph visualization.\n", + "* Print a message confirming the save and provide the filename.\n", + "* If in a compatible Jupyter environment, it might also render the graph directly below the cell. Otherwise, you'll need to open the HTML file manually in a browser." + ] + }, + { + "cell_type": "markdown", + "id": "conclusion", + "metadata": {}, + "source": [ + "## Conclusion and Future Work\n", + "\n", + "This notebook has demonstrated a comprehensive, albeit simplified, end-to-end pipeline for constructing a Knowledge Graph from unstructured news articles, with a focus on technology company acquisitions. We navigated through critical phases, referencing conceptual underpinnings from Big Data and Knowledge Graph literature:\n", + "\n", + "1. **Data Acquisition and Preparation:** We loaded articles from the CNN/DailyMail dataset and performed essential cleaning to prepare the text for analysis. This underscored the importance of data quality as a foundation (Ch. 1, Ch. 3).\n", + "2. **Information Extraction:** \n", + " * Named Entity Recognition (NER) was performed first exploratively with spaCy, then more targetedly using an LLM guided by a refined entity schema. This created the *nodes* of our graph (Ch. 2).\n", + " * Relationship Extraction (RE) using an LLM identified semantic connections between these entities, forming the *edges* (Ch. 2).\n", + "3. **Knowledge Graph Construction:** \n", + " * Entities were normalized for consistency, and unique URIs were generated, aiding in entity resolution (Ch. 6, Ch. 8).\n", + " * Extracted information was mapped to a schema (mixing custom `EX:` terms and `schema.org` terms) and materialized into RDF triples using `rdflib` (Ch. 2, Ch. 4).\n", + "4. **Knowledge Graph Refinement (Conceptual):** \n", + " * We generated text embeddings for entity names, bridging symbolic and sub-symbolic representations (Ch. 6).\n", + " * The concept of link prediction via semantic similarity was introduced, hinting at KG enrichment capabilities (Ch. 6).\n", + "5. **Persistence and Utilization:** \n", + " * The KG was persisted by serializing it to a Turtle file (Ch. 3).\n", + " * SPARQL queries were executed to retrieve structured insights, demonstrating the analytical power of KGs (Ch. 5).\n", + " * A sample subgraph was visualized, highlighting the importance of making KGs accessible (Ch. 1, Ch. 3).\n", + "\n", + "### Potential Future Enhancements:\n", + "* **Advanced Entity Disambiguation & Linking (EDL):** Implement robust EDL to link extracted entities to canonical entries in external KGs like Wikidata or DBpedia. This would greatly improve graph integration and consistency.\n", + "* **Richer Ontology/Schema:** Develop a more detailed custom ontology for technology acquisitions or align more comprehensively with existing financial or business ontologies (e.g., FIBO).\n", + "* **Sophisticated Relationship Extraction:** Explore more advanced RE techniques, including classifying a wider range of relation types, handling n-ary relations, and event extraction (modeling acquisitions as complex events with multiple participants and attributes).\n", + "* **Knowledge Graph Embedding Models:** Train dedicated KGE models (e.g., TransE, ComplEx, RotatE from Ch. 6) on the generated triples for more accurate link prediction and KG completion.\n", + "* **Reasoning and Inference:** Implement ontological reasoning (e.g., using RDFS/OWL reasoners) to infer new facts based on the schema and asserted triples.\n", + "* **Scalability and Performance:** For larger datasets, utilize distributed processing frameworks (like Apache Spark, conceptually linked to SANSA in Ch. 7 for ML on KGs) and deploy the KG in a scalable graph database or triple store.\n", + "* **LLM Fine-tuning:** Fine-tune smaller, open-source LLMs specifically on NER and RE tasks for the technology/financial domain to potentially achieve better performance and cost-efficiency than general-purpose models for these specific tasks.\n", + "* **Temporal Dynamics:** Incorporate the temporal aspect of news data more explicitly, tracking how information and relationships evolve over time.\n", + "* **User Interface:** Develop a user-friendly interface for exploring, querying, and visualizing the KG beyond programmatic access.\n", + "\n", + "This project serves as a foundational example, illustrating how modern NLP techniques, particularly LLMs, can be integrated with traditional KG methodologies to extract and structure valuable knowledge from vast amounts of unstructured text." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv-big-data", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 5b6b9c0f079d23b555178ac0f78761782a5da1dd Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Mon, 12 May 2025 16:05:26 +0500 Subject: [PATCH 27/32] Updating DOC --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 85dc92b..6d4243e 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ This repository takes a clear, hands-on approach to **Retrieval-Augmented Genera The goal is simple: provide code that is readable, modifiable, and educational. By focusing on the fundamentals, this project helps demystify RAG and makes it easier to understand how it really works. ## Update: 📢 +- (12-May-2025) Added a new notebook on how to handle big data using Knowledge Graphs. - (27-April-2025) Added a new notebook which finds best RAG technique for a given query (Simple RAG + Reranker + Query Rewrite). - (20-Mar-2025) Added a new notebook on RAG with Reinforcement Learning. - (07-Mar-2025) Added 20 RAG techniques to the repository. @@ -47,6 +48,7 @@ Here's a glimpse of the techniques covered: | [20. CRAG](20_crag.ipynb) | Corrective RAG: Dynamically evaluates retrieval quality and uses web search as a fallback. | | [21. Rag with RL](21_rag_with_rl.ipynb) | Maximize the reward of the RAG model using Reinforcement Learning. | | [Best RAG Finder](best_rag_finder.ipynb) | Finds the best RAG technique for a given query using Simple RAG + Reranker + Query Rewrite. | +| [22. Big Data with Knowledge Graphs](22_big_data_with_KG.ipynb) | Handles large datasets using Knowledge Graphs. | ## 🗂️ Repository Structure @@ -74,6 +76,7 @@ fareedkhan-dev-all-rag-techniques/ ├── 19_HyDE_rag.ipynb ├── 20_crag.ipynb ├── 21_rag_with_rl.ipynb +├── 22_big_data_with_KG.ipynb ├── best_rag_finder.ipynb ├── requirements.txt <- Python dependencies └── data/ From 971e85d9f6259b81f816f4da4df62910d3acb9ed Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Mon, 12 May 2025 16:10:03 +0500 Subject: [PATCH 28/32] Fix naming --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6d4243e..1d93da2 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ Here's a glimpse of the techniques covered: | [20. CRAG](20_crag.ipynb) | Corrective RAG: Dynamically evaluates retrieval quality and uses web search as a fallback. | | [21. Rag with RL](21_rag_with_rl.ipynb) | Maximize the reward of the RAG model using Reinforcement Learning. | | [Best RAG Finder](best_rag_finder.ipynb) | Finds the best RAG technique for a given query using Simple RAG + Reranker + Query Rewrite. | -| [22. Big Data with Knowledge Graphs](22_big_data_with_KG.ipynb) | Handles large datasets using Knowledge Graphs. | +| [22. Big Data with Knowledge Graphs](22_Big_data_with_KG.ipynb) | Handles large datasets using Knowledge Graphs. | ## 🗂️ Repository Structure From 00d1c49c9cc84e284c704eff90cfd641ef8361f7 Mon Sep 17 00:00:00 2001 From: FareedKhan-dev Date: Mon, 12 May 2025 16:11:06 +0500 Subject: [PATCH 29/32] Updated Dependencies --- requirements.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index a533f79..15c2000 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,4 +10,10 @@ tqdm Pillow faiss-cpu pandas -ipywidgets \ No newline at end of file +ipywidgets +rdflib +spacy +pyvis +datasets +transformers +accelerate \ No newline at end of file From e5232c7141ec4eb3982bea5f324058a0f1049aa3 Mon Sep 17 00:00:00 2001 From: yihong0618 Date: Mon, 9 Jun 2025 16:27:38 +0800 Subject: [PATCH 30/32] fix: better file name to show in GitHub Signed-off-by: yihong0618 --- 1_simple_rag.ipynb => 01_simple_rag.ipynb | 0 2_semantic_chunking.ipynb => 02_semantic_chunking.ipynb | 0 3_chunk_size_selector.ipynb => 03_chunk_size_selector.ipynb | 0 4_context_enriched_rag.ipynb => 04_context_enriched_rag.ipynb | 0 ...unk_headers_rag.ipynb => 05_contextual_chunk_headers_rag.ipynb | 0 6_doc_augmentation_rag.ipynb => 06_doc_augmentation_rag.ipynb | 0 7_query_transform.ipynb => 07_query_transform.ipynb | 0 8_reranker.ipynb => 08_reranker.ipynb | 0 9_rse.ipynb => 09_rse.ipynb | 0 9 files changed, 0 insertions(+), 0 deletions(-) rename 1_simple_rag.ipynb => 01_simple_rag.ipynb (100%) rename 2_semantic_chunking.ipynb => 02_semantic_chunking.ipynb (100%) rename 3_chunk_size_selector.ipynb => 03_chunk_size_selector.ipynb (100%) rename 4_context_enriched_rag.ipynb => 04_context_enriched_rag.ipynb (100%) rename 5_contextual_chunk_headers_rag.ipynb => 05_contextual_chunk_headers_rag.ipynb (100%) rename 6_doc_augmentation_rag.ipynb => 06_doc_augmentation_rag.ipynb (100%) rename 7_query_transform.ipynb => 07_query_transform.ipynb (100%) rename 8_reranker.ipynb => 08_reranker.ipynb (100%) rename 9_rse.ipynb => 09_rse.ipynb (100%) diff --git a/1_simple_rag.ipynb b/01_simple_rag.ipynb similarity index 100% rename from 1_simple_rag.ipynb rename to 01_simple_rag.ipynb diff --git a/2_semantic_chunking.ipynb b/02_semantic_chunking.ipynb similarity index 100% rename from 2_semantic_chunking.ipynb rename to 02_semantic_chunking.ipynb diff --git a/3_chunk_size_selector.ipynb b/03_chunk_size_selector.ipynb similarity index 100% rename from 3_chunk_size_selector.ipynb rename to 03_chunk_size_selector.ipynb diff --git a/4_context_enriched_rag.ipynb b/04_context_enriched_rag.ipynb similarity index 100% rename from 4_context_enriched_rag.ipynb rename to 04_context_enriched_rag.ipynb diff --git a/5_contextual_chunk_headers_rag.ipynb b/05_contextual_chunk_headers_rag.ipynb similarity index 100% rename from 5_contextual_chunk_headers_rag.ipynb rename to 05_contextual_chunk_headers_rag.ipynb diff --git a/6_doc_augmentation_rag.ipynb b/06_doc_augmentation_rag.ipynb similarity index 100% rename from 6_doc_augmentation_rag.ipynb rename to 06_doc_augmentation_rag.ipynb diff --git a/7_query_transform.ipynb b/07_query_transform.ipynb similarity index 100% rename from 7_query_transform.ipynb rename to 07_query_transform.ipynb diff --git a/8_reranker.ipynb b/08_reranker.ipynb similarity index 100% rename from 8_reranker.ipynb rename to 08_reranker.ipynb diff --git a/9_rse.ipynb b/09_rse.ipynb similarity index 100% rename from 9_rse.ipynb rename to 09_rse.ipynb From 440feb2093701ab60eef9e1ef2915c84484f51aa Mon Sep 17 00:00:00 2001 From: yihong0618 Date: Mon, 9 Jun 2025 16:32:03 +0800 Subject: [PATCH 31/32] doc: fix doc lint and format the md Signed-off-by: yihong0618 --- README.md | 79 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 42 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 1d93da2..e60a7d0 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ This repository takes a clear, hands-on approach to **Retrieval-Augmented Genera The goal is simple: provide code that is readable, modifiable, and educational. By focusing on the fundamentals, this project helps demystify RAG and makes it easier to understand how it really works. ## Update: 📢 + - (12-May-2025) Added a new notebook on how to handle big data using Knowledge Graphs. - (27-April-2025) Added a new notebook which finds best RAG technique for a given query (Simple RAG + Reranker + Query Rewrite). - (20-Mar-2025) Added a new notebook on RAG with Reinforcement Learning. @@ -16,25 +17,25 @@ The goal is simple: provide code that is readable, modifiable, and educational. This repository contains a collection of Jupyter Notebooks, each focusing on a specific RAG technique. Each notebook provides: -* A concise explanation of the technique. -* A step-by-step implementation from scratch. -* Clear code examples with inline comments. -* Evaluations and comparisons to demonstrate the technique's effectiveness. -* Visualization to visualize the results. +- A concise explanation of the technique. +- A step-by-step implementation from scratch. +- Clear code examples with inline comments. +- Evaluations and comparisons to demonstrate the technique's effectiveness. +- Visualization to visualize the results. Here's a glimpse of the techniques covered: | Notebook | Description | | :-------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| [1. Simple RAG](1_simple_rag.ipynb) | A basic RAG implementation. A great starting point! | -| [2. Semantic Chunking](2_semantic_chunking.ipynb) | Splits text based on semantic similarity for more meaningful chunks. | -| [3. Chunk Size Selector](3_chunk_size_selector.ipynb) | Explores the impact of different chunk sizes on retrieval performance. | -| [4. Context Enriched RAG](4_context_enriched_rag.ipynb) | Retrieves neighboring chunks to provide more context. | -| [5. Contextual Chunk Headers](5_contextual_chunk_headers_rag.ipynb) | Prepends descriptive headers to each chunk before embedding. | -| [6. Document Augmentation RAG](6_doc_augmentation_rag.ipynb) | Generates questions from text chunks to augment the retrieval process. | -| [7. Query Transform](7_query_transform.ipynb) | Rewrites, expands, or decomposes queries to improve retrieval. Includes **Step-back Prompting** and **Sub-query Decomposition**. | -| [8. Reranker](8_reranker.ipynb) | Re-ranks initially retrieved results using an LLM for better relevance. | -| [9. RSE](9_rse.ipynb) | Relevant Segment Extraction: Identifies and reconstructs continuous segments of text, preserving context. | +| [1. Simple RAG](01_simple_rag.ipynb) | A basic RAG implementation. A great starting point! | +| [2. Semantic Chunking](02_semantic_chunking.ipynb) | Splits text based on semantic similarity for more meaningful chunks. | +| [3. Chunk Size Selector](03_chunk_size_selector.ipynb) | Explores the impact of different chunk sizes on retrieval performance. | +| [4. Context Enriched RAG](04_context_enriched_rag.ipynb) | Retrieves neighboring chunks to provide more context. | +| [5. Contextual Chunk Headers](05_contextual_chunk_headers_rag.ipynb) | Prepends descriptive headers to each chunk before embedding. | +| [6. Document Augmentation RAG](06_doc_augmentation_rag.ipynb) | Generates questions from text chunks to augment the retrieval process. | +| [7. Query Transform](07_query_transform.ipynb) | Rewrites, expands, or decomposes queries to improve retrieval. Includes **Step-back Prompting** and **Sub-query Decomposition**. | +| [8. Reranker](08_reranker.ipynb) | Re-ranks initially retrieved results using an LLM for better relevance. | +| [9. RSE](09_rse.ipynb) | Relevant Segment Extraction: Identifies and reconstructs continuous segments of text, preserving context. | | [10. Contextual Compression](10_contextual_compression.ipynb) | Implements contextual compression to filter and compress retrieved chunks, maximizing relevant information. | | [11. Feedback Loop RAG](11_feedback_loop_rag.ipynb) | Incorporates user feedback to learn and improve RAG system over time. | | [12. Adaptive RAG](12_adaptive_rag.ipynb) | Dynamically selects the best retrieval strategy based on query type. | @@ -55,15 +56,15 @@ Here's a glimpse of the techniques covered: ``` fareedkhan-dev-all-rag-techniques/ ├── README.md <- You are here! -├── 1_simple_rag.ipynb -├── 2_semantic_chunking.ipynb -├── 3_chunk_size_selector.ipynb -├── 4_context_enriched_rag.ipynb -├── 5_contextual_chunk_headers_rag.ipynb -├── 6_doc_augmentation_rag.ipynb -├── 7_query_transform.ipynb -├── 8_reranker.ipynb -├── 9_rse.ipynb +├── 01_simple_rag.ipynb +├── 02_semantic_chunking.ipynb +├── 03_chunk_size_selector.ipynb +├── 04_context_enriched_rag.ipynb +├── 05_contextual_chunk_headers_rag.ipynb +├── 06_doc_augmentation_rag.ipynb +├── 07_query_transform.ipynb +├── 08_reranker.ipynb +├── 09_rse.ipynb ├── 10_contextual_compression.ipynb ├── 11_feedback_loop_rag.ipynb ├── 12_adaptive_rag.ipynb @@ -87,30 +88,34 @@ fareedkhan-dev-all-rag-techniques/ ## 🛠️ Getting Started -1. **Clone the repository:** +1. **Clone the repository:** ```bash git clone https://github.com/FareedKhan-dev/all-rag-techniques.git cd all-rag-techniques ``` -2. **Install dependencies:** +2. **Install dependencies:** ```bash pip install -r requirements.txt ``` -3. **Set up your OpenAI API key:** +3. **Set up your OpenAI API key:** + + - Obtain an API key from [Nebius AI](https://studio.nebius.com/). + - Set the API key as an environment variable: - * Obtain an API key from [Nebius AI](https://studio.nebius.com/). - * Set the API key as an environment variable: ```bash export OPENAI_API_KEY='YOUR_NEBIUS_AI_API_KEY' ``` + or + ```bash setx OPENAI_API_KEY "YOUR_NEBIUS_AI_API_KEY" # On Windows ``` + or, within your Python script/notebook: ```python @@ -118,7 +123,7 @@ fareedkhan-dev-all-rag-techniques/ os.environ["OPENAI_API_KEY"] = "YOUR_NEBIUS_AI_API_KEY" ``` -4. **Run the notebooks:** +4. **Run the notebooks:** Open any of the Jupyter Notebooks (`.ipynb` files) using Jupyter Notebook or JupyterLab. Each notebook is self-contained and can be run independently. The notebooks are designed to be executed sequentially within each file. @@ -127,20 +132,20 @@ fareedkhan-dev-all-rag-techniques/ ## 💡 Core Concepts -* **Embeddings:** Numerical representations of text that capture semantic meaning. We use Nebius AI's embedding API and, in many notebooks, also the `BAAI/bge-en-icl` embedding model. +- **Embeddings:** Numerical representations of text that capture semantic meaning. We use Nebius AI's embedding API and, in many notebooks, also the `BAAI/bge-en-icl` embedding model. -* **Vector Store:** A simple database to store and search embeddings. We create our own `SimpleVectorStore` class using NumPy for efficient similarity calculations. +- **Vector Store:** A simple database to store and search embeddings. We create our own `SimpleVectorStore` class using NumPy for efficient similarity calculations. -* **Cosine Similarity:** A measure of similarity between two vectors. Higher values indicate greater similarity. +- **Cosine Similarity:** A measure of similarity between two vectors. Higher values indicate greater similarity. -* **Chunking:** Dividing text into smaller, manageable pieces. We explore various chunking strategies. +- **Chunking:** Dividing text into smaller, manageable pieces. We explore various chunking strategies. -* **Retrieval:** The process of finding the most relevant text chunks for a given query. +- **Retrieval:** The process of finding the most relevant text chunks for a given query. -* **Generation:** Using a Large Language Model (LLM) to create a response based on the retrieved context and the user's query. We use the `meta-llama/Llama-3.2-3B-Instruct` model via Nebius AI's API. +- **Generation:** Using a Large Language Model (LLM) to create a response based on the retrieved context and the user's query. We use the `meta-llama/Llama-3.2-3B-Instruct` model via Nebius AI's API. -* **Evaluation:** Assessing the quality of the RAG system's responses, often by comparing them to a reference answer or using an LLM to score relevance. +- **Evaluation:** Assessing the quality of the RAG system's responses, often by comparing them to a reference answer or using an LLM to score relevance. ## 🤝 Contributing -Contributions are welcome! \ No newline at end of file +Contributions are welcome! From 2ea02fc1a94cb925470b0bee44affb983e71c8b1 Mon Sep 17 00:00:00 2001 From: cyphercircle Date: Thu, 30 Oct 2025 00:35:11 +0100 Subject: [PATCH 32/32] Create main.yml Sth later --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/workflows/main.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1 @@ +