update
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
# This file is machine-generated - editing it directly is not advised
|
# This file is machine-generated - editing it directly is not advised
|
||||||
|
|
||||||
julia_version = "1.10.2"
|
julia_version = "1.10.3"
|
||||||
manifest_format = "2.0"
|
manifest_format = "2.0"
|
||||||
project_hash = "60ddc268a63725d93580a5caeda2cac7b1579c68"
|
project_hash = "c6233f8bf690740dd830d1f0927bd3afed93b8d2"
|
||||||
|
|
||||||
[[deps.ArgTools]]
|
[[deps.ArgTools]]
|
||||||
uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f"
|
uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f"
|
||||||
@@ -50,7 +50,7 @@ weakdeps = ["Dates", "LinearAlgebra"]
|
|||||||
[[deps.CompilerSupportLibraries_jll]]
|
[[deps.CompilerSupportLibraries_jll]]
|
||||||
deps = ["Artifacts", "Libdl"]
|
deps = ["Artifacts", "Libdl"]
|
||||||
uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae"
|
uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae"
|
||||||
version = "1.1.0+0"
|
version = "1.1.1+0"
|
||||||
|
|
||||||
[[deps.ConcurrentUtilities]]
|
[[deps.ConcurrentUtilities]]
|
||||||
deps = ["Serialization", "Sockets"]
|
deps = ["Serialization", "Sockets"]
|
||||||
@@ -392,6 +392,11 @@ git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6"
|
|||||||
uuid = "21216c6a-2e73-6563-6e65-726566657250"
|
uuid = "21216c6a-2e73-6563-6e65-726566657250"
|
||||||
version = "1.4.3"
|
version = "1.4.3"
|
||||||
|
|
||||||
|
[[deps.PrettyPrinting]]
|
||||||
|
git-tree-sha1 = "142ee93724a9c5d04d78df7006670a93ed1b244e"
|
||||||
|
uuid = "54e16d92-306c-5ea0-a30b-337be88ac337"
|
||||||
|
version = "0.4.2"
|
||||||
|
|
||||||
[[deps.Printf]]
|
[[deps.Printf]]
|
||||||
deps = ["Unicode"]
|
deps = ["Unicode"]
|
||||||
uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7"
|
uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7"
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ GeneralUtils = "c6c72f09-b708-4ac8-ac7c-2084d70108fe"
|
|||||||
HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3"
|
HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3"
|
||||||
JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1"
|
JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1"
|
||||||
MQTTClient = "985f35cc-2c3d-4943-b8c1-f0931d5f0959"
|
MQTTClient = "985f35cc-2c3d-4943-b8c1-f0931d5f0959"
|
||||||
|
PrettyPrinting = "54e16d92-306c-5ea0-a30b-337be88ac337"
|
||||||
PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d"
|
PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d"
|
||||||
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
|
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
|
||||||
URIs = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4"
|
URIs = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4"
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ module interface
|
|||||||
|
|
||||||
export addNewMessage, conversation, decisionMaker, progressValueEstimator, isterminal
|
export addNewMessage, conversation, decisionMaker, progressValueEstimator, isterminal
|
||||||
|
|
||||||
using JSON3, DataStructures, Dates, UUIDs, HTTP, Random, MQTTClient
|
using JSON3, DataStructures, Dates, UUIDs, HTTP, Random, MQTTClient, PrettyPrinting
|
||||||
using GeneralUtils
|
using GeneralUtils
|
||||||
using ..type, ..util, ..llmfunction, ..mcts
|
using ..type, ..util, ..llmfunction, ..mcts
|
||||||
|
|
||||||
@@ -98,6 +98,16 @@ function decisionMaker(a::T1, state::T2)::Dict{Symbol, Any} where {T1<:agent, T2
|
|||||||
# (trajectories)
|
# (trajectories)
|
||||||
# """
|
# """
|
||||||
|
|
||||||
|
responseformat =
|
||||||
|
"""
|
||||||
|
You should only respond in JSON format as describe below:
|
||||||
|
{
|
||||||
|
"Thought": "your reasoning",
|
||||||
|
"Action": {"name": "action to take", "input": "Action input"},
|
||||||
|
"Observation": "result of the action"
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
_prompt =
|
_prompt =
|
||||||
"""
|
"""
|
||||||
You are a helpful sommelier working for a wine store.
|
You are a helpful sommelier working for a wine store.
|
||||||
@@ -119,12 +129,7 @@ function decisionMaker(a::T1, state::T2)::Dict{Symbol, Any} where {T1<:agent, T2
|
|||||||
2) chatbox[text], which you can use to interact with the user.
|
2) chatbox[text], which you can use to interact with the user.
|
||||||
3) recommendation[answer], which returns your wine reccommendation to the user.
|
3) recommendation[answer], which returns your wine reccommendation to the user.
|
||||||
|
|
||||||
You should only respond in JSON format as describe below:
|
$responseformat
|
||||||
{
|
|
||||||
"Thought": "your reasoning",
|
|
||||||
"Action": {"name": "action to take", "input": "Action input"},
|
|
||||||
"Observation": "result of the action"
|
|
||||||
}
|
|
||||||
|
|
||||||
Here are some examples:
|
Here are some examples:
|
||||||
{
|
{
|
||||||
@@ -164,12 +169,18 @@ function decisionMaker(a::T1, state::T2)::Dict{Symbol, Any} where {T1<:agent, T2
|
|||||||
:msgMeta=> msgMeta,
|
:msgMeta=> msgMeta,
|
||||||
:payload=> Dict(
|
:payload=> Dict(
|
||||||
:text=> prompt,
|
:text=> prompt,
|
||||||
|
:kwargs=> Dict(
|
||||||
|
:max_tokens=> 512,
|
||||||
|
:stop=> ["<|eot_id|>"],
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@show outgoingMsg
|
|
||||||
_response = GeneralUtils.sendReceiveMqttMsg(outgoingMsg)
|
_response = GeneralUtils.sendReceiveMqttMsg(outgoingMsg)
|
||||||
thoughtJsonStr = _response[:response][:text]
|
_thoughtJsonStr = _response[:response][:text]
|
||||||
|
thoughtJsonStr = jsoncorrection(a, _thoughtJsonStr, "")
|
||||||
thoughtDict = copy(JSON3.read(thoughtJsonStr))
|
thoughtDict = copy(JSON3.read(thoughtJsonStr))
|
||||||
|
pprint(thoughtDict)
|
||||||
return thoughtDict
|
return thoughtDict
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -196,6 +207,17 @@ julia>
|
|||||||
# Signature
|
# Signature
|
||||||
"""
|
"""
|
||||||
function progressValueEstimator(a::T1, state::T2)::Tuple{String, Integer} where {T1<:agent, T2<:AbstractDict}
|
function progressValueEstimator(a::T1, state::T2)::Tuple{String, Integer} where {T1<:agent, T2<:AbstractDict}
|
||||||
|
responseformat =
|
||||||
|
"""
|
||||||
|
You should only respond in JSON format as describe below:
|
||||||
|
{
|
||||||
|
"Thought_1": "reasoning 1",
|
||||||
|
"Action_1": {"name": "action to take", "input": "Action input"},
|
||||||
|
"Observation_1": "result of the action",
|
||||||
|
"Evaluation_1": {"evaluation": "your evaluation", "score": your evaluation score}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
_prompt =
|
_prompt =
|
||||||
"""
|
"""
|
||||||
Analyze the trajectories of a solution to a question answering task. The trajectories are
|
Analyze the trajectories of a solution to a question answering task. The trajectories are
|
||||||
@@ -211,13 +233,7 @@ function progressValueEstimator(a::T1, state::T2)::Tuple{String, Integer} where
|
|||||||
yet. Do not generate additional thoughts or actions. Then ending with the correctness score s
|
yet. Do not generate additional thoughts or actions. Then ending with the correctness score s
|
||||||
where s is an integer from 1 to 10.
|
where s is an integer from 1 to 10.
|
||||||
|
|
||||||
You should only respond in JSON format as describe below:
|
$responseformat
|
||||||
{
|
|
||||||
"Thought_1": "reasoning 1",
|
|
||||||
"Action_1": {"name": "action to take", "input": "Action input"},
|
|
||||||
"Observation_1": "result of the action",
|
|
||||||
"Evaluation_1": {"evaluation": "your evaluation", "score": your evaluation score}
|
|
||||||
}
|
|
||||||
|
|
||||||
Here are some examples:
|
Here are some examples:
|
||||||
{
|
{
|
||||||
@@ -232,6 +248,7 @@ function progressValueEstimator(a::T1, state::T2)::Tuple{String, Integer} where
|
|||||||
"score": 10}
|
"score": 10}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Let's begin!:
|
||||||
$(JSON3.write(state[:thoughtHistory]))
|
$(JSON3.write(state[:thoughtHistory]))
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@@ -254,7 +271,8 @@ function progressValueEstimator(a::T1, state::T2)::Tuple{String, Integer} where
|
|||||||
)
|
)
|
||||||
|
|
||||||
_response = GeneralUtils.sendReceiveMqttMsg(outgoingMsg)
|
_response = GeneralUtils.sendReceiveMqttMsg(outgoingMsg)
|
||||||
thoughtJsonStr = _response[:response][:text]
|
_thoughtJsonStr = _response[:response][:text]
|
||||||
|
thoughtJsonStr = jsoncorrection(a, _thoughtJsonStr, responseformat)
|
||||||
thoughtDict = copy(JSON3.read(thoughtJsonStr))
|
thoughtDict = copy(JSON3.read(thoughtJsonStr))
|
||||||
latestEvaluationKey, _ =
|
latestEvaluationKey, _ =
|
||||||
GeneralUtils.findHighestIndexKey(thoughtDict, "Evaluation")
|
GeneralUtils.findHighestIndexKey(thoughtDict, "Evaluation")
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
module llmfunction
|
module llmfunction
|
||||||
|
|
||||||
export virtualWineCustomerChatbox
|
export virtualWineCustomerChatbox, jsoncorrection
|
||||||
|
|
||||||
using HTTP, JSON3, URIs, Random
|
using HTTP, JSON3, URIs, Random
|
||||||
using GeneralUtils
|
using GeneralUtils
|
||||||
@@ -362,6 +362,115 @@ end
|
|||||||
# return result
|
# return result
|
||||||
# end
|
# end
|
||||||
|
|
||||||
|
|
||||||
|
""" Attemp to correct LLM response's incorrect JSON response.
|
||||||
|
|
||||||
|
# Arguments
|
||||||
|
- `a::T1`
|
||||||
|
one of Yiem's agent
|
||||||
|
- `input::T2`
|
||||||
|
text to be send to virtual wine customer
|
||||||
|
|
||||||
|
# Return
|
||||||
|
- `response::String`
|
||||||
|
response of virtual wine customer
|
||||||
|
# Example
|
||||||
|
```jldoctest
|
||||||
|
julia>
|
||||||
|
```
|
||||||
|
|
||||||
|
# TODO
|
||||||
|
- [] update docstring
|
||||||
|
- [TESTING] implement the function
|
||||||
|
|
||||||
|
# Signature
|
||||||
|
"""
|
||||||
|
function jsoncorrection(a::T1, input::T2,
|
||||||
|
correctJsonExample::T3) where {T1<:agent, T2<:AbstractString, T3<:AbstractString}
|
||||||
|
|
||||||
|
attemptround = 0
|
||||||
|
incorrectjson = input
|
||||||
|
correctjson = nothing
|
||||||
|
while true
|
||||||
|
attemptround += 1
|
||||||
|
if attemptround <= 5
|
||||||
|
try
|
||||||
|
JSON3.read(incorrectjson)
|
||||||
|
correctjson = incorrectjson
|
||||||
|
break
|
||||||
|
catch
|
||||||
|
println("Attempting correct JSON string. $attempting")
|
||||||
|
_prompt =
|
||||||
|
"""
|
||||||
|
Your goal is to correct a given incorrect JSON string.
|
||||||
|
|
||||||
|
$correctJsonExample
|
||||||
|
|
||||||
|
Incorrect JSON:
|
||||||
|
$incorrectjson
|
||||||
|
Corrention:
|
||||||
|
"""
|
||||||
|
|
||||||
|
externalService = a.config[:externalservice][:text2textinstruct]
|
||||||
|
llminfo = externalService[:llminfo]
|
||||||
|
prompt =
|
||||||
|
if llminfo[:name] == "llama3instruct"
|
||||||
|
formatLLMtext_llama3instruct("system", _prompt)
|
||||||
|
else
|
||||||
|
error("llm model name is not defied yet $(@__LINE__)")
|
||||||
|
end
|
||||||
|
|
||||||
|
# send formatted input to user using GeneralUtils.sendReceiveMqttMsg
|
||||||
|
msgMeta = GeneralUtils.generate_msgMeta(
|
||||||
|
externalService[:mqtttopic],
|
||||||
|
senderName= "jsoncorrection",
|
||||||
|
senderId= a.id,
|
||||||
|
receiverName= "text2textinstruct",
|
||||||
|
mqttBroker= a.config[:mqttServerInfo][:broker],
|
||||||
|
mqttBrokerPort= a.config[:mqttServerInfo][:port],
|
||||||
|
)
|
||||||
|
|
||||||
|
outgoingMsg = Dict(
|
||||||
|
:msgMeta=> msgMeta,
|
||||||
|
:payload=> Dict(
|
||||||
|
:text=> prompt,
|
||||||
|
:kwargs=> Dict(
|
||||||
|
:max_tokens=> 512,
|
||||||
|
:stop=> ["<|eot_id|>"],
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
result = GeneralUtils.sendReceiveMqttMsg(outgoingMsg)
|
||||||
|
incorrectjson = result[:response][:text]
|
||||||
|
end
|
||||||
|
else
|
||||||
|
error("Can't fix JSON string")
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
@show correctjson
|
||||||
|
return correctjson
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user