TravelContentCreator/docs/PROJECT_STATUS.md

15 KiB
Raw Blame History

TravelContentCreator 项目状态文档

更新日期: 2024-12-10
版本: 2.3.0


1. 项目概述

TravelContentCreator 是一个旅游内容自动生成系统的 Python 后端服务,提供:

  • 选题生成 (Topic Generate)
  • 内容生成 (Content Generate)
  • 海报生成 (Poster Generate)

1.1 技术栈

组件 技术
Web 框架 FastAPI
AI 模型 OpenAI API (GPT-4)
模板引擎 Jinja2
配置格式 YAML
运行端口 8001

1.2 目录结构

TravelContentCreator/
├── api/                      # FastAPI 应用
│   ├── main.py              # 应用入口
│   └── routers/             # 路由定义
│       ├── v2_aigc.py       # V2 统一 AIGC API
│       └── prompt.py        # Prompt 管理 API
├── domain/                   # 领域逻辑
│   ├── aigc/                # AIGC 引擎
│   │   ├── engines/         # 引擎实现
│   │   │   ├── base.py
│   │   │   ├── topic_generate_v2.py
│   │   │   ├── content_generate_v2.py
│   │   │   └── poster_generate_v2.py
│   │   └── shared/          # 共享组件
│   │       └── llm_client.py
│   └── prompt/              # Prompt 管理
│       ├── __init__.py
│       └── registry.py      # PromptRegistry
├── prompts/                  # Prompt 模板 (YAML)
│   ├── topic_generate/
│   │   ├── v1.0.0.yaml
│   │   └── v2.0.0.yaml
│   ├── content_generate/
│   │   ├── v1.0.0.yaml
│   │   └── v2.0.0.yaml
│   └── content_judge/
│       └── v1.0.0.yaml
├── config/                   # 配置文件
│   ├── styles.yaml          # 风格配置
│   └── audiences.yaml       # 人群配置
├── docs/                     # 文档
│   ├── PROJECT_STATUS.md    # 本文档
│   ├── FIELD_REFACTOR_DESIGN.md
│   ├── FIELD_MAPPING.md
│   └── JAVA_MIGRATION_GUIDE.md
└── tests/                    # 测试
    └── test_full_flow.py

2. Prompt 管理系统

2.1 PromptRegistry 核心功能

PromptRegistry 是 Prompt 管理的核心组件,位于 domain/prompt/registry.py

主要功能

  • YAML 格式 Prompt 加载和解析
  • 版本管理 (v1.0.0, v2.0.0, latest)
  • Jinja2 模板渲染
  • 变量验证
  • 模型参数绑定

2.2 Prompt YAML 结构

# prompts/{engine_name}/{version}.yaml

meta:
  name: topic_generate           # 引擎名称
  version: "2.0.0"               # 版本号
  description: "小红书选题生成"   # 描述
  author: "team"
  created_at: "2024-12-09"
  changelog: "新增热点信息支持"   # 变更说明

model:                           # 模型参数
  temperature: 0.2
  top_p: 0.3
  presence_penalty: 1.5

variables:                       # 变量定义
  num_topics:
    type: integer
    required: true
    description: "选题数量"
  month:
    type: string
    required: true
    description: "选题日期/月份"
  subject:
    type: object
    required: false
    description: "主体信息对象"
  hot_topics:
    type: object
    required: false
    description: "热点信息对象"

system: |                        # System Prompt (Jinja2 模板)
  你是景区小红书的每月选题策划投流师...
  
  ## 选题规则
  1. 根据当前年历...

user: |                          # User Prompt (Jinja2 模板)
  请为以下景区/产品生成 {{ num_topics }} 个选题。
  
  {% if subject %}
  ## 主体信息
  - 名称:{{ subject.name }}
  {% endif %}

2.3 PromptRegistry API

from domain.prompt import PromptRegistry

# 初始化
registry = PromptRegistry('prompts')

# 获取 Prompt 配置
config = registry.get('topic_generate', 'v2.0.0')
config = registry.get('topic_generate', 'latest')  # 获取最新版本

# 渲染 Prompt
system_prompt, user_prompt = registry.render(
    'topic_generate',
    context={
        'num_topics': 5,
        'month': '2025-02',
        'subject': {...},
        'hot_topics': {...}
    },
    version='v2.0.0'
)

# 获取模型参数
model_params = config.get_model_params()
# {'temperature': 0.2, 'top_p': 0.3, 'presence_penalty': 1.5}

# 列出所有版本
versions = registry.list_versions('topic_generate')
# ['v1.0.0', 'v2.0.0']

# 获取元信息
meta = config.get_meta()
# {'name': 'topic_generate', 'version': '2.0.0', ...}

2.4 版本管理策略

