From a503d4d7592d7ca8508aa4620cd42f5d22a1138e Mon Sep 17 00:00:00 2001 From: narawat Date: Wed, 15 Jul 2026 11:56:44 +0700 Subject: [PATCH] update --- Manifest.toml | 16 +-- Project.toml | 4 +- src/interface.jl | 3 +- src/llmfunction.jl | 239 +++++++++++++++++++++++---------------------- src/type.jl | 2 + 5 files changed, 139 insertions(+), 125 deletions(-) diff --git a/Manifest.toml b/Manifest.toml index 27b6d0a..f400337 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -2,7 +2,7 @@ julia_version = "1.12.6" manifest_format = "2.0" -project_hash = "db8baf2dd943e4138b5952183a64465f457da356" +project_hash = "76bd6c852fad3452022f32202b19c4689be8e912" [[deps.Accessors]] deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] @@ -290,9 +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"] -path = "../GeneralUtils" +git-tree-sha1 = "aa695d21f155567524e7329fb7b96d8a9d0eba86" +repo-rev = "main" +repo-url = "https://git.yiem.cc/ton/GeneralUtils" uuid = "c6c72f09-b708-4ac8-ac7c-2084d70108fe" -version = "0.4.10" +version = "0.5.0" [[deps.Graphs]] deps = ["ArnoldiMethod", "DataStructures", "Inflate", "LinearAlgebra", "Random", "SimpleTraits", "SparseArrays", "Statistics"] @@ -791,9 +793,11 @@ version = "0.7.0" [[deps.SQLLLM]] deps = ["CSV", "DataFrames", "DataStructures", "Dates", "FileIO", "GeneralUtils", "HTTP", "JSON", "LLMMCTS", "LibPQ", "PrettyPrinting", "Random", "Revise", "StatsBase", "Tables", "URIs", "UUIDs"] -path = "../SQLLLM" +git-tree-sha1 = "bae2fd2e2b087753fbb3415896be41df1ae0eb90" +repo-rev = "main" +repo-url = "https://git.yiem.cc/ton/SQLLLM" uuid = "2ebc79c7-cc10-4a3a-9665-d2e1d61e63d3" -version = "0.2.7" +version = "0.2.8" [[deps.SQLStrings]] git-tree-sha1 = "55de0530689832b1d3d43491ee6b67bd54d3323c" @@ -1043,7 +1047,7 @@ 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", "SQLLLM", "Serialization", "URIs", "UUIDs"] +deps = ["CSV", "DataFrames", "DataStructures", "Dates", "GeneralUtils", "HTTP", "JSON", "LLMMCTS", "LibPQ", "NATS", "PrettyPrinting", "Random", "Revise", "Serialization", "URIs", "UUIDs"] path = "." uuid = "e012c34b-7f78-48e0-971c-7abb83b6f0a2" version = "0.5.0" diff --git a/Project.toml b/Project.toml index c287b0d..855138b 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "YiemAgent" uuid = "e012c34b-7f78-48e0-971c-7abb83b6f0a2" -version = "0.5.0" +version = "0.6.0" authors = ["narawat lamaiin "] [deps] @@ -25,7 +25,9 @@ UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" [compat] CSV = "0.10.15" DataFrames = "1.7.0" +GeneralUtils = "0.5.0" HTTP = "2.4.0" JSON = "1.6.1" LLMMCTS = "0.1.5" NATS = "0.1.0" +SQLLLM = "0.2.8" diff --git a/src/interface.jl b/src/interface.jl index 5a0073a..ce63bcb 100644 --- a/src/interface.jl +++ b/src/interface.jl @@ -400,6 +400,7 @@ function conversation(a::sommelier; userinput::Union{Dict{String, Any}, JSON.Obj "content" => [Dict("type" => "text", "text" => thoughtdict["action_input"]),] ) addNewMessage(a, "assistant", assistant_response; maximumMsg=maximumMsg) + @info "YiemAgent conversation() 2-5 think count $loopcount " @__LINE__ return thoughtdict["action_input"] # elseif thoughtdict["action_name"] ∈ ["CHAT_BOX"] # @info "YiemAgent conversation() 2-4 think count $loopcount " @__LINE__ @@ -419,7 +420,7 @@ function conversation(a::sommelier; userinput::Union{Dict{String, Any}, JSON.Obj # ) # addNewMessage(a, "assistant", assistant_response; maximumMsg=maximumMsg) - return thoughtdict["action_input"] #XXX change output from string to dict + # return thoughtdict["action_input"] #XXX change output from string to dict else action_name = thoughtdict["action_name"] action_input = thoughtdict["action_input"] diff --git a/src/llmfunction.jl b/src/llmfunction.jl index b54271a..1268534 100644 --- a/src/llmfunction.jl +++ b/src/llmfunction.jl @@ -396,123 +396,123 @@ function generatesql(a::T, searchterm::String, Do not wrap the SQL as it will be executed against the database directly and SQL must be ended with ';'. """ - table_schema = - """ - create table customer ( - customer_id uuid primary key default gen_random_uuid (), - customer_firstname varchar(128), - customer_lastname varchar(128), - customer_displayname varchar(128) not null, - customer_username varchar(128), - customer_password varchar(128), - customer_gender varchar(128), - country varchar(128), - telephone varchar(128), - email varchar(128) not null, - customer_birthdate varchar(128), - note text, + # table_schema = + # """ + # create table customer ( + # customer_id uuid primary key default gen_random_uuid (), + # customer_firstname varchar(128), + # customer_lastname varchar(128), + # customer_displayname varchar(128) not null, + # customer_username varchar(128), + # customer_password varchar(128), + # customer_gender varchar(128), + # country varchar(128), + # telephone varchar(128), + # email varchar(128) not null, + # customer_birthdate varchar(128), + # note text, - other_attributes jsonb, - created_time timestamptz default current_timestamp, - updated_time timestamptz default current_timestamp, - description text - ); + # other_attributes jsonb, + # created_time timestamptz default current_timestamp, + # updated_time timestamptz default current_timestamp, + # description text + # ); - create table retailer ( - retailer_id uuid primary key default gen_random_uuid (), - retailer_name varchar(128) not null, - retailer_username varchar(128) not null, - retailer_password varchar(128) not null, - retailer_address text not null, - country varchar(128) not null, - contact_person varchar(128) not null, - telephone varchar(128) not null, - email varchar(128) not null, - note text, + # create table retailer ( + # retailer_id uuid primary key default gen_random_uuid (), + # retailer_name varchar(128) not null, + # retailer_username varchar(128) not null, + # retailer_password varchar(128) not null, + # retailer_address text not null, + # country varchar(128) not null, + # contact_person varchar(128) not null, + # telephone varchar(128) not null, + # email varchar(128) not null, + # note text, - other_attributes jsonb, - created_time timestamptz default current_timestamp, - updated_time timestamptz default current_timestamp, - description text - ); + # other_attributes jsonb, + # created_time timestamptz default current_timestamp, + # updated_time timestamptz default current_timestamp, + # description text + # ); - create table food ( - food_id uuid primary key default gen_random_uuid (), - food_name varchar(128) not null, - country varchar(128), - spiciness integer, - sweetness integer, - sourness integer, - savoriness integer, - bitterness integer, - serving_temperature integer, - image_url jsonb, - note text, - other_attributes jsonb, + # create table food ( + # food_id uuid primary key default gen_random_uuid (), + # food_name varchar(128) not null, + # country varchar(128), + # spiciness integer, + # sweetness integer, + # sourness integer, + # savoriness integer, + # bitterness integer, + # serving_temperature integer, + # image_url jsonb, + # note text, + # other_attributes jsonb, - created_time timestamptz default current_timestamp, - updated_time timestamptz default current_timestamp, - description text - ); + # created_time timestamptz default current_timestamp, + # updated_time timestamptz default current_timestamp, + # description text + # ); - create table wine ( - wine_id uuid primary key default gen_random_uuid (), - seo_name varchar(128) not null, - wine_name varchar(128) not null, - winery varchar(128) not null, - vintage integer not null, - region varchar(128) not null, - country varchar(128) not null, - wine_type varchar(128) not null, - grape varchar(128) not null, - serving_temperature varchar(128) not null, - intensity integer, - sweetness integer, - tannin integer, - acidity integer, - fizziness integer, - tasting_notes text, - image_url jsonb, - manufacturer_sku text, - note text, - other_attributes jsonb, + # create table wine ( + # wine_id uuid primary key default gen_random_uuid (), + # seo_name varchar(128) not null, + # wine_name varchar(128) not null, + # winery varchar(128) not null, + # vintage integer not null, + # region varchar(128) not null, + # country varchar(128) not null, + # wine_type varchar(128) not null, + # grape varchar(128) not null, + # serving_temperature varchar(128) not null, + # intensity integer, + # sweetness integer, + # tannin integer, + # acidity integer, + # fizziness integer, + # tasting_notes text, + # image_url jsonb, + # manufacturer_sku text, + # note text, + # other_attributes jsonb, - created_time timestamptz default current_timestamp, - updated_time timestamptz default current_timestamp, - description text - ); + # created_time timestamptz default current_timestamp, + # updated_time timestamptz default current_timestamp, + # description text + # ); - create table wine_food ( - wine_id uuid references wine(wine_id), - food_id uuid references food(food_id), - constraint wine_food_id primary key (wine_id, food_id), + # create table wine_food ( + # wine_id uuid references wine(wine_id), + # food_id uuid references food(food_id), + # constraint wine_food_id primary key (wine_id, food_id), - created_time timestamptz default current_timestamp, - updated_time timestamptz default current_timestamp - ); + # created_time timestamptz default current_timestamp, + # updated_time timestamptz default current_timestamp + # ); - CREATE TABLE retailer_wine ( - retailer_id uuid references retailer(retailer_id), - wine_id uuid references wine(wine_id), - constraint retailer_wine_id primary key (retailer_id, wine_id), - price NUMERIC(10, 2), - currency varchar(3) not null, + # CREATE TABLE retailer_wine ( + # retailer_id uuid references retailer(retailer_id), + # wine_id uuid references wine(wine_id), + # constraint retailer_wine_id primary key (retailer_id, wine_id), + # price NUMERIC(10, 2), + # currency varchar(3) not null, - created_time timestamptz default current_timestamp, - updated_time timestamptz default current_timestamp - ); + # created_time timestamptz default current_timestamp, + # updated_time timestamptz default current_timestamp + # ); - CREATE TABLE retailer_food ( - retailer_id uuid references retailer(retailer_id), - food_id uuid references food(food_id), - constraint retailer_food_id primary key (retailer_id, food_id), - price NUMERIC(10, 2), - currency varchar(3) not null, + # CREATE TABLE retailer_food ( + # retailer_id uuid references retailer(retailer_id), + # food_id uuid references food(food_id), + # constraint retailer_food_id primary key (retailer_id, food_id), + # price NUMERIC(10, 2), + # currency varchar(3) not null, - created_time timestamptz default current_timestamp, - updated_time timestamptz default current_timestamp - ); - """ + # created_time timestamptz default current_timestamp, + # updated_time timestamptz default current_timestamp + # ); + # """ requiredKeys = ["plan", "action_name", "action_input"] errornote = "" @@ -525,6 +525,16 @@ function generatesql(a::T, searchterm::String, 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 = table_schema * table_schema_str + end + context = """ @@ -823,11 +833,11 @@ function extractWineAttributes_1(a::T1, input::T2; maxattempt=10 responsedict[k] = _v end - println("\n--- extractWineAttributes_1-1()") - @show responsedict - @info "---\n" @__LINE__ + # println("\n--- extractWineAttributes_1-1()") + # @show responsedict + # @info "---\n" @__LINE__ - #WORKING check each attributes against database with BM25 + # check each attributes against each column in a database table 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) @@ -843,15 +853,10 @@ function extractWineAttributes_1(a::T1, input::T2; maxattempt=10 end result = result[1:end-2] # remove the ending ", " - println("\n--- extractWineAttributes_1-2()") - @show responsedict - @show result - @info "---\n" @__LINE__ - - - - - + # println("\n--- extractWineAttributes_1-2()") + # @show responsedict + # @show result + # @info "---\n" @__LINE__ return result end error("extractWineAttributes_1() failed to get a response") diff --git a/src/type.jl b/src/type.jl index 88c331b..f97f99c 100644 --- a/src/type.jl +++ b/src/type.jl @@ -16,7 +16,9 @@ mutable struct agentcontext insertSQLVectorDB::Function similarSommelierDecision::Function insertSommelierDecision::Function + find_related_tables_for_user_question::Function pg_conn_str::String + agentconfig::AbstractDict end abstract type agent end