From 3578e4b1ba8bf040942fac5a20812a0e258595cf Mon Sep 17 00:00:00 2001 From: Delacrobix Date: Mon, 14 Apr 2025 11:45:35 -0500 Subject: [PATCH 1/3] rerankers article notebook --- .../llamaindex_rerank_notebook.ipynb | 755 ++++++++++++++++++ 1 file changed, 755 insertions(+) create mode 100644 supporting-blog-content/llamaindex-rerank/llamaindex_rerank_notebook.ipynb diff --git a/supporting-blog-content/llamaindex-rerank/llamaindex_rerank_notebook.ipynb b/supporting-blog-content/llamaindex-rerank/llamaindex_rerank_notebook.ipynb new file mode 100644 index 00000000..beeaee44 --- /dev/null +++ b/supporting-blog-content/llamaindex-rerank/llamaindex_rerank_notebook.ipynb @@ -0,0 +1,755 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "LlrEjmtJNpuX" + }, + "source": [ + "# LlamaIndex re-ranker and Elasticsearch re-ranker: Comparison review\n", + "\n", + "This notebook demonstrates how to use AutoGen with Elasticsearch. This notebook is based on the article [LlamaIndex re-ranker and Elasticsearch re-ranker: Comparison review](https://www.elastic.co/search-labs/blog/llamaIndex-reranker-and-elasticsearch-reranker-comparison-review)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GNaAN-GNO5qp" + }, + "source": [ + "## Installing dependencies and importing packages" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "collapsed": true, + "id": "D1SqWMbbASRS", + "outputId": "8ab3bb5d-5d3c-4244-f14c-c303c7ab4f6f" + }, + "outputs": [], + "source": [ + "%pip install elasticsearch==8.17 llama-index-core llama-index-llms-openai rank-llm llama-index-postprocessor-rankgpt-rerank llama-index-embeddings-openai" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "rAesontNXpLu" + }, + "outputs": [], + "source": [ + "import json\n", + "import os\n", + "import nest_asyncio\n", + "from getpass import getpass\n", + "\n", + "\n", + "from elasticsearch import Elasticsearch\n", + "from elasticsearch.helpers import bulk\n", + "\n", + "from llama_index.core import Document, VectorStoreIndex, QueryBundle, Settings\n", + "from llama_index.core.retrievers import VectorIndexRetriever\n", + "from llama_index.postprocessor.rankgpt_rerank import RankGPTRerank\n", + "from llama_index.llms.openai import OpenAI\n", + "\n", + "\n", + "nest_asyncio.apply()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NwOmnk99Pfh3" + }, + "source": [ + "## Declaring variables" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "GVKJKfFpPWuj" + }, + "outputs": [], + "source": [ + "os.environ[\"ELASTICSEARCH_ENDPOINT\"] = getpass(\"Elastic Endpoint: \")\n", + "os.environ[\"ELASTICSEARCH_API_KEY\"] = getpass(\"Elastic Api Key: \")\n", + "os.environ[\"OPENAI_API_KEY\"] = getpass(\"OpenAI Key: \")\n", + "\n", + "INDEX_NAME = \"products-laptops\"\n", + "INFERENCE_RERANK_NAME = \"my-elastic-rerank\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3O2HclcYHEsS" + }, + "source": [ + "### Instance a Elasticsearch client" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "EHYHU2-1nUeW" + }, + "outputs": [], + "source": [ + "# Elasticsearch client\n", + "_client = Elasticsearch(\n", + " os.environ[\"ELASTICSEARCH_ENDPOINT\"],\n", + " api_key=os.environ[\"ELASTICSEARCH_API_KEY\"],\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Defining dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "LVr6TR8qlw2M" + }, + "outputs": [], + "source": [ + "products = [\n", + " {\n", + " \"name\": \"ASUS ROG Strix G16\",\n", + " \"description\": \"Powerful gaming laptop with Intel Core i9 and RTX 4070.\",\n", + " \"price\": 1899.99,\n", + " \"reviews\": 4.7,\n", + " \"sales\": 320,\n", + " \"features\": [\n", + " \"Intel Core i9\",\n", + " \"RTX 4070\",\n", + " \"16GB RAM\",\n", + " \"512GB SSD\",\n", + " \"165Hz Display\",\n", + " ],\n", + " },\n", + " {\n", + " \"name\": \"Razer Blade 15\",\n", + " \"description\": \"Premium gaming laptop with an ultra-slim design and high refresh rate.\",\n", + " \"price\": 2499.99,\n", + " \"reviews\": 4.6,\n", + " \"sales\": 290,\n", + " \"features\": [\n", + " \"Intel Core i7\",\n", + " \"RTX 4060\",\n", + " \"16GB RAM\",\n", + " \"1TB SSD\",\n", + " \"240Hz Display\",\n", + " ],\n", + " },\n", + " {\n", + " \"name\": \"Acer Predator Helios 300\",\n", + " \"description\": \"Affordable yet powerful gaming laptop with RTX graphics.\",\n", + " \"price\": 1399.99,\n", + " \"reviews\": 4.5,\n", + " \"sales\": 500,\n", + " \"features\": [\n", + " \"Intel Core i7\",\n", + " \"RTX 3060\",\n", + " \"16GB RAM\",\n", + " \"512GB SSD\",\n", + " \"144Hz Display\",\n", + " ],\n", + " },\n", + " {\n", + " \"name\": \"MSI Stealth 17\",\n", + " \"description\": \"High-performance gaming laptop with a 17-inch display.\",\n", + " \"price\": 2799.99,\n", + " \"reviews\": 4.8,\n", + " \"sales\": 200,\n", + " \"features\": [\"Intel Core i9\", \"RTX 4080\", \"32GB RAM\", \"1TB SSD\", \"4K Display\"],\n", + " },\n", + " {\n", + " \"name\": \"Dell XPS 15\",\n", + " \"description\": \"Sleek and powerful ultrabook with a high-resolution display.\",\n", + " \"price\": 2199.99,\n", + " \"reviews\": 4.7,\n", + " \"sales\": 350,\n", + " \"features\": [\n", + " \"Intel Core i7\",\n", + " \"RTX 3050 Ti\",\n", + " \"16GB RAM\",\n", + " \"1TB SSD\",\n", + " \"OLED Display\",\n", + " ],\n", + " },\n", + " {\n", + " \"name\": \"HP Omen 16\",\n", + " \"description\": \"Gaming laptop with a balanced price-to-performance ratio.\",\n", + " \"price\": 1599.99,\n", + " \"reviews\": 4.4,\n", + " \"sales\": 280,\n", + " \"features\": [\n", + " \"AMD Ryzen 7\",\n", + " \"RTX 3060\",\n", + " \"16GB RAM\",\n", + " \"512GB SSD\",\n", + " \"165Hz Display\",\n", + " ],\n", + " },\n", + " {\n", + " \"name\": \"Lenovo Legion 5 Pro\",\n", + " \"description\": \"Powerful Ryzen-powered gaming laptop with high refresh rate.\",\n", + " \"price\": 1799.99,\n", + " \"reviews\": 4.6,\n", + " \"sales\": 400,\n", + " \"features\": [\n", + " \"AMD Ryzen 9\",\n", + " \"RTX 3070 Ti\",\n", + " \"16GB RAM\",\n", + " \"1TB SSD\",\n", + " \"165Hz Display\",\n", + " ],\n", + " },\n", + " {\n", + " \"name\": \"MacBook Pro 16\",\n", + " \"description\": \"Apple's most powerful laptop with M3 Max chip.\",\n", + " \"price\": 3499.99,\n", + " \"reviews\": 4.9,\n", + " \"sales\": 500,\n", + " \"features\": [\n", + " \"Apple M3 Max\",\n", + " \"32GB RAM\",\n", + " \"1TB SSD\",\n", + " \"Liquid Retina XDR Display\",\n", + " ],\n", + " },\n", + " {\n", + " \"name\": \"Alienware m18\",\n", + " \"description\": \"High-end gaming laptop with extreme performance.\",\n", + " \"price\": 2999.99,\n", + " \"reviews\": 4.8,\n", + " \"sales\": 150,\n", + " \"features\": [\n", + " \"Intel Core i9\",\n", + " \"RTX 4090\",\n", + " \"32GB RAM\",\n", + " \"2TB SSD\",\n", + " \"480Hz Display\",\n", + " ],\n", + " },\n", + " {\n", + " \"name\": \"Samsung Galaxy Book3 Ultra\",\n", + " \"description\": \"Ultra-lightweight yet powerful laptop with AMOLED display.\",\n", + " \"price\": 2099.99,\n", + " \"reviews\": 4.5,\n", + " \"sales\": 180,\n", + " \"features\": [\n", + " \"Intel Core i7\",\n", + " \"RTX 4070\",\n", + " \"16GB RAM\",\n", + " \"512GB SSD\",\n", + " \"AMOLED Display\",\n", + " ],\n", + " },\n", + " {\n", + " \"name\": \"Microsoft Surface Laptop 5\",\n", + " \"description\": \"Sleek productivity laptop with great battery life.\",\n", + " \"price\": 1699.99,\n", + " \"reviews\": 4.3,\n", + " \"sales\": 220,\n", + " \"features\": [\"Intel Core i7\", \"16GB RAM\", \"512GB SSD\", \"Touchscreen\"],\n", + " },\n", + " {\n", + " \"name\": \"Gigabyte AORUS 17\",\n", + " \"description\": \"Performance-focused gaming laptop with powerful cooling.\",\n", + " \"price\": 1999.99,\n", + " \"reviews\": 4.6,\n", + " \"sales\": 250,\n", + " \"features\": [\n", + " \"Intel Core i9\",\n", + " \"RTX 4070\",\n", + " \"16GB RAM\",\n", + " \"1TB SSD\",\n", + " \"360Hz Display\",\n", + " ],\n", + " },\n", + "]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Indexing documents to Elasticsearch" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Creating mapping for the index\n", + "try:\n", + " _client.indices.create(\n", + " index=INDEX_NAME,\n", + " body={\n", + " \"mappings\": {\n", + " \"properties\": {\n", + " \"name\": {\"type\": \"text\", \"copy_to\": \"semantic_field\"},\n", + " \"description\": {\"type\": \"text\", \"copy_to\": \"semantic_field\"},\n", + " \"price\": {\"type\": \"float\", \"copy_to\": \"semantic_field\"},\n", + " \"reviews\": {\"type\": \"float\", \"copy_to\": \"semantic_field\"},\n", + " \"sales\": {\"type\": \"integer\", \"copy_to\": \"semantic_field\"},\n", + " \"features\": {\"type\": \"keyword\", \"copy_to\": \"semantic_field\"},\n", + " \"semantic_field\": {\"type\": \"semantic_text\"},\n", + " }\n", + " }\n", + " },\n", + " )\n", + "\n", + " print(\"index created successfully\")\n", + "except Exception as e:\n", + " print(\n", + " f\"Error creating inference endpoint: {e.info['error']['root_cause'][0]['reason'] }\"\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Creating inference endpoint for re-ranking\n", + "try:\n", + " _client.options(\n", + " request_timeout=60, max_retries=3, retry_on_timeout=True\n", + " ).inference.put(\n", + " task_type=\"rerank\",\n", + " inference_id=INFERENCE_RERANK_NAME,\n", + " body={\n", + " \"service\": \"elasticsearch\",\n", + " \"service_settings\": {\n", + " \"model_id\": \".rerank-v1\",\n", + " \"num_threads\": 1,\n", + " \"adaptive_allocations\": {\n", + " \"enabled\": True,\n", + " \"min_number_of_allocations\": 1,\n", + " \"max_number_of_allocations\": 4,\n", + " },\n", + " },\n", + " },\n", + " )\n", + "\n", + " print(\"Inference endpoint created successfully.\")\n", + "\n", + "except Exception as e:\n", + " print(\n", + " f\"Error creating inference endpoint: {e.info['error']['root_cause'][0]['reason'] }\"\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def build_data():\n", + " for doc in products:\n", + " yield {\"_index\": INDEX_NAME, \"_source\": doc}\n", + "\n", + "\n", + "try:\n", + " success, errors = bulk(_client, build_data())\n", + " print(f\"{success} documents indexed successfully\")\n", + "\n", + " if errors:\n", + " print(\"Errors during indexing:\", errors)\n", + "\n", + "except Exception as e:\n", + " print(f\"Error: {str(e)}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "P53v_KzjH9Ab" + }, + "source": [ + "## LlamaIndex re-rankers" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rerank_promt = \"Best laptops for developers and designers\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "EIvU-vxKpKhy" + }, + "source": [ + "### documents formating" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "i2fZZLDgxtPu" + }, + "outputs": [], + "source": [ + "document_objects = []\n", + "\n", + "for doc in products:\n", + " text_content = f\"\"\"\n", + " Product Name: {doc[\"name\"]}\n", + " Description: {doc[\"description\"]}\n", + " Price: ${doc[\"price\"]}\n", + " Reviews: {doc[\"reviews\"]} stars\n", + " Sales: {doc[\"sales\"]} units sold\n", + " Features: {', '.join(doc[\"features\"])}\n", + " \"\"\"\n", + "\n", + " document_objects.append(Document(text=text_content))\n", + "\n", + "index = VectorStoreIndex.from_documents(document_objects)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kFoBUbx_nJMJ" + }, + "source": [ + "### LLM endpoint" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Settings.llm = OpenAI(temperature=0, model=\"gpt-3.5-turbo\")\n", + "Settings.chunk_size = 512" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "kSrlRYAEWBSA" + }, + "outputs": [], + "source": [ + "index = VectorStoreIndex.from_documents(\n", + " document_objects,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "cAYwonikXP8b" + }, + "outputs": [], + "source": [ + "# Re-rank method\n", + "def get_retrieved_nodes(\n", + " query_str, vector_top_k=10, reranker_top_n=3, with_reranker=False\n", + "):\n", + " query_bundle = QueryBundle(query_str)\n", + " # configure retriever\n", + " retriever = VectorIndexRetriever(\n", + " index=index,\n", + " similarity_top_k=vector_top_k,\n", + " )\n", + " retrieved_nodes = retriever.retrieve(query_bundle)\n", + "\n", + " if with_reranker:\n", + " # configure re-ranker\n", + " reranker = RankGPTRerank(\n", + " llm=OpenAI(\n", + " model=\"gpt-3.5-turbo-16k\",\n", + " temperature=0.0,\n", + " api_key=os.environ[\"OPENAI_API_KEY\"],\n", + " ),\n", + " top_n=reranker_top_n,\n", + " verbose=True,\n", + " )\n", + " retrieved_nodes = reranker.postprocess_nodes(retrieved_nodes, query_bundle)\n", + "\n", + " return retrieved_nodes" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def visualize_retrieved_nodes(nodes):\n", + " result_dicts = []\n", + "\n", + " for node in nodes:\n", + " result_dict = {\"Score\": node.score, \"Text\": node.node.get_text()}\n", + " result_dicts.append(result_dict)\n", + "\n", + " return result_dicts" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PMFhgK9CXTze" + }, + "source": [ + "### Without re-rank" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 352 + }, + "id": "MNcpUJsKXZPK", + "outputId": "58b4a8b9-a10f-4eae-f727-3268e953b806" + }, + "outputs": [], + "source": [ + "new_nodes = get_retrieved_nodes(\n", + " rerank_promt,\n", + " vector_top_k=12,\n", + " with_reranker=False,\n", + ")\n", + "\n", + "results = visualize_retrieved_nodes(new_nodes[:3])\n", + "\n", + "print(f\"Top 3 results without reranking: {json.dumps(results, indent=2)}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### With re-rank" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 369 + }, + "id": "JXTnX6rrIa-D", + "outputId": "c12b1e40-07b2-47b2-a3c9-fcbc1e81a47f" + }, + "outputs": [], + "source": [ + "new_nodes = get_retrieved_nodes(\n", + " rerank_promt,\n", + " vector_top_k=12,\n", + " reranker_top_n=3,\n", + " with_reranker=True,\n", + ")\n", + "\n", + "results = visualize_retrieved_nodes(new_nodes[:3])\n", + "print(f\"Top 3 results with reranking: {json.dumps(results, indent=2)}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "k7D6EHPdnpr1" + }, + "source": [ + "## Elasticsearch re-rankers" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "X0xbyG_fnoBU" + }, + "outputs": [], + "source": [ + "async def es_search(query):\n", + " response = _client.search(index=INDEX_NAME, body=query)\n", + " hits = response[\"hits\"][\"hits\"]\n", + "\n", + " if not hits:\n", + " return \"\"\n", + "\n", + " return json.dumps([hit[\"_source\"] for hit in hits], indent=2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Query with semantic search\n", + "result = await es_search(\n", + " {\n", + " \"size\": 3,\n", + " \"query\": {\n", + " \"semantic\": {\n", + " \"field\": \"semantic_field\",\n", + " \"query\": rerank_promt,\n", + " }\n", + " },\n", + " \"_source\": {\n", + " \"includes\": [\n", + " \"name\",\n", + " \"description\",\n", + " \"price\",\n", + " \"reviews\",\n", + " \"sales\",\n", + " \"features\",\n", + " ]\n", + " },\n", + " }\n", + ")\n", + "\n", + "print(f\"Query result: {result}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ME8w7MR4orci", + "outputId": "c8495176-ef78-4fb2-8cd8-6ca6c25b0811" + }, + "outputs": [], + "source": [ + "results = await es_search(\n", + " {\n", + " \"size\": 3,\n", + " \"_source\": {\n", + " \"includes\": [\n", + " \"name\",\n", + " \"description\",\n", + " \"price\",\n", + " \"reviews\",\n", + " \"sales\",\n", + " \"features\",\n", + " ]\n", + " },\n", + " \"retriever\": {\n", + " \"text_similarity_reranker\": {\n", + " \"retriever\": {\n", + " \"standard\": {\n", + " \"query\": {\n", + " \"semantic\": {\n", + " \"field\": \"semantic_field\",\n", + " \"query\": rerank_promt,\n", + " }\n", + " }\n", + " }\n", + " },\n", + " \"field\": \"text\",\n", + " \"inference_id\": INFERENCE_RERANK_NAME,\n", + " \"inference_text\": rerank_promt,\n", + " \"rank_window_size\": 10,\n", + " \"min_score\": 0.5,\n", + " }\n", + " },\n", + " }\n", + ")\n", + "print(f\"Query result: {result}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "S6WZMJayyzxh" + }, + "source": [ + "## Cleaning environment\n", + "\n", + "Delete the resources used to prevent them from consuming resources." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def print_results(results):\n", + " if results.get(\"acknowledged\", False):\n", + " print(\"DELETED successfully.\")\n", + "\n", + " if \"error\" in results:\n", + " print(f\"ERROR: {results['error']['root_cause'][0]['reason']}\")\n", + "\n", + "\n", + "# Cleanup - Delete Index\n", + "result = _client.indices.delete(index=INDEX_NAME, ignore=[400, 404])\n", + "print_results(result)\n", + "\n", + "\n", + "# Cleanup - Inference endpoint\n", + "result = _client.inference.delete(inference_id=INFERENCE_RERANK_NAME, ignore=[400, 404])\n", + "print_results(result)" + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [ + "9lvPHaXjPlfu" + ], + "provenance": [] + }, + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} From 0974b8875fcc95a6c693fa655a01a7cfffe12635 Mon Sep 17 00:00:00 2001 From: Delacrobix Date: Mon, 14 Apr 2025 11:47:32 -0500 Subject: [PATCH 2/3] renaming folder --- .../llamaindex_rerank_notebook.ipynb | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename supporting-blog-content/{llamaindex-rerank => llamaindex-re-ranker-and-elasticsearch-re-ranker}/llamaindex_rerank_notebook.ipynb (100%) diff --git a/supporting-blog-content/llamaindex-rerank/llamaindex_rerank_notebook.ipynb b/supporting-blog-content/llamaindex-re-ranker-and-elasticsearch-re-ranker/llamaindex_rerank_notebook.ipynb similarity index 100% rename from supporting-blog-content/llamaindex-rerank/llamaindex_rerank_notebook.ipynb rename to supporting-blog-content/llamaindex-re-ranker-and-elasticsearch-re-ranker/llamaindex_rerank_notebook.ipynb From 3b2ec451b959de861dd8e46ed6ae8dca1345ed6a Mon Sep 17 00:00:00 2001 From: Delacrobix Date: Mon, 21 Apr 2025 12:30:37 -0500 Subject: [PATCH 3/3] notebook changes --- .../llamaindex_rerank_notebook.ipynb | 811 +++++++++++++----- 1 file changed, 573 insertions(+), 238 deletions(-) diff --git a/supporting-blog-content/llamaindex-re-ranker-and-elasticsearch-re-ranker/llamaindex_rerank_notebook.ipynb b/supporting-blog-content/llamaindex-re-ranker-and-elasticsearch-re-ranker/llamaindex_rerank_notebook.ipynb index beeaee44..e7aadd4a 100644 --- a/supporting-blog-content/llamaindex-re-ranker-and-elasticsearch-re-ranker/llamaindex_rerank_notebook.ipynb +++ b/supporting-blog-content/llamaindex-re-ranker-and-elasticsearch-re-ranker/llamaindex_rerank_notebook.ipynb @@ -11,116 +11,16 @@ "This notebook demonstrates how to use AutoGen with Elasticsearch. This notebook is based on the article [LlamaIndex re-ranker and Elasticsearch re-ranker: Comparison review](https://www.elastic.co/search-labs/blog/llamaIndex-reranker-and-elasticsearch-reranker-comparison-review)." ] }, - { - "cell_type": "markdown", - "metadata": { - "id": "GNaAN-GNO5qp" - }, - "source": [ - "## Installing dependencies and importing packages" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "collapsed": true, - "id": "D1SqWMbbASRS", - "outputId": "8ab3bb5d-5d3c-4244-f14c-c303c7ab4f6f" - }, - "outputs": [], - "source": [ - "%pip install elasticsearch==8.17 llama-index-core llama-index-llms-openai rank-llm llama-index-postprocessor-rankgpt-rerank llama-index-embeddings-openai" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "rAesontNXpLu" - }, - "outputs": [], - "source": [ - "import json\n", - "import os\n", - "import nest_asyncio\n", - "from getpass import getpass\n", - "\n", - "\n", - "from elasticsearch import Elasticsearch\n", - "from elasticsearch.helpers import bulk\n", - "\n", - "from llama_index.core import Document, VectorStoreIndex, QueryBundle, Settings\n", - "from llama_index.core.retrievers import VectorIndexRetriever\n", - "from llama_index.postprocessor.rankgpt_rerank import RankGPTRerank\n", - "from llama_index.llms.openai import OpenAI\n", - "\n", - "\n", - "nest_asyncio.apply()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "NwOmnk99Pfh3" - }, - "source": [ - "## Declaring variables" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "GVKJKfFpPWuj" - }, - "outputs": [], - "source": [ - "os.environ[\"ELASTICSEARCH_ENDPOINT\"] = getpass(\"Elastic Endpoint: \")\n", - "os.environ[\"ELASTICSEARCH_API_KEY\"] = getpass(\"Elastic Api Key: \")\n", - "os.environ[\"OPENAI_API_KEY\"] = getpass(\"OpenAI Key: \")\n", - "\n", - "INDEX_NAME = \"products-laptops\"\n", - "INFERENCE_RERANK_NAME = \"my-elastic-rerank\"" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "3O2HclcYHEsS" - }, - "source": [ - "### Instance a Elasticsearch client" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "EHYHU2-1nUeW" - }, - "outputs": [], - "source": [ - "# Elasticsearch client\n", - "_client = Elasticsearch(\n", - " os.environ[\"ELASTICSEARCH_ENDPOINT\"],\n", - " api_key=os.environ[\"ELASTICSEARCH_API_KEY\"],\n", - ")" - ] - }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Defining dataset" + "## Dataset" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { "id": "LVr6TR8qlw2M" }, @@ -289,128 +189,221 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Indexing documents to Elasticsearch" + "## User question" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 65, "metadata": {}, "outputs": [], "source": [ - "# Creating mapping for the index\n", - "try:\n", - " _client.indices.create(\n", - " index=INDEX_NAME,\n", - " body={\n", - " \"mappings\": {\n", - " \"properties\": {\n", - " \"name\": {\"type\": \"text\", \"copy_to\": \"semantic_field\"},\n", - " \"description\": {\"type\": \"text\", \"copy_to\": \"semantic_field\"},\n", - " \"price\": {\"type\": \"float\", \"copy_to\": \"semantic_field\"},\n", - " \"reviews\": {\"type\": \"float\", \"copy_to\": \"semantic_field\"},\n", - " \"sales\": {\"type\": \"integer\", \"copy_to\": \"semantic_field\"},\n", - " \"features\": {\"type\": \"keyword\", \"copy_to\": \"semantic_field\"},\n", - " \"semantic_field\": {\"type\": \"semantic_text\"},\n", - " }\n", - " }\n", - " },\n", - " )\n", - "\n", - " print(\"index created successfully\")\n", - "except Exception as e:\n", - " print(\n", - " f\"Error creating inference endpoint: {e.info['error']['root_cause'][0]['reason'] }\"\n", - " )" + "user_query = \"Best laptops for gaming\"" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "# Creating inference endpoint for re-ranking\n", - "try:\n", - " _client.options(\n", - " request_timeout=60, max_retries=3, retry_on_timeout=True\n", - " ).inference.put(\n", - " task_type=\"rerank\",\n", - " inference_id=INFERENCE_RERANK_NAME,\n", - " body={\n", - " \"service\": \"elasticsearch\",\n", - " \"service_settings\": {\n", - " \"model_id\": \".rerank-v1\",\n", - " \"num_threads\": 1,\n", - " \"adaptive_allocations\": {\n", - " \"enabled\": True,\n", - " \"min_number_of_allocations\": 1,\n", - " \"max_number_of_allocations\": 4,\n", - " },\n", - " },\n", - " },\n", - " )\n", - "\n", - " print(\"Inference endpoint created successfully.\")\n", - "\n", - "except Exception as e:\n", - " print(\n", - " f\"Error creating inference endpoint: {e.info['error']['root_cause'][0]['reason'] }\"\n", - " )" + "## LlamaIndex Reranking" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GNaAN-GNO5qp" + }, + "source": [ + "### Installing dependencies and import packages" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "collapsed": true, + "id": "D1SqWMbbASRS", + "outputId": "8ab3bb5d-5d3c-4244-f14c-c303c7ab4f6f" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: llama-index-core in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (0.12.25)\n", + "Requirement already satisfied: llama-index-llms-openai in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (0.3.25)\n", + "Requirement already satisfied: rank-llm in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (0.21.0)\n", + "Requirement already satisfied: llama-index-postprocessor-rankgpt-rerank in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (0.3.0)\n", + "Requirement already satisfied: llama-index-embeddings-openai in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (0.3.1)\n", + "Requirement already satisfied: PyYAML>=6.0.1 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from llama-index-core) (6.0.2)\n", + "Requirement already satisfied: SQLAlchemy>=1.4.49 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from SQLAlchemy[asyncio]>=1.4.49->llama-index-core) (2.0.38)\n", + "Requirement already satisfied: aiohttp<4.0.0,>=3.8.6 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from llama-index-core) (3.11.13)\n", + "Requirement already satisfied: dataclasses-json in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from llama-index-core) (0.6.7)\n", + "Requirement already satisfied: deprecated>=1.2.9.3 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from llama-index-core) (1.2.18)\n", + "Requirement already satisfied: dirtyjson<2.0.0,>=1.0.8 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from llama-index-core) (1.0.8)\n", + "Requirement already satisfied: filetype<2.0.0,>=1.2.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from llama-index-core) (1.2.0)\n", + "Requirement already satisfied: fsspec>=2023.5.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from llama-index-core) (2025.2.0)\n", + "Requirement already satisfied: httpx in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from llama-index-core) (0.28.1)\n", + "Requirement already satisfied: nest-asyncio<2.0.0,>=1.5.8 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from llama-index-core) (1.6.0)\n", + "Requirement already satisfied: networkx>=3.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from llama-index-core) (3.4.2)\n", + "Requirement already satisfied: nltk>3.8.1 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from llama-index-core) (3.9.1)\n", + "Requirement already satisfied: numpy in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from llama-index-core) (2.2.3)\n", + "Requirement already satisfied: pillow>=9.0.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from llama-index-core) (11.1.0)\n", + "Requirement already satisfied: pydantic>=2.8.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from llama-index-core) (2.10.6)\n", + "Requirement already satisfied: requests>=2.31.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from llama-index-core) (2.32.3)\n", + "Requirement already satisfied: tenacity!=8.4.0,<10.0.0,>=8.2.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from llama-index-core) (9.0.0)\n", + "Requirement already satisfied: tiktoken>=0.3.3 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from llama-index-core) (0.7.0)\n", + "Requirement already satisfied: tqdm<5.0.0,>=4.66.1 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from llama-index-core) (4.67.1)\n", + "Requirement already satisfied: typing-extensions>=4.5.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from llama-index-core) (4.12.2)\n", + "Requirement already satisfied: typing-inspect>=0.8.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from llama-index-core) (0.9.0)\n", + "Requirement already satisfied: wrapt in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from llama-index-core) (1.17.2)\n", + "Requirement already satisfied: openai<2.0.0,>=1.58.1 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from llama-index-llms-openai) (1.65.1)\n", + "Requirement already satisfied: transformers>=4.40.1 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from rank-llm) (4.49.0)\n", + "Requirement already satisfied: pyserini>=0.43.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from rank-llm) (0.44.0)\n", + "Requirement already satisfied: python-dotenv>=1.0.1 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from rank-llm) (1.0.1)\n", + "Requirement already satisfied: faiss-cpu>=1.8.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from rank-llm) (1.10.0)\n", + "Requirement already satisfied: ftfy>=6.2.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from rank-llm) (6.3.1)\n", + "Requirement already satisfied: dacite>=1.8.1 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from rank-llm) (1.9.2)\n", + "Requirement already satisfied: fschat>=0.2.36 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from fschat[model_worker]>=0.2.36->rank-llm) (0.2.36)\n", + "Requirement already satisfied: aiohappyeyeballs>=2.3.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.8.6->llama-index-core) (2.4.6)\n", + "Requirement already satisfied: aiosignal>=1.1.2 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.8.6->llama-index-core) (1.3.2)\n", + "Requirement already satisfied: attrs>=17.3.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.8.6->llama-index-core) (25.1.0)\n", + "Requirement already satisfied: frozenlist>=1.1.1 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.8.6->llama-index-core) (1.5.0)\n", + "Requirement already satisfied: multidict<7.0,>=4.5 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.8.6->llama-index-core) (6.1.0)\n", + "Requirement already satisfied: propcache>=0.2.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.8.6->llama-index-core) (0.3.0)\n", + "Requirement already satisfied: yarl<2.0,>=1.17.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.8.6->llama-index-core) (1.18.3)\n", + "Requirement already satisfied: packaging in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from faiss-cpu>=1.8.0->rank-llm) (24.2)\n", + "Requirement already satisfied: fastapi in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from fschat>=0.2.36->fschat[model_worker]>=0.2.36->rank-llm) (0.115.11)\n", + "Requirement already satisfied: markdown2[all] in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from fschat>=0.2.36->fschat[model_worker]>=0.2.36->rank-llm) (2.5.3)\n", + "Requirement already satisfied: nh3 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from fschat>=0.2.36->fschat[model_worker]>=0.2.36->rank-llm) (0.2.21)\n", + "Requirement already satisfied: prompt-toolkit>=3.0.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from fschat>=0.2.36->fschat[model_worker]>=0.2.36->rank-llm) (3.0.50)\n", + "Requirement already satisfied: rich>=10.0.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from fschat>=0.2.36->fschat[model_worker]>=0.2.36->rank-llm) (13.9.4)\n", + "Requirement already satisfied: shortuuid in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from fschat>=0.2.36->fschat[model_worker]>=0.2.36->rank-llm) (1.0.13)\n", + "Requirement already satisfied: uvicorn in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from fschat>=0.2.36->fschat[model_worker]>=0.2.36->rank-llm) (0.34.0)\n", + "Requirement already satisfied: accelerate>=0.21 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from fschat[model_worker]>=0.2.36->rank-llm) (1.5.2)\n", + "Requirement already satisfied: peft in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from fschat[model_worker]>=0.2.36->rank-llm) (0.15.1)\n", + "Requirement already satisfied: sentencepiece in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from fschat[model_worker]>=0.2.36->rank-llm) (0.2.0)\n", + "Requirement already satisfied: torch in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from fschat[model_worker]>=0.2.36->rank-llm) (2.6.0)\n", + "Requirement already satisfied: protobuf in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from fschat[model_worker]>=0.2.36->rank-llm) (5.29.3)\n", + "Requirement already satisfied: wcwidth in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from ftfy>=6.2.0->rank-llm) (0.2.13)\n", + "Requirement already satisfied: click in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from nltk>3.8.1->llama-index-core) (8.1.8)\n", + "Requirement already satisfied: joblib in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from nltk>3.8.1->llama-index-core) (1.4.2)\n", + "Requirement already satisfied: regex>=2021.8.3 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from nltk>3.8.1->llama-index-core) (2024.11.6)\n", + "Requirement already satisfied: anyio<5,>=3.5.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from openai<2.0.0,>=1.58.1->llama-index-llms-openai) (4.8.0)\n", + "Requirement already satisfied: distro<2,>=1.7.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from openai<2.0.0,>=1.58.1->llama-index-llms-openai) (1.9.0)\n", + "Requirement already satisfied: jiter<1,>=0.4.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from openai<2.0.0,>=1.58.1->llama-index-llms-openai) (0.8.2)\n", + "Requirement already satisfied: sniffio in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from openai<2.0.0,>=1.58.1->llama-index-llms-openai) (1.3.1)\n", + "Requirement already satisfied: certifi in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from httpx->llama-index-core) (2025.1.31)\n", + "Requirement already satisfied: httpcore==1.* in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from httpx->llama-index-core) (1.0.7)\n", + "Requirement already satisfied: idna in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from httpx->llama-index-core) (3.10)\n", + "Requirement already satisfied: h11<0.15,>=0.13 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from httpcore==1.*->httpx->llama-index-core) (0.14.0)\n", + "Requirement already satisfied: annotated-types>=0.6.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from pydantic>=2.8.0->llama-index-core) (0.7.0)\n", + "Requirement already satisfied: pydantic-core==2.27.2 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from pydantic>=2.8.0->llama-index-core) (2.27.2)\n", + "Requirement already satisfied: Cython>=0.29.21 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from pyserini>=0.43.0->rank-llm) (3.0.12)\n", + "Requirement already satisfied: pandas>=1.4.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from pyserini>=0.43.0->rank-llm) (2.2.3)\n", + "Requirement already satisfied: pyjnius>=1.6.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from pyserini>=0.43.0->rank-llm) (1.6.1)\n", + "Requirement already satisfied: scikit-learn>=0.22.1 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from pyserini>=0.43.0->rank-llm) (1.6.1)\n", + "Requirement already satisfied: scipy>=1.4.1 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from pyserini>=0.43.0->rank-llm) (1.15.2)\n", + "Requirement already satisfied: onnxruntime>=1.8.1 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from pyserini>=0.43.0->rank-llm) (1.20.1)\n", + "Requirement already satisfied: flask>3.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from pyserini>=0.43.0->rank-llm) (3.1.0)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from requests>=2.31.0->llama-index-core) (3.4.1)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from requests>=2.31.0->llama-index-core) (2.3.0)\n", + "Requirement already satisfied: greenlet!=0.4.17 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from SQLAlchemy[asyncio]>=1.4.49->llama-index-core) (3.1.1)\n", + "Requirement already satisfied: filelock in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from transformers>=4.40.1->rank-llm) (3.17.0)\n", + "Requirement already satisfied: huggingface-hub<1.0,>=0.26.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from transformers>=4.40.1->rank-llm) (0.29.1)\n", + "Requirement already satisfied: tokenizers<0.22,>=0.21 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from transformers>=4.40.1->rank-llm) (0.21.1)\n", + "Requirement already satisfied: safetensors>=0.4.1 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from transformers>=4.40.1->rank-llm) (0.5.3)\n", + "Requirement already satisfied: mypy-extensions>=0.3.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from typing-inspect>=0.8.0->llama-index-core) (1.0.0)\n", + "Requirement already satisfied: marshmallow<4.0.0,>=3.18.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from dataclasses-json->llama-index-core) (3.26.1)\n", + "Requirement already satisfied: psutil in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from accelerate>=0.21->fschat[model_worker]>=0.2.36->rank-llm) (7.0.0)\n", + "Requirement already satisfied: Werkzeug>=3.1 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from flask>3.0->pyserini>=0.43.0->rank-llm) (3.1.3)\n", + "Requirement already satisfied: Jinja2>=3.1.2 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from flask>3.0->pyserini>=0.43.0->rank-llm) (3.1.5)\n", + "Requirement already satisfied: itsdangerous>=2.2 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from flask>3.0->pyserini>=0.43.0->rank-llm) (2.2.0)\n", + "Requirement already satisfied: blinker>=1.9 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from flask>3.0->pyserini>=0.43.0->rank-llm) (1.9.0)\n", + "Requirement already satisfied: coloredlogs in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from onnxruntime>=1.8.1->pyserini>=0.43.0->rank-llm) (15.0.1)\n", + "Requirement already satisfied: flatbuffers in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from onnxruntime>=1.8.1->pyserini>=0.43.0->rank-llm) (25.2.10)\n", + "Requirement already satisfied: sympy in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from onnxruntime>=1.8.1->pyserini>=0.43.0->rank-llm) (1.13.1)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from pandas>=1.4.0->pyserini>=0.43.0->rank-llm) (2.9.0.post0)\n", + "Requirement already satisfied: pytz>=2020.1 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from pandas>=1.4.0->pyserini>=0.43.0->rank-llm) (2024.2)\n", + "Requirement already satisfied: tzdata>=2022.7 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from pandas>=1.4.0->pyserini>=0.43.0->rank-llm) (2025.1)\n", + "Requirement already satisfied: markdown-it-py>=2.2.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from rich>=10.0.0->fschat>=0.2.36->fschat[model_worker]>=0.2.36->rank-llm) (3.0.0)\n", + "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from rich>=10.0.0->fschat>=0.2.36->fschat[model_worker]>=0.2.36->rank-llm) (2.19.1)\n", + "Requirement already satisfied: threadpoolctl>=3.1.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from scikit-learn>=0.22.1->pyserini>=0.43.0->rank-llm) (3.6.0)\n", + "Requirement already satisfied: setuptools in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from torch->fschat[model_worker]>=0.2.36->rank-llm) (75.8.2)\n", + "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from sympy->onnxruntime>=1.8.1->pyserini>=0.43.0->rank-llm) (1.3.0)\n", + "Requirement already satisfied: starlette<0.47.0,>=0.40.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from fastapi->fschat>=0.2.36->fschat[model_worker]>=0.2.36->rank-llm) (0.46.0)\n", + "Requirement already satisfied: wavedrom in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from markdown2[all]->fschat>=0.2.36->fschat[model_worker]>=0.2.36->rank-llm) (2.0.3.post3)\n", + "Requirement already satisfied: latex2mathml in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from markdown2[all]->fschat>=0.2.36->fschat[model_worker]>=0.2.36->rank-llm) (3.77.0)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from Jinja2>=3.1.2->flask>3.0->pyserini>=0.43.0->rank-llm) (3.0.2)\n", + "Requirement already satisfied: mdurl~=0.1 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from markdown-it-py>=2.2.0->rich>=10.0.0->fschat>=0.2.36->fschat[model_worker]>=0.2.36->rank-llm) (0.1.2)\n", + "Requirement already satisfied: six>=1.5 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from python-dateutil>=2.8.2->pandas>=1.4.0->pyserini>=0.43.0->rank-llm) (1.17.0)\n", + "Requirement already satisfied: humanfriendly>=9.1 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from coloredlogs->onnxruntime>=1.8.1->pyserini>=0.43.0->rank-llm) (10.0)\n", + "Requirement already satisfied: svgwrite in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from wavedrom->markdown2[all]->fschat>=0.2.36->fschat[model_worker]>=0.2.36->rank-llm) (1.4.3)\n", + "\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.0\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0.1\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install llama-index-core llama-index-llms-openai rank-llm llama-index-postprocessor-rankgpt-rerank llama-index-embeddings-openai" ] }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "id": "rAesontNXpLu" + }, "outputs": [], "source": [ - "def build_data():\n", - " for doc in products:\n", - " yield {\"_index\": INDEX_NAME, \"_source\": doc}\n", - "\n", + "import os\n", + "import nest_asyncio\n", + "from getpass import getpass\n", "\n", - "try:\n", - " success, errors = bulk(_client, build_data())\n", - " print(f\"{success} documents indexed successfully\")\n", + "from llama_index.core import Document, VectorStoreIndex, QueryBundle, Settings\n", + "from llama_index.core.retrievers import VectorIndexRetriever\n", + "from llama_index.postprocessor.rankgpt_rerank import RankGPTRerank\n", + "from llama_index.llms.openai import OpenAI\n", "\n", - " if errors:\n", - " print(\"Errors during indexing:\", errors)\n", "\n", - "except Exception as e:\n", - " print(f\"Error: {str(e)}\")" + "nest_asyncio.apply()" ] }, { "cell_type": "markdown", "metadata": { - "id": "P53v_KzjH9Ab" + "id": "NwOmnk99Pfh3" }, "source": [ - "## LlamaIndex re-rankers" + "### Setup keys" ] }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "id": "GVKJKfFpPWuj" + }, "outputs": [], "source": [ - "rerank_promt = \"Best laptops for developers and designers\"" + "os.environ[\"OPENAI_API_KEY\"] = getpass(\"OpenAI Key: \")" ] }, { "cell_type": "markdown", - "metadata": { - "id": "EIvU-vxKpKhy" - }, + "metadata": {}, "source": [ - "### documents formating" + "### Indexing data to llamaIndex" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": { "id": "i2fZZLDgxtPu" }, @@ -435,16 +428,14 @@ }, { "cell_type": "markdown", - "metadata": { - "id": "kFoBUbx_nJMJ" - }, + "metadata": {}, "source": [ - "### LLM endpoint" + "### LLM setup" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -453,21 +444,15 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "kSrlRYAEWBSA" - }, - "outputs": [], + "cell_type": "markdown", + "metadata": {}, "source": [ - "index = VectorStoreIndex.from_documents(\n", - " document_objects,\n", - ")" + "### LlamaIndex rerank feature" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": { "id": "cAYwonikXP8b" }, @@ -475,7 +460,7 @@ "source": [ "# Re-rank method\n", "def get_retrieved_nodes(\n", - " query_str, vector_top_k=10, reranker_top_n=3, with_reranker=False\n", + " query_str, vector_top_k=10, reranker_top_n=5, with_reranker=False\n", "):\n", " query_bundle = QueryBundle(query_str)\n", " # configure retriever\n", @@ -486,7 +471,7 @@ " retrieved_nodes = retriever.retrieve(query_bundle)\n", "\n", " if with_reranker:\n", - " # configure re-ranker\n", + " # configure reranker\n", " reranker = RankGPTRerank(\n", " llm=OpenAI(\n", " model=\"gpt-3.5-turbo-16k\",\n", @@ -503,18 +488,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ + "# Function to format the resulting documents.\n", "def visualize_retrieved_nodes(nodes):\n", - " result_dicts = []\n", + " formatted_results = []\n", "\n", " for node in nodes:\n", - " result_dict = {\"Score\": node.score, \"Text\": node.node.get_text()}\n", - " result_dicts.append(result_dict)\n", + " text = node.node.get_text()\n", + "\n", + " product_name = text.split(\"Product Name:\")[1].split(\"\\n\")[0].strip()\n", + " price = text.split(\"Price:\")[1].split(\"\\n\")[0].strip()\n", + " reviews = text.split(\"Reviews:\")[1].split(\"\\n\")[0].strip()\n", + " features = text.split(\"Features:\")[1].strip()\n", "\n", - " return result_dicts" + " formatted_result = f\"{price} - {product_name} ({reviews}) {features}\"\n", + " formatted_results.append(formatted_result)\n", + "\n", + " return formatted_results" ] }, { @@ -523,12 +516,12 @@ "id": "PMFhgK9CXTze" }, "source": [ - "### Without re-rank" + "### Without rerank" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 72, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -537,29 +530,45 @@ "id": "MNcpUJsKXZPK", "outputId": "58b4a8b9-a10f-4eae-f727-3268e953b806" }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Top 5 results without rerank:\n", + "1. $2499.99 - Razer Blade 15 (4.6 stars) Intel Core i7, RTX 4060, 16GB RAM, 1TB SSD, 240Hz Display\n", + "2. $1899.99 - ASUS ROG Strix G16 (4.7 stars) Intel Core i9, RTX 4070, 16GB RAM, 512GB SSD, 165Hz Display\n", + "3. $1999.99 - Gigabyte AORUS 17 (4.6 stars) Intel Core i9, RTX 4070, 16GB RAM, 1TB SSD, 360Hz Display\n", + "4. $2799.99 - MSI Stealth 17 (4.8 stars) Intel Core i9, RTX 4080, 32GB RAM, 1TB SSD, 4K Display\n", + "5. $2999.99 - Alienware m18 (4.8 stars) Intel Core i9, RTX 4090, 32GB RAM, 2TB SSD, 480Hz Display\n" + ] + } + ], "source": [ "new_nodes = get_retrieved_nodes(\n", - " rerank_promt,\n", - " vector_top_k=12,\n", + " user_query,\n", + " vector_top_k=5,\n", " with_reranker=False,\n", ")\n", "\n", - "results = visualize_retrieved_nodes(new_nodes[:3])\n", + "results = visualize_retrieved_nodes(new_nodes)\n", "\n", - "print(f\"Top 3 results without reranking: {json.dumps(results, indent=2)}\")" + "print(\"\\nTop 5 results without rerank:\")\n", + "for idx, result in enumerate(results, start=1):\n", + " print(f\"{idx}. {result}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### With re-rank" + "### With rerank" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 71, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -568,36 +577,268 @@ "id": "JXTnX6rrIa-D", "outputId": "c12b1e40-07b2-47b2-a3c9-fcbc1e81a47f" }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "After Reranking, new rank list for nodes: [1, 4, 3, 2, 0]\n", + "Top 5 results with reranking:\n", + "1. $1899.99 - ASUS ROG Strix G16 (4.7 stars) Intel Core i9, RTX 4070, 16GB RAM, 512GB SSD, 165Hz Display\n", + "2. $2999.99 - Alienware m18 (4.8 stars) Intel Core i9, RTX 4090, 32GB RAM, 2TB SSD, 480Hz Display\n", + "3. $2799.99 - MSI Stealth 17 (4.8 stars) Intel Core i9, RTX 4080, 32GB RAM, 1TB SSD, 4K Display\n", + "4. $1999.99 - Gigabyte AORUS 17 (4.6 stars) Intel Core i9, RTX 4070, 16GB RAM, 1TB SSD, 360Hz Display\n", + "5. $2499.99 - Razer Blade 15 (4.6 stars) Intel Core i7, RTX 4060, 16GB RAM, 1TB SSD, 240Hz Display\n" + ] + } + ], "source": [ "new_nodes = get_retrieved_nodes(\n", - " rerank_promt,\n", - " vector_top_k=12,\n", - " reranker_top_n=3,\n", + " user_query,\n", + " vector_top_k=5,\n", + " reranker_top_n=5,\n", " with_reranker=True,\n", ")\n", "\n", - "results = visualize_retrieved_nodes(new_nodes[:3])\n", - "print(f\"Top 3 results with reranking: {json.dumps(results, indent=2)}\")" + "results = visualize_retrieved_nodes(new_nodes)\n", + "\n", + "print(\"\\nTop 5 results with reranking:\")\n", + "for idx, result in enumerate(results, start=1):\n", + " print(f\"{idx}. {result}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Elasticsearch Reranking" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Installing dependencies and import packages" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: elasticsearch==8.17 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (8.17.0)\n", + "Requirement already satisfied: elastic-transport<9,>=8.15.1 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from elasticsearch==8.17) (8.17.0)\n", + "Requirement already satisfied: urllib3<3,>=1.26.2 in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from elastic-transport<9,>=8.15.1->elasticsearch==8.17) (2.3.0)\n", + "Requirement already satisfied: certifi in /Users/jeffreyrengifo/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from elastic-transport<9,>=8.15.1->elasticsearch==8.17) (2025.1.31)\n", + "\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.0\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0.1\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install elasticsearch==8.17" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [], + "source": [ + "from elasticsearch import Elasticsearch\n", + "from elasticsearch.helpers import bulk" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Setup keys" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "os.environ[\"ELASTICSEARCH_ENDPOINT\"] = getpass(\"Elastic Endpoint: \")\n", + "os.environ[\"ELASTICSEARCH_API_KEY\"] = getpass(\"Elastic Api Key: \")\n", + "\n", + "INDEX_NAME = \"products-laptops\"\n", + "INFERENCE_RERANK_NAME = \"my-elastic-rerank\"" ] }, { "cell_type": "markdown", "metadata": { - "id": "k7D6EHPdnpr1" + "id": "3O2HclcYHEsS" }, "source": [ - "## Elasticsearch re-rankers" + "### Elasticsearch client" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 49, + "metadata": { + "id": "EHYHU2-1nUeW" + }, + "outputs": [], + "source": [ + "_client = Elasticsearch(\n", + " os.environ[\"ELASTICSEARCH_ENDPOINT\"],\n", + " api_key=os.environ[\"ELASTICSEARCH_API_KEY\"],\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Mappings" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "index created successfully\n" + ] + } + ], + "source": [ + "try:\n", + " _client.indices.create(\n", + " index=INDEX_NAME,\n", + " body={\n", + " \"mappings\": {\n", + " \"properties\": {\n", + " \"name\": {\"type\": \"text\", \"copy_to\": \"semantic_field\"},\n", + " \"description\": {\"type\": \"text\", \"copy_to\": \"semantic_field\"},\n", + " \"price\": {\"type\": \"float\", \"copy_to\": \"semantic_field\"},\n", + " \"reviews\": {\"type\": \"float\", \"copy_to\": \"semantic_field\"},\n", + " \"sales\": {\"type\": \"integer\", \"copy_to\": \"semantic_field\"},\n", + " \"features\": {\"type\": \"keyword\", \"copy_to\": \"semantic_field\"},\n", + " \"semantic_field\": {\"type\": \"semantic_text\"},\n", + " }\n", + " }\n", + " },\n", + " )\n", + "\n", + " print(\"index created successfully\")\n", + "except Exception as e:\n", + " print(\n", + " f\"Error creating inference endpoint: {e.info['error']['root_cause'][0]['reason'] }\"\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Inference rerank endpoint" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Inference endpoint created successfully.\n" + ] + } + ], + "source": [ + "try:\n", + " _client.options(\n", + " request_timeout=60, max_retries=3, retry_on_timeout=True\n", + " ).inference.put(\n", + " task_type=\"rerank\",\n", + " inference_id=INFERENCE_RERANK_NAME,\n", + " body={\n", + " \"service\": \"elasticsearch\",\n", + " \"service_settings\": {\n", + " \"model_id\": \".rerank-v1\",\n", + " \"num_threads\": 1,\n", + " \"adaptive_allocations\": {\n", + " \"enabled\": True,\n", + " \"min_number_of_allocations\": 1,\n", + " \"max_number_of_allocations\": 4,\n", + " },\n", + " },\n", + " },\n", + " )\n", + "\n", + " print(\"Inference endpoint created successfully.\")\n", + "\n", + "except Exception as e:\n", + " print(\n", + " f\"Error creating inference endpoint: {e.info['error']['root_cause'][0]['reason'] }\"\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ingesting documents to Elasticsearch" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "12 documents indexed successfully\n" + ] + } + ], + "source": [ + "def build_data():\n", + " for doc in products:\n", + " yield {\"_index\": INDEX_NAME, \"_source\": doc}\n", + "\n", + "\n", + "try:\n", + " success, errors = bulk(_client, build_data())\n", + " print(f\"{success} documents indexed successfully\")\n", + "\n", + " if errors:\n", + " print(\"Errors during indexing:\", errors)\n", + "\n", + "except Exception as e:\n", + " print(f\"Error: {str(e)}, please wait some seconds and try again.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 53, "metadata": { "id": "X0xbyG_fnoBU" }, "outputs": [], "source": [ + "# Function to execute search queries\n", "async def es_search(query):\n", " response = _client.search(index=INDEX_NAME, body=query)\n", " hits = response[\"hits\"][\"hits\"]\n", @@ -605,23 +846,65 @@ " if not hits:\n", " return \"\"\n", "\n", - " return json.dumps([hit[\"_source\"] for hit in hits], indent=2)" + " return hits" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 54, "metadata": {}, "outputs": [], "source": [ - "# Query with semantic search\n", - "result = await es_search(\n", + "# Function to format the results\n", + "def format_es_results(hits):\n", + " formatted_results = []\n", + "\n", + " for hit in hits:\n", + " source = hit[\"_source\"]\n", + " name = source.get(\"name\")\n", + " price = source.get(\"price\")\n", + " reviews = source.get(\"reviews\")\n", + " features = source.get(\"features\")\n", + "\n", + " formatted_result = f\"{price} - {name} ({reviews}) {features}\"\n", + " formatted_results.append(formatted_result)\n", + "\n", + " return formatted_results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Semantic query" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Query results:\n", + "1. 2999.99 - Alienware m18 (4.8) ['Intel Core i9', 'RTX 4090', '32GB RAM', '2TB SSD', '480Hz Display']\n", + "2. 2799.99 - MSI Stealth 17 (4.8) ['Intel Core i9', 'RTX 4080', '32GB RAM', '1TB SSD', '4K Display']\n", + "3. 1599.99 - HP Omen 16 (4.4) ['AMD Ryzen 7', 'RTX 3060', '16GB RAM', '512GB SSD', '165Hz Display']\n", + "4. 1399.99 - Acer Predator Helios 300 (4.5) ['Intel Core i7', 'RTX 3060', '16GB RAM', '512GB SSD', '144Hz Display']\n", + "5. 1999.99 - Gigabyte AORUS 17 (4.6) ['Intel Core i9', 'RTX 4070', '16GB RAM', '1TB SSD', '360Hz Display']\n" + ] + } + ], + "source": [ + "semantic_results = await es_search(\n", " {\n", - " \"size\": 3,\n", + " \"size\": 5,\n", " \"query\": {\n", " \"semantic\": {\n", " \"field\": \"semantic_field\",\n", - " \"query\": rerank_promt,\n", + " \"query\": user_query,\n", " }\n", " },\n", " \"_source\": {\n", @@ -637,12 +920,16 @@ " }\n", ")\n", "\n", - "print(f\"Query result: {result}\")" + "semantic_formatted_results = format_es_results(semantic_results)\n", + "\n", + "print(\"Query results:\")\n", + "for idx, result in enumerate(semantic_formatted_results, start=1):\n", + " print(f\"{idx}. {result}\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 70, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -650,11 +937,24 @@ "id": "ME8w7MR4orci", "outputId": "c8495176-ef78-4fb2-8cd8-6ca6c25b0811" }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Query results:\n", + "1. 1399.99 - Acer Predator Helios 300 (4.5) ['Intel Core i7', 'RTX 3060', '16GB RAM', '512GB SSD', '144Hz Display']\n", + "2. 2999.99 - Alienware m18 (4.8) ['Intel Core i9', 'RTX 4090', '32GB RAM', '2TB SSD', '480Hz Display']\n", + "3. 2799.99 - MSI Stealth 17 (4.8) ['Intel Core i9', 'RTX 4080', '32GB RAM', '1TB SSD', '4K Display']\n", + "4. 1999.99 - Gigabyte AORUS 17 (4.6) ['Intel Core i9', 'RTX 4070', '16GB RAM', '1TB SSD', '360Hz Display']\n", + "5. 1599.99 - HP Omen 16 (4.4) ['AMD Ryzen 7', 'RTX 3060', '16GB RAM', '512GB SSD', '165Hz Display']\n" + ] + } + ], "source": [ - "results = await es_search(\n", + "rerank_results = await es_search(\n", " {\n", - " \"size\": 3,\n", + " \"size\": 5,\n", " \"_source\": {\n", " \"includes\": [\n", " \"name\",\n", @@ -672,21 +972,25 @@ " \"query\": {\n", " \"semantic\": {\n", " \"field\": \"semantic_field\",\n", - " \"query\": rerank_promt,\n", + " \"query\": user_query,\n", " }\n", " }\n", " }\n", " },\n", - " \"field\": \"text\",\n", + " \"field\": \"semantic_field\",\n", " \"inference_id\": INFERENCE_RERANK_NAME,\n", - " \"inference_text\": rerank_promt,\n", - " \"rank_window_size\": 10,\n", - " \"min_score\": 0.5,\n", + " \"inference_text\": \"reorder by quality-price ratio\",\n", + " \"rank_window_size\": 5,\n", " }\n", " },\n", " }\n", ")\n", - "print(f\"Query result: {result}\")" + "\n", + "rerank_formatted_results = format_es_results(rerank_results)\n", + "\n", + "print(\"Query results:\")\n", + "for idx, result in enumerate(rerank_formatted_results, start=1):\n", + " print(f\"{idx}. {result}\")" ] }, { @@ -702,9 +1006,40 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 46, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/5w/qq_73hhn37v6k0qn0gqscwsw0000gn/T/ipykernel_22470/2652817320.py:10: DeprecationWarning: Passing transport options in the API method is deprecated. Use 'Elasticsearch.options()' instead.\n", + " result = _client.indices.delete(index=INDEX_NAME, ignore=[400, 404])\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DELETED successfully.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/5w/qq_73hhn37v6k0qn0gqscwsw0000gn/T/ipykernel_22470/2652817320.py:15: DeprecationWarning: Passing transport options in the API method is deprecated. Use 'Elasticsearch.options()' instead.\n", + " result = _client.inference.delete(inference_id=INFERENCE_RERANK_NAME, ignore=[400, 404])\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DELETED successfully.\n" + ] + } + ], "source": [ "def print_results(results):\n", " if results.get(\"acknowledged\", False):\n",