This commit is contained in:
2023-12-13 06:30:25 +00:00
parent a0cec865f2
commit 107624359b
3 changed files with 208 additions and 63 deletions

View File

@@ -363,12 +363,147 @@ end
# return thinkingmode
# end
#WORKING
function isUseTools(a::agentReflex)
toollines = ""
for (toolname, v) in a.tools
if toolname ["chatbox"]
toolline = "$toolname: $(v[:description]) $(v[:input]) $(v[:output])\n"
toollines *= toolline
end
end
conversation = messagesToString_nomark(a.messages)
prompt =
"""
<|im_start|>system
$(a.roles[a.role])
You have access to the following tools:
$toollines
Your conversation with the user:
$conversation
From the user's message, ask yourself what do you need to do?
<|im_end|>
<|im_start|>assistant
"""
# if LLM mentions any tools, use Plan/Thought/Act loop
isusetool = false
result = sendReceivePrompt(a, prompt, temperature=0.2)
for (toolname, v) in a.tools
if occursin(toolname, result)
isusetool = true
break
end
end
plan = "N/A"
if isusetool
toollines = ""
for (toolname, v) in a.tools
if toolname [""]
toolline = "$toolname: $(v[:description]) $(v[:input]) $(v[:output])\n"
toollines *= toolline
end
end
assistant_objective_prompt =
"""
<|im_start|>system
$(a.roles[a.role])
The info you need from the user to be able to help them selecting their best wine:
- type of food
- occasion
- user's personal taste of wine
- wine price range
- ambient temperature at the serving location
- wines we have in stock
You provide a personalized recommendation of up to two wines based on the user's info above, and you describe the benefits of each wine in detail.
You have access to the following tools:
$toollines
Your conversation with the user:
$conversation
Use the following format:
1. Objective: From your conversation with the user, ask yourself what do you need to do now?
2. Plan: first you should always think about the stimulus, the info you need and the info you have thoroughly then extract and devise a step by step plan (pay attention to correct numeral calculation and commonsense).
<|im_end|>
"""
assistant_objective_result = sendReceivePrompt(a, assistant_objective_prompt, temperature=0.2)
@show assistant_objective_result
end
return isusetool, plan
end
# function isUseTools(a::agentReflex)
# toollines = ""
# for (toolname, v) in a.tools
# if toolname ∉ ["chatbox"]
# toolline = "$toolname: $(v[:description]) $(v[:input]) $(v[:output])\n"
# toollines *= toolline
# end
# end
# conversation = messagesToString_nomark(a.messages)
# prompt =
# """
# <|im_start|>system
# $(a.roles[a.role])
# You have access to the following tools:
# $toollines
# Your conversation with the user:
# $conversation
# From your conversation, ask yourself what do you need to do now?
# <|im_end|>
# """
# # if LLM mentions any tools, use Plan/Thought/Act loop
# isusetool = false
# result = sendReceivePrompt(a, prompt, temperature=0.2)
# for (toolname, v) in a.tools
# if occursin(toolname, result)
# isusetool = true
# break
# end
# end
# @show prompt
# whattodo = result
# @show whattodo
# return isusetool, whattodo
# end
# function isUseTools(a::agentReflex, usermsg::String)
# prompt =
# toollines = ""
# for (toolname, v) in a.tools
# if toolname ∉ ["chatbox"]
# toolline = "$toolname: $(v[:description]) $(v[:input]) $(v[:output])\n"
# toollines *= toolline
# end
# end
# prompt =
# """
# <|im_start|>system
# {systemMsg}
# $(a.roles[a.role])
# You have access to the following tools:
# $toollines
# Your earlier conversation with the user:
# None
@@ -376,73 +511,28 @@ end
# User's message:
# $usermsg
# From the user's message, Are there any explicit request from the user? Answer: {Yes/No/Not sure}. What do you need to do?
# From the user's message, ask yourself what do you need to do?
# <|im_end|>
# <|im_start|>assistant
# Answer:
# """
# toollines = ""
# # if LLM mentions any tools, use Plan/Thought/Act loop
# isusetool = false
# result = sendReceivePrompt(a, prompt, temperature=0.2)
# for (toolname, v) in a.tools
# if toolname ∉ [:chatbox]
# toolline = "$toolname: $(v[:description]) $(v[:input]) $(v[:output])\n"
# toollines *= toolline
# if occursin(toolname, result)
# isusetool = true
# break
# end
# end
# prompt = replace(prompt, "{systemMsg}" => a.roles[a.role])
# prompt = replace(prompt, "{tools}" => toollines)
# result = sendReceivePrompt(a, prompt, temperature=0.2)
# if occursin("Yes", result)
# isUseTool = result
# @show isUseTool
# return true
# else
# return false
# end
# whattodo = result
# @show whattodo
# return isusetool, whattodo
# end
function isUseTools(a::agentReflex, usermsg::String)
toollines = ""
for (toolname, v) in a.tools
if toolname ["chatbox"]
toolline = "$toolname: $(v[:description]) $(v[:input]) $(v[:output])\n"
toollines *= toolline
end
end
prompt =
"""
<|im_start|>system
$(a.roles[a.role])
You have access to the following tools:
$toollines
Your earlier conversation with the user:
None
User's message:
$usermsg
From the user's message, what to do?
<|im_end|>
<|im_start|>assistant
"""
# if LLM mentions any tools, use Plan/Thought/Act loop
isusetool = false
result = sendReceivePrompt(a, prompt, temperature=0.2)
for (toolname, v) in a.tools
if occursin(toolname, result)
isusetool = true
break
end
end
return isusetool
end
@@ -561,6 +651,61 @@ function messagesToString(messages::AbstractVector{T}; addressAIas="assistant")
return conversation
end
#WORKING
function messagesToString_nomark(messages::AbstractVector{T}; addressAIas="assistant") where {T<:AbstractDict}
conversation = ""
if length(messages)!= 0
for msg in messages
role = msg[:role]
content = msg[:content]
content = removeTrailingCharacters(content)
if role == "user"
conversation *= "$role: $content\n"
elseif role == "assistant"
conversation *= "$addressAIas: $content\n"
else
error("undefied condition role = $role $(@__LINE__)")
end
end
else
conversation = "N/A"
end
return conversation
end
""" Remove trailing characters from text.
Arguments:
text, text you want to remove trailing characters
charTobeRemoved, a list of characters to be removed
Return:
text with specified trailing characters removed
# Example
```jldoctest
julia> text = "Hello! How can I assist you today?\n\n "
julia> removelist = ['\n', ' ',]
julia> removeTrailingCharacters(text, charTobeRemoved=removelist)
"Hello! How can I assist you today?"
```
"""
function removeTrailingCharacters(text; charTobeRemoved::AbstractVector{T}=['\n', ' ',]) where {T<:Char}
nouse = 0
for i in reverse(text)
if i charTobeRemoved
nouse += 1
else
break
end
end
return text[1:end-nouse]
end
#TODO
function checkReasonableness(userMsg::String, context::String, tools)
@@ -817,7 +962,7 @@ OrderedDict(
"Plan 2:" => "I'm meeting my wife this afternoon",
)
```
""" #WORKING
"""
function removeHeaders(shortMemory::OrderedDict, step::Int,
skipHeaders::Union{Array{String}, Array{Symbol}, Nothing}=nothing)