7.3 KiB
7.3 KiB
多轮对话功能实现文档
概述
本文档描述了基于 promptx/tauri-desktop-app-expert 开发规范实现的多轮对话功能。该功能扩展了现有的 Gemini API 集成,支持会话历史管理和上下文保持的多轮对话。
功能特性
🎯 核心功能
- 多轮对话支持: 支持历史消息传递给后端,构建完整的对话上下文
- 会话管理: 利用 session_id 进行会话生命周期管理
- 历史消息存储: 完整的会话历史持久化存储
- 上下文保持: 在多轮对话中保持对话上下文
- 类型安全: 完整的 TypeScript 类型定义
🏗️ 架构设计
遵循 Tauri 四层架构设计模式:
-
表现层 (Presentation Layer)
conversation_commands.rs: Tauri 命令处理- 前端 React 组件和页面
-
业务逻辑层 (Business Layer)
conversation_service.rs: 会话管理业务逻辑- 多轮对话处理逻辑
-
数据访问层 (Data Layer)
conversation_repository.rs: 会话数据访问conversation.rs: 数据模型定义
-
基础设施层 (Infrastructure Layer)
- 扩展的
gemini_service.rs: 支持多轮对话的 API 调用
- 扩展的
技术实现
后端实现 (Rust)
数据模型
// 会话消息
pub struct ConversationMessage {
pub id: String,
pub session_id: String,
pub role: MessageRole,
pub content: Vec<MessageContent>,
pub timestamp: DateTime<Utc>,
pub metadata: Option<serde_json::Value>,
}
// 会话会话
pub struct ConversationSession {
pub id: String,
pub title: Option<String>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub is_active: bool,
pub metadata: Option<serde_json::Value>,
}
API 结构修改
扩展了 Gemini API 的请求结构以支持多轮对话:
pub struct GenerateContentRequest {
pub contents: Vec<ContentPart>, // 支持多条历史消息
pub generation_config: GenerationConfig,
}
pub struct ContentPart {
pub role: String, // "user", "assistant", "system"
pub parts: Vec<Part>,
}
核心服务方法
impl ConversationService {
// 处理多轮对话
pub async fn process_multi_turn_conversation(
&self,
request: MultiTurnConversationRequest,
) -> Result<MultiTurnConversationResponse>
// 会话管理
pub async fn create_session(&self, request: CreateConversationSessionRequest) -> Result<ConversationSession>
pub async fn get_conversation_history(&self, query: ConversationHistoryQuery) -> Result<ConversationHistory>
}
前端实现 (TypeScript + React)
类型定义
// 多轮对话请求
export interface MultiTurnConversationRequest {
session_id?: string;
user_message: string;
include_history?: boolean;
max_history_messages?: number;
system_prompt?: string;
config?: Record<string, any>;
}
// 多轮对话响应
export interface MultiTurnConversationResponse {
session_id: string;
assistant_message: string;
message_id: string;
response_time_ms: number;
model_used: string;
metadata?: Record<string, any>;
}
服务层
export class ConversationService {
static async processMultiTurnConversation(
request: MultiTurnConversationRequest
): Promise<MultiTurnConversationResponse>
static async createSession(request: CreateConversationSessionRequest): Promise<ConversationSession>
static async getConversationHistory(query: ConversationHistoryQuery): Promise<ConversationHistory>
}
数据库设计
会话表 (conversation_sessions)
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)
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
);
使用示例
基本多轮对话
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);
会话管理
// 创建新会话
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: 后端单元测试
配置选项
多轮对话配置
interface MultiTurnConversationOptions {
sessionId?: string; // 会话ID
includeHistory?: boolean; // 是否包含历史消息
maxHistoryMessages?: number; // 最大历史消息数
systemPrompt?: string; // 系统提示词
temperature?: number; // 生成温度
maxTokens?: number; // 最大输出令牌数
timeout?: number; // 请求超时时间
}
会话清理配置
pub struct ConversationCleanupConfig {
pub max_inactive_days: u32, // 最大非活跃天数
pub max_messages_per_session: u32, // 每个会话最大消息数
pub auto_cleanup_enabled: bool, // 是否启用自动清理
}
性能优化
- 数据库索引: 为会话ID和时间戳创建索引以提高查询性能
- 消息限制: 支持限制历史消息数量以控制API请求大小
- 连接池: 使用数据库连接池提高并发性能
- 异步处理: 所有数据库操作都是异步的
安全考虑
- 输入验证: 严格验证用户输入和会话ID
- 权限控制: 遵循最小权限原则
- 数据加密: 敏感数据的安全存储
- 会话隔离: 确保会话之间的数据隔离
扩展性
该实现设计为可扩展的:
- 插件化: 支持自定义消息处理器
- 多模型支持: 可以轻松扩展支持其他AI模型
- 存储后端: 可以替换为其他数据库后端
- 消息类型: 支持文本、文件、内联数据等多种消息类型
开发规范遵循
- ✅ 遵循
promptx/tauri-desktop-app-expert开发规范 - ✅ 四层架构设计模式
- ✅ 类型安全的 TypeScript 实现
- ✅ 完整的错误处理和用户反馈
- ✅ 性能优化和安全防护
- ✅ 模块化和可维护的代码结构
未来改进
- 流式响应: 支持流式生成响应
- 消息搜索: 实现会话历史搜索功能
- 导出功能: 支持会话导出为各种格式
- 多用户支持: 扩展为多用户会话管理
- 实时同步: 支持多设备间的会话同步