Skip to content

Commit 9344286

Browse files
committed
chore: Notion 동기화 2026-07-21 15:57
1 parent d0c9a84 commit 9344286

15 files changed

Lines changed: 256 additions & 66 deletions

blog/.notion-sync.json

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@
2929
},
3030
"39ce15b4-0359-8051-a39e-d78c277e3c7e": {
3131
"file": "blog/2026-07-13-07-langgraph-기반-방송-워크플로우-설계.md",
32-
"last_edited": "2026-07-20T05:34:00.000Z",
33-
"content_hash": "38158c4fd24aaa3fd2464f2a8b78140433aa33cdbdbc8372100bd5de44bd4ecb",
32+
"last_edited": "2026-07-21T05:39:00.000Z",
33+
"content_hash": "482a6a3c97491c317fa897f1f101b3db8855e1834d4730f0004062363f7ab7b7",
3434
"order": 5,
3535
"parent_id": null
3636
},
@@ -43,22 +43,22 @@
4343
},
4444
"39de15b4-0359-8062-be07-f1e3d7c5499d": {
4545
"file": "blog/2026-07-14-12-과제-성과-종합-정리-1건.md",
46-
"last_edited": "2026-07-20T02:25:00.000Z",
47-
"content_hash": "cd0aa6b3be0421acc24c1979abe39af9851ca1ef990e54c6d44a157a7c771e41",
46+
"last_edited": "2026-07-21T05:42:00.000Z",
47+
"content_hash": "a5dfe1345d2fd0f330abc8ea5c1c36e1cddb0901b10f1f2d55b7bb1953e963f8",
4848
"order": 7,
4949
"parent_id": null
5050
},
5151
"39de15b4-0359-80d8-97bf-d05445c087bc": {
5252
"file": "blog/2026-07-14-12-향후-로드맵-및-지속-기여-계획-공유-1건.md",
53-
"last_edited": "2026-07-20T07:22:00.000Z",
54-
"content_hash": "5bbc98b9195591b1e52240f98319e223b353b42b230feb6bf0cfa21dced62eaf",
53+
"last_edited": "2026-07-21T05:40:00.000Z",
54+
"content_hash": "a2bc5ff68b269f769a85fb27e81685c927b42dbc4067f57131b1b8e7eeef14ea",
5555
"order": 8,
5656
"parent_id": null
5757
},
5858
"39de15b4-0359-80eb-b617-db767eb5277f": {
5959
"file": "blog/2026-07-14-11-방송-ai-오픈웨이트-모델-활용-사례-1건.md",
60-
"last_edited": "2026-07-20T07:52:00.000Z",
61-
"content_hash": "785122909612c9e8d3330c38bb84627e971d617f41e25c9e1442dd4c1ff70859",
60+
"last_edited": "2026-07-21T05:42:00.000Z",
61+
"content_hash": "0115e9be2dcae44cad52368b480b6e699c14aca28b53d74287bbb0a04d820925",
6262
"order": 9,
6363
"parent_id": null
6464
},
@@ -78,15 +78,15 @@
7878
},
7979
"39de15b4-0359-8096-8fe0-d8cf81d3e397": {
8080
"file": "blog/2026-07-14-09-db-스키마-공개.md",
81-
"last_edited": "2026-07-20T07:22:00.000Z",
82-
"content_hash": "7841b9b8747b396321437bc127cdb4f8d2a5984aca7971c3c36d2a1c1336b553",
81+
"last_edited": "2026-07-21T05:34:00.000Z",
82+
"content_hash": "a0e3af442d6a2053402a3e161af1a44724fe96e31b9824152253f89d9ed49de0",
8383
"order": 12,
8484
"parent_id": null
8585
},
8686
"39de15b4-0359-80cf-bde8-f114c7d20501": {
8787
"file": "blog/2026-07-14-10-sbsi-실증-테스트-사례-공유-1건.md",
88-
"last_edited": "2026-07-20T07:54:00.000Z",
89-
"content_hash": "d26eb2862e0e70a8e0b1782cdf811d34914085842e9749af092dea8e564aae3d",
88+
"last_edited": "2026-07-21T05:42:00.000Z",
89+
"content_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
9090
"order": 13,
9191
"parent_id": null
9292
},
@@ -99,22 +99,22 @@
9999
},
100100
"39de15b4-0359-800d-be84-c4e206eda79e": {
101101
"file": "blog/2026-07-14-11-오픈-소스-기여-종합-가이드-1건.md",
102-
"last_edited": "2026-07-20T06:31:00.000Z",
103-
"content_hash": "0edfcd5166916f407ddab2d87acbba8ec96b222eb0aafde539d65a9f12a26ac0",
102+
"last_edited": "2026-07-21T05:39:00.000Z",
103+
"content_hash": "6d2bcad61622158a844e817760e6ee934002c80a376507b3e832e8b11691d070",
104104
"order": 15,
105105
"parent_id": null
106106
},
107107
"39de15b4-0359-80e7-aa28-fd4d9b4583d2": {
108108
"file": "blog/2026-07-14-11-테스트-케이스-작성-1건.md",
109-
"last_edited": "2026-07-20T07:21:00.000Z",
110-
"content_hash": "ffc66d29dd8940538ba8966ca089d8ddf25dc80d77f981fbf5922ff06ef29ed8",
109+
"last_edited": "2026-07-21T05:39:00.000Z",
110+
"content_hash": "4bd5d61ef44ad0a5a4c5e5c8d03d563f6da9448a389a27c5b4a043c66e76c348",
111111
"order": 16,
112112
"parent_id": null
113113
},
114114
"39de15b4-0359-8088-be18-d31d76a03c9a": {
115115
"file": "blog/2026-07-14-08-숏폼-자동-생성-파이프라인-해설-1.md",
116-
"last_edited": "2026-07-20T07:41:00.000Z",
117-
"content_hash": "4ec410e41fb16f89428a3dc42d3460808c3c097b1bc79be9e661e36de8d59f4a",
116+
"last_edited": "2026-07-21T06:56:00.000Z",
117+
"content_hash": "779313c823feac82c950b7310edaf34a37f194de977fad0a87d18010a533978a",
118118
"order": 17,
119119
"parent_id": null
120120
},
@@ -127,15 +127,15 @@
127127
},
128128
"39de15b4-0359-8002-bed8-f03d0d4763b1": {
129129
"file": "blog/2026-07-14-08-모아보기-서비스-구현기-1건.md",
130-
"last_edited": "2026-07-20T07:38:00.000Z",
131-
"content_hash": "54f5755e9ee275ac0fe779bf83080c5c315f9196c73e6d6a5e940a21d18f6767",
130+
"last_edited": "2026-07-21T05:42:00.000Z",
131+
"content_hash": "b2df166a77444fe850633aed5cbe1d15cc79e9ef886936297096a2b66c104fcf",
132132
"order": 19,
133133
"parent_id": null
134134
},
135135
"39de15b4-0359-80a0-9905-d27d7561bb8d": {
136136
"file": "blog/2026-07-14-12-오픈소스-생태계-기여-실적-보고-1건.md",
137-
"last_edited": "2026-07-20T06:35:00.000Z",
138-
"content_hash": "15e0beaf3c7d82c24784febf269c4281eb9f6c04bf8b59838077e9dbe8a15e14",
137+
"last_edited": "2026-07-21T05:40:00.000Z",
138+
"content_hash": "eda42b455748cc1ec89e04afe75652dc7cef8918a8366c0832170ea441e04c46",
139139
"order": 20,
140140
"parent_id": null
141141
}

