diff --git a/Manifest.toml b/Manifest.toml
index 8eb5fef..3020524 100644
--- a/Manifest.toml
+++ b/Manifest.toml
@@ -1,6 +1,6 @@
# This file is machine-generated - editing it directly is not advised
-julia_version = "1.11.3"
+julia_version = "1.11.4"
manifest_format = "2.0"
project_hash = "9e0d7dca51b949f2ffa5477b895b90988ec62529"
@@ -202,7 +202,7 @@ version = "1.11.0"
deps = ["CSV", "DataFrames", "DataStructures", "Dates", "Distributions", "JSON3", "MQTTClient", "PrettyPrinting", "Random", "SHA", "UUIDs"]
path = "../GeneralUtils"
uuid = "c6c72f09-b708-4ac8-ac7c-2084d70108fe"
-version = "0.2.2"
+version = "0.2.3"
[[deps.HTTP]]
deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"]
@@ -306,7 +306,7 @@ version = "1.19.3+0"
deps = ["GeneralUtils", "JSON3", "PrettyPrinting"]
path = "../LLMMCTS"
uuid = "d76c5a4d-449e-4835-8cc4-dd86ec44f241"
-version = "0.1.3"
+version = "0.1.4"
[[deps.LaTeXStrings]]
git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c"
@@ -471,7 +471,7 @@ version = "0.3.27+1"
[[deps.OpenLibm_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "05823500-19ac-5b8b-9628-191a04bc5112"
-version = "0.8.1+2"
+version = "0.8.1+4"
[[deps.OpenSSL]]
deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"]
diff --git a/src/interface.jl b/src/interface.jl
index cc9d804..ac28967 100644
--- a/src/interface.jl
+++ b/src/interface.jl
@@ -141,7 +141,7 @@ function decisionMaker(state::T1, context, text2textInstructLLM::Function,
For your information:
- Observation: Result of the immediately preceding action
- At each round of conversation, the user will give you the current situation:
+ At each round of conversation, the user will give you the following:
User Query: ...
Example: ...
Your Q&A: ...
@@ -164,7 +164,7 @@ function decisionMaker(state::T1, context, text2textInstructLLM::Function,
- State your comprehension about the current situation.
2) Plan: Given the current circumstances, outline a detailed, step-by-step plan to accomplish the task. Be specific.
3) Action_name (Must be aligned with your plan): Can be one of the following functions:
- - GETDATA, which you can use to get the data from the database. Action_input for this function must be a single SQL query to be executed against the database.
+ - RUNSQL, which you can use to execute SQL against the database. Action_input for this function must be a single SQL query to be executed against the database.
For more effective text search, it's necessary to use case-insensitivity and the ILIKE operator.
Do not wrap the SQL as it will be executed against the database directly and SQL must be ended with ';'.
4) Action_input: Input to the action
@@ -300,7 +300,7 @@ function decisionMaker(state::T1, context, text2textInstructLLM::Function,
responsedict[:action_input] = sql
end
- toollist = ["TABLEINFO", "GETDATA"]
+ toollist = ["TABLEINFO", "RUNSQL"]
if responsedict[:action_name] ∉ toollist
errornote = "\nYou must only use the given functions"
println("Attempt $attempt $errornote ", @__FILE__, ":", @__LINE__, " $(Dates.now())")
@@ -340,6 +340,244 @@ function decisionMaker(state::T1, context, text2textInstructLLM::Function,
end
error("DecisionMaker failed to generate a thought \n", response)
end
+# function decisionMaker(state::T1, context, text2textInstructLLM::Function,
+# ; querySQLVectorDBF::Union{T2, Nothing}=nothing
+# )::Dict{Symbol, Any} where {T1<:AbstractDict, T2<:Function}
+
+# # lessonDict =
+# # if isfile("lesson.json")
+# # lessonDict = copy(JSON3.read("lesson.json"))
+# # else
+# # lessonDict = nothing
+# # end
+
+# # lessonDict = nothing
+
+# # lesson =
+# # if lessonDict === nothing
+# # ""
+# # else
+# # """
+# # You have attempted to help the user before and failed, either because your reasoning for the
+# # recommendation was incorrect or your response did not exactly match the user expectation.
+# # The following lesson(s) give a plan to avoid failing to help the user in the same way you
+# # did previously. Use them to improve your strategy to help the user.
+
+# # Here are some lessons in JSON format:
+# # $(JSON3.write(lessonDict))
+
+# # When providing the thought and action for the current trial, that into account these failed
+# # trajectories and make sure not to repeat the same mistakes and incorrect answers.
+# # """
+# # end
+
+# systemmsg =
+# """
+# You are a helpful assistant that find the data from a database to satisfy the user's query.
+# You are also eager to improve your helpfulness.
+
+# For your information:
+# - Observation: Result of the immediately preceding action
+
+# At each round of conversation, the user will give you the current situation:
+# User Query: ...
+# Example: ...
+# Your Q&A: ...
+# Your work progress: ...
+# Evaluation: Evaluation of the immediately preceding action and observation
+# Suggestion: Suggestion for the immediately preceding action and observation
+
+# You must follow the following guidelines:
+# - Keep SQL queries focused only on the provided information.
+
+# You should follow the following guidelines:
+# - Do not create any table in the database
+# - A junction table can be used to link tables together. Another use case is for filtering data.
+# - If you can't find a single table that can be used to answer the user's query, try joining multiple tables to see if you can obtain the answer.
+# - If you are unable to find the requested information, kindly inform the user, "The current data in our database does not provide the specific answer to your query".
+# - Text information in the database usually stored in lower case. If your search returns empty, try using lower case to search.
+
+# You should then respond to the user with interleaving Understanding, Reasoning, Plan, Action:
+# 1) Comprehension:
+# - State your comprehension about the current situation.
+# 2) Plan: Given the current circumstances, outline a detailed, step-by-step plan to accomplish the task. Be specific.
+# 3) Action_name (Must be aligned with your plan): Can be one of the following functions:
+# - GETDATA, which you can use to get the data from the database. Action_input for this function must be a single SQL query to be executed against the database.
+# For more effective text search, it's necessary to use case-insensitivity and the ILIKE operator.
+# Do not wrap the SQL as it will be executed against the database directly and SQL must be ended with ';'.
+# 4) Action_input: Input to the action
+
+# You should only respond in format as described below:
+# Comprehension: ...
+# Plan: ...
+# Action_name: ...
+# Action_input: ...
+
+# Let's begin!
+# """
+
+# workprogress = ""
+# for (k, v) in state[:thoughtHistory]
+# if k ∉ [:question]
+# workprogress *= "$k: $v\n"
+# end
+# end
+
+# response = nothing # store for show when error msg show up
+# errornote = ""
+
+# # provide similar sql only for the first attempt
+# similarSQL_ = "None"
+# if length(state[:thoughtHistory]) == 1
+# sql, distance = querySQLVectorDBF(state[:thoughtHistory][:question])
+# similarSQL_ = sql !== nothing ? sql : "None"
+# end
+
+
+# for attempt in 1:10
+# QandA = generatequestion(state, context, text2textInstructLLM; similarSQL=similarSQL_)
+
+# usermsg =
+# """
+# $(context[:tablelist])
+# User query: $(state[:thoughtHistory][:question])
+# Example: $similarSQL_
+# Your Q&A: $QandA
+# Your work progress: $workprogress
+# Evaluation: $(state[:evaluation])
+# Suggestion: $(state[:suggestion])
+# $errornote
+# """
+
+# _prompt =
+# [
+# Dict(:name=> "system", :text=> systemmsg),
+# Dict(:name=> "user", :text=> usermsg)
+# ]
+
+# # put in model format
+# prompt = GeneralUtils.formatLLMtext(_prompt; formatname="qwen")
+# response = text2textInstructLLM(prompt)
+
+# # LLM tends to generate observation given that it is in the input
+# response =
+# if occursin("observation:", response)
+# string(split(response, "observation:")[1])
+# elseif occursin("Observation:", response)
+# string(split(response, "Observation:")[1])
+# elseif occursin("observation_", response)
+# string(split(response, "observation_")[1])
+# elseif occursin("Observation_", response)
+# string(split(response, "Observation_")[1])
+# else
+# response
+# end
+
+# # sometime LLM output something like **Comprehension**: which is not expected
+# response = replace(response, "**"=>"")
+# response = replace(response, "***"=>"")
+
+# # some time LLM output Plan_1: so we need to detect and replace topic numbering
+# regex = r"_[0-1000]+:"
+# matches = collect(eachmatch(regex, response))
+# for m in matches
+# response = replace(response, string(m.match)=>":")
+# end
+
+# if occursin("NULL", response)
+# errornote = "\nSQL decisionMaker() NULL response is not allowed"
+# println("Attempt $attempt $errornote ", @__FILE__, ":", @__LINE__, " $(Dates.now())")
+# continue
+# end
+
+# header = ["Comprehension:", "Plan:", "Action_name:", "Action_input:"]
+# dictkey = ["comprehension", "plan", "action_name", "action_input"]
+
+# # detect if there are more than 1 key per categories
+# wordcount = GeneralUtils.countGivenWords(response, header)
+# duplicateKeywordFlag = false
+# for (i, v) in enumerate(wordcount)
+# keyword = header[i]
+# keywordNumber = v
+# if keywordNumber > 1
+# errornote = "\nSQL query has duplicated keyword, $keyword"
+# println("Attempt $attempt $errornote ", @__FILE__, ":", @__LINE__, " $(Dates.now())")
+# duplicateKeywordFlag = true
+# break
+# end
+# end
+# duplicateKeywordFlag == true ? continue : nothing
+
+# # check whether response has all header
+# kw = []
+# # use for loop and detect_keyword function to get the exact variation of each keyword in the text then push to kw list
+# for keyword in header
+# detected = GeneralUtils.detect_keyword(keyword, response)
+# push!(kw, detected)
+# end
+# if nothing ∈ kw
+# println("Some keywords are missing, Required keywords=$header, Response keywords=$kw ", @__FILE__, ":", @__LINE__, " $(Dates.now())")
+# continue # try again next loop
+# end
+
+# # textToDict() search for action_input
+# responsedict = GeneralUtils.textToDict(response, header;
+# dictKey=dictkey, symbolkey=true)
+
+# delete!(responsedict, :observation)
+
+# # remove backticks Error occurred: MethodError: no method matching occursin(::String, ::Vector{String})
+# if occursin("```", responsedict[:action_input])
+# sql = GeneralUtils.extract_triple_backtick_text(responsedict[:action_input])[1]
+# if sql[1:4] == "sql\n"
+# sql = sql[5:end]
+# end
+# sql = split(sql, ';') # some time there are comments in the sql
+# sql = sql[1] * ';'
+
+# responsedict[:action_input] = sql
+# end
+
+# toollist = ["TABLEINFO", "GETDATA"]
+# if responsedict[:action_name] ∉ toollist
+# errornote = "\nYou must only use the given functions"
+# println("Attempt $attempt $errornote ", @__FILE__, ":", @__LINE__, " $(Dates.now())")
+# continue
+# end
+
+# for i in toollist
+# if occursin(i, responsedict[:action_input])
+# errornote = "\n action_name is in action_input which is not allowed."
+# println("Attempt $attempt $errornote ", @__FILE__, ":", @__LINE__, " $(Dates.now())")
+# continue
+# end
+# end
+
+# for i ∈ [:comprehension, :plan, :action_name, :action_input]
+# if length(JSON3.write(responsedict[i])) == 0
+# errornote = "\n $i is empty"
+# println("Attempt $attempt $errornote ", @__FILE__, ":", @__LINE__, " $(Dates.now())")
+# continue
+# end
+# end
+
+# # check if there are more than 1 key per categories
+# for i ∈ [:comprehension, :plan, :action_name, :action_input]
+# matchkeys = GeneralUtils.findMatchingDictKey(responsedict, i)
+# if length(matchkeys) > 1
+# errornote = "\n $i has more than one key"
+# println("Attempt $attempt $errornote ", @__FILE__, ":", @__LINE__, " $(Dates.now())")
+# continue
+# end
+# end
+
+# state[:decisionMaker] = responsedict
+
+# return responsedict
+
+# end
+# error("DecisionMaker failed to generate a thought \n", response)
+# end
""" Assigns a scalar value to each new child node to be used for selec-
tion and backpropagation. This value effectively quantifies the agent's progress in task completion,
@@ -374,9 +612,9 @@ function evaluator(state::T1, text2textInstructLLM::Function
"reasoning" is agent's step-by-step reasoning about the current situation
"plan" is agent's plan to complete the task from the current situation
"action_name" is the name of the action taken, which can be one of the following functions:
- - GETDATA, which you can use to get the data from the database. Action_input for this function must be a single SQL query to be executed against the database.
- For more effective text search, it's necessary to use case-insensitivity and the ILIKE operator.
- Do not wrap the SQL as it will be executed against the database directly and SQL must be ended with ';'.
+ - RUNSQL, which you can use to execute SQL against the database. Action_input for this function must be a single SQL query to be executed against the database.
+ For more effective text search, it's necessary to use case-insensitivity and the ILIKE operator.
+ Do not wrap the SQL as it will be executed against the database directly and SQL must be ended with ';'.
"action_input" is the input to the action
"observation" is result of the preceding immediate action
@@ -722,7 +960,7 @@ function transition(state::T, args::NamedTuple
elseif thoughtDict[:action_name] == "TABLEINFO"
input = thoughtDict[:action_input]
tableinfo(executeSQL, input)
- elseif thoughtDict[:action_name] == "GETDATA"
+ elseif thoughtDict[:action_name] == "RUNSQL"
response = SQLexecution(executeSQL, thoughtDict[:action_input])
if response[:success]
extracted = extractContent_dataframe(response[:result], text2textInstructLLM, thoughtDict[:action_input])
@@ -877,19 +1115,20 @@ function query(query::T, executeSQL::Function, text2textInstructLLM::Function;
LLMMCTS.runMCTS(initialstate, transition, transitionargs;
horizontalSampleExpansionPhase=5,
horizontalSampleSimulationPhase=2,
- maxSimulationDepth=5,
+ maxSimulationDepth=10,
maxiterations=1,
explorationweight=1.0,
earlystop=earlystop,
saveSimulatedNode=true,
multithread=true)
- #[WORKING] compare all high value state answer then select the best one
+ # compare all high value state answer then select the best one
if length(highValueState) > 0
- open("/appfolder/app/highValueState.json", "w") do io
- JSON3.pretty(io, highValueState)
- end
- resultState = compareState(query, highValueState)
+ # open("/appfolder/app/highValueState.json", "w") do io
+ # JSON3.pretty(io, highValueState)
+ # end
+ selected = compareState(query, highValueState, text2textInstructLLM)
+ resultState = highValueState[selected]
end
latestKey, latestInd = GeneralUtils.findHighestIndexKey(resultState[:thoughtHistory], "observation")
action_input = Symbol("action_input_$latestInd") # latest sql
@@ -936,7 +1175,7 @@ function makeNewState(currentstate::T1, thoughtDict::T4, rawresponse, response::
nextindice = currentstate_latestKey !== nothing ? currentstate_latestIndice + 1 : 1
# currentstate_latestKey == :NA ? 1 : currentstate_latestIndice + 1
- currentstate_latestKey = makeNextKey.(keys, nextindice)
+ currentstate_latestKey = makekey.(keys, nextindice)
# add Thought, action, observation to thoughtHistory
newstate = deepcopy(currentstate)
@@ -959,9 +1198,6 @@ function makeNewState(currentstate::T1, thoughtDict::T4, rawresponse, response::
end
-makeNextKey(key, indice) = Symbol("$(key)_$indice")
-
-
function generatequestion(state::T1, context, text2textInstructLLM::Function;
similarSQL::Union{T2, Nothing}=nothing
)::String where {T1<:AbstractDict, T2<:AbstractString}
diff --git a/src/llmfunction.jl b/src/llmfunction.jl
index 26326e9..4d5c7c9 100644
--- a/src/llmfunction.jl
+++ b/src/llmfunction.jl
@@ -4,7 +4,7 @@ export listAllTable_json, listAllTable_str, tableinfo, getdata, finalAnswerBox,
getTableNameFromSQL, extractContent_dataframe, SQLexecution, compareState
using HTTP, JSON3, URIs, Random, PrettyPrinting, UUIDs, LibPQ, Tables, DataFrames, CSV,
- DataStructures, StatsBase
+ DataStructures, StatsBase, Dates
using GeneralUtils, LLMMCTS
using ..util
@@ -812,8 +812,8 @@ julia>
# Signature
"""
-function compareState(query, highValueStateList)
-
+function compareState(question::String, highValueStateList, text2textInstructLLM::Function)
+ println(typeof(highValueStateList))
systemmsg =
"""
@@ -825,14 +825,13 @@ function compareState(query, highValueStateList)
- Identify and select the most accurate and relevant response from these multiple results for the user
- - The user's question
- - The user's attempted actions and their corresponding results
+ Question: the question the user is trying to answer
+ Attempt: the user's attempted actions and their corresponding results
- Comparison: a comparison of the results from each attempt
+ Comparison: a comparison of all results from all attempts
Rationale: a brief explanation of why the selected response is the most accurate and relevant
- Selected_response_number: the number the selected response in the list of results
-
+ Selected_response_number: the number the selected response in the list of results (e.g., 1, 2, 3, ...)
Comparison: ...
@@ -855,89 +854,100 @@ function compareState(query, highValueStateList)
Let's begin!
"""
- # thoughthistory = ""
- # for (k, v) in state[:thoughtHistory]
- # thoughthistory *= "$k: $v\n"
- # end
+ potentialSolution = []
+ keys = [:action_input, :observation]
+ # extract the last action_name, action_input, observation of each state in highValueStateList and store them in a dictionary then push into potentialSolution
+ for state in highValueStateList
+ thoughtHistory = state[:thoughtHistory]
+ _, currentstate_latestIndice =
+ GeneralUtils.findHighestIndexKey(thoughtHistory, keys[1])
+ latestKeys = makekey.(keys, currentstate_latestIndice)
+ d = Dict()
+ # get the last action_name, action_input, observation of currentstate
+ for (i,v) in enumerate(keys)
+ d[v] = thoughtHistory[latestKeys[i]]
+ end
+ push!(potentialSolution, d)
+ end
- # errornote = ""
+ """
+ # put potential solutions from potentialSolution into the following form
+ Attempt 1
+ action_name:
+ action_input:
+ observation:
+ Attempt 2
+ action_name:
+ action_input:
+ observation:
+ ...
+ """
+ potentialSolutionStr = ""
+ for (i, state) in enumerate(potentialSolution)
+ potentialSolutionStr *= "Attempt $i\n"
+ for k in keys
+ potentialSolutionStr *= "$k: $(state[k])\n"
+ println("")
+ end
+ end
- # for attempt in 1:10
- # errorFlag = false
+ errornote = ""
- # usermsg =
- # """
- # Trajectory: $thoughthistory
- # Error_note: $errornote
- # """
+ for attempt in 1:10
+ errorFlag = false
- # _prompt =
- # [
- # Dict(:name=> "system", :text=> systemmsg),
- # Dict(:name=> "user", :text=> usermsg)
- # ]
+ usermsg =
+ """
+ Question: $question
+ Attempts: $potentialSolutionStr
+ """
- # # put in model format
- # prompt = GeneralUtils.formatLLMtext(_prompt; formatname="qwen")
+ _prompt =
+ [
+ Dict(:name=> "system", :text=> systemmsg),
+ Dict(:name=> "user", :text=> usermsg)
+ ]
- # header = ["Trajectory_evaluation:", "Answer_evaluation:", "Accepted_as_answer:", "Score:", "Suggestion:"]
- # dictkey = ["trajectory_evaluation", "answer_evaluation", "accepted_as_answer", "score", "suggestion"]
+ # put in model format
+ prompt = GeneralUtils.formatLLMtext(_prompt; formatname="qwen")
- # response = text2textInstructLLM(prompt)
+ header = ["Comparison:", "Rationale:", "Selected_response_number:"]
+ dictkey = ["comparison", "rationale", "selected_response_number"]
- # # sometime LLM output something like **Comprehension**: which is not expected
- # response = replace(response, "**"=>"")
- # response = replace(response, "***"=>"")
+ response = text2textInstructLLM(prompt)
- # # make sure every header is in the response
- # for i in header
- # detected = GeneralUtils.detect_keyword(i, response)
- # if detected === nothing
- # errornote = "Your previous response didn't provide $i"
- # errorFlag = true
- # end
- # end
- # if errorFlag
- # continue # skip to the next iteration
- # end
+ # sometime LLM output something like **Comprehension**: which is not expected
+ response = replace(response, "**"=>"")
+ response = replace(response, "***"=>"")
- # responsedict = GeneralUtils.textToDict(response, header;
- # dictKey=dictkey, symbolkey=true)
+ # make sure every header is in the response
+ for i in header
+ detected = GeneralUtils.detect_keyword(i, response)
+ if detected === nothing
+ errornote = "Your previous response didn't provide $i"
+ errorFlag = true
+ end
+ end
+ if errorFlag
+ continue # skip to the next iteration
+ end
+
+ responsedict = GeneralUtils.textToDict(response, header;
+ dictKey=dictkey, symbolkey=true)
- # responsedict[:score] = responsedict[:score][1] # some time "6\nThe trajectories are incomplete" is generated but I only need the number.
- # try
- # responsedict[:score] = parse(Int, responsedict[:score]) # convert string "5" into integer 5
- # catch
- # continue
- # end
+ responsedict[:selected_response_number] = responsedict[:selected_response_number][1] # some time "6\nThe trajectories are incomplete" is generated but I only need the number.
+ try
+ responsedict[:selected_response_number] = parse(Int, responsedict[:selected_response_number]) # convert string "5" into integer 5
+ catch
+ continue
+ end
- # accepted_as_answer::AbstractString = responsedict[:accepted_as_answer]
+ println("\n~~~ compareState() ", @__FILE__, ":", @__LINE__, " $(Dates.now())")
+ pprintln(Dict(responsedict))
- # if accepted_as_answer ∉ ["Yes", "No"] # [PENDING] add errornote into the prompt
- # error("generated accepted_as_answer has wrong format")
- # end
-
- # # add to state here instead to in transition() because the latter causes julia extension crash (a bug in julia extension)
- # state[:evaluation] = "$(responsedict[:trajectory_evaluation]) $(responsedict[:answer_evaluation])"
- # state[:evaluationscore] = responsedict[:score]
- # state[:accepted_as_answer] = responsedict[:accepted_as_answer]
- # state[:suggestion] = responsedict[:suggestion]
-
- # # mark as terminal state when the answer is achieved
- # if accepted_as_answer == "Yes"
-
- # # mark the state as terminal state because the evaluation say so.
- # state[:isterminal] = true
-
- # # evaluation score as reward because different answers hold different value for the user.
- # state[:reward] = responsedict[:score]
- # end
- # println("\n~~~ Evaluator() ", @__FILE__, ":", @__LINE__, " $(Dates.now())")
- # pprintln(Dict(responsedict))
-
- # return responsedict[:score]
- # end
- # error("Evaluator failed to generate an evaluation, Response: \n$response\n<|End of error|>")
+ return responsedict[:selected_response_number]
+ end
+ error("compareState failed to generate an evaluation, Response: \n$response\n<|End of error|>", @__FILE__, ":", @__LINE__, " $(Dates.now())")
end
diff --git a/src/util.jl b/src/util.jl
index a2bfb36..3839f15 100644
--- a/src/util.jl
+++ b/src/util.jl
@@ -1,6 +1,8 @@
module util
+export makekey
+makekey(key, indice) = Symbol("$(key)_$indice")
diff --git a/system_prompt_template.jl b/system_prompt_template.jl
index 4112aef..b1a9b86 100644
--- a/system_prompt_template.jl
+++ b/system_prompt_template.jl
@@ -28,8 +28,7 @@ Default system message template:
Comprehension: State your comprehension about the current situation.
Plan: Given the current circumstances, outline a detailed, step-by-step plan to accomplish the task. Be specific.
- Action_name: (Typically corresponds to the execution of the first step in your plan)
- Can be one of the following function names:
+ Action_name: (Typically corresponds to the execution of the first step in your plan) Can be one of the following function names:
- CHATBOX which you can use to talk with the user. The input is your intentions for the dialogue. Be specific.
- CHECKRESOURCES which you can use to check resources
- IMPLEMENT which you can use to implement the solution
diff --git a/test/runtest.jl b/test/runtest.jl
index 00bfb58..ee5105b 100644
--- a/test/runtest.jl
+++ b/test/runtest.jl
@@ -54,8 +54,9 @@ function text2textInstructLLM(prompt::String; maxattempt=3)
response = nothing
for attempts in 1:maxattempt
_response = GeneralUtils.sendReceiveMqttMsg(outgoingMsg; timeout=180, maxattempt=2)
- response = _response[:response][:text]
- if response !== nothing
+ payload = _response[:response]
+ if _response[:success] && payload[:text] !== nothing
+ response = _response[:response][:text]
break
else
println("\n attempt $attempts/$maxattempt failed ", @__FILE__, ":", @__LINE__, " $(Dates.now())")
@@ -63,6 +64,18 @@ function text2textInstructLLM(prompt::String; maxattempt=3)
println(" attempt $attempts/$maxattempt failed ", @__FILE__, ":", @__LINE__, " $(Dates.now())\n")
sleep(3)
end
+
+
+
+ # response = _response[:response][:text]
+ # if response !== nothing
+ # break
+ # else
+ # println("\n attempt $attempts/$maxattempt failed ", @__FILE__, ":", @__LINE__, " $(Dates.now())")
+ # pprintln(outgoingMsg)
+ # println(" attempt $attempts/$maxattempt failed ", @__FILE__, ":", @__LINE__, " $(Dates.now())\n")
+ # sleep(3)
+ # end
end
return response
@@ -156,8 +169,14 @@ end
sessionId = "555"
+# query = "How many German wines do you have?"
+# highValueStateList = copy(JSON3.read("/appfolder/app/highValueState_1.json"))
+# selectedState = SQLLLM.compareState(query, highValueStateList, text2textInstructLLM)
+
+
+
# query = Dict(:text=> "How many wines from France do you have that can be paired with lamb?")
-query = "How many German wines do you have?"
+query = "How many French wines from Yiem store under 100 dollars do you have?"
# query = "retailer: Yiem, wine_type: red, sweetness: 1-2, intensity: 4-5, wine price: 20-40"
# query = "wine_type: white, country: United States, sweetness: 1-2, tannin: 3, food to be served with wine: pizza"
# query = "wine_type: white, country: Austria, food to be served with wine: pork"
diff --git a/test/test_2.jl b/test/test_2.jl
index ea1edd0..6fffa7a 100644
--- a/test/test_2.jl
+++ b/test/test_2.jl
@@ -1,10 +1,9 @@
-using Revise
-using SQLLLM, LLMMCTS, DataStructures, JSON3
+# using Revise
+# using SQLLLM, LLMMCTS, DataStructures, JSON3
-query = "How many German wines do you have?"
-highValueStateList = copy(JSON3.read("/appfolder/app/highValueState_1.json"))
-
-selectedState = SQLLLM.compareState(query, highValueStateList)
+# query = "How many German wines do you have?"
+# highValueStateList = copy(JSON3.read("/appfolder/app/highValueState_1.json"))
+# selectedState = SQLLLM.compareState(query, highValueStateList)