refs #739: preserve Smilegate changes before repository layout migration

This commit is contained in:
devmrko
2026-08-03 11:12:19 +09:00
parent 022ae7f9d2
commit 4d2964b5c6
58 changed files with 3002 additions and 291 deletions

View File

@@ -26,6 +26,13 @@
6. Streamlit 외피는 Smilegate 프로필·게임 데이터 시나리오·`oracle.select_ai.smilegate_game_text2sql` MCP 하나만 노출한다. 이전 고객용 토큰 프리셋 및 감사·보안관리 탭은 기본 실행 경로에서 제외한다.
7. `/schema-metadata`의 테이블 comment·컬럼 comment·annotation 조회와 저장 DDL은 모두 `SchemaMetadataMapper`로 수행한다. 메타데이터 조회는 `SGMP_POC` owner와 허용된 테이블 목록으로 한정한다.
## 메타데이터 화면 표시 원칙
테이블 comment, 컬럼 comment, annotation의 값은 목록에서 바로 읽을 수 있어야 한다.
접기/펼치기는 수정 입력란을 여는 용도로만 사용하며, 값의 존재 여부를 판단하기 위해
사용자가 모든 컬럼을 열어 보게 하지 않는다. comment가 비어 있는 컬럼은 목록에서
`컬럼 comment 없음`으로 명시한다.
## 설계 결정
### 1. 업무 용어는 데이터 모델의 사실에 맞춘다
@@ -68,7 +75,7 @@ MCP tool은 `SGMP_POC_HAIKU45` 프로파일을 기준으로 게임 데이터의
| 행 접근 화면 | `templates/permissions.html`, `static/js/app.js`, `PermissionView.java` | 보험 용어와 존재하지 않는 KB SQL 예시 제거 |
| 마스킹 화면 | `templates/masking-rules.html`, `templates/user-masking-rules.html`, `MaskingPolicySynchronizer.java` | 게임 데이터 예시 및 실제 `SGMP_POC` 관리 대상 사용 |
| VPD/운영 화면 | `templates/vpd-filter-runtime.html`, `templates/operation-status.html` | 게임 데이터 상태 표시 예시 적용 |
| MCP 화면 | `templates/mcp-sse.html`, `McpSseService.java`, `SmilegateSelectAiService.java` | 게임 데이터 Select AI 도구, 토큰 검증 및 SHOWSQL 생성 |
| MCP 화면 | `templates/mcp-sse.html`, `McpSseService.java`, `SelectAiService.java` | 업무 데이터 Select AI 도구, 토큰 검증 및 SHOWSQL 생성 |
| 보안 스크립트 화면 | `SecuritySqlScriptService.java` | UI에 노출되는 KB 설명을 게임 데이터 설명으로 교체 |
| Streamlit 외피 | `poc4_active_source_20260714/config/`, `apps/poc4/mcp_discovery_ui.py` | Smilegate 로그인/헤더/시나리오와 단일 게임 Text2SQL MCP 계약 적용 |
| 스키마 메타데이터 | `SchemaMetadataService.java`, `SchemaMetadataMapper.java`, `SchemaMetadataMapper.xml` | 직접 JDBC 제거, MyBatis 조회·DDL 통일, `SGMP_POC` owner 조건 강제 |

View File

@@ -49,6 +49,13 @@
4. 실행 뒤에는 현재 답변, 생성 SQL, 조회 행, 판정, 판정 근거를 표시하고 `SG_AI_QA_ANSWER`에 저장한다.
5. 같은 질문의 과거 답변은 최신 순 표로 보여 주며, 과거 기준 검증과 현재 실행을 구분한다.
## 실행 근거 표시와 가독성
선택 질문의 기준 답변과 기준 SQL은 브라우저의 다크 테마 설정과 관계없이
밝은 배경과 어두운 글자로 표시한다. 질의 실행이 끝난 뒤에는 요약 답변만
보여 주지 않고, 실제 MCP가 반환한 생성 SQL과 조회 결과 테이블을 기본으로
펼쳐서 함께 보여 준다. 결과 행이 없으면 그 사실을 명확히 표시한다.
## 적재 기준
- 기준 원본은 `sgmp-select-ai-full-qa-term-dict-final-v2-20260721.md`와 동시 생성된 JSON이다.