版本 说明
v1.0.0 初始版本,基础功能
v2.0.0 新增热点信息、参考内容支持
latest 自动指向最新版本

版本选择逻辑

  1. 如果指定版本存在,使用指定版本
  2. 如果指定 latest,使用版本号最大的
  3. 如果版本不存在,抛出异常

3. AIGC 引擎系统

3.1 引擎架构

BaseAIGCEngine (基类)
├── TopicGenerateEngineV2    # 选题生成
├── ContentGenerateEngineV2  # 内容生成
└── PosterGenerateEngineV2   # 海报生成

3.2 引擎接口

class BaseAIGCEngine:
    engine_id: str           # 引擎 ID
    engine_name: str         # 引擎名称
    version: str             # 版本
    description: str         # 描述
    
    def get_param_schema(self) -> Dict[str, Any]:
        """定义参数结构"""
        pass
    
    def estimate_duration(self, params: Dict) -> int:
        """预估执行时间(秒)"""
        pass
    
    async def execute(self, params: Dict, task_id: str = None) -> EngineResult:
        """执行引擎"""
        pass

3.3 当前引擎状态

引擎 状态 Prompt 版本
topic_generate 可用 v1.0.0, v2.0.0
content_generate 可用 v1.0.0, v2.0.0
poster_generate ⚠️ 待修复 v1.0.0

4. 字段设计

4.1 Subject (主体信息)

参考 Java 端 ProductPackage 设计,合并景区和产品信息:

subject = {
    "id": 1,                              # 主体 ID
    "name": "北京环球影城",                # 名称 (packageName)
    "type": "scenic_spot",                # 类型
    "description": "亚洲最大的环球影城",   # 描述
    "location": "北京市通州区",            # 地址 (address)
    "highlights": ["哈利波特", "变形金刚"], # 亮点
    "traffic_info": "地铁1号线...",        # 交通指南
    "products": [                          # 产品列表
        {
            "id": 10,
            "name": "单日票",
            "price": 638,
            "original_price": 738,
            "description": "含一次入园",
            "sales_period": "2025-01-01 至 2025-03-31",
            "usage_rules": "...",
            "package_info": "..."
        }
    ]
}

与 Java ProductPackage 完整对应关系

Python subject Java ProductPackage 说明
id id 主键 ID
name packageName / scenicName 套餐/景区名称
type dataType 数据类型 (1景区/2产品/3套餐)
description description 详细描述
location address 地址
traffic_info trafficInfo 交通指南
highlights highlights 亮点
advantages advantages 优势/特色
products[].id productId 产品 ID
products[].name - 产品名称
products[].price realPrice 实际价格
products[].original_price originPrice 原价
products[].sales_period salesPeriod 售卖期
products[].usage_rules usageRules 使用规则
products[].package_info packageInfo 套票详情
products[].surcharge surcharge 加价说明
products[].reservation reservation 预约规则
products[].refund refund 退改政策
products[].discounts discounts 优惠内容

4.2 Reference (参考内容)

reference = {
    "mode": "reference",  # none / reference / rewrite
    "title": "参考标题",
    "content": "参考正文..."
}

4.3 内置参考文献库

当用户没有指定 reference 时,系统会自动加载内置参考文献库:

文件 内容 数量
prompts/reference/标题参考格式.json 爆款标题模板 100+
prompts/reference/正文范文参考.json 完整正文范例 10+

使用逻辑

  • 无 reference 或 mode: none → 随机抽取 20 个标题 + 3 篇范文
  • 有 reference (mode: reference/rewrite) → 使用用户指定的参考内容

Prompt 版本

  • v2.0.0: 支持用户指定参考内容
  • v2.1.0: 新增内置参考文献库自动加载

4.2.1 海报生成 (poster_generate)

状态: 可用 (方案 B 完成)

架构:

