{ "cells": [ { "cell_type": "markdown", "id": "0ed6aab1", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "# SQLite example\n", "\n", "This example showcases hooking up an LLM to answer questions over a database." ] }, { "cell_type": "markdown", "id": "b2f66479", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "This uses the example Chinook database.\n", "To set it up follow the instructions on https://database.guide/2-sample-databases-sqlite/, placing the `.db` file in a notebooks folder at the root of this repository." ] }, { "cell_type": "code", "execution_count": 1, "id": "d0e27d88", "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "from langchain import OpenAI, SQLDatabase, SQLDatabaseChain" ] }, { "cell_type": "code", "execution_count": 2, "id": "72ede462", "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "db = SQLDatabase.from_uri(\"sqlite:///../../../../notebooks/Chinook.db\")\n", "llm = OpenAI(temperature=0)\n", "db_chain = SQLDatabaseChain(llm=llm, database=db, verbose=True)" ] }, { "cell_type": "code", "execution_count": 3, "id": "15ff81df", "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "\u001b[1m> Entering new SQLDatabaseChain chain...\u001b[0m\n", "How many employees are there? \n", "SQLQuery:\u001b[32;1m\u001b[1;3m SELECT COUNT(*) FROM Employee;\u001b[0m\n", "SQLResult: \u001b[33;1m\u001b[1;3m[(9,)]\u001b[0m\n", "Answer:\u001b[32;1m\u001b[1;3m There are 9 employees.\u001b[0m\n", "\u001b[1m> Finished chain.\u001b[0m\n" ] }, { "data": { "text/plain": [ "' There are 9 employees.'" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "db_chain.run(\"How many employees are there?\")" ] }, { "cell_type": "markdown", "id": "aad2cba6", "metadata": {}, "source": [ "## Customize Prompt\n", "You can also customize the prompt that is used. Here is an example prompting it to understand that foobar is the same as the Employee table" ] }, { "cell_type": "code", "execution_count": 5, "id": "8ca7bafb", "metadata": {}, "outputs": [], "source": [ "from langchain.prompts.prompt import PromptTemplate\n", "\n", "_DEFAULT_TEMPLATE = \"\"\"Given an input question, first create a syntactically correct {dialect} query to run, then look at the results of the query and return the answer.\n", "Use the following format:\n", "\n", "Question: \"Question here\"\n", "SQLQuery: \"SQL Query to run\"\n", "SQLResult: \"Result of the SQLQuery\"\n", "Answer: \"Final answer here\"\n", "\n", "Only use the following tables:\n", "\n", "{table_info}\n", "\n", "If someone asks for the table foobar, they really mean the employee table.\n", "\n", "Question: {input}\"\"\"\n", "PROMPT = PromptTemplate(\n", " input_variables=[\"input\", \"table_info\", \"dialect\"], template=_DEFAULT_TEMPLATE\n", ")" ] }, { "cell_type": "code", "execution_count": 6, "id": "ec47a2bf", "metadata": {}, "outputs": [], "source": [ "db_chain = SQLDatabaseChain(llm=llm, database=db, prompt=PROMPT, verbose=True)" ] }, { "cell_type": "code", "execution_count": 7, "id": "ebb0674e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "\u001b[1m> Entering new SQLDatabaseChain chain...\u001b[0m\n", "How many employees are there in the foobar table? \n", "SQLQuery:\u001b[32;1m\u001b[1;3m SELECT COUNT(*) FROM Employee;\u001b[0m\n", "SQLResult: \u001b[33;1m\u001b[1;3m[(9,)]\u001b[0m\n", "Answer:\u001b[32;1m\u001b[1;3m There are 9 employees in the foobar table.\u001b[0m\n", "\u001b[1m> Finished chain.\u001b[0m\n" ] }, { "data": { "text/plain": [ "' There are 9 employees in the foobar table.'" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "db_chain.run(\"How many employees are there in the foobar table?\")" ] }, { "cell_type": "code", "execution_count": null, "id": "e59a4740", "metadata": {}, "outputs": [], "source": [] } ], "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.9" } }, "nbformat": 4, "nbformat_minor": 5 }