# Select AI 프로파일 전환 및 호출 시간 리포트

## 대상

- 날짜: 2026-07-10
- 대상 서비스: VPD 관리 인스턴스 MCP / ORDS Select AI 조회
- MCP endpoint: `https://kb.cloud-handson.com/mcp`
- MCP tool: `ords.query.kb_select_ai_vpd`
- ORDS endpoint: `/ords/cb-ords/kb-select-ai-vpd/query`
- 테스트 질의:

```text
C1001006 고객 자동차보험 갱신 상담 전에, 현재 KB 계약(41048)과 삼성화재 보유 자동차보험 약관을 비교해서 고객에게 설명할 차별 포인트를 정리해줘.
```

## 결론

기존 `openai.gpt-5.5` 기반 Select AI 프로파일은 SQL 생성 시간이 길고, 같은 질의에서도 SQL 생성 실패/거절 응답이 간헐적으로 발생했다.

최종 적용 프로파일은 아래로 변경했다.

```text
KB_AIDP_SELECTAI_GPT54_MINI_COMMENTS_PROFILE_V1
```

이 프로파일은 `openai.gpt-5.4-mini`를 사용하고, `comments=true`를 켜서 테이블/컬럼 comment 기반 SQL 생성을 유지한다. 최종 ORDS 직접 호출은 약 4.1초, MCP 호출은 약 4.6~8.2초 범위로 확인됐다.

## 기존 호출 시간

기존 운영 프로파일:

```text
KB_AIDP_SELECTAI_GPT55_OCI_PROFILE_V2
model=openai.gpt-5.5
provider=oci
region=us-chicago-1
provider_endpoint=https://inference.generativeai.us-chicago-1.oci.oraclecloud.com
comments=true
annotations=true
constraints=true
conversation=true
enforce_object_list=true
```

관찰된 기존 병목:

| 측정 구간 | 시간 | 결과 |
|---|---:|---|
| VPD context 설정 | 282ms | 정상 |
| 확정 SQL + VPD 실행 | 50ms | 정상 |
| `showprompt` metadata/prompt 생성 | 43.817초 | prompt 18,806자 |
| `showsql` 1차 | 38.770초 | SQL 생성 성공 |
| `showsql` 2차 | 105.505초 | non-SQL refusal |
| SQLcl direct package 호출 | 61.123초 | SQL 생성 및 2건 반환 |
| MCP 경로 호출 | 54.3초 | `ORA-20813`, Select AI가 유효 SELECT 생성 실패 |
| GPT-5.5 재비교 호출 | 72초 | SQL 대신 refusal 메시지 반환 |

판단:

- DB/VPD/ORDS 자체가 느린 것이 아니다.
- 주 병목은 `DBMS_CLOUD_AI.GENERATE` 내부의 Select AI prompt 구성과 LLM SQL 생성 단계다.
- `comments`, `annotations`, `constraints`, `conversation`, `enforce_object_list`가 모두 켜진 GPT-5.5 프로파일은 prompt가 커지고 응답 편차가 컸다.

## 후보 프로파일 테스트 결과

### 1. 단순 모델 교체 후보

| 프로파일 | 모델 | 설정 | 결과 |
|---|---|---|---|
| `KB_AIDP_SELECTAI_GPT5_MINI_PROFILE_V1` | `openai.gpt-5-mini` | 기존 GPT-5.5와 유사 | `ORA-20404 ... /actions/chat` |
| `KB_AIDP_SELECTAI_GPT41_MINI_PROFILE_V1` | `openai.gpt-4.1-mini` | 기존 GPT-5.5와 유사 | `ORA-20404 ... /actions/chat` |
| `KB_AIDP_SELECTAI_GROK43_PROFILE_V1` | `xai.grok-4.3` | 기존 GPT-5.5와 유사 | `ORA-20404 ... /actions/chat` |
| `KB_AIDP_SELECTAI_GPT54_MINI_PROFILE_V1` | `openai.gpt-5.4-mini` | 기존 GPT-5.5와 유사 | `ORA-20404 ... /actions/chat` |

오류:

```text
ORA-20404: Object not found - oci://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/chat
```

단순히 모델명만 바꾸는 방식은 안정적이지 않았다.

### 2. 기존 성공 프로파일 방식 확인

기존에 성공한 프로파일:

```text
POC_SELECT_AI_ALL
model=xai.grok-4.3
```

확인된 차이:

- `oci_compartment_id`가 있음
- `comments`, `annotations`, `constraints`, `conversation`, `enforce_object_list` 플래그가 없음

비교 결과:

| 프로파일 | 시간 | 결과 |
|---|---:|---|
| `KB_AIDP_SELECTAI_GPT55_OCI_PROFILE_V2` | 72초 | refusal 메시지 반환 |
| `POC_SELECT_AI_ALL` | 16초 | SQL 생성 성공 |

