145 lines
5.8 KiB
Markdown
145 lines
5.8 KiB
Markdown
# V1 数据库设计文档
|
||
|
||
## 1. 数据库设计目标
|
||
|
||
V1 数据库设计优先服务本地演示、讲解清晰和快速改题。数据模型只覆盖文件、对话、审计和简单示例业务数据,不引入复杂权限、多租户或工作流状态机。
|
||
|
||
## 2. 数据库选型
|
||
|
||
默认使用 SQLite,数据库文件位于 `data/db.sqlite3`。SQLite 适合复试现场单机运行,便于 Docker 挂载和备份。
|
||
|
||
后续如需多人协作或更正式部署,可通过 Django settings 切换到 PostgreSQL,但 V1 不强制实现。
|
||
|
||
## 3. 表结构总览
|
||
|
||
| 表 | Django Model | 模块 | 说明 |
|
||
|---|---|---|---|
|
||
| uploaded_document | `UploadedDocument` | Documents | 上传文件元数据和入库状态 |
|
||
| agent_audit_log | `AgentAuditLog` | Audit | Agent 执行审计快照 |
|
||
| demo_business_record | `DemoBusinessRecord` | Agent Core / Tools | 内置工具可查询的模拟业务数据 |
|
||
| chat_session | `ChatSession` | Chat | 可选,对话会话 |
|
||
| chat_message | `ChatMessage` | Chat | 可选,对话消息 |
|
||
|
||
## 4. UploadedDocument 表设计
|
||
|
||
| 字段 | 类型 | 约束 | 说明 |
|
||
|---|---|---|---|
|
||
| id | BigAutoField | PK | 主键 |
|
||
| scenario_id | CharField(100) | indexed | 关联场景 ID |
|
||
| original_name | CharField(255) | required | 原始文件名 |
|
||
| file | FileField | required | 文件相对路径 |
|
||
| file_type | CharField(20) | required | `txt`、`md`、`pdf`、`docx` 等 |
|
||
| size | PositiveIntegerField | default 0 | 字节数 |
|
||
| status | CharField(20) | indexed | `uploaded`、`indexed`、`failed` |
|
||
| error_message | TextField | blank | 入库失败原因 |
|
||
| created_at | DateTimeField | auto_now_add | 上传时间 |
|
||
| updated_at | DateTimeField | auto_now | 更新时间 |
|
||
|
||
状态流转:
|
||
|
||
```text
|
||
uploaded -> indexed
|
||
uploaded -> failed
|
||
failed -> indexed
|
||
failed -> failed
|
||
```
|
||
|
||
重新入库时应按文档维度覆盖或清理旧 chunk,避免同一文件重复出现在向量检索结果中。文档选择范围由 Chat 表单本次提交的 `document_ids` 传入 Agent Core,V1 不需要为该选择单独建表。
|
||
|
||
## 5. AgentAuditLog 表设计
|
||
|
||
| 字段 | 类型 | 约束 | 说明 |
|
||
|---|---|---|---|
|
||
| id | BigAutoField | PK | 主键 |
|
||
| scenario_id | CharField(100) | indexed | 场景 ID |
|
||
| scenario_name | CharField(200) | blank | 场景名称快照 |
|
||
| user_input | TextField | required | 用户输入 |
|
||
| retrieved_chunks | JSONField | default list | RAG 引用片段 |
|
||
| tool_calls | JSONField | default list | 工具调用记录 |
|
||
| structured_output | JSONField | default dict | 结构化输出 |
|
||
| final_answer | TextField | blank | 最终回答 |
|
||
| raw_output | TextField | blank | 模型原始输出 |
|
||
| model_name | CharField(100) | blank | 模型名称 |
|
||
| latency_ms | PositiveIntegerField | default 0 | 执行耗时 |
|
||
| status | CharField(20) | indexed | `success`、`failed` |
|
||
| error_message | TextField | blank | 错误信息 |
|
||
| created_at | DateTimeField | auto_now_add, indexed | 创建时间 |
|
||
|
||
审计日志保存的是执行快照,不依赖场景配置后续是否被修改。
|
||
|
||
## 6. DemoBusinessRecord 表设计
|
||
|
||
| 字段 | 类型 | 约束 | 说明 |
|
||
|---|---|---|---|
|
||
| id | BigAutoField | PK | 主键 |
|
||
| scenario_id | CharField(100) | indexed | 适用场景 |
|
||
| record_type | CharField(100) | indexed | 记录类型,如 defect、ticket、invoice |
|
||
| title | CharField(255) | required | 标题 |
|
||
| payload | JSONField | default dict | 模拟业务数据 |
|
||
| created_at | DateTimeField | auto_now_add | 创建时间 |
|
||
|
||
该表为 V1 必需表,用于 `query_demo_records` 工具,避免工具只能返回硬编码数据。Django Admin 可以管理该表的数据,场景 YAML 仍不在 Admin 中编辑。
|
||
|
||
## 7. ChatSession 表设计
|
||
|
||
V1 可先不实现会话持久化。如果实现,字段建议如下:
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|---|---|---|
|
||
| id | BigAutoField | 主键 |
|
||
| scenario_id | CharField(100) | 场景 ID |
|
||
| title | CharField(255) | 会话标题 |
|
||
| created_at | DateTimeField | 创建时间 |
|
||
| updated_at | DateTimeField | 更新时间 |
|
||
|
||
## 8. ChatMessage 表设计
|
||
|
||
V1 可通过审计日志满足演示追踪,不强制实现消息表。如果实现,字段建议如下:
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|---|---|---|
|
||
| id | BigAutoField | 主键 |
|
||
| session | ForeignKey(ChatSession) | 所属会话 |
|
||
| role | CharField(20) | `user`、`assistant`、`system` |
|
||
| content | TextField | 消息内容 |
|
||
| audit_log | ForeignKey(AgentAuditLog, null=True) | 关联审计 |
|
||
| created_at | DateTimeField | 创建时间 |
|
||
|
||
## 9. 表关系设计
|
||
|
||
```text
|
||
Scenario YAML
|
||
|-- scenario_id
|
||
|-- UploadedDocument.scenario_id
|
||
|-- AgentAuditLog.scenario_id
|
||
|-- DemoBusinessRecord.scenario_id
|
||
|-- ChatSession.scenario_id
|
||
|
||
ChatSession 1 -- N ChatMessage
|
||
ChatMessage 0/1 -- 1 AgentAuditLog
|
||
```
|
||
|
||
场景配置 V1 存在 YAML 中,不建 `Scenario` 数据表。这样更方便复试现场复制和修改配置文件。
|
||
|
||
## 10. 索引设计
|
||
|
||
- `UploadedDocument(scenario_id, status)`:用于按场景查看文件和入库状态。
|
||
- `AgentAuditLog(scenario_id, created_at)`:用于按场景查看最近日志。
|
||
- `AgentAuditLog(status, created_at)`:用于排查失败日志。
|
||
- `DemoBusinessRecord(scenario_id, record_type)`:用于工具查询模拟数据。
|
||
|
||
## 11. 数据初始化策略
|
||
|
||
- 场景初始化:读取 `configs/*.yaml`,不写数据库。
|
||
- 示例业务数据:可提供 Django management command 初始化 `DemoBusinessRecord`。
|
||
- 超级用户:本地演示可手动创建,Docker 可通过说明引导创建。
|
||
- 上传文件和 Chroma 数据:存放在 `data/` 下,通过 Docker volume 持久化。
|
||
|
||
## 12. 后续扩展方向
|
||
|
||
- 增加 `Scenario` 表,实现后台编辑场景。
|
||
- 增加 `ToolCallLog` 独立表,用于复杂工具审计。
|
||
- 使用 PostgreSQL JSONB 优化 JSON 查询。
|
||
- 增加用户和权限模型。
|
||
- 增加文档 chunk 元数据表,便于从数据库追踪向量库内容。
|