554 lines
15 KiB
Markdown
554 lines
15 KiB
Markdown
# 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": "亲子向"}
|
||
}
|
||
}'
|
||
```
|