From d894d1a63a45c61bd0f8ffc7af033269267a5be6 Mon Sep 17 00:00:00 2001 From: jinye_huang Date: Tue, 22 Apr 2025 15:59:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 97 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 52 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 78d7886..3ab4866 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ## 功能特点 -- **自动选题生成**:根据提供的景点信息和配置的提示词模板,自动生成吸引人的旅游选题。 +- **自动选题生成**:根据提供的景点信息和配置的提示词模板,自动生成吸引人的旅游选题(**以JSON格式输出**)。 - **内容创作**:基于选题和配置的提示词模板,自动生成文字内容(标题、正文)。 - **海报制作**:结合景点图片和生成的文字内容,自动创建精美的宣传海报。 - **批量处理**:支持一次性生成多个选题和多个变体内容。 @@ -19,7 +19,7 @@ ```bash # 安装依赖库 -pip install numpy pandas opencv-python pillow +pip install numpy pandas opencv-python pillow openai # 可能还需要安装AI模型的客户端库,例如 requests 或 特定模型的SDK # pip install requests ``` @@ -29,68 +29,72 @@ pip install numpy pandas opencv-python pillow - NumPy:数据操作 - Pandas:数据处理 - PIL (Pillow):图像处理和绘制 +- OpenAI:AI模型交互 (即使是调用本地或其他API,通常也使用其接口) ## 核心组件与目录结构 -- `main.py`: **项目入口与协调器**: 负责加载配置、初始化共享资源(如 AI Agent)、并按顺序调用 `utils` 模块中的函数来执行主要流程(选题生成 -> 内容与海报生成协调)。 +- `main.py`: **项目入口与协调器**: 负责加载配置、**生成运行ID (run_id)**、初始化共享资源(如 AI Agent)、并按顺序调用 `utils` 模块中的函数来执行主要流程(选题生成 -> 内容与海报生成协调)。 - `poster_gen_config.json`: (用户需从 `example_config.json` 创建) 核心配置文件。 - `core/`: 核心算法与功能模块 - `ai_agent.py`: **AI代理**: 封装与大语言模型 API 的底层交互逻辑(发送请求、接收响应)。 - - `topic_parser.py`: **选题解析器**: 解析 AI 模型返回的选题文本。 + - `topic_parser.py`: **选题解析器**: 解析 AI 模型返回的选题 **JSON 数据**。 - `contentGen.py`: **内容处理器**: 对 AI 生成的原始推文内容进行结构化处理,提取适用于海报的元素。 - `posterGen.py`: **海报生成器**: 负责将图片和文字元素组合生成最终的海报图片,处理字体、布局等。 - `simple_collage.py`: **图片拼贴工具**: 提供图片预处理和拼贴功能。 - `utils/`: 工具与辅助模块 - `resource_loader.py`: **资源加载器**: 负责加载项目所需的各种**原始**资源文件。 - - `prompt_manager.py`: **提示词管理器**: **集中管理**不同阶段提示词的构建逻辑。 - - `tweet_generator.py`: **主要流程执行与数据结构**: 包含执行**选题生成** (`run_topic_generation_pipeline`)、**单选题内容生成** (`generate_content_for_topic`)、**单选题海报生成** (`generate_posters_for_topic`) 的核心函数,以及相关的数据类。 + - `prompt_manager.py`: **提示词管理器**: **集中管理**不同阶段提示词的构建逻辑(**已修正内容生成提示词构建逻辑,正确区分选题JSON中的文件名和描述性文本**)。 + - `tweet_generator.py`: **主要流程执行与数据结构**: 包含执行**选题生成** (`run_topic_generation_pipeline`)、**单选题内容生成** (`generate_content_for_topic`)、**单选题海报生成** (`generate_posters_for_topic`) 的核心函数,以及相关的数据类(**已修正内容文件保存路径**)。 - `genPrompts/`: 内容生成提示词模板目录。 -- `SelectPrompt/`: 选题生成提示词模板目录。 +- `SelectPrompt/`: 选题生成提示词模板目录(**其中的 `systemPrompt.txt` 已更新为要求 JSON 输出**)。 - `resource/`: 存放基础的景点信息 `.txt` 文件等数据资源。 - `examples/`: 使用示例和测试脚本。 - `result/`: 默认输出结果保存目录。 ## 项目流程与技术细节 -1. **加载配置**: `main.py` 读取 `poster_gen_config.json` 文件。 +1. **加载配置与生成Run ID**: `main.py` 读取 `poster_gen_config.json` 文件,并生成本次运行的 `run_id`。 2. **选题生成**: - - `main.py` 调用 `utils.tweet_generator.run_topic_generation_pipeline(config)`。 + - `main.py` 调用 `utils.tweet_generator.run_topic_generation_pipeline(config, run_id)`,传入配置和 `run_id`。 - 此函数内部: - - 调用 `utils.prompt_manager.PromptManager.get_topic_prompts()` 构建提示词。 + - 调用 `utils.prompt_manager.PromptManager.get_topic_prompts()` 构建提示词(**系统提示词要求 AI 输出 JSON 格式**)。 - 初始化 `core.ai_agent.AI_Agent`。 - - 调用 AI Agent 生成选题文本。 - - 使用 `core.topic_parser` 解析结果。 - - 保存选题结果 (`tweet_topic.json`)。 + - 调用 AI Agent 生成选题文本(应为 JSON 字符串)。 + - 使用 `core.topic_parser.parse_topics()` **解析 JSON 字符串**。 + - 保存选题结果 (`tweet_topic.json`) 到 `result//` 目录。 - 关闭此阶段的 AI Agent。 - - 返回 `run_id` 和 `tweet_topic_record` 给 `main.py`。 + - 返回 `run_id` 和包含选题列表的 `tweet_topic_record` 给 `main.py`。 3. **内容与海报生成协调**: (在 `main.generate_content_and_posters_step` 中执行) - 初始化 `utils.prompt_manager.PromptManager`。 - 初始化一个**共享的** `core.ai_agent.AI_Agent` 实例供后续所有内容生成使用。 - 遍历上一步返回的每个选题 (`topic_item`): - - **内容生成**: 调用 `utils.tweet_generator.generate_content_for_topic()`,传入共享的 AI Agent、Prompt Manager、配置和当前选题信息。 - - 此函数内部循环生成该选题的所有内容变体,每次调用 `prompt_manager.get_content_prompts()` 获取特定提示词,并使用共享 AI Agent 执行 `generate_single_content`。 - - **海报生成**: 如果内容生成成功,调用 `utils.tweet_generator.generate_posters_for_topic()`,传入配置、选题信息和生成的内容列表。 - - 此函数内部负责初始化 `ContentGenerator` 和 `PosterGenerator`,调用 `core` 模块中的函数处理图片和文本,并生成所有海报变体。 + - **内容生成**: 调用 `utils.tweet_generator.generate_content_for_topic()`,传入共享的 AI Agent、Prompt Manager、配置、当前选题信息、`run_id` 和 `topic_index`。 + - 此函数内部循环生成该选题的所有内容变体,每次调用 `prompt_manager.get_content_prompts()` 获取特定提示词(**根据修正后的逻辑构建,正确处理 topic_item 中的字段**),并使用共享 AI Agent 执行 `generate_single_content`。 + - `generate_single_content` 将生成的文章 (`article.json`) 保存到正确的 `result//_/` 目录下。 + - **海报生成**: 如果内容生成成功,调用 `utils.tweet_generator.generate_posters_for_topic()`,传入配置、选题信息、生成的内容列表、`run_id` 和 `topic_index`。 + - 此函数内部负责初始化 `ContentGenerator` 和 `PosterGenerator`,调用 `core` 模块中的函数处理图片和文本,并生成所有海报变体到对应的 `result//_/` 目录下。 - 所有选题处理完毕后,在 `main.generate_content_and_posters_step` 中关闭共享的 AI Agent。 ## 使用方法 -1. 准备景点资源信息 (`.txt` 文件),放入 `resource/Object/` 目录(或其他在配置中指定的路径)。 -2. 准备景点图片资源,按照 `README.md` 中"开始使用"部分的说明组织图片目录结构,并确保 `poster_gen_config.json` 中的 `image_base_dir` 指向正确的图片根目录。 -3. 复制 `example_config.json` 为 `poster_gen_config.json`,并根据你的 API Key、模型端点、文件路径、图片根目录等进行修改。 +1. 准备景点资源信息 (`.txt` 文件),放入 `resource/Object/` 目录(或其他在配置中指定的路径)。确保文件名与选题生成时 AI 可能选择的 `object` 名称匹配(目前使用包含匹配逻辑)。 +2. 准备图片资源,按照 `README.md` 中"开始使用"部分的说明组织图片目录结构,并确保 `poster_gen_config.json` 中的 `image_base_dir` 指向正确的图片根目录。 +3. 复制 `example_config.json` 为 `poster_gen_config.json`,并根据你的 API Key、模型端点、文件路径、图片根目录等进行修改。确保 `prompts_dir` 下的 `Style/` 和 `Demand/` 目录包含选题生成 AI 可能输出的文件名 (带 `.txt` 后缀)。确保 `Refer/` 目录下包含所有需要的参考文件。 4. **运行完整流程**: ```bash python main.py ``` -5. **分阶段运行**: (参考 `examples/` 目录下的脚本) +5. **分阶段运行**: (参考 `examples/` 目录下的脚本,**注意需要传递 run_id**) ```bash # 阶段 1: 仅生成选题 - python examples/run_step1_topics.py - # (记下输出的 Run ID) + # 需要修改 examples/run_step1_topics.py 以接受或生成 run_id 并传递 + # python examples/run_step1_topics.py # 阶段 2: 处理已生成的选题 - python examples/run_step2_content_posters.py + # 需要修改 examples/run_step2_content_posters.py 以接受 run_id 参数 + # python examples/run_step2_content_posters.py ``` + *(注意: 示例脚本可能需要更新以适应 run_id 传递的变化)* ## 配置说明 @@ -98,10 +102,10 @@ pip install numpy pandas opencv-python pillow **必须配置项**: -- `api_url`: 大语言模型 API 地址 +- `api_url`: 大语言模型 API 地址 (或预设名称如 'vllm', 'ali', 'kimi', 'doubao', 'deepseek') - `api_key`: API 密钥 - `model`: 使用的模型名称 -- `topic_system_prompt`: 选题生成系统提示词文件路径 +- `topic_system_prompt`: 选题生成系统提示词文件路径 (应为要求JSON输出的版本) - `topic_user_prompt`: 选题生成基础用户提示词文件路径 - `content_system_prompt`: 内容生成系统提示词文件路径 - `resource_dir`: 包含景点等资源文件信息的列表 (结构见 `example_config.json`) @@ -113,12 +117,13 @@ pip install numpy pandas opencv-python pillow **可选配置项**: -- `date`: 日期标记(用于提示词,默认为当前日期) -- `topic_temperature`, `topic_top_p`, `topic_max_tokens`: 选题生成 API 相关参数 -- `content_temperature`: 内容生成 API 相关参数 +- `date`: 日期标记(用于选题生成提示词,默认为空) +- `topic_temperature`, `topic_top_p`, `topic_presence_penalty`: 选题生成 API 相关参数 (默认为 0.2, 0.5, 1.5) +- `content_temperature`, `content_top_p`, `content_presence_penalty`: 内容生成 API 相关参数 (默认为 0.3, 0.4, 1.5) - `camera_image_subdir`: 存放原始照片和描述文件的子目录名(相对于 `image_base_dir`,默认"相机") - `modify_image_subdir`: 存放处理后/用于拼贴的图片的子目录名(相对于 `image_base_dir`,默认"modify") - `poster_target_size`: 海报目标尺寸 `[宽, 高]`(默认 `[900, 1200]`) +- `text_possibility`: 海报中第二段附加文字出现的概率 (默认 0.3) 项目提供了一个示例配置文件 `example_config.json`,请务必复制并修改: @@ -131,16 +136,16 @@ nano poster_gen_config.json ### 1. 准备景点信息文件 -在 `resource/Object/` 目录中创建景点信息文件(UTF-8编码),文件名应与配置和选题结果中的 `object` 字段对应,例如 `景点信息-泰宁古城.txt`: +在 `resource/Object/` 目录中创建景点信息文件(UTF-8编码),文件名应与配置和选题结果中的 `object` 字段匹配(例如 `景点信息-泰宁古城.txt`)。 -``` -景点名称:泰宁古城 -位置:福建省三明市泰宁县 -简介:泰宁古城始建于宋代... -特色:古城墙、古街巷... -``` +### 2. 准备提示词文件 -### 2. 准备图片资源 +在 `prompts_dir` (默认为 `genPrompts/`) 下准备子目录和文件: +* `Demand/`: 存放面向人群的文件,如 `亲子家庭文旅需求.txt`。文件名需要与选题生成 AI 输出的 `target_audience` 值完全匹配 (包括 `.txt`)。 +* `Style/`: 存放文案风格文件,如 `攻略风文案提示词.txt`。文件名需要与选题生成 AI 输出的 `style` 值完全匹配 (包括 `.txt`)。 +* `Refer/`: 存放所有通用的参考提示文件,它们的内容会被全部加载。 + +### 3. 准备图片资源 将景点的高质量图片保存在配置的 `image_base_dir` 下,并按以下推荐结构组织(子目录名可通过配置修改): @@ -162,23 +167,25 @@ nano poster_gen_config.json ``` **注意**: 海报生成步骤会从 `modify` 子目录中查找用于制作海报的图片。 -### 3. 配置文件 +### 4. 配置文件 -仔细检查并修改 `poster_gen_config.json`,确保所有路径(特别是 `image_base_dir`)和 API 信息正确无误。 +仔细检查并修改 `poster_gen_config.json`,确保所有路径(特别是 `image_base_dir`, `prompts_dir`)和 API 信息、模型名称、新增参数等正确无误。 -### 4. 运行生成流程 +### 5. 运行生成流程 -根据需要选择完整流程或分阶段执行(见"使用方法"部分)。 +根据需要选择完整流程或分阶段执行(见"使用方法"部分,注意示例脚本可能需要更新)。 -生成的结果将保存在配置的`output_dir`目录下的 `run_id` 子目录中。 +生成的结果将保存在配置的`output_dir`目录下的 `run_id` 子目录中,每个选题的每个变体都有一个单独的子目录。 ## 示例 -查看`examples/`目录及其 `README.md` 文件,了解如何运行测试脚本或单独使用项目组件。 +查看`examples/`目录及其 `README.md` 文件,了解如何运行测试脚本或单独使用项目组件(可能需要更新以反映最新的代码变化)。 ## 注意事项 -- 确保已安装所有依赖库。 +- 确保已安装所有依赖库,特别是 `openai` 库。 +- **选题生成依赖于 AI 模型严格输出有效的 JSON 格式**。如果 AI 输出格式错误,选题解析会失败。 +- **内容生成依赖于 AI 在选题 JSON 中提供的 `style` 和 `target_audience` 文件名与 `prompts_dir` 下 `Style/` 和 `Demand/` 目录中的实际文件名(含.txt)完全一致**。请检查这些目录和文件名。 - **图片目录结构和命名**需严格符合预期,以便程序能找到对应景点的图片。 - AI生成内容的质量很大程度上取决于**提示词的设计**和**输入资源信息的质量**。 - 仔细检查 API Key、URL 和文件路径配置。