AI 聊天对话
AI 对话,基于 LLM 大模型,实现智能聊天的功能。
说白了,就是和机器人聊天。高级点,就是智能问答!
整个功能,涉及到 5 个表(上图可以看到 4 个):
- 【配置】
ai_api_key
:API 秘钥表 - 【配置】
ai_model
:模型表 - 【配置】
ai_chat_role
:聊天角色表 - 【对话】
ai_chat_conversation
:聊天对话表 - 【对话】
ai_chat_message
:聊天消息表
补充说明:
ai_api_key
、ai_model
已经在 《功能开启》 讲解,就不重复赘述。
下面,我们逐个表进行介绍,这个过程中也会讲讲对应的功能。
# 1. 前置准备
你想使用哪个模型聊天,可以参考对应的文档,进行配置:
- 国内模型:《通义千问》、《DeepSeek》、《豆包》、《混元》、《文心一言》、《硅基流动》、《讯飞星火》、《智谱 GLM》、《月之暗灭》、《MiniMax》、《百川智能》
- 国外模型:《OpenAI(ChatGPT)》、《LLAMA》、《【微软 OpenAI】ChatGPT》 、《谷歌 Gemini》
友情提示:
一般情况下,建议先使用 《DeepSeek》 模块,因为免费送了一些 tokens,可以先体验一下。
# 2. 聊天角色表
聊天角色表,配置机器人扮演怎么样的角色,例如说:通用 AI 助手、Python 专家、客服小姐姐等等。
# 2.1 表结构
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
CREATE TABLE `ai_chat_role` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '角色编号',
`name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '角色名称',
`avatar` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '头像',
`description` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '角色描述',
`status` tinyint DEFAULT NULL COMMENT '状态',
`sort` int NOT NULL DEFAULT '0' COMMENT '角色排序',
`user_id` bigint DEFAULT NULL COMMENT '用户编号',
`public_status` bit(1) NOT NULL COMMENT '是否公开',
`category` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '角色类别',
`model_id` bigint DEFAULT NULL COMMENT '模型编号',
`system_message` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '角色上下文',
`knowledge_ids` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '关联的知识库编号数组',
`tool_ids` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '关联的工具编号数组',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='AI 聊天角色表';
① user_id
字段:对应 system_users
表的 id
字段,表示哪个用户创建的角色。
public_status
字段:表示是否公开。如果是公开,那么其他用户也可以使用这个角色,一般由管理员创建。如果是私有,那么只有创建者 user_id
可以使用。
category
字段:公开角色的所属类别,例如说:助手、编程开发、娱乐等等。
② model_id
字段:表示角色绑定的默认模型,对应 ai_model
表的 id
字段。当然,也可以不绑定,此时使用 ai_model
排序 sort
最小的模型。
③ system_message
字段:表示角色上下文,或者说角色设定。例如说 “Python 专家” 对应如下
“ 我希望你能作为一名 python 专家。
我将向你提供有关我的技术问题的所有信息,而你的角色是解决我的问题。
你应该用你的计算机科学、网络基础设施和 IT 安全知识来解决我的问题。在你的回答中,使用聪明的、简单的、为各种层次的人所理解的语言会有帮助。
逐步解释你的解决方案并使用要点是很有帮助的。尽量避免过多的技术细节,但在必要时使用它们。我希望你用解决方案来回答,而不是写任何解释。
”
④ knowledge_ids
字段:关联的知识库编号数组,对应 ai_knowledge
表的 id
字段。后续使用,可见 《AI 知识库》。
⑤ tool_ids
字段:关联的工具编号数组,对应 ai_tool
表的 id
字段。后续使用,可见 《AI 工具库》。
# 2.2 管理后台
① 前端对应 [AI 大模型 -> 控制台 -> 聊天角色] 菜单,对应 yudao-ui-admin-vue3
项目的 @/views/ai/model/chatRole
目录,提供给管理员使用,创建公开角色。
它的后端 HTTP 接口,由 yudao-module-ai
模块的 model
包的 AiChatRoleController 实现。
② 前端聊天界面的【角色仓库】,对应 yudao-ui-admin-vue3
项目的 TODO 目录,提供给用户使用,创建私有角色。
- 可以点击【使用】按钮,使用对应的角色创建对话
- 也可以点击【公共角色】标签,按分类查看公开角色列表,也支持【使用】按钮
# 3. 聊天对话
聊天对话,一共有 2 个表,分别是 ai_chat_conversation
和 ai_chat_message
。前者是对话的基本信息,后者是对话的消息列表。
# 3.1 表结构【聊天对话表】
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
CREATE TABLE `ai_chat_conversation` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '对话编号',
`title` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '对话标题',
`pinned` bit(1) NOT NULL COMMENT '是否置顶',
`pinned_time` datetime DEFAULT NULL COMMENT '置顶时间',
`user_id` bigint NOT NULL COMMENT '用户编号',
`role_id` bigint DEFAULT NULL COMMENT '聊天角色',
`model_id` bigint NOT NULL COMMENT '模型编号',
`model` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模型标识',
`system_message` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '角色设定',
`temperature` double NOT NULL COMMENT '温度参数',
`max_tokens` int NOT NULL COMMENT '单条回复的最大 Token 数量',
`max_contexts` int NOT NULL COMMENT '上下文的最大 Message 数量',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1781604279872581716 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='AI 聊天对话表';
① user_id
字段:对应 system_users
表的 id
字段,表示哪个用户创建的对话。
② role_id
字段:表示对话使用的角色,对应 ai_chat_role
表的 id
字段。如果没有使用角色,则为空,此时是点击聊天界面的【新建对话】产生的。
③ model_id
字段:表示对话使用的模型,对应 ai_model
表的 id
字段。每个对话可以随时切换它所使用的模型。
model
字段:表示模型标识,冗余 ai_model
表的 model
字段。
system_message
、temperature
、max_tokens
、max_contexts
字段:就是对话的配置,上图也已经看到。
# 3.2 表结构【聊天消息表】
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
CREATE TABLE `ai_chat_message` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '消息编号',
`conversation_id` bigint NOT NULL COMMENT '对话编号',
`user_id` bigint NOT NULL COMMENT '用户编号',
`role_id` bigint DEFAULT NULL COMMENT '角色编号',
`model` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模型标识',
`model_id` bigint NOT NULL COMMENT '模型编号',
`type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '消息类型',
`reply_id` bigint DEFAULT NULL COMMENT '回复编号',
`content` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '消息内容',
`use_context` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否携带上下文',
`segment_ids` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '段落编号数组',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2147 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='AI 聊天消息表';
① conversation_id
、user_id
、role_id
字段:关联到 ai_chat_conversation
表的相关字段。
② model
、model_id
字段:该消息所使用的模型。因为对话可以随时切换模型,所以消息也需要记录。
③ type
字段:消息类型,对应 Spring AI 提供的 MessageType 枚举类,目前表里有 user
用户发送、assistant
模型回复。
reply_id
字段:表示回复的消息编号。用户每次发送消息,会记录一条 user
类型的消息,然后模型回复的消息,会记录一条 assistant
类型的消息,这两条消息通过 reply_id
对应的。
④ content
字段:消息内容,对应用户发送的消息或者模型回复的消息。
⑤ use_context
字段:表示是否携带上下文。如果为 true
时,表示这条消息会携带上下文,此时调用模型时,会带该会话的最后 max_contexts
组消息。
注意,它是在消息发送框的左下角的蓝色 switch 【上下文】小按钮噢!
⑥ segment_ids
字段:知识库找回的段落编号数组,对应 ai_knowledge_segment
表的 id
字段。
# 3.3 管理后台
① 前端对应 [AI 大模型 -> AI 对话] 菜单,对应 yudao-ui-admin-vue3
项目的 @/views/ai/chat/index
目录。上面已经有很多图了,就不重复截图了!
它的后端 HTTP 接口,由 yudao-module-ai
模块的 chat
包的 AiChatConversationController、AiChatMessageController 实现。
最最最关键的代码!!!大家可以重点看看!!!
AiChatMessageController 提供的 #sendChatMessageStream(...)
流式消息接口。
它的内部,调用 Spring AI 的 StreamingChatClient 来实现大模型的调用。
② 前端对应 [AI 大模型 -> 控制台 -> 聊天管理] 菜单,对应 yudao-ui-admin-vue3
项目的 @/views/ai/chat/manager
目录,提供给管理员使用,查看对话列表、消息列表。