Compare commits
3 Commits
d4d23068e5
...
8326485d8a
| Author | SHA1 | Date | |
|---|---|---|---|
| 8326485d8a | |||
| a7cd96ecb8 | |||
| 44c57349f5 |
230
README.md
Normal file
230
README.md
Normal file
@ -0,0 +1,230 @@
|
||||
# 旅游内容自动生成系统
|
||||
|
||||
## 系统概述
|
||||
|
||||
旅游内容自动生成系统是一个基于AI的内容创作平台,专注于为旅游景点和产品生成营销内容。系统采用三阶段生成流程:选题生成、内容创作和内容审核,每个阶段都由专门的AI模型处理,并通过配置文件进行精细控制。
|
||||
|
||||
## 系统架构
|
||||
|
||||
系统由以下主要模块组成:
|
||||
|
||||
### 核心模块 (core)
|
||||
- **config**: 配置管理,负责加载和管理各种配置
|
||||
- **ai**: AI代理,处理与大模型的交互
|
||||
- **exception**: 异常处理
|
||||
|
||||
### 工具模块 (utils)
|
||||
- **file_io**: 文件输入输出,包括ResourceLoader和OutputManager
|
||||
- **prompts**: 提示词模板和构建器
|
||||
- **pipeline**: 流程管理
|
||||
- **tweet**: 内容生成相关模块,包括topic_generator、content_generator、content_judger
|
||||
|
||||
## 功能模块
|
||||
|
||||
### 1. 选题生成 (TopicGenerator)
|
||||
|
||||
根据指定月份和节日生成旅游营销选题,考虑目标受众、营销风格和产品特性,输出标准化JSON格式的选题信息。
|
||||
|
||||
**主要功能**:
|
||||
- 基于时间节点生成选题
|
||||
- 考虑产品特性和目标受众
|
||||
- 输出结构化选题数据
|
||||
|
||||
### 2. 内容创作 (ContentGenerator)
|
||||
|
||||
基于选题生成小红书风格的营销文案,包含吸引人的标题、详细正文和SEO优化的标签,遵循特定的文案风格和目标受众需求。
|
||||
|
||||
**主要功能**:
|
||||
- 生成符合平台特性的标题
|
||||
- 创建详细、有吸引力的正文
|
||||
- 生成优化的标签
|
||||
|
||||
### 3. 内容审核 (ContentJudger)
|
||||
|
||||
审核生成内容是否符合产品资料,检查价格、活动、服务等关键信息的准确性,保留原始内容中的标签和引流语句。
|
||||
|
||||
**主要功能**:
|
||||
- 检查内容准确性
|
||||
- 修正不符合产品资料的内容
|
||||
- 保留原始内容中的关键元素
|
||||
|
||||
## 配置说明
|
||||
|
||||
系统通过JSON配置文件管理各组件参数:
|
||||
|
||||
### 系统配置 (system.json)
|
||||
```json
|
||||
{
|
||||
"debug": false,
|
||||
"log_level": "INFO",
|
||||
"parallel_processing": false,
|
||||
"max_workers": 4
|
||||
}
|
||||
```
|
||||
|
||||
### AI模型配置 (ai_model.json)
|
||||
```json
|
||||
{
|
||||
"model": "qwen-plus",
|
||||
"api_url": "https://dashscope.aliyuncs.com/compatible-mode/v1",
|
||||
"api_key": "your_api_key",
|
||||
"temperature": 0.3,
|
||||
"top_p": 0.4,
|
||||
"presence_penalty": 1.2,
|
||||
"timeout": 120,
|
||||
"max_retries": 3
|
||||
}
|
||||
```
|
||||
|
||||
### 资源配置 (resource.json)
|
||||
```json
|
||||
{
|
||||
"resource_dirs": ["."],
|
||||
"style": {
|
||||
"paths": ["resource/prompt/Style/攻略风文案提示词.md", "..."]
|
||||
},
|
||||
"demand": {
|
||||
"paths": ["resource/prompt/Demand/亲子向文旅需求.md", "..."]
|
||||
},
|
||||
"refer": {
|
||||
"refer_list": [
|
||||
{ "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.5, "step": "content" }
|
||||
]
|
||||
},
|
||||
"object": {
|
||||
"paths": ["resource/data/Object/天津冒险湾.txt"]
|
||||
},
|
||||
"product": {
|
||||
"paths": ["resource/data/Product/天津冒险湾-2大2小套票.txt"]
|
||||
},
|
||||
"output_dir": {
|
||||
"base_dir": "result"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 选题生成配置 (topic_gen.json)
|
||||
```json
|
||||
{
|
||||
"topic_system_prompt": "resource/prompt/generateTopics/system.txt",
|
||||
"topic_user_prompt": "resource/prompt/generateTopics/user.txt",
|
||||
"model": {
|
||||
"temperature": 0.2,
|
||||
"top_p": 0.3,
|
||||
"presence_penalty": 1.5
|
||||
},
|
||||
"topic": {
|
||||
"date": "2024-07-20",
|
||||
"num": 5,
|
||||
"variants": 1
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 内容生成配置 (content_gen.json)
|
||||
```json
|
||||
{
|
||||
"content_system_prompt": "resource/prompt/generateContent/system.txt",
|
||||
"content_user_prompt": "resource/prompt/generateContent/user.txt",
|
||||
"judger_system_prompt": "resource/prompt/judgeContent/system.txt",
|
||||
"judger_user_prompt": "resource/prompt/judgeContent/user.txt",
|
||||
"enable_content_judge": true,
|
||||
"model": {
|
||||
"temperature": 0.3,
|
||||
"top_p": 0.5,
|
||||
"presence_penalty": 1.2
|
||||
},
|
||||
"judger_model": {
|
||||
"temperature": 0.2,
|
||||
"top_p": 0.3,
|
||||
"presence_penalty": 0.8
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 使用指南
|
||||
|
||||
### 安装依赖
|
||||
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
### 运行系统
|
||||
|
||||
```bash
|
||||
python main.py --config_dir config --run_id custom_run_id
|
||||
```
|
||||
|
||||
参数说明:
|
||||
- `--config_dir`: 配置文件目录路径,默认为 "config"
|
||||
- `--run_id`: 运行ID,用于标识本次运行,默认为时间戳格式
|
||||
|
||||
### 输出结果
|
||||
|
||||
系统运行后,会在 `result/{run_id}` 目录下生成以下文件:
|
||||
- `topics_generated.json`: 生成的选题列表
|
||||
- `topics_generated.txt`: 人类可读的选题列表
|
||||
- 每个选题的子目录 `topic_{index}`:
|
||||
- `content_system_prompt.txt`: 内容生成的系统提示
|
||||
- `content_user_prompt.txt`: 内容生成的用户提示
|
||||
- `content_raw_response.txt`: AI返回的原始响应
|
||||
- `article.json`: 生成的文章内容
|
||||
- `judger_system_prompt.txt`: 审核的系统提示
|
||||
- `judger_user_prompt.txt`: 审核的用户提示
|
||||
- `judger_raw_response.txt`: 审核的原始响应
|
||||
- `article_judged.json`: 审核后的文章内容
|
||||
|
||||
## 系统特性
|
||||
|
||||
1. **资源加载增强**:
|
||||
- 支持基于文件名(不含后缀)的模糊匹配
|
||||
- 对JSON文件内容的直接采样
|
||||
|
||||
2. **引用内容的阶段控制**:
|
||||
- 通过step字段控制在不同阶段(topic/content/judge)使用哪些引用资源
|
||||
- 通过采样率控制参考内容的使用量
|
||||
|
||||
3. **模型参数独立配置**:
|
||||
- 为不同生成阶段配置独立的模型参数
|
||||
- 提高各阶段生成内容的质量和多样性
|
||||
|
||||
4. **内容审核系统**:
|
||||
- 保留原始内容中的tags标签
|
||||
- 对价格、活动等关键信息进行审核
|
||||
|
||||
5. **文件IO系统**:
|
||||
- 灵活的资源加载和输出管理
|
||||
- 结构化的文件组织方式
|
||||
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
.
|
||||
├── main.py # 主程序入口
|
||||
├── config/ # 配置文件目录
|
||||
│ ├── ai_model.json # AI模型配置
|
||||
│ ├── content_gen.json # 内容生成配置
|
||||
│ ├── resource.json # 资源配置
|
||||
│ ├── system.json # 系统配置
|
||||
│ └── topic_gen.json # 选题生成配置
|
||||
├── core/ # 核心模块
|
||||
│ ├── ai/ # AI代理
|
||||
│ ├── config/ # 配置管理
|
||||
│ └── exception/ # 异常处理
|
||||
├── utils/ # 工具模块
|
||||
│ ├── file_io.py # 文件IO
|
||||
│ ├── pipeline.py # 流程管理
|
||||
│ ├── prompts.py # 提示词构建
|
||||
│ └── tweet/ # 内容生成相关
|
||||
│ ├── content_generator.py # 内容生成器
|
||||
│ ├── content_judger.py # 内容审核器
|
||||
│ └── topic_generator.py # 选题生成器
|
||||
├── resource/ # 资源文件
|
||||
│ ├── data/ # 数据文件
|
||||
│ └── prompt/ # 提示词模板
|
||||
├── result/ # 输出结果
|
||||
└── requirements.txt # 依赖包
|
||||
```
|
||||
Binary file not shown.
@ -26,7 +26,7 @@ class ConfigManager:
|
||||
统一配置管理器
|
||||
负责加载、管理和访问所有配置
|
||||
"""
|
||||
|
||||
|
||||
def __init__(self):
|
||||
self._configs: Dict[str, BaseConfig] = {}
|
||||
self.config_dir: Optional[Path] = None
|
||||
@ -41,7 +41,7 @@ class ConfigManager:
|
||||
def load_from_directory(self, config_dir: str):
|
||||
"""
|
||||
从目录加载配置
|
||||
|
||||
|
||||
Args:
|
||||
config_dir: 配置文件目录
|
||||
"""
|
||||
@ -49,7 +49,7 @@ class ConfigManager:
|
||||
if not self.config_dir.is_dir():
|
||||
logger.error(f"配置目录不存在: {config_dir}")
|
||||
raise FileNotFoundError(f"配置目录不存在: {config_dir}")
|
||||
|
||||
|
||||
# 注册所有已知的配置类型
|
||||
self._register_configs()
|
||||
|
||||
@ -109,7 +109,7 @@ class ConfigManager:
|
||||
self._load_main_config(main_config_path)
|
||||
else:
|
||||
logger.warning(f"旧的主配置文件不存在: {main_config_path}")
|
||||
|
||||
|
||||
# 2. 遍历并加载目录中所有其他的 .json 文件
|
||||
for config_path in self.config_dir.glob('*.json'):
|
||||
if config_path.name == 'poster_gen_config.json':
|
||||
@ -126,11 +126,11 @@ class ConfigManager:
|
||||
|
||||
# 3. 最后应用环境变量覆盖
|
||||
self._apply_env_overrides()
|
||||
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"从目录 '{self.config_dir}' 加载配置失败: {e}", exc_info=True)
|
||||
raise
|
||||
|
||||
|
||||
def _load_main_config(self, path: Path):
|
||||
"""加载主配置文件,并分发到各个配置对象"""
|
||||
logger.info(f"加载主配置文件: {path}")
|
||||
@ -143,7 +143,7 @@ class ConfigManager:
|
||||
config_obj.update(config_data[name])
|
||||
else: # 尝试从根部更新 (扁平结构)
|
||||
config_obj.update(config_data)
|
||||
|
||||
|
||||
def _apply_env_overrides(self):
|
||||
"""应用环境变量覆盖"""
|
||||
logger.info("应用环境变量覆盖...")
|
||||
@ -164,7 +164,7 @@ class ConfigManager:
|
||||
if update_data:
|
||||
ai_model_config.update(update_data)
|
||||
logger.info(f"通过环境变量更新了AI模型配置: {list(update_data.keys())}")
|
||||
|
||||
|
||||
def save_config(self, name: str):
|
||||
"""
|
||||
保存指定的配置到文件
|
||||
|
||||
309
docs/使用指南.md
Normal file
309
docs/使用指南.md
Normal file
@ -0,0 +1,309 @@
|
||||
# 旅游内容自动生成系统 - 使用指南
|
||||
|
||||
## 1. 系统概述
|
||||
|
||||
旅游内容自动生成系统是一个基于AI的内容创作平台,专注于为旅游景点和产品生成营销内容。系统采用三阶段生成流程:选题生成、内容创作和内容审核,每个阶段都由专门的AI模型处理,并通过配置文件进行精细控制。
|
||||
|
||||
## 2. 环境准备
|
||||
|
||||
### 系统要求
|
||||
- Python 3.8+
|
||||
- 足够的内存(推荐8GB以上)
|
||||
- 互联网连接(用于API调用)
|
||||
|
||||
### 安装依赖
|
||||
```bash
|
||||
# 克隆仓库
|
||||
git clone [仓库地址]
|
||||
cd [仓库名称]
|
||||
|
||||
# 安装依赖包
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
## 3. 配置系统
|
||||
|
||||
系统通过JSON配置文件进行控制,所有配置文件位于`config`目录下:
|
||||
|
||||
### 3.1 AI模型配置 (ai_model.json)
|
||||
|
||||
```json
|
||||
{
|
||||
"model": "qwen-plus", // 使用的模型名称
|
||||
"api_url": "https://dashscope.aliyuncs.com/compatible-mode/v1", // API地址
|
||||
"api_key": "your_api_key", // 替换为您的API密钥
|
||||
"temperature": 0.3, // 生成多样性控制
|
||||
"top_p": 0.4, // 采样控制
|
||||
"presence_penalty": 1.2, // 重复惩罚
|
||||
"timeout": 120, // API超时时间(秒)
|
||||
"max_retries": 3 // 最大重试次数
|
||||
}
|
||||
```
|
||||
|
||||
> **重要提示**: 请替换`your_api_key`为您的实际API密钥。
|
||||
|
||||
### 3.2 选题生成配置 (topic_gen.json)
|
||||
|
||||
```json
|
||||
{
|
||||
"topic_system_prompt": "resource/prompt/generateTopics/system.txt", // 系统提示路径
|
||||
"topic_user_prompt": "resource/prompt/generateTopics/user.txt", // 用户提示路径
|
||||
"model": {
|
||||
"temperature": 0.2, // 选题生成的温度参数
|
||||
"top_p": 0.3, // 选题生成的top_p参数
|
||||
"presence_penalty": 1.5 // 选题生成的重复惩罚参数
|
||||
},
|
||||
"topic": {
|
||||
"date": "2024-07-20", // 选题目标日期
|
||||
"num": 5, // 生成选题数量
|
||||
"variants": 1 // 每个选题的变体数量
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3.3 内容生成配置 (content_gen.json)
|
||||
|
||||
```json
|
||||
{
|
||||
"content_system_prompt": "resource/prompt/generateContent/system.txt", // 内容生成系统提示
|
||||
"content_user_prompt": "resource/prompt/generateContent/user.txt", // 内容生成用户提示
|
||||
"judger_system_prompt": "resource/prompt/judgeContent/system.txt", // 审核系统提示
|
||||
"judger_user_prompt": "resource/prompt/judgeContent/user.txt", // 审核用户提示
|
||||
"enable_content_judge": true, // 是否启用内容审核
|
||||
"model": {
|
||||
"temperature": 0.3, // 内容生成温度参数
|
||||
"top_p": 0.5, // 内容生成top_p参数
|
||||
"presence_penalty": 1.2 // 内容生成重复惩罚参数
|
||||
},
|
||||
"judger_model": {
|
||||
"temperature": 0.2, // 内容审核温度参数
|
||||
"top_p": 0.3, // 内容审核top_p参数
|
||||
"presence_penalty": 0.8 // 内容审核重复惩罚参数
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3.4 资源配置 (resource.json)
|
||||
|
||||
```json
|
||||
{
|
||||
"resource_dirs": ["."], // 资源基础目录
|
||||
"style": {
|
||||
"paths": [ // 文案风格文件路径
|
||||
"resource/prompt/Style/攻略风文案提示词.md",
|
||||
"resource/prompt/Style/极力推荐风文案提示词.md"
|
||||
]
|
||||
},
|
||||
"demand": {
|
||||
"paths": [ // 用户需求文件路径
|
||||
"resource/prompt/Demand/亲子向文旅需求.md",
|
||||
"resource/prompt/Demand/周边游文旅需求.md"
|
||||
]
|
||||
},
|
||||
"refer": {
|
||||
"refer_list": [ // 参考资料配置
|
||||
{
|
||||
"path": "resource/prompt/Refer/2025各月节日宣传节点时间表.md",
|
||||
"sampling_rate": 1, // 采样率,1表示100%使用
|
||||
"step": "topic" // 使用阶段:topic/content/judge
|
||||
},
|
||||
{
|
||||
"path": "resource/prompt/Refer/标题参考格式.json",
|
||||
"sampling_rate": 0.25,
|
||||
"step": "content"
|
||||
},
|
||||
{
|
||||
"path": "resource/prompt/Refer/正文范文参考.json",
|
||||
"sampling_rate": 0.5,
|
||||
"step": "content"
|
||||
}
|
||||
]
|
||||
},
|
||||
"object": {
|
||||
"paths": [ // 景点对象文件路径
|
||||
"resource/data/Object/天津冒险湾.txt"
|
||||
]
|
||||
},
|
||||
"product": {
|
||||
"paths": [ // 产品信息文件路径
|
||||
"resource/data/Product/天津冒险湾-2大2小套票.txt"
|
||||
]
|
||||
},
|
||||
"output_dir": {
|
||||
"base_dir": "result" // 输出目录
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3.5 系统配置 (system.json)
|
||||
|
||||
```json
|
||||
{
|
||||
"debug": false, // 是否开启调试模式
|
||||
"log_level": "INFO", // 日志级别
|
||||
"parallel_processing": false, // 是否启用并行处理
|
||||
"max_workers": 4 // 最大工作线程数
|
||||
}
|
||||
```
|
||||
|
||||
## 4. 运行系统
|
||||
|
||||
### 4.1 基本运行命令
|
||||
|
||||
```bash
|
||||
python main.py
|
||||
```
|
||||
|
||||
这将使用默认配置运行系统。
|
||||
|
||||
### 4.2 自定义运行参数
|
||||
|
||||
```bash
|
||||
python main.py --config_dir custom_config --run_id my_run_20240601
|
||||
```
|
||||
|
||||
参数说明:
|
||||
- `--config_dir`: 配置文件目录路径,默认为 "config"
|
||||
- `--run_id`: 运行ID,用于标识本次运行,默认为时间戳格式
|
||||
|
||||
## 5. 输出结果
|
||||
|
||||
系统运行后,会在 `result/{run_id}` 目录下生成以下文件:
|
||||
|
||||
- `topics_generated.json`: 生成的选题列表(JSON格式)
|
||||
- `topics_generated.txt`: 人类可读的选题列表(文本格式)
|
||||
- 每个选题的子目录 `topic_{index}`:
|
||||
- `content_system_prompt.txt`: 内容生成的系统提示
|
||||
- `content_user_prompt.txt`: 内容生成的用户提示
|
||||
- `content_raw_response.txt`: AI返回的原始响应
|
||||
- `article.json`: 生成的文章内容
|
||||
- `judger_system_prompt.txt`: 审核的系统提示(如果启用审核)
|
||||
- `judger_user_prompt.txt`: 审核的用户提示(如果启用审核)
|
||||
- `judger_raw_response.txt`: 审核的原始响应(如果启用审核)
|
||||
- `article_judged.json`: 审核后的文章内容(如果启用审核)
|
||||
|
||||
## 6. 资源文件准备
|
||||
|
||||
### 6.1 提示词模板
|
||||
|
||||
系统使用以下提示词模板:
|
||||
|
||||
- **选题生成**:
|
||||
- `resource/prompt/generateTopics/system.txt`: 选题生成系统提示
|
||||
- `resource/prompt/generateTopics/user.txt`: 选题生成用户提示
|
||||
|
||||
- **内容生成**:
|
||||
- `resource/prompt/generateContent/system.txt`: 内容生成系统提示
|
||||
- `resource/prompt/generateContent/user.txt`: 内容生成用户提示
|
||||
|
||||
- **内容审核**:
|
||||
- `resource/prompt/judgeContent/system.txt`: 内容审核系统提示
|
||||
- `resource/prompt/judgeContent/user.txt`: 内容审核用户提示
|
||||
|
||||
### 6.2 风格和需求文件
|
||||
|
||||
- **风格文件** (`resource/prompt/Style/`):
|
||||
- 每个文件描述一种文案风格
|
||||
- 例如:`攻略风文案提示词.md`, `极力推荐风文案提示词.md`
|
||||
|
||||
- **需求文件** (`resource/prompt/Demand/`):
|
||||
- 每个文件描述一种用户需求
|
||||
- 例如:`亲子向文旅需求.md`, `周边游文旅需求.md`
|
||||
|
||||
### 6.3 参考资料文件
|
||||
|
||||
- **参考资料** (`resource/prompt/Refer/`):
|
||||
- 节日时间表:`2025各月节日宣传节点时间表.md`
|
||||
- 标题参考:`标题参考格式.json`
|
||||
- 正文参考:`正文范文参考.json`
|
||||
|
||||
### 6.4 产品和景点数据
|
||||
|
||||
- **景点数据** (`resource/data/Object/`):
|
||||
- 每个文件包含一个景点的详细信息
|
||||
- 例如:`天津冒险湾.txt`
|
||||
|
||||
- **产品数据** (`resource/data/Product/`):
|
||||
- 每个文件包含一个产品的详细信息
|
||||
- 例如:`天津冒险湾-2大2小套票.txt`
|
||||
|
||||
## 7. 常见问题解答
|
||||
|
||||
### 7.1 系统运行失败
|
||||
|
||||
**问题**: 系统运行时出现错误或无法生成内容。
|
||||
|
||||
**解决方案**:
|
||||
1. 检查API密钥是否正确配置
|
||||
2. 检查网络连接是否正常
|
||||
3. 查看日志输出,定位具体错误
|
||||
4. 确保所有资源文件路径正确且文件存在
|
||||
|
||||
### 7.2 生成内容质量不佳
|
||||
|
||||
**问题**: 生成的内容质量不符合预期。
|
||||
|
||||
**解决方案**:
|
||||
1. 调整模型参数(temperature、top_p、presence_penalty)
|
||||
2. 改进提示词模板
|
||||
3. 提供更高质量的参考资料
|
||||
4. 确保产品和景点信息详尽准确
|
||||
|
||||
### 7.3 审核功能不生效
|
||||
|
||||
**问题**: 内容审核功能似乎没有生效。
|
||||
|
||||
**解决方案**:
|
||||
1. 检查`content_gen.json`中的`enable_content_judge`是否设为`true`
|
||||
2. 确保审核提示词模板存在且路径正确
|
||||
3. 检查日志中是否有审核相关的错误信息
|
||||
|
||||
### 7.4 如何添加新的景点或产品
|
||||
|
||||
**步骤**:
|
||||
1. 在`resource/data/Object/`目录下创建新的景点文件
|
||||
2. 在`resource/data/Product/`目录下创建新的产品文件
|
||||
3. 更新`resource.json`中的`object.paths`和`product.paths`数组
|
||||
4. 重新运行系统
|
||||
|
||||
### 7.5 如何自定义生成内容的风格
|
||||
|
||||
**步骤**:
|
||||
1. 在`resource/prompt/Style/`目录下创建新的风格文件
|
||||
2. 更新`resource.json`中的`style.paths`数组
|
||||
3. 在选题生成时,系统会自动考虑新添加的风格
|
||||
|
||||
## 8. 高级使用技巧
|
||||
|
||||
### 8.1 调整模型参数
|
||||
|
||||
不同的内容类型可能需要不同的模型参数:
|
||||
- 高`temperature`(0.7-1.0):更有创意但可能不够精确
|
||||
- 低`temperature`(0.1-0.3):更精确但可能缺乏创意
|
||||
- 高`presence_penalty`:减少重复内容
|
||||
- 低`top_p`:更保守的输出
|
||||
|
||||
### 8.2 参考内容采样率调整
|
||||
|
||||
通过调整`sampling_rate`参数,可以控制参考内容的使用量:
|
||||
- `1.0`:全部使用
|
||||
- `0.5`:使用约50%
|
||||
- `0.25`:使用约25%
|
||||
|
||||
### 8.3 自定义提示词模板
|
||||
|
||||
可以根据需要修改提示词模板,但请确保:
|
||||
1. 保持JSON输出格式一致
|
||||
2. 不要改变关键指令
|
||||
3. 测试修改后的效果
|
||||
|
||||
### 8.4 批量生成内容
|
||||
|
||||
对于需要批量生成内容的场景,可以:
|
||||
1. 准备多个景点和产品数据
|
||||
2. 编写脚本循环调用主程序
|
||||
3. 为每次运行指定不同的`run_id`
|
||||
|
||||
## 9. 联系与支持
|
||||
|
||||
如有问题或需要支持,请联系系统管理员或开发团队。
|
||||
486
docs/开发指南.md
Normal file
486
docs/开发指南.md
Normal file
@ -0,0 +1,486 @@
|
||||
# 旅游内容自动生成系统 - 开发指南
|
||||
|
||||
## 1. 系统架构
|
||||
|
||||
旅游内容自动生成系统采用模块化架构设计,主要分为核心模块(core)和工具模块(utils)两大部分。系统通过Pipeline模式协调各个组件的工作,实现从选题生成到内容审核的完整流程。
|
||||
|
||||
### 1.1 架构图
|
||||
|
||||
```
|
||||
┌─────────────┐
|
||||
│ 主程序 │
|
||||
│ main.py │
|
||||
└──────┬──────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ PipelineManager │
|
||||
└───────┬───────────────────┬──────────────────┬──────────────┘
|
||||
│ │ │
|
||||
▼ ▼ ▼
|
||||
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
|
||||
│ TopicGenerator │ │ContentGenerator│ │ ContentJudger │
|
||||
└───────┬───────┘ └───────┬───────┘ └───────┬───────┘
|
||||
│ │ │
|
||||
│ │ │
|
||||
▼ ▼ ▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ AIAgent │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
▲ ▲ ▲
|
||||
│ │ │
|
||||
│ │ │
|
||||
┌───────┴───────┐ ┌───────┴───────┐ ┌──────┴────────┐
|
||||
│PromptBuilders │ │ ResourceLoader│ │ OutputManager │
|
||||
└───────────────┘ └───────────────┘ └───────────────┘
|
||||
```
|
||||
|
||||
### 1.2 数据流
|
||||
|
||||
1. 配置加载: 系统启动时,ConfigManager加载所有配置文件
|
||||
2. 选题生成: TopicGenerator调用AIAgent生成选题
|
||||
3. 内容生成: ContentGenerator为每个选题调用AIAgent生成内容
|
||||
4. 内容审核: ContentJudger审核生成的内容
|
||||
5. 结果保存: OutputManager保存所有生成的内容和中间产物
|
||||
|
||||
## 2. 代码结构
|
||||
|
||||
### 2.1 目录结构
|
||||
|
||||
```
|
||||
.
|
||||
├── main.py # 主程序入口
|
||||
├── config/ # 配置文件目录
|
||||
│ ├── ai_model.json # AI模型配置
|
||||
│ ├── content_gen.json # 内容生成配置
|
||||
│ ├── resource.json # 资源配置
|
||||
│ ├── system.json # 系统配置
|
||||
│ └── topic_gen.json # 选题生成配置
|
||||
├── core/ # 核心模块
|
||||
│ ├── ai/ # AI代理
|
||||
│ │ ├── __init__.py
|
||||
│ │ └── ai_agent.py # AI代理实现
|
||||
│ ├── config/ # 配置管理
|
||||
│ │ ├── __init__.py
|
||||
│ │ └── config_manager.py # 配置管理器
|
||||
│ └── exception/ # 异常处理
|
||||
│ ├── __init__.py
|
||||
│ └── exceptions.py # 自定义异常类
|
||||
├── utils/ # 工具模块
|
||||
│ ├── file_io.py # 文件IO
|
||||
│ ├── pipeline.py # 流程管理
|
||||
│ ├── prompts.py # 提示词构建
|
||||
│ └── tweet/ # 内容生成相关
|
||||
│ ├── __init__.py
|
||||
│ ├── content_generator.py # 内容生成器
|
||||
│ ├── content_judger.py # 内容审核器
|
||||
│ ├── topic_generator.py # 选题生成器
|
||||
│ └── topic_parser.py # 选题解析器
|
||||
├── resource/ # 资源文件
|
||||
│ ├── data/ # 数据文件
|
||||
│ └── prompt/ # 提示词模板
|
||||
├── result/ # 输出结果
|
||||
└── requirements.txt # 依赖包
|
||||
```
|
||||
|
||||
### 2.2 主要模块说明
|
||||
|
||||
#### 2.2.1 核心模块 (core)
|
||||
|
||||
- **ai_agent.py**: 负责与AI模型的交互,封装API调用逻辑
|
||||
- **config_manager.py**: 负责加载和管理配置文件
|
||||
- **exceptions.py**: 定义系统自定义异常类
|
||||
|
||||
#### 2.2.2 工具模块 (utils)
|
||||
|
||||
- **file_io.py**: 提供文件读写功能,包括ResourceLoader和OutputManager
|
||||
- **pipeline.py**: 实现整个生成流程的管理
|
||||
- **prompts.py**: 提供提示词模板和构建功能
|
||||
- **tweet/**: 内容生成相关的具体实现
|
||||
- **topic_generator.py**: 选题生成器
|
||||
- **content_generator.py**: 内容生成器
|
||||
- **content_judger.py**: 内容审核器
|
||||
- **topic_parser.py**: 选题解析器
|
||||
|
||||
## 3. 核心类说明
|
||||
|
||||
### 3.1 AIAgent 类
|
||||
|
||||
`AIAgent` 类是系统与AI模型交互的核心,负责发送请求并处理响应。
|
||||
|
||||
```python
|
||||
class AIAgent:
|
||||
def __init__(self, config: AIModelConfig):
|
||||
# 初始化AI代理,设置API客户端
|
||||
|
||||
async def generate_text(
|
||||
self, system_prompt: str, user_prompt: str, use_stream: bool = False,
|
||||
temperature: Optional[float] = None, top_p: Optional[float] = None,
|
||||
presence_penalty: Optional[float] = None, stage: str = ""
|
||||
) -> Tuple[str, int, int, float]:
|
||||
# 生成文本,支持流式和非流式输出
|
||||
# 返回: (生成文本, 输入token数, 输出token数, 耗时)
|
||||
```
|
||||
|
||||
### 3.2 ConfigManager 类
|
||||
|
||||
`ConfigManager` 类负责加载和管理配置文件。
|
||||
|
||||
```python
|
||||
class ConfigManager:
|
||||
def __init__(self):
|
||||
# 初始化配置管理器
|
||||
|
||||
def load_from_directory(self, config_dir: str):
|
||||
# 从目录加载所有配置文件
|
||||
|
||||
def get_config(self, config_name: str, config_class: Type[T]) -> T:
|
||||
# 获取指定名称的配置对象
|
||||
```
|
||||
|
||||
### 3.3 PipelineManager 类
|
||||
|
||||
`PipelineManager` 类负责协调整个内容生成流程。
|
||||
|
||||
```python
|
||||
class PipelineManager:
|
||||
def __init__(self, config_dir: str, run_id: Optional[str] = None):
|
||||
# 初始化管道管理器
|
||||
|
||||
async def process_content_generation(self, topics: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
|
||||
# 处理内容生成
|
||||
|
||||
async def process_content_judging(self, generated_contents: List[Dict[str, Any]]):
|
||||
# 处理内容审核
|
||||
|
||||
async def run_pipeline(self):
|
||||
# 按顺序执行整个流程
|
||||
```
|
||||
|
||||
### 3.4 提示词构建器类
|
||||
|
||||
系统包含多个提示词构建器,负责构建不同阶段的提示词。
|
||||
|
||||
```python
|
||||
class BasePromptBuilder(PromptTemplate):
|
||||
# 基础提示词构建器,提供通用方法
|
||||
|
||||
class TopicPromptBuilder(BasePromptBuilder):
|
||||
# 选题生成提示词构建器
|
||||
|
||||
class ContentPromptBuilder(BasePromptBuilder):
|
||||
# 内容生成提示词构建器
|
||||
|
||||
class JudgerPromptBuilder(BasePromptBuilder):
|
||||
# 内容审核提示词构建器
|
||||
```
|
||||
|
||||
## 4. 关键流程
|
||||
|
||||
### 4.1 选题生成流程
|
||||
|
||||
1. 加载配置和资源
|
||||
2. 构建系统提示和用户提示
|
||||
3. 调用AI模型生成选题
|
||||
4. 解析AI响应,提取选题信息
|
||||
5. 保存选题结果
|
||||
|
||||
```python
|
||||
# 在TopicGenerator.generate_topics方法中实现
|
||||
async def generate_topics(self) -> Optional[List[Dict[str, Any]]]:
|
||||
# 构建提示
|
||||
system_prompt = self.prompt_builder.get_system_prompt()
|
||||
user_prompt = self.prompt_builder.build_user_prompt(...)
|
||||
|
||||
# 调用AI
|
||||
raw_result = await self.ai_agent.generate_text(...)
|
||||
|
||||
# 解析结果
|
||||
topics = self.parser.parse(raw_result)
|
||||
|
||||
# 保存结果
|
||||
self.output_manager.save_json(topics, "topics_generated.json")
|
||||
|
||||
return topics
|
||||
```
|
||||
|
||||
### 4.2 内容生成流程
|
||||
|
||||
1. 为每个选题构建提示
|
||||
2. 调用AI模型生成内容
|
||||
3. 解析AI响应,提取内容信息
|
||||
4. 保存生成的内容
|
||||
|
||||
```python
|
||||
# 在ContentGenerator.generate_content_for_topic方法中实现
|
||||
async def generate_content_for_topic(self, topic: Dict[str, Any]) -> Dict[str, Any]:
|
||||
# 构建提示
|
||||
system_prompt = self.prompt_builder.get_system_prompt()
|
||||
user_prompt = self.prompt_builder.build_user_prompt(topic=topic)
|
||||
|
||||
# 调用AI
|
||||
raw_result = await self.ai_agent.generate_text(...)
|
||||
|
||||
# 解析和保存结果
|
||||
content_data = json.loads(raw_result)
|
||||
self.output_manager.save_json(content_data, "article.json", ...)
|
||||
|
||||
return content_data
|
||||
```
|
||||
|
||||
### 4.3 内容审核流程
|
||||
|
||||
1. 为每个生成的内容构建审核提示
|
||||
2. 调用AI模型进行审核
|
||||
3. 解析审核结果,提取修改后的内容
|
||||
4. 保存审核后的内容
|
||||
|
||||
```python
|
||||
# 在ContentJudger.judge_content方法中实现
|
||||
async def judge_content(self, generated_content: str, topic: Dict[str, Any]) -> Dict[str, Any]:
|
||||
# 构建提示
|
||||
system_prompt = self.prompt_builder.get_system_prompt()
|
||||
user_prompt = self.prompt_builder.build_user_prompt(...)
|
||||
|
||||
# 调用AI
|
||||
raw_result = await self.ai_agent.generate_text(...)
|
||||
|
||||
# 解析结果
|
||||
judged_data = json_repair_loads(raw_result)
|
||||
|
||||
# 保存结果
|
||||
self.output_manager.save_json(judged_data, "article_judged.json", ...)
|
||||
|
||||
return judged_data
|
||||
```
|
||||
|
||||
## 5. 扩展指南
|
||||
|
||||
### 5.1 添加新的生成阶段
|
||||
|
||||
要添加新的生成阶段(例如图像生成),需要以下步骤:
|
||||
|
||||
1. 创建新的生成器类,例如 `ImageGenerator`
|
||||
2. 创建对应的提示词构建器,例如 `ImagePromptBuilder`
|
||||
3. 在 `PipelineManager` 中添加新的处理方法
|
||||
4. 在 `run_pipeline` 方法中调用新的处理方法
|
||||
|
||||
```python
|
||||
# 1. 创建新的生成器类
|
||||
class ImageGenerator:
|
||||
def __init__(self, ai_agent, config_manager, output_manager):
|
||||
# 初始化
|
||||
|
||||
async def generate_image_for_content(self, content):
|
||||
# 生成图像的逻辑
|
||||
|
||||
# 2. 在PipelineManager中添加
|
||||
def __init__(self, ...):
|
||||
# 现有初始化代码
|
||||
self.image_generator = ImageGenerator(...)
|
||||
|
||||
async def process_image_generation(self, contents):
|
||||
# 处理图像生成的逻辑
|
||||
|
||||
async def run_pipeline(self):
|
||||
# 现有流程代码
|
||||
# 添加新阶段
|
||||
if generated_contents:
|
||||
await self.process_image_generation(generated_contents)
|
||||
```
|
||||
|
||||
### 5.2 添加新的AI模型
|
||||
|
||||
要支持新的AI模型,需要修改 `AIAgent` 类:
|
||||
|
||||
1. 更新 `__init__` 方法,支持新的模型配置
|
||||
2. 在 `generate_text` 方法中添加对新模型的支持
|
||||
3. 更新配置文件结构
|
||||
|
||||
```python
|
||||
class AIAgent:
|
||||
def __init__(self, config: AIModelConfig):
|
||||
self.config = config
|
||||
if config.provider == "openai":
|
||||
self.client = AsyncOpenAI(...)
|
||||
elif config.provider == "new_provider":
|
||||
self.client = NewProviderClient(...)
|
||||
|
||||
async def generate_text(self, ...):
|
||||
# 根据provider选择不同的API调用方式
|
||||
if self.config.provider == "openai":
|
||||
# 现有OpenAI调用逻辑
|
||||
elif self.config.provider == "new_provider":
|
||||
# 新提供商的API调用逻辑
|
||||
```
|
||||
|
||||
### 5.3 自定义资源加载器
|
||||
|
||||
要支持新的资源类型或加载方式,可以扩展 `ResourceLoader` 类:
|
||||
|
||||
```python
|
||||
class ResourceLoader:
|
||||
# 现有方法
|
||||
|
||||
@staticmethod
|
||||
def load_special_format(file_path: str) -> Optional[Dict]:
|
||||
# 加载特殊格式文件的逻辑
|
||||
|
||||
@staticmethod
|
||||
def load_from_database(query: str) -> Optional[str]:
|
||||
# 从数据库加载资源的逻辑
|
||||
```
|
||||
|
||||
### 5.4 添加新的输出格式
|
||||
|
||||
要支持新的输出格式,可以扩展 `OutputManager` 类:
|
||||
|
||||
```python
|
||||
class OutputManager:
|
||||
# 现有方法
|
||||
|
||||
def save_html(self, content: str, filename: str, subdir: Optional[str] = None):
|
||||
# 保存HTML格式的逻辑
|
||||
|
||||
def export_to_cms(self, content: Dict, api_endpoint: str):
|
||||
# 导出到CMS系统的逻辑
|
||||
```
|
||||
|
||||
## 6. 最佳实践
|
||||
|
||||
### 6.1 代码风格
|
||||
|
||||
- 遵循PEP 8规范
|
||||
- 使用类型注解提高代码可读性
|
||||
- 为所有公共方法和类提供文档字符串
|
||||
- 使用异步编程处理IO密集型操作
|
||||
|
||||
### 6.2 错误处理
|
||||
|
||||
- 使用自定义异常类区分不同类型的错误
|
||||
- 实现重试机制处理临时性故障
|
||||
- 记录详细的错误信息,便于调试
|
||||
|
||||
```python
|
||||
try:
|
||||
result = await self.ai_agent.generate_text(...)
|
||||
except RetryableError as e:
|
||||
# 处理可重试错误
|
||||
logger.warning(f"遇到可重试错误: {e}")
|
||||
# 实现重试逻辑
|
||||
except NonRetryableError as e:
|
||||
# 处理不可重试错误
|
||||
logger.error(f"遇到不可重试错误: {e}")
|
||||
# 返回错误信息
|
||||
except Exception as e:
|
||||
# 处理未预期的错误
|
||||
logger.critical(f"遇到未知错误: {e}", exc_info=True)
|
||||
# 返回通用错误信息
|
||||
```
|
||||
|
||||
### 6.3 性能优化
|
||||
|
||||
- 使用异步IO提高并发性能
|
||||
- 实现缓存机制减少重复计算
|
||||
- 优化提示词减少token使用量
|
||||
- 使用采样率控制参考内容的使用量
|
||||
|
||||
### 6.4 测试策略
|
||||
|
||||
- 为核心功能编写单元测试
|
||||
- 使用模拟对象测试AI调用
|
||||
- 编写集成测试验证完整流程
|
||||
- 使用参数化测试覆盖多种场景
|
||||
|
||||
```python
|
||||
# 单元测试示例
|
||||
async def test_topic_parser():
|
||||
parser = TopicParser()
|
||||
raw_json = '{"topics": [{"index": "1", "date": "2024-07-01", ...}]}'
|
||||
topics = parser.parse(raw_json)
|
||||
assert len(topics) == 1
|
||||
assert topics[0]["index"] == "1"
|
||||
assert topics[0]["date"] == "2024-07-01"
|
||||
```
|
||||
|
||||
## 7. 常见问题与解决方案
|
||||
|
||||
### 7.1 AI调用超时
|
||||
|
||||
**问题**: AI模型调用经常超时。
|
||||
|
||||
**解决方案**:
|
||||
1. 增加超时设置
|
||||
2. 实现指数退避重试
|
||||
3. 减少提示词长度
|
||||
4. 考虑使用流式响应
|
||||
|
||||
```python
|
||||
# 实现指数退避重试
|
||||
backoff_time = 1.0
|
||||
for attempt in range(max_retries):
|
||||
try:
|
||||
response = await client.chat.completions.create(...)
|
||||
return response
|
||||
except APITimeoutError:
|
||||
logger.warning(f"尝试 {attempt + 1}/{max_retries} 超时")
|
||||
await asyncio.sleep(backoff_time)
|
||||
backoff_time *= 2 # 指数增长
|
||||
```
|
||||
|
||||
### 7.2 内存使用过高
|
||||
|
||||
**问题**: 处理大量内容时内存使用过高。
|
||||
|
||||
**解决方案**:
|
||||
1. 使用生成器处理大量数据
|
||||
2. 实现批处理机制
|
||||
3. 及时释放不再需要的资源
|
||||
|
||||
```python
|
||||
# 使用生成器处理大量数据
|
||||
async def process_topics_in_batches(self, topics, batch_size=5):
|
||||
for i in range(0, len(topics), batch_size):
|
||||
batch = topics[i:i+batch_size]
|
||||
results = await self.process_batch(batch)
|
||||
for result in results:
|
||||
yield result
|
||||
```
|
||||
|
||||
### 7.3 JSON解析错误
|
||||
|
||||
**问题**: AI返回的内容无法解析为JSON。
|
||||
|
||||
**解决方案**:
|
||||
1. 使用更健壮的JSON解析库(如json_repair)
|
||||
2. 在提示词中强调JSON格式要求
|
||||
3. 实现后处理逻辑修复常见错误
|
||||
|
||||
```python
|
||||
# 使用json_repair修复JSON
|
||||
try:
|
||||
data = json.loads(raw_result)
|
||||
except json.JSONDecodeError:
|
||||
try:
|
||||
data = json_repair_loads(raw_result)
|
||||
logger.warning("使用json_repair修复了JSON格式")
|
||||
except Exception as e:
|
||||
logger.error(f"JSON修复失败: {e}")
|
||||
# 返回错误信息
|
||||
```
|
||||
|
||||
## 8. 未来扩展方向
|
||||
|
||||
1. **多模态支持**: 添加图像生成和处理能力
|
||||
2. **用户反馈系统**: 收集和利用用户对生成内容的反馈
|
||||
3. **内容分发集成**: 与社交媒体平台API集成,自动发布内容
|
||||
4. **A/B测试框架**: 比较不同提示词和参数的效果
|
||||
5. **本地模型支持**: 支持本地部署的开源模型
|
||||
|
||||
## 9. 贡献指南
|
||||
|
||||
1. Fork仓库并创建功能分支
|
||||
2. 编写代码并添加测试
|
||||
3. 确保所有测试通过
|
||||
4. 提交Pull Request并描述变更
|
||||
5. 等待代码审查和合并
|
||||
1
main.py
1
main.py
@ -65,3 +65,4 @@ async def main():
|
||||
|
||||
if __name__ == '__main__':
|
||||
asyncio.run(main())
|
||||
|
||||
@ -14,6 +14,36 @@
|
||||
,
|
||||
{
|
||||
"content": "新疆的伊昭公路是一条风景秀丽的自驾线路,被誉为 “伊犁蕞美公路”。\n 一年只开 3 - 4 个月,错过真的要等一年!赶紧码住这份保姆级攻略👇\n・\n\n🚗交通须知 \n✅ 开放季节:该路线每年只在 6 月至 9 月开放(2025 年 5 月 15 日至 10 月 10 日开放!)\n✅ 车辆限制:仅允许 7 座及以下的小型车辆通过 \n✅ 道路情况:伊昭公路多弯且陡峭,路况较为复杂,建议使用越野车型,并由经验丰富的司机驾驶 \n✅ 夜间禁行:由于山区道路无路灯,为确保安全,每晚 22:00 至次日早晨 7:00 期间禁止所有车辆通行 \n・\n\n🏕️沿途精华景点 \n🔸托乎拉苏草原:离伊宁最近的一个草原,这片草原相比新疆其他更为知名的草原游客较少,保留了更多未被触及的自然风貌 \n🔸乌孙山:穿越广阔的托乎拉苏草原之后,便会抵达乌孙山的白石峰🗻,这里的道路相对险峻 \n🔸安格列特达坂:这是一处海拔高达 3091 米的山坂,站在此处可以一览北侧的琼博拉森林公园的壮观全景 \n🔸琼博拉森林公园:位于乌孙山下,这里是一片广袤的草甸和密集的雪松林🍃,自然景观令人心旷神怡 \n🔸伊犁州昭苏马场:昭苏地区自古以来就是著名的西域天马的产地,这里可以目睹壮观的万马🐎奔腾景象 \n🔸夏塔旅游区:从昭苏向南行驶 70 公里,便可到达夏塔古道,这是一片充满野性的荒野地带,深受众多户外探险🏃♂️爱好者的青睐 \n・\n\n🚫【避坑血泪指南】\n❌ 限行警告! 仅 7 座以下车通行,20:00 - 9:00 禁行 \n❌ 别穿白鞋! 泥巴路秒变脏脏包,徒步区石头硌 jio👟\n❌ 拒绝公路拍照!落石区停车 = 作 si,快速通过保平安 \n\n.\n\n📢经典游玩线路 \nD1 全国各地 — 伊宁 \nD2 伊宁 — 伊昭公路)— 夏塔 — 木扎尔特冰川 — 昭苏 \nD3 昭苏 — 琼库什台 — 特克斯 \nD4 特克斯 — 那拉提草原 — 六星街 — 伊宁 \nD5 伊宁 — 赛里木湖 — 蓝冰围炉煮茶 — 喀赞其民俗村 — 忘忧谷薰衣草(6.15 - 7.15 限定)— 伊宁 \nD6 伊宁 — 全国各地 \n\n.\n\n💎【行程亮点】\n✨ 新疆本地司机,出行签署正规合同 \n✨ 线上 24h 管家式服务,在线答疑解惑 \n✨ 一价全含✔门票✔住宿✔交通✔旅游险 \n✨ 2 - 6 人小团,自由出行,沉浸欣赏旅途美景 \n✨ 纯玩无购,❌进店 ❌购物,专注深度游玩 \n."
|
||||
},
|
||||
{
|
||||
"content": "夏天和假期准备来啦!\n我又发现一个新的玩水避暑胜地!\n这是全新的一个网红夏威夷泳道啦~\n-\n🏨阳江 DS 温泉酒店\n超级推荐的是夏威夷亲水别墅\n无限次免费游玩的夏威夷网红泳道\n踏出房门就能跳进泳池夏天太爽了!\n-\n💰599🉐套餐👇\n【住】酒店别墅星空双床房1间1晚;\n【吃】价值168元两大一小自助早餐\n【泡】赠送2池阳台私家泡池温泉水\n【泡】无限次爽泡高热偏硅酸公共温泉\n【玩】畅玩网红超长泳道、水上乐园\n【玩】打卡儿童狮子星空中儿童乐园\n【赏】天香大草坪、花森林婚庆广场\n【赠】公区温泉泳道免费水果、茶饮、清食等\n【赠】管家服务,一次洗漱用品,酒店免费停车\n---------------\n💥怎么订:一定要先关.🐖后下方留言咨询:999,稍后会一一回复哈"
|
||||
},
|
||||
{
|
||||
"content": "来广州外下午三点多的时候外面太热了 实在不知道去哪 突然决定去长隆水上乐园\n临时起意 即刻出发!\n目的地:地铁三号线汉溪长隆\n\n1⃣️什么时候去?票价多少?\n建议工作日去人少些\n下午4点后进场 美团69r/人 !!!很便宜!\n我觉得这个时间点太棒了\n太阳已经不是很毒辣 也不是太热了 不用担心晒伤\n\n2⃣️没带泳衣怎么办?园内买泳衣太贵怎么办?\n不用担心!万能的小🍠\n我直接搜“广州长隆水上乐园泳衣”几个关键字\n果然出现了很多5分钟内送泳衣的帖子\n随便找了一家直接➕了联系方式\n在地铁上就看商家发的图\n选好了泳衣款式➕一个男士泳裤➕防水袋\n三个东西一共才105!\n力省几百!!\n而且店家还给我把东西送到地铁口,还顺便把我人免费送到水上乐园园区门口\n\n当然也可以直接把泳衣送到园区门口 (切记先不要进园!进园他就送不了了!问了好几家都是这样说!只能在没进园之前送到地铁口或者园区门口!)\n\n没带泳衣的姐妹千万不要在园区里买!!\n\n3⃣️进去玩什么?\n我们是五点多才进园\n但是到八点半已经玩完了六七个项目\n所有大项目几乎都玩了\n介绍一下时间紧任务重的 我们的玩法 :\n离心滑道—摇滚巨轮-合家大滑板-竞速赛道-巨兽碗-巨洪峡\n-上面全部玩完之后也才七点五十多\n然后八点电音节开场觉得没什么意思\n就去刷之前排队人太多没玩过的项目\n当然是直接冲大喇叭!!\n这个时候的大喇叭直接没人!上去就玩没排队!!!\n迅速玩完 又去玩了一些小项目比如 垂直极限这种 都没人排队了 直接随便玩\n\n点击左下角查看更多,\n听说现在力度超级给力呢!"
|
||||
},
|
||||
{
|
||||
"content": "☀️暑假来了,同学们想去广州长隆水上乐园玩吗?如果想去,那首先要做攻略,下面是阿毅替你们写的攻略。\n·\n🧳出发前要做哪些准备?\n1、订票🎫:\n门票分为全天票09:30-22:30、夜场票17:00-22:30\n可在欢乐长隆gzh、某携、某哪、某评上订\n2、做交通攻略🚘:\n自驾导航长隆水上乐园,景区有停车场,收20\n打车用顺风车比较划算,目的地填长隆水上乐园\n坐地铁3号线到汉溪长隆站,从E口出来,步行1.2公里可到景区门口\n3、收拾行李🪪:\n身份证、毛巾、手机防水袋、游泳衣、防晒霜、拖鞋、手机、塑料袋、零食、水\n·\n🗺️进园步骤?\n1、刷身份证进园\n2、先去租个柜子储存东西,小柜40,大柜60,另外还要给20押金,等还了手环会返回\n3、去更衣室换衣服\n4、可以去玩了\n·\n🤹♀️必看演出:\n1、长隆水上电音派对🪩\n地点:造浪池舞台\n时间:20:00-21:00\n2、玩水激乐大巡游💃\n地点:园区\n时间:17:00-17:35\n3、水战派对🔫\n地点:沙滩区舞台\n时间:17:00-17:35\n4、泡泡派对🫧\n地点:亲子市集\n时间:16:00-16:20\n·\n🎢必玩项目:\n1、超级大喇叭📢\n坐在四叶草浮圈里,从六层高的平台出发,滑进一个巨大的喇叭中,在快速滑行中尽情欢叫\n2、摇滚巨轮🪇\n竖立自转滑道,整体外型犹如一座水上摩天轮,高达26米,每个转角都十分圆滑\n3、巨洪峡🌊\n在狭长的峡谷中只有滔天巨浪与你相伴,在跌宕起伏中挑战山洪暴发的澎湃,领略被抛向浪尖的快感\n4、超级巨兽碗👾\n首先在紫水晶通道俯冲穿越,来到一个巨碗之中。当你稍觉平稳,突然出现一个黑洞将你吸入,让你措手不及\n5、垂直极限↕️\n有3条滑道,黄色滑道滑下时速度能达到近40公里,蓝色滑道为旋转滑道,体验离心冲击,橙色滑道垂直度高,体验水花四溅的感觉\n6、巨蟒滑道🐍\n从弯形盘旋滑道划出后会进入长达6米的全封闭滑道,集合了扭转,螺旋和振动的感觉\n7、大滑板滑道🛹\n6人一组坐在浮圈上,从高处快速滑到底部,然后继续向上滑行到呈 90度的滑道上,然后再从垂直的滑道上滑落到平缓的地段\n·\n❤️温馨提示:\n建议9点半刚开园就去玩,那会人很多,如果下午去人会很多,玩一个项目要等一两个小时。"
|
||||
},
|
||||
{
|
||||
"content": "🏨广州森林海温泉度假酒店\n♨️室内水乐园,水温30度以上,温泉泡池全面!\n😭千万别错过这个森林海美食专属套餐\n-\n现在只要1399就可以享受3大3小的的Chao值套餐哦~真的是太划算啦!\n🔥3大3小自助早餐+3大3小自助晚餐+2天无限次嬉水乐园十亲子房\n现在还有限时活动,每个成人住客可以免费带两个1.5以下的小朋友一起畅玩嬉水乐园💦\n-\n限时特价房型是森林海爆款房型\n🔹海洋亲子/嬉水海洋亲子/星空亲子\n🎈自助早餐\n🎈私家露台温泉泡池\n🎈无限次威尼斯泳道\n🎈嬉水乐园【天阳湖区、神秘海岛、古海森林、森林温泉、抓鱼摸虾]\n-\n怎么订❓先关㊗️,然后下方留言【999】看到会一一回复!"
|
||||
},
|
||||
{
|
||||
"content": "深圳海边酒店已经住过洲际和万豪\n这两家酒店海滩都很漂亮\n没想到这次住桔钓沙莱华直接来了个玻璃海震撼\n庆幸遇上大晴天☀️\n才能看到这美到窒息的景色\n唯一缺点是有围网也不能下海游泳🏊…\n\n🏨酒店很大不过偏老旧,公区维护一般。房间正海景,躺在床上就能看到海滩,阳台有大浴缸可以一边看海一边泡澡🛀,度假感拉满!\n\n🎡入住每间房都有赠送一次免费小火车体验+儿童乐园100个币+帆船/皮划艇项目,赠送的游戏币可以在儿童乐园电玩区使用,室内乐园还有攀爬区、蹦床区、波波球… 足够小朋友玩很久了\n\n🍽️酒店自助早餐一般,不太好吃。晚餐在🍠找的友友农庄,家常菜,偏贵,味道还行吧,窑鸡不好吃,感觉附近就没什么好吃的东西。\n\n💗莱华酒店虽然没有很完美,比起洲际不够豪华,比起万豪不够漂亮,但是它游玩项目足够多,性价比也很高,而且为了这片玻璃海景色我一定会再刷的!!🏖️"
|
||||
},
|
||||
{
|
||||
"content": "位于大鹏新区的桔钓沙,这里沙子超白超好干净还很细腻 脚踩下去都软乎乎的 !\n不出深圳,也能实现海滨度假🏖\n.\n推门见大海🌊下楼即沙滩🏖\n【深圳桔钓沙莱华度假酒店🏨】\n作为深圳为数不多拥有独.立沙滩的度假酒店,私密性ji高\n而且酒店附近的可玩项目好多\n杨梅坑踩单车🚴♀、看美人鱼拍摄地🧜♀、徒步七娘山⛰、观国家地质博物馆等,都离酒店不到2公里路程!妥妥的遛娃好去处!\n·\n🏊♂还有超大的私人泳池,沙滩就在泳池旁边,随时可以下海畅游!\n☀️沙滩边还有各种娱乐设施,小朋友可以挖沙踏浪,大人则可以玩滑皮划艇\n👧儿童乐园也是一大亮点!室内室外都有各种儿童游乐设施\n室内攀岩、积木乐园、、4D动感影院、音乐厅和电子游戏等\n爸妈们可以省心省力地遛娃,让孩子们尽情享受快乐的时光!🎉\n·\n🏨酒店拥有246间客房,间间都带有宽阔独.立景观阳台\n有多种房型可供选择,房间设施齐全,有超大浴缸.\n·\n【双人下午茶套票】\n💰1299\n🔹豪华园景房一间一晚\n🔹双人自助早餐\n🔹双人下午茶1套(大堂吧/池畔吧 二选一)\n-\n想要购买的宝子们,戳我即可获取,酒店住宿套餐"
|
||||
},
|
||||
{
|
||||
"content": "发现了一家神仙度假酒店!\n不在三亚,也不在东南亚\n而是在深圳⛱️\n这片果冻海真的美到心颤💕\n-\n🌟桔钓沙莱华度假酒店\n✅封神级沙滩体验🏝️\n有深圳一绝的牛奶沙+玻璃海,光脚踩在沙滩上,就像踩在热奶粉上一样巨舒服。海水呈渐变色,如果冻一般\n-\n✅东南亚秘境园林🌴\n15万㎡东南亚热带花园,秒穿普吉岛\n-\n✅100%阳台景观房⛱️\n所有房型都有超大阳台,山海园林尽享眼底\n-\n✅亲子友好天花板🛝\n拥有1600㎡的儿童奇妙世界,含欢乐海洋泡泡池、室内攀岩、积木乐园、知识海洋、DIY手工坊等,玩到不想走\n-\n✅海上玩乐不停⛵️\n游艇出海、摩托艇、香蕉船、帆船、皮划艇等超多水上活动\n-\n🌟现在这个「小马代」错峰大促,人均最低只要400+,即享:\n✔️海景豪华房1间1晚\n✔️双人自助早餐\n✔️双人小帆船或皮划艇套餐(2选1)\n✔️客房迷你吧冰箱饮品\n✔️奇妙世界项目:鲸鱼大滑梯、潜艇通道、海马秋千、波波球池、儿童攀岩、儿童蹦床、手工制作等\n✔️沙滩排球、沙滩足球\n✔️赠送双人精美旅拍1份\n✔️每间房赠送一张免费小火车票\n-\n*使用有效期至2025年4月29日\n-\n今年第一场海边度假,准备好开始了吗?\n在牛奶沙上踩出脚印👣\n看着波光粼粼的海发呆🏝️\n等一场橘子汽水味的日落🌅\n这才是度假啊~\n-!"
|
||||
},
|
||||
{
|
||||
"content": "\n伙计们,都给我冲‼️\n北洛秘境是真的有点东西\n🚗出行方式:自驾(酒店本身没有停车场)\n\n🏨住宿day1:北洛秘境度假酒店1栋\n(1)属于外部干干净净,内部缝缝补补……\n(2)30层天际泳池🉑去,大海带来的疗愈……\n(3)包含早晚餐,附赠的悬崖泳池、山体公园、临海栈道套票(整体还是相当划算❤️)\n🏨住宿day2:铂悦度假公寓\n\n属于民宿类,大落地窗➕独立阳台,三面看海😍,晚上看沙滩的烟花都达不到我住的高度\n\n🌟打卡推荐🌟\n\n1️⃣首先需要知道:山体公园、悬崖泳池、悬崖咖啡、临海栈道都是在一块(只能单次进出‼️,一条道走到底)\n\n2️⃣山体公园(8:00-18:30),栈道式爬山,建议早上11:00前或者下午15点后完成打卡,它主要包括:\n\n(1)🌈彩虹步道(比较脏,顶上损坏待维修,在入口打卡即可✅);\n\n(2)不走回头路🚏路标➕鸟巢🪹(分布在道路两边,可以拍到海和马路上的“阳江”logo);\n\n(3)不上班行不行🚏路标➕露天小房子(主打一个社畜的精神支柱,房子目前有点像半竣工状态);\n\n(4)破破烂烂的粉色车尾巴(我合理怀疑它是报废状态,就跟我的精神状态蛮契合);\n\n(5)悬崖咖啡馆(😐比较有个性,但饮品看个人口味,拍照的话,我想说手残党上午大概率是会废片);\n\n(6)粉色观景台(圆形⭕️设计,可以上二楼看海,但太晒了,我没去……)可以在外围把建筑做成背景,进去拍的话,一整个粉掉……\n\n(7)网红天际秋千(两根大铁链子⛓️💥垂下来的,是景点摄影付费装置,平时秋千的板板都是收起来的😳);\n\n3️⃣悬崖泳池(8:30-18:30),这里需要二次检票(游泳需要泳装➕泳帽,拍照的话检票进去即可),可以付费寄存(20rmb,真的没必要😐)……\n\n❤️很出片是一回事,很晒是另一回事❤️\n\n4️⃣海边栈道:去‼️都给我去这里‼️真的好好看😻,果冻海➕岩石➕远处的船➕脚下的石头路,一整个波妞附体\n\n‼️建议\n真的要做好防晒😳,感觉已经黑一圈了\n穿衣是自由的,但姐妹儿,穿鞋一定是自律的\n防蚊虫是必须的,拍照是要大胆尝试的\n旅游要自己开心的😃"
|
||||
},
|
||||
{
|
||||
"content": "▶️清远新世界酒店\n还没退房就已经想要二刷的酒店\n真的太适合躺平溜娃了!\n\n🌟酒店环境服务\n很干净整洁的酒店,整体装修风格很舒服,房间也很大。入住登记后有工作人员帮忙拿行李带路,管家服务也很周到,大晚上有需求也回复得很及时,遇到的工作人员都很热情友好~\n入住的时候尽量让安排到3座,玩的地方基本都在这边,我们住2座,每次都要经过主楼走很远。\n\n🎪儿童乐园(嗨玩)\n儿童乐园区域看似不大,但有很多东西玩,三个不同类型的室内游戏房,户外区域有滑梯、蹦床、沙池、小水池、蔬菜园,还有平衡车可以骑,适合不同年龄段的小朋友。我们工作日去几乎包场,完全解放双手,阿乐自己玩得很开心。\n\n⛳️娱乐项目(活馆)\n在3座1楼,射箭、迷你高尔夫、地上桌球在一个房间进去,室内球类在对面房。有些项目需要提前预约,但我们去的时候没什么人,都是去了就能玩。迷你高尔夫和地上桌球很适合小朋友,尤其地上桌球真的太好玩了!我觉得每个宝宝都会喜欢的哈哈哈。\n\n♨️温泉(9:00-22:30)\n🏊🏻♂️泳池 (9:00-20:00)\n室外游泳池不是恒温的,我们去的时候天气有点凉,就没去了。带阿乐去泡了温泉,室内有一个泡池一个汗蒸房,室外区域不大,但环境很舒服,泡池不大,有五六个可以泡,建议人少的时候去,体验会好很多。\n\n💡以上的酒店活动项目,入住前退房后也是可以玩的,这点很人性化,毕竟2天1夜真的安排不过来哈哈~\n\n🍱餐饮\n酒店的自助早餐在主楼的1楼,环境很好,我们在室外用餐很惬意,早餐种类挺多,出品我觉得比很多酒店早餐都要好吃很多哈哈~\n正餐我们没有在酒店吃,附近有很多农庄,当晚我们选了【来来农庄】,开车5min就到,老板很热情,菜品也很不错;第二天退房后去了【三禾稻里】,10min路程,我们到店太晚了只有西餐,价格偏贵,但味道挺好的。不得不说这里真的好美啊,如果不带娃的话我可能会选这个民宿哈哈,很适合躺平发呆~\n\n🌟总结:是一家非常不错的亲子酒店,很适合亲子家庭入住,必二刷!"
|
||||
},
|
||||
{
|
||||
"content": "一开始看朋友去了觉得不错,还心想清远酒店应该很便宜吧,一查居然要1300+当时觉得有点奢侈,但是去了之后觉得好好玩,好舒服,还想再来!\n\n👨👩👦 酒店设施——超多亲子项目\n有三个主题的儿童屋,小厨房、钢琴、玩具等,户外可以玩沙子、滑滑梯,还有小农场可以浇花,有大型桌球台、小型高尔夫场,还可以射箭。我儿子玩得很开心,我自己也觉得很有趣!\n\n♨️ 酒店房间&温泉——\n房间挺新,可以加装围栏,房间有个独立的小池子,我们晚上把娃带睡之后,在露台吃宵夜泡温泉,带娃人幸福时刻。公域的温泉环境也不错,不过池子有点小\n\n🥣 酒店自助早餐——很丰盛 选择很多\n餐厅环境很好,吃早餐的时候看窗外简直心旷神怡。选择也很多,光是那碟绿色肠粉就拿了好几盘!早餐吃得很满足,也挺好吃\n\n🌴 酒店户外环境——很大 绿化很好\n超级适合我崽骑车!吃完早餐之后,在酒店户外绕了一圈,有种像逛公园的感觉,光合作用拉满,真的很舒服!\n\n⭐️⭐️⭐️⭐️⭐️\n已经是两个月前去的了,还是忍不住mark篇帖子记录。当时选了工作日来的,人少体验好,真的觉得很适合两岁起的娃,我们应该还会再去玩滴!"
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -9,9 +9,9 @@
|
||||
3. 重点审查对象:请你着重检查以下关键字词前后的内容是否符合产品资料,如不符必须严格按照资料修改;如产品资料中未提及,必须修改为符合上下文情境、资料中明确提及的内容。
|
||||
关键字词:价、元、r、人民币、rmb、优惠、活动、福利、赠、免费、折、DIY、跟拍、送、摄影、兑、服务、¥、包、课、提供、选、专业、补、差
|
||||
4. 字数控制:每个文案的标题字数都少于20个字,微调即可不用大改。
|
||||
5. 敏感字词替换:请删去标题中的数字后面的“元”和“r”,并将正文中数字后面的“元”字修改为“r”。例如:标题中的399元修改为399,正文中的399元修改为399r
|
||||
5. 敏感字词替换:请删去标题中的数字后面的"元"和"r",并将正文中数字后面的"元"字修改为"r"。例如:标题中的399元修改为399,正文中的399元修改为399r
|
||||
6. 特征语句保留:请保留文案中原本的引流语句,不要修改或删除。请保留文案中的换行符"\n",不要修改或删除。
|
||||
7. 面向人群保留:请尽量保留文案原本的面向人群和风格,这是同一产品面向多种人群营销的策略。例如产品资料中写明亲子游时,文案写“为情侣定制的山水秘境”是可以接受的。
|
||||
7. 面向人群保留:请尽量保留文案原本的面向人群和风格,这是同一产品面向多种人群营销的策略。例如产品资料中写明亲子游时,文案写"为情侣定制的山水秘境"是可以接受的。
|
||||
8. 案例如下,请参考案例评判真假信息的尺度,逐行逐句仔细分析不符点和修改思路,并按照分析思路落实对每一处不符的修改措施,严格审查每一篇文案:
|
||||
{
|
||||
"产品资料":
|
||||
@ -57,7 +57,7 @@
|
||||
输出结果:
|
||||
{ "analysis" : "
|
||||
1、观察文案标题和内容,可以看出此文案主要面向亲子出游人群,因此修改后的文案也应该围绕亲子出游这一主题。
|
||||
2、文章标题字数为28个字,超过19个字,因此属于不符内容。由于要求中提到尽量保留emoji,并且标题中数字后面的“元”字应删去,所以修改为:五一遛娃👶必囤!喜来登1088景观房
|
||||
2、文章标题字数为28个字,超过19个字,因此属于不符内容。由于要求中提到尽量保留emoji,并且标题中数字后面的"元"字应删去,所以修改为:五一遛娃👶必囤!喜来登1088景观房
|
||||
3、产品资料中未提及儿童乐园开放时间和儿童乐园配置,但文案中提到儿童乐园10:00-20:00全程开放,滑梯/积木/绘本一应俱全,因此属于不符内容。应修改为:儿童乐园:免费儿童乐园和丰富的游乐设施,让孩子们可以尽情玩耍。
|
||||
4、产品材料中未提及户外泳池开放时间和消毒频次,但文案中提到户外泳池:9:00-18:00恒温开放(五一期间每日消毒3次),因此属于不符内容。应修改为:户外泳池:酒店配有户外无边泳池,供大人小孩一同享受清凉时光。
|
||||
5、产品材料中未提及健身房开放时间与具体细节,但文案中提到健身房:8:00-22:00配备亲子瑜伽课程(需提前预约),因此属于不符内容。应修改为:健身房:酒店提供免费健身中心,方便您和家人一起强身健体。
|
||||
@ -68,12 +68,12 @@
|
||||
10、产品资料中未提及水鸟世界门票领取有时间限制,但文案中提到水鸟世界门票需提前1小时至前台领取纸质票,因此属于不符内容。应修改为:酒店前台领取水鸟世界纸质门票
|
||||
综合以上分析结果,将修改应用到原文案中,得到修改后的文案。"
|
||||
"title": "五一遛娃👶必囤!喜来登1088景观房",
|
||||
"content": "五一不想挤人潮?南沙这家酒店直接承包遛娃+度假双重快乐‼️\n地铁直达!2大1小1088r住景观房,含双早+自助晚餐+水鸟世界门票,儿童乐园/泳池/健身房全开放!\n🌟【遛娃刚需全配齐】\n✅ 儿童乐园:酒店设有免费儿童乐园,提供丰富的游乐设施,让孩子们尽情玩耍\n✅ 户外泳池:酒店配有户外无边泳池,供大人小孩一同享受清凉时光 \n✅ 健身房:酒店提供免费健身中心,适合家庭成员共同锻炼。\n\n📍【1小时玩转南沙】\n① 南沙天后宫(车程20分钟):穿汉服拍大片,听妈祖传说涨知识\n② 南沙湿地公园(40分钟):5月芦苇摇曳,带娃认鸟类+乘船探秘\n③ 十九涌海鲜街(45分钟):现捞现煮生猛海鲜,人均50r吃到撑 \n\n🍽️【家长友好细节】 \n• 自助餐厅:供应鲜美海鲜、精美甜品等任君选择,大人小孩都爱吃 \n• 房内配置:55英寸超大纯平电视+独立的浴缸+超大的落地玻璃窗,尽览蕉门河风景,尽享亲子度假时光 \n• 安全保障:酒店设有完善的监控系统和安保措施,全力保障您与家人的安全 \n\n🎁【套餐专属福利】\n1、豪华客房一间一晚(周一至四只开放双床房) \n2、2大1小自助早晚餐 \n3、赠送2大1小水鸟世界门票(酒店前台领取),无需额外购买 \n\n📌Tips: \n1. 周一至周四仅限双床房型,周五起可选大床房 \n2. 酒店前台领取水鸟世界纸质门票 \n3. 地铁四号线金洲站下车,打车15分钟直达酒店 \n\n这个五一,南沙喜来登让你躺着遛娃!不用长途跋涉,家门口就能玩出仪式感~\n
|
||||
"content": "五一不想挤人潮?南沙这家酒店直接承包遛娃+度假双重快乐‼️\n地铁直达!2大1小1088r住景观房,含双早+自助晚餐+水鸟世界门票,儿童乐园/泳池/健身房全开放!\n🌟【遛娃刚需全配齐】\n✅ 儿童乐园:酒店设有免费儿童乐园,提供丰富的游乐设施,让孩子们尽情玩耍\n✅ 户外泳池:酒店配有户外无边泳池,供大人小孩一同享受清凉时光 \n✅ 健身房:酒店提供免费健身中心,适合家庭成员共同锻炼。\n\n📍【1小时玩转南沙】\n① 南沙天后宫(车程20分钟):穿汉服拍大片,听妈祖传说涨知识\n② 南沙湿地公园(40分钟):5月芦苇摇曳,带娃认鸟类+乘船探秘\n③ 十九涌海鲜街(45分钟):现捞现煮生猛海鲜,人均50r吃到撑 \n\n🍽️【家长友好细节】 \n• 自助餐厅:供应鲜美海鲜、精美甜品等任君选择,大人小孩都爱吃 \n• 房内配置:55英寸超大纯平电视+独立的浴缸+超大的落地玻璃窗,尽览蕉门河风景,尽享亲子度假时光 \n• 安全保障:酒店设有完善的监控系统和安保措施,全力保障您与家人的安全 \n\n🎁【套餐专属福利】\n1、豪华客房一间一晚(周一至四只开放双床房) \n2、2大1小自助早晚餐 \n3、赠送2大1小水鸟世界门票(酒店前台领取),无需额外购买 \n\n📌Tips: \n1. 周一至周四仅限双床房型,周五起可选大床房 \n2. 酒店前台领取水鸟世界纸质门票 \n3. 地铁四号线金洲站下车,打车15分钟直达酒店 \n\n这个五一,南沙喜来登让你躺着遛娃!不用长途跋涉,家门口就能玩出仪式感~\n",
|
||||
}
|
||||
|
||||
8. 必须按照以下格式输出修改后内容,不需要输出无关内容
|
||||
9. 必须按照以下格式输出修改后内容,不需要输出无关内容
|
||||
{
|
||||
"analysis" : "分析过程",
|
||||
"title": "修改后的标题",
|
||||
"content": "修改后的内容"
|
||||
"content": "修改后的内容",
|
||||
}
|
||||
@ -14,3 +14,5 @@
|
||||
--- Tweet ---
|
||||
{tweet_content}
|
||||
--- Tweet End ---
|
||||
|
||||
请仔细审核文案内容,确保与产品资料一致。
|
||||
|
||||
Binary file not shown.
@ -140,8 +140,30 @@ class BasePromptBuilder(PromptTemplate):
|
||||
data = json.load(f)
|
||||
|
||||
if "examples" in data and isinstance(data["examples"], list):
|
||||
formatted_examples = [f"- {item.get('content', '')}" for item in data["examples"]]
|
||||
return f"参考标题列表:\n" + "\n".join(formatted_examples)
|
||||
examples = data["examples"]
|
||||
return f"参考标题列表:\n" + "\n".join([f"- {item.get('content', '')}" for item in examples])
|
||||
else:
|
||||
return json.dumps(data, ensure_ascii=False, indent=2)
|
||||
except Exception as e:
|
||||
logger.error(f"解析或格式化JSON文件 '{path}' 失败: {e}")
|
||||
return f"加载文件 '{path.name}' 失败。"
|
||||
else:
|
||||
return path.read_text('utf-8')
|
||||
|
||||
def _load_and_format_content_with_sampling(self, path: Path, sampling_rate: float) -> str:
|
||||
"""根据文件类型加载和格式化内容,并应用采样率"""
|
||||
if path.suffix == '.json':
|
||||
try:
|
||||
with path.open('r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
if "examples" in data and isinstance(data["examples"], list):
|
||||
examples = data["examples"]
|
||||
# 应用采样率
|
||||
sample_size = max(1, int(len(examples) * sampling_rate))
|
||||
sampled_examples = random.sample(examples, sample_size)
|
||||
logger.info(f"文件 '{path.name}' 中的examples采样: {sample_size}/{len(examples)} (采样率: {sampling_rate:.2f})")
|
||||
return f"参考标题列表:\n" + "\n".join([f"- {item.get('content', '')}" for item in sampled_examples])
|
||||
else:
|
||||
return json.dumps(data, ensure_ascii=False, indent=2)
|
||||
except Exception as e:
|
||||
@ -187,25 +209,37 @@ class BasePromptBuilder(PromptTemplate):
|
||||
|
||||
full_path = self._get_full_path(path_str)
|
||||
|
||||
files_to_read = []
|
||||
# 简化逻辑:对于单个文件,直接应用采样率决定是否加载
|
||||
if full_path.is_file():
|
||||
if random.random() < sampling_rate:
|
||||
files_to_read.append(full_path)
|
||||
logger.info(f"文件 '{path_str}' 采样成功 (采样率: {sampling_rate})")
|
||||
# 对于JSON文件,对内容进行采样
|
||||
if full_path.suffix == '.json':
|
||||
file_content = self._load_and_format_content_with_sampling(full_path, sampling_rate)
|
||||
content_parts.append(f"--- {full_path.name} ---\n{file_content}")
|
||||
logger.info(f"加载JSON文件 '{path_str}' 并应用内部采样")
|
||||
# 对于其他文件,根据采样率决定是否完全加载
|
||||
elif random.random() < sampling_rate:
|
||||
file_content = self._load_and_format_content(full_path)
|
||||
content_parts.append(f"--- {full_path.name} ---\n{file_content}")
|
||||
logger.info(f"文件 '{path_str}' 采样成功 (采样率: {sampling_rate:.2f})")
|
||||
else:
|
||||
logger.info(f"文件 '{path_str}' 采样失败 (采样率: {sampling_rate})")
|
||||
logger.info(f"文件 '{path_str}' 采样失败 (采样率: {sampling_rate:.2f})")
|
||||
# 对于目录,直接选择指定比例的文件
|
||||
elif full_path.is_dir():
|
||||
all_files = sorted(p for p in full_path.iterdir() if p.is_file())
|
||||
if sampling_rate < 1.0:
|
||||
num_to_sample = max(1, int(len(all_files) * sampling_rate))
|
||||
files_to_read = random.sample(all_files, num_to_sample)
|
||||
logger.info(f"对目录 '{path_str}' 进行采样 (采样率: {sampling_rate}),选取 {len(files_to_read)}/{len(all_files)} 个文件。")
|
||||
if all_files:
|
||||
if sampling_rate < 1.0:
|
||||
sample_size = max(1, int(len(all_files) * sampling_rate))
|
||||
files_to_read = random.sample(all_files, sample_size)
|
||||
logger.info(f"目录 '{path_str}' 采样: {sample_size}/{len(all_files)} 个文件 (采样率: {sampling_rate:.2f})")
|
||||
else:
|
||||
files_to_read = all_files
|
||||
logger.info(f"目录 '{path_str}' 全部加载: {len(all_files)} 个文件")
|
||||
|
||||
for f_path in files_to_read:
|
||||
file_content = self._load_and_format_content(f_path)
|
||||
content_parts.append(f"--- {f_path.name} ---\n{file_content}")
|
||||
else:
|
||||
files_to_read = all_files
|
||||
|
||||
for f_path in files_to_read:
|
||||
file_content = self._load_and_format_content(f_path)
|
||||
content_parts.append(f"--- {f_path.name} ---\n{file_content}")
|
||||
logger.warning(f"目录 '{path_str}' 中没有文件")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"加载Refer资源 '{ref_item}' 失败: {e}", exc_info=True)
|
||||
|
||||
Binary file not shown.
@ -53,6 +53,16 @@ class ContentJudger:
|
||||
topic_index = topic.get('index', 'unknown')
|
||||
topic_dir = f"topic_{topic_index}"
|
||||
|
||||
# 从原始内容中提取tags
|
||||
original_tags = []
|
||||
try:
|
||||
original_content = json_repair_loads(generated_content)
|
||||
if isinstance(original_content, dict) and "tags" in original_content:
|
||||
original_tags = original_content.get("tags", [])
|
||||
logger.info(f"从原始内容中提取到标签: {original_tags}")
|
||||
except Exception as e:
|
||||
logger.warning(f"从原始内容提取标签失败: {e}")
|
||||
|
||||
# 1. 构建提示
|
||||
system_prompt = self.prompt_builder.get_system_prompt()
|
||||
user_prompt = self.prompt_builder.build_user_prompt(
|
||||
@ -99,7 +109,12 @@ class ContentJudger:
|
||||
judged_data = json_repair_loads(raw_result)
|
||||
if isinstance(judged_data, dict) and "title" in judged_data and "content" in judged_data:
|
||||
judged_data["judge_success"] = True
|
||||
logger.info("内容审核成功完成。")
|
||||
|
||||
# 直接使用原始内容中的标签
|
||||
if original_tags:
|
||||
judged_data["tags"] = original_tags
|
||||
# 如果原始内容中没有标签,则使用默认标签
|
||||
logger.info(f"内容审核成功完成,使用标签: {judged_data.get('tags', [])}")
|
||||
|
||||
# 保存审核后的内容
|
||||
if self.output_manager:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user