Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 18b2d54ba7 | |||
| d004193b19 | |||
| 686b9b2e92 | |||
| 3acf46964b | |||
| ad917ea8d0 | |||
| 31daa805f3 | |||
| c9937ab5d7 | |||
| 9d7eed7cde | |||
| 286da3cf2c | |||
| e5b19dd268 | |||
| 45e8ded111 |
+5
-5
@@ -2,7 +2,7 @@
|
||||
|
||||
julia_version = "1.12.6"
|
||||
manifest_format = "2.0"
|
||||
project_hash = "76bd6c852fad3452022f32202b19c4689be8e912"
|
||||
project_hash = "a5128932115e2d3aa9658af105ac712db061d523"
|
||||
|
||||
[[deps.Accessors]]
|
||||
deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"]
|
||||
@@ -290,11 +290,11 @@ version = "1.1.0"
|
||||
|
||||
[[deps.GeneralUtils]]
|
||||
deps = ["CSV", "DataFrames", "DataStructures", "Dates", "Distributions", "Graphs", "HTTP", "JSON", "LibPQ", "NATS", "PrettyPrinting", "Random", "Revise", "SHA", "StringDistances", "UUIDs"]
|
||||
git-tree-sha1 = "aa695d21f155567524e7329fb7b96d8a9d0eba86"
|
||||
git-tree-sha1 = "a75a088ee8e5faf10f554ca00748e0e6ca58d1ca"
|
||||
repo-rev = "main"
|
||||
repo-url = "https://git.yiem.cc/ton/GeneralUtils"
|
||||
uuid = "c6c72f09-b708-4ac8-ac7c-2084d70108fe"
|
||||
version = "0.5.0"
|
||||
version = "0.5.1"
|
||||
|
||||
[[deps.Graphs]]
|
||||
deps = ["ArnoldiMethod", "DataStructures", "Inflate", "LinearAlgebra", "Random", "SimpleTraits", "SparseArrays", "Statistics"]
|
||||
@@ -1047,10 +1047,10 @@ uuid = "76eceee3-57b5-4d4a-8e66-0e911cebbf60"
|
||||
version = "1.6.1"
|
||||
|
||||
[[deps.YiemAgent]]
|
||||
deps = ["CSV", "DataFrames", "DataStructures", "Dates", "GeneralUtils", "HTTP", "JSON", "LLMMCTS", "LibPQ", "NATS", "PrettyPrinting", "Random", "Revise", "Serialization", "URIs", "UUIDs"]
|
||||
deps = ["CSV", "DataFrames", "DataStructures", "Dates", "HTTP", "JSON", "LLMMCTS", "LibPQ", "NATS", "PrettyPrinting", "Random", "Revise", "SQLLLM", "Serialization", "URIs", "UUIDs"]
|
||||
path = "."
|
||||
uuid = "e012c34b-7f78-48e0-971c-7abb83b6f0a2"
|
||||
version = "0.5.0"
|
||||
version = "0.6.4"
|
||||
|
||||
[[deps.Zlib_jll]]
|
||||
deps = ["Libdl"]
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
name = "YiemAgent"
|
||||
uuid = "e012c34b-7f78-48e0-971c-7abb83b6f0a2"
|
||||
version = "0.6.0"
|
||||
version = "0.6.4"
|
||||
authors = ["narawat lamaiin <narawat@outlook.com>"]
|
||||
|
||||
[deps]
|
||||
@@ -25,7 +25,7 @@ UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"
|
||||
[compat]
|
||||
CSV = "0.10.15"
|
||||
DataFrames = "1.7.0"
|
||||
GeneralUtils = "0.5.0"
|
||||
GeneralUtils = "0.5.1"
|
||||
HTTP = "2.4.0"
|
||||
JSON = "1.6.1"
|
||||
LLMMCTS = "0.1.5"
|
||||
|
||||
@@ -1,13 +1,28 @@
|
||||
|
||||
|
||||
|
||||
d = Dict(
|
||||
"hello"=> 555,
|
||||
"world"=> Dict(
|
||||
"name"=> "ton"
|
||||
)
|
||||
)
|
||||
|
||||
x = 55
|
||||
|
||||
@info "YiemAgent think() 1 " d x @__LINE__
|
||||
"""
|
||||
CREATE TABLE "public"."wine" (
|
||||
"wine_id" uuid DEFAULT gen_random_uuid() NOT NULL,
|
||||
"seo_name" character varying(128) NOT NULL,
|
||||
"wine_name" character varying(128) NOT NULL,
|
||||
"winery" character varying(128) NOT NULL,
|
||||
"vintage" integer NOT NULL,
|
||||
"region" character varying(128) NOT NULL,
|
||||
"country" character varying(128) NOT NULL,
|
||||
"wine_type" character varying(128) NOT NULL,
|
||||
"grape" character varying(128) NOT NULL,
|
||||
"serving_temperature" character varying(128) NOT NULL,
|
||||
"intensity" integer NULL,
|
||||
"sweetness" integer NULL,
|
||||
"tannin" integer NULL,
|
||||
"acidity" integer NULL,
|
||||
"fizziness" integer NULL,
|
||||
"tasting_notes" text NULL,
|
||||
"image_url" jsonb NULL,
|
||||
"manufacturer_sku" text NULL,
|
||||
"note" text NULL,
|
||||
"other_attributes" jsonb NULL,
|
||||
"created_time" timestamp with time zone DEFAULT CURRENT_TIMESTAMP NULL,
|
||||
"updated_time" timestamp with time zone DEFAULT CURRENT_TIMESTAMP NULL,
|
||||
"description" text NULL,
|
||||
PRIMARY KEY (wine_id)
|
||||
);
|
||||
"""
|
||||
+1
-27
@@ -154,19 +154,6 @@ function decisionMaker(a::T; recentevents::Integer=20, maxattempt=10
|
||||
println("\nERROR YiemAgent decisionMaker() failed to parse response: $response ", @__FILE__, ":", @__LINE__, " $(Dates.now())")
|
||||
continue
|
||||
end
|
||||
|
||||
# fall back to normal text because LLM default to natural chat when it didn't use action_call
|
||||
else
|
||||
try
|
||||
responsedict = OrderedDict(
|
||||
"plan"=> "I will talk to the user",
|
||||
"action_name"=> "CHAT_BOX",
|
||||
"action_input"=> response[2:end-1] # remove { } at the front and back that added by clean_json_response
|
||||
)
|
||||
catch e
|
||||
println("\nERROR YiemAgent decisionMaker(). $e --(not qualify response)-> $response", @__FILE__, ":", @__LINE__, " $(Dates.now())\n")
|
||||
continue
|
||||
end
|
||||
end
|
||||
|
||||
# check whether all answer's key points are in responsedict
|
||||
@@ -474,7 +461,7 @@ function think(a::T)::NamedTuple{(:thoughtdict, :result_raw), Tuple{OrderedDict,
|
||||
|
||||
elseif thoughtdict["action_name"] == "SEARCH_WINE_DATABASE"
|
||||
@info "YiemAgent think() 5 " @__LINE__
|
||||
thoughtdict, result_raw = search_wine_database!(a, thoughtdict; useSQLLLM=true)
|
||||
thoughtdict, result_raw = search_wine_database!(a, thoughtdict; useSQLLLM=false)
|
||||
#WORKING result_raw will be a df. i need to get images so i can send to frontend
|
||||
else
|
||||
@info "YiemAgent think() 6 " @__LINE__
|
||||
@@ -686,19 +673,6 @@ function generatechat!(a::T; maxattempt::Integer=10
|
||||
println("\nERROR YiemAgent generatechat() failed to parse response: $response ", @__FILE__, ":", @__LINE__, " $(Dates.now())")
|
||||
continue
|
||||
end
|
||||
|
||||
# fall back to normal text because LLM default to natural chat when it didn't use action_call
|
||||
else
|
||||
try
|
||||
responsedict = OrderedDict(
|
||||
"plan"=> "I will talk to the user",
|
||||
"action_name"=> "CHAT_BOX",
|
||||
"action_input"=> response[2:end-1] # remove { } at the front and back that added by clean_json_response
|
||||
)
|
||||
catch e
|
||||
println("\nERROR YiemAgent decisionMaker(). $e --(not qualify response)-> $response", @__FILE__, ":", @__LINE__, " $(Dates.now())\n")
|
||||
continue
|
||||
end
|
||||
end
|
||||
|
||||
# check whether all answer's key points are in responsedict
|
||||
|
||||
+12
-16
@@ -517,21 +517,21 @@ function generatesql(a::T, searchterm::String,
|
||||
requiredKeys = ["plan", "action_name", "action_input"]
|
||||
errornote = ""
|
||||
# provide similar sql only for the first attempt
|
||||
sql, distance = a.context.similarSQLVectorDB(searchterm)
|
||||
# sql, distance = a.context.similarSQLVectorDB(searchterm)
|
||||
|
||||
similarSQL_ = sql !== nothing ? sql : "None"
|
||||
# if sql is really close, just use it
|
||||
if similarSQL_ != "None" && distance <= 0.1
|
||||
return similarSQL_
|
||||
end
|
||||
# similarSQL_ = sql !== nothing ? sql : "None"
|
||||
# # if sql is really close, just use it
|
||||
# if similarSQL_ != "None" && distance <= 0.1
|
||||
# return similarSQL_
|
||||
# end
|
||||
|
||||
#CHANGE use find_related_tables_for_user_question and inject only related table schema instead
|
||||
# of hard code table schema. CPU embedding is too slow. use embedding service on GPU.
|
||||
related_tables = a.context.find_related_tables_for_user_question(searchterm)
|
||||
table_schema = ""
|
||||
for table in related_tables
|
||||
table_schema_df = GeneralUtils.get_db_table_schema(a.context.pg_conn_str, table)
|
||||
table_schema_str = sprint(show, table_schema_df) * "\n"
|
||||
_table_schema_str = GeneralUtils.get_db_table_schema_simple(a.context.pg_conn_str, table)
|
||||
table_schema_str = sprint(show, _table_schema_str) * "\n"
|
||||
table_schema = table_schema * table_schema_str
|
||||
end
|
||||
|
||||
@@ -541,12 +541,6 @@ function generatesql(a::T, searchterm::String,
|
||||
<database_table_schema>
|
||||
$table_schema
|
||||
</database_table_schema>
|
||||
<possible SQL for user's search term>
|
||||
$similarSQL_
|
||||
</possible SQL for user's search term>
|
||||
<error_note>
|
||||
$errornote
|
||||
<error_note>
|
||||
</internal_context_for_assistant>
|
||||
"""
|
||||
input = context * searchterm
|
||||
@@ -761,11 +755,11 @@ function extractWineAttributes_1(a::T1, input::T2; maxattempt=10
|
||||
"wine_name": "Saumur Blanc",
|
||||
"winery": "Domaine du Collier",
|
||||
"vintage": "2019",
|
||||
"region": "Saumur",
|
||||
"region": "N/A",
|
||||
"country": "France",
|
||||
"wine_type": "white",
|
||||
"grape_varietal": "Merlot",
|
||||
"tasting_notes": "plum",
|
||||
"tasting_notes": "N/A",
|
||||
"wine_price_min": "N/A",
|
||||
"wine_price_max": "N/A",
|
||||
"occasion": "N/A",
|
||||
@@ -839,10 +833,12 @@ function extractWineAttributes_1(a::T1, input::T2; maxattempt=10
|
||||
|
||||
# check each attributes against each column in a database table with BM25
|
||||
for (k, v) in responsedict
|
||||
if k ∉ ["wine_price_min", "wine_price_max"]
|
||||
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
|
||||
end
|
||||
|
||||
result = ""
|
||||
for (k, v) in responsedict
|
||||
|
||||
Reference in New Issue
Block a user