diff --git a/config/resource.json b/config/resource.json index a7cde33..9129274 100644 --- a/config/resource.json +++ b/config/resource.json @@ -14,9 +14,9 @@ }, "refer": { "refer_list": [ - { "path": "resource/prompt/Refer/2025各月节日宣传节点时间表.md", "sampling_rate": 1 }, - { "path": "resource/prompt/Refer/标题参考格式.json", "sampling_rate": 0.5 }, - { "path": "resource/prompt/Refer/正文范文参考.json", "sampling_rate": 0.5 } + { "path": "resource/prompt/Refer/2025各月节日宣传节点时间表.md", "sampling_rate": 1, "step": "topic" }, + { "path": "resource/prompt/Refer/标题参考格式.json", "sampling_rate": 0.25, "step": "content" }, + { "path": "resource/prompt/Refer/正文范文参考.json", "sampling_rate": 0.25, "step": "content" } ] }, "object": { diff --git a/config/topic_gen.json b/config/topic_gen.json index f3181ea..a31d6c7 100644 --- a/config/topic_gen.json +++ b/config/topic_gen.json @@ -4,7 +4,7 @@ "model": {}, "topic": { "date": "2024-07-20", - "num": 2, + "num": 5, "variants": 1 } } \ No newline at end of file diff --git a/core/config/__pycache__/models.cpython-312.pyc b/core/config/__pycache__/models.cpython-312.pyc index 28fbd80..ea4e46f 100644 Binary files a/core/config/__pycache__/models.cpython-312.pyc and b/core/config/__pycache__/models.cpython-312.pyc differ diff --git a/core/config/models.py b/core/config/models.py index 7da22d1..5afc4f0 100644 --- a/core/config/models.py +++ b/core/config/models.py @@ -107,6 +107,7 @@ class ReferItem: """单个Refer项""" path: str = "" sampling_rate: float = 1.0 + step: str = "" # 可选值: "topic", "content", "judge",表示在哪个阶段使用 @dataclass class ReferConfig(BaseConfig): diff --git a/poster_gen_config.json b/poster_gen_config.json deleted file mode 100644 index 0ea3566..0000000 --- a/poster_gen_config.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "date": "6月29日-7月29日", - "num": 5, - "variants": 1, - "topic_temperature": 0.2, - "topic_top_p": 0.3, - "topic_presence_penalty": 1.5, - "content_temperature": 0.3, - "content_top_p": 0.5, - "content_presence_penalty": 1.2, - "model": "qwenQWQ", - "api_url": "http://localhost:8000/v1/", - "api_key": "EMPTY", - "enable_content_judge":true, - "topic_system_prompt": "./SelectPrompt/systemPrompt.txt", - "topic_user_prompt": "./SelectPrompt/userPrompt.txt", - "content_system_prompt": "./genPrompts/systemPrompt.txt", - "poster_content_system_prompt": "./genPrompts/poster_content_systemPrompt.txt", - "content_judger_system_prompt": "./genPrompts/judgerSystemPrompt.txt", - "prompts_config": [ - { - "type": "Style", - "file_path": [ - "./genPrompts/Style/攻略风文案提示词.txt" - ] - }, - { - "type": "Demand", - "file_path": [ - "./genPrompts/Demand/亲子向文旅需求.txt", - "./genPrompts/Demand/周边游文旅需求.txt" - ] - }, - { - "type": "Refer", - "file_path": [ - "./genPrompts/Refer/标题参考格式.json", - "./genPrompts/Refer/正文范文参考.json" - ] - } - ], - "resource_dir": [ - { - "type": "Object", - "file_path": [ - "./resource/Object/新疆游玩景点.txt" - ] - }, - { - "type": "Product", - "file_path": [ - "./resource/Product/赛里木湖营地.txt" - ] - } - ], - "output_dir": "./result", - "image_base_dir": "/root/autodl-tmp/TravelContentCreator/hotel_img", - "poster_assets_base_dir": "/root/autodl-tmp/poster_baseboard_0403", - "request_timeout": 210, - "max_retries": 3, - "description_filename": "description.txt", - "output_collage_subdir": "collage_img", - "output_poster_subdir": "poster", - "output_poster_filename": "poster.jpg", - "poster_target_size": [ - 900, - 1200 - ], - "title_possibility": 0.4, - "text_possibility": 0.5, - "img_frame_possibility": 0, - "text_bg_possibility": 0, - "collage_style": ["grid_2x2", "overlap", "fullscreen", "vertical_stack"], - - "additional_images_count": 3, - "additional_images_enabled": true, - "image_selection": { - "variation_strength": "medium", - "extra_effects": true, - "description": "图像变化配置: low(弱), medium(中), high(强)" - } -} \ No newline at end of file diff --git a/resource/prompt/Demand/亲子向文旅需求.txt b/resource/prompt/Demand/亲子向文旅需求.md similarity index 100% rename from resource/prompt/Demand/亲子向文旅需求.txt rename to resource/prompt/Demand/亲子向文旅需求.md diff --git a/resource/prompt/Demand/周边游文旅需求.txt b/resource/prompt/Demand/周边游文旅需求.md similarity index 100% rename from resource/prompt/Demand/周边游文旅需求.txt rename to resource/prompt/Demand/周边游文旅需求.md diff --git a/resource/prompt/Demand/高奢酒店文旅需求.txt b/resource/prompt/Demand/高奢酒店文旅需求.md similarity index 100% rename from resource/prompt/Demand/高奢酒店文旅需求.txt rename to resource/prompt/Demand/高奢酒店文旅需求.md diff --git a/resource/prompt/judgeContent/user.txt b/resource/prompt/judgeContent/user.txt index 2715d65..ad8b8f4 100644 --- a/resource/prompt/judgeContent/user.txt +++ b/resource/prompt/judgeContent/user.txt @@ -7,6 +7,10 @@ {product_content} --- Product End --- +--- Refer --- +{refer_content} +--- Refer End --- + --- Tweet --- {tweet_content} --- Tweet End --- diff --git a/tweet_prompt.txt b/tweet_prompt.txt deleted file mode 100644 index b7f15b5..0000000 --- a/tweet_prompt.txt +++ /dev/null @@ -1,525 +0,0 @@ -请为我创建一个旅游文案。 - -Style: 攻略风文案提示词 -你是景区小红书爆款文案策划,你将根据要求创作爆款文案,根据以下规则一步步执行: -一、标题创作 -步骤:先速览景区资料内容,找到与用户需求适配的景点亮点,然后通读用户给的爆款标题素材,挑选一个在用户画像+节点节日+标题吸睛三个方面最契合的进行改写,创作出全新的爆款标题。在此期间以下几点需要你遵循: -1.必加1个emoji,标题字数18字以内 -2.有网感,结合所在地 -3.标题必须结合我给出的<标题参考格式>进行高相似度仿写 - -二、正文创作 -注意:正文以<你>这种有人味的人称代词视角创作输出,不要出现<宝子们><姐妹们>这些很假的称呼 -1. 通过了解产品和当前节点需求,如情人节要约会、儿童节要带孩子玩、临近周末会考虑周边游、传统节日偏好民俗活动等以此类推,直击用户痛点。 -2. 正文围绕所选定的风格提示词进行创作,有场景感,让人感觉是亲身体验后的推荐,有一种和用户沟通的感觉,语言平实靠谱娓娓道来 -3. 正文部分可以参考我给你的<正文范文参考>文档,结合所给景区/民宿资料进行改写创作 -4. 分段+分点论述,巧用emoji,积极换行,让整体排版更好看 -5. 如果用户给出范文案例,请参考正文范文参考案例仿写 -6. 如果有导游产品,把导游产品介绍在文末或者文章开头加上一段具体写导游服务优势的内容,具体写清楚痛点&优势&服务 - -三、正文案例 -‼️新疆旅行黑红榜速报‼️ -亲测6大封神景点🆚6个本地人翻白眼雷区 -避坑指南已备好✅ -这个五一,用7天解锁新疆的N种神仙打开方式 -打工人必看👉「不请假不暴走」小众路线 -每天随便躺玩就能出片! -- -🌤【天气预警】 -5月新疆:5°C~20°C(早晚穿羽绒,中午穿吊带) -⚠紫外线堪比军训!防晒霜+墨镜+帽子三件套焊死! -- -🧳【行李清单】 -✅证件:身份证+驾照(自驾党必带) -✅保命穿搭:冲锋衣+白裙子+工装靴(温差15℃的叠穿美学) -✅急救包:肠胃yao+晕车yao+保湿面膜(一天五顿碳水+干燥警告) -- -✈【机场选择指南】 -▪首飞选乌鲁木齐!北疆环线起点,租车/拼团超方便 -▪伊宁机场:适合只玩伊犁的姐妹,落地直冲赛里木湖 -- -🚗【7天6晚游玩路线】 -Day1⃣:出发地-乌鲁木齐 -Day2⃣:乌鲁木齐-天山天池-奎屯 -Day3⃣:奎屯-赛里木湖-伊宁 -Day4⃣:伊宁-库尔德宁-那拉提 -Day5⃣:那拉提-空中草原-精河/博乐 -Day6⃣:博乐-独山子大峡谷-乌鲁木齐 -Day7⃣:乌鲁木齐-温馨的家 -- -🍖【新疆美食清单】 -🔥必吃Top3: -▪沙湾大盘鸡(加份皮带面!) -▪和田街烤包子(酥到掉渣爆汁) -▪精河过油肉拌面(本地人私藏小店) -💣避雷:景区门口的“天价”羊肉串 -- -⚠【血泪经验Tips】 -🔥 ‌温差刺客‌:薄羽绒+草帽+墨镜,5月草原早晚温差15℃,中午晒到穿吊带! -🔥 ‌信号消失术‌:赛湖、库尔德宁山区常无信号,建议常备现金。 -🔥 ‌防晒保命‌:紫外线比三亚狠!面罩焊脸上,防晒霜2小时补一次。 -🔥 ‌出片玄学‌:赛湖穿白裙子,那拉提配牛仔帽,独山子穿工装裤,谁拍谁封神! -- -📸【出片玄学指南】 -✔赛湖穿白裙+奔跑,拍出“海蒂和爷爷”电影感 -✔那拉提网红桥早起抢机位,下午人从众 -✔独山子穿卡其工装,秒变西部牛仔 -❗PS:带1TB胃和256G手机内存,美景美食根本停不下来! -- - -四、TAG标签创作 -每一篇笔记需要携带9个TAG标签,以下举例的加号(+)这个符号不要体现,仅代表内容连接的意思 -1.前三个TAG标签的内容围绕<#产品所在地区+旅游><#产品所在省份+旅游><#产品所在地区+周边游><#产品周边一线城市+周边游> -2.接着三个TAG标签的内容围绕<#景区/酒店名称><#景区/酒店名称+攻略><#景区/酒店名称+推荐> -3.最后三个TAG标签的内容围绕<#周末去哪儿玩><#小众旅游地><##产品所在地区+周末好去处> -注意:以上TAG直接按要求直出内容,不需要在直出的时候进行分类 - -五、输出注意点: - 1.按要求输出标签+正文+TAG标签 - 2.正文直白清楚围绕产品,不要出现比喻和联想 - 3.千万不要虚构景区信息没有的设施设备和活动信息,如果材料中没有指明,不要提及价格信息;如果没有明确的产品价格或者优惠活动信息,不要提及价格和优惠 - 4.输出内容中,要符合社会道德规范和法律规范 - 5.TAG标签按要求顺序在正文最后直出进行罗列 - 6.所有的价格(如XXX元)改成XXXr,即用代替<元>,如:200元变成200r - 7.关于所有节假日补差价都不要在文中提及 - - 具体输出格式参照以下格式: - { - "content": "(正文内容)", - "tag": "(TAG内容, 如#地点 #节日 #需求人群旅游 #周末去哪儿玩)", - "title": "(标题内容)" - } - -Demand: 周边游文旅需求 -周边游用户画像: -1. 基本属性 -- 年龄:全龄覆盖(主要围绕三天内的短期假期出游需求和周末出游需求). - -2. 平台行为 -- 互动习惯:高频搜索「周末去哪」「短途游攻略」,收藏本地美食地图,周末前3天搜索量激增,关注"(城市名称)1小时可达"标签. -- 发布内容:分享城市周边秘境、农家乐体验、短途自驾游记,高频使用"说走就走""逃离城市"等关键词. - -3. 消费特征 -- 决策偏好:注重便利性与性价比,自驾游便利、公共交通便利、高铁几小时以内等出行便利是优势. -- 消费倾向:倾向购买景区联票(含停车+餐饮+体验项目打包). -- 消费品类:民宿套餐、采摘体验、古镇一日游,近郊农场/房车营地/文创市集/夜游项目. - -4. 兴趣偏好 -- 偏好:轻旅行(露营、骑行)、季节限定活动(赏樱、滑雪) - -5.中国旅游出游做攻略高峰点: -1. 春节假期:1-2月 -2. 暑假:6-8月 -3. 国庆黄金周:9-10月初 -4. 五一假期:4-5月初 -5. 元旦:12月中下旬 -6.清明:4月初 -7.端午:5-6月 -8.中秋:8月底-9月 -9.寒假:12-2月 - - -Reference: ---- Refer File: 标题参考格式.json --- -标题: 标题参考格式 -描述: 你创作标题的时候可以直接按照以下参考标题,结合景区/酒店资料进行仿写。 - -示例: -1. 北京牛马不请假,25年带爸妈遛娃这么玩!1 -2. 广州周末去哪玩❓陈家祠深度游攻略‼️ -3. 济南春季亲子游‼️3天2晚看这一篇就够了💯 -4. 📍3.7 广州已回。。😭我都崩溃了 -5. N次扬州三天两夜亲子游🧸看这里就够全了🎈 -6. 没有人敢说惠州希尔顿酒店的事吗? -7. 解锁亲子游的「瘦shen副本」攻略】✨ -8. 广州番禺该去哪里❓看这篇就够了,快收藏吧 -9. 重庆本地人周末都去哪儿玩 ‼️ -10. 💥超齐全攻略|广东省内春季两天一夜团建📝 -11. 说点实话:贵州🆚版纳 已回 慎重 附路线 -12. 5个亲子游地带娃超轻松|1️⃣岁宝宝亲测 -13. 苏州可以逛一整天的市场推荐!全部🚇直达 - ---- Refer File: 正文范文参考.json --- -标题: 正文范文参考 -描述: 你需要用这些内容作为参考,创作正文笔记。你可以整合多段获取材料,创作出更丰富的内容。参考写法和视角 - -示例: -1. 一切都不及亲眼所见,5 - 6月的新疆是封神般的存在! -去了N次新疆,总结了一下个人建议,整理成一份新疆旅行避坑攻略,给大家避雷用‼️ - -1️⃣早晚温差很大,外面穿厚外套,里面穿美美裙子好拍照~ -2️⃣租车建议选性价比高的suv,务必选油耗低的。抵达机场后,工作人员会来出口办理租车手续,办理好就可以提车了。 -3️⃣乌鲁木齐提车出发自驾的小伙伴,选择支持异地还车的。(提前向租车公司咨询好规则,异地还车一般不便宜,但是能减去再回乌鲁木齐的驾驶劳累和节约时间)。 -4️⃣包车的宝子可以选择伊宁结束行程,不必再回乌市。提前跟师傅沟通好。 -5️⃣赛里木湖基本无攻略。东门进,南门出!草原天气变化莫测,务必带好保暖衣服~ -6️⃣禾木景区分为老村和新村,小木屋是在老村,酒店都在新村。老村距离打卡点都很近,但是隔音差,设施老旧。睡眠不好的人慎住… -7️⃣特克斯县是中国wei一建筑完整而又正规的八卦城,可以简单打卡,不介意用过多时间~ - -🚗参考路线 -1⃣️D1:乌鲁木齐 - S101国防公路 - 独山子大峽谷 - 精河 -2⃣️D2: 精河 - 赛里木湖 - 薰衣草 - 喀赞其 - 六星街 - 伊宁 -3⃣️D3: 伊宁 - 夏塔古道 - 木扎尔特冰川 - 昭苏 -4⃣️D4: 昭苏 - 喀拉峻 - 阔克苏大峽谷 - 特克斯八卦城 -5⃣️D5: 特克斯 - 琼库什台 - 琼库什台 -6⃣️D6: 琼库什台 - 唐布拉/那拉提 -7⃣️D7: 唐布拉/那拉提镇 - 那拉提 - 巴音布鲁克 - 巴音镇 -8⃣️D8: 巴音镇 - 独库公路 - 烈士陵园 - 乌鲁木齐 -· -📸新疆拍照景点 -✅独山子:打卡“我爱独山子”后的悬崖峭壁📸 -✅赛里木湖:自驾环湖一周,运气好能遇见白天鹅🦢 -✅夏塔:森林徒步,路上都是风景 -✅喀拉峻:一望无际的草原和连绵雪山 -✅琼库什台:骑马穿越乌孙古道,后山荡秋千 -✅那拉提:雪山🏔溪流、独木桥的童话世界~ -2. 夏天的快乐是玩水给的! - 每个暑假都想去水世界玩 - 这次来丽水算是挖到宝了🌊 - 项目超多❗️刺激好玩❗️ - 配套完善❗️物价合理❗️ - 重点是全程微笑服务❗️真的绝了‼️ - - 攻略收好⬇️ - -・ -🏖️冒险岛水世界 -📍丽水市莲都区琵琶岛路 -🚄高铁到丽水站,随后打车 15 分钟即可到达 -🎫成人 258 元,1 米 - 1.5 米儿童 158 元 -🈺10:00-22:00 - -・ -🧳出行前行李准备: -✔️泳衣泳裤✔️溯溪鞋 -✔️手机防水壳✔️一次性浴巾 -✔️防晒霜 -✔️玩水工具(水枪、水瓢、泳圈等) -ps. 景区商店也都有卖 - -・ -🚩入园流程: - 验票入园→租柜子→换泳衣→储存物品→项目游玩 - -・ -🏄‍♀️必打卡项目(玩一遍回本得不要不要的🤣) - -✅超级大喇叭 & 巨兽碗 -3-4 人一组,急速旋转漂移,全程尖叫,刺激无比🤭 -- -✅急速滑道 & 大水环滑道 -2 个挨着的高空滑道,在 22.3 米的高台,65 度角的滑道上,依靠重力惯性用不到 3 秒滑入水池,非常刺激🤩 -- -✅暴雪湾巨型造浪池 - 在大水池里游泳玩水枪,还有电音派对。跟着音乐节奏感受可达 3.3 米高的人工巨浪奔涌而来。不用去海边就能冲浪,太好玩儿了!晚上 19:30 - 20:20 还有音乐节,简直嗨翻天⚠️ 深水区需要穿救生衣🦺 -- -✅水寨 - 几十种不同的玩水组合,定时还有高空大水桶倾泻而下,大人小孩都能嗨玩一整天🌊 -- -✅四组合滑道 - 四个不同风格的滑道,乘坐皮筏顺着水流蜿蜒盘绕,休闲又刺激‼️ -- -✅勇士的足迹 (漂流河) -600 多米的主题漂流河,场景很丰富,小朋友可以带上水枪边漂边打水战🔫 -- -✅无边泳池 - 建在青山绿水旁的无边泳池,环境很好,拍照很出片📷泳池就在向山西餐厅旁,玩累了刚好点杯饮料吃点东西。西餐厅的室内环境也超好 - -・ -📌一些实用 tips: -1️⃣可自带食物。园区每个游玩点附近也都有餐饮,汉堡、中餐、西餐、小吃应有尽有,价格也合理⚠️物价参考见最后一张图 -2️⃣园区内各个游玩点附近都有躺椅,玩累了可以躺一会儿刷手机 -3️⃣保护好手机,万一不慎进水,园区内还有手机急救中心(更衣室下来的楼梯旁) -3. ‼️新疆旅行黑红榜速报‼️ -亲测6大封神景点🆚6个本地人翻白眼雷区 -避坑指南已备好✅ -这个五一,用7天解锁新疆的N种神仙打开方式 -打工人必看👉「不请假不暴走」小众路线 -每天随便躺玩就能出片! -- -🌤【天气预警】 -5月新疆:5°C ~ 20°C(早晚穿羽绒,中午穿吊带) -⚠紫外线堪比军训!防晒霜+墨镜+帽子三件套焊死! -- -🧳【行李清单】 -✅证件:身份证+驾照(自驾党必带) -✅保命穿搭:冲锋衣+白裙子+工装靴(温差15℃的叠穿美学) -✅急救包:肠胃yao+晕车yao+保湿面膜(一天五顿碳水+干燥警告) -- -✈【机场选择指南】 -▪首飞选乌鲁木齐!北疆环线起点,租车/拼团超方便 -▪伊宁机场:适合只玩伊犁的姐妹,落地直冲赛里木湖 -- -🚗【7天6晚游玩路线】 -Day1⃣:出发地 - 乌鲁木齐 -Day2⃣:乌鲁木齐 - 天山天池 - 奎屯 -Day3⃣:奎屯 - 赛里木湖 - 伊宁 -Day4⃣:伊宁 - 库尔德宁 - 那拉提 -Day5⃣:那拉提 - 空中草原 - 精河/博乐 -Day6⃣:博乐 - 独山子大峡谷 - 乌鲁木齐 -Day7⃣:乌鲁木齐 - 温馨的家 -- -🍖【新疆美食清单】 -🔥必吃Top3: -▪沙湾大盘鸡(加份皮带面!) -▪和田街烤包子(酥到掉渣爆汁) -▪精河过油肉拌面(本地人私藏小店) -💣避雷:景区门口的“天价”羊肉串 -- -⚠【血泪经验Tips】 -🔥 ‌温差刺客‌:薄羽绒+草帽+墨镜,5月草原早晚温差15℃,中午晒到穿吊带! -🔥 ‌信号消失术‌:赛湖、库尔德宁山区常无信号,建议常备现金。 -🔥 ‌防晒保命‌:紫外线比三亚狠!面罩焊脸上,防晒霜2小时补一次。 -🔥 ‌出片玄学‌:赛湖穿白裙子,那拉提配牛仔帽,独山子穿工装裤,谁拍谁封神! -- -📸【出片玄学指南】 -✔赛湖穿白裙+奔跑,拍出“海蒂和爷爷”电影感 -✔那拉提网红桥早起抢机位,下午人从众 -✔独山子穿卡其工装,秒变西部牛仔 -❗PS:带1TB胃和256G手机内存,美景美食根本停不下来! -- -4. 新疆的伊昭公路是一条风景秀丽的自驾线路,被誉为 “伊犁蕞美公路”。 - 一年只开 3 - 4 个月,错过真的要等一年!赶紧码住这份保姆级攻略👇 -・ - -🚗交通须知 -✅ 开放季节:该路线每年只在 6 月至 9 月开放(2025 年 5 月 15 日至 10 月 10 日开放!) -✅ 车辆限制:仅允许 7 座及以下的小型车辆通过 -✅ 道路情况:伊昭公路多弯且陡峭,路况较为复杂,建议使用越野车型,并由经验丰富的司机驾驶 -✅ 夜间禁行:由于山区道路无路灯,为确保安全,每晚 22:00 至次日早晨 7:00 期间禁止所有车辆通行 -・ - -🏕️沿途精华景点 -🔸托乎拉苏草原:离伊宁最近的一个草原,这片草原相比新疆其他更为知名的草原游客较少,保留了更多未被触及的自然风貌 -🔸乌孙山:穿越广阔的托乎拉苏草原之后,便会抵达乌孙山的白石峰🗻,这里的道路相对险峻 -🔸安格列特达坂:这是一处海拔高达 3091 米的山坂,站在此处可以一览北侧的琼博拉森林公园的壮观全景 -🔸琼博拉森林公园:位于乌孙山下,这里是一片广袤的草甸和密集的雪松林🍃,自然景观令人心旷神怡 -🔸伊犁州昭苏马场:昭苏地区自古以来就是著名的西域天马的产地,这里可以目睹壮观的万马🐎奔腾景象 -🔸夏塔旅游区:从昭苏向南行驶 70 公里,便可到达夏塔古道,这是一片充满野性的荒野地带,深受众多户外探险🏃‍♂️爱好者的青睐 -・ - -🚫【避坑血泪指南】 -❌ 限行警告! 仅 7 座以下车通行,20:00 - 9:00 禁行 -❌ 别穿白鞋! 泥巴路秒变脏脏包,徒步区石头硌 jio👟 -❌ 拒绝公路拍照!落石区停车 = 作 si,快速通过保平安 - -. - -📢经典游玩线路 -D1 全国各地 — 伊宁 -D2 伊宁 — 伊昭公路)— 夏塔 — 木扎尔特冰川 — 昭苏 -D3 昭苏 — 琼库什台 — 特克斯 -D4 特克斯 — 那拉提草原 — 六星街 — 伊宁 -D5 伊宁 — 赛里木湖 — 蓝冰围炉煮茶 — 喀赞其民俗村 — 忘忧谷薰衣草(6.15 - 7.15 限定)— 伊宁 -D6 伊宁 — 全国各地  - -. - -💎【行程亮点】 -✨ 新疆本地司机,出行签署正规合同 -✨ 线上 24h 管家式服务,在线答疑解惑 -✨ 一价全含✔门票✔住宿✔交通✔旅游险 -✨ 2 - 6 人小团,自由出行,沉浸欣赏旅途美景 -✨ 纯玩无购,❌进店 ❌购物,专注深度游玩 -. - - - -Object: 七十二奇楼 -**主体名称:** 天门山国家森林公园 -**地址:** 在市区。 -**交通指南:** -* 网天门山门票:278元/人 (分ABC三条线,票价一样;订票尽量提早-般A线订的蕞快)。 -* A线套票含:天门山国家森林公园门票+双程索道(天门山索道上山+天门洞快线索道下山)+穿山自动扶梯下行+保险。开放时间:7:30;停止检票入园时间16:00;国庆假期期间(10月2日-10月6日)开放时间6:30,停止检票入园时间为16:00。 -* 带好身份证,凭身份证检票进园。 -* 玩B线的下山时记得提前在山顶李娜别墅处预约取号下山。 -* 山顶有森林观光缆车从“云梦仙顶“至天门山寺(单程25元),只玩东线或者西线的、体能有限的可以考虑。 -* 天梯步行台阶可以选择登天门自动扶梯(32元)。 -* 索道下站可以行李寄存。 -* 根据游玩时间和体能选东线或者西线,时间足够可以考虑东西大环线。 -* 天门山分ABC三条线,除游览路径和体能消耗区别外,景点都能打卡到,根据喜好选就可以。 -* A线优点:全程以平路和下台阶为主,对老人小孩更友好一点B线上台阶、C线体力消耗大,要走回头路。B线优点:不坐登天门自助扶梯(32元/人)需要爬999级台阶其他等于反走A线,基本一样。C线优点:体能消耗会大一点,999级台阶上下都得走或者双程买自助扶梯票,有回头路。 -* 山顶东线游览路线:木石之恋-南俯视天门-东线玻璃栈道-醉云亭-玉壶峰-北俯视天门-高空云廊-穿山扶梯上站。游览亮点:俯瞰天门洞,视觉感极好,能拍到天门洞大片哦;玉壶峰的视线也不错,能看到群峰。 -* 山顶西线游览路线:凌霄台-倚红关-鬼谷栈道-悬索桥-观鬼谷洞-天门山寺。游览亮点:精华打卡点更集中一点,主要是鬼谷栈道和天门山寺。 -* 路线 游玩约 5小时:天门山索道下站(乘坐索道 免费)-天门山索道上站-云梦仙顶-西线玻璃栈道(5元)-倚虹关-鬼谷栈道-悬索桥-天门山寺-木石之恋-南俯天门山-醉云亭(体力好可去)-玉壶峰(体力好可去)-北俯天门-穿山扶梯(免费)-天门洞(步行走楼梯或乘坐扶梯 32元)-山门停车场-天门山索道上站(乘坐索道 免费)-山门停车场(乘坐大巴 免费)-天门山索道下站。 -* 前往张家界天门山国家森林公园(⚠️天门山有三条线路): - * A线:可从市区坐索道直达山顶全程28分钟全长7公里穿越城镇乡村直达山顶,从山顶一路往下游览乘坐7段扶梯到达天门山核心景点天门洞内,走出天门洞往下就是999级天梯,体力不好的可以选择自费购买5段扶梯下山,到达天门洞广场是最好的📷地点可以近距离观看奇观天门洞,最后乘坐快线索道下山,乘坐环保客车到达索道站。 - * B线:从索道站乘坐环保客车10分钟到达山脚乘坐快线索道到达天门洞广场,可选择坐扶梯或者挑战999天梯上山,然后穿过洞内坐7段免费扶梯上到山顶,一路游玩至索道站乘坐索道下山。 - * C线:从索道站乘坐环保客车10分钟到达山脚乘坐快线索道到达天门洞广场,上到山顶再原路返回到山脚下,此线路没有28分钟的索道慎选!!! -* 天门山一天或者半天就够了,AB线就是完全相反的路线没太大差别,A线上山排队B线下山排队而已(因为那个超长缆车一车只能坐8人,游客多肯定要排队的)。第一晚住市区最好!因为市区到天门山景区打车就10块钱左右,下山索道是直接到市区的,下了索道走路就可以吃饭喝奶茶逛步行街以及回酒店了(索道边就有茶颜悦色以及各种饭店),我当时挑了个山上的民宿虽然老板都接送了但还是觉得麻烦了,住市区最方便!住市区最方便!连锁酒店希尔顿桔子全季亚朵都有,民宿也很多很多。 -* 关于景点选择:我们主要去了天门山和武陵源两个景区!天门山预留一天足够。天门山 一般都是走ab两线因为不走回头路,而且可以坐超长索道,这两个线路线一样只是顺序反过来而已,有恐高的人群选择c线,因为我们坐超长索道下山的时候同厢里有个阿姨应该是恐高全程不敢睁眼,浑身紧张的通红真怕她随时就晕在厢里。a线上山排队,b线下山排队。a线是直接坐索道到山顶,因为是下山路所以带老人小孩的多选a线,旅游团也多。我们是俩年轻人想爬999天梯所以选的b线,下山是直接索道从山顶坐到市区,不过现在的b线下山据说要提前取号了。 -* 共享单车或网约车。 -* 天门山游玩,建议放在最后一天,因为天门山距离高铁站比较近,玩完了,吃吃饭,再去搭乘高铁很方便。 -**产品亮点:** -* 国家5A级景区,拥有世界海拔最高的天然穿山溶洞——天门洞。 -* 还有刺激的玻璃栈道、壮观的通天大道和超长的天门山索道。 -* 云雾缭绕间,仿佛踏入仙境,感受大自然与人类工程的奇迹融合。 -* 环境壮阔秀丽,大气磅礴,这里有亚洲最长的高山索道,在空中还可以俯瞰公路奇观99道弯,走一走就在悬崖边上的玻璃栈道,每一步跨出都是莫大的勇气。 -* 开放时间:7:30~18:00。(注:原文另有开放时间7:30;停止检票16:00及国庆期间特殊时间) -* 游玩时间:5~6小时。 -* 门票:278元/人 (网订价,分ABC线), 232元 (标注价,存疑,原文两处价格)。 -* 除了游玩这些,还推荐一个很不错的户外演出:在市区天门山脚下:《天门狐仙》。 - ---- - -**主体名称:** 大峡谷玻璃桥 (云天渡) -**地址:** 在慈利。 -**交通指南:** -* 交通:自驾或者在张家界乘坐景点大巴。 -* 时间:3-5h。 -* 【大峡谷游玩路线】: - * A线(单大峡谷):游客中心→一线天→彩虹广场→摸摸洞→神泉湖游船→景区出口。 - * B线(玻璃桥+大峡谷):游客中心→玻璃桥→玻璃栈道→爱享飞VR→观光电梯→彩虹广场→神龟探溪→一帘幽梦→摸摸洞→神泉湖游船→景区出口。 - * B线门票+体验项目套票:游客中心→玻璃桥→玻璃栈道→爱享飞VR→观光电梯→雕塑电梯或吴王坡滑道(也可选高空滑索和一线天滑道)→彩虹广场→彩虹湖游船→神龟探溪→一帘幽梦→摸摸洞→神泉湖游船→景区出口。 -**产品亮点:** -* 世界最长、最高的全透明玻璃桥“云天渡”就在这里! -* 行走其上,如漫步云端,脚下峡谷深渊与头顶蓝天白云相映成趣。 -* 购买套票,还能畅玩景区内七选五小项目,不管是体验爱享飞VR的沉浸式峡谷风光,还是挑战高空滑索感受风的呼啸,又或是乘坐寻宝电梯、雕塑电梯,体验吴王坡滑道、一线天滑道的刺激,亦或是悠闲地乘坐彩虹湖游船,都能随心选择,丰富你的游玩体验。 -* 峡谷内瀑布成群、溪流潺潺,宛如世外桃源。 -* 开放时间:8:00~16:00。 -* 游玩时间:3~4小时。 -* 门票:178元。 -* 【峡谷必玩景点攻略】: - 1. 玻璃桥:世界zui高、跨度zui长的玻璃桥,横跨大峡谷,距离谷底约300米,全长430米,站在上玻璃桥上方,俯瞰峡谷,十分震撼。 - 2. 彩虹湖游船:漂浮于碧波之上,左右两边是满眼翠绿植被的岩壁,乘船而行,惬意又舒适。 - 3. 神泉峡:峡谷狭窄空幽,水帘瀑从上而下滴落山谷。 - 4. 一帘幽梦:穿过幽长的水帘瀑,仿佛一个个长长的梦境。 - 5. 蝴蝶泉瀑布:因蝴蝶喜欢在此翩翩起舞,故起名蝴蝶泉瀑布。 - ---- - -**主体名称:** 张家界国家森林公园 (武陵源景区) -**地址:** 在武陵源区。 -**交通指南:** -* **外部交通:** - * 从火车站/天门山索道前往:在张家界中心汽车站乘车到武陵源汽车站,车票13元。 - * 从高铁张家界西站前往:在出站口旅游集散中心乘车到张家界国家森林公园东门(标志门),车票13元。 - * 打车:张家界国家森林公园离市区比较远,而且起码要玩两天,打车费用不低,建议住在景区东门附近,如果一定要打车,优先打网约车。(顺风车约30+,网约车约70+) - * 自驾:同样建议住在东门附近,酒店都有充足的停车位。 - * 很多人怕天门山去武陵源太远,但其实天门山门口就有直通武陵源东门的班车,大概一小时车程13块,在索道口右手边珍宝馆门口的位置可以乘坐。 - * 武陵源的东门和南门间也有直通班车10块钱一人。 - * 去武陵源可以坐大巴13块钱一个人,三四个人可以直接打车。 -* **内部路线与玩法:** - * 首先,之前其实是可以走环线,一天安排山上,另外一天安排山下。现在,由于中间塌方,所以导致行程变化!⚠️注意禁区因为6月份连续暴雨导致禁区公路坍塌去袁家界只能从西门和北门进入。 - * 一般来说森林公园至少玩两天,一天玩山上一天玩山下。 - * 攻略建议:第一天,南门进,黄石寨-杨家界-袁家界-金鞭溪。第二天,东门进,百龙天梯-十里画廊-天子山(量力而行,如果行程很赶,建议选择性百龙天梯或者天子山,天子山可能排队会更久些)。 - * 推荐线路是2天: - * **DAY1:** 东门进(标志门)—环保车—十里画廊—环保车—百龙天梯—环保车—袁家界(迷魂台、阿凡达乾坤柱、天下第一桥)—环保车—杨家界(天然长城)—环保车—神堂湾、点将台—环保车—天子山(天子阁、仙女散花、御笔峰、云青岩、贺龙铜像)—环保车—天子山索道—环保车—东门。 - * 十里画廊推荐坐小火车往返。往返:成人76元;14-18岁、60岁以上老人、学生38元;13岁以下免费。 - * 百龙天梯,可以购买VIP,每人100元。不用排队,走专有通道。 - * 袁家界不走回头路,正确的游览顺序是迷魂台—乾坤柱(哈利路亚山)—天下第一桥,然后会到天下第一桥车站。 - * 杨家界去看看天然长城即可。 - * 一定别错过看神堂湾和点将台。 - * **DAY2:** 森林公园站(南门)—大氧吧广场—环保车—黄石寨(缆车双程)—环保车—大氧吧广场—金鞭溪(全程7.5公里,出水绕四门)—环保车—东门出。 - * 金鞭溪,氧气含量超高,徒步很舒服,老人和孩子都很好走,会碰到猴子,千万别拿塑料袋。 - * 金鞭溪可以不走全程,从大氧吧广场走到西游记拍摄地1公里,从这里折返回大氧吧广场,再从南门出。 - * 东门和南门有专线公交车。很方便。南门也有行李寄存处。南门也有停车场。 - * 山上第一天:东门进——百龙天梯——袁家界——杨家界索道——杨家界——天子山——天子山索道回到东门(这里很多人推荐先从天子山索道上山倒着走,因为百龙天梯排队人多,建议如果是淡季或者赶着7:20景区开门进的话还是先坐天梯,这样可以体会到一下子升上去豁然开朗的感觉,毕竟是世界第一梯)。 - * 山下第二天:从南门进(可以去武陵源汽车站大巴十块钱过去)——黄石寨索道上下——黄石寨——金鞭溪——水绕四门——东门出。 - * 推荐玩耍地儿: - * 黄石寨,大环线or小环线,可以自己斟酌。 - * 杨家界,天然长城+一步登天必去,就是现在需要原路返回,所以体力不是很好的,可以不要继续往空中花园走了。(注意看封路地段)。 - * 袁家界,阿凡达拍摄地,百元大钞打卡点,迷魂台等。 - * 百龙天梯,体验电梯直上见风景的wow感,非常刺激! - * 天子山,贺龙公园→御笔峰→仙女献花→原路返回下车点。 - * 三索一梯到底是什么:杨家界索道、黄石寨索道、天子山索道、百龙天梯。 - * 玩完核心景区(森林公园)如果还有时间,可以预留大半天到一天时间去天门山。 - * 我们路线是:第一天东门进—十里画廊(单程小火车进,走出来)—百龙天梯(性价比低,不推荐)—袁家界(阿凡达取景地)—天子山(天子山索道下)—东门出,第二天是东门进—金鞭溪(徒步,绝美)—黄石寨(必去,索道上下)—南门出;除了杨家界没去,其他核心点感觉我们基本都逛透了,走金鞭溪预留三个小时,那里猴子多所以手上不要提食物要放包里。 - * 路线 全程大约6小时:南门-氧吧广场站-金鞭溪景区(山下的森林溪水景区)-母子峰-金鞭岩-西游记取景地-长寿泉-紫草谭-千里相会-千里相会站(免费公交车)-水绕四门站-百龙天梯下站(单程电梯预约小程序或第三方软件 65元)-百龙天梯上站-迷魂台站(换乘 免费公交车)-袁家界景区-迷魂台-悬浮桥-天下第一桥-天桥站(换乘 免费中巴)-天子山景区-贺龙公园站-御笔峰-仙女散花-贺龙公园-西海峰林-天子山索道上站(单程索道预约小程序或第三方软件 72元)-天子山索道下站-东门。 - * 武陵源(张家界国家森林公园)“山上”有袁家界、杨家界和天子山等,是园区的核心区域打卡景点:袁家界:迷魂台、哈利路亚山(《阿凡达》中“悬浮山”场景原型)、天下第一桥等;杨家界:天然长城、一步登天、空中走廊等;天子山:贺龙公园、云青岩、御笔峰、天子阁等;不玩杨家界的还可以考虑老屋场徒步线。“山下”有十里画廊、金鞭溪、黄石寨等:十里画廊是一段2公里左右的峡谷,十二生肖的小火车有点意思,可以根据实际时间游玩;金鞭溪是一处伴着溪流的峡谷,全长6公里左右,溪谷植被繁茂,溪水四季清澈,被称为“山水画廊”“人间仙境”;黄石寨相传是当年张良被官兵围困,得黄石公搭救而得名,是张家界美景蕞为集中的地方,也是张家界蕞大的凌空观景台。赶时间或带老人小孩的建议上下山坐索道。 - * **六大主要景区:** - 1. 金鞭溪:以溪流、峡谷景观为主,徒步约7.5公里,全程都是平路,很好走。 - 2. 十里画廊:山谷步道,有寿星迎宾、采药老人等象形石峰,也有小火车乘坐,适合带老人孩子体验。 - 3. 袁家界景区:世界第一梯百龙天梯,阿凡达悬浮山(哈利路亚山)、天下第一桥、迷魂台。 - 4. 杨家界景区:乌龙寨徒步路线,天然长城。 - 5. 天子山景区:御笔峰、仙女献花、贺龙公园,可乘索道或徒步下山至十里画廊。 - 6. 黄石寨景区:环寨游览线可俯瞰峰林全景,索道或徒步上山。 -* **票务信息:** - * 门票:提前买票!(小程序或第三方软件) 四日门票(含环保车),227元。学生票116元(需在门口核验身份认证)。全天开放,四天内有效。张家界今年14岁以下孩子各种票都免,只需要现场扫二维码买3块钱保险。 - * 三索一梯: - * 三索一梯单程票,238元。 - * 三索一梯多程票,298元 (连续4日内可无限次乘坐)。 - * 划重点:张家界国家森林公园非常大,包含天子山、杨家界、袁家界、黄石寨多个景区,门票是四天通用的,里面的环保车接驳都是免费的。有些景区的连接没法坐车,只能爬山,所以就要坐索道或者电梯,即三索一梯(天子山索道,杨家界索道,黄石寨索道,百龙天梯),如果你玩一天到两天,买单程票。玩三天到者四天,买多程票。如果你是爬山狠人,不用买。 - * 某🐟上可以买缆车不限次数的票,便宜将近100,但一定要提前一天买!当天买便宜不了了。不限次数的好处就是不用精心计算哪里要省着坐。 -* **重要提示:** - * 玩张家界森林公园一定要早起!!六点半到东门的话,不管什么都不用排队!百龙天梯第一排视角(手机不要平贴在电梯玻璃上!平铺只能拍一半的石柱,更多的石柱状的山在右侧,所以把手机右侧抬起来一点拍摄的效果更好一些),上山也基本是占山为王景色独享的状态,袁家界都没人,缆车不用排队,特别爽。起晚了哪哪儿都排队哪哪儿都人头攒动令人烦躁。这种热门景点早起去玩跟其他时段去玩,完全是两个状态! - * 武陵源玩两天,第一天玩山上各个景点慢悠悠溜达一整天,第二天金鞭溪溯溪,虽说有7.5公里但都是平地没有爬升并不太累,一万多步而已,一路有卖水的。 - * 七十二奇楼我们只是在门口打了个卡就走了,因为夜晚门票要88。 - * 吃饭:天子山景区餐厅二楼有热水壶! 金鞭溪有猕猴,会抢吃的,注意别被抓伤。!早上金鞭溪的温度较低,注意保暖。 - * 住宿:推荐住武陵源/森林公园门票站附近:这里有许多可以选择的民宿和酒店,大小规模不等,价格也不贵。建议住在东门(标志门)附近,餐厅多,较便利,早上进门和晚上出来步行几分钟就可以吃饭,楼下就是夜市一条街。东门很多民宿,挑个新点儿的。还可以看魅力湘西演出。🅿东门有地下停车场。淡季酒店100+ 民宿60+。划重点:现在是淡季,不管你是自驾还是大巴,直接住在东门,酒店多、饭店多、演出多、大巴多。 -**产品亮点:** -* **核心资源:** - * 中国第一个国家森林公园。 - * 1992年因奇特的石英砂岩大峰林被列入《世界自然遗产名录》,2004年被列入世界地质公园。 - * “奇峰三千,秀水八百”。 - * 国家森林公园就是我们熟知阿凡达拍摄地:武陵源景区。 - * ★张家界必去的景点:张家界国家森林公园:素有“三千奇峰、八百秀水”的美誉,园内非常的大,包括:杨家界、袁家界、金鞭溪、十里画廊和黄石寨等景点,“不来黄石寨,枉来张家界”,其中黄石寨一定要走一趟。 -* **核心景点:** - * 袁家界、金鞭溪、黄石寨等景点,让你沉醉于绝美的峰林与溪谷风光。 - * “山上”有袁家界、杨家界和天子山等,是园区的核心区域打卡景点:袁家界:迷魂台、哈利路亚山(《阿凡达》中“悬浮山”场景原型)、天下第一桥等;杨家界:天然长城、一步登天、空中走廊等;天子山:贺龙公园、云青岩、御笔峰、天子阁等。 - * “山下”有十里画廊、金鞭溪、黄石寨等:十里画廊是一段2公里左右的峡谷;金鞭溪是一处伴着溪流的峡谷,全长6公里左右,溪谷植被繁茂,溪水四季清澈,被称为“山水画廊”“人间仙境”;黄石寨是张家界美景蕞为集中的地方,也是张家界蕞大的凌空观景台。 -* **实用信息:** - * 开放时间:7:00-17:00。 - * 游玩时间:建议玩2天时间。 - * 门票:227元(4日内有效含环保车)。 - * 除了游玩这些,还推荐一个很不错的剧场:室内的《魅力湘西》,就在东门附近。魅力湘西可以看看,千古情不推荐。有时间大峡谷可以去一去,凤凰古镇就不用了。 - * 武陵源到处都有足疗按摩店,下山按摩休息一下很爽。 - * 张家界不大,旅游服务都很成熟,自由行很方便。 - * 入乡随俗的吃饭!张家界特色打鼓皮、三下锅都挺好吃的。很多店都有团购且服务态度都挺好的,湖南菜口味重,味道都大差不差的。至于莓茶,网购就行。 -* **重要注意事项:** - * **猕猴:** 张家界森林公园有很多猕猴,野生猕猴属于二级保护动物。不要去逗猕猴,不要用透明塑料袋装零食。金鞭溪有猕猴,会抢吃的,注意别被抓伤。 - * **安全:** 发现张家界连续下雨导致塌方...注意看封路地段。⚠️注意禁区因为6月份连续暴雨导致禁区公路坍塌去袁家界只能从西门和北门进入。天子山索道下站可以行李寄存。 - * **保暖:** !早上金鞭溪的温度较低,注意保暖。 - * **时间管理:** 玩张家界森林公园一定要早起!!六点半到东门的话,不管什么都不用排队!...起晚了哪哪儿都排队哪哪儿都人头攒动令人烦躁。 - * **体力:** 根据游玩时间和体能选路线。杨家界,就是现在需要原路返回,所以体力不是很好的,可以不要继续往空中花园走了。金鞭溪虽说有7.5公里但都是平地没有爬升并不太累,一万多步而已。 - ---- - -**主体名称:** 黄龙洞 -**地址:** (原文未明确提及具体地址,通常位于武陵源区索溪峪镇) -**交通指南:** (原文未提供具体交通指南) -**产品亮点:** -* 里面的钟乳石千姿百态,置身其中,有种走进了海下龙宫一般,坐一下乌篷船,体验“船在水上走,人在画中游的意境。” -* 开放时间:8:00~18:00。 -* 游玩时间:2~3小时。 -* 门票:120元。 - ---- - -**主体名称:** 凤凰古城 -**地址:** (原文未明确提及具体地址,位于湘西土家族苗族自治州) -**交通指南:** (原文未提供具体交通指南) -**产品亮点:** -* 北平遥,南凤凰,依山而建的吊脚楼错落有致的排列在小河两岸,充满了古韵的味道,夜幕降临,华灯初上,一片金碧辉煌,化身变为茂茂的“长安城”。 -* 开放时间:全天。 -* 游玩时间:半天。 -* 门票:免费。 - ---- - -**主体名称:** 芙蓉镇 -**地址:** (原文未明确提及具体地址,位于湘西土家族苗族自治州永顺县) -**交通指南:** (原文未提供具体交通指南) -**产品亮点:** -* 一个挂在瀑布之上古色古香的古镇,晚上灯光亮起的时候,整个芙蓉镇披上了一件金色的外衣,完全不需要滤镜,随手一拍都是大片的既视感。 -* 开放时间:全天。 -* 游玩时间:半天。 -* 门票:103元。 - ---- - -**主体名称:** 七十二奇楼 -**地址:** (原文未明确提及具体地址,位于张家界市区) -**交通指南:** -* 行程:中午抵达张家界,前往酒店办理入住。下午前往七十二奇楼。 -**产品亮点:** -* 白场:10:00-16:29,门票20元/人。 -* 晚场:日常16:30-22:30。节假日16:30-00:30。学生 60元/人,成人88元/人。 -* !奇楼进不去。18:00开灯。晚上有演出。21:30有篝火晚会。 -* !七十二奇楼对面可拍全景。有专业摄影师拍照。拍照+精修15元。 -* !外面买的冰箱贴千万不要买贵了!大概十元一个,还可以砍砍价8元拿下。 - ---- - - - -请考虑以上所有信息,创作一篇周边游文旅需求文旅内容。 \ No newline at end of file diff --git a/utils/__pycache__/pipeline.cpython-312.pyc b/utils/__pycache__/pipeline.cpython-312.pyc index 5a32249..b6148a6 100644 Binary files a/utils/__pycache__/pipeline.cpython-312.pyc and b/utils/__pycache__/pipeline.cpython-312.pyc differ diff --git a/utils/__pycache__/prompts.cpython-312.pyc b/utils/__pycache__/prompts.cpython-312.pyc index 51ae1cc..03ca2c1 100644 Binary files a/utils/__pycache__/prompts.cpython-312.pyc and b/utils/__pycache__/prompts.cpython-312.pyc differ diff --git a/utils/pipeline.py b/utils/pipeline.py index 2f0aaab..2e133cd 100644 --- a/utils/pipeline.py +++ b/utils/pipeline.py @@ -61,7 +61,7 @@ class PipelineManager: self.output_manager = OutputManager(self.resource_config.output_dir.base_dir, self.run_id) self.topic_generator = TopicGenerator(self.ai_agent, self.config_manager, self.output_manager) self.content_generator = ContentGenerator(self.ai_agent, self.config_manager, self.output_manager) - self.content_judger = ContentJudger(self.ai_agent, self.config_manager) + self.content_judger = ContentJudger(self.ai_agent, self.config_manager, self.output_manager) # self.poster_generator = PosterGenerator(...) async def process_content_generation(self, topics: List[Dict[str, Any]]) -> List[Dict[str, Any]]: diff --git a/utils/prompts.py b/utils/prompts.py index 91bb9e7..8dab0a1 100644 --- a/utils/prompts.py +++ b/utils/prompts.py @@ -150,13 +150,37 @@ class BasePromptBuilder(PromptTemplate): else: return path.read_text('utf-8') - def _load_refer_content(self, name: str, refer_configs: list) -> str: - """根据带采样率的配置加载Refer内容""" + def _load_refer_content(self, name: str, refer_configs: list, step: str = "") -> str: + """ + 根据带采样率的配置加载Refer内容 + + Args: + name: 资源名称 + refer_configs: Refer配置列表 + step: 当前阶段,用于过滤引用内容 + """ if not refer_configs: return f"{name}:\n无" content_parts = [f"{name}:"] - for ref_item in refer_configs: + + # 根据step过滤引用内容 + filtered_configs = refer_configs + if step: + filtered_configs = [ + item for item in refer_configs + if not item.step or item.step == step # 如果step为空或与当前阶段匹配 + ] + + if not filtered_configs: + return f"{name}:\n无 (当前阶段: {step})" + + logger.info(f"阶段 '{step}' 过滤后剩余 {len(filtered_configs)}/{len(refer_configs)} 个引用项") + + # 为每次调用重新随机采样 + random.seed() + + for ref_item in filtered_configs: try: path_str = ref_item.path sampling_rate = ref_item.sampling_rate @@ -167,6 +191,9 @@ class BasePromptBuilder(PromptTemplate): if full_path.is_file(): if random.random() < sampling_rate: files_to_read.append(full_path) + logger.info(f"文件 '{path_str}' 采样成功 (采样率: {sampling_rate})") + else: + logger.info(f"文件 '{path_str}' 采样失败 (采样率: {sampling_rate})") elif full_path.is_dir(): all_files = sorted(p for p in full_path.iterdir() if p.is_file()) if sampling_rate < 1.0: @@ -190,17 +217,36 @@ class BasePromptBuilder(PromptTemplate): if not self.resource_config.resource_dirs: return "文件未找到" base_path = Path(self.resource_config.resource_dirs[0]) + + # 获取不带后缀的文件名,用于模糊匹配 + filename_base = Path(filename_to_find).stem + for p_str in search_paths: search_path = Path(p_str) if not search_path.is_absolute(): search_path = base_path / search_path if search_path.is_dir(): + # 精确匹配 potential_path = search_path / filename_to_find if potential_path.is_file(): return potential_path.read_text('utf-8') - elif search_path.is_file() and search_path.name == filename_to_find: - return search_path.read_text('utf-8') + + # 基于文件名(不含后缀)的模糊匹配 + for file_path in search_path.iterdir(): + if file_path.is_file() and file_path.stem == filename_base: + logger.info(f"通过基础名称匹配找到文件: {filename_to_find} -> {file_path.name}") + return file_path.read_text('utf-8') + + elif search_path.is_file(): + # 精确匹配 + if search_path.name == filename_to_find: + return search_path.read_text('utf-8') + # 基于文件名(不含后缀)的模糊匹配 + if search_path.stem == filename_base: + logger.info(f"通过基础名称匹配找到文件: {filename_to_find} -> {search_path.name}") + return search_path.read_text('utf-8') + logger.warning(f"在路径 {search_paths} 中未能找到文件: {filename_to_find}") return None @@ -219,7 +265,7 @@ class TopicPromptBuilder(BasePromptBuilder): # 加载并格式化所有需要的资源 self.style_content = self._load_resource_as_list("Style文件列表", self.resource_config.style.paths) self.demand_content = self._load_resource_as_list("Demand文件列表", self.resource_config.demand.paths) - self.refer_content = self._load_refer_content("Refer信息", self.resource_config.refer.refer_list) + self.refer_content = self._load_refer_content("Refer信息", self.resource_config.refer.refer_list, step="topic") self.object_content = self._load_resource_as_content("Object信息", self.resource_config.object.paths) self.product_content = self._load_resource_as_content("Product信息", self.resource_config.product.paths) @@ -251,12 +297,14 @@ class ContentPromptBuilder(BasePromptBuilder): user_prompt_path=self.content_config.content_user_prompt ) - # 预加载静态的Product和Refer内容 + # 预加载静态的Product内容 self.product_content = self._load_resource_as_content("Product信息", self.resource_config.product.paths) - self.refer_content = self._load_refer_content("Refer信息", self.resource_config.refer.refer_list) - + def build_user_prompt(self, topic: Dict[str, Any]) -> str: """根据topic构建完整的用户提示词""" + # 每次构建提示词时重新加载Refer内容,确保随机性 + refer_content = self._load_refer_content("Refer信息", self.resource_config.refer.refer_list, step="content") + style_filename = topic.get("style", "") style_content = self._find_and_read_file(style_filename, self.resource_config.style.paths) or "通用风格" @@ -283,7 +331,7 @@ class ContentPromptBuilder(BasePromptBuilder): style_content=f"{style_filename}\n{style_content}", demand_content=f"{demand_filename}\n{demand_content}", object_content=f"{object_name}\n{object_content}", - refer_content=self.refer_content, + refer_content=refer_content, product_content=self.product_content, ) @@ -303,6 +351,9 @@ class JudgerPromptBuilder(BasePromptBuilder): def build_user_prompt(self, generated_content: str, topic: Dict[str, Any]) -> str: """构建审核内容的用户提示词""" + # 每次构建提示词时重新加载Refer内容,确保随机性 + refer_content = self._load_refer_content("Refer信息", self.resource_config.refer.refer_list, step="judge") + if isinstance(generated_content, dict): tweet_content = json.dumps(generated_content, ensure_ascii=False, indent=4) else: @@ -327,5 +378,6 @@ class JudgerPromptBuilder(BasePromptBuilder): return super().build_user_prompt( tweet_content=tweet_content, object_content=object_content, - product_content=self.product_content + product_content=self.product_content, + refer_content=refer_content ) \ No newline at end of file diff --git a/utils/tweet/__pycache__/content_judger.cpython-312.pyc b/utils/tweet/__pycache__/content_judger.cpython-312.pyc index f7dc6e1..d4174eb 100644 Binary files a/utils/tweet/__pycache__/content_judger.cpython-312.pyc and b/utils/tweet/__pycache__/content_judger.cpython-312.pyc differ diff --git a/utils/tweet/content_judger.py b/utils/tweet/content_judger.py index 734a31f..40d0869 100644 --- a/utils/tweet/content_judger.py +++ b/utils/tweet/content_judger.py @@ -20,17 +20,19 @@ logger = logging.getLogger(__name__) class ContentJudger: """内容审核类,使用AI评估和修正内容""" - def __init__(self, ai_agent: AIAgent, config_manager: ConfigManager): + def __init__(self, ai_agent: AIAgent, config_manager: ConfigManager, output_manager=None): """ 初始化内容审核器 Args: ai_agent: AIAgent实例 config_manager: 配置管理器 + output_manager: 输出管理器,用于保存提示词和响应 """ self.ai_agent = ai_agent self.config: GenerateTopicConfig = config_manager.get_config('topic_gen', GenerateTopicConfig) self.prompt_builder = JudgerPromptBuilder(config_manager) + self.output_manager = output_manager async def judge_content(self, generated_content: str, topic: Dict[str, Any]) -> Dict[str, Any]: """ @@ -45,12 +47,21 @@ class ContentJudger: """ logger.info("开始审核生成的内容...") + # 获取主题索引,用于保存文件 + topic_index = topic.get('index', 'unknown') + topic_dir = f"topic_{topic_index}" + # 1. 构建提示 system_prompt = self.prompt_builder.get_system_prompt() user_prompt = self.prompt_builder.build_user_prompt( generated_content=generated_content, topic=topic ) + + # 保存提示词 + if self.output_manager: + self.output_manager.save_text(system_prompt, f"{topic_dir}/judger_system_prompt.txt") + self.output_manager.save_text(user_prompt, f"{topic_dir}/judger_user_prompt.txt") # 2. 调用AI进行审核 try: @@ -59,6 +70,11 @@ class ContentJudger: user_prompt=user_prompt, use_stream=False ) + + # 保存原始响应 + if self.output_manager: + self.output_manager.save_text(raw_result, f"{topic_dir}/judger_raw_response.txt") + except Exception as e: logger.critical(f"内容审核时AI调用失败: {e}", exc_info=True) return {"judge_success": False, "error": str(e)} @@ -69,6 +85,11 @@ class ContentJudger: if isinstance(judged_data, dict) and "title" in judged_data and "content" in judged_data: judged_data["judge_success"] = True logger.info("内容审核成功完成。") + + # 保存审核后的内容 + if self.output_manager: + self.output_manager.save_json(judged_data, f"{topic_dir}/article_judged.json") + return judged_data else: logger.warning(f"审核响应JSON格式不正确或缺少键: {judged_data}")