Dify 中的对话系统负责管理用户与人工智能应用之间的对话(聊天会话)以及所交换的消息。**它处理对话状态、历史记录跟踪、消息存储,以及用户反馈和注释等相关功能。**该系统是一个核心组件,与用于人工智能模型交互的模型提供方系统以及用于知识检索的 RAG 知识系统协同工作。
概述
对话系统管理用户与人工智能应用之间的交互,并对这些交互进行持续记录。它支持不同的应用类型(聊天、文本生成、基于智能体的交互和工作流驱动的交互),并为终端用户和管理员提供了与对话历史记录进行交互的机制。

核心数据模型
对话系统围绕两个主要数据模型构建:对话(Conversation)和消息(Message)。
对话模型
对话模型表示用户与人工智能应用之间的完整聊天会话。
关键属性包括:
| 属性 | 描述 |
|---|---|
| id | 对话的唯一标识符 |
| app_id | 关联的应用程序 ID |
| app_model_config_id | 人工智能模型的配置 ID |
| mode | 应用模式(聊天、文本生成、智能体聊天等) |
| name | 对话的显示名称 |
| summary | 对话的简要摘要 |
| inputs | 对话的输入变量 |
| status | 当前对话状态 |
| from_source | 对话的来源(API、控制台等) |
| from_end_user_id | 终端用户的 ID(如果适用) |
| from_account_id | 账户用户的 ID(如果适用) |
| dialogue_count | 对话交流的次数 |
| created_at | 创建时间戳 |
| updated_at | 最后更新时间戳 |
| is_deleted | 软删除标志 |
对话模型与以下内容存在关系:
- 消息(一对多)
- 消息注释(一对多)
- 应用(多对一)
消息模型
消息模型表示对话中的单个交流内容。
关键属性包括:
| 属性 | 描述 |
|---|---|
| id | 消息的唯一标识符 |
| app_id | 关联的应用程序 ID |
| conversation_id | 所属对话的 ID |
| inputs | 此消息的输入变量 |
| query | 用户查询 / 提示 |
| message | 原始消息内容(通常为 JSON 格式) |
| answer | 人工智能的回复文本 |
| message_tokens | 输入的令牌数量 |
| answer_tokens | 输出的令牌数量 |
| provider_response_latency | 模型提供方的响应时间 |
| status | 消息状态 |
| from_source | 消息的来源 |
| from_end_user_id | 终端用户的 ID(如果适用) |
| from_account_id | 账户用户的 ID(如果适用) |
| parent_message_id | 对于线程消息,为父消息的 ID |
| created_at | 创建时间戳 |
| workflow_run_id | 关联的工作流运行 ID(如果适用) |
| agent_based | 基于智能体交互的标志 |
数据库模式
此图展示了对话系统中核心数据模型之间的关系:

对话生命周期
创建
当用户与人工智能应用发起交互时,会创建对话。创建过程因应用模式而异:
- 聊天模式:在聊天会话开始时创建
- 文本生成模式:为每个文本生成请求创建
- 智能体聊天模式:为基于智能体的交互创建
- 工作流模式:创建并关联到一个工作流运行
交互流程

服务层
对话系统通过多个服务类进行管理:
对话服务(ConversationService)
处理管理对话的核心功能:
- 检索对话的分页功能
- 对话删除(软删除)
- 对话重命名(包括自动生成)
- 单个对话的检索
ConversationService 中的关键方法:
pagination_by_last_id(session, app_model, user, last_id, limit, invoke_from, sort_by)
rename(app_model, conversation_id, user, name, auto_generate)
delete(app_model, conversation_id, user)
get_conversation(app_model, conversation_id, user)
Web 对话服务(WebConversationService)
在对话服务的基础上扩展了 Web 特定的功能:
- 固定 / 取消固定对话
- 按固定状态过滤对话
WebConversationService 中的关键方法:
pagination_by_last_id(session, app_model, user, last_id, limit, invoke_from, pinned, sort_by)
pin(app_model, conversation_id, user)
unpin(app_model, conversation_id, user)
API 端点
对话系统通过多个 API 端点提供不同的用例:
控制台 API
用于管理访问,包括查看和管理所有对话:
| 端点 | 方法 | 描述 |
|---|---|---|
| /apps/<app_id>/chat-conversations | GET | 列出聊天对话 |
| /apps/<app_id>/chat-conversations/<conversation_id> | GET | 获取聊天对话详情 |
| /apps/<app_id>/chat-conversations/<conversation_id> | DELETE | 删除一个聊天对话 |
| /apps/<app_id>/completion-conversations | GET | 列出文本生成对话 |
| /apps/<app_id>/completion-conversations/<conversation_id> | GET | 获取文本生成对话详情 |
| /apps/<app_id>/completion-conversations/<conversation_id> | DELETE | 删除一个文本生成对话 |
服务 API
用于以编程方式访问对话:
| 端点 | 方法 | 描述 |
|---|---|---|
| /conversations | GET | 列出用户的对话 |
| /conversations/<conversation_id> | DELETE | 删除一个对话 |
| /conversations/<conversation_id>/name | POST | 重命名一个对话 |
Web API
用于 Web 应用程序访问:
| 端点 | 方法 | 描述 |
|---|---|---|
| /conversations | GET | 列出用户的对话 |
| /conversations/<conversation_id> | DELETE | 删除一个对话 |
| /conversations/<conversation_id>/name | POST | 重命名一个对话 |
| /conversations/<conversation_id>/pin | PATCH | 固定一个对话 |
| /conversations/<conversation_id>/unpin | PATCH | 取消固定一个对话 |
特殊功能
对话固定
用户可以固定重要对话以便更轻松地访问。这通过固定对话模型(PinnedConversation model)和 Web 对话服务方法实现:
- 固定对话:
WebConversationService.pin (app_model, conversation_id, user) - 取消固定对话:
WebConversationService.unpin (app_model, conversation_id, user)
消息反馈和注释
用户和管理员可以对消息提供反馈并添加注释(修正或改进内容):
- 反馈:点赞 / 点踩评分,并可添加评论
- 注释:由管理员提供的修正或附加信息

文件附件
消息可以包含文件附件,支持多种文件类型:
- 用于视觉模型的图像
- 用于提供上下文的文档
- 根据配置支持的其他文件类型
文件上传功能通过文件上传配置管理器(FileUploadConfigManager)进行配置,该管理器控制允许上传的文件类型以及上传方式。
与工作流系统集成
对话系统通过消息模型中的 workflow_run_id 字段与工作流系统集成。这使得可以跟踪哪些消息与特定的工作流运行相关联。

Web 界面
Web 界面提供了一种用户友好的方式来查看和与对话进行交互。它包括以下功能:
- 带有固定功能的对话列表
- 带有反馈选项的消息显示
- 文件附件预览
- 工作流运行状态可视化
该界面使用 React 组件来显示对话和消息,并支持用于分页的无限滚动。
使用模式
聊天应用
对于聊天应用,对话系统会维护包含多条消息的持续聊天历史记录。

文本生成应用
对于文本生成应用,每次交互通常会创建一个包含单个消息的新对话。

380



被折叠的 条评论
为什么被折叠?



