diff --git a/.github/actions/run-notebook/action.yml b/.github/actions/run-notebook/action.yml new file mode 100644 index 00000000..80533f2c --- /dev/null +++ b/.github/actions/run-notebook/action.yml @@ -0,0 +1,51 @@ +name: "Run Notebook" +description: "Run a notebook" + +inputs: + notebook: + description: "The notebook to run" + required: true + PINECONE_API_KEY: + description: "The Pinecone API key" + required: true + OPENAI_API_KEY: + description: "The OpenAI API key" + required: true + +runs: + using: 'composite' + steps: + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Install dependencies + shell: bash + run: | + pip install --upgrade pip + pip install nbformat + + - id: convert + shell: bash + name: Convert notebook into tmpdir script + run: | + python .github/actions/run-notebook/convert-notebook.py ${{ inputs.notebook }} + + - name: View the run script + shell: bash + run: | + cat ${{ steps.convert.outputs.script_path }} + + - name: View converted notebook content + shell: bash + run: | + cat ${{ steps.convert.outputs.notebook_path }} + + - name: Run the converted notebook + shell: bash + run: | + bash ${{ steps.convert.outputs.script_path }} + env: + PINECONE_API_KEY: ${{ inputs.PINECONE_API_KEY }} + OPENAI_API_KEY: ${{ inputs.OPENAI_API_KEY }} \ No newline at end of file diff --git a/.github/actions/run-notebook/convert-notebook.py b/.github/actions/run-notebook/convert-notebook.py new file mode 100755 index 00000000..2dfe2c57 --- /dev/null +++ b/.github/actions/run-notebook/convert-notebook.py @@ -0,0 +1,89 @@ +#! /usr/bin/env python + +# Convert a notebook to a Python script + +import os +import sys +import nbformat +import shutil +from tempfile import mkdtemp +from tempfile import TemporaryDirectory + +# Get the notebook filename from the command line +filename = "../../../" + sys.argv[1] +print(f"Processing notebook: {filename}") +nb_source_path = os.path.join(os.path.dirname(__file__), filename) + +temp_dir = mkdtemp() +venv_path = os.path.join(temp_dir, 'venv') +os.makedirs(venv_path, exist_ok=True) + +# Copy file into temp directory +temp_nb_path = os.path.join(temp_dir, 'notebook.ipynb') +print(f"Copying notebook to {temp_nb_path}") +shutil.copy(nb_source_path, temp_nb_path) + +with open(temp_nb_path, "r", encoding="utf-8") as f: + nb = nbformat.read(f, as_version=4) + +# Extract pip install commands (assumes they are written as "!pip install ..." or "%pip install ...") +# This grabs any line containing "pip install" in the script. +activate_venv = """ +#!/bin/bash + +set -ex + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# Create new virtual environment +python -m venv "${SCRIPT_DIR}/venv" + +# Activate the virtual environment +source "${SCRIPT_DIR}/venv/bin/activate" +pip install --upgrade pip +""" +run_commands = [activate_venv] +for cell in nb.cells: + if cell.cell_type == "code": + if "!pip" in cell.source or "%pip" in cell.source: + # Replace all instances of "!pip" and "%pip" with "pip" + command = cell.source.replace("!pip", "pip").replace("%pip", "pip") + run_commands.append(command) + +run_commands.append(""" +# Run the notebook executable code +python "${SCRIPT_DIR}/notebook.py" +""") + +run_commands.append(""" +# Deactivate the virtual environment +deactivate +""") + +# Save pip install commands to a run.sh script +run_script_path = os.path.join(temp_dir, 'run.sh') +with open(run_script_path, 'w', encoding="utf-8") as f: + f.write("\n".join(run_commands)) + +print(f"Setup script saved to {run_script_path}") + +# Collect cells that are not pip install commands +executable_cells = [] +for cell in nb.cells: + if cell.cell_type == "code": + if "pip" not in cell.source: + executable_cells.append(cell) + +# Save executable cells to a notebook.py file +script_path = os.path.join(temp_dir, 'notebook.py') +with open(script_path, 'w', encoding="utf-8") as f: + for cell in executable_cells: + f.write(cell.source + '\n') + +print(f"Script saved to {script_path}") + +# Output script and notebook path to github actions output +with open(os.environ['GITHUB_OUTPUT'], 'a') as f: + f.write(f"script_path={run_script_path}\n") + f.write(f"notebook_path={script_path}\n") + \ No newline at end of file diff --git a/.github/actions/validate-json/action.yml b/.github/actions/validate-json/action.yml new file mode 100644 index 00000000..b000e2d2 --- /dev/null +++ b/.github/actions/validate-json/action.yml @@ -0,0 +1,21 @@ +name: "Validate JSON" +description: "Validate JSON" + +runs: + using: 'composite' + steps: + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Install dependencies + shell: bash + run: | + pip install --upgrade pip + pip install nbformat + + - name: Validate all notebooks + shell: bash + run: | + python .github/actions/validate-json/validate-notebook-formats.py \ No newline at end of file diff --git a/.github/scripts/validate-notebook-formats.py b/.github/actions/validate-json/validate-notebook-formats.py similarity index 100% rename from .github/scripts/validate-notebook-formats.py rename to .github/actions/validate-json/validate-notebook-formats.py diff --git a/.github/scripts/version-census.py b/.github/scripts/version-census.py index 029ae619..9a4ee636 100644 --- a/.github/scripts/version-census.py +++ b/.github/scripts/version-census.py @@ -98,7 +98,8 @@ def main(): print() print(f"Notebooks using {client_type}:") for version, notebooks in sorted(pinecone_versions.items()): - if client_type in version: + client = version.split("==")[0] + if client_type == client: print(f" {version}: {len(notebooks)} notebooks") for notebook in notebooks: print(" - ", notebook) diff --git a/.github/workflows/client-versions.yaml b/.github/workflows/client-versions.yaml index 60744195..cc6e1eaf 100644 --- a/.github/workflows/client-versions.yaml +++ b/.github/workflows/client-versions.yaml @@ -1,10 +1,8 @@ name: "Report: Client Version Usage" on: - push: - branches: - - main - pull_request: + workflow_dispatch: + workflow_call: jobs: analyze-client-versions: diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml new file mode 100644 index 00000000..c5ce87de --- /dev/null +++ b/.github/workflows/pr.yaml @@ -0,0 +1,16 @@ +name: "Pull Request" + +on: + pull_request: + push: + branches: + - main + +jobs: + report-client-versions: + uses: './.github/workflows/client-versions.yaml' + secrets: inherit + + test-notebooks: + uses: './.github/workflows/test-notebooks-changed.yaml' + secrets: inherit diff --git a/.github/workflows/test-notebooks-all.yaml b/.github/workflows/test-notebooks-all.yaml new file mode 100644 index 00000000..a22bb66b --- /dev/null +++ b/.github/workflows/test-notebooks-all.yaml @@ -0,0 +1,46 @@ +name: "Test: All Notebooks" + +on: + workflow_dispatch: + inputs: + directory: + description: 'Directory to search for notebooks' + required: true + default: 'docs' + type: string + +jobs: + validate-notebooks: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/validate-json + + list-notebooks: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + steps: + - uses: actions/checkout@v4 + - name: Find all *.ipynb files + id: set-matrix + run: | + # Get list of all .ipynb files in target directory + NOTEBOOKS=$(find ${{ inputs.directory }} -name "*.ipynb" | jq -R -s -c 'split("\n")[:-1]') + echo "matrix={\"notebook\":$NOTEBOOKS}" >> $GITHUB_OUTPUT + + test-notebooks: + needs: list-notebooks + runs-on: ubuntu-latest + strategy: + fail-fast: false + max-parallel: 10 + matrix: ${{ fromJSON(needs.list-notebooks.outputs.matrix) }} + steps: + - uses: actions/checkout@v4 + + - uses: ./.github/actions/run-notebook + with: + notebook: ${{ matrix.notebook }} + PINECONE_API_KEY: ${{ secrets.PINECONE_API_KEY }} + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} diff --git a/.github/workflows/test-notebooks-changed.yaml b/.github/workflows/test-notebooks-changed.yaml new file mode 100644 index 00000000..2d329fcd --- /dev/null +++ b/.github/workflows/test-notebooks-changed.yaml @@ -0,0 +1,62 @@ +name: "Test: Notebook Execution" + +on: + workflow_call: + inputs: + base_ref: + required: false + type: string + default: 'master' + +jobs: + validate-notebooks: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/validate-json + + detect-changes: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + has_changes: ${{ steps.set-matrix.outputs.has_changes }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # Required for git diff + + - name: Fetch base branch + run: git fetch origin ${{ inputs.base_ref }} + + - name: Detect changed notebooks + id: set-matrix + run: | + # Get list of changed .ipynb files + CHANGED_NOTEBOOKS=$(git diff --name-only origin/${{ inputs.base_ref }}...HEAD | grep '\.ipynb$' || true) + if [ -z "$CHANGED_NOTEBOOKS" ]; then + echo "No notebook changes detected" + echo "has_changes=false" >> $GITHUB_OUTPUT + echo "matrix={\"notebook\":[]}" >> $GITHUB_OUTPUT + else + # Convert newlines to JSON array format + NOTEBOOK_LIST=$(echo "$CHANGED_NOTEBOOKS" | jq -R -s -c 'split("\n")[:-1]') + echo "has_changes=true" >> $GITHUB_OUTPUT + echo "matrix={\"notebook\":$NOTEBOOK_LIST}" >> $GITHUB_OUTPUT + fi + + test-notebooks: + needs: + - detect-changes + - validate-notebooks + if: needs.detect-changes.outputs.has_changes == 'true' + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: ${{ fromJSON(needs.detect-changes.outputs.matrix) }} + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/run-notebook + with: + notebook: ${{ matrix.notebook }} + PINECONE_API_KEY: ${{ secrets.PINECONE_API_KEY }} + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} diff --git a/.github/workflows/validate.yaml b/.github/workflows/validate.yaml deleted file mode 100644 index f8bca719..00000000 --- a/.github/workflows/validate.yaml +++ /dev/null @@ -1,25 +0,0 @@ -name: Validate Notebook JSON - -on: - push: - branches: - - main - pull_request: - -jobs: - validate-notebooks: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - - name: Install dependencies - run: pip install nbformat - - - name: Validate all notebooks - run: | - python .github/scripts/validate-notebook-formats.py \ No newline at end of file diff --git a/docs/pinecone-reranker.ipynb b/docs/pinecone-reranker.ipynb index 833ba53f..f6d44ffb 100644 --- a/docs/pinecone-reranker.ipynb +++ b/docs/pinecone-reranker.ipynb @@ -1,550 +1,910 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "EE8es7PuO2RM", - "metadata": { - "id": "EE8es7PuO2RM" - }, - "source": [ - "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/pinecone-io/examples/blob/master/docs/pinecone-reranker.ipynb) [![Open nbviewer](https://raw.githubusercontent.com/pinecone-io/examples/master/assets/nbviewer-shield.svg)](https://nbviewer.org/github/pinecone-io/examples/blob/master/docs/pinecone-reranker.ipynb)\n", - "\n", - "# Pinecone Serverless Reranking in Action\n", - "\n", - "### Overview\n", - "\n", - "\n", - "Reranking models are designed to enhance search relevance. They work by assessing the similarity between a query and a document, producing a numerical score that reflects how well the document matches the query. This score is then used to reorder documents, prioritizing those most relevant to the user's search.\n", - "\n", - "The process of reranking is crucial in improving the quality of information presented to users or supplied as context to Large Language Models (LLMs) by helping to filter out less relevant results and bringing the most pertinent information to the forefront.\n", - "\n", - "We now offer reranking support within the Pinecone Inference API. This feature eliminates the need for users to manage and deploy these models themselves. You can find a more through overview of our reranking [here](https://www.pinecone.io/learn/refine-with-rerank/).\n", - "\n", - "Below is the flow of a sample application utilizing a reranker:" - ] - }, - { - "cell_type": "markdown", - "id": "mZVVVzs2dQI0", - "metadata": { - "id": "mZVVVzs2dQI0" - }, - "source": [ - "![reranker.png](data:image/png;base64,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)" - ] - }, - { - "cell_type": "markdown", - "id": "OzKJdRqsfHIC", - "metadata": { - "id": "OzKJdRqsfHIC" - }, - "source": [ - "### Steps in This Notebook:\n", - "\n", - "1. **Load Libraries**\n", - "2. **Load Small Documents Object**\n", - "3. **Execute Reranking Model**\n", - "4. **Show Results**\n", - "5. **Create Index**\n", - "6. **Upsert Sample Data**\n", - "7. **Embed Query**\n", - "8. **Execute Search**\n", - "9. **View Results**\n", - "10. **Rerank Results**\n", - "\n", - "\n", - "The main dataset we will be using consists of randomly generated doctor’s notes sample data. The original JSON data has been embedded into vectors, which we will load into Pinecone.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "Ns7xj3uxO2RO", - "metadata": { - "id": "Ns7xj3uxO2RO" - }, - "outputs": [], - "source": [ - "# Installation\n", - "!pip install -U pinecone-client\n", - "!pip install -U --pre pinecone-plugin-inference\n", - "!pip install -U pinecone-notebooks" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "_NsyrR-1Z02X", - "metadata": { - "id": "_NsyrR-1Z02X" - }, - "outputs": [], - "source": [ - "import os\n", - "\n", - "if not os.environ.get(\"PINECONE_API_KEY\"):\n", - " from pinecone_notebooks.colab import Authenticate\n", - " Authenticate()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "tGxwpB7OZjFn", - "metadata": { - "id": "tGxwpB7OZjFn" - }, - "outputs": [], - "source": [ - "from pinecone import Pinecone\n", - "\n", - "api_key = os.environ.get(\"PINECONE_API_KEY\")\n", - "\n", - "# configure client\n", - "pc = Pinecone(api_key=api_key)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "uj9tOi7WO2RP", - "metadata": { - "id": "uj9tOi7WO2RP" - }, - "outputs": [], - "source": [ - "# Create query and documents\n", - "query = \"Tell me about Apple's products\"\n", - "documents = [\n", - " \"Apple is a popular fruit known for its sweetness and crisp texture.\",\n", - " \"Apple is known for its innovative products like the iPhone.\",\n", - " \"Many people enjoy eating apples as a healthy snack.\",\n", - " \"Apple Inc. has revolutionized the tech industry with its sleek designs and user-friendly interfaces.\",\n", - " \"An apple a day keeps the doctor away, as the saying goes.\"\n", - "]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4xGTyQv3g7iR", - "metadata": { - "id": "4xGTyQv3g7iR" - }, - "outputs": [], - "source": [ - "documents" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "Jx5F7QYPO2RP", - "metadata": { - "id": "Jx5F7QYPO2RP" - }, - "outputs": [], - "source": [ - "# Perform reranking to get top_n results based on the query\n", - "reranked_results = pc.inference.rerank(\n", - " model=\"bge-reranker-v2-m3\",\n", - " query=query,\n", - " documents=documents,\n", - " top_n=3,\n", - " return_documents=True\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "jY9NtvKMO2RP", - "metadata": { - "id": "jY9NtvKMO2RP" - }, - "outputs": [], - "source": [ - "# Display the reranked results\n", - "print(query)\n", - "\n", - "print(\"Top 3 Reranked Documents:\")\n", - "for i, entry in enumerate(reranked_results.data): # Access the 'data' attribute\n", - " document_text = entry['document']['text'] # Extract the text of the document\n", - " score = entry['score'] # Extract the score\n", - " print(f\"{i+1}: Score: {score}, Document: {document_text}\")\n", - "\n", - "#Note the reranker ranks Apple the company over apple the fruit based on the context of the query" - ] - }, - { - "cell_type": "markdown", - "id": "dC73hnorO2RQ", - "metadata": { - "id": "dC73hnorO2RQ" - }, - "source": [ - "### Enhanced Medical Note Retrieval for Improved Clinical Decision-Making\n", - "**Scenario**: A healthcare system allows doctors to search through a large dataset of medical notes to find relevant patient information.\n", - "\n", - "**Application**: After an initial list of relevant notes is generated from a search query, a reranker can fine-tune the order by considering factors such as the specificity of the medical conditions mentioned, and the relevance to the patient's current symptoms or treatment plan. This ensures that the most critical and contextually relevant notes are presented first, aiding in quicker and more accurate clinical decision-making." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "vqdr1UlDO2RP", - "metadata": { - "id": "vqdr1UlDO2RP" - }, - "outputs": [], - "source": [ - "import os\n", - "import time\n", - "import pandas as pd\n", - "from google.colab import files\n", - "from pinecone import Pinecone, ServerlessSpec\n", - "from transformers import AutoTokenizer, AutoModel\n", - "import torch" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "UvZ5s6SsZPG_", - "metadata": { - "id": "UvZ5s6SsZPG_" - }, - "outputs": [], - "source": [ - "# Get cloud and region settings\n", - "cloud = os.getenv('PINECONE_CLOUD', 'aws')\n", - "region = os.getenv('PINECONE_REGION', 'us-east-1')\n", - "\n", - "# Define serverless specifications\n", - "spec = ServerlessSpec(cloud=cloud, region=region)\n", - "\n", - "# Define index name\n", - "index_name = 'pinecone-reranker'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ySCKGQ8XDx43", - "metadata": { - "id": "ySCKGQ8XDx43" - }, - "outputs": [], - "source": [ - "import time\n", - "\n", - "if index_name in pc.list_indexes().names():\n", - " pc.delete_index(index_name)\n", - "\n", - "# Create a new index\n", - "pc.create_index(index_name, dimension=384, metric='cosine', spec=spec)\n", - "\n", - "# wait for index to be initialized\n", - "while not pc.describe_index(index_name).status['ready']:\n", - " time.sleep(1)\n", - "print(f\"Index {index_name} has been successfully created.\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "sSHvtj9kEJS4", - "metadata": { - "id": "sSHvtj9kEJS4" - }, - "outputs": [], - "source": [ - "index = pc.Index(index_name)\n", - "# wait a moment for connection\n", - "time.sleep(1)\n", - "\n", - "index.describe_index_stats()" - ] - }, - { - "cell_type": "markdown", - "id": "xOXoiGFeVaZ_", - "metadata": { - "id": "xOXoiGFeVaZ_" - }, - "source": [ - "### Load Data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "TP27ES75VOGv", - "metadata": { - "id": "TP27ES75VOGv" - }, - "outputs": [], - "source": [ - "# Step 1: Upload the file from from the repository: docs/data/sample_notes_data.jsonl to Google Colab\n", - "uploaded = files.upload()\n", - "\n", - "# Step 2: Assuming the file is uploaded, read it into a DataFrame\n", - "file_name = next(iter(uploaded.keys()))\n", - "df = pd.read_json(file_name, orient='records', lines=True)\n", - "\n", - "# Show head of the DataFrame\n", - "df.head()" - ] - }, - { - "cell_type": "markdown", - "id": "MKvl9Pr9c6Vs", - "metadata": { - "id": "MKvl9Pr9c6Vs" - }, - "source": [ - "### Connect to Index and UPSERT Data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "-TDP4VMQVu4C", - "metadata": { - "id": "-TDP4VMQVu4C" - }, - "outputs": [], - "source": [ - "# Connect to index\n", - "index = pc.Index(index_name)\n", - "time.sleep(1)\n", - "\n", - "# Upsert data into index from DataFrame\n", - "index.upsert_from_dataframe(df)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "eu43tFQwg3YE", - "metadata": { - "id": "eu43tFQwg3YE" - }, - "outputs": [], - "source": [ - "# View index stats\n", - "index.describe_index_stats()" - ] - }, - { - "cell_type": "markdown", - "id": "POAoISsAeZAt", - "metadata": { - "id": "POAoISsAeZAt" - }, - "source": [ - "## Embedding Function\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "h4lkfpnPeXmx", - "metadata": { - "id": "h4lkfpnPeXmx" - }, - "outputs": [], - "source": [ - "def get_embedding(input_question):\n", - " model_name = 'sentence-transformers/all-MiniLM-L6-v2' #Hugging Face Model\n", - " tokenizer = AutoTokenizer.from_pretrained(model_name)\n", - " model = AutoModel.from_pretrained(model_name)\n", - "\n", - " encoded_input = tokenizer(input_question, padding=True, truncation=True, return_tensors='pt')\n", - "\n", - " with torch.no_grad():\n", - " model_output = model(**encoded_input)\n", - "\n", - " embedding = model_output.last_hidden_state[0].mean(dim=0)\n", - " return embedding" - ] - }, - { - "cell_type": "markdown", - "id": "RL9odEJ9dDSG", - "metadata": { - "id": "RL9odEJ9dDSG" - }, - "source": [ - "## Execute Query" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "xskqy0AbV14d", - "metadata": { - "id": "xskqy0AbV14d" - }, - "outputs": [], - "source": [ - "# Build a query to search\n", - "question = \"what if my patient has leg pain\"\n", - "query = get_embedding(question).tolist()\n", - "\n", - "# Get results\n", - "results = index.query(vector=[query], top_k=10, include_metadata=True)\n", - "\n", - "# Sort results by score in descending order\n", - "sorted_matches = sorted(results['matches'], key=lambda x: x['score'], reverse=True)" - ] - }, - { - "cell_type": "markdown", - "id": "JkVM2XQpdPvv", - "metadata": { - "id": "JkVM2XQpdPvv" - }, - "source": [ - "## Show Results" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "eLVSmaHxV8XP", - "metadata": { - "id": "eLVSmaHxV8XP" - }, - "outputs": [], - "source": [ - "# Print results\n", - "print(f'Original question: {question}')\n", - "print('---\\nResults:\\n--------------')\n", - "for match in sorted_matches:\n", - " print(f'ID: {match[\"id\"]}')\n", - " print(f'Score: {match[\"score\"]}')\n", - " print(f'Metadata: {match[\"metadata\"]}')\n", - " print('---')" - ] - }, - { - "cell_type": "markdown", - "id": "-L62zHVmdcQP", - "metadata": { - "id": "-L62zHVmdcQP" - }, - "source": [ - "### Perform Rerank" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "32WVD7lPo7Tb", - "metadata": { - "id": "32WVD7lPo7Tb" - }, - "outputs": [], - "source": [ - "# Create documents with concatenated metadata field as \"reranking_field\" field\n", - "documents = [\n", - " {\n", - " 'id': match['id'],\n", - " 'reranking_field': ' '.join([f\"{key}: {value}\" for key, value in match['metadata'].items()])\n", - " }\n", - " for match in results['matches']\n", - "]\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "WLWt80fwq18w", - "metadata": { - "id": "WLWt80fwq18w" - }, - "outputs": [], - "source": [ - "# Define a more specific query for reranking\n", - "query = \"what if my patient had knee surgery\"\n", - "\n", - "# Perform reranking based on the query and specified field\n", - "reranked_results_field = pc.inference.rerank(\n", - " model=\"bge-reranker-v2-m3\",\n", - " query=query,\n", - " documents=documents, # Use the transformed documents\n", - " rank_fields=[\"reranking_field\"],\n", - " top_n=2,\n", - " return_documents=True,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0iDXuSUYsTm4", - "metadata": { - "id": "0iDXuSUYsTm4" - }, - "outputs": [], - "source": [ - "# Print results\n", - "print(f'Original question: {query}')\n", - "print('---\\nResults:\\n--------------')\n", - "for match in reranked_results_field.data:\n", - " print(f'ID: {match[\"document\"][\"id\"]}')\n", - " print(f'Score: {match[\"score\"]:.6f}')\n", - " print(f'Text: {match[\"document\"][\"reranking_field\"]}')\n", - " print('---')\n" - ] - }, - { - "cell_type": "markdown", - "id": "8PQTLfT-Frv8", - "metadata": { - "id": "8PQTLfT-Frv8" - }, - "source": [ - "Now let's delete the index to save resources" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "lEooi2--F0yR", - "metadata": { - "id": "lEooi2--F0yR" - }, - "outputs": [], - "source": [ - "pc.delete_index(index_name)" - ] + "cells": [ + { + "cell_type": "markdown", + "id": "EE8es7PuO2RM", + "metadata": { + "id": "EE8es7PuO2RM" + }, + "source": [ + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/pinecone-io/examples/blob/master/docs/pinecone-reranker.ipynb) [![Open nbviewer](https://raw.githubusercontent.com/pinecone-io/examples/master/assets/nbviewer-shield.svg)](https://nbviewer.org/github/pinecone-io/examples/blob/master/docs/pinecone-reranker.ipynb)\n", + "\n", + "# Pinecone Serverless Reranking in Action\n", + "\n", + "### Overview\n", + "\n", + "\n", + "Reranking models are designed to enhance search relevance. They work by assessing the similarity between a query and a document, producing a numerical score that reflects how well the document matches the query. This score is then used to reorder documents, prioritizing those most relevant to the user's search.\n", + "\n", + "The process of reranking is crucial in improving the quality of information presented to users or supplied as context to Large Language Models (LLMs) by helping to filter out less relevant results and bringing the most pertinent information to the forefront.\n", + "\n", + "We now offer reranking support within the Pinecone Inference API. This feature eliminates the need for users to manage and deploy these models themselves. You can find a more through overview of our reranking [here](https://www.pinecone.io/learn/refine-with-rerank/).\n", + "\n", + "Below is the flow of a sample application utilizing a reranker:" + ] + }, + { + "cell_type": "markdown", + "id": "mZVVVzs2dQI0", + "metadata": { + "id": "mZVVVzs2dQI0" + }, + "source": [ + "![reranker.png](data:image/png;base64,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)" + ] + }, + { + "cell_type": "markdown", + "id": "OzKJdRqsfHIC", + "metadata": { + "id": "OzKJdRqsfHIC" + }, + "source": [ + "### Steps in This Notebook:\n", + "\n", + "1. **Load Libraries**\n", + "2. **Load Small Documents Object**\n", + "3. **Execute Reranking Model**\n", + "4. **Show Results**\n", + "5. **Create Index**\n", + "6. **Upsert Sample Data**\n", + "7. **Embed Query**\n", + "8. **Execute Search**\n", + "9. **View Results**\n", + "10. **Rerank Results**\n", + "\n", + "\n", + "The main dataset we will be using consists of randomly generated doctor’s notes sample data. The original JSON data has been embedded into vectors, which we will load into Pinecone.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "Ns7xj3uxO2RO", + "metadata": { + "id": "Ns7xj3uxO2RO" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: pinecone==6.0.1 in /opt/conda/lib/python3.12/site-packages (6.0.1)\n", + "Requirement already satisfied: certifi>=2019.11.17 in /opt/conda/lib/python3.12/site-packages (from pinecone==6.0.1) (2025.1.31)\n", + "Requirement already satisfied: pinecone-plugin-interface<0.0.8,>=0.0.7 in /opt/conda/lib/python3.12/site-packages (from pinecone==6.0.1) (0.0.7)\n", + "Requirement already satisfied: python-dateutil>=2.5.3 in /opt/conda/lib/python3.12/site-packages (from pinecone==6.0.1) (2.9.0.post0)\n", + "Requirement already satisfied: typing-extensions>=3.7.4 in /opt/conda/lib/python3.12/site-packages (from pinecone==6.0.1) (4.12.2)\n", + "Requirement already satisfied: urllib3>=1.26.5 in /opt/conda/lib/python3.12/site-packages (from pinecone==6.0.1) (2.3.0)\n", + "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.12/site-packages (from python-dateutil>=2.5.3->pinecone==6.0.1) (1.17.0)\n", + "Requirement already satisfied: pinecone-notebooks in /opt/conda/lib/python3.12/site-packages (0.1.1)\n" + ] } - ], - "metadata": { - "colab": { - "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.8.8" + ], + "source": [ + "# Installation\n", + "!pip install -U pinecone==6.0.1\n", + "!pip install -U pinecone-notebooks" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "_NsyrR-1Z02X", + "metadata": { + "id": "_NsyrR-1Z02X" + }, + "outputs": [], + "source": [ + "import os\n", + "\n", + "if not os.environ.get(\"PINECONE_API_KEY\"):\n", + " from pinecone_notebooks.colab import Authenticate\n", + " Authenticate()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "tGxwpB7OZjFn", + "metadata": { + "id": "tGxwpB7OZjFn" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/conda/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], + "source": [ + "from pinecone import Pinecone\n", + "\n", + "api_key = os.environ.get(\"PINECONE_API_KEY\")\n", + "\n", + "# Instantiate the Pinecone client\n", + "pc = Pinecone(api_key=api_key)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "uj9tOi7WO2RP", + "metadata": { + "id": "uj9tOi7WO2RP" + }, + "outputs": [], + "source": [ + "# Create query and documents\n", + "query = \"Tell me about Apple's products\"\n", + "documents = [\n", + " \"Apple is a popular fruit known for its sweetness and crisp texture.\",\n", + " \"Apple is known for its innovative products like the iPhone.\",\n", + " \"Many people enjoy eating apples as a healthy snack.\",\n", + " \"Apple Inc. has revolutionized the tech industry with its sleek designs and user-friendly interfaces.\",\n", + " \"An apple a day keeps the doctor away, as the saying goes.\"\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "4xGTyQv3g7iR", + "metadata": { + "id": "4xGTyQv3g7iR" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['Apple is a popular fruit known for its sweetness and crisp texture.',\n", + " 'Apple is known for its innovative products like the iPhone.',\n", + " 'Many people enjoy eating apples as a healthy snack.',\n", + " 'Apple Inc. has revolutionized the tech industry with its sleek designs and user-friendly interfaces.',\n", + " 'An apple a day keeps the doctor away, as the saying goes.']" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" } + ], + "source": [ + "documents" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "Jx5F7QYPO2RP", + "metadata": { + "id": "Jx5F7QYPO2RP" + }, + "outputs": [], + "source": [ + "from pinecone import RerankModel\n", + "\n", + "# Perform reranking to get top_n results based on the query\n", + "reranked_results = pc.inference.rerank(\n", + " model=RerankModel.Bge_Reranker_V2_M3,\n", + " query=query,\n", + " documents=documents,\n", + " top_n=3,\n", + " return_documents=True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "jY9NtvKMO2RP", + "metadata": { + "id": "jY9NtvKMO2RP" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Query: Tell me about Apple's products\n", + "Reranked Results:\n", + " 1. Score: 0.83907574\n", + " Document: Apple is known for its innovative products like the iPhone.\n", + "\n", + " 2. Score: 0.23196201\n", + " Document: Apple Inc. has revolutionized the tech industry with its sleek designs and user-friendly interfaces.\n", + "\n", + " 3. Score: 0.1742697\n", + " Document: Apple is a popular fruit known for its sweetness and crisp texture.\n", + "\n" + ] + } + ], + "source": [ + "def show_reranked_results(query, matches):\n", + " \"\"\"A utility function to print our reranked results\"\"\"\n", + " print(f'Query: {query}')\n", + " print('Reranked Results:')\n", + " for i, match in enumerate(matches):\n", + " print(f'{str(i+1).rjust(4)}. Score: {match.score}')\n", + " print(f' Document: {match.document.text}')\n", + " print('')\n", + "\n", + "# Note the reranker ranks Apple the company over apple the fruit based on the context of the query\n", + "show_reranked_results(query, reranked_results.data)" + ] + }, + { + "cell_type": "markdown", + "id": "dC73hnorO2RQ", + "metadata": { + "id": "dC73hnorO2RQ" + }, + "source": [ + "### Enhanced Medical Note Retrieval for Improved Clinical Decision-Making\n", + "**Scenario**: A healthcare system allows doctors to search through a large dataset of medical notes to find relevant patient information.\n", + "\n", + "**Application**: After an initial list of relevant notes is generated from a search query, a reranker can fine-tune the order by considering factors such as the specificity of the medical conditions mentioned, and the relevance to the patient's current symptoms or treatment plan. This ensures that the most critical and contextually relevant notes are presented first, aiding in quicker and more accurate clinical decision-making." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "f73e8ba3-9ea9-45b5-9c1e-ddbffd31dc4d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: pandas in /opt/conda/lib/python3.12/site-packages (2.2.3)\n", + "Requirement already satisfied: torch in /opt/conda/lib/python3.12/site-packages (2.6.0)\n", + "Requirement already satisfied: transformers in /opt/conda/lib/python3.12/site-packages (4.49.0)\n", + "Requirement already satisfied: numpy>=1.26.0 in /opt/conda/lib/python3.12/site-packages (from pandas) (2.2.3)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /opt/conda/lib/python3.12/site-packages (from pandas) (2.9.0.post0)\n", + "Requirement already satisfied: pytz>=2020.1 in /opt/conda/lib/python3.12/site-packages (from pandas) (2025.1)\n", + "Requirement already satisfied: tzdata>=2022.7 in /opt/conda/lib/python3.12/site-packages (from pandas) (2025.1)\n", + "Requirement already satisfied: filelock in /opt/conda/lib/python3.12/site-packages (from torch) (3.17.0)\n", + "Requirement already satisfied: typing-extensions>=4.10.0 in /opt/conda/lib/python3.12/site-packages (from torch) (4.12.2)\n", + "Requirement already satisfied: setuptools in /opt/conda/lib/python3.12/site-packages (from torch) (75.8.0)\n", + "Requirement already satisfied: sympy==1.13.1 in /opt/conda/lib/python3.12/site-packages (from torch) (1.13.1)\n", + "Requirement already satisfied: networkx in /opt/conda/lib/python3.12/site-packages (from torch) (3.4.2)\n", + "Requirement already satisfied: jinja2 in /opt/conda/lib/python3.12/site-packages (from torch) (3.1.5)\n", + "Requirement already satisfied: fsspec in /opt/conda/lib/python3.12/site-packages (from torch) (2025.2.0)\n", + "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /opt/conda/lib/python3.12/site-packages (from sympy==1.13.1->torch) (1.3.0)\n", + "Requirement already satisfied: huggingface-hub<1.0,>=0.26.0 in /opt/conda/lib/python3.12/site-packages (from transformers) (0.29.1)\n", + "Requirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.12/site-packages (from transformers) (24.2)\n", + "Requirement already satisfied: pyyaml>=5.1 in /opt/conda/lib/python3.12/site-packages (from transformers) (6.0.2)\n", + "Requirement already satisfied: regex!=2019.12.17 in /opt/conda/lib/python3.12/site-packages (from transformers) (2024.11.6)\n", + "Requirement already satisfied: requests in /opt/conda/lib/python3.12/site-packages (from transformers) (2.32.3)\n", + "Requirement already satisfied: tokenizers<0.22,>=0.21 in /opt/conda/lib/python3.12/site-packages (from transformers) (0.21.0)\n", + "Requirement already satisfied: safetensors>=0.4.1 in /opt/conda/lib/python3.12/site-packages (from transformers) (0.5.2)\n", + "Requirement already satisfied: tqdm>=4.27 in /opt/conda/lib/python3.12/site-packages (from transformers) (4.67.1)\n", + "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.12/site-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.12/site-packages (from jinja2->torch) (3.0.2)\n", + "Requirement already satisfied: charset_normalizer<4,>=2 in /opt/conda/lib/python3.12/site-packages (from requests->transformers) (3.4.1)\n", + "Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.12/site-packages (from requests->transformers) (3.10)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/conda/lib/python3.12/site-packages (from requests->transformers) (2.3.0)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.12/site-packages (from requests->transformers) (2025.1.31)\n" + ] + } + ], + "source": [ + "!pip install pandas torch transformers" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "vqdr1UlDO2RP", + "metadata": { + "id": "vqdr1UlDO2RP" + }, + "outputs": [], + "source": [ + "import os\n", + "import time\n", + "import pandas as pd\n", + "from pinecone import Pinecone, ServerlessSpec\n", + "from transformers import AutoTokenizer, AutoModel\n", + "import torch" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "UvZ5s6SsZPG_", + "metadata": { + "id": "UvZ5s6SsZPG_" + }, + "outputs": [], + "source": [ + "# Get cloud and region settings\n", + "cloud = os.getenv('PINECONE_CLOUD', 'aws')\n", + "region = os.getenv('PINECONE_REGION', 'us-east-1')\n", + "\n", + "# Define serverless specifications\n", + "spec = ServerlessSpec(cloud=cloud, region=region)\n", + "\n", + "# Define index name\n", + "index_name = 'pinecone-reranker'" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "ySCKGQ8XDx43", + "metadata": { + "id": "ySCKGQ8XDx43" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{\n", + " \"name\": \"pinecone-reranker\",\n", + " \"metric\": \"cosine\",\n", + " \"host\": \"pinecone-reranker-dojoi3u.svc.aped-4627-b74a.pinecone.io\",\n", + " \"spec\": {\n", + " \"serverless\": {\n", + " \"cloud\": \"aws\",\n", + " \"region\": \"us-east-1\"\n", + " }\n", + " },\n", + " \"status\": {\n", + " \"ready\": true,\n", + " \"state\": \"Ready\"\n", + " },\n", + " \"vector_type\": \"dense\",\n", + " \"dimension\": 384,\n", + " \"deletion_protection\": \"disabled\",\n", + " \"tags\": null\n", + "}" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "if pc.has_index(name=index_name):\n", + " pc.delete_index(name=index_name)\n", + "\n", + "# Create a new index\n", + "pc.create_index(\n", + " name=index_name, \n", + " dimension=384, \n", + " metric='cosine', \n", + " spec=spec\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "xOXoiGFeVaZ_", + "metadata": { + "id": "xOXoiGFeVaZ_" + }, + "source": [ + "### Load Data" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "TP27ES75VOGv", + "metadata": { + "id": "TP27ES75VOGv" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idvaluesmetadata
0P011[-0.2027486265, 0.2769146562, -0.1509393603, 0...{'advice': 'rest, hydrate', 'symptoms': 'heada...
1P001[0.1842793673, 0.4459365904, -0.0770567134, 0....{'tests': 'EKG, stress test', 'symptoms': 'che...
2P002[-0.2040648609, -0.1739618927, -0.2897160649, ...{'HbA1c': '7.2', 'condition': 'diabetes', 'med...
3P003[0.1889383644, 0.2924542725, -0.2335938066, -0...{'symptoms': 'cough, wheezing', 'diagnosis': '...
4P004[-0.12171068040000001, 0.1674752235, -0.231888...{'referral': 'dermatology', 'condition': 'susp...
\n", + "
" + ], + "text/plain": [ + " id values \\\n", + "0 P011 [-0.2027486265, 0.2769146562, -0.1509393603, 0... \n", + "1 P001 [0.1842793673, 0.4459365904, -0.0770567134, 0.... \n", + "2 P002 [-0.2040648609, -0.1739618927, -0.2897160649, ... \n", + "3 P003 [0.1889383644, 0.2924542725, -0.2335938066, -0... \n", + "4 P004 [-0.12171068040000001, 0.1674752235, -0.231888... \n", + "\n", + " metadata \n", + "0 {'advice': 'rest, hydrate', 'symptoms': 'heada... \n", + "1 {'tests': 'EKG, stress test', 'symptoms': 'che... \n", + "2 {'HbA1c': '7.2', 'condition': 'diabetes', 'med... \n", + "3 {'symptoms': 'cough, wheezing', 'diagnosis': '... \n", + "4 {'referral': 'dermatology', 'condition': 'susp... " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import requests\n", + "import tempfile\n", + "\n", + "with tempfile.TemporaryDirectory() as tmpdirname:\n", + " # Construct the full path for the file within the temporary directory.\n", + " file_path = os.path.join(tmpdirname, \"sample_notes_data.jsonl\")\n", + " \n", + " # Download the file from github\n", + " url = \"https://raw.githubusercontent.com/pinecone-io/examples/refs/heads/master/docs/data/sample_notes_data.jsonl\"\n", + " response = requests.get(url)\n", + " response.raise_for_status() # Raise an exception for any HTTP errors.\n", + " \n", + " # Write the file content to the temporary directory.\n", + " with open(file_path, \"wb\") as f:\n", + " f.write(response.content)\n", + "\n", + " df = pd.read_json(file_path, orient='records', lines=True)\n", + "\n", + "# Show head of the DataFrame\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "id": "MKvl9Pr9c6Vs", + "metadata": { + "id": "MKvl9Pr9c6Vs" + }, + "source": [ + "### Upsert data to the index" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "-TDP4VMQVu4C", + "metadata": { + "id": "-TDP4VMQVu4C" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "sending upsert requests: 100%|██████████| 100/100 [00:00<00:00, 200.29it/s]\n" + ] + }, + { + "data": { + "text/plain": [ + "{'upserted_count': 100}" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Instantiate an index client\n", + "index = pc.Index(name=index_name)\n", + "\n", + "# Upsert data into index from DataFrame\n", + "index.upsert_from_dataframe(df)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "144d6557-da46-46e5-901d-3cb5204a8d54", + "metadata": { + "id": "eu43tFQwg3YE" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Vector count: 0\n", + "Vector count: 0\n", + "Vector count: 0\n", + "Vector count: 0\n", + "Vector count: 0\n", + "Vector count: 0\n", + "Vector count: 0\n", + "Vector count: 0\n", + "Vector count: 0\n", + "Vector count: 100\n" + ] + }, + { + "data": { + "text/plain": [ + "{'dimension': 384,\n", + " 'index_fullness': 0.0,\n", + " 'metric': 'cosine',\n", + " 'namespaces': {'': {'vector_count': 100}},\n", + " 'total_vector_count': 100,\n", + " 'vector_type': 'dense'}" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import time\n", + "\n", + "def is_fresh(index):\n", + " stats = index.describe_index_stats()\n", + " vector_count = stats.total_vector_count\n", + " print(f\"Vector count: \", vector_count)\n", + " return vector_count > 0\n", + "\n", + "while not is_fresh(index):\n", + " # It takes a few moments for vectors we just upserted\n", + " # to become available for querying\n", + " time.sleep(5)\n", + "\n", + "# View index stats\n", + "index.describe_index_stats()" + ] + }, + { + "cell_type": "markdown", + "id": "POAoISsAeZAt", + "metadata": { + "id": "POAoISsAeZAt" + }, + "source": [ + "## Embedding Function\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "h4lkfpnPeXmx", + "metadata": { + "id": "h4lkfpnPeXmx" + }, + "outputs": [], + "source": [ + "def get_embedding(input_question):\n", + " model_name = 'sentence-transformers/all-MiniLM-L6-v2' # HuggingFace Model\n", + " tokenizer = AutoTokenizer.from_pretrained(model_name)\n", + " model = AutoModel.from_pretrained(model_name)\n", + "\n", + " encoded_input = tokenizer(input_question, padding=True, truncation=True, return_tensors='pt')\n", + "\n", + " with torch.no_grad():\n", + " model_output = model(**encoded_input)\n", + "\n", + " embedding = model_output.last_hidden_state[0].mean(dim=0)\n", + " return embedding" + ] + }, + { + "cell_type": "markdown", + "id": "RL9odEJ9dDSG", + "metadata": { + "id": "RL9odEJ9dDSG" + }, + "source": [ + "## Execute Query" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "xskqy0AbV14d", + "metadata": { + "id": "xskqy0AbV14d" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/pytorch/third_party/ideep/mkl-dnn/src/cpu/aarch64/xbyak_aarch64/src/util_impl_linux.h, 451: Can't read MIDR_EL1 sysfs entry\n" + ] + } + ], + "source": [ + "# Build a query to search\n", + "question = \"what if my patient has leg pain\"\n", + "query = get_embedding(question).tolist()\n", + "\n", + "# Get results\n", + "results = index.query(vector=[query], top_k=10, include_metadata=True)\n", + "\n", + "# Sort results by score in descending order\n", + "sorted_matches = sorted(results['matches'], key=lambda x: x['score'], reverse=True)" + ] + }, + { + "cell_type": "markdown", + "id": "JkVM2XQpdPvv", + "metadata": { + "id": "JkVM2XQpdPvv" + }, + "source": [ + "## Show Results" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "eLVSmaHxV8XP", + "metadata": { + "id": "eLVSmaHxV8XP" + }, + "outputs": [], + "source": [ + "def show_results(question, matches):\n", + " \"\"\"A utility function to print our results\"\"\"\n", + " print(f'Question: \\'{question}\\'')\n", + " print('\\nResults:')\n", + " for i, match in enumerate(matches):\n", + " print(f'{str(i+1).rjust(4)}. ID: {match[\"id\"]}')\n", + " print(f' Score: {match[\"score\"]}')\n", + " print(f' Metadata: {match[\"metadata\"]}')\n", + " print('')" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "5b279e16-dc9b-4f71-a607-a9a969bea5a4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Question: 'what if my patient has leg pain'\n", + "\n", + "Results:\n", + " 1. ID: P0100\n", + " Score: 0.517953098\n", + " Metadata: {'advice': 'over-the-counter pain relief, stretching', 'symptoms': 'muscle pain'}\n", + "\n", + " 2. ID: P095\n", + " Score: 0.500854671\n", + " Metadata: {'symptoms': 'back pain', 'treatment': 'physical therapy'}\n", + "\n", + " 3. ID: P047\n", + " Score: 0.500854671\n", + " Metadata: {'symptoms': 'back pain', 'treatment': 'physical therapy'}\n", + "\n", + " 4. ID: P007\n", + " Score: 0.459922969\n", + " Metadata: {'surgery': 'knee arthroscopy', 'symptoms': 'pain, swelling', 'treatment': 'physical therapy'}\n", + "\n", + " 5. ID: P028\n", + " Score: 0.446633637\n", + " Metadata: {'condition': 'knee pain', 'referral': 'orthopedics'}\n", + "\n", + " 6. ID: P059\n", + " Score: 0.429972351\n", + " Metadata: {'symptoms': 'joint pain', 'treatment': 'NSAIDs, rest'}\n", + "\n", + " 7. ID: P020\n", + " Score: 0.424824864\n", + " Metadata: {'condition': 'sprained ankle', 'tests': 'X-ray'}\n", + "\n", + " 8. ID: P068\n", + " Score: 0.414039701\n", + " Metadata: {'condition': 'broken arm', 'treatment': 'cast'}\n", + "\n", + " 9. ID: P092\n", + " Score: 0.408774346\n", + " Metadata: {'condition': 'dehydration', 'treatment': 'IV fluids'}\n", + "\n", + " 10. ID: P044\n", + " Score: 0.408774346\n", + " Metadata: {'condition': 'dehydration', 'treatment': 'IV fluids'}\n", + "\n" + ] + } + ], + "source": [ + "show_results(question, sorted_matches)" + ] + }, + { + "cell_type": "markdown", + "id": "-L62zHVmdcQP", + "metadata": { + "id": "-L62zHVmdcQP" + }, + "source": [ + "### Perform Rerank" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "32WVD7lPo7Tb", + "metadata": { + "id": "32WVD7lPo7Tb" + }, + "outputs": [], + "source": [ + "# Create documents with concatenated metadata field as \"reranking_field\" field\n", + "transformed_documents = [\n", + " {\n", + " 'id': match['id'],\n", + " 'reranking_field': '; '.join([f\"{key}: {value}\" for key, value in match['metadata'].items()])\n", + " }\n", + " for match in results['matches']\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "WLWt80fwq18w", + "metadata": { + "id": "WLWt80fwq18w" + }, + "outputs": [], + "source": [ + "# Define a more specific query for reranking\n", + "query = \"what if my patient had knee surgery\"\n", + "\n", + "# Perform reranking based on the query and specified field\n", + "reranked_results_field = pc.inference.rerank(\n", + " model=\"bge-reranker-v2-m3\",\n", + " query=query,\n", + " documents=transformed_documents,\n", + " rank_fields=[\"reranking_field\"],\n", + " top_n=2,\n", + " return_documents=True,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "0iDXuSUYsTm4", + "metadata": { + "id": "0iDXuSUYsTm4" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Question: 'what if my patient had knee surgery'\n", + "\n", + "Reranked Results:\n", + " 1. ID: P007\n", + " Score: 0.18184364\n", + " Reranking Field: surgery: knee arthroscopy; symptoms: pain, swelling; treatment: physical therapy\n", + "\n", + " 2. ID: P028\n", + " Score: 0.0054905633\n", + " Reranking Field: condition: knee pain; referral: orthopedics\n", + "\n" + ] + } + ], + "source": [ + "def show_reranked_results(question, matches):\n", + " \"\"\"A utility function to print our reranked results\"\"\"\n", + " print(f'Question: \\'{question}\\'')\n", + " print('\\nReranked Results:')\n", + " for i, match in enumerate(matches):\n", + " print(f'{str(i+1).rjust(4)}. ID: {match.document.id}')\n", + " print(f' Score: {match.score}')\n", + " print(f' Reranking Field: {match.document.reranking_field}')\n", + " print('')\n", + "\n", + "show_reranked_results(query, reranked_results_field.data)" + ] + }, + { + "cell_type": "markdown", + "id": "8PQTLfT-Frv8", + "metadata": { + "id": "8PQTLfT-Frv8" + }, + "source": [ + "Now let's delete the index to save resources" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "lEooi2--F0yR", + "metadata": { + "id": "lEooi2--F0yR" + }, + "outputs": [], + "source": [ + "pc.delete_index(name=index_name)" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" }, - "nbformat": 4, - "nbformat_minor": 5 + "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.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 }