diff --git a/content/Building Systems with the ChatGPT API/utils_ch.py b/content/Building Systems with the ChatGPT API/utils_ch.py new file mode 100644 index 0000000..dde2215 --- /dev/null +++ b/content/Building Systems with the ChatGPT API/utils_ch.py @@ -0,0 +1,760 @@ + +import json +import openai +from collections import defaultdict + +# 商品和目录的数据文件 +products_file = 'products.json' +categories_file = 'categories.json' + +# 分隔符 +delimiter = "####" +# 第二步(抽取商品)系统信息文本 +step_2_system_message_content = f""" +您将获得一次客户服务对话。最近的用户查询将使用{delimiter}字符进行分隔。 + +输出一个Python对象列表,其中每个对象具有以下格式: +'category': <包括以下几个类别:Computers and Laptops、martphones and Accessories、elevisions and Home Theater Systems、elevisions and Home Theater Systems、elevisions and Home Theater Systems、'category': <包括以下几个类别:Computers and Laptops、martphones and Accessories、elevisions and Home Theater Systems、elevisions and Home Theater Systems、elevisions and Home Theater Systems、相机和摄像机>, +或者 +'products': <必须是下面的允许产品列表中找到的产品> + +类别和产品必须在客户服务查询中找到。 +如果提到了产品,它必须与下面的允许产品列表中的正确类别相关联。 +如果未找到任何产品或类别,请输出一个空列表。 +只列出之前对话的早期部分未提及和讨论的产品和类别。 + +允许的产品: + +Computers and Laptops类别: +TechPro Ultrabook +BlueWave Gaming Laptop +PowerLite Convertible +TechPro Desktop +BlueWave Chromebook + +Smartphones and Accessories类别: +SmartX ProPhone +MobiTech PowerCase +SmartX MiniPhone +MobiTech Wireless Charger +SmartX EarBuds + +Televisions and Home Theater Systems类别: +CineView 4K TV +SoundMax Home Theater +CineView 8K TV +SoundMax Soundbar +CineView OLED TV + +Gaming Consoles and Accessories类别: +GameSphere X +ProGamer Controller +GameSphere Y +ProGamer Racing Wheel +GameSphere VR Headset + +Audio Equipment类别: +AudioPhonic Noise-Canceling Headphones +WaveSound Bluetooth Speaker +AudioPhonic True Wireless Earbuds +WaveSound Soundbar +AudioPhonic Turntable + +Cameras and Camcorders类别: +FotoSnap DSLR Camera +ActionCam 4K +FotoSnap Mirrorless Camera +ZoomMaster Camcorder +FotoSnap Instant Camera + +只输出对象列表,不包含其他内容。 +""" + +step_2_system_message = {'role':'system', 'content': step_2_system_message_content} + +# 第四步(生成用户回答)的系统信息 +step_4_system_message_content = f""" + 你是一家大型电子商店的客户服务助理。 + 以友好和乐于助人的语气回答,回答保持简洁明了。 + 确保让用户提出相关的后续问题。 +""" + +step_4_system_message = {'role':'system', 'content': step_4_system_message_content} + +# 第六步(验证模型回答)的系统信息 +step_6_system_message_content = f""" + 你是一个助手,评估客户服务代理的回答是否足够回答客户的问题,并验证助手从产品信息中引用的所有事实是否正确。 + 对话历史、产品信息、用户和客户服务代理的消息将用```进行分隔。 + 请用一个字母回答,不带标点符号: + Y - 如果输出足够回答问题,并且回答正确使用了产品信息 + N - 输出不足够回答问题,或者没有正确使用产品信息 + + 只输出一个字母。 +""" + +step_6_system_message = {'role':'system', 'content': step_6_system_message_content} + +# 使用 ChatCompletion 接口 +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"] + +# 创建目录(如果没有本地目录文件,需要创建一份) +def create_categories(): + categories_dict = { + 'Billing': [ + 'Unsubscribe or upgrade', + 'Add a payment method', + 'Explanation for charge', + 'Dispute a charge'], + 'Technical Support':[ + 'General troubleshooting' + 'Device compatibility', + 'Software updates'], + 'Account Management':[ + 'Password reset' + 'Update personal information', + 'Close account', + 'Account security'], + 'General Inquiry':[ + 'Product information' + 'Pricing', + 'Feedback', + 'Speak to a human'] + } + + with open(categories_file, 'w') as file: + json.dump(categories_dict, file) + + return categories_dict + +# 获取目录数据 +def get_categories(): + with open(categories_file, 'r') as file: + categories = json.load(file) + return categories + +# 获取商品列表 +def get_product_list(): + """ + 具体原理参见第四节课 + """ + products = get_products() + product_list = [] + for product in products.keys(): + product_list.append(product) + + return product_list + +# 获取商品和目录 +def get_products_and_category(): + """ + 具体原理参见第五节课 + """ + products = get_products() + products_by_category = defaultdict(list) + for product_name, product_info in products.items(): + category = product_info.get('category') + if category: + products_by_category[category].append(product_info.get('name')) + + return dict(products_by_category) + +# 从商品数据中获取 +def get_products(): + with open(products_file, 'r') as file: + products = json.load(file) + return products + +# 从用户问题中抽取商品和类别 +def find_category_and_product(user_input,products_and_category): + delimiter = "####" + system_message = f""" + 您将获得客户服务查询。 + 客户服务查询将使用{delimiter}字符分隔。 + 输出一个可解析的Python列表,列表每一个元素是一个JSON对象,每个对象具有以下格式: + 'category': <包括以下几个类别:Computers and Laptops,Smartphones and Accessories,Televisions and Home Theater Systems,Gaming Consoles and Accessories,Audio Equipment,Cameras and Camcorders> + 以及 + 'products': <必须是下面的允许产品列表中找到的产品列表> + + 其中类别和产品必须在客户服务查询中找到。 + 如果提到了产品,则必须将其与允许产品列表中的正确类别关联。 + 如果未找到任何产品或类别,则输出一个空列表。 + 除了列表外,不要输出其他任何信息! + + 允许的产品以JSON格式提供。 + 每个项的键表示类别。 + 每个项的值是该类别中的产品列表。 + 允许的产品:{products_and_category} + + """ + messages = [ + {'role':'system', 'content': system_message}, + {'role':'user', 'content': f"{delimiter}{user_input}{delimiter}"}, + ] + return get_completion_from_messages(messages) + +# 相比上一个函数,可获取的商品直接在 template 中限定 +def find_category_and_product_only(user_input,products_and_category): + delimiter = "####" + system_message = f""" +您将获得客户服务查询。 +客户服务查询将使用{delimiter}字符作为分隔符。 +请仅输出一个可解析的Python列表,列表每一个元素是一个JSON对象,每个对象具有以下格式: +'category': <包括以下几个类别:Computers and Laptops、Smartphones and Accessories、Televisions and Home Theater Systems、Gaming Consoles and Accessories、Audio Equipment、Cameras and Camcorders>, +以及 +'products': <必须是下面的允许产品列表中找到的产品列表> + +类别和产品必须在客户服务查询中找到。 +如果提到了某个产品,它必须与允许产品列表中的正确类别关联。 +如果未找到任何产品或类别,则输出一个空列表。 +除了列表外,不要输出其他任何信息! + +允许的产品: + +Computers and Laptops category: +TechPro Ultrabook +BlueWave Gaming Laptop +PowerLite Convertible +TechPro Desktop +BlueWave Chromebook + +Smartphones and Accessories category: +SmartX ProPhone +MobiTech PowerCase +SmartX MiniPhone +MobiTech Wireless Charger +SmartX EarBuds + +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 + +只输出对象列表,不包含其他内容。 + """ + messages = [ + {'role':'system', 'content': system_message}, + {'role':'user', 'content': f"{delimiter}{user_input}{delimiter}"}, + ] + return get_completion_from_messages(messages) + +# 从问题中抽取商品 +def get_products_from_query(user_msg): + """ + 代码来自于第五节课 + """ + products_and_category = get_products_and_category() + delimiter = "####" + system_message = f""" + 您将获得客户服务查询。 + 客户服务查询将使用{delimiter}字符作为分隔符。 + 请仅输出一个可解析的Python列表,列表每一个元素是一个JSON对象,每个对象具有以下格式: + 'category': <包括以下几个类别:Computers and Laptops、Smartphones and Accessories、Televisions and Home Theater Systems、Gaming Consoles and Accessories、Audio Equipment、Cameras and Camcorders>, + 以及 + 'products': <必须是下面的允许产品列表中找到的产品列表> + + 类别和产品必须在客户服务查询中找到。 + 如果提到了某个产品,它必须与允许产品列表中的正确类别关联。 + 如果未找到任何产品或类别,则输出一个空列表。 + 除了列表外,不要输出其他任何信息! + + 允许的产品以JSON格式提供。 + 每个项目的键表示类别。 + 每个项目的值是该类别中的产品列表。 + + 以下是允许的产品:{products_and_category} + + """ + + messages = [ + {'role':'system', 'content': system_message}, + {'role':'user', 'content': f"{delimiter}{user_msg}{delimiter}"}, + ] + category_and_product_response = get_completion_from_messages(messages) + + return category_and_product_response + + +# 商品信息的搜索 +def get_product_by_name(name): + products = get_products() + return products.get(name, None) + +def get_products_by_category(category): + products = get_products() + return [product for product in products.values() if product["category"] == category] + +def get_mentioned_product_info(data_list): + """ + 具体原理参见第五、六节课 + """ + product_info_l = [] + + if data_list is None: + return product_info_l + + 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: + product_info_l.append(product) + else: + print(f"错误: 商品 '{product_name}' 未找到") + elif "category" in data: + category_name = data["category"] + category_products = get_products_by_category(category_name) + for product in category_products: + product_info_l.append(product) + else: + print("错误:非法的商品格式") + except Exception as e: + print(f"Error: {e}") + + return product_info_l + + +# 以下函数原理参见第五节课 +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(input_string) + print("错误:非法的 Json 格式") + return None + +def generate_output_string(data_list): + output_string = "" + + if data_list is None: + return output_string + # print(data_list) + for data in data_list: + try: + if "products" in data: + # print(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"错误: 商品 '{product_name}' 没有找到") + 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("错误:非法的商品格式") + except Exception as e: + print(f"Error: {e}") + + return output_string + +# Example usage: +#product_information_for_user_message_1 = generate_output_string(category_and_product_list) +#print(product_information_for_user_message_1) +# 回答用户问题 +def answer_user_msg(user_msg,product_info): + """ + 代码参见第五节课 + """ + delimiter = "####" + system_message = f""" + 您是一家大型电子商店的客户服务助理。\ + 请用友好和乐于助人的口吻回答问题,提供简洁明了的答案。\ + 确保向用户提出相关的后续问题。 + """ + # user_msg = f""" + # tell me about the smartx pro phone and the fotosnap camera, the dslr one. Also what tell me about your tvs""" + messages = [ + {'role':'system', 'content': system_message}, + {'role':'user', 'content': f"{delimiter}{user_msg}{delimiter}"}, + {'role':'assistant', 'content': f"相关产品信息:\n{product_info}"}, + ] + response = get_completion_from_messages(messages) + return response + +# 创建并存入商品数据 +def create_products(): + # product information + # fun fact: all these products are fake and were generated by a language model + products = { + "TechPro Ultrabook": { + "name": "TechPro Ultrabook", + "category": "Computers and Laptops", + "brand": "TechPro", + "model_number": "TP-UB100", + "warranty": "1 year", + "rating": 4.5, + "features": ["13.3-inch display", "8GB RAM", "256GB SSD", "Intel Core i5 processor"], + "description": "A sleek and lightweight ultrabook for everyday use.", + "price": 799.99 + }, + "BlueWave Gaming Laptop": { + "name": "BlueWave Gaming Laptop", + "category": "Computers and Laptops", + "brand": "BlueWave", + "model_number": "BW-GL200", + "warranty": "2 years", + "rating": 4.7, + "features": ["15.6-inch display", "16GB RAM", "512GB SSD", "NVIDIA GeForce RTX 3060"], + "description": "A high-performance gaming laptop for an immersive experience.", + "price": 1199.99 + }, + "PowerLite Convertible": { + "name": "PowerLite Convertible", + "category": "Computers and Laptops", + "brand": "PowerLite", + "model_number": "PL-CV300", + "warranty": "1 year", + "rating": 4.3, + "features": ["14-inch touchscreen", "8GB RAM", "256GB SSD", "360-degree hinge"], + "description": "A versatile convertible laptop with a responsive touchscreen.", + "price": 699.99 + }, + "TechPro Desktop": { + "name": "TechPro Desktop", + "category": "Computers and Laptops", + "brand": "TechPro", + "model_number": "TP-DT500", + "warranty": "1 year", + "rating": 4.4, + "features": ["Intel Core i7 processor", "16GB RAM", "1TB HDD", "NVIDIA GeForce GTX 1660"], + "description": "A powerful desktop computer for work and play.", + "price": 999.99 + }, + "BlueWave Chromebook": { + "name": "BlueWave Chromebook", + "category": "Computers and Laptops", + "brand": "BlueWave", + "model_number": "BW-CB100", + "warranty": "1 year", + "rating": 4.1, + "features": ["11.6-inch display", "4GB RAM", "32GB eMMC", "Chrome OS"], + "description": "A compact and affordable Chromebook for everyday tasks.", + "price": 249.99 + }, + "SmartX ProPhone": { + "name": "SmartX ProPhone", + "category": "Smartphones and Accessories", + "brand": "SmartX", + "model_number": "SX-PP10", + "warranty": "1 year", + "rating": 4.6, + "features": ["6.1-inch display", "128GB storage", "12MP dual camera", "5G"], + "description": "A powerful smartphone with advanced camera features.", + "price": 899.99 + }, + "MobiTech PowerCase": { + "name": "MobiTech PowerCase", + "category": "Smartphones and Accessories", + "brand": "MobiTech", + "model_number": "MT-PC20", + "warranty": "1 year", + "rating": 4.3, + "features": ["5000mAh battery", "Wireless charging", "Compatible with SmartX ProPhone"], + "description": "A protective case with built-in battery for extended usage.", + "price": 59.99 + }, + "SmartX MiniPhone": { + "name": "SmartX MiniPhone", + "category": "Smartphones and Accessories", + "brand": "SmartX", + "model_number": "SX-MP5", + "warranty": "1 year", + "rating": 4.2, + "features": ["4.7-inch display", "64GB storage", "8MP camera", "4G"], + "description": "A compact and affordable smartphone for basic tasks.", + "price": 399.99 + }, + "MobiTech Wireless Charger": { + "name": "MobiTech Wireless Charger", + "category": "Smartphones and Accessories", + "brand": "MobiTech", + "model_number": "MT-WC10", + "warranty": "1 year", + "rating": 4.5, + "features": ["10W fast charging", "Qi-compatible", "LED indicator", "Compact design"], + "description": "A convenient wireless charger for a clutter-free workspace.", + "price": 29.99 + }, + "SmartX EarBuds": { + "name": "SmartX EarBuds", + "category": "Smartphones and Accessories", + "brand": "SmartX", + "model_number": "SX-EB20", + "warranty": "1 year", + "rating": 4.4, + "features": ["True wireless", "Bluetooth 5.0", "Touch controls", "24-hour battery life"], + "description": "Experience true wireless freedom with these comfortable earbuds.", + "price": 99.99 + }, + + "CineView 4K TV": { + "name": "CineView 4K TV", + "category": "Televisions and Home Theater Systems", + "brand": "CineView", + "model_number": "CV-4K55", + "warranty": "2 years", + "rating": 4.8, + "features": ["55-inch display", "4K resolution", "HDR", "Smart TV"], + "description": "A stunning 4K TV with vibrant colors and smart features.", + "price": 599.99 + }, + "SoundMax Home Theater": { + "name": "SoundMax Home Theater", + "category": "Televisions and Home Theater Systems", + "brand": "SoundMax", + "model_number": "SM-HT100", + "warranty": "1 year", + "rating": 4.4, + "features": ["5.1 channel", "1000W output", "Wireless subwoofer", "Bluetooth"], + "description": "A powerful home theater system for an immersive audio experience.", + "price": 399.99 + }, + "CineView 8K TV": { + "name": "CineView 8K TV", + "category": "Televisions and Home Theater Systems", + "brand": "CineView", + "model_number": "CV-8K65", + "warranty": "2 years", + "rating": 4.9, + "features": ["65-inch display", "8K resolution", "HDR", "Smart TV"], + "description": "Experience the future of television with this stunning 8K TV.", + "price": 2999.99 + }, + "SoundMax Soundbar": { + "name": "SoundMax Soundbar", + "category": "Televisions and Home Theater Systems", + "brand": "SoundMax", + "model_number": "SM-SB50", + "warranty": "1 year", + "rating": 4.3, + "features": ["2.1 channel", "300W output", "Wireless subwoofer", "Bluetooth"], + "description": "Upgrade your TV's audio with this sleek and powerful soundbar.", + "price": 199.99 + }, + "CineView OLED TV": { + "name": "CineView OLED TV", + "category": "Televisions and Home Theater Systems", + "brand": "CineView", + "model_number": "CV-OLED55", + "warranty": "2 years", + "rating": 4.7, + "features": ["55-inch display", "4K resolution", "HDR", "Smart TV"], + "description": "Experience true blacks and vibrant colors with this OLED TV.", + "price": 1499.99 + }, + + "GameSphere X": { + "name": "GameSphere X", + "category": "Gaming Consoles and Accessories", + "brand": "GameSphere", + "model_number": "GS-X", + "warranty": "1 year", + "rating": 4.9, + "features": ["4K gaming", "1TB storage", "Backward compatibility", "Online multiplayer"], + "description": "A next-generation gaming console for the ultimate gaming experience.", + "price": 499.99 + }, + "ProGamer Controller": { + "name": "ProGamer Controller", + "category": "Gaming Consoles and Accessories", + "brand": "ProGamer", + "model_number": "PG-C100", + "warranty": "1 year", + "rating": 4.2, + "features": ["Ergonomic design", "Customizable buttons", "Wireless", "Rechargeable battery"], + "description": "A high-quality gaming controller for precision and comfort.", + "price": 59.99 + }, + "GameSphere Y": { + "name": "GameSphere Y", + "category": "Gaming Consoles and Accessories", + "brand": "GameSphere", + "model_number": "GS-Y", + "warranty": "1 year", + "rating": 4.8, + "features": ["4K gaming", "500GB storage", "Backward compatibility", "Online multiplayer"], + "description": "A compact gaming console with powerful performance.", + "price": 399.99 + }, + "ProGamer Racing Wheel": { + "name": "ProGamer Racing Wheel", + "category": "Gaming Consoles and Accessories", + "brand": "ProGamer", + "model_number": "PG-RW200", + "warranty": "1 year", + "rating": 4.5, + "features": ["Force feedback", "Adjustable pedals", "Paddle shifters", "Compatible with GameSphere X"], + "description": "Enhance your racing games with this realistic racing wheel.", + "price": 249.99 + }, + "GameSphere VR Headset": { + "name": "GameSphere VR Headset", + "category": "Gaming Consoles and Accessories", + "brand": "GameSphere", + "model_number": "GS-VR", + "warranty": "1 year", + "rating": 4.6, + "features": ["Immersive VR experience", "Built-in headphones", "Adjustable headband", "Compatible with GameSphere X"], + "description": "Step into the world of virtual reality with this comfortable VR headset.", + "price": 299.99 + }, + + "AudioPhonic Noise-Canceling Headphones": { + "name": "AudioPhonic Noise-Canceling Headphones", + "category": "Audio Equipment", + "brand": "AudioPhonic", + "model_number": "AP-NC100", + "warranty": "1 year", + "rating": 4.6, + "features": ["Active noise-canceling", "Bluetooth", "20-hour battery life", "Comfortable fit"], + "description": "Experience immersive sound with these noise-canceling headphones.", + "price": 199.99 + }, + "WaveSound Bluetooth Speaker": { + "name": "WaveSound Bluetooth Speaker", + "category": "Audio Equipment", + "brand": "WaveSound", + "model_number": "WS-BS50", + "warranty": "1 year", + "rating": 4.5, + "features": ["Portable", "10-hour battery life", "Water-resistant", "Built-in microphone"], + "description": "A compact and versatile Bluetooth speaker for music on the go.", + "price": 49.99 + }, + "AudioPhonic True Wireless Earbuds": { + "name": "AudioPhonic True Wireless Earbuds", + "category": "Audio Equipment", + "brand": "AudioPhonic", + "model_number": "AP-TW20", + "warranty": "1 year", + "rating": 4.4, + "features": ["True wireless", "Bluetooth 5.0", "Touch controls", "18-hour battery life"], + "description": "Enjoy music without wires with these comfortable true wireless earbuds.", + "price": 79.99 + }, + "WaveSound Soundbar": { + "name": "WaveSound Soundbar", + "category": "Audio Equipment", + "brand": "WaveSound", + "model_number": "WS-SB40", + "warranty": "1 year", + "rating": 4.3, + "features": ["2.0 channel", "80W output", "Bluetooth", "Wall-mountable"], + "description": "Upgrade your TV's audio with this slim and powerful soundbar.", + "price": 99.99 + }, + "AudioPhonic Turntable": { + "name": "AudioPhonic Turntable", + "category": "Audio Equipment", + "brand": "AudioPhonic", + "model_number": "AP-TT10", + "warranty": "1 year", + "rating": 4.2, + "features": ["3-speed", "Built-in speakers", "Bluetooth", "USB recording"], + "description": "Rediscover your vinyl collection with this modern turntable.", + "price": 149.99 + }, + + "FotoSnap DSLR Camera": { + "name": "FotoSnap DSLR Camera", + "category": "Cameras and Camcorders", + "brand": "FotoSnap", + "model_number": "FS-DSLR200", + "warranty": "1 year", + "rating": 4.7, + "features": ["24.2MP sensor", "1080p video", "3-inch LCD", "Interchangeable lenses"], + "description": "Capture stunning photos and videos with this versatile DSLR camera.", + "price": 599.99 + }, + "ActionCam 4K": { + "name": "ActionCam 4K", + "category": "Cameras and Camcorders", + "brand": "ActionCam", + "model_number": "AC-4K", + "warranty": "1 year", + "rating": 4.4, + "features": ["4K video", "Waterproof", "Image stabilization", "Wi-Fi"], + "description": "Record your adventures with this rugged and compact 4K action camera.", + "price": 299.99 + }, + "FotoSnap Mirrorless Camera": { + "name": "FotoSnap Mirrorless Camera", + "category": "Cameras and Camcorders", + "brand": "FotoSnap", + "model_number": "FS-ML100", + "warranty": "1 year", + "rating": 4.6, + "features": ["20.1MP sensor", "4K video", "3-inch touchscreen", "Interchangeable lenses"], + "description": "A compact and lightweight mirrorless camera with advanced features.", + "price": 799.99 + }, + "ZoomMaster Camcorder": { + "name": "ZoomMaster Camcorder", + "category": "Cameras and Camcorders", + "brand": "ZoomMaster", + "model_number": "ZM-CM50", + "warranty": "1 year", + "rating": 4.3, + "features": ["1080p video", "30x optical zoom", "3-inch LCD", "Image stabilization"], + "description": "Capture life's moments with this easy-to-use camcorder.", + "price": 249.99 + }, + "FotoSnap Instant Camera": { + "name": "FotoSnap Instant Camera", + "category": "Cameras and Camcorders", + "brand": "FotoSnap", + "model_number": "FS-IC10", + "warranty": "1 year", + "rating": 4.1, + "features": ["Instant prints", "Built-in flash", "Selfie mirror", "Battery-powered"], + "description": "Create instant memories with this fun and portable instant camera.", + "price": 69.99 + } + } + + products_file = 'products.json' + with open(products_file, 'w') as file: + json.dump(products, file) + + return products \ No newline at end of file diff --git a/content/Building Systems with the ChatGPT API/utils_en.py b/content/Building Systems with the ChatGPT API/utils_en.py new file mode 100644 index 0000000..babed92 --- /dev/null +++ b/content/Building Systems with the ChatGPT API/utils_en.py @@ -0,0 +1,778 @@ + +import json +import openai +from collections import defaultdict + +# 商品和目录的数据文件 +products_file = 'products.json' +categories_file = 'categories.json' + +# 分隔符 +delimiter = "####" +# 第二步(抽取商品)系统信息文本 +step_2_system_message_content = f""" +You will be provided with customer service a conversation. \ +The most recent user 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. +Only list products and categories that have not already \ +been mentioned and discussed in the earlier parts of \ +the conversation. + +Allowed products: + +Computers and Laptops category: +TechPro Ultrabook +BlueWave Gaming Laptop +PowerLite Convertible +TechPro Desktop +BlueWave Chromebook + +Smartphones and Accessories category: +SmartX ProPhone +MobiTech PowerCase +SmartX MiniPhone +MobiTech Wireless Charger +SmartX EarBuds + +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. +""" + +step_2_system_message = {'role':'system', 'content': step_2_system_message_content} + +# 第四步(生成用户回答)的系统信息 +step_4_system_message_content = f""" + You are a customer service assistant for a large electronic store. \ + Respond in a friendly and helpful tone, with VERY concise answers. \ + Make sure to ask the user relevant follow-up questions. +""" + +step_4_system_message = {'role':'system', 'content': step_4_system_message_content} + +# 第六步(验证模型回答)的系统信息 +step_6_system_message_content = f""" + You are an assistant that evaluates whether \ + customer service agent responses sufficiently \ + answer customer questions, and also validates that \ + all the facts the assistant cites from the product \ + information are correct. + The conversation history, product information, user and customer \ + service agent messages will be delimited by \ + 3 backticks, i.e. ```. + Respond with a Y or N character, with no punctuation: + Y - if the output sufficiently answers the question \ + AND the response correctly uses product information + N - otherwise + + Output a single letter only. +""" + +step_6_system_message = {'role':'system', 'content': step_6_system_message_content} + +# 使用 ChatCompletion 接口 +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"] + +# 创建目录(如果没有本地目录文件,需要创建一份) +def create_categories(): + categories_dict = { + 'Billing': [ + 'Unsubscribe or upgrade', + 'Add a payment method', + 'Explanation for charge', + 'Dispute a charge'], + 'Technical Support':[ + 'General troubleshooting' + 'Device compatibility', + 'Software updates'], + 'Account Management':[ + 'Password reset' + 'Update personal information', + 'Close account', + 'Account security'], + 'General Inquiry':[ + 'Product information' + 'Pricing', + 'Feedback', + 'Speak to a human'] + } + + with open(categories_file, 'w') as file: + json.dump(categories_dict, file) + + return categories_dict + +# 获取目录数据 +def get_categories(): + with open(categories_file, 'r') as file: + categories = json.load(file) + return categories + +# 获取商品列表 +def get_product_list(): + """ + 具体原理参见第四节课 + """ + products = get_products() + product_list = [] + for product in products.keys(): + product_list.append(product) + + return product_list + +# 获取商品和目录 +def get_products_and_category(): + """ + 具体原理参见第五节课 + """ + products = get_products() + products_by_category = defaultdict(list) + for product_name, product_info in products.items(): + category = product_info.get('category') + if category: + products_by_category[category].append(product_info.get('name')) + + return dict(products_by_category) + +# 从商品数据中获取 +def get_products(): + with open(products_file, 'r') as file: + products = json.load(file) + return products + +# 从用户问题中抽取商品和类别 +def find_category_and_product(user_input,products_and_category): + 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 json 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. + + The allowed products are provided in JSON format. + The keys of each item represent the category. + The values of each item is a list of products that are within that category. + Allowed products: {products_and_category} + + """ + messages = [ + {'role':'system', 'content': system_message}, + {'role':'user', 'content': f"{delimiter}{user_input}{delimiter}"}, + ] + return get_completion_from_messages(messages) + +# 相比上一个函数,限制了可获取的商品 +def find_category_and_product_only(user_input,products_and_category): + 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: + Computers and Laptops category: +TechPro Ultrabook +BlueWave Gaming Laptop +PowerLite Convertible +TechPro Desktop +BlueWave Chromebook + +Smartphones and Accessories category: +SmartX ProPhone +MobiTech PowerCase +SmartX MiniPhone +MobiTech Wireless Charger +SmartX EarBuds + +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, nothing else. + """ + messages = [ + {'role':'system', 'content': system_message}, + {'role':'user', 'content': f"{delimiter}{user_input}{delimiter}"}, + ] + return get_completion_from_messages(messages) + +# 从问题中抽取商品 +def get_products_from_query(user_msg): + """ + 代码来自于第五节课 + """ + products_and_category = get_products_and_category() + 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 json 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. + + The allowed products are provided in JSON format. + The keys of each item represent the category. + The values of each item is a list of products that are within that category. + Allowed products: {products_and_category} + + """ + + messages = [ + {'role':'system', 'content': system_message}, + {'role':'user', 'content': f"{delimiter}{user_msg}{delimiter}"}, + ] + category_and_product_response = get_completion_from_messages(messages) + + return category_and_product_response + + +# 商品信息的搜索 +def get_product_by_name(name): + products = get_products() + return products.get(name, None) + +def get_products_by_category(category): + products = get_products() + return [product for product in products.values() if product["category"] == category] + +def get_mentioned_product_info(data_list): + """ + 具体原理参见第五、六节课 + """ + product_info_l = [] + + if data_list is None: + return product_info_l + + 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: + product_info_l.append(product) + 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: + product_info_l.append(product) + else: + print("Error: Invalid object format") + except Exception as e: + print(f"Error: {e}") + + return product_info_l + + +# 以下函数原理参见第五节课 +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 + +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 + +# Example usage: +#product_information_for_user_message_1 = generate_output_string(category_and_product_list) +#print(product_information_for_user_message_1) +# 回答用户问题 +def answer_user_msg(user_msg,product_info): + """ + 代码参见第五节课 + """ + delimiter = "####" + system_message = f""" + You are a customer service assistant for a large electronic store. \ + Respond in a friendly and helpful tone, with concise answers. \ + Make sure to ask the user relevant follow up questions. + """ + # user_msg = f""" + # tell me about the smartx pro phone and the fotosnap camera, the dslr one. Also what tell me about your tvs""" + messages = [ + {'role':'system', 'content': system_message}, + {'role':'user', 'content': f"{delimiter}{user_msg}{delimiter}"}, + {'role':'assistant', 'content': f"Relevant product information:\n{product_info}"}, + ] + response = get_completion_from_messages(messages) + return response + +# 创建并存入商品数据 +def create_products(): + """ + Create products dictionary and save it to a file named products.json + """ + # product information + # fun fact: all these products are fake and were generated by a language model + products = { + "TechPro Ultrabook": { + "name": "TechPro Ultrabook", + "category": "Computers and Laptops", + "brand": "TechPro", + "model_number": "TP-UB100", + "warranty": "1 year", + "rating": 4.5, + "features": ["13.3-inch display", "8GB RAM", "256GB SSD", "Intel Core i5 processor"], + "description": "A sleek and lightweight ultrabook for everyday use.", + "price": 799.99 + }, + "BlueWave Gaming Laptop": { + "name": "BlueWave Gaming Laptop", + "category": "Computers and Laptops", + "brand": "BlueWave", + "model_number": "BW-GL200", + "warranty": "2 years", + "rating": 4.7, + "features": ["15.6-inch display", "16GB RAM", "512GB SSD", "NVIDIA GeForce RTX 3060"], + "description": "A high-performance gaming laptop for an immersive experience.", + "price": 1199.99 + }, + "PowerLite Convertible": { + "name": "PowerLite Convertible", + "category": "Computers and Laptops", + "brand": "PowerLite", + "model_number": "PL-CV300", + "warranty": "1 year", + "rating": 4.3, + "features": ["14-inch touchscreen", "8GB RAM", "256GB SSD", "360-degree hinge"], + "description": "A versatile convertible laptop with a responsive touchscreen.", + "price": 699.99 + }, + "TechPro Desktop": { + "name": "TechPro Desktop", + "category": "Computers and Laptops", + "brand": "TechPro", + "model_number": "TP-DT500", + "warranty": "1 year", + "rating": 4.4, + "features": ["Intel Core i7 processor", "16GB RAM", "1TB HDD", "NVIDIA GeForce GTX 1660"], + "description": "A powerful desktop computer for work and play.", + "price": 999.99 + }, + "BlueWave Chromebook": { + "name": "BlueWave Chromebook", + "category": "Computers and Laptops", + "brand": "BlueWave", + "model_number": "BW-CB100", + "warranty": "1 year", + "rating": 4.1, + "features": ["11.6-inch display", "4GB RAM", "32GB eMMC", "Chrome OS"], + "description": "A compact and affordable Chromebook for everyday tasks.", + "price": 249.99 + }, + "SmartX ProPhone": { + "name": "SmartX ProPhone", + "category": "Smartphones and Accessories", + "brand": "SmartX", + "model_number": "SX-PP10", + "warranty": "1 year", + "rating": 4.6, + "features": ["6.1-inch display", "128GB storage", "12MP dual camera", "5G"], + "description": "A powerful smartphone with advanced camera features.", + "price": 899.99 + }, + "MobiTech PowerCase": { + "name": "MobiTech PowerCase", + "category": "Smartphones and Accessories", + "brand": "MobiTech", + "model_number": "MT-PC20", + "warranty": "1 year", + "rating": 4.3, + "features": ["5000mAh battery", "Wireless charging", "Compatible with SmartX ProPhone"], + "description": "A protective case with built-in battery for extended usage.", + "price": 59.99 + }, + "SmartX MiniPhone": { + "name": "SmartX MiniPhone", + "category": "Smartphones and Accessories", + "brand": "SmartX", + "model_number": "SX-MP5", + "warranty": "1 year", + "rating": 4.2, + "features": ["4.7-inch display", "64GB storage", "8MP camera", "4G"], + "description": "A compact and affordable smartphone for basic tasks.", + "price": 399.99 + }, + "MobiTech Wireless Charger": { + "name": "MobiTech Wireless Charger", + "category": "Smartphones and Accessories", + "brand": "MobiTech", + "model_number": "MT-WC10", + "warranty": "1 year", + "rating": 4.5, + "features": ["10W fast charging", "Qi-compatible", "LED indicator", "Compact design"], + "description": "A convenient wireless charger for a clutter-free workspace.", + "price": 29.99 + }, + "SmartX EarBuds": { + "name": "SmartX EarBuds", + "category": "Smartphones and Accessories", + "brand": "SmartX", + "model_number": "SX-EB20", + "warranty": "1 year", + "rating": 4.4, + "features": ["True wireless", "Bluetooth 5.0", "Touch controls", "24-hour battery life"], + "description": "Experience true wireless freedom with these comfortable earbuds.", + "price": 99.99 + }, + + "CineView 4K TV": { + "name": "CineView 4K TV", + "category": "Televisions and Home Theater Systems", + "brand": "CineView", + "model_number": "CV-4K55", + "warranty": "2 years", + "rating": 4.8, + "features": ["55-inch display", "4K resolution", "HDR", "Smart TV"], + "description": "A stunning 4K TV with vibrant colors and smart features.", + "price": 599.99 + }, + "SoundMax Home Theater": { + "name": "SoundMax Home Theater", + "category": "Televisions and Home Theater Systems", + "brand": "SoundMax", + "model_number": "SM-HT100", + "warranty": "1 year", + "rating": 4.4, + "features": ["5.1 channel", "1000W output", "Wireless subwoofer", "Bluetooth"], + "description": "A powerful home theater system for an immersive audio experience.", + "price": 399.99 + }, + "CineView 8K TV": { + "name": "CineView 8K TV", + "category": "Televisions and Home Theater Systems", + "brand": "CineView", + "model_number": "CV-8K65", + "warranty": "2 years", + "rating": 4.9, + "features": ["65-inch display", "8K resolution", "HDR", "Smart TV"], + "description": "Experience the future of television with this stunning 8K TV.", + "price": 2999.99 + }, + "SoundMax Soundbar": { + "name": "SoundMax Soundbar", + "category": "Televisions and Home Theater Systems", + "brand": "SoundMax", + "model_number": "SM-SB50", + "warranty": "1 year", + "rating": 4.3, + "features": ["2.1 channel", "300W output", "Wireless subwoofer", "Bluetooth"], + "description": "Upgrade your TV's audio with this sleek and powerful soundbar.", + "price": 199.99 + }, + "CineView OLED TV": { + "name": "CineView OLED TV", + "category": "Televisions and Home Theater Systems", + "brand": "CineView", + "model_number": "CV-OLED55", + "warranty": "2 years", + "rating": 4.7, + "features": ["55-inch display", "4K resolution", "HDR", "Smart TV"], + "description": "Experience true blacks and vibrant colors with this OLED TV.", + "price": 1499.99 + }, + + "GameSphere X": { + "name": "GameSphere X", + "category": "Gaming Consoles and Accessories", + "brand": "GameSphere", + "model_number": "GS-X", + "warranty": "1 year", + "rating": 4.9, + "features": ["4K gaming", "1TB storage", "Backward compatibility", "Online multiplayer"], + "description": "A next-generation gaming console for the ultimate gaming experience.", + "price": 499.99 + }, + "ProGamer Controller": { + "name": "ProGamer Controller", + "category": "Gaming Consoles and Accessories", + "brand": "ProGamer", + "model_number": "PG-C100", + "warranty": "1 year", + "rating": 4.2, + "features": ["Ergonomic design", "Customizable buttons", "Wireless", "Rechargeable battery"], + "description": "A high-quality gaming controller for precision and comfort.", + "price": 59.99 + }, + "GameSphere Y": { + "name": "GameSphere Y", + "category": "Gaming Consoles and Accessories", + "brand": "GameSphere", + "model_number": "GS-Y", + "warranty": "1 year", + "rating": 4.8, + "features": ["4K gaming", "500GB storage", "Backward compatibility", "Online multiplayer"], + "description": "A compact gaming console with powerful performance.", + "price": 399.99 + }, + "ProGamer Racing Wheel": { + "name": "ProGamer Racing Wheel", + "category": "Gaming Consoles and Accessories", + "brand": "ProGamer", + "model_number": "PG-RW200", + "warranty": "1 year", + "rating": 4.5, + "features": ["Force feedback", "Adjustable pedals", "Paddle shifters", "Compatible with GameSphere X"], + "description": "Enhance your racing games with this realistic racing wheel.", + "price": 249.99 + }, + "GameSphere VR Headset": { + "name": "GameSphere VR Headset", + "category": "Gaming Consoles and Accessories", + "brand": "GameSphere", + "model_number": "GS-VR", + "warranty": "1 year", + "rating": 4.6, + "features": ["Immersive VR experience", "Built-in headphones", "Adjustable headband", "Compatible with GameSphere X"], + "description": "Step into the world of virtual reality with this comfortable VR headset.", + "price": 299.99 + }, + + "AudioPhonic Noise-Canceling Headphones": { + "name": "AudioPhonic Noise-Canceling Headphones", + "category": "Audio Equipment", + "brand": "AudioPhonic", + "model_number": "AP-NC100", + "warranty": "1 year", + "rating": 4.6, + "features": ["Active noise-canceling", "Bluetooth", "20-hour battery life", "Comfortable fit"], + "description": "Experience immersive sound with these noise-canceling headphones.", + "price": 199.99 + }, + "WaveSound Bluetooth Speaker": { + "name": "WaveSound Bluetooth Speaker", + "category": "Audio Equipment", + "brand": "WaveSound", + "model_number": "WS-BS50", + "warranty": "1 year", + "rating": 4.5, + "features": ["Portable", "10-hour battery life", "Water-resistant", "Built-in microphone"], + "description": "A compact and versatile Bluetooth speaker for music on the go.", + "price": 49.99 + }, + "AudioPhonic True Wireless Earbuds": { + "name": "AudioPhonic True Wireless Earbuds", + "category": "Audio Equipment", + "brand": "AudioPhonic", + "model_number": "AP-TW20", + "warranty": "1 year", + "rating": 4.4, + "features": ["True wireless", "Bluetooth 5.0", "Touch controls", "18-hour battery life"], + "description": "Enjoy music without wires with these comfortable true wireless earbuds.", + "price": 79.99 + }, + "WaveSound Soundbar": { + "name": "WaveSound Soundbar", + "category": "Audio Equipment", + "brand": "WaveSound", + "model_number": "WS-SB40", + "warranty": "1 year", + "rating": 4.3, + "features": ["2.0 channel", "80W output", "Bluetooth", "Wall-mountable"], + "description": "Upgrade your TV's audio with this slim and powerful soundbar.", + "price": 99.99 + }, + "AudioPhonic Turntable": { + "name": "AudioPhonic Turntable", + "category": "Audio Equipment", + "brand": "AudioPhonic", + "model_number": "AP-TT10", + "warranty": "1 year", + "rating": 4.2, + "features": ["3-speed", "Built-in speakers", "Bluetooth", "USB recording"], + "description": "Rediscover your vinyl collection with this modern turntable.", + "price": 149.99 + }, + + "FotoSnap DSLR Camera": { + "name": "FotoSnap DSLR Camera", + "category": "Cameras and Camcorders", + "brand": "FotoSnap", + "model_number": "FS-DSLR200", + "warranty": "1 year", + "rating": 4.7, + "features": ["24.2MP sensor", "1080p video", "3-inch LCD", "Interchangeable lenses"], + "description": "Capture stunning photos and videos with this versatile DSLR camera.", + "price": 599.99 + }, + "ActionCam 4K": { + "name": "ActionCam 4K", + "category": "Cameras and Camcorders", + "brand": "ActionCam", + "model_number": "AC-4K", + "warranty": "1 year", + "rating": 4.4, + "features": ["4K video", "Waterproof", "Image stabilization", "Wi-Fi"], + "description": "Record your adventures with this rugged and compact 4K action camera.", + "price": 299.99 + }, + "FotoSnap Mirrorless Camera": { + "name": "FotoSnap Mirrorless Camera", + "category": "Cameras and Camcorders", + "brand": "FotoSnap", + "model_number": "FS-ML100", + "warranty": "1 year", + "rating": 4.6, + "features": ["20.1MP sensor", "4K video", "3-inch touchscreen", "Interchangeable lenses"], + "description": "A compact and lightweight mirrorless camera with advanced features.", + "price": 799.99 + }, + "ZoomMaster Camcorder": { + "name": "ZoomMaster Camcorder", + "category": "Cameras and Camcorders", + "brand": "ZoomMaster", + "model_number": "ZM-CM50", + "warranty": "1 year", + "rating": 4.3, + "features": ["1080p video", "30x optical zoom", "3-inch LCD", "Image stabilization"], + "description": "Capture life's moments with this easy-to-use camcorder.", + "price": 249.99 + }, + "FotoSnap Instant Camera": { + "name": "FotoSnap Instant Camera", + "category": "Cameras and Camcorders", + "brand": "FotoSnap", + "model_number": "FS-IC10", + "warranty": "1 year", + "rating": 4.1, + "features": ["Instant prints", "Built-in flash", "Selfie mirror", "Battery-powered"], + "description": "Create instant memories with this fun and portable instant camera.", + "price": 69.99 + } + } + + products_file = 'products.json' + with open(products_file, 'w') as file: + json.dump(products, file) + + return products \ No newline at end of file