From cda177a270baa2f2b8eb74912bf2971045a851cd Mon Sep 17 00:00:00 2001 From: narawat Date: Mon, 9 Oct 2023 13:53:07 +0000 Subject: [PATCH] add method --- src/ChatAgent.jl | 2 +- src/interface.jl | 65 +++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/src/ChatAgent.jl b/src/ChatAgent.jl index 518b220..bcc89f3 100644 --- a/src/ChatAgent.jl +++ b/src/ChatAgent.jl @@ -1,6 +1,6 @@ module ChatAgent - # export + # export agent, addNewMessage, clearMessage """ Order by dependencies of each file. The 1st included file must not depend on any other diff --git a/src/interface.jl b/src/interface.jl index 9f35dd9..d077078 100644 --- a/src/interface.jl +++ b/src/interface.jl @@ -1,7 +1,7 @@ module interface -# export +export agent, addNewMessage, clearMessage using JSON3, DataStructures @@ -11,7 +11,7 @@ using JSON3, DataStructures @kwdef mutable struct agent sessionId::Int= 1 - maxConversation::Int= 10 + maxUserMsg::Int= 10 """ Dict(Role=> Content) ; Role can be system, user, assistant Example: @@ -26,26 +26,67 @@ using JSON3, DataStructures messages=[Dict(:role=>"system", :content=> "You are a helpful assistant."),] end +""" + add new message to agent +# Example +```jldoctest +julia> addNewMessage(agent1, "user", "no") +```` +""" function addNewMessage(a::agent, role::String, content::String) - d = Dict(:role=> role, :content=> content) - push!(a.messages, d) + # check whether user messages exceed limit + userMsg = 0 + for i in a.messages + if i[:role] == "user" + userMsg += 1 + end + end + messageleft = 0 + + if userMsg > a.maxUserMsg # delete all conversation + clearMessage(a) + messageleft = a.maxUserMsg + else + userMsg += 1 + d = Dict(:role=> role, :content=> content) + push!(a.messages, d) + messageleft = a.maxUserMsg - userMsg + end + + return messageleft end + function clearMessage(a::agent) for i in eachindex(a.messages) - pop!(a.messages) + if length(a.messages) > 1 # system instruction will NOT be deleted + pop!(a.messages) + else + break + end end end +function generatePromt(a::agent, + userToken::String=" [/INST]", assistantToken=" [INST]", + systemToken="[INST]<> content <>") + prompt = nothing + for msg in a.messages + role = msg[:role] + content = msg[:content] + if role == "system" + prompt = replace(systemToken, "content" => content) + elseif role == "user" + prompt *= content * userToken + elseif role == "assistant" + prompt *= content * assistantToken + else + error("undefied condition role = $role") + end - - - - - - - + return prompt +end