ai-robot-core/spec/ai-service/progress.md

171 lines
7.5 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.

---
feature_id: "AISVC"
title: "Python AI 中台ai-service进度追踪"
status: "in_progress"
version: "0.1.0"
last_updated: "2026-02-24"
---
# Python AI 中台进度追踪AISVC
## Phase 1: 基础设施FastAPI 框架与多租户基础)
- [x] T1.1 初始化 FastAPI 项目骨架,配置基础环境与日志(包含 X-Tenant-Id 记录) `[AC-AISVC-01]`
- [x] T1.2 实现 `X-Tenant-Id` Header 拦截器,校验必填性并注入 Request State `[AC-AISVC-10, AC-AISVC-12]`
- [x] T1.3 定义基础响应模型 `ErrorResponse` 与异常处理器Exception Handler `[AC-AISVC-03, AC-AISVC-04]`
- [ ] T1.4 初始化 PostgreSQL 数据库客户端SQLModel/SQLAlchemy支持租户隔离查询逻辑 `[AC-AISVC-11]`
- [ ] T1.5 初始化 Qdrant 客户端,封装按租户动态选择 Collection 的工具函数 `[AC-AISVC-10]`
- [x] T1.6 实现 `/ai/health` 健康检查接口 `[AC-AISVC-20]`
## Phase 2: 存储与检索实现Memory & Retrieval
- [ ] T2.1 实现 Memory 层:定义 `chat_sessions``chat_messages` SQLModel 实体 `[AC-AISVC-13]`
- [ ] T2.2 实现 Memory 层:完成基于 `(tenant_id, session_id)` 的历史消息加载与追加 API `[AC-AISVC-13]`
- [ ] T2.3 实现 Retrieval 层:定义 `BaseRetriever` 抽象基类(插件点预留) `[AC-AISVC-16]`
- [ ] T2.4 实现 `VectorRetriever`:集成 `qdrant-client` 完成向量检索,支持 scoreThreshold 过滤 `[AC-AISVC-16, AC-AISVC-17]`
- [ ] T2.5 编写 Memory 与 Retrieval 层的独立单元测试Mock 数据库与向量库) `[AC-AISVC-10, AC-AISVC-11]`
## Phase 3: 核心编排Orchestrator & LLM Adapter
- [ ] T3.1 实现 LLM Adapter封装 `langchain-openai` 或官方 SDK支持 `generate``stream_generate` `[AC-AISVC-02, AC-AISVC-06]`
- [ ] T3.2 实现 Orchestrator实现上下文合并逻辑H_local + H_ext 的去重与截断策略) `[AC-AISVC-14, AC-AISVC-15]`
- [ ] T3.3 实现 Orchestrator实现 RAG 检索不足时的置信度下调与 `shouldTransfer` 逻辑 `[AC-AISVC-17, AC-AISVC-18, AC-AISVC-19]`
- [ ] T3.4 实现 Orchestrator整合 Memory、Retrieval 与 LLM 完成 non-streaming 生成闭环 `[AC-AISVC-01, AC-AISVC-02]`
- [ ] T3.5 验证 non-streaming 响应字段完全符合 `openapi.provider.yaml` 契约 `[AC-AISVC-02]`
## Phase 4: 流式响应SSE 实现与状态机)
- [x] T4.1 在 API 层实现基于 `Accept` 头的响应模式自动切换逻辑 `[AC-AISVC-06]`**2026-02-24 完成**
- [x] T4.2 实现 SSE 事件生成器:根据 Orchestrator 的增量输出包装 `message` 事件 `[AC-AISVC-07]`**2026-02-24 完成**
- [x] T4.3 实现 SSE 状态机:确保 `final``error` 事件后连接正确关闭,且顺序不乱 `[AC-AISVC-08, AC-AISVC-09]`**2026-02-24 完成**
- [x] T4.4 实现流式输出过程中的异常捕获,并转化为 `event: error` 输出 `[AC-AISVC-09]`**2026-02-24 完成**
## Phase 5: 集成与冒烟测试Quality Assurance
- [ ] T5.1 编写集成测试:模拟多租户并发请求,验证数据存储与检索的严格物理/逻辑隔离 `[AC-AISVC-10, AC-AISVC-11]`
- [ ] T5.2 编写 RAG 冒烟测试:模拟"检索命中"与"检索未命中"两种场景,验证 confidence 变化与回复兜底 `[AC-AISVC-17, AC-AISVC-18]`
- [ ] T5.3 契约测试:使用外部工具(如 Schemathesis 或 Newman验证 provider 契约一致性L2 级自检) `[AC-AISVC-01, AC-AISVC-02]`
---
## T4.1 完成详情
### 实现内容
1. **FastAPI 项目骨架** (`ai-service/app/`)
- 配置管理 (`app/core/config.py`)
- 日志配置
- 异常处理器 (`app/core/exceptions.py`)
2. **数据模型** (`app/models/__init__.py`)
- `ChatRequest` - 请求模型
- `ChatResponse` - 响应模型(含 reply/confidence/shouldTransfer
- `ErrorResponse` - 错误响应模型
- SSE 事件模型SSEMessageEvent, SSEFinalEvent, SSEErrorEvent
3. **X-Tenant-Id Header 拦截器** (`app/core/middleware.py`)
- [AC-AISVC-10] 租户上下文注入
- [AC-AISVC-12] 缺失 tenant_id 返回 400 错误
4. **Accept 头响应模式切换** (`app/api/chat.py`)
- [AC-AISVC-06] 根据 Accept 头自动切换 JSON/SSE 模式
- `Accept: text/event-stream` → SSE 流式响应
- 其他 → JSON 响应
5. **SSE 基础设施** (`app/core/sse.py`)
- SSE 状态机INIT → STREAMING → FINAL_SENT/ERROR_SENT → CLOSED
- 事件生成器message/final/error
- Ping 保活机制15s 间隔)
6. **单元测试** (`tests/test_accept_switching.py`)
- JSON 响应模式测试
- SSE 响应模式测试
- SSE 事件序列测试
- 租户隔离测试
- 状态机测试
### 测试结果
```
24 passed in 2.52s
```
### 验收标准覆盖
- [x] AC-AISVC-01: HTTP POST /ai/chat 调用
- [x] AC-AISVC-02: 响应包含 reply/confidence/shouldTransfer
- [x] AC-AISVC-03: 参数错误返回 400
- [x] AC-AISVC-06: Accept 头切换 SSE 模式
- [x] AC-AISVC-10: tenantId 贯穿隔离
- [x] AC-AISVC-12: 缺 tenantId 返回 400
- [x] AC-AISVC-20: 健康检查接口
---
## T4.2 完成详情
### 实现内容
1. **Orchestrator 流式输出优化** (`app/services/orchestrator.py`)
- [AC-AISVC-07] 集成 LLM 客户端流式输出
- 支持依赖注入 LLM 客户端
- 实现 `_stream_from_llm()` 方法包装 LLM chunk 为 message 事件
- 实现 `_stream_mock_response()` 模拟流式输出
- SSE 事件序列message* -> final -> close
2. **SSE 事件生成器** (`app/core/sse.py`)
- `create_message_event(delta)` - 创建 message 事件,包含增量内容
- `create_final_event()` - 创建 final 事件,包含完整响应
- `create_error_event()` - 创建 error 事件
- 修复 `by_alias=True` 确保 JSON 字段使用 camelCase
3. **单元测试** (`tests/test_sse_events.py`)
- message 事件格式测试
- unicode 内容测试
- final 事件格式测试
- error 事件格式测试
- Orchestrator 流式输出测试
- LLM 客户端集成测试
- 状态机集成测试
### 测试结果
```
79 passed in 3.11s
```
### 验收标准覆盖
- [x] AC-AISVC-07: AI 中台多次发送 event: message 事件,每次携带增量文本(delta)
- [x] AC-AISVC-08: 生成完成后发送 event: final 事件
- [x] AC-AISVC-09: 错误时发送 event: error 事件
---
## T4.3 & T4.4 完成详情
### 实现内容
1. **API 层状态机集成** (`app/api/chat.py`)
- [AC-AISVC-08, AC-AISVC-09] 在 `_handle_streaming_request` 中集成状态机
- 状态机确保事件顺序message* -> final/error -> close
- 禁止 final/error 后发送任何事件
- 异常自动转换为 error 事件
2. **状态机行为保证**
- `INIT -> STREAMING`: 开始流式输出
- `STREAMING -> FINAL_SENT`: 发送 final 后关闭
- `STREAMING -> ERROR_SENT`: 发送 error 后关闭
- `FINAL_SENT/ERROR_SENT -> CLOSED`: 最终关闭状态
- 线程安全:使用 asyncio.Lock 保证并发安全
3. **异常处理机制**
- 流式输出过程中的任何异常都被捕获
- 异常自动转换为 `event: error` 事件
- 确保 error 事件只发送一次
- 连接在 error 后正确关闭
4. **单元测试** (`tests/test_sse_state_machine.py`)
- 状态机转换测试9 个测试)
- SSE 事件序列测试3 个测试)
- 错误处理测试3 个测试)
- 并发安全测试2 个测试)
- Orchestrator 集成测试2 个测试)
### 测试结果
```
117 passed in 4.24s
```
### 验收标准覆盖
- [x] AC-AISVC-08: 生成完成后发送一次 event: final随后关闭连接
- [x] AC-AISVC-09: 错误时发送 event: error并终止事件流