TravelContentCreator/docs/PROJECT_STATUS.md

554 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 结构
```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
```python
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 引擎接口
```python
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` 设计,合并景区和产品信息:
```python
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 (参考内容)
```python
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 调用**:
```bash
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 集成**:
- 位置: `libs/MediaCrawler/`
- 来源: https://github.com/NanmiCoder/MediaCrawler
- 支持: 小红书、抖音、微博、B站、快手、知乎、贴吧
**详细文档**: `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 (热点信息)
```python
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 执行引擎
```bash
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)
```yaml
styles:
- id: gonglue
name: 攻略风
description: 实用信息为主,提供详细的游玩攻略
- id: tuijian
name: 极力推荐风
description: 强烈推荐语气,突出产品优势
```
### 6.2 人群配置 (config/audiences.yaml)
```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. 运行服务
```bash
cd /root/TravelContentCreator
PYTHONPATH=. python3 -m uvicorn api.main:app --host 0.0.0.0 --port 8001
```
**健康检查**
```bash
curl http://localhost:8001/health
```
**测试选题生成**
```bash
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": "亲子向"}
}
}'
```