PostgreSQL Openai or Llama 연결 Setting
https://eglife.tistory.com/338
PostgreSQL, LLM 연결(4)
1.https://github.com/cloudquery/pg_gpt2.https://github.com/prabin-acharya/pg_gpt3.https://github.com/JelteF/pg_human4. https://github.com/pramsey/pgsql-openai5.https://www.crunchydata.com/blog/accessing-large-language-models-from-postgresql 으쌰으쌰
eglife.tistory.com
지난 글에서의 후기처럼, 어찌어찌 Llama를 이용한 Output은 받아올 수 있다.


즉, PostgreSQL에서 일단, Llama는 불러올 수 있다는 것이다.
자, 이제는 PostgreSQL에 Llama를 덧붙이는 Extension code를 직접 만들어볼 시간이다.
참고 링크: https://github.com/prabin-acharya/pg_gpt |
구현 해야하는 것은 PostgreSQL에 SQL2NL or NL2SQL Model을 연결하는 Data pipeline(Data가 어느 한 곳에서 다른 한 곳으로 이동해가는 것)을 구현하는 것이다.
Usercase는
1. User가 SQL을 PostgreSQL에 입력한다.
2. 해당 SQL문이 Llama를 타고 들어가 NL Output을 만들어내고, 그것이 User에게 보인다.
3. User가 해당 NL을 본 뒤, Y/N? 문구에 대해서 Y를 입력하면 해당 SQL에 대한 Retrieve 결과가 출력되고 아니면 Rollback이다.
기본 골자는 위와 같고, 이 Base가 잡히면 검토해 볼 수 있는 부분이
1. Llama 모델을 Fine-tuning 시키는 것이다. 해당 모델을 NL2SQL 또는 SQL2NL Model로 Fine-tuning 시켜서 번역 정확도를 높힌다.
2. DB의 Table Schema 또한 PostgreSQL에서 추출이 가능한데(https://eglife.tistory.com/337 중반부 참고), 이것을 Prompt에 넣어 모델 정확도 높히는 법도 생각해볼 수 있다.
3. 이 Model의 정확도 측정법에 대한 연구도 해볼 수 있다.
일단 Advanced 검토 부분은 차치하고, Base 부분부터 구현해보도록 하자.
https://github.com/bgg-lee/pg_sql2nl
이 git-hub에서 Extension을 만들어갈 예정이다.
타인 개발 Repository를 나의 Rep으로 Fork(복제) 한 다음에 내 뜻대로 코드를 변경해보려고 한다.
Process는 아래와 같다.
1. 내 Git-hub repository 만들2. 로컬에서 작업 순서 (원본 레포 clone → 내 레포로 push)A. 원본 레포( prabin-acharya/pg_gpt )를 Clone# 원하는 폴더(예: D:\VLDB\My_Research\SQL2NL_PSQL\Related_Work\ )에서git clone https://github.com/prabin-acharya/pg_gpt.git # clone 완료 후 cd pg_gpt B. 기존 origin 제거, 새 origin 등록
git remote -v |
위 Route로 PostgreSQL extension을 무리 없이 만들었다면, 내 Local PostgreSQL에 적용시켜보면서 제대로 동작하는 지 확인하는 작업이 필요할 것이다.
이제 기존 Code를 Base로 해서 코드수정작업을 진행해보자..
일단 llama extension PostgreSQL에 설치하는 거까진 완료. 기능구현은 Not yet
그럼 이제 Extension에 Llama 연결 기능을 넣어보자.
그럼, Extension의 어느 파일을 수정해야 기능을 넣을 수 있을까?
기본적으로 Extension은 4가지 파일로 구성이 된다. Makefile / C 파일 / SQL 파일 / Control 파일
각각의 역할을 정리해보면 아래와 같다.(By GPT)
|
정리하면, 확장 메타정보를 변경하려면 COntrol 파일을 바꾸고, C함수 <-> PostgreSQL Mapping 정보를 바꾸고 싶으면 SQL파일을 바꾸고, 빌드/설치과정을 변경하고 싶다면 Makefile을 수정해야 한다.
우리는 지금 Extension의 기능 / Logic을 바꾸고 싶으니 C 파일을 수정해야 한다. 함수 내부에서 어떤 API를 호출할 지, 어떻게 응답을 Parsing하고 어떤 Error를 처리할 지 등등..을 이 C파일에 구현해야 하며, Function 자체를 삭제 or 추가할 때에는 C 파일 / SQL 파일 모두 양쪽에 동시에 수정을 진행해야 한다.
일단 Extension Llama에 연결은 성공, 하지만 기능 구현 다듬기 시간 더 필요
현재 Extension C코드(Logic 구현)의 흐름은 아래와 같다.
사용자가 PostgreSQL DB 內 Terminal에서 SQL문을 통해 Select llama_query ( or llama_explain ) 등의 함수를 호출하면 PostgreSQL은 해당 호출을 Extension C 코드 내 Function과 연결한다.
해당 함수는 User input을 받아서 Llama Server에 JSON파일로 HTTP 요청을 진행하고, 응답을 Parsing해서 결과를 반환한다.
llama_explain 함수를 예로 들어서 좀 더 구체적으로 알아보자.
1) 사용자 호출 (예: SELECT llama_explain('list all employees name');)
-> PostgreSQL이 llama_explain 함수를 찾고, C 코드 내에 llama_explain 함수를 실행
2) 함수 내부 처리
Datum llama_explain(PG_FUNCTION_ARGS)
{
// (1) 사용자가 입력한 text 인자를 C string으로 변환
char *sql_query = text_to_cstring(PG_GETARG_TEXT_P(0));
// (2) DB 스키마 정보 가져오기 (예시)
// get_schema_of_db() -> SQL 실행 via SPI, 테이블/컬럼 목록을 문자열로 반환
char *db_schema = get_schema_of_db();
// (3) JSON 바디(req_body) 구성
// "prompt" 필드에 스키마와 user의 SQL을 합쳐,
// Llama 서버가 어떤 내용을 생성해야 할지 지시
char req_body[4096];
snprintf(req_body, sizeof(req_body),
"{"
"\"model\":\"llama3:latest\","
"\"prompt\":\"Here are all tables in DB: %s. Explain what this SQL does: %s\","
"\"max_tokens\":1024"
"}",
db_schema, sql_query
);
// (4) request_llama(req_body) 호출: libcurl로 HTTP POST
// -> Llama 서버 응답(JSON 문자열)을 반환
char *json = request_llama(req_body);
// (5) get_text(json)로 "text":"..." 부분 추출
// -> 실제 모델이 생성한 텍스트를 substring으로 뽑아냄
char *extracted = get_text(json);
// (6) remove_newline(extracted): \n 패턴을 공백으로 치환
char *final = remove_newline(extracted);
// (7) 결과를 PostgreSQL의 text 형식으로 변환하여 반환
PG_RETURN_TEXT_P(cstring_to_text(final));
}
위 코드 내 주석으로 간단히 기능들을 설명했다. (1)~(2)는 User로부터 Input을 입력받는 구간이고 (3)은 그 Input을 가공해서 Llama로 보내는 구간이다.
여기서 궁금했던 사항
- HTTP 요청할때 JSON 형태로 보내는 이유?설계상의 이유로 그렇다. 일반적으로 LLM 서버는 JSON 형식으로 Request Body를 받도록 되어 있다. 즉, JSON이 이 생태계에선 표준적인 방법이다. |
(3)에서 우리는 Llama에 User input외에 DB Schema도 같이 전달한다.
- Table Schema를 가져오는 메커니즘 설명 보완일단, SPI(Server Programming Interface) connect를 시도한다. SPI는 PostgreSQL 내부에서 SQL을 실행하기 위한 API(Application Programming Interface)다. 그리고 infrmation_schema.columns View를 이용해 User Table + Column을 모두 가져오는 쿼리를 쓴다.SPI_exec이 끝나면 결과의 집합(Set)은 SPI_tuptable에 들어온다. 그리고 SPI_processed는 결과 Row의 개수이다. LOOP를 돌면서 db_schema라는 Buffer에 하나씩 data를 쌓는 것. 아래는 infrmation_schema.columns View의 예시다. ![]() |
그리고 (4)~(7)은 Llama에서 반환받은 Data를 전처리한 뒤에 다시 User에게 보여주는 것이다.
llama_explain의 snprintf 안에 유독 백슬래시(\) 사용이 많은데, 그건 쌍따옴표(")를 Escape해주기 위함이다.
추가로, text_to_cstring, PG_RETURN_TEXT_P와 같이 c code 내부에 없는데, 중간 중간 쓰이는 것들은 PostgreSQL의 Extension 개발에 쓰이는 기본 매크로/함수들이다. 각각의 역할은 아래와 같다.
|
그리고, request_llama 내부에 있는 curl_easy_setopt 같은 경우는 libcurl 라이브러리의 C API이다.
|
TCP.... IP .... 등 좀 WEB Coding 기반의 용어들이 나오는데 솔직히 잘 아는 분야는 아니다 ㅠㅠ
그리고 이쯤되면 궁금했던 것, PostgreSQL 내부에선 무조건 select 문을 이용해서만 extension 호출이 가능한가..?
그렇다. “SELECT llama_explain('...')” 같은 형태로 확장 함수를 직접 호출 가능하다. Select를 이용하지 않으면 그냥 'Function 없음' Error가 발생한다. 다시 말해, Create Extension을 하고, 그 Extenstion 내부에 Create Function이 선언되어 있어야 Select를 통한 Function call이 가능하다. |
본격적인 Code 진행은 다음 글로..

'Data Science > Research' 카테고리의 다른 글
SQL2NL Prompt Engineering - KCC(2) (0) | 2025.04.08 |
---|---|
SQL2NL Prompt Engineering - KCC(1) (0) | 2025.04.04 |
SQL2NL 용 Data set 만들기 (0) | 2025.03.31 |
PostgreSQL, LLM 연결(4) (0) | 2025.03.26 |
PostgreSQL, LLM 연결(3) (0) | 2025.03.25 |