main 59e7a0a31b08 cached
86 files
3.0 MB
781.8k tokens
11 symbols
1 requests
Download .txt
Showing preview only (3,127K chars total). Download the full file or copy to clipboard to get everything.
Repository: sunnysavita10/Generative-AI-Indepth-Basic-to-Advance
Branch: main
Commit: 59e7a0a31b08
Files: 86
Total size: 3.0 MB

Directory structure:
gitextract_kzntgr93/

├── Access_APIs_Using_Langchain/
│   ├── LangChain_Complete_Course.ipynb
│   └── requirements.txt
├── Advance RAG Hybrid Search/
│   └── Hybrid_Search_in_RAG.ipynb
├── Advance RAG Reranking from Scratch/
│   └── Reranking_from_Scratch.ipynb
├── Advance RAG with Hybrid Search and Reranker/
│   └── Hybrid_Search_and_reranking_in_RAG.ipynb
├── Chat with Multiple Doc using Astradb and Langchain/
│   └── Chat_With_Multiple_Doc(pdfs,_docs,_txt,_pptx)_using_AstraDB_and_Langchain.ipynb
├── Child_to_Parent_Retrieval.ipynb
├── ConversationEntityMemory.ipynb
├── Conversational_Summary_Memory.ipynb
├── FlashRerankPractical.ipynb
├── Generative AI Dataset/
│   ├── llama3.txt
│   └── state_of_the_union.txt
├── Generative AI Interview Questions/
│   └── Generative_AI_Interview_Questions.docx
├── Google Gemini API with Python/
│   └── GeminiAPI_With_Python.ipynb
├── LCEL(Langchain_Expression_Language).ipynb
├── Langchain_memory_classes.ipynb
├── MergerRetriever_and_LongContextReorder.ipynb
├── MongoDB with Pinecone/
│   ├── Mongodb_with_Pinecone_Realtime_RAG_Pipeline_yt.ipynb
│   └── Mongodb_with_Pinecone_Realtime_RAG_Pipeline_yt_Part2.ipynb
├── MultiModal RAG/
│   ├── Extract_Image,Table,Text_from_Document_MultiModal_Summrizer_AAG_App_YT.ipynb
│   ├── Extract_Image,Table,Text_from_Document_MultiModal_Summrizer_RAG_App.ipynb
│   ├── MultiModal RAG using Vertex AI AstraDB(Cassandra) & Langchain.ipynb
│   ├── MultiModal_RAG_with_llamaIndex_and_LanceDB.ipynb
│   └── Multimodal_RAG_with_Gemini_Langchain_and_Google_AI_Studio_Yt.ipynb
├── MultiModal RAG with Vertex AI/
│   └── MultiModal RAG using Vertex AI AstraDB(Cassandra) & Langchain.ipynb
├── Multilingual AI based Voice Assistant/
│   ├── .gitignore
│   ├── README.md
│   ├── app.py
│   ├── genai_AI_Project.egg-info/
│   │   ├── PKG-INFO
│   │   ├── SOURCES.txt
│   │   ├── dependency_links.txt
│   │   └── top_level.txt
│   ├── multilingual_assistant.egg-info/
│   │   ├── PKG-INFO
│   │   ├── SOURCES.txt
│   │   ├── dependency_links.txt
│   │   ├── requires.txt
│   │   └── top_level.txt
│   ├── requirements.txt
│   ├── research/
│   │   └── trials.ipynb
│   ├── setup.py
│   ├── src/
│   │   ├── __init__.py
│   │   └── helper.py
│   └── template.py
├── QA_With_Doc_Using_LlamaIndex_Gemini/
│   ├── Data/
│   │   └── MLDOC.txt
│   ├── Exception.py
│   ├── Experiments/
│   │   ├── ChatWithDoc.ipynb
│   │   └── storage/
│   │       ├── default__vector_store.json
│   │       ├── docstore.json
│   │       ├── graph_store.json
│   │       ├── image__vector_store.json
│   │       └── index_store.json
│   ├── Logger.py
│   ├── QAWithPDF/
│   │   ├── __init__.py
│   │   ├── data_ingestion.py
│   │   ├── embeddings.py
│   │   └── model_api.py
│   ├── StreamlitApp.py
│   ├── Template.py
│   ├── logs/
│   │   ├── 02_15_2024_16_21_43.log
│   │   ├── 02_15_2024_16_22_49.log
│   │   ├── 02_15_2024_16_23_52.log
│   │   ├── 02_15_2024_16_26_42.log
│   │   ├── 02_15_2024_16_27_41.log
│   │   ├── 02_15_2024_16_45_53.log
│   │   └── 02_15_2024_16_58_10.log
│   ├── requirements.txt
│   ├── setup.py
│   └── storage/
│       ├── default__vector_store.json
│       ├── docstore.json
│       ├── graph_store.json
│       ├── image__vector_store.json
│       └── index_store.json
├── RAG App using Haystack & OpenAI/
│   └── RAG_Application_Using_Haystack_and_OpenAI.ipynb
├── RAG App using LLAMAINDEX & MistralAI/
│   └── RAG_Application_Using_LlamaIndex_and_Mistral_AI.ipynb
├── RAG App using Langchain Mistral Weaviate/
│   └── RAG_Application_Using_LangChain_Mistral_and_Weviate.ipynb
├── RAG App using Langchain OpenAI FAISS/
│   ├── RAG_Application_using_Langchain_OpenAI_API_and_FAISS.ipynb
│   └── state_of_the_union.txt
├── RAG App with Mongo Vector Search & Gemma/
│   └── rag_with_huggingface_and_mongodb.ipynb
├── RAG Pipeline from Scratch/
│   └── RAG_Implementation_from _Scartch.ipynb
├── RAG_Fusion.ipynb
├── RAG_With_Knowledge_graph(Neo4j).ipynb
├── RAG_with_LLAMA3_1.ipynb
├── README.md
├── Roadmap of Generative AI/
│   └── Generative_AI_Roadmap.pptx
├── basic_retrieval_and_contextual_compression_retrieval.ipynb
└── self_query_retrieval.ipynb

================================================
FILE CONTENTS
================================================