blog/2026-07-13-07-langgraph-기반-방송-워크플로우-설계.md

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ authors: [sbin]
66
description: "자연어 질의로 방송 클립 구간을 찾는 LangGraph(agent-search) 과정을 구체적으로 명시한 글"
77
tags: [workflow, Langgraph]
88
last_update:
9-
date: 2026-07-20
9+
date: 2026-07-21
1010
---
1111

12-
#### 들어가며
12+
### 들어가며
1313

1414
---
1515

@@ -312,8 +312,6 @@ BUDGET_TOLERANCE = 1.15 # target_duration_sec 초과 허용 배율
312312
313313
노드별 중간 결과는 `output/<req_id>/<node>.json` 으로 덤프된다.
314314
315-
---
316-
317315
#### 마무리
318316
319317
---

blog/2026-07-14-08-모아보기-서비스-구현기-1건.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ title: "08_모아보기 서비스 구현기 1건"
33
date: 2026-07-14T12:08:00
44
slug: 19
55
last_update:
6-
date: 2026-07-20
6+
date: 2026-07-21
77
---
88

99
### 들어가며
@@ -15,6 +15,10 @@ last_update:
1515

1616
<!--truncate-->
1717

18+
`service=compilation`  + `preset=감성_몽타주`  가 **텍스트로**  LLM에 전달
19+
20+
21+
1822
### 모아보기
1923

