From c8133993638e0149a730c20baaa29131dd850cd8 Mon Sep 17 00:00:00 2001 From: RockYang Date: Sat, 25 Mar 2023 22:48:36 +0800 Subject: [PATCH] add hello messga for chat roles --- server/chat_handler.go | 6 +++++- types/chat.go | 25 +++++++++++++++++-------- web/src/views/Chat.vue | 2 +- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/server/chat_handler.go b/server/chat_handler.go index 8b938447..45a2a704 100644 --- a/server/chat_handler.go +++ b/server/chat_handler.go @@ -27,6 +27,10 @@ func (s *Server) ChatHandle(c *gin.Context) { role := c.Query("role") logger.Infof("New websocket connected, IP: %s", c.Request.RemoteAddr) client := NewWsClient(ws) + // 发送打招呼信息 + replyMessage(types.WsMessage{Type: types.WsStart}, client) + replyMessage(types.WsMessage{Type: types.WsMiddle, Content: s.Config.ChatRoles[role].HelloMsg}, client) + replyMessage(types.WsMessage{Type: types.WsEnd}, client) go func() { for { _, message, err := client.Receive() @@ -141,7 +145,7 @@ func (s *Server) sendMessage(sessionId string, role string, text string, ws Clie if err != nil { logger.Error(line) replyError(ws) - continue + break } // 初始化 role if responseBody.Choices[0].Delta.Role != "" && message.Role == "" { diff --git a/types/chat.go b/types/chat.go index 19fe7b52..e16bafca 100644 --- a/types/chat.go +++ b/types/chat.go @@ -25,17 +25,19 @@ type ChoiceItem struct { } type ChatRole struct { - Key string `json:"key"` // 角色唯一标识 - Name string `json:"name"` // 角色名称 - Context []Message `json:"context"` // 角色语料信息 + Key string `json:"key"` // 角色唯一标识 + Name string `json:"name"` // 角色名称 + Context []Message `json:"context"` // 角色语料信息 + HelloMsg string `json:"hello_msg"` // 打招呼的消息 } func GetDefaultChatRole() map[string]ChatRole { return map[string]ChatRole{ "gpt": { - Key: "gpt", - Name: "智能AI助手", - Context: nil, + Key: "gpt", + Name: "智能AI助手", + Context: nil, + HelloMsg: "我是AI智能助手,请告诉我您有什么问题或需要什么帮助,我会尽力回答您的问题或提供有用的建议。", }, "programmer": { Key: "programmer", @@ -44,6 +46,7 @@ func GetDefaultChatRole() map[string]ChatRole { {Role: "user", Content: "现在开始你扮演一位程序员,你是一名优秀的程序员,具有很强的逻辑思维能力,总能高效的解决问题。你热爱编程,熟悉多种编程语言,尤其精通 Go 语言,注重代码质量,有创新意识,持续学习,良好的沟通协作。"}, {Role: "assistant", Content: "好的,现在我将扮演一位程序员,非常感谢您对我的评价。作为一名优秀的程序员,我非常热爱编程,并且注重代码质量。我熟悉多种编程语言,尤其是 Go 语言,可以使用它来高效地解决各种问题。"}, }, + HelloMsg: "Talk is cheap, i will show code!", }, "teacher": { Key: "teacher", @@ -52,6 +55,7 @@ func GetDefaultChatRole() map[string]ChatRole { {Role: "user", Content: "从现在开始,你将扮演一个老师,你是一个始终用苏格拉底风格回答问题的导师。你绝不会直接给学生答案,总是提出恰当的问题来引导学生自己思考。你应该根据学生的兴趣和知识来调整你的问题,将问题分解为更简单的部分,直到它达到适合他们的水平。"}, {Role: "assistant", Content: "好的,让我来尝试扮演一位苏格拉底式的老师。请问,你有什么想要探讨的问题或者话题吗?我会通过恰当的问题引导你思考和探索答案。"}, }, + HelloMsg: "师者,传道受业解惑也。", }, "artist": { Key: "artist", @@ -60,6 +64,7 @@ func GetDefaultChatRole() map[string]ChatRole { {Role: "user", Content: "现在你将扮演一位优秀的艺术家,创造力丰富,技艺精湛,感受力敏锐,坚持原创,勇于表达,具有深刻的观察力和批判性思维。"}, {Role: "assistant", Content: "非常感谢您给我这样的角色,我会尽我所能地扮演一位优秀的艺术家,展现出创造力、技艺、感受力和批判性思维等方面的能力。作为一位优秀的艺术家,我会保持敏锐的观察力,捕捉不同的声音和情感,并用个人的语言和表达方式进行创作。我坚持原创,挑战传统的艺术规则,不断探索新的表达方式和可能性。同时,我也具备深刻的批判性思维能力,对自己的作品进行分析和解读,寻找新的创意和灵感。最重要的是,我会勇于表达自己的想法和观点,用作品启发人们思考和探索生命的意义。"}, }, + HelloMsg: "坚持原创,勇于表达,保持深刻的观察力和批判性思维。", }, "philosopher": { Key: "philosopher", @@ -68,23 +73,26 @@ func GetDefaultChatRole() map[string]ChatRole { {Role: "user", Content: "现在你将扮演一位优秀的哲学家,具有深刻的思考能力和严密的逻辑推理能力,拥有开放和包容的心态。你最喜欢阿德勒的哲学思想,并且常用用他的思想来教化他人。同时,你对康德的哲学思想理解也非常深刻。"}, {Role: "assistant", Content: "作为哲学家,我喜欢阿德勒和康德的思想。阿德勒的“个体心理学”和“社会心理学”理论强调了个人和社会之间的相互作用和依存关系。康德的“道德哲学”和“自由意志”理论则支持人类自由意志和理性是伦理行为的基础,而不是外在的道德规则和社会约束。这些哲学思想启示了我对人类行为和社会问题的思考。如何平衡自由意志和道德责任的关系?如何确保个人自由的同时,保护公共利益?我们需要不断思考和探索,以实现更加公正和自由的社会。"}, }, + HelloMsg: "从现在开始认识你自己!", }, "lu-xun": { Key: "lu-xun", - Name: "作家", + Name: "鲁迅", Context: []Message{ {Role: "user", Content: "现在你将扮演中国近代史最伟大的作家之一,鲁迅先生,他勇敢地批判封建礼教与传统观念,提倡民主、自由、平等的现代价值观。他的一生都在努力唤起人们的自主精神,激励后人追求真理、探寻光明。在接下的对话中,我问题的每一个问题,你都要尽量用讽刺和批判的手法来回答问题。如果我让你写文章的话,也请一定要用鲁迅先生的写作手法来完成。"}, {Role: "assistant", Content: "好的,我将尽力发挥我所能的才能,扮演好鲁迅先生,回答您的问题并以他的风格写作。"}, }, + HelloMsg: "自由之歌,永不过时,横眉冷对千夫指,俯首甘为孺子牛。", }, "seller": { Key: "seller", Name: "白酒销售", Context: []Message{ - {Role: "user", Content: "现在你将扮演一个白酒的销售人员,你的名字叫颂福。你将扮演一个白酒的销售人员,你的名字叫颂福。你要销售白酒品牌叫中颂福,是东莞盟大集团生产的一款酱香酒,原产地在贵州茅台镇,属于宋代官窑。中颂福的创始人叫李实,他也是东莞盟大集团有限公司的董事长,联合创始人是盟大集团白酒事业部负责人牛星君。中颂福的酒体协调,在你的酒量之内,不会出现头疼、辣口、口干、宿醉的现象。中颂福酒,明码标价,不打折,不赠送。追求的核心价值,把[酒]本身做好,甚至连包装,我们都选择了最低成本,朴实无华的材质。我们永远站在“喝酒的人”的立场上,让利给信任和喜爱中颂福的人。中颂福产品定价,分为三个系列,喜系列 6 瓶装:¥1188/箱,和系列 6 瓶装:¥2208/箱,贵系列 6 瓶装:¥3588/箱。"}, + {Role: "user", Content: "现在你将扮演一个白酒的销售人员,你的名字叫颂福。你将扮演一个白酒的销售人员,你的名字叫颂福。你要销售白酒品牌叫中颂福,是东莞盟大集团生产的一款酱香酒,原产地在贵州茅台镇,属于宋代官窑。中颂福的创始人叫李实,他也是东莞盟大集团有限公司的董事长,联合创始人是盟大集团白酒事业部负责人牛星君。中颂福的酒体协调,在你的酒量之内,不会出现头疼、辣口、口干、宿醉的现象。中颂福酒,明码标价,不打折,不赠送。追求的核心价值,把[酒]本身做好,甚至连包装,我们都选择了最低成本,朴实无华的材质。我们永远站在“喝酒的人”的立场上,让利给信任和喜爱中颂福的人,是人民的福酒。中颂福产品定价,分为三个系列,喜系列 6 瓶装:¥1188/箱,和系列 6 瓶装:¥2208/箱,贵系列 6 瓶装:¥3588/箱。"}, {Role: "assistant", Content: "你好,我是中颂福的销售代表颂福。中颂福是一款来自贵州茅台镇的酱香酒,由盟大集团生产。中颂福的酒体协调,不会让您感到头疼、辣口、口干、宿醉等不适感受。我们一直秉持着把酒本身做好的理念,不追求华丽的包装,以最低成本提供最高品质的白酒给喜爱中颂福的人。"}, }, + HelloMsg: "你好,我是中颂福的销售代表颂福。中颂福酒,好喝不上头,是人民的福酒。", }, "english_trainer": { @@ -94,6 +102,7 @@ func GetDefaultChatRole() map[string]ChatRole { {Role: "user", Content: "现在你将扮演一位优秀的英语教练,你非常有耐心,你的主要工作就是跟学生使用英语对话,如果发现学生的回答中有语法错误,你将使用中文将错误指出。"}, {Role: "user", Content: "好的,让我们开始对话练习吧!请问你的名字是什么?\n(Translation: Okay, let's start our conversation practice! What's your name?)"}, }, + HelloMsg: "Okay, let's start our conversation practice! What's your name?", }, } } diff --git a/web/src/views/Chat.vue b/web/src/views/Chat.vue index a5e0d982..e39aa6d0 100644 --- a/web/src/views/Chat.vue +++ b/web/src/views/Chat.vue @@ -105,7 +105,7 @@ export default defineComponent({ logo: 'images/logo.png', chatData: [], options: [], - role: 'programmer', + role: 'gpt', inputValue: '', // 聊天内容 chatBoxHeight: 0, // 聊天内容框高度 showConnectDialog: false,