들어가며

오라클 데이터베이스 23ai버전은 LLM과 직접 통신할수 있는 AI Vector Searh기능을 제공합니다. 기업의 많은 데이터는 오라클 데이터베이스에 있고, LLM과 연동할경우 다양한 업무영역에서 활용할수 있을것 같습니다.

예를 들면, 텍스트 데이터관점에서보면 텍스트 요약, 텍스트 보정, 감정분석, 텍스트 분류, 키워드 추출작업등이 곧바로 적용될수 있는 영역인것 같습니다.

그러나 데이터베이스의 특성 상 기업의 중요한 데이터를 보관하므로 클라우드와 연동하기 어렵거나 실제 업무에 활용할경우 기술적인 문제를 포함하여 많은 난관들이 있을수 있습니다.

그래서 LLM모델을 클라우드가 아닌 온프레미스에서 구축하려는 시도들이 많이 있습니다. LLama나 Mistral과 같은 오픈소스를 할수도 있고, 국내 상용 LLM들을 사용할 수도 있습니다.

본 블로그에서는 전세계에서 기술력을 인정받고 자연어 처리 분야에서 두각을 나타내고 있는 업스데이지(스타트업)의 Solar LLM과 연동방법에 대해서 확인해보았습니다.

업스테이지(upstage.ai)

업스테이지는 네이버,카카오에서 AI관련된 분들이 나와서 창업한 회사입니다. 처음에는 Document AI를 시작으로 시장에 진출했으며 최근에는 Solar LLM에서 전세계적으로 인정받으면서 성장하고 있다고 합니다.

주요 제품

  1. Document AI: 문서의 레이아웃 분석, OCR, 핵심 정보 추출을 통해 자동화된 문서 처리를 지원
  2. Solar LLM: 다양한 비즈니스 작업을 지원하는 대규모 언어 모델로, 챗봇, 번역, 임베딩 생성 등 다양한 API를 도메인기반과 특정 언어기반으로 확장하고 있습니다.

국산 솔루션인 만큼 기대가 큽니다. 사실 부럽습니다. :)

LLM 연동방안

Solar LLM은 Open AI와 호환되는 API를 제공하므로 오라클 DB과 직접 연결이 가능합니다.

우선 solar llm을 사용하기 위하여 upstage.ai에 가입을 했습니다. 30$의 Credit를 제공합니다. Solar LLM Mini chat버전기준으로 1M토근당 0.5$이므로 API Key를 60M토근을 사용할수 있는거죠? 기간 제한은 있습니다. 가입일로부터 약 3개월입니다.

Code : sql
declare
  v_params json_object_t;
  v_name varchar2(1000) :=  'SOLAR_CRED';
  v_api_token varchar2(1000) := '<API Key>'; 
begin
   v_params := json_object_t();
   v_params.put('access_token',v_api_token); 
   begin
        DBMS_VECTOR_CHAIN.DROP_CREDENTIAL ( CREDENTIAL_NAME  => v_name);
   exception 
     when others then
        null;
   end;
   
   DBMS_VECTOR_CHAIN.CREATE_CREDENTIAL ( CREDENTIAL_NAME => v_name, PARAMS => json(v_params.to_string));
end;
/

Solar LLM은 OpenAI와 호환되는 REST API를 제공하므로 Param정보에서 provider로 openai를 선택하고 업스테이지의 REST API endpoint와 모델을 지정하였습니다.

현재(2024년 7월기준) 두가지 모델을 제공합니다. GPT-3.5성능을 내고, 영어와 한국어와 특화된 버전인 solar-1-mini-chat과, 일본어에 특화된 solar-1-mini-chat-aj버전입니다. 두 모델 모두 32K의 컨텍스트 크기를 가지고 있습니다.

Code : sql
-- LLM모델과 파라미터정보를 테이블로 관리합니다.
create table my_models(
    model_id number generated by default on null as identity primary key,
    model_type varchar2(1000),
    model_params json);

-- JSON정보를 쉽게보기 위하여 VIEW를 생성합니다.
create or replace view vw_my_models 
as
select m.model_id,m.model_type, mt.*,m.model_params from my_models m
   CROSS JOIN JSON_TABLE(
        m.model_params, 
        '$[*]' COLUMNS (
            provider VARCHAR2(4000) PATH '$.provider',
            credential_name VARCHAR2(4000) PATH '$.credential_name',
            model VARCHAR2(4000) PATH '$.model'
        )
) as mt;

-- Solar LLM과 연동할수 있도록 인증정보, 모델정보, REST API정보를 제공합니다.
insert into my_models (model_type, model_params)
    values ('LLM',json('{
  "provider": "openai",
  "credential_name": "SOLAR_CRED",
  "url": "https://api.upstage.ai/v1/solar/chat/completions",
  "model": "solar-1-mini-chat",
  "max_tokens":1000,
  "temperature": 1.0
}'));

commit;

답변을 요청하는 함수를 생성합니다. 인자로 모델명, 프롬프트 정보가 입력됩니다.

Code : sql
 CREATE OR REPLACE FUNCTION generate_text(p_model_name varchar2, p_prompt CLOB) RETURN CLOB 
IS 
   output CLOB;
   v_model_params json;
BEGIN 
    --모델 정보가져오기
   select model_params into v_model_params 
     from vw_my_models 
   where model_type = 'LLM' and model = p_model_name;
   -- REST API 통신할때 문자 인코딩 설정
   utl_http.set_body_charset('UTF-8'); 
   -- 결과요청
   output := dbms_vector_chain.utl_to_generate_text(p_prompt, v_model_params);
   return output;
END;
/

solar-1-mini-chat 모델로 답변을 요청하였습니다.

Code : sql
set serveroutput on 
declare
    v_model_name varchar2(100) := 'solar-1-mini-chat';
    v_prompt clob;
begin
   v_prompt := '[
        {"role":"system", "content":"당신은 친철한 지원자입니다."},
        {"role":"user", "content":"당신이 누구인가요? 그리고 당신이 할수 있는 작업은 무엇인가요? 당신이 학습한 일자는 언제 인가요?"}
    ]';
   dbms_output.put_line('답변 : '||generate_text(v_model_name, v_prompt));
