# TravelContentCreator

TravelContentCreator是一个用于自动化生成旅游内容和宣传海报的系统。该系统利用AI技术生成景点选题、撰写文章内容并制作相应的宣传海报。

## 功能特点

- 自动生成旅游景点选题（包括目标受众、写作风格等）
- 根据选题生成详细的旅游文章内容
- 为生成的文章制作美观的宣传海报
- 支持多种写作风格和目标受众需求
- 文件模糊匹配功能，增强系统健壮性
- 模块化设计，可单独使用选题、内容生成或海报生成功能
- 内容审核功能，自动检查和修正生成内容与产品资料的匹配度

## 目录结构

```
TravelContentCreator/
├── core/                 # 核心功能模块
├── utils/                # 工具类和辅助函数
├── genPrompts/           # 生成提示词
│   ├── Style/            # 风格提示词
│   ├── Demand/           # 需求提示词
│   └── Refer/            # 参考提示词
├── SelectPrompt/         # 选题提示词
├── resource/             # 资源文件
├── main.py               # 主程序
├── test_topic_content.py # 选题和内容生成测试脚本
├── test_poster.py        # 海报生成测试脚本
├── topic_content_config.json # 选题和内容生成配置
├── poster_config.json    # 海报生成配置
└── poster_gen_config.json # 主程序配置
```

## 安装

1. 克隆仓库
```bash
git clone [仓库URL]
cd TravelContentCreator
```

2. 安装依赖
```bash
pip install -r requirements.txt
```

3. 配置环境
   - 确保安装了Python 3.6+
   - 配置好AI模型API（本系统默认使用QwenAPI）
   - 准备好必要的素材和资源文件

## 使用说明

### 1. 主程序

主程序可以执行完整的流程，包括选题生成、内容生成和海报生成：

```bash
python main.py [--config CONFIG_PATH] [--run_id RUN_ID] [--topics_file TOPICS_FILE] [--debug]
```

参数说明：
- `--config`: 配置文件路径，默认为`poster_gen_config.json`
- `--run_id`: 自定义运行ID，用于区分不同批次的生成结果
- `--topics_file`: 预生成的选题文件路径，如果提供则跳过选题生成步骤
- `--debug`: 启用调试级别日志

### 2. 测试选题和内容生成

使用专门的测试脚本运行选题和内容生成模块：

```bash
python test_topic_content.py [--config CONFIG_PATH] [--run_id RUN_ID] [--topics_file TOPICS_FILE] [--debug]
```

参数说明：
- `--config`: 配置文件路径，默认为`topic_content_config.json`
- `--run_id`: 自定义运行ID
- `--topics_file`: 预生成的选题文件路径，如果提供则跳过选题生成
- `--debug`: 启用调试级别日志

### 3. 测试海报生成

使用专门的测试脚本运行海报生成模块：

```bash
python test_poster.py --topics_file TOPICS_FILE [--config CONFIG_PATH] [--topic_index TOPIC_INDEX] [--run_id RUN_ID] [--debug]
```

参数说明：
- `--topics_file`: 必需的选题JSON文件路径，用于获取海报生成的主题数据
- `--config`: 配置文件路径，默认为`poster_config.json`
- `--topic_index`: 要生成海报的特定选题索引，如果未提供则为所有选题生成海报
- `--run_id`: 自定义运行ID
- `--debug`: 启用调试级别日志

## 配置文件说明

### 选题和内容生成配置 (topic_content_config.json)

