working with 3 times same context added

This commit is contained in:
Kristian 2023-11-17 17:08:09 +01:00
parent 81e39f058a
commit ed5351f790
2 changed files with 35 additions and 26 deletions

View File

@ -13,7 +13,7 @@ const (
maxTokens = 2000 maxTokens = 2000
maxContextTokens = 4000 maxContextTokens = 4000
maxMessageTokens = 2000 maxMessageTokens = 2000
systemMessageText = "0. your name is !bit you are a discord bot 1. Identify the key points or main ideas of the original answers.\n2. Summarize each answer using concise and informative language.\n3. Prioritize clarity and brevity, capturing the essence of the information provided.\n4. Trim down unnecessary details and avoid elaboration.\n5. Make sure the summarized answers still convey accurate and meaningful information." systemMessageText = "your name is !bit you are a discord bot"
) )
func populateConversationHistory(session *discordgo.Session, channelID string, conversationHistory []openai.ChatCompletionMessage) []openai.ChatCompletionMessage { func populateConversationHistory(session *discordgo.Session, channelID string, conversationHistory []openai.ChatCompletionMessage) []openai.ChatCompletionMessage {
@ -33,19 +33,35 @@ func populateConversationHistory(session *discordgo.Session, channelID string, c
maxHistoryTokens = 0 maxHistoryTokens = 0
} }
// Iterate from the beginning of conversationHistory (oldest messages)
for i := 0; i < len(conversationHistory); i++ {
msg := conversationHistory[i]
tokens := len(msg.Content) + len(msg.Role) + 2 // Account for role and content tokens
if totalTokens-tokens >= maxHistoryTokens {
// Remove the oldest message
conversationHistory = conversationHistory[i+1:]
totalTokens -= tokens
break
}
}
// Add new messages from the channel
addedTokens := 0
for _, message := range messages { for _, message := range messages {
if message.Author.ID == session.State.User.ID { if message.Author.ID == session.State.User.ID || message.Author.Bot {
continue // Skip the bot's own messages continue // Skip the bot's own messages
} }
if len(message.Content) > 0 { if len(message.Content) > 0 {
tokens := len(message.Content) + 2 // Account for role and content tokens tokens := len(message.Content) + 2 // Account for role and content tokens
if totalTokens+tokens <= maxContextTokens && len(conversationHistory) < maxHistoryTokens { if totalTokens+tokens <= maxContextTokens && addedTokens+tokens <= maxContextTokens {
conversationHistory = append(conversationHistory, openai.ChatCompletionMessage{ conversationHistory = append(conversationHistory, openai.ChatCompletionMessage{
Role: openai.ChatMessageRoleUser, Role: openai.ChatMessageRoleUser,
Content: message.Content, Content: message.Content,
}) })
totalTokens += tokens totalTokens += tokens
addedTokens += tokens
} else { } else {
if totalTokens+tokens > maxContextTokens { if totalTokens+tokens > maxContextTokens {
log.Warn("Message token count exceeds maxContextTokens:", len(message.Content), len(message.Content)+2) log.Warn("Message token count exceeds maxContextTokens:", len(message.Content), len(message.Content)+2)
@ -60,8 +76,6 @@ func populateConversationHistory(session *discordgo.Session, channelID string, c
return conversationHistory return conversationHistory
} }
// ...
func chatGPT(session *discordgo.Session, channelID string, message string, conversationHistory []openai.ChatCompletionMessage) { func chatGPT(session *discordgo.Session, channelID string, message string, conversationHistory []openai.ChatCompletionMessage) {
client := openai.NewClient(OpenAIToken) client := openai.NewClient(OpenAIToken)
@ -80,41 +94,34 @@ func chatGPT(session *discordgo.Session, channelID string, message string, conve
}) })
} }
} }
// Combine messages from conversation history
messages := []openai.ChatCompletionMessage{}
// Add conversation history to messages
messages = append(messages, conversationHistory...)
// Add user message to conversation history
userMessage := openai.ChatCompletionMessage{
Role: openai.ChatMessageRoleUser,
Content: message,
}
messages = append(messages, userMessage)
// Trim conversation history if it exceeds maxContextTokens // Trim conversation history if it exceeds maxContextTokens
totalTokens := 0 totalTokens := 0
trimmedMessages := []openai.ChatCompletionMessage{} trimmedMessages := []openai.ChatCompletionMessage{}
for i := 0; i < len(messages); i++ { for i := len(conversationHistory) - 1; i >= 0; i-- {
msg := messages[i] msg := conversationHistory[i]
tokens := len(msg.Content) + len(msg.Role) + 2 // Account for role and content tokens tokens := len(msg.Content) + len(msg.Role) + 2 // Account for role and content tokens
if totalTokens+tokens <= maxContextTokens { if totalTokens+tokens <= maxContextTokens {
trimmedMessages = append(trimmedMessages, msg) trimmedMessages = append([]openai.ChatCompletionMessage{msg}, trimmedMessages...)
totalTokens += tokens totalTokens += tokens
} else { } else {
break break
} }
} }
// Update messages with trimmed conversation history // Update conversationHistory with trimmed conversation history
messages = trimmedMessages conversationHistory = trimmedMessages
// Add user message to conversation history
userMessage := openai.ChatCompletionMessage{
Role: openai.ChatMessageRoleUser,
Content: message,
}
conversationHistory = append(conversationHistory, userMessage)
// Perform GPT-4 completion // Perform GPT-4 completion
log.Info("Starting completion...") log.Info("Starting completion...", conversationHistory)
resp, err := client.CreateChatCompletion( resp, err := client.CreateChatCompletion(
context.Background(), context.Background(),
openai.ChatCompletionRequest{ openai.ChatCompletionRequest{
@ -122,11 +129,13 @@ func chatGPT(session *discordgo.Session, channelID string, message string, conve
FrequencyPenalty: 0.3, FrequencyPenalty: 0.3,
PresencePenalty: 0.6, PresencePenalty: 0.6,
Model: openai.GPT3Dot5Turbo, Model: openai.GPT3Dot5Turbo,
Messages: messages, Messages: conversationHistory, // Use trimmed conversation history
}, },
) )
log.Info("completion done.") log.Info("completion done.")
// ...
// Handle API errors // Handle API errors
if err != nil { if err != nil {
log.Error("Error connecting to the OpenAI API:", err) log.Error("Error connecting to the OpenAI API:", err)

Binary file not shown.