end;
/

답변 내용입니다. 학습시점은 2023년으로 보입니다.

답변 : 안녕하세요! 저는 OpenAssistant입니다. 
사용자분들을 도와드리기 위해 만들어진 친절한 인공지능입니다. 
 주요 역할은 질문에 대한 답변을 제공하고, 정보를 제공하며, 일상적인 작업에 도움을 주는 것입니다. 
제가 학습한 정보는 2023 현재까지의 데이터로 구성되어 있습니다. 
제가 도움이 필요하시다면 언제든지 말씀해주세요!

임베딩 모델 연동

(2024년 7월기준) 업스테이지의 임베딩 모델은 두가지 모델을 지원하고 있습니다. 두 모델 모두 Context사이즈((토큰)는 4K입니다.

  • solar-embedding-1-large-query : 사용자 질문에 대한 임베딩 모델
  • solar-embedding-1-large-passage : 검색되어지는 문서/텍스트에 대한 임베딩 모델
  • 관련 사이트 : https://developers.upstage.ai/docs/apis/embeddings
  • 최적의 사용자 경험을 위하여 512토큰이하로 요청하는것을 권고한다라고 되어 있습니다.
Code : sql
-- Solar LLM과 연동할수 있도록 인증정보, 모델정보, REST API정보를 제공합니다.
insert into my_models (model_type, model_params)
    values ('EMBEDDING',json('{
  "provider": "openai",
  "credential_name": "SOLAR_CRED",
  "url": "https://api.upstage.ai/v1/solar/embeddings",
  "model": "solar-embedding-1-large-query"
}'));

commit;

텍스트 임베딩을 조금더 편하게 하도록 embedding_text 함수를 생성했습니다. 임베딩 모델명과 텍스트를 넣으면 VECTOR타입의 데이터가 생성됩니다.

Code : sql
 CREATE OR REPLACE FUNCTION embedding_text(p_model_name varchar2, p_text CLOB) RETURN VECTOR 
IS 
   output VECTOR;
   v_model_params json;
BEGIN 
    --모델 정보가져오기
   select model_params into v_model_params 
     from vw_my_models 
   where model_type = 'EMBEDDING' and model = p_model_name;
   -- REST API 통신할때 문자 인코딩 설정
   utl_http.set_body_charset('UTF-8'); 
   -- 결과요청
   output := dbms_vector.utl_to_embedding(p_text, v_model_params);
   return output;
END;
/

hello 텍스트를 벡터 임베딩하였습니다.

Code : sql
select VECTOR_DIMENSION_COUNT(v.vec) dim, VECTOR_DIMENSION_FORMAT(v.vec) format, v.vec
  from (select embedding_text('solar-embedding-1-large-query', 'hello') vec) v;

실행결과입니다. 벡터 값은 4096차원, 숫자형식은 FLOAT32 입니다. 벡터의 총 데이터 크기는 16K(4byte*4K) 입니다.

       DIM FORMAT         VEC
---------- -------------- --------------------------------------------------------------------------------
      4096 FLOAT32        [1.18560791E-002,-2.1484375E-002,-2.02789307E-002,-6.09970093E-003,1.98516846E-0
                          02,-2.01225281E-003,6.09588623E-003,-1.5914917E-002,-1.57623291E-002,3.05633545E
                          -002,7.12871552E-004,1.61552429E-003,5.63812256E-003,7.2593689E-003,-1.25274658E
                          -002,1.70516968E-003,3.13568115E-003,1.30310059E-002,-3.37524414E-002,-2.0446777
                          3E-002,1.00402832E-002,-1.82151794E-003,-1.7868042E-002,3.08418274E-003,-2.47383
                          118E-003,2.3651123E-002,-1.01242065E-002,-4.28466797E-002,3.0456543E-002,6.46591
                          187E-003,-1.71756744E-003,-1.20773315E-002,8.19396973E-003,2.27737427E-003,1.013
                          (중략)

마무리

지금까지 업스테이지의 Solar LLM과 오라클 데이터베이스 23ai버전과 연동하는 방법에 대해서 알아보았습니다. 오라클 데이터베이스에는 DBMS_VECTOR_CHAIN패키지를 제공하여 PL/SQL을 통해서 LLM모델과 쉽게 연동할수 있습니다.

인터넷에 검색을 해도 Local LLM구축하는 방법에 대해서 많이 나와 있습니다. 그러나 기업내에서 안정적으로 서비스를 개발하기 위해서는 초기 구축비용도 많이 발생되지만, 서비스의 지속적인 개선작업을 위하여 인력 및 인프라 비용도 많이 발생됩니다. 상용LLM을 통해 보다 빠르게 기업에 적용할것인지, 오픈소스를 시작으로 내부 역량을 강화하면서 기업에 적용할것인지, 고민이 필요해보입니다.

LLM의 역할은 데이터를 소비하는 입장이기도 하지만 새로운 비정형 데이터를 생성시키는 도구이기도 합니다. 데이터의 소비와 생성(저장) 요건이 데이터베이스 시장에서 새로운 트랜드가 되지 않을까 싶고, 데이터 없이는 AI가 없듯이 데이터베이스도 LLM과 필수적으로 연동할수 밖에 없는 시점이 다가오는것 같습니다.

참고문서

댓글남기기