================================================
FILE: Access_APIs_Using_Langchain/LangChain_Complete_Course.ipynb
================================================
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0",
   "metadata": {},
   "outputs": [],
   "source": [
    "import langchain\n",
    "print(\"ok!\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1",
   "metadata": {},
   "outputs": [],
   "source": [
    "from dotenv import load_dotenv\n",
    "\n",
    "load_dotenv()  # take environment variables from .env."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "GOOGLE_API_KEY=os.getenv(\"GOOGLE_API_KEY\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3",
   "metadata": {},
   "outputs": [],
   "source": [
    "HUGGINGFACE_TOKEN=os.getenv(\"HUGGINGFACE_TOKEN\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4",
   "metadata": {},
   "outputs": [],
   "source": [
    "HUGGINGFACE_TOKEN\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5",
   "metadata": {},
   "outputs": [],
   "source": [
    "OPENAI_API_KEY=os.getenv(\"OPENAI_API_KEY\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6",
   "metadata": {},
   "source": [
    "# Langchain with openapi api"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7",
   "metadata": {},
   "outputs": [],
   "source": [
    "import openai"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.llms import OpenAI"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9",
   "metadata": {},
   "outputs": [],
   "source": [
    "llm=OpenAI()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "10",
   "metadata": {},
   "outputs": [],
   "source": [
    "text=\"can you tell me about the chaina?\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "11",
   "metadata": {},
   "outputs": [],
   "source": [
    "print(llm.predict(text))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "12",
   "metadata": {},
   "source": [
    "# Langchain with Huggingface hub"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "13",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain import HuggingFaceHub"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "14",
   "metadata": {},
   "outputs": [],
   "source": [
    "llm2=HuggingFaceHub(repo_id=\"google/flan-t5-large\",huggingfacehub_api_token=HUGGINGFACE_TOKEN)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "15",
   "metadata": {},
   "outputs": [],
   "source": [
    "print(llm2(\"'how old are you?'please translate it in hindi\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "16",
   "metadata": {},
   "outputs": [],
   "source": [
    "llm3=HuggingFaceHub(repo_id=\"mistralai/Mistral-7B-Instruct-v0.2\",huggingfacehub_api_token=HUGGINGFACE_TOKEN)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "17",
   "metadata": {},
   "outputs": [],
   "source": [
    "print(llm3(\"what is the capital city of India?\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "18",
   "metadata": {},
   "outputs": [],
   "source": [
    "print(llm3.predict(\"can you give me 200 line of summary on the capital city of India\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "19",
   "metadata": {},
   "source": [
    "# Lanchain with gemini api"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "20",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_google_genai import ChatGoogleGenerativeAI"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "21",
   "metadata": {},
   "outputs": [],
   "source": [
    "llm4=ChatGoogleGenerativeAI(model=\"gemini-pro\",google_api_key=GOOGLE_API_KEY)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "22",
   "metadata": {},
   "outputs": [],
   "source": [
    "llm4.predict(\"what is capital of usa?\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "23",
   "metadata": {},
   "outputs": [],
   "source": [
    "llm4.invoke(\"what is capital of usa?\").content"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "24",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}


================================================
FILE: Access_APIs_Using_Langchain/requirements.txt
================================================
langchain
openai
huggingface_hub
langchain_google_genai

================================================
FILE: Advance RAG Hybrid Search/Hybrid_Search_in_RAG.ipynb
================================================
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "view-in-github"
   },
   "source": [
    "<a href=\"https://colab.research.google.com/github/sunnysavita10/Indepth-GENAI/blob/main/Hybrid_Search_in_RAG.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "ZHzAavdZ3VNX"
   },
   "outputs": [],
   "source": [
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.metrics.pairwise import cosine_similarity\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "nYRfi-RmDbp3"
   },
   "outputs": [],
   "source": [
    "# Sample documents\n",
    "documents = [\n",
    "    \"This is a list which containig sample documents.\",\n",
    "    \"Keywords are important for keyword-based search.\",\n",
    "    \"Document analysis involves extracting keywords.\",\n",
    "    \"Keyword-based search relies on sparse embeddings.\"\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "H4MwrCZ_DmrA"
   },
   "outputs": [],
   "source": [
    "query=\"keyword-based search\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "NhzyM3v3Du2R"
   },
   "outputs": [],
   "source": [
    "import re\n",
    "def preprocess_text(text):\n",
    "    # Convert text to lowercase\n",
    "    text = text.lower()\n",
    "    # Remove punctuation\n",
    "    text = re.sub(r'[^\\w\\s]', '', text)\n",
    "    return text\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "y2ni_SqXD0Vd"
   },
   "outputs": [],
   "source": [
    "preprocess_documents=[preprocess_text(doc) for doc in documents]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "j8V1C_9tEBMQ",
    "outputId": "7b32b1e6-9a86-46cc-ce34-69853884e2bf"
   },
   "outputs": [],
   "source": [
    "preprocess_documents"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "gIOe6cD3EEsR",
    "outputId": "f8d7ed10-52fd-4017-d609-b2d23c5db662"
   },
   "outputs": [],
   "source": [
    "print(\"Preprocessed Documents:\")\n",
    "for doc in preprocess_documents:\n",
    "    print(doc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "YsE3-_29EQZ4",
    "outputId": "928dc874-96c1-43df-ad6c-bc2012537f7f"
   },
   "outputs": [],
   "source": [
    "print(\"Preprocessed Query:\")\n",
    "print(query)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "SHeGaVJWESI-"
   },
   "outputs": [],
   "source": [
    "preprocessed_query = preprocess_text(query)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 35
    },
    "id": "M0KhXDLiEcCI",
    "outputId": "d191b0de-17db-44e8-de9a-e32b1166e7ab"
   },
   "outputs": [],
   "source": [
    "preprocessed_query"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "DxMRTcYiEdHG"
   },
   "outputs": [],
   "source": [
    "vector=TfidfVectorizer()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "08jzr0KsEmDX"
   },
   "outputs": [],
   "source": [
    "X=vector.fit_transform(preprocess_documents)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "J_dkpYYZErZv",
    "outputId": "1cb63639-5057-4d47-b1db-d7772f021e75"
   },
   "outputs": [],
   "source": [
    "X.toarray()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "Qzz9npHZE0oV",
    "outputId": "02716dd3-9e0e-4d69-c48c-55b643cd6062"
   },
   "outputs": [],
   "source": [
    "X.toarray()[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "LckZUiA4E4ft"
   },
   "outputs": [],
   "source": [
    "query_embedding=vector.transform([preprocessed_query])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "aiNDyXHJFEZu",
    "outputId": "6021c89a-d268-47bb-c582-de2a3e0769bc"
   },
   "outputs": [],
   "source": [
    "query_embedding.toarray()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "XXBAHj3nFGXh"
   },
   "outputs": [],
   "source": [
    "similarities = cosine_similarity(X, query_embedding)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "mrsvAIehHhIf",
    "outputId": "95d2b3dd-f983-4f4c-b91e-6e7339ff5c83"
   },
   "outputs": [],
   "source": [
    "similarities"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "Juj5TN8GHzpV",
    "outputId": "9d081198-b336-4f24-cffc-3665d37c7529"
   },
   "outputs": [],
   "source": [
    "np.argsort(similarities,axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "RHj8jNt2IPzU"
   },
   "outputs": [],
   "source": [
    "ranked_documents = [documents[i] for i in ranked_indices]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "gRmz-mQVHh-u"
   },
   "outputs": [],
   "source": [
    "#Ranking\n",
    "ranked_indices=np.argsort(similarities,axis=0)[::-1].flatten()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "tqcS1JjmICiX",
    "outputId": "5686d7b5-d395-4f1b-9115-dab500b4a561"
   },
   "outputs": [],
   "source": [
    "ranked_indices\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "Wsr1s-vcIEGm",
    "outputId": "8b98886b-0d39-4580-efcf-541a871ded6b"
   },
   "outputs": [],
   "source": [
    "# Output the ranked documents\n",
    "for i, doc in enumerate(ranked_documents):\n",
    "    print(f\"Rank {i+1}: {doc}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 35
    },
    "id": "P4bJxZwAILue",
    "outputId": "288b18fa-cf8f-4f4f-ef7c-fc3dc03fbe88"
   },
   "outputs": [],
   "source": [
    "query"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "JVa9FNvtJADx"
   },
   "outputs": [],
   "source": [
    "documents = [\n",
    "    \"This is a list which containig sample documents.\",\n",
    "    \"Keywords are important for keyword-based search.\",\n",
    "    \"Document analysis involves extracting keywords.\",\n",
    "    \"Keyword-based search relies on sparse embeddings.\"\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "hU93ANjGJDLt"
   },
   "outputs": [],
   "source": [
    "#https://huggingface.co/sentence-transformers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "c2Eh8p_MIVAV"
   },
   "outputs": [],
   "source": [
    "document_embeddings = np.array([\n",
    "    [0.634, 0.234, 0.867, 0.042, 0.249],\n",
    "    [0.123, 0.456, 0.789, 0.321, 0.654],\n",
    "    [0.987, 0.654, 0.321, 0.123, 0.456]\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "YHKoe1BBIw1j"
   },
   "outputs": [],
   "source": [
    "# Sample search query (represented as a dense vector)\n",
    "query_embedding = np.array([[0.789, 0.321, 0.654, 0.987, 0.123]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "-EYl_pwbIyvN"
   },
   "outputs": [],
   "source": [
    "# Calculate cosine similarity between query and documents\n",
    "similarities = cosine_similarity(document_embeddings, query_embedding)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "IMNMKcChLjkE",
    "outputId": "2e582a10-31bb-4c99-9966-35b21ac0f901"
   },
   "outputs": [],
   "source": [
    "similarities"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Vk1EdOJBI0S1"
   },
   "outputs": [],
   "source": [
    "ranked_indices = np.argsort(similarities, axis=0)[::-1].flatten()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "cA8La-wuI1rV",
    "outputId": "f5e5ceb8-1533-4cee-b50c-d510a64acc8a"
   },
   "outputs": [],
   "source": [
    "ranked_indices"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "T_DQrmU9I2b2",
    "outputId": "f8abc51c-7bbe-4a46-88f5-e7cb3e1fcddb"
   },
   "outputs": [],
   "source": [
    "# Output the ranked documents\n",
    "for i, idx in enumerate(ranked_indices):\n",
    "    print(f\"Rank {i+1}: Document {idx+1}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "bonW5T3DI343"
   },
   "outputs": [],
   "source": [
    "doc_path=\"/content/Retrieval-Augmented-Generation-for-NLP.pdf\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "4i1BwkuaJdUG",
    "outputId": "b56b6dca-172f-4e11-9204-369e45d0420b"
   },
   "outputs": [],
   "source": [
    "!pip install pypdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "1IG4zizRJgWW",
    "outputId": "898c9837-265b-409e-a684-eadef1844a97"
   },
   "outputs": [],
   "source": [
    "!pip install langchain_community"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "uYdubydrJmUH"
   },
   "outputs": [],
   "source": [
    "from langchain_community.document_loaders import PyPDFLoader"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "2f9DJUCzJprn"
   },
   "outputs": [],
   "source": [
    "loader=PyPDFLoader(doc_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "B98wvocsJvTN"
   },
   "outputs": [],
   "source": [
    "docs=loader.load()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "v7l4fCgvJxUW"
   },
   "outputs": [],
   "source": [
    "from langchain.text_splitter import RecursiveCharacterTextSplitter"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "WepxAdEdJ_nW"
   },
   "outputs": [],
   "source": [
    "splitter = RecursiveCharacterTextSplitter(chunk_size=200,chunk_overlap=30)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "lwvamrKDKCn_"
   },
   "outputs": [],
   "source": [
    "chunks = splitter.split_documents(docs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "jeYdtmSQKFII",
    "outputId": "cf3c4288-aeea-4f6f-d29f-d37dd6220d55"
   },
   "outputs": [],
   "source": [
    "chunks"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "9ELPWtoiKGj_"
   },
   "outputs": [],
   "source": [
    "from langchain.embeddings import HuggingFaceInferenceAPIEmbeddings"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "tie5VFKiKNLG"
   },
   "outputs": [],
   "source": [
    "HF_TOKEN=\"\"  # Replace with your Hugging Face API token"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "zUHbfW8kKOvP"
   },
   "outputs": [],
   "source": [
    "embeddings = HuggingFaceInferenceAPIEmbeddings(api_key=HF_TOKEN, model_name=\"BAAI/bge-base-en-v1.5\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "ac6yOdC2KYRP",
    "outputId": "f176c60f-ea0e-426e-ceb7-cc18cc6829ce"
   },
   "outputs": [],
   "source": [
    "!pip install chromadb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Y0quqPhKKc22"
   },
   "outputs": [],
   "source": [
    "from langchain.vectorstores import Chroma"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Zfzae2UlKh9O"
   },
   "outputs": [],
   "source": [
    "vectorstore=Chroma.from_documents(chunks,embeddings)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "0ALPQsPUKpau"
   },
   "outputs": [],
   "source": [
    "vectorstore_retreiver = vectorstore.as_retriever(search_kwargs={\"k\": 3})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "2FV-WXkyKx6P",
    "outputId": "b6130974-ba6b-4296-9105-d750ab9c77d3"
   },
   "outputs": [],
   "source": [
    "vectorstore_retreiver"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "QT6vnCxHKyw9",
    "outputId": "05a917ff-c00c-460c-bb49-a711f88e52d0"
   },
   "outputs": [],
   "source": [
    "!pip install rank_bm25"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "IqeQYitAK4ct"
   },
   "outputs": [],
   "source": [
    "from langchain.retrievers import BM25Retriever, EnsembleRetriever"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "K0Ysb2j7K8q-"
   },
   "outputs": [],
   "source": [
    "keyword_retriever = BM25Retriever.from_documents(chunks)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "ns_BlaSPK_7G"
   },
   "outputs": [],
   "source": [
    "keyword_retriever.k =  3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "mgWvoTb6LFTu"
   },
   "outputs": [],
   "source": [
    "ensemble_retriever = EnsembleRetriever(retrievers=[vectorstore_retreiver,keyword_retriever],weights=[0.3, 0.7])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "UofjUpUzLYep"
   },
   "source": [
    "# Mixing vector search and keyword search for Hybrid search\n",
    "\n",
    "## hybrid_score = (1 — alpha) * sparse_score + alpha * dense_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "YcoWWuHCLRpI"
   },
   "outputs": [],
   "source": [
    "model_name = \"HuggingFaceH4/zephyr-7b-beta\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "npRU0vb2MID-",
    "outputId": "9ed32b71-d556-4ce3-b173-4dde1adeffad"
   },
   "outputs": [],
   "source": [
    "!pip install bitsandbytes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "1-5-EKRgMKIG",
    "outputId": "92a5cc0e-a1d0-4632-feeb-c4fe330db197"
   },
   "outputs": [],
   "source": [
    "!pip install accelerate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "j1hZfTx7MMvF"
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "from transformers import ( AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, pipeline, )\n",
    "from langchain import HuggingFacePipeline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "wreWtbxiMjX2"
   },
   "outputs": [],
   "source": [
    "# function for loading 4-bit quantized model\n",
    "def load_quantized_model(model_name: str):\n",
    "    \"\"\"\n",
    "    model_name: Name or path of the model to be loaded.\n",
    "    return: Loaded quantized model.\n",
    "    \"\"\"\n",
    "    bnb_config = BitsAndBytesConfig(\n",
    "        load_in_4bit=True,\n",
    "        bnb_4bit_use_double_quant=True,\n",
    "        bnb_4bit_quant_type=\"nf4\",\n",
    "        bnb_4bit_compute_dtype=torch.bfloat16,\n",
    "    )\n",
    "\n",
    "    model = AutoModelForCausalLM.from_pretrained(\n",
    "        model_name,\n",
    "        torch_dtype=torch.bfloat16,\n",
    "        quantization_config=bnb_config,\n",
    "    )\n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "NwjY8MH2MlPy"
   },
   "outputs": [],
   "source": [
    "# initializing tokenizer\n",
    "def initialize_tokenizer(model_name: str):\n",
    "    \"\"\"\n",
    "    model_name: Name or path of the model for tokenizer initialization.\n",
    "    return: Initialized tokenizer.\n",
    "    \"\"\"\n",
    "    tokenizer = AutoTokenizer.from_pretrained(model_name, return_token_type_ids=False)\n",
    "    tokenizer.bos_token_id = 1  # Set beginning of sentence token id\n",
    "    return tokenizer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 301,
     "referenced_widgets": [
      "80926a7d4df344508960da3bd0ca49f7",
      "6c641853c1b74a41b184f51b87ae906f",
      "8d2c6e157a924a26880515f7324b2c75",
      "a0be9de9c0a74bf7a71990b7cf90fc81",
      "af31aa045fc34aa988fd62c069526825",
      "2a1bec229f7d47848a7b2295c6a268f4",
      "26095125285d4e9ea83874f6ffe25942",
      "08cf29966c294859bccd6c732c5f3d7f",
      "9e1aa7119d43472d8aa59c7dab6c694a",
      "16eb1f8b842d4826ba3ef2005ed31e6e",
      "3c1d8fe6e80543a2882f85db87ea1ac0",
      "0b1bcab0cf134f63a5e8266625a942bd",
      "09826733b772426087d6637d792ba548",
      "44e281bf0ce446c4b8498228561135de",
      "59b548dd70b44891b3aa98de1791bfb5",
      "384b571d3e39475b85ca761ab673ee73",
      "447d6969157c43bcb0631a26b6c8cac0",
      "071e4ae0b00c4f26be7211138a1181ae",
      "f8be43f1c46c4faf8f051210a43f0bfb",
      "a1a23db33c224752a1dc2196ba382ae6",
      "a378202cc8d949f69d3d12d4fa73213e",
      "f31d3074eae94590b898da18bac54d06",
      "ad36707579d845b7a06f50cb63ed7b83",
      "3a814f699a8343c3af2fad3f95de8de1",
      "4ad0219054824fd0af5bbdb93442da57",
      "71bc0d30d99a4e47a0404b1f6889eaf3",
      "263d4bd8d0574212a6a321a1c7bdb196",
      "fd6295669e164ce4a387bc2e62946a4f",
      "ae1113c16973440d83b13200041c3951",
      "21f3d9c1e06e4296926555bfdc1f06fa",
      "458d94bad2094540a2f39a68ca453b69",
      "3c67a6a263944cf6b4c5a16bb12f645c",
      "582960e55cca46a2bb98c6262b4b8dac",
      "cb616a7cdbe34801b06a02faa2e1bf63",
      "840eaca5fb2946509606fbb200dc09f4",
      "363406e6e0014ebc84b4dc59b02f02c5",
      "85b93405ad3a4ba38e2556d6524d65fd",
      "a742a5585675495a93f79f8637ca1280",
      "de907241aa264c45934acfb7e9d24f57",
      "615281b2b6784b98847b50f01192f1a2",
      "9c4daf9db0034665a2594f47327b6788",
      "88d9d8050d1e4969b098f6abf84c1fee",
      "26b3044048b64a73b51d5898315d6dc5",
      "538545500c344b779460fb35fe1518db",
      "1d037ffc17d640548efc347135c3161c",
      "092a08cdbb7642afbc7690fc24df984f",
      "13625c7173694bf4aacdcc3d220d1987",
      "21c9320ad08a483d8d157a54618b560b",
      "fb5058f498e343109b9efc4e5b686abb",
      "36acdc477dde484db4a62e3457d5e541",
      "dc92e27c5fb54dfeba414b52de3e61ff",
      "176dbed88ecc4ac48b8f5c8ee5f18954",
      "11f30ee987e44ab3a314a8bfcb97ae65",
      "c897c57b73b94813b98b404a09eb8c27",
      "73a4375a86fc4d238183d1c5b8ec0947"
     ]
    },
    "id": "6jPsnRl1MnTT",
    "outputId": "01daf0fc-3df3-4595-d25c-cbac7a854885"
   },
   "outputs": [],
   "source": [
    "tokenizer = initialize_tokenizer(model_name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 450,
     "referenced_widgets": [
      "07d8c85868c449449b6baa5e01a73b29",
      "e471c5568cb64517b04d6928bf8fe489",
      "57fe89b8228949a38be75ef7e4de7839",
      "77e99c47ee4e454eb52737d88bbd251d",
      "34f2a684450948a9b3282c6ed6a942f8",
      "2df56bd6d013457394f095f7059eb749",
      "cd260bcc399844f4a1e8ba5f6e9c7583",
      "a0966045942d45f4971f9cafe09ca3d9",
      "202f976699894040976c79e074f3f872",
      "afadf115dc5b48dd96c6116f79c5d1e2",
      "63de9883e84a4b5da61f47973c20d9ef",
      "4881c9bf45b3451db46fee4c157f0f04",
      "2442fa158c45499d8cd8180a8315c17c",
      "5f117ff65397456db4831a76762e6fc7",
      "f51636a5b18446ec8f796bed4cac5235",
      "70aabcb99c8d440ebf7e62fa8bef67ca",
      "43b7aa07093e4743a1840b537e45ec49",
      "bd3b9e1eec7f4e15a6fbb5a5008b0ed7",
      "cdb4ac97ae9c4f9ba4acd34c8ad754e1",
      "005034b8094743e6a66ba5f3a92e2528",
      "f361d834ed24402aa92d7e68a5643baa",
      "040e68a26cba4ed59cbbb645b415849c",
      "1cdbc02ee2254e4d8d9f74f03877982f",
      "2750c773ab1f4aba83a4bc49810e0b2d",
      "c621c7507656401996f18f6d8838c10f",
      "49df4a8fb9324b38beb88827dc616397",
      "f5aa99bc46bd402c8f87d66974ab5381",
      "e9e8dcede4384b909a3d4075ee0e81ad",
      "03f5ae15263d430ab78f9b411b3a791c",
      "842c86b1c46b4e52940fccbe4189e99c",
      "b5f2d4c72b4844b893aa321beb203024",
      "d3b49dd99b7f4bdc99916a8489d5a2b9",
      "2962ac0a38fd4520a5d1a8dbff0d0017",
      "c62b209db3d84077955d5f8098ba8e7e",
      "03fead08af6e4045bd486059db06778e",
      "07d9e2dc13e6425aabab9742595319f9",
      "f8dcdea2c21746e8bd31d3545bec063e",
      "6b09ce81e3d14ba393667f1d2107d664",
      "520c039fd1ff42888eb2ccedcae2206b",
      "ed6bb088584346f29abc2dd96a165f25",
      "0b93285e9d6648a18895bcc97f8fd047",
      "cc1faa52bbb349da949ba8685a02a634",
      "2117b98dcd9145788388d65cfc226276",
      "5b7b92c68df94ad4aa7a57c24392b881",
      "15668490074e4146924c76d30d58b36d",
      "a295f559a84548b99dbf37b543be5a3e",
      "58e921fa323a469d9a0605ddbed59a75",
      "7e27e52524774fc18cbb1be105a95754",
      "63847ee284194d009825351d96a5b02b",
      "865e74c7b5f74079af763e2263bc2327",
      "2113668d3b97456bb12ce916a676feaf",
      "9c800bd92ce74075b918c4d466e84863",
      "52fa72ead88142e98c414a13859d6eab",
      "af20ec59965f42b18c2f96351b5fb0ba",
      "7971e0b059c64a23a389b43ddf387122",
      "6f7c608396e44029991536f150818d16",
      "d15b0846c4314acdaa7b3a1dcb71f0bc",
      "f758e0d677a547c3841b80497c674978",
      "ab34a0c84c3e46c1b4f68d1283f5935d",
      "b48a6bba01984146a10e72505b3759a7",
      "38f8636944b44bb49d36566ced632076",
      "f9420643986c4ed4b8d9c07e27acd48f",
      "8d145b507e28468f9c856014199d4db5",
      "e46fcdd2b72b4e30b0e12c0d624dd98e",
      "cdcb1c54936141dcac96fddd96f271a5",
      "8434d230785e4dee8d148f68c6a888fb",
      "50454394fabb4f31a45cb58b96cc26d5",
      "977c8cfbd6a44a5d86c594d26911d557",
      "f468056e46044349b8ce3a41d550ee78",
      "7bd32807c89848e1bbf33f3caf1f387e",
      "bd90f8108f084b87a4d430ba0e515cf2",
      "b0519b9d03394d5eab8484f2abe3a70c",
      "e05120f1c0a4434ab707344d1e383ed9",
      "b050ac0e6aea4d79bb1d2490dfc3ae98",
      "94bf0da48d34429886d0e4cce5450fd3",
      "c17d1f96f8594112b765de1dbc6f3b74",
      "e2aeb272fb374ef592c822c90ed8778d",
      "165a5174fbab472c9ef25bd99e6ac28c",
      "c1acc369a31e4e79a938a6c0cb36e559",
      "73b31d036d464c82a3a1ff920f6a3449",
      "4972967026934ea5acaf5f6ff7e85959",
      "3dcb0ed858364e949e263d5d4826ef2a",
      "a6076c8c267b4eec8178d409074903c7",
      "73cac54fe96f4a279e0c207709a86eaf",
      "e4bd4490dcec4d7d87be03a9a4d4382d",
      "57b4dcff412b4b468a6de20591de26ce",
      "4693d715c66547ea8d39cd1a6ba0336f",
      "2a01c5ef1de4456aad63cca3b2069593",
      "677a79a0338d422ca3368dd57f178b85",
      "d862657320ee4504a7265c5c97c31081",
      "04cfd5ba6ecc40c1952558acfbb2f4ce",
      "b52cb5cffa3141419db3efa89113e814",
      "cc6887ac097e4289a6ce4b1b1bf173e7",
      "4a7a6b7c7d784185b57d67d7f54b2691",
      "44bc78242bf94d79ac70fc791e3af16a",
      "6666fa1158c346e29cad1357589fcaa6",
      "db8b5eeea5754a399ce04f1870623cb7",
      "b28becf405c34086b763f02b63260aee",
      "69352bdd872d47649698abb7de37d3ef",
      "aaabc037d2f646788594f91d50da1997",
      "a2433ece64f547f39705001c3e30a6d9",
      "92c03fe2ae76461790874e0018815a28",
      "584662741e874eefacf19320737c2b59",
      "a6801fca131c4230987a70253e4ec6d7",
      "4b2a88c686e3410cbb0dea89f563a36a",
      "32ca4c3fc1814b42a14f37b6f6fd0882",
      "909b322452804f2abc0d2b4b56f0dfc5",
      "37d95d871dc8470ea003d21eae074fc8",
      "9029d7f32c234fdca72c18b30dbd43d6",
      "3fc32e8724b643b8b99ed542902ffb50",
      "809e6a3712b74ba2bee89cdefbbb5a8a",
      "b9e89f8490404229b28b9bfbc1f07ed3",
      "d7dbac36a72a4bc792127f08576906fd",
      "29323042926c40fe9d6bfdf90a1a8461",
      "236c12bc38d740b9a40e77b0257f614b",
      "07c3636d7be347f7a5c7ecdfe20e3b6f",
      "99437495138f4cff8fa55107bfb2c6e2",
      "2b2e6307d78645fe84349bd7f84bba2d",
      "e75fbee35ed940dca1d5c2f8c648180f",
      "fe2e1a2e23c7469382035a693633530a",
      "2998a1d726c44d13870fb56d0382414a",
      "a915809bec36492e82b2ffe103dbaa38",
      "00d6d459dc3e419d882aa81ae4f28154",
      "4a1269dcfb8f426a980f5e0154d72a69",
      "2b10ac1bc5e645609c9e94c611ab5d9d",
      "154279dc043b484ab636061c284b999e",
      "00e126aa54674c7f94645fc575d337a3",
      "68473a26b8fa4e53a0323b87cf64c85b",
      "88e62c14da344b09924afb5f76fb82f2",
      "dfc1ce03a4264afdbfcbdc3e49da55f7",
      "7180d98479b04fc7ac68016993803fd1",
      "d6b7a480f8c841b484a5dc7f25fd07e6",
      "d6ae442401a549a183fe9ee6acde7d6c",
      "c5730f6901a94164b6d011b1be334779",
      "083df6dcb00e4c4d8067aebdb17739f3",
      "84c4aaf7020a42fea9195c6721140956",
      "774958b959c144ad96ad9ed6cd5a65b8",
      "2bab900d4d464e38b02e8428a9167a20",
      "6f940eecd7a24898aec4adeb1c2ea9d7",
      "5a1d235b8ed447718d6c99999b27f663",
      "12c23e90d37d444bb5a6a29d282b0a48",
      "1ee7eb7cb9c94e89a82e7d01008d1030",
      "f6458c06ee6e472d8f48ebe902d6e420"
     ]
    },
    "id": "SlPXp-MdMoud",
    "outputId": "a10228f2-d79e-4e87-8802-a5d2c4923ffe"
   },
   "outputs": [],
   "source": [
    "model = load_quantized_model(model_name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "W92XMGCnMuuG"
   },
   "outputs": [],
   "source": [
    "pipeline = pipeline(\n",
    "    \"text-generation\",\n",
    "    model=model,\n",
    "    tokenizer=tokenizer,\n",
    "    use_cache=True,\n",
    "    device_map=\"auto\",\n",
    "    max_length=2048,\n",
    "    do_sample=True,\n",
    "    top_k=5,\n",
    "    num_return_sequences=1,\n",
    "    eos_token_id=tokenizer.eos_token_id,\n",
    "    pad_token_id=tokenizer.pad_token_id,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "c_9lkcQxMzRz"
   },
   "outputs": [],
   "source": [
    "llm = HuggingFacePipeline(pipeline=pipeline)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "xifUF7rhM0zw"
   },
   "outputs": [],
   "source": [
    "from langchain.chains import RetrievalQA"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "SusMb1LuM2I9"
   },
   "outputs": [],
   "source": [
    "normal_chain = RetrievalQA.from_chain_type(\n",
    "    llm=llm, chain_type=\"stuff\", retriever=vectorstore_retreiver\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "EryZWwp0OK1b"
   },
   "outputs": [],
   "source": [
    "hybrid_chain = RetrievalQA.from_chain_type(\n",
    "    llm=llm, chain_type=\"stuff\", retriever=ensemble_retriever\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "8LfE83mROQPS"
   },
   "outputs": [],
   "source": [
    "response1 = normal_chain.invoke(\"What is Abstractive Question Answering?\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "V9AD5METOTne",
    "outputId": "ee2d24ca-4e41-4a09-e061-01c4a7a2fe5c"
   },
   "outputs": [],
   "source": [
    "response1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "3upJ2p95OSA2",
    "outputId": "fab70c85-73b4-4aeb-b4af-de5a38f14bc0"
   },
   "outputs": [],
   "source": [
    "print(response1.get(\"result\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "05btkVByOVPA"
   },
   "outputs": [],
   "source": [
    "response2 = hybrid_chain.invoke(\"What is Abstractive Question Answering?\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "8iTPRsBqO_o9",
    "outputId": "213c4356-657f-4cef-a814-3885ce7c88e7"
   },
   "outputs": [],
   "source": [
    "response2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "TH4DKQYYPDuA",
    "outputId": "2dd0f6e8-fa4a-464b-8c12-5605c26a2141"
   },
   "outputs": [],
   "source": [
    "print(response2.get(\"result\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "r3k6SAjmPH5X"
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "authorship_tag": "ABX9TyN9J8sAFAwcZchZQM3mPc4J",
   "gpuType": "T4",
   "include_colab_link": true,
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3",
   "name": "python3"
  },
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}


================================================
FILE: Advance RAG Reranking from Scratch/Reranking_from_Scratch.ipynb
================================================
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "view-in-github"
   },
   "source": [
    "<a href=\"https://colab.research.google.com/github/sunnysavita10/Indepth-GENAI/blob/main/Reranking_from_Scratch.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "zkZpN87d4HJf"
   },
   "outputs": [],
   "source": [
    "documents = [\n",
    "    \"This is a list which containing sample documents.\",\n",
    "    \"Keywords are important for keyword-based search.\",\n",
    "    \"Document analysis involves extracting keywords.\",\n",
    "    \"Keyword-based search relies on sparse embeddings.\",\n",
    "    \"Understanding document structure aids in keyword extraction.\",\n",
    "    \"Efficient keyword extraction enhances search accuracy.\",\n",
    "    \"Semantic similarity improves document retrieval performance.\",\n",
    "    \"Machine learning algorithms can optimize keyword extraction methods.\"\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "MLF_E-ZQCYq_",
    "outputId": "d6663d67-6aaa-4d05-e6d6-f93a38bee6d0"
   },
   "outputs": [],
   "source": [
    "!pip install sentence_transformers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "A2TapY91Cde2",
    "outputId": "59730e9c-973c-4e42-9e62-319b0c783df2"
   },
   "outputs": [],
   "source": [
    "from sentence_transformers import SentenceTransformer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "YcMjOGquCkSu"
   },
   "outputs": [],
   "source": [
    "# Load pre-trained Sentence Transformer model\n",
    "model_name = 'sentence-transformers/paraphrase-xlm-r-multilingual-v1'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 528,
     "referenced_widgets": [
      "a73efd61756445ee8f59a9d4c477a496",
      "68ccd8382e3b4b67918c1185619569be",
      "abdde99c2beb414a85ec34c5786d6bb4",
      "268eb8843398482fafafc7872d0ecfe3",
      "237e90ec67814d0dae44d87298d7832f",
      "065e9d8dea90483e82a8b2245f4536ca",
      "b79089b353334f93815eca389075e53e",
      "4e4fceb1c2694de983367ffbc14cc6b1",
      "78a1ec72ded34a38be5a53b826a3f47e",
      "0e6e82e47c794f8c84635a9dbcfe2f41",
      "9e2638ccb48848ecab369c3cfc3858d5",
      "8a3090b91dda4a14a4ef1edcdcdcd169",
      "c9108a02b3ca4b3fa1fd27498841f5fe",
      "d61f57fb6cad482090fe874268bb7fb0",
      "e994f58d6e7e4639b9feb59166e49ece",
      "6116d2df9d8b4290981f7d45b0c1ece9",
      "147152f3f8314d5f93c35194e96bf41f",
      "1a0b0b6b1848413baea8804af947cf7f",
      "d3603d3fdc314fca9132355c70948e28",
      "d6258c5bfc474ef59d9c106245dfa5f6",
      "918d839c76564c41ba9373b576de1cfd",
      "47dad9a831044689b1926f2b9e608787",
      "e767c41657d345a5ba8569b89d3347f7",
      "ea8879768efa416d9a032ac56760039f",
      "61ad01c8d10d41579300176be2388cb5",
      "7a2e7317b9d64b07b032e42fd1a7f021",
      "3a0feffa1d4b4f49bf875eeece9eda44",
      "eaf1862044564eefb3ae75a3f1d9b5cb",
      "8f337c9564e748d5825b0338cbfe61ed",
      "83362efd58e543b3b37fef730a92e472",
      "a766e351652e480ba9c2bbe9e4654277",
      "f6c2e7b4ffd24a299f77966e6a01bfae",
      "3722b793a3864a7ea37d17190502214f",
      "4fafa1c7e2ba4226adcc96923366ad27",
      "485bbf74d899477aa078deb9c041ed78",
      "f99622285dd54f7ba2e53328281f4622",
      "1cb793924d74484cab6ef3d25f03d6a1",
      "085ef7cf00f34d17b0a408d30edf2fe4",
      "783b47a891e54914b6c1c02282d60ab4",
      "316319c51c8e4641bf6a54b0faa115da",
      "cdfe2c8c9e85479d85e9f8807a8e0d80",
      "eaaf65e04ae643e0b345e4c9fb66b395",
      "a9655237479c4dda903e7cf2bce5ed47",
      "6ed8f516577445a59b14d83cc70051b9",
      "d0ad25f469704abc9f50593e7a700493",
      "ab96ab19368e4e0a9b9db9651e82dcfb",
      "d7e49001505f423a875b4a104f802791",
      "e0430cc1c475449cb7d7e95996346386",
      "310b3c09502d478cb4f6d5c368477d3d",
      "da40ed22f73d45e38c18a0840447f9f4",
      "3b691de532754ca896537b9545b98b3c",
      "23d6300688ed48f4854d3b1b1d95f7b5",
      "07e8d136197c42e4bf13e268fe4a7e18",
      "adb7a266e6f544d69a431d639b7ec8ca",
      "389621bc791d43009a1dc72f8b8c6255",
      "d0d22e982bae4a22bc3096a20d5df450",
      "5b15d268cb2f41f789fc64b69ecbfacd",
      "e193101058a84d748d8d9d7de188206c",
      "2260ad86c1fc4fd19a45c739a149a468",
      "12eebf8fb4754a3fb437826534a59122",
      "aed192be683a4457a203023a767d9657",
      "07804e100ec94400be6112715766edd4",
      "ca3c48a038ba41ad8cb8c63818efc56e",
      "b7b6faa206d24c2aa170db8c1e4fdd5a",
      "429081ab64d243658e23629aa5f5dd42",
      "b48366eeb2764d538c7377dbd885e645",
      "d7551d3c5c7b40feaf5e10980941be6a",
      "fc7e4928ab3d41399a353a635458b839",
      "92c726d5833442a2b2370e39f1f3beb6",
      "b66f31b83a7a45c2802f82e71977a484",
      "f23f5ac637634ce99d980ff914f5f2b5",
      "7b8d20d4f0ea491eb0c572b35632b491",
      "b0c146ab051e469c9a221f7a4aa2dcb0",
      "7870aca389cd476f9f9fc3e18a3a7dc1",
      "b0196615760e4f8090bcefeb6dc75ad0",
      "2543d539ac1846bc9c8a60f5c9bf8b0f",
      "0518c6d6fd6345a0bd4d8cd42624c9b0",
      "a24d5de3191d4ab9b14042d1b74b2771",
      "360e5501781641e28223c2ca04885712",
      "61ba97ed908347bdb108414d00ae1da8",
      "f532e2107a504f02b1c8aaf808fab285",
      "bbbe88e4bcb8419eae1287f873030c32",
      "6fe021d4c3354f928864812d36c6f505",
      "b858cf901d114e0fb8c5d4b5e60a37fd",
      "5f9cd04cd1ad45e797b5a19b59d12a53",
      "ed88bb06e121466990f46709fe4cb04a",
      "bb1918b54e5a49c7955615803d61d9fb",
      "f2c7997c24034b339b32bc6c6e29caf1",
      "6251884fe0ed43649766f7564e6ad115",
      "c14ae62edc51484d963fa9160806d171",
      "611c4d1847b34f17ae0e00dcd94154ce",
      "29fd88b5e6e6476cbcce4f612905a8e6",
      "90f11cadc2ca48f58e2d63351593710c",
      "3d35a1d2cfc94dcebf9e972fb156d966",
      "d33d91cab584458ca5c739c4bc90c303",
      "f4e5d0f719a04dc0b67589274369a421",
      "81202f4eeb1c41378a67ef9b5841c1c0",
      "b6acd772cff24e5d96d0624ddf4ff44e",
      "b1c612692bb1479b8dec5f467ad58832",
      "7a96b13409884197a28ec4b78a86282d",
      "71f6ffd6635b40608b37066f9b67e176",
      "70af227d52094d18a829639dd84955b1",
      "17317293304644c5a891955e3b387964",
      "c74008e0e8e2429b89f1192f8bb0d4b7",
      "e1cb3eb282a14850b48ab5a380a2acb5",
      "7319aebddf3445b2b7e9a0306e0447e7",
      "5d19b88244904aa88059b6c9e27a8599",
      "fffd1f3b84b443828a2f8b49d41be906",
      "5f5f4d08736d4f2e96c439820fc64713",
      "ced7c15e2caa4e73a6feb289b66a3dfe",
      "319c9d6c19af43a1bfdeea654417384f",
      "b57386b666e74e1e98b2dd63ddee47f7",
      "5a1215e03da746c1afdd509b76ab1004",
      "8ccec9a9c0f74eb8be6955cff6e53705",
      "ab8123ece1a240dfa5ca5745e6ab8292",
      "edd08d1dc4ba4372a0d922d6d3082aed",
      "638363a050bb40e3bd7c4486bae71ed5",
      "4fbbae328003461a9ff3504ad3ea6ce1",
      "4261373691d54f818090945cc72bae02",
      "1a8126495ffe4bbc9a25ee1815db4cbb",
      "9b3cad44fe2548c48336193e7c4643c9"
     ]
    },
    "id": "3HLEx9rKCxdn",
    "outputId": "cf3da8e1-e2b6-4153-8d0e-384210001ba0"
   },
   "outputs": [],
   "source": [
    "model = SentenceTransformer(model_name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "oj8kcRVZDDYs",
    "outputId": "814cd1b0-cacd-44c3-b3d1-65df0b6534cd"
   },
   "outputs": [],
   "source": [
    "documents"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "yaI-PRMwDGxf",
    "outputId": "00c9abfc-2371-4006-d76a-681e7b9c619b"
   },
   "outputs": [],
   "source": [
    "len(documents)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "PYxjbDxdC0T_"
   },
   "outputs": [],
   "source": [
    "document_embeddings = model.encode(documents)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "UUENS13LDJ5y",
    "outputId": "08c30846-cab5-41ce-a7de-fc7daaabc4a0"
   },
   "outputs": [],
   "source": [
    "len(document_embeddings)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "25ZYBnhcDMcj",
    "outputId": "b9665b05-aea9-4d7b-fc4a-70e578f8eb79"
   },
   "outputs": [],
   "source": [
    "len(document_embeddings[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "IcQ1Q9PtC9o-",
    "outputId": "15b836c5-7519-4ce7-dde0-6f0a8ff833ea"
   },
   "outputs": [],
   "source": [
    "for i, embedding in enumerate(document_embeddings):\n",
    "    print(f\"Document {i+1} embedding: {embedding}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "z29WzyItDX8x",
    "outputId": "7da471bd-609b-493b-d371-c23acc609bed"
   },
   "outputs": [],
   "source": [
    "documents"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "1nQF36rhDA9_"
   },
   "outputs": [],
   "source": [
    "query = \"Natural language processing techniques enhance keyword extraction efficiency.\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "bJatNM_4Da5y"
   },
   "outputs": [],
   "source": [
    "query_embedding = model.encode(query)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "ZxQf2v2TDc3I",
    "outputId": "1269d99d-8489-44ab-9782-b8b4cbcf9f02"
   },
   "outputs": [],
   "source": [
    "print(\"Query embedding:\", query_embedding)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "161pAXWNE6Ch",
    "outputId": "6e81b715-5a8c-4aed-daf1-8f366e6ac0c8"
   },
   "outputs": [],
   "source": [
    "len(query_embedding)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "4dZjQsGDDj5m"
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from sklearn.metrics.pairwise import cosine_similarity"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Rcf5V3I7Dp-B"
   },
   "outputs": [],
   "source": [
    "similarities = cosine_similarity(np.array([query_embedding]), document_embeddings)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "sfk1qPUeDt_l",
    "outputId": "9795635a-1773-4f29-96dd-eab6c337cf5e"
   },
   "outputs": [],
   "source": [
    "similarities"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "L_vQO9WoDvLF"
   },
   "outputs": [],
   "source": [
    "most_similar_index = np.argmax(similarities)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "kstZiJpZFKLe",
    "outputId": "63f259e1-4fa0-432b-eecb-b7575f064f77"
   },
   "outputs": [],
   "source": [
    "most_similar_index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "NQiqJlgNFLHn"
   },
   "outputs": [],
   "source": [
    "most_similar_document = documents[most_similar_index]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 35
    },
    "id": "ghiLFqGEFPxn",
    "outputId": "13def6c9-0535-4b37-a51a-c58199e973ed"
   },
   "outputs": [],
   "source": [
    "most_similar_document"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 35
    },
    "id": "J0WDD1hvFQ62",
    "outputId": "6decb463-f85d-4720-f866-2eabd198767d"
   },
   "outputs": [],
   "source": [
    "query"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "l0FK7NeAFR2V"
   },
   "outputs": [],
   "source": [
    "similarity_score = similarities[0][most_similar_index]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "vVYM05pnFa6I",
    "outputId": "bb851a47-2724-43c2-b079-2d7f822435ea"
   },
   "outputs": [],
   "source": [
    "similarity_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "0MDWnmaWFbwm"
   },
   "outputs": [],
   "source": [
    "sorted_indices = np.argsort(similarities[0])[::-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "2ANc52lQFizG",
    "outputId": "d98ed7fc-8c1c-4cef-8d73-64a3203a46b7"
   },
   "outputs": [],
   "source": [
    "sorted_indices"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "K3ydRBXWFj0N"
   },
   "outputs": [],
   "source": [
    "ranked_documents = [(documents[i], similarities[0][i]) for i in sorted_indices]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "SC6o7OhYFrC_",
    "outputId": "204cc6d6-aa63-4296-cc92-003002dc80be"
   },
   "outputs": [],
   "source": [
    "ranked_documents"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 35
    },
    "id": "XKIQNhJ2FsCd",
    "outputId": "51c38f25-a8c8-4c06-cdf0-dc1cf7513634"
   },
   "outputs": [],
   "source": [
    "query"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "fyEQPRNaFwDn",
    "outputId": "58ac9e6f-8ab1-4c61-baa9-84fab33a3d36"
   },
   "outputs": [],
   "source": [
    "print(\"Ranked Documents:\")\n",
    "for rank, (document, similarity) in enumerate(ranked_documents, start=1):\n",
    "    print(f\"Rank {rank}: Document - '{document}', Similarity Score - {similarity}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "nIRnIQbbF6u4",
    "outputId": "2cbfeb6e-ded3-4187-eaf7-3e20d4a6a870"
   },
   "outputs": [],
   "source": [
    "print(\"Top 4 Documents:\")\n",
    "for rank, (document, similarity) in enumerate(ranked_documents[:4], start=1):\n",
    "    print(f\"Rank {rank}: Document - '{document}', Similarity Score - {similarity}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 35
    },
    "id": "_OrCV0bDGWeN",
    "outputId": "7850bfa2-1446-4f82-fe3f-7f9b66fcac73"
   },
   "outputs": [],
   "source": [
    "query"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "RdUhRaPuGBdG",
    "outputId": "07310c7d-e6f7-4448-f486-fc74e977c0b8"
   },
   "outputs": [],
   "source": [
    "!pip install rank_bm25"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "V2xHQLECGOPh"
   },
   "outputs": [],
   "source": [
    "from rank_bm25 import BM25Okapi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "IOWKXh97GTt9"
   },
   "outputs": [],
   "source": [
    "top_4_documents = [doc[0] for doc in ranked_documents[:4]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "HL6C8FBkGkvR",
    "outputId": "b6008275-ca9e-4f57-af0d-8022926eb976"
   },
   "outputs": [],
   "source": [
    "top_4_documents"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "JRxkOMP8GlmO"
   },
   "outputs": [],
   "source": [
    "tokenized_top_4_documents = [doc.split() for doc in top_4_documents]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "JXfRdUURGqak",
    "outputId": "284d7b52-f5c8-4b54-e65b-93b51ccac61d"
   },
   "outputs": [],
   "source": [
    "tokenized_top_4_documents"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "qI6FBUxVGrPG"
   },
   "outputs": [],
   "source": [
    "tokenized_query = query.split()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "pmLnmTKwHV3Q",
    "outputId": "4e581b53-63c5-4cd7-bd5f-beba513e71a6"
   },
   "outputs": [],
   "source": [
    "tokenized_query"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "tFnVRMXgHXGf"
   },
   "outputs": [],
   "source": [
    "bm25=BM25Okapi(tokenized_top_4_documents)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "M1JsrrgQHft_",
    "outputId": "9ce9731f-1a5f-4a6d-9a5a-c2de87d74441"
   },
   "outputs": [],
   "source": [
    "bm25"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "_qSArmibHhIm"
   },
   "outputs": [],
   "source": [
    "bm25_scores = bm25.get_scores(tokenized_query)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "uCwf4pd1HsKe",
    "outputId": "701d823b-66ad-47ee-bc36-721482a5a30d"
   },
   "outputs": [],
   "source": [
    "bm25_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "NZ9O9jCqHuEV"
   },
   "outputs": [],
   "source": [
    "sorted_indices2 = np.argsort(bm25_scores)[::-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "r4E-x3nyIBoH",
    "outputId": "54cf1b6d-0b7c-4530-9d6a-c064af50b876"
   },
   "outputs": [],
   "source": [
    "sorted_indices2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "b7CaBP5QICd2",
    "outputId": "46e955c8-59ed-4754-9670-703431fb2939"
   },
   "outputs": [],
   "source": [
    "top_4_documents"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 35
    },
    "id": "uRatS013IM0m",
    "outputId": "121e1576-5234-41d0-f283-5e3ebc013549"
   },
   "outputs": [],
   "source": [
    "query"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "IDrlrwEZQwgz"
   },
   "outputs": [],
   "source": [
    "reranked_documents = [(top_4_documents[i], bm25_scores[i]) for i in sorted_indices2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "mdlTwxcSQ7UD",
    "outputId": "65dc55c0-7add-48c4-8edc-13df8fd6e683"
   },
   "outputs": [],
   "source": [
    "reranked_documents"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "Tp0KrhpHQYIC",
    "outputId": "d8a30b20-6d03-434e-cda1-cd194d652be0"
   },
   "outputs": [],
   "source": [
    "print(\"Rerank of top 4 Documents:\")\n",
    "for rank, (document, similarity) in enumerate(reranked_documents, start=1):\n",
    "    print(f\"Rank {rank}: Document - '{document}', Similarity Score - {similarity}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "EStAQfpCRS42",
    "outputId": "95fb587a-c7d1-4306-8aec-1c1c5117ed59"
   },
   "outputs": [],
   "source": [
    "ranked_documents[:4]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "G4J4__8URiHJ"
   },
   "source": [
    "# Cross-Encoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "1-5TWTMuLLP3"
   },
   "outputs": [],
   "source": [
    "from sentence_transformers import CrossEncoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 232,
     "referenced_widgets": [
      "333ba957c0164cc7b1367fb4e77c165f",
      "60dffc29c59743719ccbe57607b306be",
      "1c1b5ab6594246699420d15f40dcbf9a",
      "9d17552a55fc44be878dd307775ac321",
      "9e0dd06ae62747ffa2afd3603eece633",
      "cbedaac8d74e4abca2d169ac86c1a637",
      "255b200fe7844af5ae00e2db870baeca",
      "8dd323012ba14f6eb099213e75490155",
      "9234b774c856496a93449f43840cdf22",
      "9945335709b245ca8ec2442cc91e3f17",
      "f1ffd96a7aab475283cc4eeec7f51e79",
      "35a8f13d044b46839c6929f4b3c051b5",
      "47f9be3cc02742e8a4a0631e32ebef7c",
      "334ee20108d542f0adc8f90a03639ce2",
      "e90378ec97604ff7a9d210d9ab813770",
      "51a10f9e1520468abe3aa8ab11b96fe4",
      "8ab3c4817e1646e8997d3a7dbe2d8de0",
      "c4d4e21690a8406db75c681fe5a982c3",
      "d8a6c3f4dd5843808e9f892568528b2f",
      "46cd6012a4764a61bc4d4afb901adfbf",
      "e35dfa10dc3343498f7d99b99f8f9bbe",
      "06f393835dcd46bd826335e62c32de9d",
      "8e3c909019364932843a339d20f5b361",
      "18dac171c82043688a6d2f181ff675db",
      "49768866bcd04cd1a1d9a87bd52d8ece",
      "01db3797f9bf4f538502c97de09c87d0",
      "d31a76180c5049768d150c88cdb56a6d",
      "876314d86ebf4879a3f831a982d6c9a0",
      "5907a798063a4e5cb2c943a23eb82d70",
      "acce923405544520ac3173e6d98e1c1c",
      "754f2e87a56e410d961c8bb803258d22",
      "f9c9e5dd77294f47b227fceea135c663",
      "1145cfda26014c00a372cad81fd7292f",
      "5e0aa6c336094cdcbff419ace9866327",
      "bf81c8f43ac8436eaf7e4011c51a05be",
      "38cef872a51f4ef499e0fd885144c593",
      "b95e39b0d7304f6a8e8f3c1f539b5cfe",
      "7a87c8bf911f403d92563ac4b0c8e708",
      "0002e0e41c2246c8828d54ff07773cd7",
      "ff569f3b6df641d48f6657e699c32c5a",
      "e4f33c9295cf402e803f9f0ffa676894",
      "1b167f862fa44b199524107af690eaea",
      "be453dbcf0ab4bda8eb5b4586ea260df",
      "f993ac5a08e948cebb08ce7b03cb1553",
      "41feb9480c9d4766870aae759b13eb83",
      "b331725039514bdd855459d96399b6b4",
      "186c4b647c444c3a8883ad7356057d82",
      "2eee9553552c424c9c2af6a203122659",
      "00f97ae5e93b4b9c8a2875ad7261d920",
      "bb61044a9b8d4a0b8046323b1362d5c0",
      "f82665fb752e424fa74862157349de6f",
      "893ed7f5802543a1a91ad502cb4604c4",
      "7ed3ad5926fa416689ab21d83d3c4130",
      "1d89db0e3d1e44acbf306d20b8bf38fb",
      "09987e3201424e1f9958604ea336e601"
     ]
    },
    "id": "i0mlZrepRlY5",
    "outputId": "1e56d95b-710a-4b33-ffee-4e4e3326e790"
   },
   "outputs": [],
   "source": [
    "cross_encoder = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "3qe0M86ERoHJ",
    "outputId": "8d042ab6-4236-4adb-f0a8-4f8d3a7c65df"
   },
   "outputs": [],
   "source": [
    "top_4_documents"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 35
    },
    "id": "aEpEpJGHRrQD",
    "outputId": "4466a61f-3662-4d03-9068-40d5b7e8f58f"
   },
   "outputs": [],
   "source": [
    "query"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "pl0C674yRtFQ"
   },
   "outputs": [],
   "source": [
    "pairs = []\n",
    "for doc in top_4_documents:\n",
    "    pairs.append([query, doc])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "XTFyfLz5XXO8",
    "outputId": "b47d87a7-b7b7-47f5-b535-34ee99a37f10"
   },
   "outputs": [],
   "source": [
    "pairs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "9Mo5_OHVRu0x",
    "outputId": "1156480a-fecf-4491-ab6f-2ab02d7fdef6"
   },
   "outputs": [],
   "source": [
    "scores = cross_encoder.predict(pairs)\n",
    "scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "3RstDfogRwZi"
   },
   "outputs": [],
   "source": [
    "scored_docs = zip(scores, top_4_documents)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "M2feALlgXqnq",
    "outputId": "cf780c2c-41a9-419a-e922-aab20209a2b7"
   },
   "outputs": [],
   "source": [
    "scored_docs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "mPmPy-XwRy6n"
   },
   "outputs": [],
   "source": [
    "reranked_document_cross_encoder = sorted(scored_docs, reverse=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "eXb2dOvwR0YR",
    "outputId": "dc214e72-abaf-4f51-f9e7-e4ba0aad906a"
   },
   "outputs": [],
   "source": [
    "reranked_document_cross_encoder"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ZCb89yk6X600"
   },
   "source": [
    "# BM_25"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "jkxrfvbSR2cz",
    "outputId": "598a94dc-9cae-4d70-fac1-4553ccb64e66"
   },
   "outputs": [],
   "source": [
    "reranked_documents"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "L9nMXBERSroy",
    "outputId": "a7620b5f-c385-43a3-f6de-0efb5457dbf3"
   },
   "outputs": [],
   "source": [
    "!pip install cohere"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "_a4J2-TfS2vC"
   },
   "outputs": [],
   "source": [
    "import cohere"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "SdLeyOkES5OP"
   },
   "outputs": [],
   "source": [
    "co = cohere.Client(\"nbDqU1hTVxWmXGbLYI6OnYhp4Cx40MZ5hOmO5oKX\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "oG-b7zwjTJu6",
    "outputId": "383724b7-6087-4623-a061-9590f515975f"
   },
   "outputs": [],
   "source": [
    "top_4_documents"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 35
    },
    "id": "yb8ykLpRTMBk",
    "outputId": "7b160b1a-9256-406f-ddee-6e4db54de349"
   },
   "outputs": [],
   "source": [
    "query"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "FYPqN4zZS6wC"
   },
   "outputs": [],
   "source": [
    "response = co.rerank(\n",
    "    model=\"rerank-english-v3.0\",\n",
    "    query=\"Natural language processing techniques enhance keyword extraction efficiency.\",\n",
    "    documents=top_4_documents,\n",
    "    return_documents=True\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "i_PU-k1HTXbR",
    "outputId": "3657e386-83be-4fa0-a2ac-e7800c11aa31"
   },
   "outputs": [],
   "source": [
    "print(response)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 35
    },
    "id": "j6rK9-qJTaLZ",
    "outputId": "698a9024-284e-4314-c00b-13c7c5a8bfb2"
   },
   "outputs": [],
   "source": [
    "response.results[0].document.text"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "JhWpXlwsTcAr",
    "outputId": "56c8afcf-a423-480c-917d-5b1056335b1c"
   },
   "outputs": [],
   "source": [
    "response.results[0].relevance_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "XK91v711TdaV",
    "outputId": "26a032c6-07c9-47a9-d0b1-221e5edf0c2a"
   },
   "outputs": [],
   "source": [
    "for i in range(4):\n",
    "  print(f'text: {response.results[i].document.text} score: {response.results[i].relevance_score}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "vHkJZ_ODTe5a"
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "authorship_tag": "ABX9TyMiYSfyl0P/2phVKD60MU27",
   "gpuType": "T4",
   "include_colab_link": true,
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3",
   "name": "python3"
  },
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}


================================================
FILE: Advance RAG with Hybrid Search and Reranker/Hybrid_Search_and_reranking_in_RAG.ipynb
================================================
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "view-in-github"
   },
   "source": [
    "<a href=\"https://colab.research.google.com/github/sunnysavita10/Indepth-GENAI/blob/main/Hybrid_Search_and_reranking_in_RAG.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ZHlE17nUjXnp"
   },
   "source": [
    "https://s4ds.org/\n",
    "\n",
    "https://www.icdmai.org/\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "qmp_SaX69q18",
    "outputId": "63596de4-d1d9-4d78-cf94-7586f314ec44"
   },
   "outputs": [],
   "source": [
    "!pip install weaviate-client"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "qQLSw3iJ_0RX",
    "outputId": "d628e74a-a8de-42d2-ed1a-522acb9c3f51"
   },
   "outputs": [],
   "source": [
    "!pip install langchain"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "4lpn398P__vR",
    "outputId": "2f217e89-f2ad-4b53-9968-dfa0d3c857ef"
   },
   "outputs": [],
   "source": [
    "!pip install -U langchain-community"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "RSik_tYq-JRN"
   },
   "outputs": [],
   "source": [
    "import weaviate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "M5rKS1Co-22r"
   },
   "outputs": [],
   "source": [
    "WEAVIATE_CLUSTER=\"https://hybridsearch-ewd5zpr1.weaviate.network\"\n",
    "WEAVIATE_API_KEY=\"\" # Replace with your Weaviate API key"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "ovLN44VY-6tU"
   },
   "outputs": [],
   "source": [
    "WEAVIATE_URL = WEAVIATE_CLUSTER\n",
    "WEAVIATE_API_KEY = WEAVIATE_API_KEY"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Z93YcxMF_iCN"
   },
   "outputs": [],
   "source": [
    "HF_TOKEN=\"\"  # Replace with your Hugging Face API token"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "JUDJ74Ut_N-M"
   },
   "outputs": [],
   "source": [
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "YFrBhzvM--rd"
   },
   "outputs": [],
   "source": [
    "client = weaviate.Client(\n",
    "    url=WEAVIATE_URL, auth_client_secret=weaviate.AuthApiKey(WEAVIATE_API_KEY),\n",
    "    additional_headers={\n",
    "         \"X-HuggingFace-Api-Key\": HF_TOKEN\n",
    "    },\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "LQJQDj68Cy4J",
    "outputId": "ccf1aad1-8ca1-4079-b284-2f60397d0cd1"
   },
   "outputs": [],
   "source": [
    "client.is_ready()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "6ouOrLG2B9wj",
    "outputId": "3038912b-d5cb-4714-9803-6706392ca7cf"
   },
   "outputs": [],
   "source": [
    "client.schema.get()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "9zR5jAGHC3bS"
   },
   "outputs": [],
   "source": [
    "client.schema.delete_all()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "7l8nTgbRDCWt"
   },
   "outputs": [],
   "source": [
    "schema = {\n",
    "    \"classes\": [\n",
    "        {\n",
    "            \"class\": \"RAG\",\n",
    "            \"description\": \"Documents for RAG\",\n",
    "            \"vectorizer\": \"text2vec-huggingface\",\n",
    "            \"moduleConfig\": {\"text2vec-huggingface\": {\"model\": \"sentence-transformers/all-MiniLM-L6-v2\", \"type\": \"text\"}},\n",
    "            \"properties\": [\n",
    "                {\n",
    "                    \"dataType\": [\"text\"],\n",
    "                    \"description\": \"The content of the paragraph\",\n",
    "                    \"moduleConfig\": {\n",
    "                        \"text2vec-huggingface\": {\n",
    "                            \"skip\": False,\n",
    "                            \"vectorizePropertyName\": False,\n",
    "                        }\n",
    "                    },\n",
    "                    \"name\": \"content\",\n",
    "                },\n",
    "            ],\n",
    "        },\n",
    "    ]\n",
    "}\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "XxlykBOsD4oW"
   },
   "outputs": [],
   "source": [
    "client.schema.create(schema)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "boKhfW7xD8je",
    "outputId": "6dec38eb-ab67-428a-c5fa-79849de612f5"
   },
   "outputs": [],
   "source": [
    "client.schema.get()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "9fYFxszF_lTL"
   },
   "outputs": [],
   "source": [
    "from langchain.retrievers.weaviate_hybrid_search import WeaviateHybridSearchRetriever"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "xDD_FAKZ_sZK"
   },
   "outputs": [],
   "source": [
    "retriever = WeaviateHybridSearchRetriever(\n",
    "    alpha = 0.5,               # defaults to 0.5, which is equal weighting between keyword and semantic search\n",
    "    client = client,           # keyword arguments to pass to the Weaviate client\n",
    "    index_name = \"RAG\",  # The name of the index to use\n",
    "    text_key = \"content\",         # The name of the text key to use\n",
    "    attributes = [], # The attributes to return in the results\n",
    "    create_schema_if_missing=True,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "RJLYAGHbE1Z5"
   },
   "outputs": [],
   "source": [
    "model_name = \"HuggingFaceH4/zephyr-7b-beta\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "1w6ml1DsEv-q",
    "outputId": "235602d0-14da-4ebb-fd21-fe314ed872c5"
   },
   "outputs": [],
   "source": [
    "!pip install bitsandbytes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "LtJsxhOmEzWX",
    "outputId": "ceb6003d-d09d-4e19-90fe-beb540912dc7"
   },
   "outputs": [],
   "source": [
    "!pip install accelerate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "7YcsnAveEiFy"
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "from transformers import ( AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, pipeline, )\n",
    "from langchain import HuggingFacePipeline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Yflg19-qEiJs"
   },
   "outputs": [],
   "source": [
    "# function for loading 4-bit quantized model\n",
    "def load_quantized_model(model_name: str):\n",
    "    \"\"\"\n",
    "    model_name: Name or path of the model to be loaded.\n",
    "    return: Loaded quantized model.\n",
    "    \"\"\"\n",
    "    bnb_config = BitsAndBytesConfig(\n",
    "        load_in_4bit=True,\n",
    "        bnb_4bit_use_double_quant=True,\n",
    "        bnb_4bit_quant_type=\"nf4\",\n",
    "        bnb_4bit_compute_dtype=torch.bfloat16,\n",
    "        low_cpu_mem_usage=True\n",
    "    )\n",
    "\n",
    "    model = AutoModelForCausalLM.from_pretrained(\n",
    "        model_name,\n",
    "        torch_dtype=torch.bfloat16,\n",
    "        quantization_config=bnb_config,\n",
    "    )\n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Pfdzn1ukEiMd"
   },
   "outputs": [],
   "source": [
    "# initializing tokenizer\n",
    "def initialize_tokenizer(model_name: str):\n",
    "    \"\"\"\n",
    "    model_name: Name or path of the model for tokenizer initialization.\n",
    "    return: Initialized tokenizer.\n",
    "    \"\"\"\n",
    "    tokenizer = AutoTokenizer.from_pretrained(model_name, return_token_type_ids=False)\n",
    "    tokenizer.bos_token_id = 1  # Set beginning of sentence token id\n",
    "    return tokenizer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "a8UgT93sEiQK"
   },
   "outputs": [],
   "source": [
    "tokenizer = initialize_tokenizer(model_name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 104,
     "referenced_widgets": [
      "1a3922c925d243fe825c2fdffc1ac440",
      "848a9e20a5ff46329ac18f0f168a5d52",
      "3c0f9911a51648cb8be3aaf49a806575",
      "3f634bcca28549c8b922c73c7b475d91",
      "25ddfbae30f74ca6b5baf5cc1d94bcb1",
      "de412a1000a94bea8707e1cdc8d805b7",
      "65283aca47324d5b917ba33f61e2f240",
      "7a27e7b7ea6045a7a855237fd2a009e8",
      "e85f3538253c482eb76e42e6341abb83",
      "791e2040d86848d6be8fbc486e8ab8b5",
      "201266a8824041118a32f623036eb633"
     ]
    },
    "id": "Csv9lG6cErbb",
    "outputId": "1984deee-8c48-49af-bd66-9ee1d3018221"
   },
   "outputs": [],
   "source": [
    "model = load_quantized_model(model_name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 446
    },
    "id": "IplrZgxvEreX",
    "outputId": "82543b1a-a0bf-4693-e975-98fce166013b"
   },
   "outputs": [],
   "source": [
    "pipeline = pipeline(\n",
    "    \"text-generation\",\n",
    "    model=model,\n",
    "    tokenizer=tokenizer,\n",
    "    use_cache=True,\n",
    "    device_map=\"auto\",\n",
    "    #max_length=2048,\n",
    "    do_sample=True,\n",
    "    top_k=5,\n",
    "    max_new_tokens=100,\n",
    "    num_return_sequences=1,\n",
    "    eos_token_id=tokenizer.eos_token_id,\n",
    "    pad_token_id=tokenizer.pad_token_id,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Uo348jKvErhO"
   },
   "outputs": [],
   "source": [
    "llm = HuggingFacePipeline(pipeline=pipeline)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "uva-5Nkqpr8w"
   },
   "outputs": [],
   "source": [
    "doc_path=\"/content/Retrieval-Augmented-Generation-for-NLP.pdf\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "BTNRvdSNp9jC",
    "outputId": "68d151fe-ac47-4e64-9d56-7cabd3fb2c50"
   },
   "outputs": [],
   "source": [
    "!pip install pypdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "ev8_SeQIp_4A",
    "outputId": "f4dc1edd-7f8d-4d60-da77-96284597c657"
   },
   "outputs": [],
   "source": [
    "!pip install langchain_community"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "3n-7-QWyp_8x"
   },
   "outputs": [],
   "source": [
    "from langchain_community.document_loaders import PyPDFLoader"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "nhBRpl8dsHw6"
   },
   "outputs": [],
   "source": [
    "loader = PyPDFLoader(doc_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "xHegGUGssHzV"
   },
   "outputs": [],
   "source": [
    "docs = loader.load()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "gpshkBhjvLlC",
    "outputId": "6fa66ef9-f60c-4e6a-ad16-0d1464f27246"
   },
   "outputs": [],
   "source": [
    "docs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "6DNTiAvgvNYC",
    "outputId": "3bc37592-d65b-473e-ae39-ec0dd2b79c40"
   },
   "outputs": [],
   "source": [
    "docs[6]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "Ux831sq2pq3C",
    "outputId": "3ee30aa3-f465-4d02-e4ea-4a2e07b6bc69"
   },
   "outputs": [],
   "source": [
    "retriever.add_documents(docs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "jRoDhLHjsy5f",
    "outputId": "9e1b9921-2fe7-4549-dfa0-b64fef8da144"
   },
   "outputs": [],
   "source": [
    "print(retriever.invoke(\"what is RAG token?\")[0].page_content)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "WHdda33buBrS",
    "outputId": "843cffb4-caad-4033-97ce-e43c4035e3b3"
   },
   "outputs": [],
   "source": [
    "retriever.invoke(\n",
    "    \"what is RAG token?\",\n",
    "    score=True\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Vt5vaVuLEdY9"
   },
   "outputs": [],
   "source": [
    "from langchain.chains import RetrievalQA"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "HkhbVjqiMJXJ"
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "heu-l-l176Pp"
   },
   "outputs": [],
   "source": [
    "from langchain_core.prompts import ChatPromptTemplate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "RrEl6Nm87_Vi"
   },
   "outputs": [],
   "source": [
    "system_prompt = (\n",
    "    \"Use the given context to answer the question. \"\n",
    "    \"If you don't know the answer, say you don't know. \"\n",
    "    \"Use three sentence maximum and keep the answer concise. \"\n",
    "    \"Context: {context}\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Gg0TRf_Q72P6"
   },
   "outputs": [],
   "source": [
    "prompt = ChatPromptTemplate.from_messages(\n",
    "    [\n",
    "        (\"system\", system_prompt),\n",
    "        (\"human\", \"{query}\"),\n",
    "    ]\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "GNPZSFun-4Ka"
   },
   "outputs": [],
   "source": [
    "from langchain.prompts import PromptTemplate\n",
    "template = \"\"\"\n",
    "Use the following pieces of context to answer the question at the end.\n",
    "If you don't know the answer, just say that you do not have the relevant information needed to provide a verified answer, don't try to make up an answer.\n",
    "When providing an answer, aim for clarity and precision. Position yourself as a knowledgeable authority on the topic, but also be mindful to explain the information in a manner that is accessible and comprehensible to those without a technical background.\n",
    "Always say \"Do you have any more questions pertaining to this instrument?\" at the end of the answer.\n",
    "{context}\n",
    "Question: {question}\n",
    "Helpful Answer:\"\"\"\n",
    "\n",
    "prompt = PromptTemplate.from_template(template)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Q3lt9jMW8hxK"
   },
   "outputs": [],
   "source": [
    "from langchain.chains.combine_documents import create_stuff_documents_chain"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "ppRiYOIa8b6y"
   },
   "outputs": [],
   "source": [
    "question_answer_chain = create_stuff_documents_chain(llm, prompt)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "3t7fVtBaAOfq"
   },
   "outputs": [],
   "source": [
    "hybrid_chain = RetrievalQA.from_chain_type(llm=llm, chain_type=\"stuff\", retriever=retriever,)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "I0DfMLiJ6lbr",
    "outputId": "29e93eae-37ce-48b4-8c49-dd04a7195edc"
   },
   "outputs": [],
   "source": [
    "result1 = hybrid_chain.invoke(\"what is natural language processing?\")\n",
    "print(result1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "Flsjn21WMypT",
    "outputId": "3e4d6073-bfd3-4c31-b08c-d5fe399e8935"
   },
   "outputs": [],
   "source": [
    "print(result1['result'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "QhG3Krz99APy"
   },
   "outputs": [],
   "source": [
    "query=\"What is Abstractive Question Answering?\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 304
    },
    "id": "hmmRp1O_ArC9",
    "outputId": "e56e99d7-4ddf-460a-e5a7-330b968d5cf6"
   },
   "outputs": [],
   "source": [
    "response = hybrid_chain.invoke({\"query\":query})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "LZ-Id5sW-LLR"
   },
   "outputs": [],
   "source": [
    "from langchain_core.runnables import RunnableParallel, RunnablePassthrough"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "b1DvxugA-DIC"
   },
   "outputs": [],
   "source": [
    "# Set up the RAG chain\n",
    "rag_chain = (\n",
    "    {\"context\": retriever, \"question\": RunnablePassthrough()} |\n",
    "    prompt |\n",
    "    llm\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "OTU5Wycg-l9y"
   },
   "outputs": [],
   "source": [
    "query=\"what is RAG token?\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "ykAekNO_-bkZ",
    "outputId": "140e6b43-ffac-43f3-c2bd-17959f6dea91"
   },
   "outputs": [],
   "source": [
    "response=rag_chain.invoke(\"what is RAG token?\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "iqKKvHQ-_05x",
    "outputId": "a07f9be8-c605-4902-e957-7a005e296185"
   },
   "outputs": [],
   "source": [
    "print(response)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "KWe11B_3H6Yc",
    "outputId": "08ac50fc-d407-4647-d7ac-ce0b786e5dd1"
   },
   "outputs": [],
   "source": [
    "response"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "_Y6DcD3Z5lZp",
    "outputId": "f792675c-237c-4e08-9f09-ed5229d4dad5"
   },
   "outputs": [],
   "source": [
    "print(response[\"result\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "0A3hrUdwJ3pC"
   },
   "outputs": [],
   "source": [
    "from langchain.retrievers import ContextualCompressionRetriever\n",
    "from langchain.retrievers.document_compressors import CohereRerank"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "1VewE8gRKCla",
    "outputId": "48c1abc0-eb81-4bec-ada4-00c316b18120"
   },
   "outputs": [],
   "source": [
    "!pip install cohere"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "OE0vUax4J-Ij"
   },
   "outputs": [],
   "source": [
    "compressor = CohereRerank(cohere_api_key=\"\")  # Replace with your Cohere API key"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "b3Kmr4CIKG7n"
   },
   "outputs": [],
   "source": [
    "compression_retriever = ContextualCompressionRetriever(\n",
    "    base_compressor=compressor, base_retriever=retriever\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "f7m22qlCiUAb"
   },
   "outputs": [],
   "source": [
    "compressed_docs = compression_retriever.get_relevant_documents(user_query)\n",
    "# Print the relevant documents from using the embeddings and reranker\n",
    "print(compressed_docs)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "0dKqM3XbKkE4"
   },
   "outputs": [],
   "source": [
    "hybrid_chain = RetrievalQA.from_chain_type(\n",
    "    llm=llm, chain_type=\"stuff\", retriever=compression_retriever\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "2N2k_RCmKAIL",
    "outputId": "466dc508-4180-48d4-f167-fd267628dd92"
   },
   "outputs": [],
   "source": [
    "response = hybrid_chain.invoke(\"What is Abstractive Question Answering?\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "DVJxJg-bK2pg",
    "outputId": "9ee8590f-6350-4821-cb51-e497e4a020c0"
   },
   "outputs": [],
   "source": [
    "print(response.get(\"result\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "8Wa3jBEgLwXB",
    "outputId": "d5e1a29a-5969-4ff2-d147-cdd49d2f7ed0"
   },
   "outputs": [],
   "source": [
    "print(response.get(\"result\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "tcdaBC5gMCzh"
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "gpuType": "T4",
   "include_colab_link": true,
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3",
   "name": "python3"
  },
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}


