Files
2026-07-13 13:30:30 +08:00

633 lines
25 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "ur8xi4C7S06n"
},
"outputs": [],
"source": [
"# Copyright 2024 Google LLC\n",
"#\n",
"# Licensed under the Apache License, Version 2.0 (the \"License\");\n",
"# you may not use this file except in compliance with the License.\n",
"# You may obtain a copy of the License at\n",
"#\n",
"# https://www.apache.org/licenses/LICENSE-2.0\n",
"#\n",
"# Unless required by applicable law or agreed to in writing, software\n",
"# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
"# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
"# See the License for the specific language governing permissions and\n",
"# limitations under the License."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "JAPoU8Sm5E6e"
},
"source": [
"# Building Search Applications with Vertex AI Search\n",
"\n",
"<table align=\"left\">\n",
" <td style=\"text-align: center\">\n",
" <a href=\"https://colab.research.google.com/github/GoogleCloudPlatform/generative-ai/blob/main/search/vertexai-search-options/vertexai_search_options.ipynb\">\n",
" <img width=\"32px\" src=\"https://www.gstatic.com/pantheon/images/bigquery/welcome_page/colab-logo.svg\" alt=\"Google Colaboratory logo\"><br> Open in Colab\n",
" </a>\n",
" </td>\n",
" <td style=\"text-align: center\">\n",
" <a href=\"https://console.cloud.google.com/vertex-ai/colab/import/https:%2F%2Fraw.githubusercontent.com%2FGoogleCloudPlatform%2Fgenerative-ai%2Fmain%2Fsearch%2Fvertexai-search-options%2Fvertexai_search_options.ipynb\">\n",
" <img width=\"32px\" src=\"https://lh3.googleusercontent.com/JmcxdQi-qOpctIvWKgPtrzZdJJK-J3sWE1RsfjZNwshCFgE_9fULcNpuXYTilIR2hjwN\" alt=\"Google Cloud Colab Enterprise logo\"><br> Open in Colab Enterprise\n",
" </a>\n",
" </td>\n",
" <td style=\"text-align: center\">\n",
" <a href=\"https://console.cloud.google.com/vertex-ai/workbench/deploy-notebook?download_url=https://raw.githubusercontent.com/GoogleCloudPlatform/generative-ai/main/search/vertexai-search-options/vertexai_search_options.ipynb\">\n",
" <img src=\"https://www.gstatic.com/images/branding/gcpiconscolors/vertexai/v1/32px.svg\" alt=\"Vertex AI logo\"><br> Open in Vertex AI Workbench\n",
" </a>\n",
" </td>\n",
" <td style=\"text-align: center\">\n",
" <a href=\"https://github.com/GoogleCloudPlatform/generative-ai/blob/main/search/vertexai-search-options/vertexai_search_options.ipynb\">\n",
" <img width=\"32px\" src=\"https://raw.githubusercontent.com/primer/octicons/refs/heads/main/icons/mark-github-24.svg\" alt=\"GitHub logo\"><br> View on GitHub\n",
" </a>\n",
" </td>\n",
"</table>\n",
"\n",
"<div style=\"clear: both;\"></div>\n",
"\n",
"<b>Share to:</b>\n",
"\n",
"<a href=\"https://www.linkedin.com/sharing/share-offsite/?url=https%3A//github.com/GoogleCloudPlatform/generative-ai/blob/main/search/vertexai-search-options/vertexai_search_options.ipynb\" target=\"_blank\">\n",
" <img width=\"20px\" src=\"https://upload.wikimedia.org/wikipedia/commons/8/81/LinkedIn_icon.svg\" alt=\"LinkedIn logo\">\n",
"</a>\n",
"\n",
"<a href=\"https://bsky.app/intent/compose?text=https%3A//github.com/GoogleCloudPlatform/generative-ai/blob/main/search/vertexai-search-options/vertexai_search_options.ipynb\" target=\"_blank\">\n",
" <img width=\"20px\" src=\"https://upload.wikimedia.org/wikipedia/commons/7/7a/Bluesky_Logo.svg\" alt=\"Bluesky logo\">\n",
"</a>\n",
"\n",
"<a href=\"https://twitter.com/intent/tweet?url=https%3A//github.com/GoogleCloudPlatform/generative-ai/blob/main/search/vertexai-search-options/vertexai_search_options.ipynb\" target=\"_blank\">\n",
" <img width=\"20px\" src=\"https://upload.wikimedia.org/wikipedia/commons/5/5a/X_icon_2.svg\" alt=\"X logo\">\n",
"</a>\n",
"\n",
"<a href=\"https://reddit.com/submit?url=https%3A//github.com/GoogleCloudPlatform/generative-ai/blob/main/search/vertexai-search-options/vertexai_search_options.ipynb\" target=\"_blank\">\n",
" <img width=\"20px\" src=\"https://redditinc.com/hubfs/Reddit%20Inc/Brand/Reddit_Logo.png\" alt=\"Reddit logo\">\n",
"</a>\n",
"\n",
"<a href=\"https://www.facebook.com/sharer/sharer.php?u=https%3A//github.com/GoogleCloudPlatform/generative-ai/blob/main/search/vertexai-search-options/vertexai_search_options.ipynb\" target=\"_blank\">\n",
" <img width=\"20px\" src=\"https://upload.wikimedia.org/wikipedia/commons/5/51/Facebook_f_logo_%282019%29.svg\" alt=\"Facebook logo\">\n",
"</a> "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "84f0f73a0f76"
},
"source": [
"| | |\n",
"|-|-|\n",
"| Author(s) | [Megha Agarwal](https://github.com/agarwal22megha/) |"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tvgnzT1CKxrO"
},
"source": [
"## Overview\n",
"\n",
"Vertex AI Search leverages decades of expertise Google has in information retrieval and brings together the power of deep information retrieval, state-of-the-art natural language processing, and the latest in large language model (LLM) processing to understand user intent and return the most relevant results for the user.\n",
"\n",
"Based on where Developers are in their journey, their orchestration framework of choice, they can select Vertex AI Search out-of-the-box capabilities or customize their search solutions with Vertex Retrievers or use the Vertex AI DIY APIs to build the end to end RAG application.\n",
"\n",
"This notebook explores how you can leverage Vertex AI Search out-of-the-box capabilities/ customize your search application with Vertex AI Search Retriever via LangChain or Grounding Service.\n",
"\n",
"\n",
"We create a Vertex AI Agent Builder Search App with unstructured data store on Google Cloud Console.\n",
"\n",
"Once the Search App is created, this notebook walks you through how you can leverage:\n",
"\n",
"1. Vertex AI Search out-of-the-box capabilities by leveraging the [Vertex AI Agent Builder Python API reference documentation](https://cloud.google.com/python/docs/reference/discoveryengine/latest)\n",
"\n",
"2. Leverage Vertex AI Search Datastore as a [Grounding Source](https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/grounding) with Gemini Models directly to ground responses in your data\n",
"\n",
"3. Leverage Vertex DataStore as [LangChain Retriever](https://python.langchain.com/v0.2/docs/integrations/retrievers/google_vertex_ai_search/)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "61RBz8LLbxCR"
},
"source": [
"## Get started"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "No17Cw5hgx12"
},
"source": [
"### Install Vertex AI SDK and other required packages\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "tFy3H3aPgx12"
},
"outputs": [],
"source": [
"%pip install --upgrade --user --quiet google-cloud-aiplatform\n",
"%pip install google-cloud-discoveryengine\n",
"%pip install langchain_google_community\n",
"%pip install langchain langchain-google-vertexai\n",
"%pip install langchain-google-community[vertexaisearch]"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "R5Xep4W9lq-Z"
},
"source": [
"### Restart runtime\n",
"\n",
"To use the newly installed packages in this Jupyter runtime, you must restart the runtime. You can do this by running the cell below, which restarts the current kernel.\n",
"\n",
"The restart might take a minute or longer. After it has restarted, continue to the next step."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "XRvKdaPDTznN"
},
"outputs": [],
"source": [
"import IPython\n",
"\n",
"app = IPython.Application.instance()\n",
"app.kernel.do_shutdown(True)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "SbmM4z7FOBpM"
},
"source": [
"<div class=\"alert alert-block alert-warning\">\n",
"<b>⚠️ The kernel is going to restart. Wait until it is finished before continuing to the next step. ⚠️</b>\n",
"</div>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "dmWOrTJ3gx13"
},
"source": [
"### Authenticate your notebook environment (Colab only)\n",
"\n",
"If you're running this notebook on Google Colab, run the cell below to authenticate your environment."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "NyKGtVQjgx13"
},
"outputs": [],
"source": [
"import sys\n",
"\n",
"if \"google.colab\" in sys.modules:\n",
" from google.colab import auth\n",
"\n",
" auth.authenticate_user()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "DF4l8DTdWgPY"
},
"source": [
"### Set Google Cloud project information and initialize Vertex AI SDK\n",
"\n",
"To get started using Vertex AI, you must have an existing Google Cloud project and [enable the Vertex AI API](https://console.cloud.google.com/flows/enableapi?apiid=aiplatform.googleapis.com).\n",
"\n",
"Learn more about [setting up a project and a development environment](https://cloud.google.com/vertex-ai/docs/start/cloud-environment)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "Nqwi-5ufWp_B"
},
"outputs": [],
"source": [
"PROJECT_ID = \"your_project_id\" # @param {type:\"string\"}\n",
"LOCATION = \"us-central1\" # @param {type:\"string\"}\n",
"\n",
"\n",
"import vertexai\n",
"\n",
"vertexai.init(project=PROJECT_ID, location=LOCATION)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "EdvJRUWRNGHE"
},
"source": [
"### Create a Vertex AI Search App On Google Cloud\n",
"[Follow These Steps](https://cloud.google.com/generative-ai-app-builder/docs/try-enterprise-search#unstructured-data_1) to leverage Vertex AI Agent Builder to create a Search App with unstructured data store on Google Cloud Console.\n",
"\n",
"Once the search app is created successfully, make a Note of the Search App Id, Datastore ID, location from Vertex AI Agent Builder console."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "CaXr_Fz9OXkQ"
},
"outputs": [],
"source": [
"# Set to your data store location\n",
"VERTEX_AI_SEARCH_LOCATION = \"global\" # @param {type:\"string\"}\n",
"# Set to your search app ID\n",
"VERTEX_AI_SEARCH_APP_ID = \"your_search_app_id\" # @param {type:\"string\"}\n",
"# Set to your data store ID\n",
"VERTEX_AI_SEARCH_DATASTORE_ID = \"your_datastore_id\" # @param {type:\"string\"}\n",
"\n",
"MODEL = \"gemini-2.0-flash\" # @param {type:\"string\"}\n",
"\n",
"SEARCH_QUERY = \"When does Alphabet plan to get to net zero?\" # @param {type:\"string\"}"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "5303c05f7aa6"
},
"source": [
"### Import libraries"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "6fc324893334"
},
"outputs": [],
"source": [
"from google.api_core.client_options import ClientOptions\n",
"from google.cloud import discoveryengine_v1 as discoveryengine\n",
"from langchain.chains import RetrievalQAWithSourcesChain\n",
"from langchain_google_community import VertexAISearchRetriever\n",
"from langchain_google_vertexai import VertexAI\n",
"from vertexai.generative_models import (\n",
" GenerationConfig,\n",
" GenerativeModel,\n",
" SafetySetting,\n",
" Tool,\n",
")\n",
"import vertexai.preview.generative_models as generative_models"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "QhOI5q1LIzmU"
},
"source": [
"## Part 1: Vertex AI Search Out-of-the-box capabilities\n",
"Leverage the [Vertex AI Agent Builder Python API reference documentation](https://cloud.google.com/python/docs/reference/discoveryengine/latest) to get the search results"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "Chkv32AgF9Sx"
},
"outputs": [],
"source": [
"CUSTOM_PROMPT = \"\"\"\n",
" <PERSONA_AND_GOAL>\n",
" You are a helpful assistant knowledgeable about Alphabet quarterly earning reports.\n",
" Be mindful of the time frame user inputs\n",
" Help user with their queries related with Alphabet\n",
" Only respond with relevant information available in Grounding Knowledge snippet.\n",
" If no relevant snippet is available, respond with you dont know\n",
" Do not make up information\n",
" </PERSONA_AND_GOAL>\n",
"\"\"\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "0eOlSO08IK2Z"
},
"outputs": [],
"source": [
"def search_spec():\n",
" content_search_spec = discoveryengine.SearchRequest.ContentSearchSpec(\n",
" snippet_spec=discoveryengine.SearchRequest.ContentSearchSpec.SnippetSpec(\n",
" return_snippet=True\n",
" ),\n",
" summary_spec=discoveryengine.SearchRequest.ContentSearchSpec.SummarySpec(\n",
" summary_result_count=10,\n",
" include_citations=True,\n",
" ignore_adversarial_query=True,\n",
" ignore_non_summary_seeking_query=True,\n",
" model_prompt_spec=discoveryengine.SearchRequest.ContentSearchSpec.SummarySpec.ModelPromptSpec(\n",
" preamble=CUSTOM_PROMPT\n",
" ),\n",
" model_spec=discoveryengine.SearchRequest.ContentSearchSpec.SummarySpec.ModelSpec(\n",
" version=\"stable\",\n",
" ),\n",
" ),\n",
" )\n",
" return content_search_spec\n",
"\n",
"\n",
"def search_sample(project_id: str, location: str, engine_id: str, search_query: str):\n",
" client_options = (\n",
" ClientOptions(api_endpoint=f\"{location}-discoveryengine.googleapis.com\")\n",
" if location != \"global\"\n",
" else None\n",
" )\n",
"\n",
" client = discoveryengine.SearchServiceClient(client_options=client_options)\n",
"\n",
" serving_config = f\"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_config\"\n",
"\n",
" content_search_spec = search_spec()\n",
"\n",
" request = discoveryengine.SearchRequest(\n",
" serving_config=serving_config,\n",
" query=search_query,\n",
" page_size=10,\n",
" content_search_spec=content_search_spec,\n",
" query_expansion_spec=discoveryengine.SearchRequest.QueryExpansionSpec(\n",
" condition=discoveryengine.SearchRequest.QueryExpansionSpec.Condition.AUTO,\n",
" ),\n",
" spell_correction_spec=discoveryengine.SearchRequest.SpellCorrectionSpec(\n",
" mode=discoveryengine.SearchRequest.SpellCorrectionSpec.Mode.AUTO\n",
" ),\n",
" )\n",
" response = client.search(request)\n",
"\n",
" return response"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "IV52oaTJIK-i"
},
"outputs": [],
"source": [
"search_response = search_sample(\n",
" PROJECT_ID, VERTEX_AI_SEARCH_LOCATION, VERTEX_AI_SEARCH_APP_ID, SEARCH_QUERY\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "JsbqEIgyILBJ"
},
"outputs": [],
"source": [
"search_response.summary.summary_with_metadata"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "S_OnZDEfJCzi"
},
"source": [
"## Part 2: Grounding with Gemini on Vertex AI Search Datastore\n",
"\n",
"Leverage Vertex AI Search Datastore as a [Grounding Source](https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/grounding) with Gemini Models directly to ground responses in your data."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "uGV_iw5YJMNK"
},
"outputs": [],
"source": [
"system_instructions = \"\"\"\n",
"<PERSONA_AND_GOAL>\n",
" You are a helpful assistant knowledgeable about Alphabet quarterly earning reports.\n",
" Help user with their queries related with Alphabet by following given <INSTRUCTIONS> and <CONTEXT>\n",
" only respond with information available in Grounding Knowledge store.\n",
"</PERSONA_AND_GOAL>\n",
"\n",
"<INSTRUCTIONS>\n",
"- Always refer to the tool and Ground your answers in it\n",
"- Understand the retrieved snippet by the tool and only use that information to help users\n",
"- For supporting references, you can provide the Grounding tool snippets verbatim, and any other info like page number\n",
"- For Information not available in the tool, mention you dont have access to the information.\n",
"- Output \"answer\" should be I dont know when the user question is irrelevant or outside the <CONTEXT>\n",
"- Leave \"reference_snippet\" as null if you are not sure about the page and text snippet\n",
"<INSTRUCTIONS>\n",
"\n",
"<CONTEXT>\n",
" Grounding tool finds most relevant snippets from the Alphabet earning reports data store.\n",
" Use the information provided by the tool as your knowledge base.\n",
"</CONTEXT>\n",
"\n",
"<CONSTRAINTS>\n",
"- ONLY use information available from the Grounding tool\n",
"</CONSTRAINTS>\n",
"\n",
"<OUTPUT_FORMAT>\n",
"- Response should ALWAYS be in following JSON Output with answer and reference_snippet as keys, e.g. {\"answer\": , \"reference_snippet\": }\n",
"</OUTPUT_FORMAT>\n",
"\"\"\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "wSo25gr9MBSd"
},
"outputs": [],
"source": [
"tools = [\n",
" Tool.from_retrieval(\n",
" retrieval=generative_models.grounding.Retrieval(\n",
" source=generative_models.grounding.VertexAISearch(\n",
" datastore=VERTEX_AI_SEARCH_DATASTORE_ID,\n",
" project=PROJECT_ID,\n",
" location=VERTEX_AI_SEARCH_LOCATION,\n",
" ),\n",
" disable_attribution=False,\n",
" )\n",
" ),\n",
"]\n",
"\n",
"generation_config = GenerationConfig(max_output_tokens=8192, temperature=1, top_p=0.95)\n",
"\n",
"safety_settings = [\n",
" SafetySetting(\n",
" category=SafetySetting.HarmCategory.HARM_CATEGORY_HATE_SPEECH,\n",
" threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH,\n",
" ),\n",
" SafetySetting(\n",
" category=SafetySetting.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,\n",
" threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH,\n",
" ),\n",
" SafetySetting(\n",
" category=SafetySetting.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,\n",
" threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH,\n",
" ),\n",
" SafetySetting(\n",
" category=SafetySetting.HarmCategory.HARM_CATEGORY_HARASSMENT,\n",
" threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH,\n",
" ),\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "jCJAOvHdLrGI"
},
"outputs": [],
"source": [
"model = GenerativeModel(MODEL, tools=tools, system_instruction=[system_instructions])\n",
"\n",
"response = model.generate_content(\n",
" [SEARCH_QUERY],\n",
" generation_config=generation_config,\n",
" safety_settings=safety_settings,\n",
" stream=True,\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "BNrZ-w3gRoLx"
},
"outputs": [],
"source": [
"for candidate in response:\n",
" print(candidate)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "lQv61qA5Q71g"
},
"source": [
"##### [Here](https://github.com/GoogleCloudPlatform/generative-ai/blob/main/gemini/grounding/intro-grounding-gemini.ipynb) is another Grounding Gemini with Vertex AI Search Example which you might find useful"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "V2X81IQUOImp"
},
"source": [
"## Part 3: Vertex AI Search with LangChain\n",
"\n",
"Developers have the flexibility to incorporate Vertex AI Search as a [LangChain Retriever](https://python.langchain.com/v0.2/docs/integrations/retrievers/google_vertex_ai_search/) in their existing LangChain applications.\n",
"\n",
"This means you can continue leveraging your preferred orchestrator while seamlessly integrating Vertex AI Search data stores into existing RAG pipelines. Vertex AI Search enables Google-quality search capabilities applied directly to your custom data, elevating the search result quality and relevance of your retrieval-augmented generation workflows.\n",
"\n",
"Find more notebook examples of leveraging VertexAISearchRetriever with LangChain [here](https://github.com/GoogleCloudPlatform/generative-ai/blob/main/search/retrieval-augmented-generation/examples/question_answering.ipynb).\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "Kt09YTDmJMYW"
},
"outputs": [],
"source": [
"llm = VertexAI(model_name=MODEL)\n",
"\n",
"retriever = VertexAISearchRetriever(\n",
" project_id=PROJECT_ID,\n",
" location_id=VERTEX_AI_SEARCH_LOCATION,\n",
" data_store_id=VERTEX_AI_SEARCH_DATASTORE_ID,\n",
" get_extractive_answers=True,\n",
" max_documents=10,\n",
" max_extractive_segment_count=1,\n",
" max_extractive_answer_count=5,\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "Dkt_l9tmPeYH"
},
"outputs": [],
"source": [
"retrieval_qa_with_sources = RetrievalQAWithSourcesChain.from_chain_type(\n",
" llm=llm, chain_type=\"stuff\", retriever=retriever\n",
")\n",
"\n",
"retrieval_qa_with_sources.invoke(SEARCH_QUERY, return_only_outputs=True)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2a4e033321ad"
},
"source": [
"## Cleaning up\n",
"\n",
"[Delete the Vertex AI Search App](https://cloud.google.com/generative-ai-app-builder/docs/delete-engine) and\n",
"\n",
"[Delete the datastore](https://cloud.google.com/generative-ai-app-builder/docs/delete-a-data-store) your created"
]
}
],
"metadata": {
"colab": {
"name": "vertexai_search_options.ipynb",
"toc_visible": true
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
}
},
"nbformat": 4,
"nbformat_minor": 0
}