设计模仿DeepSeek网页版的前端用户交互接口之疑问二

  • 作者: 凯哥Java(公众号:凯哥Java)
  • AI相关
  • 时间:2025-11-27 18:20
  • 63人已阅读
简介 在设计模仿DeepSeek网页版的前端用户交互接口文章中疑问:创建新会话接口、发送新问题(生成基础回答)接口 这俩接口入参就只有chatId这个字段区别吗?如果我chatId是有前端页面创建的,那么这两个接口是不是没区别了?

🔔🔔🔔好消息!好消息!🔔🔔🔔

有需要的朋友👉:联系凯哥 微信号 kaigejava2022

在设计模仿DeepSeek网页版的前端用户交互接口文章中

疑问:

还有疑问:创建新会话接口、发送新问题(生成基础回答)接口 这俩接口入参就只有chatId这个字段区别吗?如果我chatId是有前端页面创建的,那么这两个接口是不是没区别了?

回答:

你提出的疑问很关键——即使chatId由前端生成,这两个接口依然有本质区别,绝非仅差一个chatId字段。它们的核心差异在于业务职责、操作的数据表、以及在业务流程中的定位完全不同,具体分析如下:

一、核心区别:不止是chatId的差异

1. 接口的核心目的与业务逻辑不同

  • 创建新会话接口
    本质是初始化一个“会话容器”,解决“这个聊天归属哪个会话”的问题。它的核心是在ai_application_chat表中新增一条记录,确定会话的所属应用(application_id)、所属用户(client_id)、会话标题(overview)等会话级元数据
    哪怕chatId由前端生成,这个接口依然要完成“会话元数据的持久化”——否则后续的问答记录会失去归属的会话信息。

  • 发送新问题接口
    本质是在已有会话容器中添加具体的问答内容,解决“会话内的具体交互”问题。它的核心是在ai_application_chat_record表中新增基础记录,同时调用dify API生成回答,还要关联到已有的会话(chat_id)。
    它依赖于“会话已存在”这个前提,无法独立存在。

2. 操作的数据表完全不同

  • 创建新会话接口:操作的是ai_application_chat表(会话表),与问答内容无关。

  • 发送新问题接口:操作的是ai_application_chat_record表(问答记录表),还可能关联ai_answer_version表(版本表),与会话容器的元数据无关。

3. 入参和数据产出的侧重点不同

维度创建新会话接口发送新问题接口
核心入参applicationId、clientId、overview(会话标题)chatId、problemText(问题内容)、applicationId(可选)
数据产出chatId(会话标识)、会话创建时间等baseRecordId(问答标识)、answerText(回答)、token消耗等
依赖前提无需已有会话必须已有合法的chatId(会话已存在)

二、“前端生成chatId”不改变接口分工

即使chatId由前端生成(比如用UUID),也只是ID的生成方从后端变成前端,但两个接口的职责依然不能合并:

  • 前端生成chatId后,仍需调用“创建新会话接口”将chatId + applicationId + clientId + overview存入ai_application_chat表——否则后端无法确认这个chatId是否合法、属于哪个用户/应用;

  • 之后调用“发送新问题接口”时,传入前端生成的chatId,后端会先校验该chatId是否存在于ai_application_chat表(避免非法chatId),再创建问答记录。

如果合并成一个接口,会导致:

  1. 用户仅想“创建空会话”(比如DeepSeek点击“新聊天”但还没提问)时,必须附带问题内容,不符合交互逻辑;

  2. 会话元数据(如overview)和问答内容耦合在一起,后续修改会话标题(重命名)会变得复杂;

  3. 数据层面出现冗余:每次发问题都要重复存储applicationId、clientId等会话级数据。

三、极端场景:是否可以合并?

只有一种极端情况可能合并——用户点击“新会话”的同时必须发送第一个问题(不允许创建空会话)。此时可以设计一个“创建会话并发送首个问题”的复合接口:

// 复合接口入参示例
{
  "applicationId": "app_001",
  "clientId": "user_001",
  "problemText": "什么是安规?",  // 首个问题
  "chatId": "前端生成的UUID"     // 可选,后端也可生成
}

这个复合接口内部会:

  1. 先在ai_application_chat表创建会话(用前端/后端生成的chatId);

  2. 再在ai_application_chat_record表创建首个问答记录。

仍建议保留独立接口:一是满足“创建空会话”的场景,二是接口职责单一,符合RESTful设计原则,便于维护和扩展。

总结

两个接口的核心区别在于**“创建会话容器” vs “填充容器内容”**,而非仅chatId的有无:

  1. 创建新会话:定义“聊天的归属和元数据”,操作会话表;

  2. 发送新问题:在归属明确的聊天中添加交互内容,操作问答表。

即使chatId由前端生成,也只是ID生成方式的变化,无法消除两者在业务逻辑和数据操作上的本质差异。


TopTop