# L5 Process Inputs: Chaining Prompts ## Setup #### Load the API key and relevant Python libaries. In this course, we've provided some code that loads the OpenAI API key for you. import os import openai from dotenv import load_dotenv, find_dotenv _ = load_dotenv(find_dotenv()) # read local .env file openai.api_key = os.environ['OPENAI_API_KEY'] def get_completion_from_messages(messages, model="gpt-3.5-turbo", temperature=0, max_tokens=500): response = openai.ChatCompletion.create( model=model, messages=messages, temperature=temperature, max_tokens=max_tokens, ) return response.choices[0].message["content"] ## Implement a complex task with multiple prompts ### Extract relevant product and category names delimiter = "####" system_message = f""" You will be provided with customer service queries. \ The customer service query will be delimited with \ {delimiter} characters. Output a python list of objects, where each object has \ the following format: 'category': , OR 'products': Where the categories and products must be found in \ the customer service query. If a product is mentioned, it must be associated with \ the correct category in the allowed products list below. If no products or categories are found, output an \ empty list. Allowed products: ovens category: Omnichef Galileo Oven Washer dryer: Omnichef Galileo Oven Televisions and Home Theater Systems category: CineView 4K TV SoundMax Home Theater CineView 8K TV SoundMax Soundbar CineView OLED TV Gaming Consoles and Accessories category: GameSphere X ProGamer Controller GameSphere Y ProGamer Racing Wheel GameSphere VR Headset Audio Equipment category: AudioPhonic Noise-Canceling Headphones WaveSound Bluetooth Speaker AudioPhonic True Wireless Earbuds WaveSound Soundbar AudioPhonic Turntable Cameras and Camcorders category: FotoSnap DSLR Camera ActionCam 4K FotoSnap Mirrorless Camera ZoomMaster Camcorder FotoSnap Instant Camera Only output the list of objects, with nothing else. """ user_message_1 = f""" tell me about the Omnichef Galileo Oven . \ Also tell me about other products """ messages = [ {'role':'system', 'content': system_message}, {'role':'user', 'content': f"{delimiter}{user_message_1}{delimiter}"}, ] category_and_product_response_1 = get_completion_from_messages(messages) print(category_and_product_response_1) user_message_2 = f""" my router isn't working""" messages = [ {'role':'system', 'content': system_message}, {'role':'user', 'content': f"{delimiter}{user_message_2}{delimiter}"}, ] response = get_completion_from_messages(messages) print(response) ### Retrieve detailed product information for extracted products and categories products = { "Omnichef Galileo Oven": { "name": "Wi-Fi Omnichef Galileo Oven", "category": "ovens", "brand": "Smeg", "model_number": "SO6606WAPNR", "warranty": "4 year", "rating": 5.0, "features": ["SmegConnect", "vapor clean", "Galileo Multicooking"], "description": "Compact oven that combines traditional, steam and microwave cooking, to experiment new opportunities in the kitchen and achieve professional results right from home", "price": 4799.99 }, "Free-standing washer dryer": { "name": "Free-standing washer dryer", "category": "Washer dryer", "brand": "Smeg", "model_number": "LSF147E", "warranty": "2 years", "rating": 4.7, "features": ["1400rpm", "15 programs", "Drying function", "LED display"], "description": "A high-performance gaming laptop for an immersive experience.", "price": 1199.99 }, } def get_product_by_name(name): return products.get(name, None) def get_products_by_category(category): return [product for product in products.values() if product["category"] == category] print(get_product_by_name("Free-standing washer dryer")) print(get_products_by_category("Washer dryer")) print(user_message_1) print(category_and_product_response_1) ### Read Python string into Python list of dictionaries import json def read_string_to_list(input_string): if input_string is None: return None try: input_string = input_string.replace("'", "\"") # Replace single quotes with double quotes for valid JSON data = json.loads(input_string) return data except json.JSONDecodeError: print("Error: Invalid JSON string") return None category_and_product_list = read_string_to_list(category_and_product_response_1) print(category_and_product_list) #### Retrieve detailed product information for the relevant products and categories def generate_output_string(data_list): output_string = "" if data_list is None: return output_string for data in data_list: try: if "products" in data: products_list = data["products"] for product_name in products_list: product = get_product_by_name(product_name) if product: output_string += json.dumps(product, indent=4) + "\n" else: print(f"Error: Product '{product_name}' not found") elif "category" in data: category_name = data["category"] category_products = get_products_by_category(category_name) for product in category_products: output_string += json.dumps(product, indent=4) + "\n" else: print("Error: Invalid object format") except Exception as e: print(f"Error: {e}") return output_string product_information_for_user_message_1 = generate_output_string(category_and_product_list) print(product_information_for_user_message_1) ### Generate answer to user query based on detailed product information system_message = f""" You are a customer service assistant for a \ large appliance manufacturer. \ Respond in a friendly and helpful tone, \ with very concise answers. \ Make sure to ask the user relevant follow up questions. """ user_message_1 = f""" tell me about the Omnichef Galileo Oven and \ the Free-standing washer dryer.""" messages = [ {'role':'system', 'content': system_message}, {'role':'user', 'content': user_message_1}, {'role':'assistant', 'content': f"""Relevant product information:\n\ {product_information_for_user_message_1}"""}, ] final_response = get_completion_from_messages(messages) print(final_response)