Dify 中的对话系统(Conversation System)管理用户与 AI 应用程序之间的对话(聊天会话)和消息交换。它处理对话状态、历史记录跟踪、消息存储以及用户反馈和标注等相关功能。该系统是 Dify 的核心组件,与模型提供系统 (用于 AI 模型交互)和 RAG 知识系统(用于知识检索)协同工作。
👆👆👆欢迎关注,一起进步👆👆👆
往期内容
- 从零开始学 Dify - 简介
- 从零开始学 Dify-系统架构
- 从零开始学 Dify- API 后端架构原来是这样设计的
- 从零开始学 Dify- 帐户与租户管理系统设计揭秘
- 从零开始学 Dify- 模型提供者系统设计实现模型统一调用接口
- 从零开始学 Dify- RAG 知识库系统设计详解
系统概览
对话系统管理用户与 AI 应用程序之间的交互,并维护这些交互的持久记录。它支持不同的应用程序类型(聊天、完成、基于代理和工作流驱动),并为最终用户和管理员提供与对话历史记录交互的机制。
核心数据模型
对话系统围绕两个主要数据模型构建:对话和消息。
对话模型
对话模型代表用户和 AI 应用程序之间的完成聊天会话。
Conversation 主要属性包括:
|
属性(Attribute)
|
描述(Description)
|
| --- | --- |
| id
|
对话的唯一标识符
|
| app\_id
|
关联应用程序 ID
|
| app\_model\_config\_id
|
AI 模型的配置 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
|
软删除标志
|
对话模型与以下内容有关系:
- Messages 消息(一对多)
- MessageAnnotations 消息标注(一对多)
- App 应用程序(多对一)
消息模型
消息模型代表对话中的个人交流。
Message 主要属性包括:
|
属性(Attribute)
|
描述(Description)
|
| --- | --- |
| id
|
消息的唯一标识符
|
| app\_id
|
关联应用程序 ID
|
| conversation\_id
|
父对话 ID
|
| inputs
|
此消息的输入变量
|
| query
|
用户查询/提示
|
| message
|
原始消息内容(通常为
JSON
)
|
| answer
|
AI 回复文本
|
| 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
|
基于代理的交互的标记
|
数据库 Schema
该图显示了对话系统中核心数据模型之间的关系:
对话生命周期
创建对话
当用户发起与 AI 应用程序的交互时,就会创建对话。创建过程因应用程序模式而异:
- 聊天模式(Chat Mode) :在聊天会话开始时创建
- 完成模式(Completion Mode) :为每个文本生成请求创建
- **代理聊天模式(
Agent Chat Mode)** :专为基于代理的交互而创建
- 工作流模式(Workflow Mode) :创建并链接到工作流运行
交互流程
服务层
对话系统通过几个服务类进行管理:
ConversationService
处理管理对话的核心功能:
- 用于检索对话的分页
- 对话删除(软删除)
- 对话重命名(包括自动生成)
- 检索个人对话
# Key methods in 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)
WebConversationService
使用特定于 Web 的功能扩展 ConversationService:
- 固定/取消固定对话
- 按固定状态过滤对话
# Key methods in 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 公开接口,适用于不同的用例:
Console API
对于管理访问权限,包括查看和管理所有对话:
|
接口
|
Method
|
描述
|
| --- | --- | --- |
| /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>
|
D 删除完成对话 >删除完成对话
|
|
Service API
对于以编程方式访问对话:
|
接口
|
Method
|
描述
|
| --- | --- | --- |
| /conversations
|
GET
|
列出用户的对话
|
| /conversations/<conversation\_id>
|
DELETE
|
删除对话
|
| /conversations/<conversation\_id>/name
|
POST
|
重命名对话
|
Web API
对于 Web 应用程序访问:
|
接口
|
Method
|
描述
|
| --- | --- | --- |
| /conversations
|
GET
|
列出用户的对话
|
| /conversations/<conversation\_id>
|
DELETE
|
删除对话
|
| /conversations/<conversation\_id>/name
|
POST
|
重命名对话
|
| /conversations/<conversation\_id>/pin
|
PATCH
|
固定对话
|
| /conversations/<conversation\_id>/unpin
|
PATCH
|
取消固定对话
|
特色功能
对话固定
用户可以固定重要对话,以便于访问。此功能通过 PinnedConversation
模型和 WebConversationService
方法实现:
# Pin a conversation
WebConversationService.pin(app\_model, conversation\_id, user)
# Unpin a conversation
WebConversationService.unpin(app\_model, conversation\_id, user)
消息反馈与标注
用户和管理员可以对消息提供反馈并添加标注(更正或改进):
- 反馈(Feedback) :喜欢/不喜欢的评分,可选评论
- 标注(Annotations) :管理员提供的更正或补充信息
文件附件
消息可以包含文件附件,支持各种文件类型:
- 视觉模型图像
- 文件上下文
- 基于配置的其他文件类型
文件上传功能通过 FileUpload ConfigManager
配置,它控制允许哪些文件类型以及如何上传它们。
与工作流系统集成
对话系统通过消息模型中的 workflow\_run\_id
字段与工作流系统集成。这允许跟踪与特定工作流运行相关的消息。
应用模式
聊天应用程序
对于聊天应用程序,对话系统会维护包含多条消息的持久聊天历史记录。
完成应用程序
对于完成(文本生成)应用程序,每次交互通常都会创建一个包含单个消息的新对话。
总结
对话系统是 Dify 的核心组件,用于管理所有用户与 AI 的交互,提供持久化、历史记录以及反馈和标注等附加功能。它与其他系统紧密协作,尤其是用于 AI 响应的模型提供系统和用于复杂交互模式的工作流系统。
该系统设计灵活,支持不同类型的应用程序(聊天、完成、代理聊天)和用户界面(Web、API),同时保持一致的数据模型和服务层。
参考资料
https://github.com/langgenius/dify
推荐阅读
- 从零开始学 Dify - 简介
- 从零开始学 Dify-系统架构
- 从零开始学 Dify- API 后端架构原来是这样设计的
- 从零开始学 Dify- 帐户与租户管理系统设计揭秘
- 从零开始学 Dify- 模型提供者系统设计实现模型统一调用接口
- 从零开始学 Dify- RAG 知识库系统设计详解
接下来将分别介绍各个子系统:
模型提供者系统(Model Provider System) ✅
RAG 知识系统(RAG Knowledge System) ✅
对话系统(Conversation System) ✅
工作流系统(Workflow System)
👆👆👆欢迎关注,一起进步👆👆👆
欢迎留言讨论哈
🧐点赞、分享、推荐 ,恭喜发财👇