瀏覽代碼

perf: 当使用prompt但内容为空时,直接返回prompt的内容 (#138)

辣橙 2 年之前
父節點
當前提交
71a464b7f0
共有 3 個文件被更改,包括 65 次插入17 次删除
  1. 55 14
      main.go
  2. 1 1
      pkg/process/process_request.go
  3. 9 2
      pkg/process/prompt.go

+ 55 - 14
main.go

@@ -19,18 +19,50 @@ func main() {
 	Start()
 }
 
-var Welcome string = `Commands:
-=================================
-🙋 单聊 👉 单独聊天
-📣 串聊 👉 带上下文聊天
-🔃 重置 👉 重置带上下文聊天
-💵 余额 👉 查询剩余额度
-🚀 帮助 👉 显示帮助信息
-🌈 模板 👉 内置的prompt
-🎨 图片 👉 根据prompt生成图片
-=================================
-🚜 例:@我发送 空 或 帮助 将返回此帮助信息
-💪 Power By https://github.com/eryajf/chatgpt-dingtalk
+var Welcome string = `# 发送信息
+
+若您想给机器人发送信息,请选择:
+
+1. 在本机器人所在群里@机器人;
+2. 点击机器人的头像后,再点击"发消息"。
+
+机器人收到您的信息后,默认会交给chatgpt进行处理。除非,您发送的内容是7个**系统指令**之一。
+
+-----
+
+# 系统指令
+
+系统指令是一些特殊的词语,当您向机器人发送这些词语时,会触发对应的功能:
+
+**单聊**:每条消息都是单独的对话,不包含上下文
+
+**串聊**:对话会携带上下文,除非您主动重置对话或对话长度超过限制
+
+**重置**:重置上下文
+
+**余额**:查询机器人所用OpenAI账号的余额
+
+**模板**:查询机器人内置的快捷模板
+
+**图片**:查看如何根据提示词生成图片
+
+**帮助**:重新获取帮助信息
+
+-----
+
+# 友情提示
+
+使用"串聊模式"会显著加快机器人所用账号的余额消耗速度。
+
+因此,若无保留上下文的需求,建议使用"单聊模式"。
+
+即使有保留上下文的需求,也应适时使用"重置"指令来重置上下文。
+
+-----
+
+# 项目地址
+
+本项目已在GitHub开源,[查看源代码](https://github.com/eryajf/chatgpt-dingtalk)。
 `
 
 func Start() {
@@ -51,7 +83,7 @@ func Start() {
 		// TODO: 校验请求
 		if len(msgObj.Text.Content) == 1 || strings.TrimSpace(msgObj.Text.Content) == "帮助" {
 			// 欢迎信息
-			_, err := msgObj.ReplyToDingtalk(string(dingbot.TEXT), Welcome)
+			_, err := msgObj.ReplyToDingtalk(string(dingbot.MARKDOWN), Welcome)
 			if err != nil {
 				logger.Warning(fmt.Errorf("send message error: %v", err))
 				return ship.ErrBadRequest.New(fmt.Errorf("send message error: %v", err))
@@ -62,7 +94,16 @@ func Start() {
 			case strings.HasPrefix(strings.TrimSpace(msgObj.Text.Content), "#图片"):
 				return process.ImageGenerate(&msgObj)
 			default:
-				msgObj.Text.Content = process.GeneratePrompt(strings.TrimSpace(msgObj.Text.Content))
+				msgObj.Text.Content, err = process.GeneratePrompt(strings.TrimSpace(msgObj.Text.Content))
+				// err不为空:提示词之后没有文本 -> 直接返回提示词所代表的内容
+				if err != nil {
+					_, err = msgObj.ReplyToDingtalk(string(dingbot.TEXT), msgObj.Text.Content)
+					if err != nil {
+						logger.Warning(fmt.Errorf("send message error: %v", err))
+						return err
+					}
+					return nil
+				}
 				logger.Info(fmt.Sprintf("after generate prompt: %#v", msgObj.Text.Content))
 				return process.ProcessRequest(&msgObj)
 			}

File diff suppressed because it is too large
+ 1 - 1
pkg/process/process_request.go


+ 9 - 2
pkg/process/prompt.go

@@ -1,16 +1,23 @@
 package process
 
 import (
+	"errors"
+	"fmt"
 	"strings"
 
 	"github.com/eryajf/chatgpt-dingtalk/public"
 )
 
 // GeneratePrompt 生成当次请求的 Prompt
-func GeneratePrompt(msg string) (rst string) {
+func GeneratePrompt(msg string) (rst string, err error) {
 	for _, prompt := range *public.Prompt {
 		if strings.HasPrefix(msg, prompt.Title) {
-			rst = prompt.Content + strings.Replace(msg, prompt.Title, "", -1)
+			if strings.TrimSpace(msg) == prompt.Title {
+				rst = fmt.Sprintf("%s:\n%s", prompt.Title, prompt.Content)
+				err = errors.New("消息内容为空") // 当提示词之后没有文本,抛出异常,以便直接返回Prompt所代表的内容
+			} else {
+				rst = prompt.Content + strings.Replace(msg, prompt.Title, "", -1)
+			}
 			return
 		} else {
 			rst = msg