{ "cells": [ { "cell_type": "markdown", "id": "09211e76-286f-4b12-acd7-cfb082dc2d66", "metadata": {}, "source": [ "# Llama 3 Cookbook with LlamaIndex and Groq\n", "\n", "\"Open\n", "\n", "Meta developed and released the Meta [Llama 3](https://ai.meta.com/blog/meta-llama-3/) family of large language models (LLMs), a collection of pretrained and instruction tuned generative text models in 8 and 70B sizes. The Llama 3 instruction tuned models are optimized for dialogue use cases and outperform many of the available open source chat models on common industry benchmarks.\n", "\n", "In this notebook, we demonstrate how to use Llama 3 with LlamaIndex for a comprehensive set of use cases. \n", "1. Basic completion / chat \n", "2. Basic RAG (Vector Search, Summarization)\n", "3. Advanced RAG (Routing)\n", "4. Text-to-SQL \n", "5. Structured Data Extraction\n", "6. Chat Engine + Memory\n", "7. Agents\n", "\n", "\n", "We use Llama3-8B and Llama3-70B through [Groq](https://groq.com) - you can sign up there to get a free trial API key." ] }, { "cell_type": "markdown", "id": "de2901c0-e20d-48e5-9385-dbca2258c564", "metadata": {}, "source": [ "## Installation and Setup" ] }, { "cell_type": "code", "execution_count": null, "id": "bcf643ac-b025-4812-aaed-f8f85d1ba505", "metadata": {}, "outputs": [], "source": [ "!pip install llama-index\n", "!pip install llama-index-llms-groq\n", "!pip install llama-index-embeddings-huggingface\n", "!pip install llama-parse" ] }, { "cell_type": "code", "execution_count": null, "id": "641fa5c8-d63e-47f8-b5bc-ebf994f6e314", "metadata": {}, "outputs": [], "source": [ "import nest_asyncio\n", "\n", "nest_asyncio.apply()" ] }, { "cell_type": "markdown", "id": "1714ea83-6cd4-44bb-b53f-4499126c3809", "metadata": {}, "source": [ "### Setup LLM using Groq\n", "\n", "To use [Groq](https://groq.com), you need to make sure that `GROQ_API_KEY` is specified as an environment variable." ] }, { "cell_type": "code", "execution_count": null, "id": "5d46440c", "metadata": {}, "outputs": [], "source": [ "import os\n", "\n", "os.environ[\"GROQ_API_KEY\"] = \"YOUR_GROQ_API_KEY\"" ] }, { "cell_type": "code", "execution_count": null, "id": "d5256970-eba4-499a-b438-8766a290a61a", "metadata": {}, "outputs": [], "source": [ "from llama_index.llms.groq import Groq\n", "\n", "llm = Groq(model=\"llama3-8b-8192\")\n", "llm_70b = Groq(model=\"llama3-70b-8192\")" ] }, { "cell_type": "markdown", "id": "41c3f154-d345-465d-8eed-63b99adbd3ca", "metadata": {}, "source": [ "### Setup Embedding Model" ] }, { "cell_type": "code", "execution_count": null, "id": "0cda736d-e414-44e3-8c15-6be49f5f0282", "metadata": {}, "outputs": [], "source": [ "from llama_index.embeddings.huggingface import HuggingFaceEmbedding\n", "\n", "embed_model = HuggingFaceEmbedding(model_name=\"BAAI/bge-small-en-v1.5\")" ] }, { "cell_type": "markdown", "id": "3625cf29-7c56-475a-8efd-fbe8ffce194d", "metadata": {}, "source": [ "### Define Global Settings Configuration\n", "\n", "In LlamaIndex, you can define global settings so you don't have to pass the LLM / embedding model objects everywhere." ] }, { "cell_type": "code", "execution_count": null, "id": "be3565d1-cc5b-4149-ad5a-7be8f7818e0c", "metadata": {}, "outputs": [], "source": [ "from llama_index.core import Settings\n", "\n", "Settings.llm = llm\n", "Settings.embed_model = embed_model" ] }, { "cell_type": "markdown", "id": "42449b68-47f5-40cf-9207-191307b25e8e", "metadata": {}, "source": [ "### Download Data\n", "\n", "Here you'll download data that's used in section 2 and onwards.\n", "\n", "We'll download some articles on Kendrick, Drake, and their beef (as of May 2024)." ] }, { "cell_type": "code", "execution_count": null, "id": "59b18640-cdfa-42c1-ab53-115983c1fdc4", "metadata": {}, "outputs": [], "source": [ "!mkdir data\n", "!wget \"https://www.dropbox.com/scl/fi/t1soxfjdp0v44an6sdymd/drake_kendrick_beef.pdf?rlkey=u9546ymb7fj8lk2v64r6p5r5k&st=wjzzrgil&dl=1\" -O data/drake_kendrick_beef.pdf\n", "!wget \"https://www.dropbox.com/scl/fi/nts3n64s6kymner2jppd6/drake.pdf?rlkey=hksirpqwzlzqoejn55zemk6ld&st=mohyfyh4&dl=1\" -O data/drake.pdf\n", "!wget \"https://www.dropbox.com/scl/fi/8ax2vnoebhmy44bes2n1d/kendrick.pdf?rlkey=fhxvn94t5amdqcv9vshifd3hj&st=dxdtytn6&dl=1\" -O data/kendrick.pdf" ] }, { "cell_type": "markdown", "id": "9edee491-05f8-4fbb-9394-baa82f1e5087", "metadata": {}, "source": [ "### Load Data\n", "\n", "We load data using LlamaParse by default, but you can also choose to opt for our free pypdf reader (in SimpleDirectoryReader by default) if you don't have an account! \n", "\n", "1. LlamaParse: Signup for an account here: cloud.llamaindex.ai. You get 1k free pages a day, and paid plan is 7k free pages + 0.3c per additional page. LlamaParse is a good option if you want to parse complex documents, like PDFs with charts, tables, and more. \n", "\n", "2. Default PDF Parser (In `SimpleDirectoryReader`). If you don't want to signup for an account / use a PDF service, just use the default PyPDF reader bundled in our file loader. It's a good choice for getting started!" ] }, { "cell_type": "code", "execution_count": null, "id": "b648635a-2672-407f-bae6-01660e5426d7", "metadata": {}, "outputs": [], "source": [ "# Uncomment this code if you want to use LlamaParse\n", "# from llama_parse import LlamaParse\n", "\n", "# docs_kendrick = LlamaParse(result_type=\"text\").load_data(\"./data/kendrick.pdf\")\n", "# docs_drake = LlamaParse(result_type=\"text\").load_data(\"./data/drake.pdf\")\n", "# docs_both = LlamaParse(result_type=\"text\").load_data(\n", "# \"./data/drake_kendrick_beef.pdf\"\n", "# )\n", "\n", "# Uncomment this code if you want to use SimpleDirectoryReader / default PDF Parser\n", "# from llama_index.core import SimpleDirectoryReader\n", "\n", "# docs_kendrick = SimpleDirectoryReader(input_files=[\"data/kendrick.pdf\"]).load_data()\n", "# docs_drake = SimpleDirectoryReader(input_files=[\"data/drake.pdf\"]).load_data()\n", "# docs_both = SimpleDirectoryReader(input_files=[\"data/drake_kendrick_beef.pdf\"]).load_data()" ] }, { "cell_type": "markdown", "id": "071a8f44-2765-4d57-b8da-15d3c718874d", "metadata": {}, "source": [ "## 1. Basic Completion and Chat" ] }, { "cell_type": "markdown", "id": "c0b1ace8-32fb-46b2-a065-8817ddc0310b", "metadata": {}, "source": [ "### Call complete with a prompt" ] }, { "cell_type": "code", "execution_count": null, "id": "a2db43f9-74af-453c-9f83-8db0379c3302", "metadata": {}, "outputs": [], "source": [ "response = llm.complete(\"do you like drake or kendrick better?\")\n", "\n", "print(response)" ] }, { "cell_type": "code", "execution_count": null, "id": "89326153-e2d2-4136-8193-fb27d20670c3", "metadata": {}, "outputs": [], "source": [ "stream_response = llm.stream_complete(\n", " \"you're a drake fan. tell me why you like drake more than kendrick\"\n", ")\n", "\n", "for t in stream_response:\n", " print(t.delta, end=\"\")" ] }, { "cell_type": "markdown", "id": "a4558339-c8a1-4d26-a430-eb71768b5351", "metadata": {}, "source": [ "### Call chat with a list of messages" ] }, { "cell_type": "code", "execution_count": null, "id": "5f393031-f743-4a28-a122-71817e3fbd1b", "metadata": {}, "outputs": [], "source": [ "from llama_index.core.llms import ChatMessage\n", "\n", "messages = [\n", " ChatMessage(role=\"system\", content=\"You are Kendrick.\"),\n", " ChatMessage(role=\"user\", content=\"Write a verse.\"),\n", "]\n", "response = llm.chat(messages)" ] }, { "cell_type": "code", "execution_count": null, "id": "8e9551fc-0efc-4671-bc57-339121004c39", "metadata": {}, "outputs": [], "source": [ "print(response)" ] }, { "cell_type": "markdown", "id": "6a67a33d-fe7d-4381-983f-ca3a6945995d", "metadata": {}, "source": [ "## 2. Basic RAG (Vector Search, Summarization)" ] }, { "cell_type": "markdown", "id": "c104a0c5-e43b-475b-9fa6-186906c1f327", "metadata": {}, "source": [ "### Basic RAG (Vector Search)" ] }, { "cell_type": "code", "execution_count": null, "id": "216787b7-e40a-43fc-a4ca-c43cb798ce9e", "metadata": {}, "outputs": [], "source": [ "from llama_index.core import VectorStoreIndex\n", "\n", "index = VectorStoreIndex.from_documents(docs_both)\n", "query_engine = index.as_query_engine(similarity_top_k=3)" ] }, { "cell_type": "code", "execution_count": null, "id": "a854e9d3-70f1-4927-a2f6-59e90c31f2f0", "metadata": {}, "outputs": [], "source": [ "response = query_engine.query(\"Tell me about family matters\")" ] }, { "cell_type": "code", "execution_count": null, "id": "da796970-bc38-4cb4-9d32-ebd1b71d4bdc", "metadata": {}, "outputs": [], "source": [ "print(str(response))" ] }, { "cell_type": "markdown", "id": "eff935b7-4f37-4758-8997-82fb0852e732", "metadata": {}, "source": [ "### Basic RAG (Summarization)" ] }, { "cell_type": "code", "execution_count": null, "id": "dfe72300-7a38-453e-b1f2-bc1c00a01ff7", "metadata": {}, "outputs": [], "source": [ "from llama_index.core import SummaryIndex\n", "\n", "summary_index = SummaryIndex.from_documents(docs_both)\n", "summary_engine = summary_index.as_query_engine()" ] }, { "cell_type": "code", "execution_count": null, "id": "178f1f12-51f7-4b45-9346-c16ed12b3b8d", "metadata": {}, "outputs": [], "source": [ "response = summary_engine.query(\n", " \"Given your assessment of this article, who won the beef?\"\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "b8125382-d576-4b99-a0da-2fbb71a5b19b", "metadata": {}, "outputs": [], "source": [ "print(str(response))" ] }, { "cell_type": "markdown", "id": "68918eb6-f1e6-460c-b1d5-fb49c3fed4b8", "metadata": {}, "source": [ "## 3. Advanced RAG (Routing)" ] }, { "cell_type": "markdown", "id": "94fd7097-0287-4522-8e43-3e088291fa8a", "metadata": {}, "source": [ "### Build a Router that can choose whether to do vector search or summarization" ] }, { "cell_type": "code", "execution_count": null, "id": "3949dd41-e9a1-47f6-900f-4f987cad3f84", "metadata": {}, "outputs": [], "source": [ "from llama_index.core.tools import QueryEngineTool, ToolMetadata\n", "\n", "vector_tool = QueryEngineTool(\n", " index.as_query_engine(),\n", " metadata=ToolMetadata(\n", " name=\"vector_search\",\n", " description=\"Useful for searching for specific facts.\",\n", " ),\n", ")\n", "\n", "summary_tool = QueryEngineTool(\n", " index.as_query_engine(response_mode=\"tree_summarize\"),\n", " metadata=ToolMetadata(\n", " name=\"summary\",\n", " description=\"Useful for summarizing an entire document.\",\n", " ),\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "d063d07b-c03e-4b26-8556-e3c058d2fd52", "metadata": {}, "outputs": [], "source": [ "from llama_index.core.query_engine import RouterQueryEngine\n", "\n", "query_engine = RouterQueryEngine.from_defaults(\n", " [vector_tool, summary_tool], select_multi=False, verbose=True, llm=llm_70b\n", ")\n", "\n", "response = query_engine.query(\n", " \"Tell me about the song meet the grahams - why is it significant\"\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "396aad75-5a71-4bd9-a760-7f13fe223079", "metadata": {}, "outputs": [], "source": [ "print(response)" ] }, { "cell_type": "markdown", "id": "a795f0bc-e871-4580-8983-6fb27d421fc5", "metadata": {}, "source": [ "## 4. Text-to-SQL \n", "\n", "Here, we download and use a sample SQLite database with 11 tables, with various info about music, playlists, and customers. We will limit to a select few tables for this test." ] }, { "cell_type": "code", "execution_count": null, "id": "a5096501-92c3-41af-a871-ade869d710fb", "metadata": {}, "outputs": [], "source": [ "!wget \"https://www.sqlitetutorial.net/wp-content/uploads/2018/03/chinook.zip\" -O \"./data/chinook.zip\"\n", "!unzip \"./data/chinook.zip\"" ] }, { "cell_type": "code", "execution_count": null, "id": "d4db989e-c18d-4416-928e-7be4ead4d869", "metadata": {}, "outputs": [], "source": [ "from sqlalchemy import (\n", " create_engine,\n", " MetaData,\n", " Table,\n", " Column,\n", " String,\n", " Integer,\n", " select,\n", " column,\n", ")\n", "\n", "engine = create_engine(\"sqlite:///chinook.db\")" ] }, { "cell_type": "code", "execution_count": null, "id": "bf6ed233-0ea3-4d4f-8c33-5b6d558b89b9", "metadata": {}, "outputs": [], "source": [ "from llama_index.core import SQLDatabase\n", "\n", "sql_database = SQLDatabase(engine)" ] }, { "cell_type": "code", "execution_count": null, "id": "debae423-1004-40f6-9356-e1c3add4d965", "metadata": {}, "outputs": [], "source": [ "from llama_index.core.indices.struct_store import NLSQLTableQueryEngine\n", "\n", "query_engine = NLSQLTableQueryEngine(\n", " sql_database=sql_database,\n", " tables=[\"albums\", \"tracks\", \"artists\"],\n", " llm=llm_70b,\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "a65ecd70-09c4-4872-b712-3a8235d03db2", "metadata": {}, "outputs": [], "source": [ "response = query_engine.query(\"What are some albums?\")\n", "\n", "print(response)" ] }, { "cell_type": "code", "execution_count": null, "id": "c12b93ef-d6d1-4d15-9cb2-343070f72851", "metadata": {}, "outputs": [], "source": [ "response = query_engine.query(\"What are some artists? Limit it to 5.\")\n", "\n", "print(response)" ] }, { "cell_type": "markdown", "id": "2c243d38-c6ac-445c-b9d4-53a9ae013b7b", "metadata": {}, "source": [ "This last query should be a more complex join" ] }, { "cell_type": "code", "execution_count": null, "id": "553741c2-1050-445d-979a-ae2150ee3248", "metadata": {}, "outputs": [], "source": [ "response = query_engine.query(\n", " \"What are some tracks from the artist AC/DC? Limit it to 3\"\n", ")\n", "\n", "print(response)" ] }, { "cell_type": "code", "execution_count": null, "id": "300689d7-9e67-4404-9898-27404ee6d4b5", "metadata": {}, "outputs": [], "source": [ "print(response.metadata[\"sql_query\"])" ] }, { "cell_type": "markdown", "id": "1419fe67-aa6a-47db-88cd-9bb251c15615", "metadata": {}, "source": [ "## 5. Structured Data Extraction\n", "\n", "An important use case for function calling is extracting structured objects. LlamaIndex provides an intuitive interface for this through `structured_predict` - simply define the target Pydantic class (can be nested), and given a prompt, we extract out the desired object.\n", "\n", "**NOTE**: Since there's no native function calling support with Llama3, the structured extraction is performed by prompting the LLM + output parsing." ] }, { "cell_type": "code", "execution_count": null, "id": "4432f35a-5f29-45e9-a928-32e6d77b158e", "metadata": {}, "outputs": [], "source": [ "from llama_index.llms.groq import Groq\n", "from llama_index.core.prompts import PromptTemplate\n", "from pydantic import BaseModel\n", "\n", "\n", "class Restaurant(BaseModel):\n", " \"\"\"A restaurant with name, city, and cuisine.\"\"\"\n", "\n", " name: str\n", " city: str\n", " cuisine: str\n", "\n", "\n", "llm = Groq(model=\"llama3-8b-8192\", pydantic_program_mode=\"llm\")\n", "prompt_tmpl = PromptTemplate(\n", " \"Generate a restaurant in a given city {city_name}\"\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "2c451f52-a051-4ba2-a683-0c1fd258d986", "metadata": {}, "outputs": [], "source": [ "restaurant_obj = llm.structured_predict(\n", " Restaurant, prompt_tmpl, city_name=\"Miami\"\n", ")\n", "print(restaurant_obj)" ] }, { "cell_type": "markdown", "id": "839018a9-b65f-4824-83f7-2e4e52b55c5d", "metadata": {}, "source": [ "## 6. Adding Chat History to RAG (Chat Engine)\n", "\n", "In this section we create a stateful chatbot from a RAG pipeline, with our chat engine abstraction.\n", "\n", "Unlike a stateless query engine, the chat engine maintains conversation history (through a memory module like buffer memory). It performs retrieval given a condensed question, and feeds the condensed question + context + chat history into the final LLM prompt.\n", "\n", "Related resource: https://docs.llamaindex.ai/en/stable/examples/chat_engine/chat_engine_condense_plus_context/" ] }, { "cell_type": "code", "execution_count": null, "id": "27e56315-9513-4b32-bf9a-ce97c3ab52df", "metadata": {}, "outputs": [], "source": [ "from llama_index.core.memory import ChatMemoryBuffer\n", "from llama_index.core.chat_engine import CondensePlusContextChatEngine\n", "\n", "memory = ChatMemoryBuffer.from_defaults(token_limit=3900)\n", "\n", "chat_engine = CondensePlusContextChatEngine.from_defaults(\n", " index.as_retriever(),\n", " memory=memory,\n", " llm=llm,\n", " context_prompt=(\n", " \"You are a chatbot, able to have normal interactions, as well as talk\"\n", " \" about the Kendrick and Drake beef.\"\n", " \"Here are the relevant documents for the context:\\n\"\n", " \"{context_str}\"\n", " \"\\nInstruction: Use the previous chat history, or the context above, to interact and help the user.\"\n", " ),\n", " verbose=True,\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "b24524d2-fdce-4237-8ecc-67f139302303", "metadata": {}, "outputs": [], "source": [ "response = chat_engine.chat(\n", " \"Tell me about the songs Drake released in the beef.\"\n", ")\n", "print(str(response))" ] }, { "cell_type": "code", "execution_count": null, "id": "f9a87a16-2864-4c48-95e7-a2103e119242", "metadata": {}, "outputs": [], "source": [ "response = chat_engine.chat(\"What about Kendrick?\")\n", "print(str(response))" ] }, { "cell_type": "markdown", "id": "a7fa07ed-58f0-445e-bbd3-4ad8bac6598e", "metadata": {}, "source": [ "## 7. Agents\n", "\n", "Here we build agents with Llama 3. We perform RAG over simple functions as well as the documents above." ] }, { "cell_type": "markdown", "id": "aa98d735-5d43-413f-aab3-fc3adeed81b1", "metadata": {}, "source": [ "### Agents And Tools" ] }, { "cell_type": "code", "execution_count": null, "id": "fb73a01f-8a2e-4dd6-91f8-710c92b81c56", "metadata": {}, "outputs": [], "source": [ "import json\n", "from typing import Sequence, List\n", "\n", "from llama_index.core.llms import ChatMessage\n", "from llama_index.core.tools import BaseTool, FunctionTool\n", "from llama_index.core.agent import ReActAgent\n", "\n", "import nest_asyncio\n", "\n", "nest_asyncio.apply()" ] }, { "cell_type": "markdown", "id": "efbee832-9786-4551-93f2-01ee90fa0f4d", "metadata": {}, "source": [ "### Define Tools" ] }, { "cell_type": "code", "execution_count": null, "id": "b2058b36-8053-4dc8-9218-c286702ecf66", "metadata": {}, "outputs": [], "source": [ "def multiply(a: int, b: int) -> int:\n", " \"\"\"Multiple two integers and returns the result integer\"\"\"\n", " return a * b\n", "\n", "\n", "def add(a: int, b: int) -> int:\n", " \"\"\"Add two integers and returns the result integer\"\"\"\n", " return a + b\n", "\n", "\n", "def subtract(a: int, b: int) -> int:\n", " \"\"\"Subtract two integers and returns the result integer\"\"\"\n", " return a - b\n", "\n", "\n", "def divide(a: int, b: int) -> int:\n", " \"\"\"Divides two integers and returns the result integer\"\"\"\n", " return a / b\n", "\n", "\n", "multiply_tool = FunctionTool.from_defaults(fn=multiply)\n", "add_tool = FunctionTool.from_defaults(fn=add)\n", "subtract_tool = FunctionTool.from_defaults(fn=subtract)\n", "divide_tool = FunctionTool.from_defaults(fn=divide)" ] }, { "cell_type": "markdown", "id": "22d7d4dc-e2ce-402c-9350-0e7010d0080c", "metadata": {}, "source": [ "### ReAct Agent" ] }, { "cell_type": "code", "execution_count": null, "id": "72a48053-e30d-4884-bcac-80752047d940", "metadata": {}, "outputs": [], "source": [ "agent = ReActAgent.from_tools(\n", " [multiply_tool, add_tool, subtract_tool, divide_tool],\n", " llm=llm_70b,\n", " verbose=True,\n", ")" ] }, { "cell_type": "markdown", "id": "7ada828a-3b05-4fc1-90e8-986c5607ae61", "metadata": {}, "source": [ "### Querying" ] }, { "cell_type": "code", "execution_count": null, "id": "9c0b1e56-d9f7-4615-a15a-c91fea1adb00", "metadata": {}, "outputs": [], "source": [ "response = agent.chat(\"What is (121 + 2) * 5?\")\n", "print(str(response))" ] }, { "cell_type": "markdown", "id": "67ce45f6-bdd4-42aa-8f74-43a50f14094e", "metadata": {}, "source": [ "### ReAct Agent With RAG QueryEngine Tools" ] }, { "cell_type": "code", "execution_count": null, "id": "97fce5f1-eacf-4ecc-9e83-072e74d3a2a9", "metadata": {}, "outputs": [], "source": [ "from llama_index.core import (\n", " SimpleDirectoryReader,\n", " VectorStoreIndex,\n", " StorageContext,\n", " load_index_from_storage,\n", ")\n", "\n", "from llama_index.core.tools import QueryEngineTool, ToolMetadata" ] }, { "cell_type": "markdown", "id": "23963d00-e3d2-4ce1-9ac3-aa486bf4b1a5", "metadata": {}, "source": [ "### Create ReAct Agent using RAG QueryEngine Tools" ] }, { "cell_type": "markdown", "id": "1844dbbd-477c-4c4d-bb18-2c2e16a75a50", "metadata": {}, "source": [ "This may take 4 minutes to run:" ] }, { "cell_type": "code", "execution_count": null, "id": "66ab1e60-3374-4eb9-b7dc-c28db3b47c51", "metadata": {}, "outputs": [], "source": [ "drake_index = VectorStoreIndex.from_documents(docs_drake)\n", "drake_query_engine = drake_index.as_query_engine(similarity_top_k=3)\n", "\n", "kendrick_index = VectorStoreIndex.from_documents(docs_kendrick)\n", "kendrick_query_engine = kendrick_index.as_query_engine(similarity_top_k=3)" ] }, { "cell_type": "code", "execution_count": null, "id": "0e241fe9-f390-4be5-b3c4-da4f56db01ef", "metadata": {}, "outputs": [], "source": [ "drake_tool = QueryEngineTool(\n", " drake_index.as_query_engine(),\n", " metadata=ToolMetadata(\n", " name=\"drake_search\",\n", " description=\"Useful for searching over Drake's life.\",\n", " ),\n", ")\n", "\n", "kendrick_tool = QueryEngineTool(\n", " kendrick_index.as_query_engine(),\n", " metadata=ToolMetadata(\n", " name=\"kendrick_search\",\n", " description=\"Useful for searching over Kendrick's life.\",\n", " ),\n", ")\n", "\n", "query_engine_tools = [drake_tool, kendrick_tool]" ] }, { "cell_type": "code", "execution_count": null, "id": "b922feac-b221-4737-92c6-e63eeab4eab7", "metadata": {}, "outputs": [], "source": [ "agent = ReActAgent.from_tools(\n", " query_engine_tools,\n", " llm=llm_70b,\n", " verbose=True,\n", ")" ] }, { "cell_type": "markdown", "id": "7e38edc8-47f8-4f1a-ad87-bc3a9e31a65e", "metadata": {}, "source": [ "### Querying" ] }, { "cell_type": "code", "execution_count": null, "id": "035c2c8b-5a5e-4df0-a423-4c2d6054f457", "metadata": {}, "outputs": [], "source": [ "response = agent.chat(\"Tell me about how Kendrick and Drake grew up\")\n", "print(str(response))" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.14" } }, "nbformat": 4, "nbformat_minor": 5 }