{ "cells": [ { "cell_type": "markdown", "id": "497edad0-ac7e-48e4-9275-2a71c9938579", "metadata": {}, "source": [ "# Gemma-2b-orpo\n", "\n", "In this notebook, I show some examples of using this small model,\n", "building a simple Chat and RAG pipeline with the [Haystack LLM framework](https://github.com/deepset-ai/haystack)." ] }, { "cell_type": "code", "execution_count": null, "id": "b234e908-cc77-4317-b793-642729844732", "metadata": {}, "outputs": [], "source": [ "! pip install haystack-ai accelerate transformers" ] }, { "cell_type": "markdown", "id": "6f1a5c33-26c0-4107-8178-a2b6ede91d43", "metadata": {}, "source": [ "## Chat with Gemma-2b-orpo (travel assistant) 🛩" ] }, { "cell_type": "code", "execution_count": 12, "id": "7bad8bb1-7aca-4d5a-b4b7-3d0df07db08c", "metadata": {}, "outputs": [], "source": [ "import torch" ] }, { "cell_type": "code", "execution_count": 20, "id": "be2f7073-cc18-4434-a4de-f44bb00042f0", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Gemma's activation function should be approximate GeLU and not exact GeLU.\n", "Changing the activation function to `gelu_pytorch_tanh`.if you want to use the legacy `gelu`, edit the `model.config` to set `hidden_activation=gelu` instead of `hidden_act`. See https://github.com/huggingface/transformers/pull/29402 for more details.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "ca44600f5e284bb99f24eada33ae4969", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Loading checkpoint shards: 0%| | 0/2 [00:00=2.0.0 in /usr/local/lib/python3.10/dist-packages (from wikipedia) (2.31.0)\n", "Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.10/dist-packages (from rich) (3.0.0)\n", "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.10/dist-packages (from rich) (2.17.2)\n", "Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.10/dist-packages (from markdown-it-py>=2.2.0->rich) (0.1.2)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests<3.0.0,>=2.0.0->wikipedia) (3.3.2)\n", "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests<3.0.0,>=2.0.0->wikipedia) (3.6)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests<3.0.0,>=2.0.0->wikipedia) (2.2.0)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests<3.0.0,>=2.0.0->wikipedia) (2024.2.2)\n", "Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.10/dist-packages (from beautifulsoup4->wikipedia) (2.5)\n", "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", "\u001b[0m" ] } ], "source": [ "! pip install wikipedia rich" ] }, { "cell_type": "code", "execution_count": 2, "id": "0ab20125-94e9-48e3-929d-8412fb2683ff", "metadata": {}, "outputs": [], "source": [ "favourite_bands=\"\"\"Audioslave\n", "Blink-182\n", "Dire Straits\n", "Evanescence\n", "Green Day\n", "Muse (band)\n", "Nirvana (band)\n", "Sum 41\n", "The Cure\n", "The Smiths\"\"\".split(\"\\n\")" ] }, { "cell_type": "code", "execution_count": 3, "id": "8af38ebe-3fee-4160-a0f0-5bd447abc4d9", "metadata": {}, "outputs": [], "source": [ "from IPython.display import Image\n", "from pprint import pprint\n", "import rich\n", "import random" ] }, { "cell_type": "code", "execution_count": 4, "id": "1134ab48-85cd-466b-9c3b-d5d305c22a9f", "metadata": {}, "outputs": [], "source": [ "import wikipedia\n", "from haystack.dataclasses import Document\n", "\n", "raw_docs=[]\n", "\n", "for title in favourite_bands:\n", " page = wikipedia.page(title=title, auto_suggest=False)\n", " doc = Document(content=page.content, meta={\"title\": page.title, \"url\":page.url})\n", " raw_docs.append(doc)" ] }, { "cell_type": "markdown", "id": "4b0bd9be-992b-4bda-b9d8-e0738a2bb420", "metadata": {}, "source": [ "### Indexing Pipeline" ] }, { "cell_type": "code", "execution_count": 5, "id": "80f7a815-b48b-4d2a-b81e-b661fcc98ed9", "metadata": {}, "outputs": [], "source": [ "from haystack import Pipeline\n", "from haystack.document_stores.in_memory import InMemoryDocumentStore\n", "from haystack.components.preprocessors import DocumentCleaner, DocumentSplitter\n", "from haystack.components.writers import DocumentWriter\n", "from haystack.document_stores.types import DuplicatePolicy" ] }, { "cell_type": "code", "execution_count": 6, "id": "37ec042d-5936-4d8f-9198-4a042710c456", "metadata": {}, "outputs": [], "source": [ "document_store = InMemoryDocumentStore()" ] }, { "cell_type": "code", "execution_count": 7, "id": "32b50531-6c56-4693-bbad-82711fab74f7", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "indexing = Pipeline()\n", "indexing.add_component(\"cleaner\", DocumentCleaner())\n", "indexing.add_component(\"splitter\", DocumentSplitter(split_by='sentence', split_length=2))\n", "indexing.add_component(\"writer\", DocumentWriter(document_store=document_store, policy=DuplicatePolicy.OVERWRITE))\n", "\n", "indexing.connect(\"cleaner\", \"splitter\")\n", "indexing.connect(\"splitter\", \"writer\")" ] }, { "cell_type": "code", "execution_count": 8, "id": "3f25b7bc-f03a-40f8-b905-922aa3bbe7ac", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'writer': {'documents_written': 1581}}" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "indexing.run({\"cleaner\":{\"documents\":raw_docs}})" ] }, { "cell_type": "code", "execution_count": 9, "id": "e14fc0d0-62fc-44fb-b530-0a60373fdf60", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'title': 'Audioslave',\n", " 'url': 'https://en.wikipedia.org/wiki/Audioslave',\n", " 'source_id': 'e3deff3d39ef107e8b0d69415ea61644b73175086cfbeee03d5f5d6946619fcf'}" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "document_store.filter_documents()[0].meta" ] }, { "cell_type": "markdown", "id": "400576e2-ade7-4954-bb22-55a1451d96f3", "metadata": {}, "source": [ "### RAG Pipeline" ] }, { "cell_type": "code", "execution_count": 10, "id": "e1241de2-5c5b-4482-bc7d-38793329e784", "metadata": {}, "outputs": [], "source": [ "from haystack.components.builders import PromptBuilder\n", "\n", "prompt_template = \"\"\"\n", "<|im_start|> user\n", "Using the information contained in the context, give a comprehensive answer to the question.\n", "If the answer cannot be deduced from the context, do not give an answer.\n", "\n", "Context:\n", " {% for doc in documents %}\n", " {{ doc.content }}\n", " {% endfor %};\n", "Question: {{query}}<|im_end|>\n", "<|im_start|>assistant\n", "\"\"\"\n", "prompt_builder = PromptBuilder(template=prompt_template)" ] }, { "cell_type": "code", "execution_count": 13, "id": "727818d9-f7b8-4ee0-a0b9-2b320e6ec966", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Gemma's activation function should be approximate GeLU and not exact GeLU.\n", "Changing the activation function to `gelu_pytorch_tanh`.if you want to use the legacy `gelu`, edit the `model.config` to set `hidden_activation=gelu` instead of `hidden_act`. See https://github.com/huggingface/transformers/pull/29402 for more details.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8fbb8663c7f04a15a33809cbba071608", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Loading checkpoint shards: 0%| | 0/2 [00:00" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from haystack.components.retrievers.in_memory import InMemoryBM25Retriever\n", "\n", "rag = Pipeline()\n", "rag.add_component(\"retriever\", InMemoryBM25Retriever(document_store=document_store, top_k=3))\n", "rag.add_component(\"prompt_builder\", prompt_builder)\n", "rag.add_component(\"llm\", generator)\n", "\n", "rag.connect(\"retriever.documents\", \"prompt_builder.documents\")\n", "rag.connect(\"prompt_builder.prompt\", \"llm.prompt\")" ] }, { "cell_type": "code", "execution_count": 15, "id": "83590e3a-19b9-48f0-8be0-e7b261e108be", "metadata": {}, "outputs": [], "source": [ "def get_generative_answer(query):\n", "\n", " results = rag.run({\n", " \"retriever\": {\"query\": query},\n", " \"prompt_builder\": {\"query\": query}\n", " }\n", " )\n", "\n", " answer = results[\"llm\"][\"replies\"][0]\n", " rich.print(answer)" ] }, { "cell_type": "code", "execution_count": 17, "id": "96d5d6cb-4f64-4868-8422-7e1b0de2eeab", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "caedfe02853a45eeaa5653a6bed4456d", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Ranking by BM25...: 0%| | 0/1563 [00:00\n", "The male vocalist featured in Evanescence's \"Bring Me to Life\" is Paul McCoy of 12 Stones. His voice complements \n", "Amy Lee's in the song by adding a powerful and distinct element to the track. Lee's powerful and emotive vocals are\n", "enhanced by McCoy's smooth and melodic delivery, creating a powerful and emotional song that stands the test of \n", "time.\n", "\n", "\n" ], "text/plain": [ "\n", "The male vocalist featured in Evanescence's \u001b[32m\"Bring Me to Life\"\u001b[0m is Paul McCoy of \u001b[1;36m12\u001b[0m Stones. His voice complements \n", "Amy Lee's in the song by adding a powerful and distinct element to the track. Lee's powerful and emotive vocals are\n", "enhanced by McCoy's smooth and melodic delivery, creating a powerful and emotional song that stands the test of \n", "time.\n", "\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "get_generative_answer(\"Evanescence's \\\"Bring Me to Life\\\" features a male vocalist. Who is he, and how does his voice complement Amy Lee's in the song?\")" ] }, { "cell_type": "code", "execution_count": 18, "id": "9a59e7f6-83ce-4b6c-9c62-c013c9894512", "metadata": {}, "outputs": [], "source": [ "nice_questions_to_try=\"\"\"What was the original name of Sum 41?\n", "What was the title of Nirvana's breakthrough album released in 1991?\n", "Green Day's \"American Idiot\" is a rock opera. What's the story it tells?\n", "Audioslave was formed by members of two iconic bands. Can you name the bands and discuss the sound of Audioslave in comparison?\n", "Evanescence's \"Bring Me to Life\" features a male vocalist. Who is he, and how does his voice complement Amy Lee's in the song?\n", "What is Sum 41's debut studio album called?\n", "Who was the lead singer of Audioslave?\n", "When was Nirvana's first studio album, \"Bleach,\" released?\n", "Were the Smiths an influential band?\n", "What is the name of Evanescence's debut album?\n", "Which band was Morrissey the lead singer of before he formed The Smiths?\n", "Dire Straits' hit song \"Money for Nothing\" features a guest vocal by a famous artist. Who is this artist?\n", "Who played the song \"Like a stone\"?\"\"\".split('\\n')" ] }, { "cell_type": "code", "execution_count": null, "id": "4761d159-ae88-48c2-a0e2-3d2577a715b7", "metadata": {}, "outputs": [], "source": [ "q=random.choice(nice_questions_to_try)\n", "print(q)\n", "get_generative_answer(q)" ] }, { "cell_type": "markdown", "id": "26f1de6b-1287-47f3-8156-7589929a123f", "metadata": {}, "source": [ "This is a simple demo. We can improve the RAG Pipeline using better retrieval techniques: Embedding Retrieval, Hybrid Retrieval..." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.12" } }, "nbformat": 4, "nbformat_minor": 5 }