updatet
This commit is contained in:
+66
-11
@@ -1,6 +1,6 @@
|
||||
module llmfunction
|
||||
|
||||
export virtualWineUserChatbox, jsoncorrection, checkwine!, # recommendbox,
|
||||
export virtualWineUserChatbox, jsoncorrection, search_wine_database!, # recommendbox,
|
||||
virtualWineUserRecommendbox, userChatbox, userRecommendbox, extractWineAttributes_1,
|
||||
extractWineAttributes_2, paraphrase
|
||||
|
||||
@@ -282,15 +282,15 @@ julia> result = checkinventory(agent, input)
|
||||
"{"wine 1": {\"Winery\": \"Pichon Baron\", \"wine name\": \"Pauillac (Grand Cru Classé)\", \"grape variety\": \"Cabernet Sauvignon\", \"year\": 2010, \"price\": \"125 USD\", \"stock ID\": \"ar-17\"}, }"
|
||||
```
|
||||
"""
|
||||
function checkwine!(a::T, thoughtdict::AbstractDict; useSQLLLM::Bool=false
|
||||
function search_wine_database!(a::T, thoughtdict::AbstractDict; useSQLLLM::Bool=false
|
||||
)::NamedTuple{(:thoughtdict, :result_raw), Tuple{OrderedDict, Any}} where {T<:agent}
|
||||
|
||||
println("\ncheckinventory order: $(thoughtdict["action_input"]) ", @__FILE__, ":", @__LINE__, " $(Dates.now())")
|
||||
wineattributes_1 = extractWineAttributes_1(a, thoughtdict["action_input"])
|
||||
wineattributes_2 = extractWineAttributes_2(a, thoughtdict["action_input"])
|
||||
|
||||
retrieve_attributes = ["winery", "wine_name", "wine_id", "vintage", "region", "country", "wine_type", "grape", "serving_temperature", "sweetness", "intensity", "tannin", "acidity", "tasting_notes", "price", "currency"]
|
||||
_inventoryquery = "$wineattributes_1, $wineattributes_2"
|
||||
retrieve_attributes = ["winery", "wine_name", "wine_id", "vintage", "region", "country", "wine_type", "grape", "serving_temperature", "sweetness", "intensity", "tannin", "acidity", "tasting_notes", "price", "currency", "image_url", "retailer_name", "retailer_id"]
|
||||
_inventoryquery = "$wineattributes_1, $wineattributes_2, retailer_name: $(a.retailername), retailerid: $(a.retailerid)"
|
||||
inventoryquery = "Retrieves $retrieve_attributes of wines that match the following criteria - {$_inventoryquery}"
|
||||
println("\ncheckinventory input: $inventoryquery ", @__FILE__, ":", @__LINE__, " $(Dates.now())")
|
||||
|
||||
@@ -308,7 +308,44 @@ function checkwine!(a::T, thoughtdict::AbstractDict; useSQLLLM::Bool=false
|
||||
|
||||
# direct query with possible sql instead of SQLLLM.
|
||||
sql = generatesql(a, inventoryquery)
|
||||
println("\nSQL: $sql ", @__FILE__, ":", @__LINE__, " $(Dates.now()) \n")
|
||||
textresult, result_raw, _, _ = SQLexecution(a.context.executeSQL, sql)
|
||||
#WORKING if result_raw != nothing, get image from image_url column of a df.
|
||||
# then store in a.memory["shortmem]["image"] = OrderedDict(
|
||||
# Dict(
|
||||
# "wine_id"=> "wine_id,
|
||||
# "name"=> "wine name",
|
||||
# "image_url" => Dict("url" => data1_uri)
|
||||
# )
|
||||
|
||||
# )
|
||||
|
||||
|
||||
# # 1. Read local file and encode to base64 string
|
||||
# image2_path = "test/small_image.png"
|
||||
# image2_bytes = read(image2_path)
|
||||
# image2_base64_string = base64encode(image2_bytes)
|
||||
# mime_type = "image/png"
|
||||
# data2_uri = "data:$(mime_type);base64,$(image2_base64_string)"
|
||||
|
||||
# # 3. Construct payload with the Data URI
|
||||
# message = Dict(
|
||||
# "role" => "user",
|
||||
# "content" => [
|
||||
# Dict("type" => "text", "text" => "Do you know type of wine in the image?"),
|
||||
# Dict(
|
||||
# "type" => "image_url",
|
||||
# "image_url" => Dict("url" => data1_uri)
|
||||
# )
|
||||
# ]
|
||||
# )
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
thoughtdict["action_result"] = textresult
|
||||
end
|
||||
|
||||
@@ -324,7 +361,8 @@ function generatesql(a::T, searchterm::String,
|
||||
"""
|
||||
# database_search_guidelines
|
||||
- Keep SQL queries focused only on the provided information.
|
||||
- Do not create any table in the database
|
||||
- Use wildcard character (%) to search more effectively.
|
||||
- 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 search term, try joining multiple tables to see if you can obtain the answer.
|
||||
- Text information in the database usually stored in lower case. If your search returns empty, try using lower case to search.
|
||||
@@ -603,7 +641,7 @@ function SQLexecution(executeSQL::Function, sql::T
|
||||
tablesize = size(df)
|
||||
row, column = tablesize
|
||||
if row == 0
|
||||
return (result_str="No records found.", result_raw=df, success=true, errormsg=nothing)
|
||||
return (result_str="No records found. Try loosening your search criteria.", result_raw=nothing, success=true, errormsg=nothing)
|
||||
elseif column > 30
|
||||
return (result_str="There are more than 30 columns. Please be more specific.", result_raw=df, success=true, errormsg=nothing)
|
||||
else
|
||||
@@ -678,6 +716,7 @@ function extractWineAttributes_1(a::T1, input::T2; maxattempt=10
|
||||
wine_price_max: maximum price range of wine. Example: For wine price 20, wine_price_max will be 20. For wine price 10 to 100, wine_price_max will be 100.
|
||||
occasion: the occasion the user is having the wine for
|
||||
food_to_be_paired_with_wine: food that the user will be served with the wine such as poultry, fish, steak, etc
|
||||
_keyword suffice is the related keyword that appears in user's query. each keyword can not be used twice.
|
||||
</you should then respond to the user with>
|
||||
<you should only respond in JSON format as described below>
|
||||
"wine_name": "...",
|
||||
@@ -756,9 +795,6 @@ function extractWineAttributes_1(a::T1, input::T2; maxattempt=10
|
||||
for attempt in 1:maxattempt
|
||||
response = a.context.text2textInstructLLM(a.id, msg)
|
||||
response = GeneralUtils.clean_json_response(response)
|
||||
println("\n--- extractWineAttributes_1-1()")
|
||||
println(response)
|
||||
println("--- \n")
|
||||
|
||||
response = GeneralUtils.remove_french_accents(response)
|
||||
think, response = GeneralUtils.extractthink(response)
|
||||
@@ -786,6 +822,18 @@ function extractWineAttributes_1(a::T1, input::T2; maxattempt=10
|
||||
_v = replace(v, r"\(.*?\)" => "")
|
||||
responsedict[k] = _v
|
||||
end
|
||||
|
||||
println("\n--- extractWineAttributes_1-1()")
|
||||
@show responsedict
|
||||
@info "---\n" @__LINE__
|
||||
|
||||
#WORKING check each attributes against database with BM25
|
||||
for (k, v) in responsedict
|
||||
words_catalog = GeneralUtils.harvest_entity_catalog(a.context.pg_conn_str, "wine", k)
|
||||
resolved_word = GeneralUtils.resolve_entity(v, words_catalog;threshold=0.9)
|
||||
responsedict[k] = resolved_word
|
||||
end
|
||||
|
||||
result = ""
|
||||
for (k, v) in responsedict
|
||||
# some time LLM generate text with "(some comment)". this line removes it
|
||||
@@ -793,10 +841,17 @@ function extractWineAttributes_1(a::T1, input::T2; maxattempt=10
|
||||
result *= "$k: $v, "
|
||||
end
|
||||
end
|
||||
|
||||
result = result[1:end-2] # remove the ending ", "
|
||||
println("\n--- extractWineAttributes_1-2()")
|
||||
println(result)
|
||||
println("--- \n")
|
||||
@show responsedict
|
||||
@show result
|
||||
@info "---\n" @__LINE__
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
return result
|
||||
end
|
||||
error("extractWineAttributes_1() failed to get a response")
|
||||
|
||||
Reference in New Issue
Block a user