modify context

This commit is contained in:
rainerosion 2023-04-15 18:46:39 +08:00
parent dcac1149f9
commit 48bf5368b5
6 changed files with 28 additions and 14 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
storage.json storage.json
/.idea/wechatbot.iml /.idea/wechatbot.iml
/config.json

View File

@ -4,5 +4,5 @@
"bing_chat_url": "" # New Bing 聊天接口 "bing_chat_url": "" # New Bing 聊天接口
"bing_chat_wake_word": "#bing", # new Bing唤醒词 "bing_chat_wake_word": "#bing", # new Bing唤醒词
"gpt_chat_wake_word": "#gpt" # ChatGPT唤醒词 "gpt_chat_wake_word": "#gpt" # ChatGPT唤醒词
"gpt_message_cache": 1 # 消息缓存数量 "gpt_message_cache": 20 # 消息缓存数量
} }

View File

@ -25,12 +25,16 @@ type ChatGPTResponseBody struct {
Model string `json:"model"` Model string `json:"model"`
Choices []ChoiceItem `json:"choices"` Choices []ChoiceItem `json:"choices"`
Usage map[string]interface{} `json:"usage"` Usage map[string]interface{} `json:"usage"`
Error ErrorGPTResponseBody `json:"error"`
} }
type ChoiceItem struct { type ChoiceItem struct {
Message Message `json:"message"` Message Message `json:"message"`
FinishReason string `json:"finish_reason"` FinishReason string `json:"finish_reason"`
} }
type ErrorGPTResponseBody struct {
Message string `json:"message"`
}
// ChatGPTRequestBody 响应体 // ChatGPTRequestBody 响应体
type ChatGPTRequestBody struct { type ChatGPTRequestBody struct {
@ -45,7 +49,8 @@ var MessageCacheRegistry = make(map[string][]Message)
func CleanContext(nickName string) (string, error) { func CleanContext(nickName string) (string, error) {
messageCache := []Message{} messageCache := []Message{}
MessageCacheRegistry[nickName] = messageCache MessageCacheRegistry[nickName] = messageCache
return "用户[" + nickName + "]上下文已清空", nil log.Println("用户[" + nickName + "]上下文已清空")
return "上下文已清空", nil
} }
func Completions(msg string, nickName string) (string, error) { func Completions(msg string, nickName string) (string, error) {
@ -64,7 +69,7 @@ func Completions(msg string, nickName string) (string, error) {
MessageCacheRegistry[nickName] = messageCache MessageCacheRegistry[nickName] = messageCache
requestBody := ChatGPTRequestBody{ requestBody := ChatGPTRequestBody{
Model: "gpt-3.5-turbo", Model: "gpt-3.5-turbo",
MaxTokens: 4096, MaxTokens: 2048,
Temperature: 1.2, Temperature: 1.2,
Messages: messageCache, Messages: messageCache,
} }
@ -107,6 +112,8 @@ func Completions(msg string, nickName string) (string, error) {
reply = v.Message.Content reply = v.Message.Content
break break
} }
} else {
reply = gptResponseBody.Error.Message
} }
log.Printf("gpt response text: %s \n", reply) log.Printf("gpt response text: %s \n", reply)
return reply, nil return reply, nil

View File

@ -42,10 +42,19 @@ func (g *GroupMessageHandler) ReplyText(msg *openwechat.Message) error {
sender, err := msg.Sender() sender, err := msg.Sender()
group := openwechat.Group{User: sender} group := openwechat.Group{User: sender}
log.Printf("Received Group %v Text Msg : %v", group.NickName, msg.Content) log.Printf("Received Group %v Text Msg : %v", group.NickName, msg.Content)
inGroup, _ := msg.SenderInGroup()
// 组合群名+用户名
userName := inGroup.UserName + group.UserName
bingWakeWord := config.LoadConfig().BingChatWakeWord bingWakeWord := config.LoadConfig().BingChatWakeWord
gptWakeWord := config.LoadConfig().GptChatWakeWord gptWakeWord := config.LoadConfig().GptChatWakeWord
// gpt上下文清理
if strings.EqualFold(msg.Content, config.LoadConfig().GptCleanContext) {
cleanReply, _ := gpt.CleanContext(userName)
msg.ReplyText(cleanReply)
}
// @GPTBot 或者 @bing的消息才处理 // @GPTBot 或者 @bing的消息才处理
if !(strings.Contains(msg.Content, gptWakeWord) || strings.Contains(msg.Content, bingWakeWord)) { if !(strings.Contains(msg.Content, gptWakeWord) || strings.Contains(msg.Content, bingWakeWord)) {
return nil return nil
@ -53,17 +62,14 @@ func (g *GroupMessageHandler) ReplyText(msg *openwechat.Message) error {
requestText := strings.TrimSpace(strings.ReplaceAll(msg.Content, gptWakeWord, "")) requestText := strings.TrimSpace(strings.ReplaceAll(msg.Content, gptWakeWord, ""))
var reply = "" var reply = ""
if strings.EqualFold(msg.Content, config.LoadConfig().GptCleanContext) { if strings.Contains(msg.Content, bingWakeWord) {
cleanReply, _ := gpt.CleanContext(group.UserName)
reply = "\n" + cleanReply
} else if strings.Contains(msg.Content, bingWakeWord) {
requestText = strings.TrimSpace(strings.ReplaceAll(msg.Content, bingWakeWord, "")) requestText = strings.TrimSpace(strings.ReplaceAll(msg.Content, bingWakeWord, ""))
reply, err = gpt.BingSearch(requestText, group.UserName) reply, err = gpt.BingSearch(requestText, userName)
if reply != "" && strings.HasPrefix(reply, "[") { if reply != "" && strings.HasPrefix(reply, "[") {
reply = "\n" + reply reply = "\n" + reply
} }
} else { } else {
reply, err = gpt.Completions(requestText, group.UserName) reply, err = gpt.Completions(requestText, userName)
} }
if err != nil { if err != nil {
log.Printf("gpt request error: %v \n", err) log.Printf("gpt request error: %v \n", err)