refs #749: compare HMM Select AI annotation profiles

This commit is contained in:
devmrko
2026-08-11 11:01:25 +09:00
parent 2d0b5a3c1e
commit 9ce0341102
7 changed files with 526 additions and 0 deletions

View File

@@ -0,0 +1,103 @@
-- Redmine #749
-- Compare Select AI prompt and SQL generation with annotations enabled/disabled.
-- The Korean prompt is reconstructed from UTF-8 Base64 inside Oracle.
SET SERVEROUTPUT ON SIZE UNLIMITED
SET FEEDBACK OFF
SET VERIFY OFF
WHENEVER SQLERROR EXIT SQL.SQLCODE
DECLARE
c_annotation_profile CONSTANT VARCHAR2(128) := 'HMM_HR_DATA_GPT54_PROFILE';
c_no_annotation_profile CONSTANT VARCHAR2(128) := 'HMM_HR_DATA_GPT54_NOANN_PROFILE';
c_prompt_base64 CONSTANT VARCHAR2(4000) :=
'7J2067KIIOuLrCDtjIDsm5Drs4Qg7Zy06rCAIOyCrOyaqSDtmITtmansnYQg67O07Jes7KSY';
l_prompt VARCHAR2(4000) :=
UTL_I18N.RAW_TO_CHAR(
UTL_ENCODE.BASE64_DECODE(UTL_RAW.CAST_TO_RAW(c_prompt_base64)),
'AL32UTF8'
);
PROCEDURE run_one(
p_run_no IN PLS_INTEGER,
p_action IN VARCHAR2,
p_profile_name IN VARCHAR2
) IS
l_started PLS_INTEGER;
l_elapsed_ms PLS_INTEGER;
l_result CLOB;
l_result_head VARCHAR2(32767);
l_result_hash VARCHAR2(128);
l_valid_sql VARCHAR2(1) := '-';
BEGIN
l_started := DBMS_UTILITY.GET_TIME;
l_result := DBMS_CLOUD_AI.GENERATE(
l_prompt,
p_profile_name,
p_action
);
l_elapsed_ms := (DBMS_UTILITY.GET_TIME - l_started) * 10;
l_result_head := DBMS_LOB.SUBSTR(l_result, 32767, 1);
SELECT RAWTOHEX(STANDARD_HASH(l_result_head, 'SHA256'))
INTO l_result_hash
FROM dual;
IF p_action = 'showsql' THEN
IF REGEXP_LIKE(LTRIM(l_result_head), '^(SELECT|WITH)[[:space:]]', 'i') THEN
l_valid_sql := 'Y';
ELSE
l_valid_sql := 'N';
END IF;
END IF;
DBMS_OUTPUT.PUT_LINE(
'BENCHMARK|run=' || p_run_no
|| '|action=' || p_action
|| '|profile=' || p_profile_name
|| '|elapsed_ms=' || l_elapsed_ms
|| '|result_chars=' || DBMS_LOB.GETLENGTH(l_result)
|| '|valid_sql=' || l_valid_sql
|| '|result_sha256=' || l_result_hash
);
EXCEPTION
WHEN OTHERS THEN
l_elapsed_ms := (DBMS_UTILITY.GET_TIME - l_started) * 10;
DBMS_OUTPUT.PUT_LINE(
'BENCHMARK_ERROR|run=' || p_run_no
|| '|action=' || p_action
|| '|profile=' || p_profile_name
|| '|elapsed_ms=' || l_elapsed_ms
|| '|error=' || REPLACE(SUBSTR(SQLERRM, 1, 500), '|', '/')
);
END run_one;
PROCEDURE run_pair(p_run_no IN PLS_INTEGER, p_action IN VARCHAR2) IS
BEGIN
IF MOD(p_run_no, 2) = 1 THEN
run_one(p_run_no, p_action, c_annotation_profile);
run_one(p_run_no, p_action, c_no_annotation_profile);
ELSE
run_one(p_run_no, p_action, c_no_annotation_profile);
run_one(p_run_no, p_action, c_annotation_profile);
END IF;
END run_pair;
BEGIN
DBMS_OUTPUT.PUT_LINE(
'BENCHMARK_START|prompt_utf8_bytes=' ||
UTL_RAW.LENGTH(UTL_I18N.STRING_TO_RAW(l_prompt, 'AL32UTF8'))
);
FOR run_no IN 1 .. 3 LOOP
run_pair(run_no, 'showprompt');
END LOOP;
FOR run_no IN 1 .. 3 LOOP
run_pair(run_no, 'showsql');
END LOOP;
DBMS_OUTPUT.PUT_LINE('BENCHMARK_END');
END;
/
EXIT SUCCESS