2024
:::note

blog/2026-07-14-08-숏폼-자동-생성-파이프라인-해설-1.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
title: "08_숏폼 자동 생성 파이프라인 해설_1"
33
date: 2026-07-14T12:08:00
44
slug: 17
5+
authors: [sbin]
56
tags: [pipeline, shortform]
67
last_update:
7-
date: 2026-07-20
8+
date: 2026-07-21
89
---
910

1011
### 들어가며
@@ -19,7 +20,7 @@ last_update:
1920

2021
![image](/img/blog/08-숏폼-자동-생성-파이프라인-해설-1/img-00.png)
2122

22-
제공 서비스
23+
> 제공 서비스
2324
2425
- 예고편·티저 자동 생성
2526
- 서사 구조 자동 설계

blog/2026-07-14-09-db-스키마-공개.md

Lines changed: 182 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,200 @@
22
title: "09_DB 스키마 공개"
33
date: 2026-07-14T12:09:00
44
slug: 12
5+
authors: [sbin]
56
last_update:
6-
date: 2026-07-20
7+
date: 2026-07-21
78
---
89

910
### 들어가며
1011

1112
---
1213

13-
테이블 어떻게 구성되었나 dbdiagram 여러개로 나누어서 설명
14+
SceneMaker가 방송 영상을 분석해 저장하는 데이터 구조를 공개한다.
1415

1516
<!--truncate-->
1617