```json
{
    "date": "5月15日, 5月16日, 5月17日, 6月1日",  // 选题日期
    "num": 2,                         // 生成选题数量
    "variants": 1,                    // 每个选题的变体数量
    "topic_temperature": 0.2,         // 选题生成的temperature参数
    "content_temperature": 0.3,       // 内容生成的temperature参数
    "model": "qwenQWQ",               // 使用的AI模型
    "api_url": "http://localhost:8000/v1/", // API地址
    "api_key": "EMPTY",               // API密钥
    "enable_content_judge": true,     // 是否启用内容审核功能
    "topic_system_prompt": "./SelectPrompt/systemPrompt.txt", // 选题系统提示词路径
    "topic_user_prompt": "./SelectPrompt/userPrompt.txt",     // 选题用户提示词路径
    "content_system_prompt": "./genPrompts/systemPrompt.txt", // 内容系统提示词路径
    "content_judger_system_prompt": "./genPrompts/judgerSystemPrompt.txt", // 内容审核系统提示词路径
    "prompts_config": [               // 提示词配置
        {
            "type": "Style",          // 风格提示词
            "file_path": [...]        // 风格提示词文件路径列表
        },
        {
            "type": "Demand",         // 需求提示词
            "file_path": [...]        // 需求提示词文件路径列表
        },
        ...
    ],
    "resource_dir": [                 // 资源目录配置
        {
            "type": "Object",         // 对象类型
            "file_path": [...]        // 对象文件路径列表
        },
        ...
    ]
}
```

### 海报生成配置 (poster_config.json)

```json
{
    "variants": 1,                    // 每个选题的变体数量
    "model": "qwenQWQ",               // 使用的AI模型
    "api_url": "http://localhost:8000/v1/", // API地址
    "api_key": "EMPTY",               // API密钥
    "poster_content_system_prompt": "./genPrompts/poster_content_systemPrompt.txt", // 海报内容系统提示词路径
    "resource_dir": [...],            // 资源目录配置
    "output_dir": "./result",         // 输出目录
    "image_base_dir": "...",          // 图片基础目录
    "poster_assets_base_dir": "...",  // 海报素材基础目录
    "poster_target_size": [900, 1200], // 海报目标尺寸
    "text_possibility": 0.3,          // 文本可能性
    "img_frame_possibility": 0.7,     // 图像框可能性
    "text_bg_possibility": 0           // 文本背景可能性
}
```

## 内容审核功能

系统支持内容审核功能，可以自动检查生成的内容是否与产品资料匹配，并进行必要的修正：

1. 启用方式：在配置文件中设置 `"enable_content_judge": true`
2. 审核流程：
   - 系统会根据topic中的产品信息获取相关产品资料
   - 将生成的内容与产品资料进行比对
   - 对不符合产品资料的内容进行修正
   - 保留原始内容和修正后的内容

3. 输出格式：无论是否启用内容审核功能，生成的`article.json`文件都会包含以下字段：
   - `title`: 文章标题
   - `content`: 文章内容
   - `tag`/`tags`: 文章标签（两者保持一致）
   - `judged`: 是否经过内容审核（布尔值）
   - `original_title`: 原始标题（未经审核时为null）
   - `original_content`: 原始内容（未经审核时为null）
   - `judge_analysis`: 审核分析（未经审核时为null）

## 结果输出

生成的结果保存在配置文件中指定的`output_dir`目录下，按照`run_id`组织。每次运行的结果包括：

- 选题文件：`tweet_topic_{run_id}.json`
- 选题使用的提示词：`tweet_prompt_{run_id}.txt`
- 文章内容：分目录保存在`{run_id}/{topic_index}_{variant_index}/article.json`
- 海报图像：保存在`{run_id}/{topic_index}_{variant_index}/poster/poster.jpg`
- 拼贴图像：保存在`{run_id}/{topic_index}_{variant_index}/collage_img/`

## 自定义扩展

系统各部分设计为模块化，您可以：

1. 添加新的风格提示词到`genPrompts/Style/`目录
2. 添加新的需求提示词到`genPrompts/Demand/`目录
3. 添加新的景点资源到`resource/Object/`目录
4. 修改AI模型参数以适应不同生成需求
5. 自定义海报生成的尺寸和样式
6. 自定义内容审核的提示词和规则

## 注意事项

- 确保提示词文件和资源文件的编码为UTF-8
- API密钥应妥善保管，建议使用环境变量或外部配置
- 图像生成需要足够的系统资源，建议在性能良好的设备上运行
- 文件模糊匹配功能可以处理一些文件名不完全匹配的情况，但建议尽量保持文件名规范
- 内容审核功能需要配置相应的系统提示词文件

## 贡献

欢迎提交问题报告和功能建议，或直接提交代码改进。