View File

@@ -0,0 +1,35 @@
# 743 · 게임 식별 JSON Duality View 검색
## 프로젝트 개요
게임 질의 계획기는 DB 카탈로그를 사용해 게임 대상과 실행 작업을 결정한다. 현재는 LLM mention 추출 결과만 벡터 검색에 전달하므로, 질문에 명시된 `GAME_ID`가 mention에서 빠지면 게임을 찾지 못한다.
## 목표
게임명·별칭·`GAME_ID`·`GAME_PREFIX`·카탈로그 키를 하나의 DB JSON 문서로 표현하고 그 문서를 임베딩 원본으로 사용한다. 게임 식별 표현은 모두 mention 추출 대상이며, 검색·결과 식별은 DB 카탈로그만 사용한다.
## 설계
1. `sg_game_extract_mentions`는 정식 게임명, 별칭, `GAME_ID`, `GAME_PREFIX`, 카탈로그 키를 동등한 게임 대상 표현으로 추출한다.
2. `sg_game_catalog_identity_dv` JSON Relational Duality View는 게임별 식별 문서를 제공한다.
3. `sg_game_catalog.embedding`은 Duality View의 JSON 문서 직렬화 결과로 다시 생성한다.
4. `sg_game_catalog_search`는 해당 embedding을 검색한다. 따라서 입력 표현이 어떤 필드와 일치하더라도 같은 게임 문서로 수렴한다.
## JSON 문서 계약
```json
{
"_id": "카탈로그 키",
"gameId": "게임 ID",
"gamePrefix": "게임 prefix 또는 null",
"gameName": "정식 게임명 또는 null",
"gameAliases": "등록 별칭 JSON"
}
```
## 검증
- `STOVE_CHAOSZERO`처럼 등록된 `GAME_ID``game_mentions`에 포함된다.
- planner 결과가 `NONE`이 아니라 카탈로그의 단일 게임 target을 반환한다.
- `game_id가 STOVE_CHAOSZERO인 2026년 7월 15일 매출 합계`는 공통 매출 task를 생성·실행한다.
- 새 게임 또는 별칭을 DB 카탈로그에 추가하고 문서·embedding만 재생성하면 애플리케이션 수정 없이 검색된다.

View File

@@ -0,0 +1,22 @@
# STD-18 필터 매출 집계 Few-shot 정정
## 목표
`전체 매출에서 금액 조건을 만족하는 주문` 질문은 개별 주문 목록이 아니라, 조건을 적용한 전체 매출 집계(총매출·구매자 수·주문 수)를 반환한다.
## 문제
`STD-18` 고객 기준과 맞지 않는 개별 주문 상세 Few-shot이 관리 화면에 남아 있었다. 해당 레코드는 특정 고객 날짜와 금액을 고정한 SQL이라 재사용 가능한 패턴도 아니다.
## 변경
1. 잘못된 `STD-18` 고객 Few-shot 레코드를 삭제한다. 고객 기준 질문은 평가 기준으로만 보관한다.
2. 질문·날짜·금액·결과값을 고정하지 않은 `FILTERED_SALES_AGGREGATE` 일반 패턴을 만든다.
3. 일반 패턴은 금액 필터 뒤 `SUM`, `COUNT(DISTINCT ...)`, `COUNT(*)` 집계를 사용하며, 사용자가 명시적으로 목록/상세를 요구한 경우에만 상세 패턴을 사용하도록 설명한다.
4. `STD-18` 기준 SQL과 기준 답변을 집계 기준으로 되돌린다.
## 검증 기준
- 잘못된 예제 #57은 더 이상 `sg_qa_vector_example`에 존재하지 않는다.
- 벡터 검색 결과에 일반 집계 패턴이 포함된다.
- 포털 전체 경로에서 STD-18이 집계 SQL과 한 행 결과를 반환하고 평가가 PASS다.