18+
-github DB 스키마 링크 포함 필수-
19+
20+
21+
> 저장 형식은 정형 데이터, 비정형 데이터가 있다 . 프로젝트에서 사용한 DB는 아래와 같다.
22+
23+
| | MariaDB (관계형) | Milvus (VectorDB) |
24+
| --- | --- | --- |
25+
| 담는 것 | 정형 데이터. AI 결과를 **읽히는 형태** 로 (자막·요약·인물·감정) | 비정형 데이터. 텍스트의 **임베딩 벡터** + 검색용 메타 |
26+
| 역할 | **원본 진실** (Single Source of Truth) | **검색용 파생본** |
27+
28+
### 전체 데이터 저장 흐름
29+
30+
---
31+
32+
데이터 저장소는 Mysql 과 Milvus 를 사용하고 있으며 아래의 흐름으로 데이터가 저장된다.
33+
34+
![image](/img/blog/09-db-스키마-공개/img-00.png)
35+
36+
관계형 테이블은 `t_video` 를 중심으로 `v_id` 로 연결된다.
37+
38+
```text
39+
t_video ─┬─ t_dialogue / t_dialogue_refine (대사)
40+
├─ t_segment / t_segment_refine (6초 화면분석)
41+
├─ t_chapter (씬/서브)
42+
├─ t_scene (사건 단위 장면)
43+
├─ t_category (분류, 자기참조 계층)
44+
└─ t_code (상태 코드)
45+
```
46+
47+
48+
각 데이터베이스들의 구성을 확인해보자.
49+
50+
51+
### 1. MariaDB 테이블
52+
53+
---
54+
55+
![image](/img/blog/09-db-스키마-공개/img-01.png)
56+
57+
#### t_video — 영상 (중심 테이블)
58+
59+
영상 한 편의 메타와 최종 요약을 담는다.
60+
61+
| 컬럼 | 타입 | 설명 |
62+
| --- | --- | --- |
63+
| `v_id` | mediumint | **PK** , 영상 ID |
64+
| `p_v_id` | mediumint | 시리즈 연결(예: 시즌2→시즌1 참조) |
65+
| `cate_id` | smallint | FK → `t_category` |
66+
| `name` | varchar(45) | 영상명 |
67+
| `dir` | varchar(200) | 영상 저장 위치 |
68+
| `summary` / `summary_stt` | text | 전체 줄거리 / STT 단계 요약 |
69+
| `cast` | text | STT가 남긴 등장인물 |
70+
| `status_code` | smallint | FK → `t_code` , 처리 상태 |
71+
| `reg/upd_datetime` | datetime | 입력·변경 시각 |
72+
73+
#### t_category — 카테고리 (자기참조 계층)
74+
75+
`p_cate_id` 로 상위 카테고리를 가리켜 "스포츠 → 야구" 같은 계층을 만듭니다.
76+
77+
| 컬럼 | 설명 |
78+
| --- | --- |
79+
| `cate_id` (PK) / `cate_name` | 카테고리 ID / 이름 |
80+
| `p_cate_id` | 상위 카테고리 |
81+
82+
#### t_dialogue — 대사 (자막)
83+
84+
STT 결과. `(v_id, idx)` 가 PK인 시간순 대사입니다.
85+
86+
| 컬럼 | 타입 | 설명 |
87+
| --- | --- | --- |
88+
| `v_id, idx` | | **PK** , 영상·대사순서 |
89+
| `start_time / end_time` | time(1) | 발화 구간 |
90+
| `speaker` / `speaker_name` | char(4) / varchar | 발화자 라벨 / 교정된 실명 |
91+
| `lang` | char | 발화 언어 |
92+
| `dialogue` | varchar(500) | 대사 본문 |
93+
94+
> `t_dialogue_refine` 은 인물명 보정을 거친 2차본으로, 스키마는 거의 동일합니다.
95+
96+
#### t_segment — 6초 화면분석 (검색 원자)
97+
98+
영상을 6초 단위로 자른 화면 분석 결과. 검색의 최소 단위입니다.
99+
100+
| 컬럼 | 타입 | 설명 |
101+
| --- | --- | --- |
102+
| `v_id, seg_id` | | **PK** |
103+
| `start_time / end_time` | time | 6초 구간 |
104+
| `summary` | varchar(1024) | 화면 내용 요약 |
105+
| `adv` | tinyint | 광고 포함 여부 |
106+
| `meta` | JSON | 카테고리별 구조 속성(스포츠=스코어/이닝…) |
107+
| `status_code / status_reason` | | 처리 상태 |
108+
109+
> `t_segment_refine` 은 보정본으로 `cast · ocr · sound · action` (JSON) 필드가 추가됨. (agent-vision 산출물)
110+
111+
#### t_chapter — 씬 / 서브 (계층 요약)
112+
113+
`level` 로 씬(2)과 서브·막(1)을 구분하고, `parent_chap_id` 로 씬→서브를 연결합니다.
114+
115+
| 컬럼 | 설명 |
116+
| --- | --- |
117+
| `v_id, chap_id` (PK) | |
118+
| `level` | 1=서브(막) / 2=씬 |
119+
| `parent_chap_id` | 씬이 속한 서브 |
120+
| `start/end_time` , `start/end_seg` | 시간·세그먼트 범위 |
121+
| `title` / `summary` | 라벨 / 줄거리(임베딩 대상) |
122+
| `cast` / `keywords` / `emotion` | 등장인물 / 키워드 / 감정 |
123+
| `meta` | 확장 JSON |
124+
125+
#### t_scene — 사건 단위 장면
126+
127+
장르별 사건 단위(스포츠=홈런/삼진 등). 검색 필터용 구조 속성을 JSON으로 가집니다.
128+
129+
| 컬럼 | 설명 |
130+
| --- | --- |
131+
| `v_id, scene_id` (PK) | |
132+
| `scene_type` / `description` | 사건 유형 / 서술(임베딩 대상) |
133+
| `is_replay` / `is_ad` | 리플레이·광고 배제 플래그 |
134+
| `attributes` | JSON (스포츠=투수/타자/이닝/스코어…) |
135+
136+
> 이 밖에 `t_play` (야구 특화, `t_scene` 으로 대체됨)·`t_segment_2` (실험용) 레거시 테이블이 있다.
137+
138+
---
139+
140+
### 2. Milvus 컬렉션 — sm_1024
141+
142+
> 관계형 데이터 중 검색 대상(자막·화면·씬·서브)을 임베딩해 담는 벡터 컬렉션
143+
의미 기반 검색이기에, 비정형 데이터를 사용하였다.
144+
145+
**한 행 = 벡터 + 검색용 메타 복사본** .
146+
147+
| 필드 | 타입 | 설명 |
148+
| --- | --- | --- |
149+
| `pk` | VARCHAR(64) | **PK** , `"v_id:ref_type:ref_id"` |
150+
| `vector` | FLOAT_VECTOR(1024) | 임베딩 벡터 (유일한 벡터 값) |
151+
| `v_id` | INT32 | 영상 ID (→ RDB) |
152+
| `ref_type` | VARCHAR(16) | segment / scene / chapter / dialogue |
153+
| `ref_id` | INT16 | RDB의 seg_id / chap_id / idx |
154+
| `p_ref_id` | INT16 | 소속 씬(부모 맥락) |
155+
| `start/end_sec` , `start/end_time` | INT16 / VARCHAR | 시간 범위 |
156+
| `cast` | VARCHAR(500) | 등장인물 |
157+
| `text` | VARCHAR(2048) | 임베딩 원문 |
158+
| `dialogue / segment / scene` | JSON | 원본 스냅샷 |
159+
160+
- **인덱스** : `vector` → HNSW / **유사도** : COSINE
161+
- **동적 필드** (`enable_dynamic_field=True` ): `cate_id, emotion, highlight, events, is_ad`
162+
163+
164+
---
165+
166+
### 3. 두 저장소의 연결
167+
168+
Milvus의 각 벡터는 `pk = v_id : ref_type : ref_id` 로 관계형 원본 행과 1:1로 이어집니다.
169+
170+
```text
171+
Milvus "42:segment:120" ←→ RDB t_segment (v_id=42, seg_id=120)
172+
```
173+
174+
`ref_type` 이 어느 테이블인지를, `ref_id` 가 그 테이블의 PK 일부(`seg_id` /`chap_id` /`idx` )를 가리킵니다.
175+
176+
### 4. 저장 순서
177+
178+
데이터는 파이프라인을 따라 아래 순서로 쌓입니다. (작은 원자 → 파생 → 벡터 색인)
179+
180+
| 순서 | 저장 | 담당 |
181+
| --- | --- | --- |
182+
| 1 | `t_video` (껍데기) | 등록 |
183+
| 2 | `t_dialogue` · `t_segment` | agent-stt · agent-vision |
184+
| 3 | `t_chapter` · `t_scene` | agent-scenario |
185+
| 4 | `t_video.summary` | agent-scenario |
186+
| 5 | **Milvus** `sm_1024` (벡터 색인) | agent-scenario |
187+
188+
관계형 저장이 모두 끝난 뒤, 마지막에 벡터 색인이 이뤄집니다.
189+
190+
191+
17192
### 마무리
18193

19194
---
20195

196+
전체 DDL과 컬렉션 정의는 저장소에 공개돼 있습니다. SceneMaker는 Apache 2.0으로 배포됩니다.
197+
198+
199+
*본 글은 과학기술정보통신부·정보통신산업진흥원 「2026년 오픈소스 AI·SW 개발·활용 지원사업」의 지원으로 수행된 연구 결과입니다.*
200+
21201

blog/2026-07-14-10-sbsi-실증-테스트-사례-공유-1건.md

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,6 @@ date: 2026-07-14T12:10:00
44
slug: 13
55
tags: [sbs]
66
last_update:
7-
date: 2026-07-20
7+
date: 2026-07-21
88
---
99

10-
### 들어가며
11-
12-
---
13-
14-
sbs 측에서 새로운 무언가가 올 경우 확인 및 테스트
15-
16-
<!--truncate-->
17-
18-
### 마무리
19-
20-
---
21-
22-

0 commit comments

Comments
 (0)