================================================
FILE: Chat with Multiple Doc using Astradb and Langchain/Chat_With_Multiple_Doc(pdfs,_docs,_txt,_pptx)_using_AstraDB_and_Langchain.ipynb
================================================
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "9RDOffvrZ3F4"
   },
   "outputs": [],
   "source": [
    "!pip install langchain\n",
    "!pip install unstructured\n",
    "!pip install openai\n",
    "!pip install Cython\n",
    "!pip install tiktoken"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "i929xxKLnRgr",
    "outputId": "a3e71b8a-85a9-4dc0-c259-c19cb5039baf"
   },
   "outputs": [],
   "source": [
    "!pip install --upgrade langchain-astradb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1000
    },
    "id": "IWdY3uvRnZKn",
    "outputId": "4fadc829-460e-410d-fc7d-f4013ee62966"
   },
   "outputs": [],
   "source": [
    "!pip install langchain langchain-openai datasets pypdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "B6oJrqqRauvY"
   },
   "outputs": [],
   "source": [
    "!pip install pdf2image"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Ox_1QUszavjV"
   },
   "outputs": [],
   "source": [
    "!pip install pdfminer.six"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "fvp_dAEWayjg"
   },
   "outputs": [],
   "source": [
    "!pip install unstructured[pdf]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "gPuH-fXlnaiX"
   },
   "outputs": [],
   "source": [
    "import os\n",
    "from getpass import getpass\n",
    "\n",
    "from datasets import (\n",
    "    load_dataset,\n",
    ")\n",
    "from langchain_community.document_loaders import PyPDFLoader\n",
    "from langchain_core.documents import Document\n",
    "from langchain_core.output_parsers import StrOutputParser\n",
    "from langchain_core.prompts import ChatPromptTemplate\n",
    "from langchain_core.runnables import RunnablePassthrough\n",
    "from langchain_openai import ChatOpenAI, OpenAIEmbeddings\n",
    "from langchain_text_splitters import RecursiveCharacterTextSplitter\n",
    "from langchain.document_loaders import UnstructuredPDFLoader\n",
    "from langchain.indexes import VectorstoreIndexCreator"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Bost4y11ngS2"
   },
   "outputs": [],
   "source": [
    "import os\n",
    "from google.colab import userdata\n",
    "OPENAI_API_KEY=userdata.get('OPENAI_API_KEY')\n",
    "os.environ[\"OPENAI_API_KEY\"] = OPENAI_API_KEY\n",
    "\n",
    "embedding = OpenAIEmbeddings()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "gXD1e0iknq9m"
   },
   "outputs": [],
   "source": [
    "embedding = OpenAIEmbeddings()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "BhXC2nsaaao4"
   },
   "source": [
    "# Using Unstructured for loading Multiple Pdfs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "obMEfgOUaYoI"
   },
   "outputs": [],
   "source": [
    "root_dir=\"/content/\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "fHwmBphmaMrJ"
   },
   "outputs": [],
   "source": [
    "pdf_folder_path = f'{root_dir}/docs/'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "EXg7WYjmaMx6"
   },
   "outputs": [],
   "source": [
    "os.listdir(pdf_folder_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "gdyyz5uDbF65"
   },
   "outputs": [],
   "source": [
    "# location of the pdf file/files.\n",
    "loaders = [UnstructuredPDFLoader(os.path.join(pdf_folder_path, fn)) for fn in os.listdir(pdf_folder_path)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "cIOOjInebHHR"
   },
   "outputs": [],
   "source": [
    "loaders"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "C6sNGjHsaM05"
   },
   "outputs": [],
   "source": [
    "index = VectorstoreIndexCreator().from_loaders(loaders)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "TyONx7bRaM6q"
   },
   "outputs": [],
   "source": [
    "index.query('What is the tokenization in RAG?')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "1kCaJmvhaM9o"
   },
   "outputs": [],
   "source": [
    "index.query_with_sources('What is the tokenization in RAG?')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "2X3IRcpxbSKZ"
   },
   "source": [
    "# Pypdf loader with Multiple Pdfs."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "btAgdVVknvyd"
   },
   "outputs": [],
   "source": [
    "from langchain_astradb import AstraDBVectorStore"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "DgLFd0Kd2nIO"
   },
   "outputs": [],
   "source": [
    "from langchain_astradb import AstraDBVectorStore\n",
    "ASTRA_DB_API_ENDPOINT=\"https://d2357619-8f04-4cfd-bc3a-16e410893ba3-us-east-2.apps.astra.datastax.com\"\n",
    "ASTRA_DB_APPLICATION_TOKEN=\"ASTRA_TOKEN_REMOVEDhTmlZSqmAOUHSWZaeNqzEDOR:1128826e960e49c2508b3014ae7fa40e6b5d0490d8565702a30b4ea338083a4a\"\n",
    "ASTRA_DB_KEYSPACE=\"default_keyspace\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "fLh8RfMwaNLM"
   },
   "outputs": [],
   "source": [
    "root_dir=\"/content/\"\n",
    "pdf_folder_path = f'{root_dir}/data/'\n",
    "pdfs=os.listdir(pdf_folder_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "Quw8romYBEpV",
    "outputId": "d3a645f6-8cce-4d4a-b0c5-3d35f2ae51ae"
   },
   "outputs": [],
   "source": [
    "pdfs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "iGWaBKx7BSiP"
   },
   "outputs": [],
   "source": [
    "data=PyPDFLoader(\"/content/data/MachineTranslationwithAttention.pdf\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "Z4Y6bmItBhbB",
    "outputId": "0ba46137-2b3e-42b7-90ae-b9afefcad5b4"
   },
   "outputs": [],
   "source": [
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "u280YuAtCCzX"
   },
   "outputs": [],
   "source": [
    "splitter = RecursiveCharacterTextSplitter(chunk_size=512, chunk_overlap=64)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "NRH8dsh5B-n9",
    "outputId": "c092b97a-84e9-4605-bf8b-010ee09482c8"
   },
   "outputs": [],
   "source": [
    "data.load_and_split(text_splitter=splitter)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "hK6CgClrbbS5"
   },
   "outputs": [],
   "source": [
    "docs=[]\n",
    "for pdf in pdfs:\n",
    "  data=PyPDFLoader(f\"/content/data/{pdf}\")\n",
    "  docs.append(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 158
    },
    "id": "agk6IZLabd3p",
    "outputId": "ffdbaa2b-58a4-406f-c781-a9a9fa2b20c7"
   },
   "outputs": [],
   "source": [
    "\n",
    "docs_from_pdf = docs.load_and_split(text_splitter=splitter)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "oNllVkvIbgKM"
   },
   "outputs": [],
   "source": [
    "print(f\"Documents from PDF: {len(docs_from_pdf)}.\")\n",
    "inserted_ids_from_pdf = vstore.add_documents(docs_from_pdf)\n",
    "print(f\"Inserted {len(inserted_ids_from_pdf)} documents.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "n4G743wn3i9F"
   },
   "outputs": [],
   "source": [
    "vstore = AstraDBVectorStore(\n",
    "    embedding=embedding,\n",
    "    collection_name=\"astra_vector_demo\",\n",
    "    api_endpoint=ASTRA_DB_API_ENDPOINT,\n",
    "    token=ASTRA_DB_APPLICATION_TOKEN,\n",
    "    namespace=ASTRA_DB_KEYSPACE,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "cfzD7a8naIEK"
   },
   "outputs": [],
   "source": [
    "retriever = vstore.as_retriever(search_kwargs={\"k\": 3})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "9Y2EFU9_aINQ"
   },
   "outputs": [],
   "source": [
    "prompt_template = \"\"\"\n",
    "You are a philosopher that draws inspiration from great thinkers of the past\n",
    "to craft well-thought answers to user questions. Use the provided context as the basis\n",
    "for your answers and do not make up new reasoning paths - just mix-and-match what you are given.\n",
    "Your answers must be concise and to the point, and refrain from answering about other topics than philosophy.\n",
    "\n",
    "CONTEXT:\n",
    "{context}\n",
    "\n",
    "QUESTION: {question}\n",
    "\n",
    "YOUR ANSWER:\"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Nx0rM706aIPo"
   },
   "outputs": [],
   "source": [
    "prompt_template = ChatPromptTemplate.from_template(prompt_template)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "tRg2VFehaISq"
   },
   "outputs": [],
   "source": [
    "llm = ChatOpenAI()\n",
    "\n",
    "chain = (\n",
    "    {\"context\": retriever, \"question\": RunnablePassthrough()}\n",
    "    | philo_prompt\n",
    "    | llm\n",
    "    | StrOutputParser()\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "D9pg2syhbyHI"
   },
   "outputs": [],
   "source": [
    "chain.invoke(\"How does Russel elaborate on Peirce's idea of the security blanket?\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "v2b452jhb6mh"
   },
   "source": [
    "# Directory loders(Chat With Multiple Doc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "tZS1rEQB7YOP"
   },
   "outputs": [],
   "source": [
    "!rm -rf \"/content/docs/.ipynb_checkpoints\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "1yqDtZ1M3z8U",
    "outputId": "1602047a-f75d-4544-e49d-d1ea5405e3f6"
   },
   "outputs": [],
   "source": [
    "%pip install langchain_community"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "1UuNkzrU5Q5q",
    "outputId": "3f4e6178-064f-406e-cf4a-909229fb3da6"
   },
   "outputs": [],
   "source": [
    "!pip install unstructured"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1000
    },
    "id": "ksK7gi4p5d1l",
    "outputId": "dc8ba9fb-b8fd-46cc-b38c-ebbafca693c7"
   },
   "outputs": [],
   "source": [
    "!pip install \"unstructured[pdf]\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "3uk7ezbu7OQp",
    "outputId": "1bbf4d20-f90d-4247-b38f-bbab19599190"
   },
   "outputs": [],
   "source": [
    "!sudo apt-get update"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "nkesIO_m7P9P",
    "outputId": "0c321129-5b04-4a63-fded-445eab6bb4a2"
   },
   "outputs": [],
   "source": [
    "!sudo apt-get install poppler-utils"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "o9OycnSq7Tt9",
    "outputId": "689a781d-dfb9-4c9d-d386-9f17804a3006"
   },
   "outputs": [],
   "source": [
    "!sudo apt-get install libleptonica-dev tesseract-ocr libtesseract-dev python3-pil tesseract-ocr-eng tesseract-ocr-script-latn\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "TMP99Q_y7XWl",
    "outputId": "38690471-e581-4be4-d99c-9e5f0d07f120"
   },
   "outputs": [],
   "source": [
    "!pip install unstructured-pytesseract\n",
    "!pip install tesseract-ocr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "RruMFEmtMhVw",
    "outputId": "12220b5c-ef1f-451d-997d-9283aa4cbb84"
   },
   "outputs": [],
   "source": [
    "!pip install \"unstructured[pptx]\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "DR8YmEFX_bXo",
    "outputId": "6fbcfd3f-9d50-44b7-c210-7b2bc74abb06"
   },
   "outputs": [],
   "source": [
    "!pip install langchain_astradb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "4rN3g_sxPLjN",
    "outputId": "93096ee0-bcca-4233-a170-ee4a68ad727e"
   },
   "outputs": [],
   "source": [
    "!pip install langchain langchain-openai datasets pypdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "AjAFSJYlDpkA"
   },
   "outputs": [],
   "source": [
    "from langchain_text_splitters import RecursiveCharacterTextSplitter"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "nBVPhAdPDNE3"
   },
   "outputs": [],
   "source": [
    "from langchain_community.document_loaders import DirectoryLoader\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "GYA9S1oaU1g3"
   },
   "outputs": [],
   "source": [
    "loader = DirectoryLoader('/content/docs')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "icOls_EgDQy_"
   },
   "outputs": [],
   "source": [
    "splitter = RecursiveCharacterTextSplitter(chunk_size=512, chunk_overlap=64)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 304,
     "referenced_widgets": [
      "8e035199e06b40eabbe34b3852c53034",
      "75777df2725d4509adaddc144ee52baa",
      "61c802dc2e7a486e91ed26b43a579a65",
      "9123e7f5130a4f498130e117726e8430",
      "2ed0f1ed939949518905dbcd850f9ee8",
      "73d7a2d3325a469c89c275c0d6912551",
      "7cf8bdbebd52448bb8444099cfb70886",
      "0fb6312ab0b94e92a8989059794038ce",
      "bcc6d619f2ce49b6bb2ad45099d229a2",
      "80b344425b2e46868c6988d0b6bf0a60",
      "f12e15d72d634c8ba643a468f4d76735",
      "4e840cdb44a44a99b851cbe1673db6b5",
      "4f02de36c68c4a12978129ce6856a104",
      "c2f04856ddcb4fd1bbc1ead4274ce0aa",
      "bc28ccf6311547daaa88e14861fc653d",
      "8e12ba7b025e42b09bff0115dd840e49",
      "b4207375ca9442d9b88cbaa5810f5041",
      "51fb8e49361e48479028d3112a4bcd90",
      "6216f9fd90b44c97bc251ad1b554047d",
      "64e9f9d5e7504dbea334234d4788089d",
      "0b912a2a673f4daea2da687bb94547c6",
      "e4d2f8a121c54c49b681a767ac1fc3b1",
      "8adde71b0962495c80261b2dd1d4abf3",
      "9596bb6c2fa149b4945ab2d10e207e84",
      "bcd1278264fa44518f09164105271b22",
      "93edc57d3b134be88f4b5d0fdf12ebbc",
      "88c95ef5ee33412c8141ffc7c11c702e",
      "af1fea75b14f4b0a936513c4f3074fbc",
      "3f9760917bcf4e249f16f34a2361b73c",
      "037f7836ab6f465caf2b87dc5b7aef63",
      "829923a46f24479ea648945c677d9e3a",
      "db4ea8e3882c493cb980e9dfd8151a84",
      "a67ed49aae1544e3b5a9b141d1c5dd3e",
      "9d9f277060934802932d690307fc9685",
      "1a3c537f212645fda454ffa103aac256",
      "1646ce29bbb5425a9262a009f7fa2a13",
      "3b8846ae905f4b7683e4f5e422e21f75",
      "5b9853b590fe415fb559ae396a7bc3c7",
      "f63494b47dbe412cb82f29a350cbbbc2",
      "12d2ab6a477e4b94a83dae2651c6fb4b",
      "d7e400593ed24394a24fb07c069b83c9",
      "bc2a5e16203d4c83a976cd85e9622467",
      "5b38a4d2ed5b4078b13b8397d6439ae8",
      "c38f90a27964497db1c6f500510b4c03"
     ]
    },
    "id": "gXfYNkYx5Lx7",
    "outputId": "7097f252-1c7e-45e2-bf13-044263056b27"
   },
   "outputs": [],
   "source": [
    "docs = loader.load_and_split(text_splitter=splitter)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "uaBLlukoN1in",
    "outputId": "91fbb728-e2b2-4eb1-e6e1-25531fcb53a9"
   },
   "outputs": [],
   "source": [
    "len(docs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "irbe3D7R_J_n"
   },
   "outputs": [],
   "source": [
    "import os\n",
    "from langchain_core.documents import Document\n",
    "from langchain_community.document_loaders import PyPDFLoader\n",
    "\n",
    "from langchain_core.output_parsers import StrOutputParser\n",
    "from langchain_core.prompts import ChatPromptTemplate\n",
    "from langchain_core.runnables import RunnablePassthrough\n",
    "from langchain_openai import ChatOpenAI, OpenAIEmbeddings\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "YoyE7fpl_pDB"
   },
   "outputs": [],
   "source": [
    "import os\n",
    "from google.colab import userdata\n",
    "OPENAI_API_KEY=userdata.get('OPENAI_API_KEY')\n",
    "os.environ[\"OPENAI_API_KEY\"] = OPENAI_API_KEY"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "mVnI4Sc5_pxr"
   },
   "outputs": [],
   "source": [
    "embedding = OpenAIEmbeddings()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "8TCV0FA2YwxY"
   },
   "outputs": [],
   "source": [
    "from langchain_astradb import AstraDBVectorStore\n",
    "from langchain.indexes import VectorstoreIndexCreator"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "KLWvXEYS_WGA"
   },
   "outputs": [],
   "source": [
    "ASTRA_DB_API_ENDPOINT=\"https://79b63042-b3d1-4163-b10a-75c9979ebf59-us-east-2.apps.astra.datastax.com\"\n",
    "ASTRA_DB_APPLICATION_TOKEN=\"ASTRA_TOKEN_REMOVEDRyuexWdwLrGymMZnubGtbuZq:b7e36eae7d7f021e542f9f8b541a4ccdd7a5705e077b18887579f56bb0955ad4\"\n",
    "ASTRA_DB_KEYSPACE=\"default_keyspace\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "qwf9jP-mFsho"
   },
   "outputs": [],
   "source": [
    "vstore = AstraDBVectorStore(\n",
    "    embedding=embedding,\n",
    "    collection_name=\"multidoc_vector\",\n",
    "    api_endpoint=ASTRA_DB_API_ENDPOINT,\n",
    "    token=ASTRA_DB_APPLICATION_TOKEN,\n",
    "    namespace=ASTRA_DB_KEYSPACE,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "PB0OTyiPZYtj"
   },
   "outputs": [],
   "source": [
    "inserted_ids = vstore.add_documents(docs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "MCZF7rhmOEBQ",
    "outputId": "3f41cd26-3df0-4d85-859e-a1815abaf89e"
   },
   "outputs": [],
   "source": [
    "print(f\"\\nInserted {len(inserted_ids)} documents.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "U8IkQRVzF9pP"
   },
   "outputs": [],
   "source": [
    "prompt_template = \"\"\"\n",
    "You are an AI philosopher drawing insights from the roadmap of \"rag,\" \"llama3,\" and \"genai.\"\n",
    "Craft thoughtful answers based on this roadmap, mixing and matching existing paths.\n",
    "Your responses should be concise and strictly related to the provided context.\n",
    "\n",
    "ROADMAP CONTEXT:\n",
    "{context}\n",
    "\n",
    "QUESTION: {question}\n",
    "\n",
    "YOUR ANSWER:\"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "DQp4n2tCG-F_"
   },
   "outputs": [],
   "source": [
    "prompt_template = ChatPromptTemplate.from_template(prompt_template)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "HLTlpaHDGg6n"
   },
   "outputs": [],
   "source": [
    "retriever = vstore.as_retriever(search_kwargs={\"k\": 3})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "QdvsgC2UG2F4",
    "outputId": "82af6575-982b-4b13-efe5-c35b6e23d109"
   },
   "outputs": [],
   "source": [
    "retriever"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "jp8EyMrWGxUx"
   },
   "outputs": [],
   "source": [
    "llm = ChatOpenAI()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "7HITJ2t3GtNf"
   },
   "outputs": [],
   "source": [
    "chain = (\n",
    "    {\"context\": retriever, \"question\": RunnablePassthrough()}\n",
    "    | prompt_template\n",
    "    | llm\n",
    "    | StrOutputParser()\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 87
    },
    "id": "uYnIVzpTcauK",
    "outputId": "fdf2ab30-f628-4b8b-d02e-5c8140c8d701"
   },
   "outputs": [],
   "source": [
    "chain.invoke(\"can you tell me the roadmap of generative ai?\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 87
    },
    "id": "jVag171QaHi2",
    "outputId": "b99cd96e-c72d-4d74-9f71-c1801cbd76ba"
   },
   "outputs": [],
   "source": [
    "chain.invoke(\"what is a llama can you tell me some important point on top of it.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "M0NfhTCIaRMF"
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "gpuType": "T4",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3",
   "name": "python3"
  },
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}


