diff --git a/src/interface.jl b/src/interface.jl index 65730ca..03386f4 100644 --- a/src/interface.jl +++ b/src/interface.jl @@ -284,12 +284,13 @@ function decisionMaker(a::T; recent::Integer=10 # end # change qwen format put in model format - prompt = GeneralUtils.formatLLMtext(unformatPrompt; formatname="qwen") + prompt = GeneralUtils.formatLLMtext(unformatPrompt, "granite3") response = a.func[:text2textInstructLLM](prompt) response = GeneralUtils.remove_french_accents(response) response = replace(response, "**"=>"") response = replace(response, "***"=>"") response = replace(response, "<|eot_id|>"=>"") + response = GeneralUtils.deFormatLLMtext(response, "granite3") # check if response contain more than one functions from ["CHATBOX", "CHECKINVENTORY", "ENDCONVERSATION"] count = 0 @@ -300,7 +301,7 @@ function decisionMaker(a::T; recent::Integer=10 end if count > 1 errornote = "You must use only one function" - println("\nYiemAgent decisionMaker() $errornote ", @__FILE__, ":", @__LINE__, " $(Dates.now())") + println("\nYiemAgent decisionMaker() $errornote\n$response ", @__FILE__, ":", @__LINE__, " $(Dates.now())") continue end @@ -601,7 +602,7 @@ end # # end # # change qwen format put in model format -# prompt = GeneralUtils.formatLLMtext(unformatPrompt; formatname="qwen") +# prompt = GeneralUtils.formatLLMtext(unformatPrompt, "granite3") # response = a.func[:text2textInstructLLM](prompt) # response = GeneralUtils.remove_french_accents(response) @@ -832,7 +833,7 @@ function evaluator(state::T1, text2textInstructLLM::Function ] # put in model format - prompt = GeneralUtils.formatLLMtext(_prompt; formatname="qwen") + prompt = GeneralUtils.formatLLMtext(_prompt, "granite3") header = ["Trajectory_evaluation:", "Answer_evaluation:", "Accepted_as_answer:", "Score:", "Suggestion:"] dictkey = ["trajectory_evaluation", "answer_evaluation", "accepted_as_answer", "score", "suggestion"] @@ -842,6 +843,7 @@ function evaluator(state::T1, text2textInstructLLM::Function # sometime LLM output something like **Comprehension**: which is not expected response = replace(response, "**"=>"") response = replace(response, "***"=>"") + response = GeneralUtils.deFormatLLMtext(response, "granite3") # check whether response has all header detected_kw = GeneralUtils.detect_keyword(header, response) @@ -1084,8 +1086,7 @@ function think(a::T)::NamedTuple{(:actionname, :result),Tuple{String,String}} wh # ) # ) # result = chatresponse - if actionname ∈ ["CHATBOX", "ENDCONVERSATION"] - # chatresponse = generatechat(a, thoughtDict) + if actionname ∈ ["CHATBOX"] push!(a.memory[:events], eventdict(; event_description="the assistant talks to the user.", @@ -1097,6 +1098,19 @@ function think(a::T)::NamedTuple{(:actionname, :result),Tuple{String,String}} wh ) ) result = actioninput + elseif actionname ∈ ["ENDCONVERSATION"] + chatresponse = generatechat(a, thoughtDict) + push!(a.memory[:events], + eventdict(; + event_description="the assistant talks to the user.", + timestamp=Dates.now(), + subject="assistant", + thought=thoughtDict, + actionname=actionname, + actioninput=chatresponse, + ) + ) + result = chatresponse elseif actionname ∈ ["PRESENTBOX"] chatresponse = presentbox(a, thoughtDict) push!(a.memory[:events], @@ -1132,8 +1146,8 @@ function think(a::T)::NamedTuple{(:actionname, :result),Tuple{String,String}} wh subject= "assistant", thought=thoughtDict, actionname=actionname, - actioninput= "I searched the database with this query: $actioninput", - outcome= "This is what I've found in the database, $result" + actioninput= "I found something in the database using this SQL: $actioninput", + outcome= "This is what I found:, $result" ) ) else @@ -1193,7 +1207,7 @@ function presentbox(a::sommelier, thoughtDict) if attempt > 1 # use to prevent LLM generate the same respond over and over println("\nYiemAgent presentbox() attempt $attempt/10 ", @__FILE__, ":", @__LINE__, " $(Dates.now())") # yourthought1 = paraphrase(a.func[:text2textInstructLLM], yourthought) - # llmkwargs[:temperature] = 0.1 * attempt + # llmkwargs[:temperature] += 0.1 else # yourthought1 = yourthought end @@ -1213,7 +1227,7 @@ function presentbox(a::sommelier, thoughtDict) ] # put in model format - prompt = GeneralUtils.formatLLMtext(_prompt; formatname="qwen") + prompt = GeneralUtils.formatLLMtext(_prompt, "granite3") response = a.func[:text2textInstructLLM](prompt) @@ -1234,6 +1248,7 @@ function presentbox(a::sommelier, thoughtDict) response = replace(response, '`' => "") response = replace(response, "<|eot_id|>"=>"") response = GeneralUtils.remove_french_accents(response) + response = GeneralUtils.deFormatLLMtext(response, "granite3") # check whether response has all header detected_kw = GeneralUtils.detect_keyword(header, response) @@ -1371,14 +1386,14 @@ function generatechat(a::sommelier, thoughtDict) llmkwargs=Dict( :num_ctx => 32768, - :temperature => 0.1, + :temperature => 0.2, ) for attempt in 1:10 if attempt > 1 # use to prevent LLM generate the same respond over and over println("\nYiemAgent generatchat() attempt $attempt/10 ", @__FILE__, ":", @__LINE__, " $(Dates.now())") yourthought1 = paraphrase(a.func[:text2textInstructLLM], yourthought) - llmkwargs[:temperature] = 0.1 * attempt + llmkwargs[:temperature] += 0.1 else yourthought1 = yourthought end @@ -1398,8 +1413,9 @@ function generatechat(a::sommelier, thoughtDict) ] # put in model format - prompt = GeneralUtils.formatLLMtext(_prompt; formatname="qwen") + prompt = GeneralUtils.formatLLMtext(_prompt, "granite3") response = a.func[:text2textInstructLLM](prompt; llmkwargs=llmkwargs) + response = GeneralUtils.deFormatLLMtext(response, "granite3") # sometime the model response like this "here's how I would respond: ..." if occursin("respond:", response) @@ -1476,7 +1492,7 @@ function generatechat(a::sommelier, thoughtDict) error("generatechat failed to generate a response") end -#[WORKING] modify it to work with customer object +# modify it to work with customer object function generatechat(a::companion; converPartnerName::Union{String, Nothing}=nothing) # header = ["Dialogue:"] @@ -1509,12 +1525,13 @@ function generatechat(a::companion; converPartnerName::Union{String, Nothing}=no end # put in model format - _prompt = GeneralUtils.formatLLMtext(_prompt; formatname="qwen") + _prompt = GeneralUtils.formatLLMtext(_prompt, "granite3") prompt = replace(_prompt, "|>user"=>"|>$(converPartnerName)") prompt = replace(prompt, "|>assistant"=>"|>$(a.name)") response = a.func[:text2textInstructLLM](prompt; llmkwargs=llmkwargs) response = replace(response, "<|im_start|>"=> "") + response = GeneralUtils.deFormatLLMtext(response, "granite3") # check whether LLM just repeat the previous dialogue for msg in a.chathistory @@ -1528,6 +1545,8 @@ function generatechat(a::companion; converPartnerName::Union{String, Nothing}=no #[WORKING] some time it copy exactly the same text as previous conversation partner msg. + + # # check whether response has all header # detected_kw = GeneralUtils.detect_keyword(header, response) @@ -1648,8 +1667,6 @@ function generatequestion(a, text2textInstructLLM::Function; A: ... Q: Do I have what the user is looking for in our stock? A: ... - Q: Did I introduce what I found in our inventory to the user already? - A: According to my conversation with the user, not yet. Q: Am I certain about the information I'm going to share with the user, or should I verify the information first? A: ... Q: What should I do? @@ -1705,7 +1722,7 @@ function generatequestion(a, text2textInstructLLM::Function; for attempt in 1:10 if attempt > 1 println("\nYiemAgent generatequestion() attempt $attempt/10 ", @__FILE__, ":", @__LINE__, " $(Dates.now())") - llmkwargs[:temperature] = 0.1 * attempt + llmkwargs[:temperature] += 0.1 end usermsg = @@ -1723,9 +1740,10 @@ function generatequestion(a, text2textInstructLLM::Function; ] # put in model format - prompt = GeneralUtils.formatLLMtext(_prompt; formatname="qwen") + prompt = GeneralUtils.formatLLMtext(_prompt, "granite3") response = text2textInstructLLM(prompt, modelsize="medium", llmkwargs=llmkwargs) + response = GeneralUtils.deFormatLLMtext(response, "granite3") # make sure generatequestion() don't have wine name that is not from retailer inventory # check whether an agent recommend wines before checking inventory or recommend wines # outside its inventory @@ -1852,9 +1870,10 @@ function generateSituationReport(a, text2textInstructLLM::Function; skiprecent:: ] # put in model format - prompt = GeneralUtils.formatLLMtext(_prompt; formatname="qwen") + prompt = GeneralUtils.formatLLMtext(_prompt, "granite3") response = text2textInstructLLM(prompt) + response = GeneralUtils.deFormatLLMtext(response, "granite3") # check whether response has all header detected_kw = GeneralUtils.detect_keyword(header, response) @@ -1923,10 +1942,11 @@ function detectWineryName(a, text) ] # put in model format - prompt = GeneralUtils.formatLLMtext(_prompt; formatname="qwen") + prompt = GeneralUtils.formatLLMtext(_prompt, "granite3") try response = a.func[:text2textInstructLLM](prompt) + response = GeneralUtils.deFormatLLMtext(response, "granite3") println("\ndetectWineryName() ", @__FILE__, ":", @__LINE__, " $(Dates.now())") pprintln(response) diff --git a/src/llmfunction.jl b/src/llmfunction.jl index dbc02f6..1f480dc 100644 --- a/src/llmfunction.jl +++ b/src/llmfunction.jl @@ -406,9 +406,10 @@ function extractWineAttributes_1(a::T1, input::T2)::String where {T1<:agent, T2< ] # put in model format - prompt = GeneralUtils.formatLLMtext(_prompt; formatname="qwen") + prompt = GeneralUtils.formatLLMtext(_prompt, "granite3") response = a.func[:text2textInstructLLM](prompt) response = GeneralUtils.remove_french_accents(response) + response = GeneralUtils.deFormatLLMtext(response, "granite3") # check wheter all attributes are in the response checkFlag = false @@ -640,9 +641,10 @@ function extractWineAttributes_2(a::T1, input::T2)::String where {T1<:agent, T2< ] # put in model format - prompt = GeneralUtils.formatLLMtext(_prompt; formatname="qwen") + prompt = GeneralUtils.formatLLMtext(_prompt, "granite3") response = a.func[:text2textInstructLLM](prompt) + response = GeneralUtils.deFormatLLMtext(response, "granite3") # check whether response has all header detected_kw = GeneralUtils.detect_keyword(header, response) @@ -765,10 +767,11 @@ function paraphrase(text2textInstructLLM::Function, text::String) ] # put in model format - prompt = GeneralUtils.formatLLMtext(_prompt; formatname="qwen") + prompt = GeneralUtils.formatLLMtext(_prompt, "granite3") try response = text2textInstructLLM(prompt) + response = GeneralUtils.deFormatLLMtext(response, "granite3") # sometime the model response like this "here's how I would respond: ..." if occursin("respond:", response) errornote = "You don't need to intro your response" @@ -984,7 +987,7 @@ end # ] # # put in model format -# prompt = GeneralUtils.formatLLMtext(_prompt; formatname="qwen") +# prompt = GeneralUtils.formatLLMtext(_prompt, "granite3") # prompt *= # """ # <|start_header_id|>assistant<|end_header_id|> diff --git a/src/util.jl b/src/util.jl index 175480e..dd13f97 100644 --- a/src/util.jl +++ b/src/util.jl @@ -284,35 +284,6 @@ timeline = createTimeline(events) # 2) Assistant> Hi there! with a smile """ -# function createTimeline(events::T1; eventindex::Union{UnitRange, Nothing}=nothing -# ) where {T1<:AbstractVector} -# # Initialize empty timeline string -# timeline = "" - -# # Determine which indices to use - either provided range or full length -# ind = -# if eventindex !== nothing -# [eventindex...] -# else -# 1:length(events) -# end - -# # Iterate through events and format each one -# for (i, event) in zip(ind, events) -# # If no outcome exists, format without outcome -# if event[:outcome] === nothing -# timeline *= "Event_$i $(event[:subject])> $(event[:actioninput])\n" -# # If outcome exists, include it in formatting -# else -# timeline *= "Event_$i $(event[:subject])> $(event[:actioninput]) $(event[:outcome])\n" -# end -# end - -# # Return formatted timeline string -# return timeline -# end - - function createTimeline(events::T1; eventindex::Union{UnitRange, Nothing}=nothing ) where {T1<:AbstractVector} # Initialize empty timeline string @@ -329,13 +300,11 @@ function createTimeline(events::T1; eventindex::Union{UnitRange, Nothing}=nothin # Iterate through events and format each one for (i, event) in zip(ind, events) # If no outcome exists, format without outcome - subject = titlecase(event[:subject]) if event[:outcome] === nothing - - timeline *= "Event_$i) Who: $subject Action_name: $(event[:actionname]) Action_input: $(event[:actioninput])\n" + timeline *= "Event_$i $(event[:subject])> $(event[:actioninput])\n" # If outcome exists, include it in formatting else - timeline *= "Event_$i) Who: $subject Action_name: $(event[:actionname]) Action_input: $(event[:actioninput]) Action output: $(event[:outcome])\n" + timeline *= "Event_$i $(event[:subject])> $(event[:actioninput]) $(event[:outcome])\n" end end @@ -344,6 +313,37 @@ function createTimeline(events::T1; eventindex::Union{UnitRange, Nothing}=nothin end +# function createTimeline(events::T1; eventindex::Union{UnitRange, Nothing}=nothing +# ) where {T1<:AbstractVector} +# # Initialize empty timeline string +# timeline = "" + +# # Determine which indices to use - either provided range or full length +# ind = +# if eventindex !== nothing +# [eventindex...] +# else +# 1:length(events) +# end + +# # Iterate through events and format each one +# for (i, event) in zip(ind, events) +# # If no outcome exists, format without outcome +# subject = titlecase(event[:subject]) +# if event[:outcome] === nothing + +# timeline *= "Event_$i) Who: $subject Action_name: $(event[:actionname]) Action_input: $(event[:actioninput])\n" +# # If outcome exists, include it in formatting +# else +# timeline *= "Event_$i) Who: $subject Action_name: $(event[:actionname]) Action_input: $(event[:actioninput]) Action output: $(event[:outcome])\n" +# end +# end + +# # Return formatted timeline string +# return timeline +# end + +