poster_generate_v2.py (v2.1.0)
    └── domain/poster/poster_service.py (轻量服务,无数据库依赖)
        └── poster/templates/*.py (模板渲染)

API 调用:

POST /api/v2/aigc/execute
{
  "engine": "poster_generate",
  "params": {
    "template_id": "vibrant",  # vibrant/business/collage
    "content": {"title": "...", "content": "...", "tag": "..."},
    "image_urls": ["https://..."],  # 可选
    "generate_fabric_json": false   # 可选
  }
}

后续计划: 方案 C 完整重构 (见 docs/POSTER_REFACTOR_PLAN.md)

4.2.2 热点数据模块

状态: 可用

支持平台:

  • 百度热搜 (含旅游榜)
  • 节日日历
  • 小红书 (MediaCrawler 集成,需扫码登录)
  • Bing 搜索
  • 微博热搜 ⚠️ (需要优化)

API 路由 (/api/v2/hotspot/):

  • GET /all - 获取所有来源
  • GET /baidu - 百度热搜 (实时 + 旅游榜)
  • GET /xiaohongshu - 小红书热门 (需登录)
  • GET /bing - Bing 搜索建议
  • GET /calendar - 节日日历
  • GET /travel - 旅游相关热点聚合
  • GET /trending - 热门话题合并
  • POST /custom - 添加自定义热点

MediaCrawler 集成:

详细文档: docs/HOTSPOT_MODULE.md

参考文献管理 API (/api/v2/reference/):

方法 路径 说明
GET /reference/list 获取统计信息
GET /reference/titles 获取标题列表 (支持 count/random 参数)
GET /reference/titles/{index} 获取指定标题
POST /reference/titles 添加新标题
PUT /reference/titles/{index} 更新标题
DELETE /reference/titles/{index} 删除标题
GET /reference/contents 获取正文范文列表
GET /reference/contents/{index} 获取指定范文
POST /reference/contents 添加新范文
PUT /reference/contents/{index} 更新范文
DELETE /reference/contents/{index} 删除范文
POST /reference/batch/add 批量添加
POST /reference/reload 刷新缓存

模式说明

模式 说明 适用场景
none 不使用参考 完全原创
reference 参考风格,原创内容 学习爆款风格
rewrite 保留框架,换主体 快速复制成功内容

4.3 Hot Topics (热点信息)

hot_topics = {
    "events": [                    # 热点事件
        {
            "title": "春节档电影热映",
            "source": "微博热搜",
            "heat_score": 98,
            "related_keywords": ["春节", "亲子"],
            "expire_date": "2025-02-28"
        }
    ],
    "festivals": [                 # 节日节气
        {
            "name": "春节",
            "date": "2025-01-29",
            "marketing_angle": "团圆、年味"
        }
    ],
    "trending": [                  # 趋势话题
        {
            "topic": "#春节去哪玩",
            "platform": "小红书",
            "trend_direction": "rising"
        }
    ]
}

5. API 接口

5.1 V2 统一 API

基础路径: /api/v2/aigc

方法 路径 说明
GET /engines 获取引擎列表
POST /execute 执行引擎
GET /config/styles 获取风格列表
GET /config/audiences 获取人群列表
GET /config/all 获取所有配置

5.2 执行引擎

POST /api/v2/aigc/execute
Content-Type: application/json

{
    "engine": "topic_generate",
    "params": {
        "month": "2025-02",
        "num_topics": 5,
        "subject": {...},
        "style": {"id": "gonglue", "name": "攻略风"},
        "audience": {"id": "qinzi", "name": "亲子向"},
        "hot_topics": {...}
    },
    "prompt_version": "v2.0.0"  // 可选
}

5.3 Prompt 管理 API

基础路径: /api/prompt

方法 路径 说明
GET /list 列出所有 Prompt
GET /{name}/versions 获取版本列表
GET /{name}/{version} 获取 Prompt 详情
POST /{name}/{version}/render 渲染 Prompt

6. 配置文件

6.1 风格配置 (config/styles.yaml)

styles:
  - id: gonglue
    name: 攻略风
    description: 实用信息为主,提供详细的游玩攻略
  - id: tuijian
    name: 极力推荐风
    description: 强烈推荐语气,突出产品优势

6.2 人群配置 (config/audiences.yaml)

audiences:
  - id: qinzi
    name: 亲子向
    description: 家庭出游,关注儿童友好设施
  - id: zhoubianyou
    name: 周边游
    description: 短途出行,追求性价比
  - id: gaoshe
    name: 高奢酒店
    description: 高端消费,追求品质体验

7. 待办事项

7.1 Python 端

  • 修复海报生成引擎依赖
  • 添加节日日历数据
  • 完善错误处理和日志

7.2 Java 端

  • 新增 AIGCConfigService
  • 改造 TopicGenerateServiceImpl
  • 改造 ContentGenerateServiceImpl
  • 更新 API 调用为 V2 接口

7.3 热点数据源 (规划中)

  • 节日日历 (静态数据)
  • 运营热点 (手动维护)
  • 微博热搜 API (可选)

8. 运行服务

cd /root/TravelContentCreator
PYTHONPATH=. python3 -m uvicorn api.main:app --host 0.0.0.0 --port 8001

健康检查

curl http://localhost:8001/health

测试选题生成

curl -X POST http://localhost:8001/api/v2/aigc/execute \
  -H "Content-Type: application/json" \
  -d '{
    "engine": "topic_generate",
    "params": {
      "month": "2025-02",
      "num_topics": 2,
      "subject": {
        "id": 1,
        "name": "北京环球影城",
        "products": [{"id": 10, "name": "单日票", "price": 638}]
      },
      "style": {"id": "gonglue", "name": "攻略风"},
      "audience": {"id": "qinzi", "name": "亲子向"}
    }
  }'