205 lines
4.5 KiB
Markdown
205 lines
4.5 KiB
Markdown
# Phase 4: 数据流追踪指南
|
||
|
||
**执行时间**:约 1-2 分钟
|
||
|
||
**目标**:追踪核心数据的转换链路
|
||
|
||
---
|
||
|
||
## ⚠️ 重要约束
|
||
|
||
**在调用 Task tool 时,必须在 prompt 开头包含以下约束:**
|
||
|
||
```
|
||
⚠️ 重要约束:本次分析只返回文本结果,禁止生成任何文件(.md, .txt 等)。
|
||
所有 Mermaid 图表、数据模型清单、转换链路都应包含在你的文本回复中,不要使用 Write 或其他文件创建工具。
|
||
```
|
||
|
||
**Explore agent 只返回文本结果,不要生成任何文件。**
|
||
|
||
---
|
||
|
||
## 分析步骤
|
||
|
||
### 步骤 1: 识别核心数据模型
|
||
|
||
使用 Grep 工具搜索数据模型定义:
|
||
|
||
#### Python 项目
|
||
|
||
```bash
|
||
# Pydantic 模型
|
||
grep -r "class.*BaseModel" --include="*.py"
|
||
|
||
# Dataclass
|
||
grep -r "@dataclass" --include="*.py"
|
||
|
||
# SQLAlchemy 模型
|
||
grep -r "class.*Base" --include="*.py"
|
||
```
|
||
|
||
#### TypeScript 项目
|
||
|
||
```bash
|
||
# Interface 定义
|
||
grep -r "interface.*{" --include="*.ts"
|
||
|
||
# Type 别名
|
||
grep -r "type.*=" --include="*.ts"
|
||
|
||
# Class 定义
|
||
grep -r "export class" --include="*.ts"
|
||
```
|
||
|
||
#### Go 项目
|
||
|
||
```bash
|
||
# Struct 定义
|
||
grep -r "type.*struct" --include="*.go"
|
||
```
|
||
|
||
### 步骤 2: 追踪数据转换
|
||
|
||
1. **定位数据入口**
|
||
- 从 API 端点的请求体开始
|
||
- 识别请求参数的类型定义
|
||
|
||
2. **追踪转换链路**
|
||
- 读取每个业务函数的参数类型和返回值类型
|
||
- 记录每次类型转换的代码位置
|
||
- 识别数据验证、清洗、增强步骤
|
||
|
||
3. **标注关键转换点**
|
||
- 序列化/反序列化
|
||
- 数据库 ORM 映射
|
||
- DTO(Data Transfer Object)转换
|
||
- 业务逻辑处理
|
||
|
||
### 步骤 3: 生成序列图
|
||
|
||
使用 `assets/sequence.mermaid` 模板生成 Mermaid 序列图。
|
||
|
||
**⚠️ sequenceDiagram 语法约束(版本 11.x)**:
|
||
- `alt/loop/par` 块必须正确配对 `end`
|
||
- 使用 `<br/>` 换行
|
||
|
||
---
|
||
|
||
## 预期输出格式
|
||
|
||
### 1. Mermaid 序列图
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant U as 用户
|
||
participant F as Frontend
|
||
participant B as Backend
|
||
participant R as Researcher
|
||
participant W as Writer
|
||
|
||
U->>F: 输入查询 "AI 发展趋势"
|
||
F->>B: POST /api/research<br/>{query, depth: 3}
|
||
Note over B: 构造 ResearchTask
|
||
B->>R: invoke(ResearchTask)
|
||
R->>R: 搜索引擎调用
|
||
R-->>B: SearchResults (10 个文档)
|
||
B->>W: 传递 SearchResults
|
||
W->>W: GPT-4 生成报告
|
||
W-->>B: Report (2000 字)
|
||
B->>F: 返回 HTML
|
||
F->>U: 展示报告
|
||
```
|
||
|
||
### 2. 数据模型清单
|
||
|
||
列出所有核心数据模型及其位置:
|
||
|
||
```
|
||
核心数据模型:
|
||
1. ResearchTask (models/task.py:8)
|
||
- 用途: 用户查询任务
|
||
- 字段: query: str, depth: int, filters: Optional[List[str]]
|
||
|
||
2. SearchResults (models/results.py:15)
|
||
- 用途: 搜索结果集合
|
||
- 字段: documents: List[Document], total: int, timestamp: datetime
|
||
|
||
3. Report (models/report.py:22)
|
||
- 用途: 最终生成的报告
|
||
- 字段: content: str, score: float, metadata: Dict[str, Any]
|
||
```
|
||
|
||
### 3. 数据转换链路
|
||
|
||
```
|
||
数据流转路径:
|
||
用户输入 (str)
|
||
→ ResearchTask (构造于 backend/routes.py:42)
|
||
→ SearchResults (返回于 agents/researcher.py:67)
|
||
→ Report (生成于 agents/writer.py:89)
|
||
→ HTML (渲染于 backend/routes.py:58)
|
||
→ 前端展示
|
||
```
|
||
|
||
---
|
||
|
||
## 分析技巧
|
||
|
||
### 1. 类型提示追踪
|
||
|
||
Python 示例:
|
||
```python
|
||
# 从函数签名追踪类型流转
|
||
def process_query(task: ResearchTask) -> SearchResults:
|
||
# task 类型: ResearchTask
|
||
results = search_engine.search(task.query)
|
||
# results 类型: SearchResults
|
||
return results
|
||
```
|
||
|
||
TypeScript 示例:
|
||
```typescript
|
||
// 从接口定义追踪
|
||
interface ApiRequest {
|
||
query: string;
|
||
depth: number;
|
||
}
|
||
|
||
async function handleRequest(req: ApiRequest): Promise<Report> {
|
||
// req 类型: ApiRequest
|
||
const results = await research(req);
|
||
// results 类型: Report
|
||
return results;
|
||
}
|
||
```
|
||
|
||
### 2. ORM 映射识别
|
||
|
||
SQLAlchemy 示例:
|
||
```python
|
||
# 数据库模型 → Pydantic 模型
|
||
class UserDB(Base):
|
||
__tablename__ = "users"
|
||
id = Column(Integer, primary_key=True)
|
||
|
||
class UserSchema(BaseModel):
|
||
id: int
|
||
# 从 UserDB 转换到 UserSchema
|
||
```
|
||
|
||
### 3. DTO 转换模式
|
||
|
||
```python
|
||
# 请求 DTO → 领域对象 → 响应 DTO
|
||
RequestDTO → DomainModel → ResponseDTO
|
||
```
|
||
|
||
---
|
||
|
||
## 注意事项
|
||
|
||
1. **关注核心路径**:只追踪主要业务流程的数据转换,忽略辅助功能
|
||
2. **最多 5 层深度**:避免追踪过深导致图表过于复杂
|
||
3. **标注转换位置**:每次类型转换都记录文件名和行号
|
||
4. **区分同步/异步**:在序列图中用实线(同步)和虚线(异步)区分
|