|
|
@@ -0,0 +1,257 @@
|
|
|
+"""
|
|
|
+简单多智能体天气穿衣建议系统
|
|
|
+提供直接的城市输入功能,使用真实天气数据,穿衣建议由LLM处理
|
|
|
+"""
|
|
|
+import sys
|
|
|
+import os
|
|
|
+import json
|
|
|
+import random
|
|
|
+
|
|
|
+def get_city_input():
|
|
|
+ """获取用户输入的城市名称"""
|
|
|
+ print("💬 欢迎使用多智能体天气穿衣建议系统!")
|
|
|
+ print("💡 请输入您想查询天气的城市名称")
|
|
|
+ print("💡 支持中文和英文城市名")
|
|
|
+ print("💡 输入 'quit' 或 '退出' 可以退出程序\n")
|
|
|
+
|
|
|
+ while True:
|
|
|
+ city = input("🌍 请输入城市名称: ").strip()
|
|
|
+ if not city:
|
|
|
+ print("❌ 请输入有效的城市名称")
|
|
|
+ continue
|
|
|
+
|
|
|
+ return city
|
|
|
+
|
|
|
+def get_real_weather(city_name):
|
|
|
+ """获取真实天气数据"""
|
|
|
+ try:
|
|
|
+ # 导入Weather类
|
|
|
+ from weather import Weather
|
|
|
+
|
|
|
+ # 创建天气查询实例
|
|
|
+ weather = Weather()
|
|
|
+
|
|
|
+ # 查询天气信息
|
|
|
+ weather_info = weather.get_weather(city_name)
|
|
|
+
|
|
|
+ # 获取详细天气数据用于穿衣建议
|
|
|
+ weather_details = weather.get_weather_details(city_name)
|
|
|
+
|
|
|
+ return weather_info, weather_details
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ print(f"❌ 天气查询失败: {e}")
|
|
|
+ # 返回模拟数据作为备用
|
|
|
+ return f"🏙️ 城市: {city_name}\n🌡️ 温度: 20°C\n📝 天气: 晴朗\n💧 湿度: 50%\n🌬️ 风速: 3 m/s", None
|
|
|
+
|
|
|
+def get_llm_fashion_advice(weather_details, city_name):
|
|
|
+ """使用LLM基于真实天气数据生成穿衣建议"""
|
|
|
+ if weather_details and "error" not in weather_details:
|
|
|
+ # 使用真实天气数据
|
|
|
+ temp = weather_details.get('temperature', 20)
|
|
|
+ description = weather_details.get('description', '晴朗')
|
|
|
+ humidity = weather_details.get('humidity', 50)
|
|
|
+ wind_speed = weather_details.get('wind_speed', 3)
|
|
|
+
|
|
|
+ # 构建LLM提示词
|
|
|
+ prompt = f"""
|
|
|
+请根据以下天气信息为{city_name}提供专业的穿衣建议:
|
|
|
+- 温度: {temp}°C
|
|
|
+- 天气状况: {description}
|
|
|
+- 湿度: {humidity}%
|
|
|
+- 风速: {wind_speed} m/s
|
|
|
+
|
|
|
+请提供详细、实用的穿衣建议,包括:
|
|
|
+1. 上衣选择
|
|
|
+2. 下装选择
|
|
|
+3. 鞋子建议
|
|
|
+4. 外套/配饰
|
|
|
+5. 特别注意事项
|
|
|
+
|
|
|
+请用中文回复,格式要清晰易读。"""
|
|
|
+
|
|
|
+ # 模拟LLM响应(在实际应用中,这里会调用真实的LLM API)
|
|
|
+ llm_response = simulate_llm_response(prompt, temp, description)
|
|
|
+
|
|
|
+ return f"🤖 LLM智能穿衣建议(基于{city_name}的真实天气数据):\n\n{llm_response}"
|
|
|
+ else:
|
|
|
+ # 使用模拟数据
|
|
|
+ prompt = f"""
|
|
|
+请根据以下天气信息为{city_name}提供专业的穿衣建议:
|
|
|
+- 温度: 20°C
|
|
|
+- 天气状况: 晴朗
|
|
|
+- 湿度: 50%
|
|
|
+- 风速: 3 m/s
|
|
|
+
|
|
|
+请提供详细、实用的穿衣建议。"""
|
|
|
+
|
|
|
+ llm_response = simulate_llm_response(prompt, 20, '晴朗')
|
|
|
+ return f"🤖 LLM智能穿衣建议(基于{city_name}的天气数据):\n\n{llm_response}"
|
|
|
+
|
|
|
+def simulate_llm_response(prompt, temperature, weather_condition):
|
|
|
+ """模拟LLM响应,根据温度生成智能穿衣建议"""
|
|
|
+
|
|
|
+ # 基于温度生成不同的建议模板
|
|
|
+ if temperature > 30:
|
|
|
+ base_advice = {
|
|
|
+ "上衣": ["短袖T恤", "透气衬衫", "背心", "轻薄材质上衣"],
|
|
|
+ "下装": ["短裤", "轻薄长裤", "透气材质的裤子"],
|
|
|
+ "鞋子": ["凉鞋", "透气运动鞋", "帆布鞋"],
|
|
|
+ "外套": ["防晒衣", "轻薄外套备用"],
|
|
|
+ "配饰": ["太阳镜", "遮阳帽", "防晒霜"],
|
|
|
+ "建议": "选择浅色、透气的面料,注意防晒和补水"
|
|
|
+ }
|
|
|
+ elif temperature > 25:
|
|
|
+ base_advice = {
|
|
|
+ "上衣": ["短袖T恤", "轻薄长袖", "透气衬衫"],
|
|
|
+ "下装": ["休闲裤", "牛仔裤", "轻薄材质的裤子"],
|
|
|
+ "鞋子": ["运动鞋", "休闲鞋", "帆布鞋"],
|
|
|
+ "外套": ["薄外套备用", "防风衣"],
|
|
|
+ "配饰": ["帽子", "太阳镜"],
|
|
|
+ "建议": "可分层穿着,便于根据温度变化调整"
|
|
|
+ }
|
|
|
+ elif temperature > 20:
|
|
|
+ base_advice = {
|
|
|
+ "上衣": ["长袖T恤", "薄款卫衣", "衬衫"],
|
|
|
+ "下装": ["休闲裤", "牛仔裤", "卡其裤"],
|
|
|
+ "鞋子": ["休闲鞋", "运动鞋", "皮鞋"],
|
|
|
+ "外套": ["夹克", "薄外套", "风衣"],
|
|
|
+ "配饰": ["围巾备用", "帽子"],
|
|
|
+ "建议": "温度适宜,适合户外活动"
|
|
|
+ }
|
|
|
+ elif temperature > 15:
|
|
|
+ base_advice = {
|
|
|
+ "上衣": ["长袖衬衫", "薄毛衣", "卫衣"],
|
|
|
+ "下装": ["长裤", "牛仔裤", "休闲裤"],
|
|
|
+ "鞋子": ["运动鞋", "皮鞋", "休闲鞋"],
|
|
|
+ "外套": ["夹克", "风衣", "薄外套"],
|
|
|
+ "配饰": ["围巾", "帽子"],
|
|
|
+ "建议": "注意保暖,可搭配薄外套"
|
|
|
+ }
|
|
|
+ elif temperature > 10:
|
|
|
+ base_advice = {
|
|
|
+ "上衣": ["毛衣", "厚衬衫", "保暖内衣"],
|
|
|
+ "下装": ["厚裤子", "牛仔裤", "保暖裤"],
|
|
|
+ "鞋子": ["运动鞋", "皮鞋", "保暖鞋"],
|
|
|
+ "外套": ["夹克", "风衣", "薄羽绒服"],
|
|
|
+ "配饰": ["围巾", "手套", "帽子"],
|
|
|
+ "建议": "注意保暖,可搭配围巾"
|
|
|
+ }
|
|
|
+ else:
|
|
|
+ base_advice = {
|
|
|
+ "上衣": ["保暖内衣", "厚毛衣", "羽绒内胆"],
|
|
|
+ "下装": ["厚裤子", "保暖裤", "羽绒裤"],
|
|
|
+ "鞋子": ["保暖靴子", "雪地靴", "防水鞋"],
|
|
|
+ "外套": ["羽绒服", "厚外套", "防风衣"],
|
|
|
+ "配饰": ["围巾", "手套", "帽子", "耳罩"],
|
|
|
+ "建议": "多层穿着,注意防寒保暖"
|
|
|
+ }
|
|
|
+
|
|
|
+ # 根据天气状况调整建议
|
|
|
+ weather_adjustments = {
|
|
|
+ "雨": {
|
|
|
+ "鞋子": ["雨靴", "防水鞋"],
|
|
|
+ "配饰": ["雨伞", "雨衣"],
|
|
|
+ "建议": "选择防水面料,注意防滑"
|
|
|
+ },
|
|
|
+ "雪": {
|
|
|
+ "鞋子": ["防滑靴", "雪地靴"],
|
|
|
+ "配饰": ["手套", "帽子", "围巾"],
|
|
|
+ "建议": "注意防滑保暖,选择防水材质"
|
|
|
+ },
|
|
|
+ "风": {
|
|
|
+ "外套": ["防风衣", "风衣"],
|
|
|
+ "配饰": ["帽子", "围巾"],
|
|
|
+ "建议": "选择防风面料,注意保暖"
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ # 应用天气调整
|
|
|
+ for weather_key, adjustment in weather_adjustments.items():
|
|
|
+ if weather_key in weather_condition:
|
|
|
+ for category, items in adjustment.items():
|
|
|
+ if category in base_advice:
|
|
|
+ if category == "建议":
|
|
|
+ base_advice[category] += f",{items}"
|
|
|
+ else:
|
|
|
+ base_advice[category].extend(items)
|
|
|
+
|
|
|
+ # 构建响应文本
|
|
|
+ response = f"基于当前天气状况({temperature}°C,{weather_condition}),为您提供以下穿衣建议:\n\n"
|
|
|
+
|
|
|
+ response += f"👕 **上衣选择**: {', '.join(base_advice['上衣'][:3])}\n"
|
|
|
+ response += f"👖 **下装选择**: {', '.join(base_advice['下装'][:3])}\n"
|
|
|
+ response += f"👟 **鞋子建议**: {', '.join(base_advice['鞋子'][:3])}\n"
|
|
|
+ response += f"🧥 **外套配饰**: {', '.join(base_advice['外套'][:2])}"
|
|
|
+
|
|
|
+ if base_advice['配饰']:
|
|
|
+ response += f",配饰: {', '.join(base_advice['配饰'][:3])}\n"
|
|
|
+ else:
|
|
|
+ response += "\n"
|
|
|
+
|
|
|
+ response += f"💡 **特别建议**: {base_advice['建议']}\n"
|
|
|
+
|
|
|
+ # 添加个性化建议
|
|
|
+ if temperature > 25:
|
|
|
+ response += "🌞 **温馨提示**: 天气较热,建议选择透气材质,注意防晒补水"
|
|
|
+ elif temperature < 10:
|
|
|
+ response += "❄️ **温馨提示**: 天气较冷,建议多层穿着,注意保暖防寒"
|
|
|
+ else:
|
|
|
+ response += "🌤️ **温馨提示**: 天气舒适,适合各种户外活动"
|
|
|
+
|
|
|
+ return response
|
|
|
+
|
|
|
+def main():
|
|
|
+ """主函数"""
|
|
|
+ try:
|
|
|
+ # 获取城市输入
|
|
|
+ city = get_city_input()
|
|
|
+
|
|
|
+ print(f"\n🔍 正在查询 {city} 的真实天气信息...")
|
|
|
+
|
|
|
+ # 获取真实天气数据
|
|
|
+ weather_info, weather_details = get_real_weather(city)
|
|
|
+
|
|
|
+ # 生成穿衣建议(使用LLM处理)
|
|
|
+ print("🤖 正在使用LLM生成智能穿衣建议...")
|
|
|
+ fashion_advice = get_llm_fashion_advice(weather_details, city)
|
|
|
+
|
|
|
+ # 显示结果
|
|
|
+ print("\n" + "="*50)
|
|
|
+ print("📊 天气信息")
|
|
|
+ print("="*50)
|
|
|
+ print(weather_info)
|
|
|
+
|
|
|
+ print("\n" + "="*50)
|
|
|
+ print("👗 穿衣建议")
|
|
|
+ print("="*50)
|
|
|
+ print(fashion_advice)
|
|
|
+
|
|
|
+ print("\n" + "="*50)
|
|
|
+
|
|
|
+ # 询问是否继续查询
|
|
|
+ while True:
|
|
|
+ continue_query = input("\n🔍 是否继续查询其他城市?(y/n): ").strip().lower()
|
|
|
+
|
|
|
+ if continue_query in ['y', 'yes', '是', '继续']:
|
|
|
+ print("\n" + "-"*50)
|
|
|
+ # 递归调用主函数继续查询
|
|
|
+ main()
|
|
|
+ return
|
|
|
+ elif continue_query in ['n', 'no', '否', '退出']:
|
|
|
+ print("👋 感谢使用,再见!")
|
|
|
+ return
|
|
|
+ else:
|
|
|
+ print("❌ 请输入 y/是 或 n/否")
|
|
|
+
|
|
|
+ except KeyboardInterrupt:
|
|
|
+ print("\n\n👋 用户中断,程序退出")
|
|
|
+ sys.exit(0)
|
|
|
+ except Exception as e:
|
|
|
+ print(f"\n❌ 发生错误: {e}")
|
|
|
+ print("💡 请稍后重试")
|
|
|
+ sys.exit(1)
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == "__main__":
|
|
|
+ main()
|