diff --git a/cookbook/Basic-Prompt-Routing/README.md b/cookbook/Basic-Prompt-Routing/README.md new file mode 100644 index 000000000..25d02bfbc --- /dev/null +++ b/cookbook/Basic-Prompt-Routing/README.md @@ -0,0 +1,12 @@ +# Basic Prompting Routing Demo - AI Teaching Assistant + +This demo shows how a simple use case of prompt routing with AI config. + +### How does it work? + +The user asks a question. The LLM decides the topic as math, physics, or general. Based on the topic, the LLM selects a different "assistant" to respond. These assistants have different system prompts and respond with varying introductions and style of response. + +### Setup with AIConfig + +1. Create an AIConfig for the prompts, models, and model parameters to be used for the different assistants: `create_config.py`. +2. Build assistant app to handle prompt routing logic among the prompts (uses AIConfig): `assistant_app.py`. diff --git a/cookbook/Basic-Prompt-Routing/assistant_aiconfig.json b/cookbook/Basic-Prompt-Routing/assistant_aiconfig.json new file mode 100644 index 000000000..adfd230cc --- /dev/null +++ b/cookbook/Basic-Prompt-Routing/assistant_aiconfig.json @@ -0,0 +1,70 @@ +{ + "name": "assistant_config", + "schema_version": "latest", + "metadata": { + "parameters": {}, + "models": { + "gpt-4": { + "top_k": 40, + "top_p": 1, + "model": "gpt-4", + "temperature": 0.0 + } + } + }, + "description": "teaching assistant config", + "prompts": [ + { + "name": "router", + "input": "{{student_question}}", + "metadata": { + "model": { + "name": "gpt-4", + "settings": { + "system_prompt": "\n You will be given a question. Classify the question as one of the following topics: \n 1. Math\n 2. Physics\n 3. General\n Output the topic name.\n " + } + }, + "parameters": {} + } + }, + { + "name": "math", + "input": "\n Student Question: {{router.input}}\n Topic: {{router.output}}\n ", + "metadata": { + "model": { + "name": "gpt-4", + "settings": { + "system_prompt": "\n You are a very good mathematician. You are great at answering math questions. \n You are so good because you are able to break down hard problems into their component parts, \n answer the component parts, and then put them together to answer the broader question.\n \n Output: If topic is Math, introduce yourself as 'Hi! I'm your Math Professor' and then answer the question. \n If the topic is not Math, output 'Sorry I only answer Math questions'.\n " + } + }, + "parameters": {} + } + }, + { + "name": "physics", + "input": "\n Student Question: {{router.input}}\n Topic: {{router.output}}\n ", + "metadata": { + "model": { + "name": "gpt-4", + "settings": { + "system_prompt": "\n You are a very smart physics professor. You are great at answering questions about physics in a concise and easy\n to understand manner. When you don't know the answer to a question you admit that you don't know.\n \n Output: If topic is Physics, introduce yourself as 'Hi! I'm your Physics Professor' and then answer the question. \n If the topic is not Physics, output 'Sorry I only answer Physics questions'.\n " + } + }, + "parameters": {} + } + }, + { + "name": "general", + "input": "\n Student Question: {{router.input}}\n Topic: {{router.output}}\n ", + "metadata": { + "model": { + "name": "gpt-4", + "settings": { + "system_prompt": "\n You are a helpful assistant. Answer the question as accurately as you can. \n \n Introduce yourself as \"Hi I'm your general assistant\". Then answer the question. \n " + } + }, + "parameters": {} + } + } + ] +} diff --git a/cookbook/Basic-Prompt-Routing/assistant_app.py b/cookbook/Basic-Prompt-Routing/assistant_app.py new file mode 100644 index 000000000..6cac17802 --- /dev/null +++ b/cookbook/Basic-Prompt-Routing/assistant_app.py @@ -0,0 +1,53 @@ +from aiconfig import AIConfigRuntime +from dotenv import load_dotenv +import streamlit as st +import asyncio +import os +import openai + +load_dotenv() +openai.api_key = os.getenv("OPENAI_API_KEY") + +# Get assistant response based on user prompt (prompt routing) +async def assistant_response(prompt): + config = AIConfigRuntime.load("assistant_aiconfig.json") + + params = {"student_question": prompt} + + router_prompt_completion = await config.run("router", params) + topic = config.get_output_text("router") + + dest_prompt = topic.lower() + + prompt_completion = await config.run(dest_prompt, params) + response = config.get_output_text(dest_prompt) + + return(response) + +# Streamlit Setup +st.title("AI Teaching Assistant") +st.markdown("Ask a math, physics, or general question. Based on your question, an AI math prof, physics prof, or general assistant will respond.") +st.markdown("**This is a simple demo of prompt routing - based on your question, an LLM decides which AI teacher responds.**") + +# Chat setup +if "messages" not in st.session_state: + st.session_state.messages = [] + +for message in st.session_state.messages: + with st.chat_message(message["role"]): + st.markdown(message["content"]) + +if prompt := st.chat_input("Ask a math, physics, or general question"): + st.chat_message("user").markdown(prompt) + st.session_state.messages.append({"role": "user", "content": prompt}) + + chat_response = asyncio.run(assistant_response(prompt)) + + response = f"AI: {chat_response}" + + with st.chat_message("assistant"): + st.markdown(response) + + st.session_state.messages.append({"role": "assistant", "content": response}) + + diff --git a/cookbook/Basic-Prompt-Routing/create_config.py b/cookbook/Basic-Prompt-Routing/create_config.py new file mode 100644 index 000000000..c524f0239 --- /dev/null +++ b/cookbook/Basic-Prompt-Routing/create_config.py @@ -0,0 +1,111 @@ +from aiconfig import AIConfigRuntime +from aiconfig import Prompt + +aiconfig = AIConfigRuntime.create("assistant_config", "teaching assistant config") + +# Set GPT-4 as default model from Teaching Assistant prompts +model_name = "gpt-4" +model_settings = { + "top_k": 40, + "top_p":1, + "model": "gpt-4", + "temperature": 0.0 +} +aiconfig.add_model(model_name, model_settings) + + +# Router Prompt +router_prompt = Prompt( + name="router", + input="{{student_question}}", + metadata= { + "model":{ + "name": "gpt-4", + "settings":{ + "system_prompt":""" + You will be given a question. Classify the question as one of the following topics: + 1. Math + 2. Physics + 3. General + Output the topic name. + """ + } + }, + } +) +aiconfig.add_prompt("router_prompt", router_prompt) + +# Math Assistant Prompt +math_assistant = Prompt( + name="math", + input=""" + Student Question: {{router.input}} + Topic: {{router.output}} + """, + metadata= { + "model":{ + "name": "gpt-4", + "settings":{ + "system_prompt":""" + You are a very good mathematician. You are great at answering math questions. + You are so good because you are able to break down hard problems into their component parts, + answer the component parts, and then put them together to answer the broader question. + + Output: If topic is Math, introduce yourself as 'Hi! I'm your Math Professor' and then answer the question. + If the topic is not Math, output 'Sorry I only answer Math questions'. + """ + } + }, + } +) +aiconfig.add_prompt("math", math_assistant) + +# Physics Assistant Prompt +physics_assistant = Prompt( + name="physics", + input=""" + Student Question: {{router.input}} + Topic: {{router.output}} + """, + metadata= { + "model":{ + "name": "gpt-4", + "settings":{ + "system_prompt":""" + You are a very smart physics professor. You are great at answering questions about physics in a concise and easy + to understand manner. When you don't know the answer to a question you admit that you don't know. + + Output: If topic is Physics, introduce yourself as 'Hi! I'm your Physics Professor' and then answer the question. + If the topic is not Physics, output 'Sorry I only answer Physics questions'. + """ + } + }, + } +) +aiconfig.add_prompt("physics", physics_assistant) + + +# General Assistant Prompt +general_assistant = Prompt( + name="general", + input=""" + Student Question: {{router.input}} + Topic: {{router.output}} + """, + metadata= { + "model":{ + "name": "gpt-4", + "settings":{ + "system_prompt":""" + You are a helpful assistant. Answer the question as accurately as you can. + + Introduce yourself as "Hi I'm your general assistant". Then answer the question. + """ + } + }, + } +) +aiconfig.add_prompt("general", general_assistant) + +# Save AIConfig +aiconfig.save('assistant_aiconfig.json', include_outputs=False) \ No newline at end of file diff --git a/cookbook/Basic-Prompt-Routing/requirements.txt b/cookbook/Basic-Prompt-Routing/requirements.txt new file mode 100644 index 000000000..a3f78e796 --- /dev/null +++ b/cookbook/Basic-Prompt-Routing/requirements.txt @@ -0,0 +1,4 @@ +streamlit +openai +python-aiconfig +asyncio \ No newline at end of file