### 3. FAST 프로파일 테스트

`POC_SELECT_AI_ALL` 구조를 기준으로 `oci_compartment_id`를 포함하고, 무거운 메타데이터 플래그를 제거한 FAST 후보를 만들었다.

| 프로파일 | 모델 | showprompt | prompt 크기 | showsql | 결과 |
|---|---|---:|---:|---:|---|
| `KB_AIDP_SELECTAI_GROK43_FAST_PROFILE_V1` | `xai.grok-4.3` | 3초 | 5,049자 | 7초 | 성공 |
| `KB_AIDP_SELECTAI_GPT54_MINI_FAST_PROFILE_V1` | `openai.gpt-5.4-mini` | 0초 | 5,049자 | 4초 | 성공 |

FAST 방식은 빠르지만, 테이블/컬럼 comment 활용이 약해진다. 따라서 최종 적용용으로는 `comments=true`만 추가한 절충형을 별도 테스트했다.

### 4. Full metadata 프로파일 테스트

`comments=true`에 더해 `annotations=true`, `constraints=true`까지 켠 후보를 추가 테스트했다.

프로파일:

```text
KB_AIDP_SELECTAI_GPT54_MINI_FULLMETA_PROFILE_V1
model=openai.gpt-5.4-mini
comments=true
annotations=true
constraints=true
enforce_object_list=true
```

DBMS_CLOUD_AI 단독 측정:

| 회차 | showprompt | prompt 크기 | showsql | 결과 |
|---:|---:|---:|---:|---|
| 1 | 32초 | 19,816자 | 15초 | 성공 |
| 2 | 3초 | 19,816자 | 6초 | 성공 |
| 3 | 4초 | 19,816자 | 13초 | 성공 |

ORDS 실제 경로 측정:

| 회차 | HTTP | 총 시간 | 오류 | 반환 건수 |
|---:|---:|---:|---|---:|
| 1 | 200 | 8.224초 | 없음 | 2 |
| 2 | 200 | 7.288초 | 없음 | 2 |
| 3 | 200 | 6.217초 | 없음 | 2 |

평균:

```text
7.243초
```

비교:

| 구성 | ORDS 평균 | 상대 |
|---|---:|---:|
| `comments=true` only | 4.156초 | 1.0x |
| `comments + annotations + constraints` | 7.243초 | 약 1.7x 느림 |

판단:

- Full metadata 구성은 동작한다.
- 단, prompt 크기가 `12,520자`에서 `19,816자`로 증가한다.
- ORDS 기준 평균 응답 시간이 `4.156초`에서 `7.243초`로 늘어난다.
- 데모 응답성 기준으로는 `comments=true` only 구성이 더 적합하다.

## 최종 적용 프로파일

최종 적용:

```text
KB_AIDP_SELECTAI_GPT54_MINI_COMMENTS_PROFILE_V1
model=openai.gpt-5.4-mini
comments=true
enforce_object_list=true
oci_compartment_id=<configured>
```

테스트 결과:

| 구간 | 시간 | 결과 |
|---|---:|---|
| `showprompt` | 6초 | 성공 |
| prompt 크기 | 12,520자 | comment 포함 |
| `showsql` | 4초 | 성공 |

선택 이유:

- GPT-5.5 대비 훨씬 빠르다.
- FAST 프로파일보다 prompt가 크지만, 테이블/컬럼 comment를 유지한다.
- VPD 관리 인스턴스에서 보강한 table/column comment 운영 효과가 Select AI에 반영된다.

## 적용 내용

### DB 패키지

`POC_2.KB_SELECT_AI_VPD_QUERY_API`의 Select AI profile 상수를 변경했다.

```sql
c_profile_name CONSTANT VARCHAR2(128) := 'KB_AIDP_SELECTAI_GPT54_MINI_COMMENTS_PROFILE_V1';
```

대상 스크립트:

```text
database/adb/65_kb_select_ai_vpd_query_api.sql
```

### ORDS 응답 표시

ORDS JSON 응답의 profile 표시도 새 프로파일로 변경했다.

```text
profile=KB_AIDP_SELECTAI_GPT54_MINI_COMMENTS_PROFILE_V1
```

대상 스크립트:

```text
database/adb/66_kb_select_ai_vpd_query_ords.sql
```

### MCP 응답 표시

MCP tool 응답 payload의 profile 표시와 화면 설명을 새 프로파일 기준으로 변경했다.

대상 소스:

```text
vpd-backoffice/src/main/java/com/cloudhandson/vpdbackoffice/service/McpSseService.java
vpd-backoffice/src/main/resources/templates/mcp-sse.html
```

