본문 바로가기
Oracle/운영

[23ai] ai벡터검색 - ChatGPT를 이용하여 실시간 응답을 받기(RAG)

by 취미툰 2024. 11. 15.
반응형

실제 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

 

AI Vector Search User's Guide

This scenario allows you to run a similarity search for specific documentation content based on a user query. Once documentation chunks are retrieved, they are concatenated and a prompt is generated to ask an LLM to answer the user question using retrieved

docs.oracle.com

출처 : https://kosate.github.io/blog/oracle/generated_sql_by_llm/

 

(SQL)RAG - 답변에 필요한 데이터를 스스로 검색 기술 - SQL 생성(Generation)

오라클 데이터베이스 23ai에 벡터 검색을 위한 Oracle AI Vector Search기능을 제공합니다. 벡터 검색기능이 RAG에서 많이 사용되고 있지만, 좀더 진보적으로 답변에 필요한 데이터를 자동검색하는 방안

kosate.github.io

 

반응형

댓글