실제 AI API 를 이용해서 23ai에서 PL/SQL로 질의시 답변을 받아오는 방법을 테스트해보고 정리해보았습니다.
AI는 여러회사의 제품이 있지만 저는 openai의 chatgpt를 사용하였습니다.
사전준비사항으로 api를 사용하기 위해 api key를 받아와야하고, 이것은 무료가 아니고 최소 10$ 가 필요합니다.
openai에서 api key를 받아오고 사용하는 방법부터 정리하겠습니다.
1) api key 받기
아래 URL로 접속합니다.
https://platform.openai.com/settings/organization/api-keys
+create new secret key를 클릭합니다.
Name과 Project를 입력 후 Create secret key를 하면 키가 나옵니다.
키는 암호화 형식으로 되어있으며 생성 시에는 목록이 보이게 됩니다.
이 키로 바로 사용하면 에러가 발생합니다. 따라서 신용카드 등록 후 요금을 지불합니다. 저는 테스트용이어서 최소금액인 10$로 지불하였습니다.
아래 URL에서 payment methods 클릭 후 신용카드 번호 입력합니다.
https://platform.openai.com/settings/organization/billing/overview
결제하지 않고 api key만 발급 후 진행하면 아래 에러가 발생합니다.
ORA-20002: The provider returned an error: You exceeded your current quota,
please check your plan and billing details. For more information on this error,
read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.
2) 테스트를 위한 DB 접속 (PDB) 및 테스트용 신규유저 생성
$ sqlplus / as sysdba
SQL*Plus: Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems on 목 11월 14 19:05:52 2024
Version 23.5.0.24.07
Copyright (c) 1982, 2024, Oracle. All rights reserved.
다음에 접속됨:
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.5.0.24.07
SQL>
SQL> conn sys/oracle@localhost:1521/FREEPDB1 as sysdba
연결되었습니다.
vector라는 이름의 유저를 생성 후 DB_DEVELOPER_ROLE과 CREATE CREDENTIAL 권한을 부여합니다.
SQL> show user
USER은 "SYS"입니다
SQL>
SQL>
SQL> DROP USER vector cascade;
사용자가 삭제되었습니다.
SQL>
SQL> CREATE USER vector identified by oracle;
사용자가 생성되었습니다.
SQL> GRANT DB_DEVELOPER_ROLE, CREATE CREDENTIAL TO vector;
권한이 부여되었습니다.
3) 유저에 대해서 호스트 연결권한을 부여하기 위해서 DBMS_NETWORK_ACL_ADMIN을 사용하여 유저를 등록해주고 host는 전체 '*'로 설정합니다.
SQL> BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => '*',
ace => xs$ace_type(privilege_list => xs$name_list('connect'),
principal_name => 'VECTOR',
principal_type => xs_acl.ptype_db));
END;
/ 2 3 4 5 6 7 8
PL/SQL 처리가 정상적으로 완료되었습니다.
4) vector유저로 접속하여 네트워크 허용이 잘 됐는지 테스트
SQL> SQL> conn vector/oracle@localhost:1521/FREEPDB1
연결되었습니다.
SQL> select utl_http.request('http://www.google.com') from dual ;
UTL_HTTP.REQUEST('HTTP://WWW.GOOGLE.COM')
--------------------------------------------------------------------------------
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ko"
><head><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><meta
content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop=
"image"><title>Google</title><script nonce="hsUq-QsQJm3h1R0RVnxJ7w">(function(){
var _g={kEI:'N4I1Z4jXAv2Ovr0Pjfaa6A0',kEXPI:'0,3700245,1139,541533,2891,89155,78
218,258423,8155,23351,8701,13734,9779,62658,76208,15816,1804,35268,11814,1632,28
6,28993,5230280,10475,8834252,1,2,1,39,14,3,1,35,1,7,2,5,2,4,1,14,8,34,1,4,1,6,1
,6,1,6,9,1,6,1,6,1,55,27979038,16672,2169859,23029351,12799,100481,16825,2443,33
55,15164,7147,1034,5936,33801,9693,21668,6756,21349,2530,9139,739,2,2,18,3838,32
8,4459,1766,1117,22290,6,4577,5634,687,19334,6976,2770,773,1342,13707,8213,7422,
7070,5059,2249,1523,1907,12568,797,16870,10672,1838,2301,8647,597,1801,9097,46,3
5) (vector 유저) dbms_vector_chain.create_credential을 사용하여 openai에 대한 자격을 생성합니다.
자격의 이름은 OPENAI_2입니다. jo.put 문장의 API KEY부분에 생성한 secret key를 입력합니다.
SQL> declare
2 jo json_object_t;
begin
jo := json_object_t();
jo.put('access_token', 'API KEY');
dbms_vector_chain.create_credential(
credential_name => 'OPENAI_2',
params => json(jo.to_string));
end;
/ 3 4 5 6 7 8 9 10
PL/SQL 처리가 정상적으로 완료되었습니다.
아래 딕셔너리뷰에서 생성한것을 볼 수 있습니다.
SELECT owner, credential_name, username
FROM all_credentials
ORDER BY owner, credential_name, username;
OWNER |CREDENTIAL_NAME|USERNAME|
-------+---------------+--------+
DOCUSER|OPENAI_CRED |NA |
VECTOR |OPENAI_2 |NA |
6) (vector 유저) PL/SQL 스크립트로 간단한 질의를 하고 받아보겠습니다.
param의 설정에서 생성한 증명의 이름OPENAI_2와 기타 설정들이 잘 되어 있는지 확인합니다.
질문해도 될까라는 질문에 답변이 잘오는 것을 확인할 수 있습니다.
디비버같은 client tool에서 확인해볼시에는
input := '&prompt';
위의 문장을 아래로 변경하여 변수를 받아오는 방법을 다르게 표현하면 됩니다.
input := :prompt;
SQL>
SET SERVEROUTPUT ON;
DECLARE
input CLOB;
params CLOB;
output CLOB;
BEGIN
input := '&prompt';
params := '{
"provider" : "openai",
"credential_name" : "OPENAI_2",
"url" : "https://api.openai.com/v1/chat/completions",
"model" : "gpt-3.5-turbo",
"max_tokens":1000,
"temperature": 1.0
}';
utl_http.set_body_charset('UTF-8');
output := DBMS_VECTOR_CHAIN.UTL_TO_GENERATE_TEXT(input, json(params));
DBMS_OUTPUT.PUT_LINE(output);
IF output IS NOT NULL THEN
DBMS_LOB.FREETEMPORARY(output);
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
DBMS_OUTPUT.PUT_LINE(SQLCODE);
END;
/
prompt의 값을 입력하십시오: 안녕 질문해도 될까
구 6: input := '&prompt';
신 6: input := '안녕 질문해도 될까';
네, 물론이죠! 어떤 질문이든 도와드릴 수 있습니다. 무엇이든 물어보세요.
PL/SQL 처리가 정상적으로 완료되었습니다.
출처 : https://docs.oracle.com/en/database/oracle/oracle-database/23/vecse/sql-rag-example.html
출처 : https://kosate.github.io/blog/oracle/generated_sql_by_llm/
'Oracle > 운영' 카테고리의 다른 글
[SGA] library cache lock&pin 발생원인과 재현하기 (2) | 2024.12.13 |
---|---|
Lob Partition 의 partition과 lob partition의 default attributes 설정 변경하여 자동으로 추가되는 파티션 압축되게 하기 (2) | 2024.11.22 |
[23ai] ai벡터검색 - vector_distance (0) | 2024.11.13 |
[23ai] new feature 벡터 타입과 ai벡터검색 - pdf파일을 백터검색하기 (2) (0) | 2024.11.12 |
[23ai] new feature 벡터 타입과 ai벡터검색 - 유사성검색 (3) (0) | 2024.11.12 |
댓글