================================================
FILE: Child_to_Parent_Retrieval.ipynb
================================================
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "view-in-github"
   },
   "source": [
    "<a href=\"https://colab.research.google.com/github/sunnysavita10/Generative-AI-Indepth-Basic-to-Advance/blob/main/Child_to_Parent_Retrieval.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "o7u2h6FLqlhE"
   },
   "source": [
    "![image.png](data:image/png;base64,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
Download .txt
gitextract_kzntgr93/

├── Access_APIs_Using_Langchain/
│   ├── LangChain_Complete_Course.ipynb
│   └── requirements.txt
├── Advance RAG Hybrid Search/
│   └── Hybrid_Search_in_RAG.ipynb
├── Advance RAG Reranking from Scratch/
│   └── Reranking_from_Scratch.ipynb
├── Advance RAG with Hybrid Search and Reranker/
│   └── Hybrid_Search_and_reranking_in_RAG.ipynb
├── Chat with Multiple Doc using Astradb and Langchain/
│   └── Chat_With_Multiple_Doc(pdfs,_docs,_txt,_pptx)_using_AstraDB_and_Langchain.ipynb
├── Child_to_Parent_Retrieval.ipynb
├── ConversationEntityMemory.ipynb
├── Conversational_Summary_Memory.ipynb
├── FlashRerankPractical.ipynb
├── Generative AI Dataset/
│   ├── llama3.txt
│   └── state_of_the_union.txt
├── Generative AI Interview Questions/
│   └── Generative_AI_Interview_Questions.docx
├── Google Gemini API with Python/
│   └── GeminiAPI_With_Python.ipynb
├── LCEL(Langchain_Expression_Language).ipynb
├── Langchain_memory_classes.ipynb
├── MergerRetriever_and_LongContextReorder.ipynb
├── MongoDB with Pinecone/
│   ├── Mongodb_with_Pinecone_Realtime_RAG_Pipeline_yt.ipynb
│   └── Mongodb_with_Pinecone_Realtime_RAG_Pipeline_yt_Part2.ipynb
├── MultiModal RAG/
│   ├── Extract_Image,Table,Text_from_Document_MultiModal_Summrizer_AAG_App_YT.ipynb
│   ├── Extract_Image,Table,Text_from_Document_MultiModal_Summrizer_RAG_App.ipynb
│   ├── MultiModal RAG using Vertex AI AstraDB(Cassandra) & Langchain.ipynb
│   ├── MultiModal_RAG_with_llamaIndex_and_LanceDB.ipynb
│   └── Multimodal_RAG_with_Gemini_Langchain_and_Google_AI_Studio_Yt.ipynb
├── MultiModal RAG with Vertex AI/
│   └── MultiModal RAG using Vertex AI AstraDB(Cassandra) & Langchain.ipynb
├── Multilingual AI based Voice Assistant/
│   ├── .gitignore
│   ├── README.md
│   ├── app.py
│   ├── genai_AI_Project.egg-info/
│   │   ├── PKG-INFO
│   │   ├── SOURCES.txt
│   │   ├── dependency_links.txt
│   │   └── top_level.txt
│   ├── multilingual_assistant.egg-info/
│   │   ├── PKG-INFO
│   │   ├── SOURCES.txt
│   │   ├── dependency_links.txt
│   │   ├── requires.txt
│   │   └── top_level.txt
│   ├── requirements.txt
│   ├── research/
│   │   └── trials.ipynb
│   ├── setup.py
│   ├── src/
│   │   ├── __init__.py
│   │   └── helper.py
│   └── template.py
├── QA_With_Doc_Using_LlamaIndex_Gemini/
│   ├── Data/
│   │   └── MLDOC.txt
│   ├── Exception.py
│   ├── Experiments/
│   │   ├── ChatWithDoc.ipynb
│   │   └── storage/
│   │       ├── default__vector_store.json
│   │       ├── docstore.json
│   │       ├── graph_store.json
│   │       ├── image__vector_store.json
│   │       └── index_store.json
│   ├── Logger.py
│   ├── QAWithPDF/
│   │   ├── __init__.py
│   │   ├── data_ingestion.py
│   │   ├── embeddings.py
│   │   └── model_api.py
│   ├── StreamlitApp.py
│   ├── Template.py
│   ├── logs/
│   │   ├── 02_15_2024_16_21_43.log
│   │   ├── 02_15_2024_16_22_49.log
│   │   ├── 02_15_2024_16_23_52.log
│   │   ├── 02_15_2024_16_26_42.log
│   │   ├── 02_15_2024_16_27_41.log
│   │   ├── 02_15_2024_16_45_53.log
│   │   └── 02_15_2024_16_58_10.log
│   ├── requirements.txt
│   ├── setup.py
│   └── storage/
│       ├── default__vector_store.json
│       ├── docstore.json
│       ├── graph_store.json
│       ├── image__vector_store.json
│       └── index_store.json
├── RAG App using Haystack & OpenAI/
│   └── RAG_Application_Using_Haystack_and_OpenAI.ipynb
├── RAG App using LLAMAINDEX & MistralAI/
│   └── RAG_Application_Using_LlamaIndex_and_Mistral_AI.ipynb
├── RAG App using Langchain Mistral Weaviate/
│   └── RAG_Application_Using_LangChain_Mistral_and_Weviate.ipynb
├── RAG App using Langchain OpenAI FAISS/
│   ├── RAG_Application_using_Langchain_OpenAI_API_and_FAISS.ipynb
│   └── state_of_the_union.txt
├── RAG App with Mongo Vector Search & Gemma/
│   └── rag_with_huggingface_and_mongodb.ipynb
├── RAG Pipeline from Scratch/
│   └── RAG_Implementation_from _Scartch.ipynb
├── RAG_Fusion.ipynb
├── RAG_With_Knowledge_graph(Neo4j).ipynb
├── RAG_with_LLAMA3_1.ipynb
├── README.md
├── Roadmap of Generative AI/
│   └── Generative_AI_Roadmap.pptx
├── basic_retrieval_and_contextual_compression_retrieval.ipynb
└── self_query_retrieval.ipynb
Download .txt
SYMBOL INDEX (11 symbols across 7 files)

FILE: Multilingual AI based Voice Assistant/app.py
  function main (line 5) | def main():

FILE: Multilingual AI based Voice Assistant/src/helper.py
  function voice_input (line 15) | def voice_input():
  function text_to_speech (line 31) | def text_to_speech(text):
  function llm_model_object (line 37) | def llm_model_object(user_text):

FILE: QA_With_Doc_Using_LlamaIndex_Gemini/Exception.py
  class customexception (line 4) | class customexception(Exception):
    method __init__ (line 6) | def __init__(self,error_message,error_details:sys):
    method __str__ (line 14) | def __str__(self):

FILE: QA_With_Doc_Using_LlamaIndex_Gemini/QAWithPDF/data_ingestion.py
  function load_data (line 6) | def load_data(data):

FILE: QA_With_Doc_Using_LlamaIndex_Gemini/QAWithPDF/embeddings.py
  function download_gemini_embedding (line 13) | def download_gemini_embedding(model,document):

FILE: QA_With_Doc_Using_LlamaIndex_Gemini/QAWithPDF/model_api.py
  function load_model (line 17) | def load_model():

FILE: QA_With_Doc_Using_LlamaIndex_Gemini/StreamlitApp.py
  function main (line 7) | def main():
Condensed preview — 86 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,214K chars).
[
  {
    "path": "Access_APIs_Using_Langchain/LangChain_Complete_Course.ipynb",
    "chars": 4996,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"id\": \"0\",\n   \"metadata\": {},\n   \"outputs\": [],"
  },
  {
    "path": "Access_APIs_Using_Langchain/requirements.txt",
    "chars": 55,
    "preview": "langchain\nopenai\nhuggingface_hub\nlangchain_google_genai"
  },
  {
    "path": "Advance RAG Hybrid Search/Hybrid_Search_in_RAG.ipynb",
    "chars": 30870,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"colab_type\": \"text\",\n    \"id\": \"view-in-github\"\n   }"
  },
  {
    "path": "Advance RAG Reranking from Scratch/Reranking_from_Scratch.ipynb",
    "chars": 30492,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"colab_type\": \"text\",\n    \"id\": \"view-in-github\"\n   }"
  },
  {
    "path": "Advance RAG with Hybrid Search and Reranker/Hybrid_Search_and_reranking_in_RAG.ipynb",
    "chars": 23100,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"colab_type\": \"text\",\n    \"id\": \"view-in-github\"\n   }"
  },
  {
    "path": "Chat with Multiple Doc using Astradb and Langchain/Chat_With_Multiple_Doc(pdfs,_docs,_txt,_pptx)_using_AstraDB_and_Langchain.ipynb",
    "chars": 23006,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"id\": \"9RDOffvrZ3F4\"\n   },\n  "
  },
  {
    "path": "Child_to_Parent_Retrieval.ipynb",
    "chars": 131045,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"colab_type\": \"text\",\n    \"id\": \"view-in-github\"\n   }"
  },
  {
    "path": "ConversationEntityMemory.ipynb",
    "chars": 15880,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"colab_type\": \"text\",\n    \"id\": \"view-in-github\"\n   }"
  },
  {
    "path": "Conversational_Summary_Memory.ipynb",
    "chars": 26354,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"colab_type\": \"text\",\n    \"id\": \"view-in-github\"\n   }"
  },
  {
    "path": "FlashRerankPractical.ipynb",
    "chars": 15763,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"colab_type\": \"text\",\n    \"id\": \"view-in-github\"\n   }"
  },
  {
    "path": "Generative AI Dataset/llama3.txt",
    "chars": 1552,
    "preview": "Llama (Large Language Model Meta AI) is a family of autoregressive large language models released by Meta AI starting in"
  },
  {
    "path": "Generative AI Dataset/state_of_the_union.txt",
    "chars": 38540,
    "preview": "Madam Speaker, Madam Vice President, our First Lady and Second Gentleman. Members of Congress and the Cabinet. Justices "
  },
  {
    "path": "Google Gemini API with Python/GeminiAPI_With_Python.ipynb",
    "chars": 25359,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"id\": \"MAVEZiWFTGXH\"\n   },\n   \"source\": [\n    \"\\n\",\n "
  },
  {
    "path": "LCEL(Langchain_Expression_Language).ipynb",
    "chars": 32835,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"colab_type\": \"text\",\n    \"id\": \"view-in-github\"\n   }"
  },
  {
    "path": "Langchain_memory_classes.ipynb",
    "chars": 20130,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"colab_type\": \"text\",\n    \"id\": \"view-in-github\"\n   }"
  },
  {
    "path": "MergerRetriever_and_LongContextReorder.ipynb",
    "chars": 30590,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"colab_type\": \"text\",\n    \"id\": \"view-in-github\"\n   }"
  },
  {
    "path": "MongoDB with Pinecone/Mongodb_with_Pinecone_Realtime_RAG_Pipeline_yt.ipynb",
    "chars": 11737,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"colab\": {\n     \"base_uri\": \""
  },
  {
    "path": "MongoDB with Pinecone/Mongodb_with_Pinecone_Realtime_RAG_Pipeline_yt_Part2.ipynb",
    "chars": 18779,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"colab\": {\n     \"base_uri\": \""
  },
  {
    "path": "MultiModal RAG/Extract_Image,Table,Text_from_Document_MultiModal_Summrizer_AAG_App_YT.ipynb",
    "chars": 17633,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"id\": \"AUeScs9rB6Nk\"\n   },\n   \"source\": [\n    \"# Real"
  },
  {
    "path": "MultiModal RAG/Extract_Image,Table,Text_from_Document_MultiModal_Summrizer_RAG_App.ipynb",
    "chars": 152615,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"colab\": {\n     \"base_uri\": \""
  },
  {
    "path": "MultiModal RAG/MultiModal RAG using Vertex AI AstraDB(Cassandra) & Langchain.ipynb",
    "chars": 23457,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"0\",\n   \"metadata\": {\n    \"colab_type\": \"text\",\n    \"id\": \"view-i"
  },
  {
    "path": "MultiModal RAG/MultiModal_RAG_with_llamaIndex_and_LanceDB.ipynb",
    "chars": 21353,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"id\": \"Yn8jv85EiZn_\"\n   },\n   \"source\": [\n    \"# **Mu"
  },
  {
    "path": "MultiModal RAG/Multimodal_RAG_with_Gemini_Langchain_and_Google_AI_Studio_Yt.ipynb",
    "chars": 13975,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"colab\": {\n     \"base_uri\": \""
  },
  {
    "path": "MultiModal RAG with Vertex AI/MultiModal RAG using Vertex AI AstraDB(Cassandra) & Langchain.ipynb",
    "chars": 23544,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"0\",\n   \"metadata\": {\n    \"colab_type\": \"text\",\n    \"id\": \"view-i"
  },
  {
    "path": "Multilingual AI based Voice Assistant/.gitignore",
    "chars": 22,
    "preview": "multilingual\n/.env\nenv"
  },
  {
    "path": "Multilingual AI based Voice Assistant/README.md",
    "chars": 709,
    "preview": "# Multilingual Assistant \n\n\n# How to run?\n### STEPS:\n\nClone the repository\n\n```bash\nProject repo: https://github.com/\n``"
  },
  {
    "path": "Multilingual AI based Voice Assistant/app.py",
    "chars": 848,
    "preview": "import streamlit as st\nfrom src.helper import voice_input, llm_model_object, text_to_speech\n\n\ndef main():\n    st.title(\""
  },
  {
    "path": "Multilingual AI based Voice Assistant/genai_AI_Project.egg-info/PKG-INFO",
    "chars": 117,
    "preview": "Metadata-Version: 2.1\nName: genai-AI-Project\nVersion: 0.0.0\nAuthor: sunny savita\nAuthor-email: sunnysavita@gmail.com\n"
  },
  {
    "path": "Multilingual AI based Voice Assistant/genai_AI_Project.egg-info/SOURCES.txt",
    "chars": 198,
    "preview": "setup.py\ngenai_AI_Project.egg-info/PKG-INFO\ngenai_AI_Project.egg-info/SOURCES.txt\ngenai_AI_Project.egg-info/dependency_l"
  },
  {
    "path": "Multilingual AI based Voice Assistant/genai_AI_Project.egg-info/dependency_links.txt",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "Multilingual AI based Voice Assistant/genai_AI_Project.egg-info/top_level.txt",
    "chars": 4,
    "preview": "src\n"
  },
  {
    "path": "Multilingual AI based Voice Assistant/multilingual_assistant.egg-info/PKG-INFO",
    "chars": 305,
    "preview": "Metadata-Version: 2.1\nName: multilingual-assistant\nVersion: 0.0.1\nAuthor: sunny\nAuthor-email: sunny.savita@ineuron.ai\nRe"
  },
  {
    "path": "Multilingual AI based Voice Assistant/multilingual_assistant.egg-info/SOURCES.txt",
    "chars": 277,
    "preview": "README.md\nsetup.py\nmultilingual_assistant.egg-info/PKG-INFO\nmultilingual_assistant.egg-info/SOURCES.txt\nmultilingual_ass"
  },
  {
    "path": "Multilingual AI based Voice Assistant/multilingual_assistant.egg-info/dependency_links.txt",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "Multilingual AI based Voice Assistant/multilingual_assistant.egg-info/requires.txt",
    "chars": 82,
    "preview": "SpeechRecognition\npipwin\npyaudio\ngTTS\ngoogle-generativeai\npython-dotenv\nstreamlit\n"
  },
  {
    "path": "Multilingual AI based Voice Assistant/multilingual_assistant.egg-info/top_level.txt",
    "chars": 4,
    "preview": "src\n"
  },
  {
    "path": "Multilingual AI based Voice Assistant/requirements.txt",
    "chars": 87,
    "preview": "SpeechRecognition\npipwin\npyaudio\ngTTS\ngoogle-generativeai\npython-dotenv\nstreamlit\n\n-e ."
  },
  {
    "path": "Multilingual AI based Voice Assistant/research/trials.ipynb",
    "chars": 5824,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n "
  },
  {
    "path": "Multilingual AI based Voice Assistant/setup.py",
    "chars": 322,
    "preview": "from setuptools import find_packages, setup\n\nsetup(\n    name=\"multilingual assistant\",\n    version=\"0.0.1\",\n    author=\""
  },
  {
    "path": "Multilingual AI based Voice Assistant/src/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "Multilingual AI based Voice Assistant/src/helper.py",
    "chars": 1170,
    "preview": "import speech_recognition as sr\nimport google.generativeai as genai\nfrom dotenv import load_dotenv\nimport os\nfrom gtts i"
  },
  {
    "path": "Multilingual AI based Voice Assistant/template.py",
    "chars": 805,
    "preview": "import os\nimport logging\nfrom pathlib import Path\n\nlogging.basicConfig(level=logging.INFO, format='[%(asctime)s]: %(mess"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/Data/MLDOC.txt",
    "chars": 21888,
    "preview": "What is machine learning?\nMachine learning is a branch of artificial intelligence (AI) and computer science which\nfocuse"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/Exception.py",
    "chars": 630,
    "preview": "import sys\n\n\nclass customexception(Exception):\n\n    def __init__(self,error_message,error_details:sys):\n        self.err"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/Experiments/ChatWithDoc.ipynb",
    "chars": 58882,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\":"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/Experiments/storage/default__vector_store.json",
    "chars": 65019,
    "preview": "{\"embedding_dict\": {\"35be54dc-30ad-446a-8ceb-55211de07da6\": [-0.002203774, -0.060024295, -0.04713062, -0.0013296342, 0.0"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/Experiments/storage/docstore.json",
    "chars": 34933,
    "preview": "{\"docstore/metadata\": {\"e853545c-0ca1-4b7e-9681-02919ad26522\": {\"doc_hash\": \"1adc40efe6dabc0a3eddca0cbda5a4c97bb0422c871"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/Experiments/storage/graph_store.json",
    "chars": 18,
    "preview": "{\"graph_dict\": {}}"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/Experiments/storage/image__vector_store.json",
    "chars": 72,
    "preview": "{\"embedding_dict\": {}, \"text_id_to_ref_doc_id\": {}, \"metadata_dict\": {}}"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/Experiments/storage/index_store.json",
    "chars": 751,
    "preview": "{\"index_store/data\": {\"f7d0f6e4-6ef2-489e-b7a2-4e5e22a937b6\": {\"__type__\": \"vector_store\", \"__data__\": \"{\\\"index_id\\\": \\"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/Logger.py",
    "chars": 526,
    "preview": "import logging\nimport os\nfrom datetime import datetime\n\nLOG_FILE=f\"{datetime.now().strftime('%m_%d_%Y_%H_%M_%S')}.log\"\n\n"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/QAWithPDF/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/QAWithPDF/data_ingestion.py",
    "chars": 732,
    "preview": "from llama_index.core import SimpleDirectoryReader\nimport sys\nfrom Exception import customexception\nfrom Logger import l"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/QAWithPDF/embeddings.py",
    "chars": 1210,
    "preview": "from llama_index.core import VectorStoreIndex\nfrom llama_index.core import ServiceContext\nfrom llama_index.core import S"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/QAWithPDF/model_api.py",
    "chars": 713,
    "preview": "import os\nfrom dotenv import load_dotenv\nimport sys\n\nfrom llama_index.llms.gemini import Gemini\nfrom IPython.display imp"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/StreamlitApp.py",
    "chars": 881,
    "preview": "import streamlit as st\nfrom QAWithPDF.data_ingestion import load_data\nfrom QAWithPDF.embeddings import download_gemini_e"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/Template.py",
    "chars": 719,
    "preview": "import os\nfrom pathlib import Path\nimport logging\n\n\nlist_of_files=[\n    \"QAWithPDF/__init__.py\",\n    \"QAWithPDF/helper.p"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/logs/02_15_2024_16_21_43.log",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/logs/02_15_2024_16_22_49.log",
    "chars": 139,
    "preview": "[2024-02-15 16:23:21,778] 17 root - INFO - data loading started...\n[2024-02-15 16:23:22,114] 23 root - INFO - exception "
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/logs/02_15_2024_16_23_52.log",
    "chars": 268,
    "preview": "[2024-02-15 16:24:13,493] 17 root - INFO - data loading started...\n[2024-02-15 16:24:13,796] 20 root - INFO - data loadi"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/logs/02_15_2024_16_26_42.log",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/logs/02_15_2024_16_27_41.log",
    "chars": 2680,
    "preview": "[2024-02-15 16:28:32,771] 17 root - INFO - data loading started...\n[2024-02-15 16:28:33,067] 20 root - INFO - data loadi"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/logs/02_15_2024_16_45_53.log",
    "chars": 268,
    "preview": "[2024-02-15 16:46:23,481] 17 root - INFO - data loading started...\n[2024-02-15 16:46:23,570] 20 root - INFO - data loadi"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/logs/02_15_2024_16_58_10.log",
    "chars": 1340,
    "preview": "[2024-02-15 16:59:17,283] 17 root - INFO - data loading started...\n[2024-02-15 16:59:17,318] 20 root - INFO - data loadi"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/requirements.txt",
    "chars": 123,
    "preview": "llama-index\ngoogle-generativeai\nllama-index-llms-gemini\npypdf\npython-dotenv\nIPython\nllama-index-embeddings-gemini\nstream"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/setup.py",
    "chars": 232,
    "preview": "from setuptools import find_packages, setup\n\nsetup(\n    name = 'QApplication',\n    version= '0.0.1',\n    author= 'sunny "
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/storage/default__vector_store.json",
    "chars": 65033,
    "preview": "{\"embedding_dict\": {\"488d9176-adb9-4aa4-be31-c79adbf45c9a\": [-0.003852138, -0.061276186, -0.047077414, 0.0011844443, 0.0"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/storage/docstore.json",
    "chars": 34861,
    "preview": "{\"docstore/metadata\": {\"f82f40b2-29b4-4536-b1a3-9f272306d5cd\": {\"doc_hash\": \"233d2f3b87af08e48b322323d0b7ce130fce41f511a"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/storage/graph_store.json",
    "chars": 18,
    "preview": "{\"graph_dict\": {}}"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/storage/image__vector_store.json",
    "chars": 72,
    "preview": "{\"embedding_dict\": {}, \"text_id_to_ref_doc_id\": {}, \"metadata_dict\": {}}"
  },
  {
    "path": "QA_With_Doc_Using_LlamaIndex_Gemini/storage/index_store.json",
    "chars": 751,
    "preview": "{\"index_store/data\": {\"3a5a6a94-7296-41c3-b23a-b18b995074ee\": {\"__type__\": \"vector_store\", \"__data__\": \"{\\\"index_id\\\": \\"
  },
  {
    "path": "RAG App using Haystack & OpenAI/RAG_Application_Using_Haystack_and_OpenAI.ipynb",
    "chars": 18779,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"id\": \"ozHSXlNCxdsr\"\n   },\n   \"source\": [\n    \"# **Ha"
  },
  {
    "path": "RAG App using LLAMAINDEX & MistralAI/RAG_Application_Using_LlamaIndex_and_Mistral_AI.ipynb",
    "chars": 16785,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"colab\": {\n     \"base_uri\": \""
  },
  {
    "path": "RAG App using Langchain Mistral Weaviate/RAG_Application_Using_LangChain_Mistral_and_Weviate.ipynb",
    "chars": 14856,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"colab\": {\n     \"base_uri\": \""
  },
  {
    "path": "RAG App using Langchain OpenAI FAISS/RAG_Application_using_Langchain_OpenAI_API_and_FAISS.ipynb",
    "chars": 146126,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"id\": \"6JUkLoO0l9RC\"\n   },\n   \"source\": [\n    \"#What "
  },
  {
    "path": "RAG App using Langchain OpenAI FAISS/state_of_the_union.txt",
    "chars": 38540,
    "preview": "Madam Speaker, Madam Vice President, our First Lady and Second Gentleman. Members of Congress and the Cabinet. Justices "
  },
  {
    "path": "RAG App with Mongo Vector Search & Gemma/rag_with_huggingface_and_mongodb.ipynb",
    "chars": 32239,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"id\": \"L1-5cYCKA4XS\"\n   },\n  "
  },
  {
    "path": "RAG Pipeline from Scratch/RAG_Implementation_from _Scartch.ipynb",
    "chars": 514080,
    "preview": "{\n \"cells\": [\n  {\n   \"attachments\": {\n    \"image.png\": {\n     \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAABrgAAAKkCAYAAABbDT9N"
  },
  {
    "path": "RAG_Fusion.ipynb",
    "chars": 25339,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"colab_type\": \"text\",\n    \"id\": \"view-in-github\"\n   }"
  },
  {
    "path": "RAG_With_Knowledge_graph(Neo4j).ipynb",
    "chars": 20701,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"colab_type\": \"text\",\n    \"id\": \"view-in-github\"\n   }"
  },
  {
    "path": "RAG_with_LLAMA3_1.ipynb",
    "chars": 906428,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"colab_type\": \"text\",\n    \"id\": \"view-in-github\"\n   }"
  },
  {
    "path": "README.md",
    "chars": 159,
    "preview": "# All of the tutorials are available on my YouTube channel; please visit there.\n\nYoutube Channel Link: https://youtube.c"
  },
  {
    "path": "basic_retrieval_and_contextual_compression_retrieval.ipynb",
    "chars": 21447,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"colab_type\": \"text\",\n    \"id\": \"view-in-github\"\n   }"
  },
  {
    "path": "self_query_retrieval.ipynb",
    "chars": 313997,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"colab_type\": \"text\",\n    \"id\": \"view-in-github\"\n   }"
  }
]

// ... and 2 more files (download for full content)

About this extraction

This page contains the full source code of the sunnysavita10/Generative-AI-Indepth-Basic-to-Advance GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 86 files (3.0 MB), approximately 781.8k tokens, and a symbol index with 11 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!