diff --git a/MULTI_TURN_CONVERSATION_FEATURE.md b/MULTI_TURN_CONVERSATION_FEATURE.md new file mode 100644 index 0000000..8a3be7c --- /dev/null +++ b/MULTI_TURN_CONVERSATION_FEATURE.md @@ -0,0 +1,263 @@ +# 多轮对话功能实现文档 + +## 概述 + +本文档描述了基于 `promptx/tauri-desktop-app-expert` 开发规范实现的多轮对话功能。该功能扩展了现有的 Gemini API 集成,支持会话历史管理和上下文保持的多轮对话。 + +## 功能特性 + +### 🎯 核心功能 +- **多轮对话支持**: 支持历史消息传递给后端,构建完整的对话上下文 +- **会话管理**: 利用 session_id 进行会话生命周期管理 +- **历史消息存储**: 完整的会话历史持久化存储 +- **上下文保持**: 在多轮对话中保持对话上下文 +- **类型安全**: 完整的 TypeScript 类型定义 + +### 🏗️ 架构设计 +遵循 Tauri 四层架构设计模式: + +1. **表现层 (Presentation Layer)** + - `conversation_commands.rs`: Tauri 命令处理 + - 前端 React 组件和页面 + +2. **业务逻辑层 (Business Layer)** + - `conversation_service.rs`: 会话管理业务逻辑 + - 多轮对话处理逻辑 + +3. **数据访问层 (Data Layer)** + - `conversation_repository.rs`: 会话数据访问 + - `conversation.rs`: 数据模型定义 + +4. **基础设施层 (Infrastructure Layer)** + - 扩展的 `gemini_service.rs`: 支持多轮对话的 API 调用 + +## 技术实现 + +### 后端实现 (Rust) + +#### 数据模型 +```rust +// 会话消息 +pub struct ConversationMessage { + pub id: String, + pub session_id: String, + pub role: MessageRole, + pub content: Vec, + pub timestamp: DateTime, + pub metadata: Option, +} + +// 会话会话 +pub struct ConversationSession { + pub id: String, + pub title: Option, + pub created_at: DateTime, + pub updated_at: DateTime, + pub is_active: bool, + pub metadata: Option, +} +``` + +#### API 结构修改 +扩展了 Gemini API 的请求结构以支持多轮对话: + +```rust +pub struct GenerateContentRequest { + pub contents: Vec, // 支持多条历史消息 + pub generation_config: GenerationConfig, +} + +pub struct ContentPart { + pub role: String, // "user", "assistant", "system" + pub parts: Vec, +} +``` + +#### 核心服务方法 +```rust +impl ConversationService { + // 处理多轮对话 + pub async fn process_multi_turn_conversation( + &self, + request: MultiTurnConversationRequest, + ) -> Result + + // 会话管理 + pub async fn create_session(&self, request: CreateConversationSessionRequest) -> Result + pub async fn get_conversation_history(&self, query: ConversationHistoryQuery) -> Result +} +``` + +### 前端实现 (TypeScript + React) + +#### 类型定义 +```typescript +// 多轮对话请求 +export interface MultiTurnConversationRequest { + session_id?: string; + user_message: string; + include_history?: boolean; + max_history_messages?: number; + system_prompt?: string; + config?: Record; +} + +// 多轮对话响应 +export interface MultiTurnConversationResponse { + session_id: string; + assistant_message: string; + message_id: string; + response_time_ms: number; + model_used: string; + metadata?: Record; +} +``` + +#### 服务层 +```typescript +export class ConversationService { + static async processMultiTurnConversation( + request: MultiTurnConversationRequest + ): Promise + + static async createSession(request: CreateConversationSessionRequest): Promise + static async getConversationHistory(query: ConversationHistoryQuery): Promise +} +``` + +## 数据库设计 + +### 会话表 (conversation_sessions) +```sql +CREATE TABLE conversation_sessions ( + id TEXT PRIMARY KEY, + title TEXT, + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL, + is_active BOOLEAN NOT NULL DEFAULT 1, + metadata TEXT +); +``` + +### 消息表 (conversation_messages) +```sql +CREATE TABLE conversation_messages ( + id TEXT PRIMARY KEY, + session_id TEXT NOT NULL, + role TEXT NOT NULL, + content TEXT NOT NULL, + timestamp TEXT NOT NULL, + metadata TEXT, + FOREIGN KEY (session_id) REFERENCES conversation_sessions (id) ON DELETE CASCADE +); +``` + +## 使用示例 + +### 基本多轮对话 +```typescript +import { ConversationService, MultiTurnConversationHelper } from '../services/conversationService'; + +// 创建对话请求 +const request = MultiTurnConversationHelper.createTextConversationRequest( + "你好,请介绍一下自己", + sessionId, // 可选,如果为空会创建新会话 + { + includeHistory: true, + maxHistoryMessages: 20, + systemPrompt: "你是一个友好的AI助手" + } +); + +// 处理多轮对话 +const response = await ConversationService.processMultiTurnConversation(request); +console.log(response.assistant_message); +``` + +### 会话管理 +```typescript +// 创建新会话 +const session = await ConversationService.createSession({ + title: "新的对话", + metadata: { topic: "技术讨论" } +}); + +// 获取会话历史 +const history = await ConversationService.getConversationHistory({ + session_id: session.id, + limit: 50, + include_system_messages: false +}); +``` + +## 测试组件 + +项目包含了完整的测试组件: + +- `MultiTurnChatTest.tsx`: 多轮对话测试界面 +- `MultiTurnChatTestPage.tsx`: 测试页面 +- `conversation_service_test.rs`: 后端单元测试 + +## 配置选项 + +### 多轮对话配置 +```typescript +interface MultiTurnConversationOptions { + sessionId?: string; // 会话ID + includeHistory?: boolean; // 是否包含历史消息 + maxHistoryMessages?: number; // 最大历史消息数 + systemPrompt?: string; // 系统提示词 + temperature?: number; // 生成温度 + maxTokens?: number; // 最大输出令牌数 + timeout?: number; // 请求超时时间 +} +``` + +### 会话清理配置 +```rust +pub struct ConversationCleanupConfig { + pub max_inactive_days: u32, // 最大非活跃天数 + pub max_messages_per_session: u32, // 每个会话最大消息数 + pub auto_cleanup_enabled: bool, // 是否启用自动清理 +} +``` + +## 性能优化 + +1. **数据库索引**: 为会话ID和时间戳创建索引以提高查询性能 +2. **消息限制**: 支持限制历史消息数量以控制API请求大小 +3. **连接池**: 使用数据库连接池提高并发性能 +4. **异步处理**: 所有数据库操作都是异步的 + +## 安全考虑 + +1. **输入验证**: 严格验证用户输入和会话ID +2. **权限控制**: 遵循最小权限原则 +3. **数据加密**: 敏感数据的安全存储 +4. **会话隔离**: 确保会话之间的数据隔离 + +## 扩展性 + +该实现设计为可扩展的: + +1. **插件化**: 支持自定义消息处理器 +2. **多模型支持**: 可以轻松扩展支持其他AI模型 +3. **存储后端**: 可以替换为其他数据库后端 +4. **消息类型**: 支持文本、文件、内联数据等多种消息类型 + +## 开发规范遵循 + +- ✅ 遵循 `promptx/tauri-desktop-app-expert` 开发规范 +- ✅ 四层架构设计模式 +- ✅ 类型安全的 TypeScript 实现 +- ✅ 完整的错误处理和用户反馈 +- ✅ 性能优化和安全防护 +- ✅ 模块化和可维护的代码结构 + +## 未来改进 + +1. **流式响应**: 支持流式生成响应 +2. **消息搜索**: 实现会话历史搜索功能 +3. **导出功能**: 支持会话导出为各种格式 +4. **多用户支持**: 扩展为多用户会话管理 +5. **实时同步**: 支持多设备间的会话同步