## 최종 속도 측정

### ORDS 직접 호출

호출 대상:

```text
https://g329127dfd380ad-kbaipoc.adb.ap-osaka-1.oraclecloudapps.com/ords/cb-ords/kb-select-ai-vpd/query
```

| 회차 | HTTP | 총 시간 | 응답 profile | 오류 | 반환 건수 |
|---:|---:|---:|---|---|---:|
| 1 | 200 | 4.058초 | `KB_AIDP_SELECTAI_GPT54_MINI_COMMENTS_PROFILE_V1` | 없음 | 2 |
| 2 | 200 | 4.216초 | `KB_AIDP_SELECTAI_GPT54_MINI_COMMENTS_PROFILE_V1` | 없음 | 2 |
| 3 | 200 | 4.195초 | `KB_AIDP_SELECTAI_GPT54_MINI_COMMENTS_PROFILE_V1` | 없음 | 1 |

평균:

```text
4.156초
```

### MCP 호출

호출 대상:

```text
https://kb.cloud-handson.com/mcp
```

| 회차 | HTTP | 총 시간 | MCP payload profile | ORDS profile | 오류 | 반환 건수 |
|---:|---:|---:|---|---|---|---:|
| 1 | 200 | 4.632초 | `KB_AIDP_SELECTAI_GPT54_MINI_COMMENTS_PROFILE_V1` | `KB_AIDP_SELECTAI_GPT54_MINI_COMMENTS_PROFILE_V1` | 없음 | 2 |
| 2 | 200 | 8.213초 | `KB_AIDP_SELECTAI_GPT54_MINI_COMMENTS_PROFILE_V1` | `KB_AIDP_SELECTAI_GPT54_MINI_COMMENTS_PROFILE_V1` | 없음 | 2 |
| 3 | 200 | 7.279초 | `KB_AIDP_SELECTAI_GPT54_MINI_COMMENTS_PROFILE_V1` | `KB_AIDP_SELECTAI_GPT54_MINI_COMMENTS_PROFILE_V1` | 없음 | 1 |

평균:

```text
6.708초
```

참고:

- MCP `time_starttransfer`는 약 0.008~0.012초였지만, 최종 응답 body 완료 기준은 `time_total`이다.
- MCP 경로는 백오피스 HTTP 처리와 ORDS 호출 wrapping이 추가되므로 ORDS 직접 호출보다 약간 느릴 수 있다.

## 개선 효과

| 비교 항목 | 기존 GPT-5.5 | 최종 GPT-5.4-mini comments |
|---|---:|---:|
| SQLcl direct package | 61.123초 | 4초대 SQL 생성 |
| 기존 MCP 실패 사례 | 54.3초 후 실패 | 4.6~8.2초 성공 |
| GPT-5.5 재비교 | 72초 후 refusal | 4.1초대 ORDS 성공 |
| prompt 크기 | 18,806~21,776자 | 12,520자 |

정리:

- 최종 ORDS 기준으로 기존 61~72초 구간 대비 약 10~17배 빠르다.
- MCP 기준으로도 기존 54.3초 실패 사례 대비 성공 응답이 약 4.6~8.2초로 줄었다.
- DB/VPD 실행 병목이 아니라 Select AI 프로파일/모델/메타데이터 구성이 핵심 병목이었다.

## 남은 주의점

1. 같은 자연어라도 Select AI 생성 SQL은 완전히 결정적이지 않다.
   - 테스트에서도 반환 건수가 1~2건으로 흔들렸다.
   - 이는 LLM SQL 생성 특성이다.
2. 비즈니스 품질을 더 안정화하려면 table/column comment와 annotation을 계속 보강해야 한다.
3. 특정 데모 질문은 deterministic SQL fallback 후보로 둘 수 있다.
   - 예: `CUST_ID`, `PRODUCT_CD`, `EXT_INSURER`, `EXT_PRODUCT_GRP`가 명확한 비교 질문.
4. 장기적으로는 profile을 설정값으로 분리하는 것이 좋다.
   - 현재는 DB package 상수로 고정되어 있다.
   - 운영 전환 시 `CB_BACKOFFICE_SETTING` 또는 별도 Select AI 설정 테이블에서 profile을 읽도록 개선할 수 있다.

## 현재 권고

데모/PoC 운영 기준으로는 현재 적용한 아래 프로파일을 유지한다.

```text
KB_AIDP_SELECTAI_GPT54_MINI_COMMENTS_PROFILE_V1
```

이유:

- 응답 시간이 데모 가능한 수준이다.
- comment 기반 스키마 설명을 유지한다.
- ORDS/MCP 양쪽 모두 실제 호출 성공을 확인했다.
