m97j commited on
Commit
33967f0
·
1 Parent(s): 0fc77f3

Rename readme.md to README.md

Browse files
Files changed (2) hide show
  1. README.md +254 -7
  2. readme.md +0 -257
README.md CHANGED
@@ -1,10 +1,257 @@
1
  ---
2
- title: PersonaChatEngine
3
- emoji: 🏢
4
- colorFrom: red
5
- colorTo: gray
6
- sdk: docker
7
- pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: NPC Main Model Inference Server
3
+ emoji: 🤖
4
+ colorFrom: blue
5
+ colorTo: pink
6
+ sdk: gradio
7
+ sdk_version: 4.0.0
8
+ python_version: 3.10
9
+ app_file: app.py
10
  ---
11
 
12
+ # NPC 메인 모델 추론 서버 (hf-serve)
13
+
14
+ 이 Space는 **NPC 대화 메인 모델**의 추론 API와 간단한 Gradio UI를 제공합니다.
15
+ Hugging Face Hub에 업로드된
16
+ [Base model](https://huggingface.co/Qwen/Qwen2.5-3B-Instruct)과
17
+ [LoRA adapter model](https://huggingface.co/m97j/npc_LoRA-fps)을 로드하여,
18
+ 플레이어 발화와 게임 상태를 기반으로 NPC의 응답, 감정 변화량(delta),
19
+ 플래그 확률/임계값을 예측합니다.
20
+
21
+ ---
22
+
23
+ ## 🚀 주요 기능
24
+ - **API 엔드포인트** `/predict_main`
25
+ - JSON payload로 prompt를 받아 모델 추론 결과 반환
26
+ - **웹 UI** `/ui`
27
+ - NPC ID, 위치, 플레이어 발화를 입력해 실시간 응답 확인
28
+ - **커스텀 헤드 예측**
29
+ - `delta_head`: trust / relationship 변화량
30
+ - `flag_head`: 각 flag의 확률
31
+ - `flag_threshold_head`: 각 flag의 임계값
32
+ - **모델 실시간 업데이트**
33
+ - Colab 학습 후 `latest` 브랜치 업로드 → `/ping_reload` 호출 시 즉시 재로드
34
+
35
+ ---
36
+
37
+ ## 📂 디렉토리 구조
38
+ ```
39
+ hf-serve/
40
+ ├─ app.py # Gradio UI + API 라우팅
41
+ ├─ inference.py # 모델 추론 로직
42
+ ├─ model_loader.py # 모델/토크나이저 로드
43
+ ├─ utils_prompt.py # prompt 생성 함수
44
+ ├─ flags.json # flag index → name 매핑
45
+ ├─ requirements.txt # 의존성 패키지
46
+ └─ README.md # (현재 문서)
47
+ ```
48
+
49
+ ---
50
+
51
+ ## ⚙️ 추론 로직 개요
52
+
53
+ 이 서버의 핵심은 `run_inference()` 함수로,
54
+ NPC 메인 모델에 프롬프트를 입력하고 응답·상태 변화를 예측하는 전 과정을 담당합니다.
55
+
56
+ ### 처리 흐름
57
+ 1. **프롬프트 토크나이즈**
58
+ - 입력된 prompt를 토크나이저로 변환하여 텐서 형태로 준비
59
+ - 길이 제한(`MAX_LENGTH`)과 디바이스(`DEVICE`) 설정 적용
60
+
61
+ 2. **언어모델 응답 생성**
62
+ - 사전 정의된 추론 파라미터(`GEN_PARAMS`)로 `model.generate()` 실행
63
+ → NPC의 대사 텍스트 생성
64
+ - 생성된 토큰을 디코딩하여 최종 문자열로 변환
65
+
66
+ 3. **히든 상태 추출**
67
+ - `output_hidden_states=True`로 모델 실행
68
+ - 마지막 레이어의 hidden state를 가져옴
69
+
70
+ 4. **<STATE> 토큰 위치 풀링**
71
+ - `<STATE>` 토큰이 있는 위치의 hidden state를 평균(pooling)
72
+ → NPC 상태를 대표하는 벡터로 사용
73
+ - 없을 경우 마지막 토큰의 hidden state 사용
74
+
75
+ 5. **커스텀 헤드 예측**
76
+ - `delta_head`: trust / relationship 변화량 예측
77
+ - `flag_head`: 각 flag의 발생 확률 예측
78
+ - `flag_threshold_head`: 각 flag의 임계값 예측
79
+
80
+ 6. **index → name 매핑**
81
+ - `flags.json`의 순서(`flags_order`)를 기반으로
82
+ 예측 벡터를 `{flag_name: 값}` 형태의 딕셔너리로 변환
83
+
84
+ ### 반환 형식
85
+ ```json
86
+ {
87
+ "npc_output_text": "<NPC 응답>",
88
+ "deltas": { "trust": 0.xx, "relationship": 0.xx },
89
+ "flags_prob": { "flag_name": 확률, ... },
90
+ "flags_thr": { "flag_name": 임계값, ... }
91
+ }
92
+ ```
93
+
94
+ ---
95
+
96
+ ## 📜 Prompt 포맷
97
+ 모델은 학습 시 아래와 같은 구조의 prompt를 사용합니다.
98
+
99
+ ```
100
+ <SYS>
101
+ NPC_ID={npc_id}
102
+ NPC_LOCATION={npc_location}
103
+ TAGS:
104
+ quest_stage={quest_stage}
105
+ relationship={relationship}
106
+ trust={trust}
107
+ npc_mood={npc_mood}
108
+ player_reputation={player_reputation}
109
+ style={style}
110
+ </SYS>
111
+ <RAG>
112
+ LORE: ...
113
+ DESCRIPTION: ...
114
+ </RAG>
115
+ <PLAYER_STATE>
116
+ ...
117
+ </PLAYER_STATE>
118
+ <CTX>
119
+ ...
120
+ </CTX>
121
+ <PLAYER>...
122
+ <STATE>
123
+ <NPC>
124
+ ```
125
+ ---
126
+
127
+ ## 💡 **일반적인 LLM 추론과의 차이점**
128
+ 이 서버는 단순히 텍스트를 생성하는 것에 그치지 않고,
129
+ `<STATE>` 토큰 기반 상태 벡터를 추출하여 커스텀 헤드에서 **감정 변화량(delta)**과
130
+ **플래그 확률/임계값**을 동시에 예측합니다.
131
+ 이를 통해 대사 생성과 게임 상태 업데이트를 **한 번의 추론으로 처리**할 수 있습니다.
132
+
133
+ ---
134
+
135
+ ## 🎯 추론 파라미터
136
+
137
+ | 파라미터 | 의미 | 영향 |
138
+ |----------|------|------|
139
+ | `temperature` | 샘플링 온도 (0.0~1.0+) | 낮을수록 결정적(Deterministic), 높을수록 다양성 증가 |
140
+ | `do_sample` | 샘플링 여부 | `False`면 Greedy/Beam Search, `True`면 확률 기반 샘플링 |
141
+ | `max_new_tokens` | 새로 생성할 토큰 수 제한 | 응답 길이 제한 |
142
+ | `top_p` | nucleus sampling 확률 누적 컷오프 | 다양성 제어 (0.9면 상위 90% 확률만 사용) |
143
+ | `top_k` | 확률 상위 k개 토큰만 샘플링 | 다양성 제어 (50이면 상위 50개 후보만) |
144
+ | `repetition_penalty` | 반복 억제 계수 | 1.0보다 크면 반복 줄임 |
145
+ | `stop` / `eos_token_id` | ���성 중단 토큰 | 특정 문자열/토큰에서 멈춤 |
146
+ | `presence_penalty` / `frequency_penalty` | 특정 토큰 등장 빈도 제어 | OpenAI 계열에서 주로 사용 |
147
+ | `seed` | 난수 시드 | 재현성 확보 |
148
+
149
+ 위 파라미터들은 **학습 시에는 사용되지 않고**,
150
+ 모델이 응답을 생성하는 **추론 시점**에만 적용됩니다.
151
+
152
+
153
+
154
+ ## 💡 사용 예시
155
+
156
+ - **결정적 분류/판정용**
157
+ (예: `_llm_trigger_check` YES/NO)
158
+ ```python
159
+ temperature = 0.0
160
+ do_sample = False
161
+ max_new_tokens = 2
162
+ ```
163
+ → 항상 같은 입력에 같은 출력, 짧고 확정적인 답변 [ai_server/의 local fallback model에 특정 조건을 지시할 때 사용]
164
+
165
+ - **자연스러운 대화/창작용**
166
+ (예: main/fallback 대사 생성)
167
+ ```python
168
+ temperature = 0.7
169
+ top_p = 0.9
170
+ do_sample = True
171
+ repetition_penalty = 1.05
172
+ max_new_tokens = 200
173
+ ```
174
+ → 다양성과 자연스러움 확보 [main model 추론시에 사용]
175
+
176
+ hf-serve에서는 자연스러운 대화/창작용의 파라미터 예를 그대로 사용했습니다.
177
+
178
+ ---
179
+
180
+ ## 🌐 API & UI 차이
181
+
182
+ | 경로 | 입력 형식 | 내부 처리 |
183
+ |------|-----------|-----------|
184
+ | `/predict_main` | 완성된 prompt 문자열 | 그대로 추론 |
185
+ | `/ui` | NPC ID, Location, Utterance | `build_webtest_prompt()`로 prompt 생성 후 추론 |
186
+
187
+ ---
188
+
189
+ ## 📌 API 사용 예시
190
+
191
+ ### 요청
192
+ ```json
193
+ POST /api/predict_main
194
+ {
195
+ "session_id": "abc123",
196
+ "npc_id": "mother_abandoned_factory",
197
+ "prompt": "<SYS>...<NPC>",
198
+ "max_tokens": 200
199
+ }
200
+ ```
201
+
202
+ ### 응답
203
+ ```json
204
+ {
205
+ "session_id": "abc123",
206
+ "npc_id": "mother_abandoned_factory",
207
+ "npc_response": "그건 정말 놀라운 이야기군요.",
208
+ "deltas": { "trust": 0.42, "relationship": -0.13 },
209
+ "flags": { "give_item": 0.87, "end_npc_main_story": 0.02 },
210
+ "thresholds": { "give_item": 0.65, "end_npc_main_story": 0.5 }
211
+ }
212
+ ```
213
+
214
+ ---
215
+
216
+ ## 🔄 모델 업데이트 흐름
217
+ 1. Colab에서 학습 완료
218
+ 2. Hugging Face Hub `latest` 브랜치에 업로드
219
+ 3. Colab에서 `/api/ping_reload` 호출
220
+ 4. Space가 최신 모델 재다운로드 & 로드
221
+
222
+ ---
223
+
224
+ ## 🛠 실행 방법
225
+
226
+ ### 로컬 실행
227
+ ```bash
228
+ git clone https://huggingface.co/spaces/m97j/PersonaChatEngine
229
+ cd PersonaChatEngine
230
+ pip install -r requirements.txt
231
+ python app.py
232
+ ```
233
+
234
+ ### Hugging Face Space에서 실행
235
+ - 웹 UI: `https://m97j-PersonaChatEngine.hf.space/ui`
236
+ - API: `POST https://m97j-PersonaChatEngine.hf.space/api/predict_main`
237
+
238
+ ---
239
+
240
+ ## 🛠 실행 환경
241
+ - Python 3.10
242
+ - FastAPI, Gradio, Transformers, PEFT, Torch
243
+ - GPU 지원 시 추론 속도 향상
244
+ ---
245
+
246
+ ## 💡 비용 최적화 팁
247
+ - Space Settings → Hardware에서 Free CPU로 전환 시 과금 없음
248
+ - GPU 사용 시 테스트 후 Stop 버튼으로 Space 중지
249
+ - 48시간 요청 없으면 자동 sleep
250
+
251
+ ---
252
+
253
+ ## 🔗 관련 리포지토리
254
+ - **전체 프로젝트 개요 & AI 서버 코드**: [GitHub - persona-chat-engine](https://github.com/m97j/persona-chat-engine)
255
+ - **모델 어댑터 파일(HF Hub)**: [Hugging Face Model Repo](https://huggingface.co/m97j/npc_LoRA-fps)
256
+
257
+ ---
readme.md DELETED
@@ -1,257 +0,0 @@
1
- ---
2
- title: NPC Main Model Inference Server
3
- emoji: 🤖
4
- colorFrom: blue
5
- colorTo: pink
6
- sdk: gradio
7
- sdk_version: 4.0.0
8
- python_version: 3.10
9
- app_file: app.py
10
- ---
11
-
12
- # NPC 메인 모델 추론 서버 (hf-serve)
13
-
14
- 이 Space는 **NPC 대화 메인 모델**의 추론 API와 간단한 Gradio UI를 제공합니다.
15
- Hugging Face Hub에 업로드된
16
- [Base model](https://huggingface.co/Qwen/Qwen2.5-3B-Instruct)과
17
- [LoRA adapter model](https://huggingface.co/m97j/npc_LoRA-fps)을 로드하여,
18
- 플레이어 발화와 게임 상태를 기반으로 NPC의 응답, 감정 변화량(delta),
19
- 플래그 확률/임계값을 예측합니다.
20
-
21
- ---
22
-
23
- ## 🚀 주요 기능
24
- - **API 엔드포인트** `/predict_main`
25
- - JSON payload로 prompt를 받아 모델 추론 결과 반환
26
- - **웹 UI** `/ui`
27
- - NPC ID, 위치, 플레이어 발화를 입력해 실시간 응답 확인
28
- - **커스텀 헤드 예측**
29
- - `delta_head`: trust / relationship 변화량
30
- - `flag_head`: 각 flag의 확률
31
- - `flag_threshold_head`: 각 flag의 임계값
32
- - **모델 실시간 업데이트**
33
- - Colab 학습 후 `latest` 브랜치 업로드 → `/ping_reload` 호출 시 즉시 재로드
34
-
35
- ---
36
-
37
- ## 📂 디렉토리 구조
38
- ```
39
- hf-serve/
40
- ├─ app.py # Gradio UI + API 라우팅
41
- ├─ inference.py # 모델 추론 로직
42
- ├─ model_loader.py # 모델/토크나이저 로드
43
- ├─ utils_prompt.py # prompt 생성 함수
44
- ├─ flags.json # flag index → name 매핑
45
- ├─ requirements.txt # 의존성 패키지
46
- └─ README.md # (현재 문서)
47
- ```
48
-
49
- ---
50
-
51
- ## ⚙️ 추론 로직 개요
52
-
53
- 이 서버의 핵심은 `run_inference()` 함수로,
54
- NPC 메인 모델에 프롬프트를 입력하고 응답·상태 변화를 예측하는 전 과정을 담당합니다.
55
-
56
- ### 처리 흐름
57
- 1. **프롬프트 토크나이즈**
58
- - 입력된 prompt를 토크나이저로 변환하여 텐서 형태로 준비
59
- - 길이 제한(`MAX_LENGTH`)과 디바이스(`DEVICE`) 설정 적용
60
-
61
- 2. **언어모델 응답 생성**
62
- - 사전 정의된 추론 파라미터(`GEN_PARAMS`)로 `model.generate()` 실행
63
- → NPC의 대사 텍스트 생성
64
- - 생성된 토큰을 디코딩하여 최종 문자열로 변환
65
-
66
- 3. **히든 상태 추출**
67
- - `output_hidden_states=True`로 모델 실행
68
- - 마지막 레이어의 hidden state를 가져옴
69
-
70
- 4. **<STATE> 토큰 위치 풀링**
71
- - `<STATE>` 토큰이 있는 위치의 hidden state를 평균(pooling)
72
- → NPC 상태를 대표하는 벡터로 사용
73
- - 없을 경우 마지막 토큰의 hidden state 사용
74
-
75
- 5. **커스텀 헤드 예측**
76
- - `delta_head`: trust / relationship 변화량 예측
77
- - `flag_head`: 각 flag의 발생 확률 예측
78
- - `flag_threshold_head`: 각 flag의 임계값 예측
79
-
80
- 6. **index → name 매핑**
81
- - `flags.json`의 순서(`flags_order`)를 기반으로
82
- 예측 벡터를 `{flag_name: 값}` 형태의 딕셔너리로 변환
83
-
84
- ### 반환 형식
85
- ```json
86
- {
87
- "npc_output_text": "<NPC 응답>",
88
- "deltas": { "trust": 0.xx, "relationship": 0.xx },
89
- "flags_prob": { "flag_name": 확률, ... },
90
- "flags_thr": { "flag_name": 임계값, ... }
91
- }
92
- ```
93
-
94
- ---
95
-
96
- ## 📜 Prompt 포맷
97
- 모델은 학습 시 아래와 같은 구조의 prompt를 사용합니다.
98
-
99
- ```
100
- <SYS>
101
- NPC_ID={npc_id}
102
- NPC_LOCATION={npc_location}
103
- TAGS:
104
- quest_stage={quest_stage}
105
- relationship={relationship}
106
- trust={trust}
107
- npc_mood={npc_mood}
108
- player_reputation={player_reputation}
109
- style={style}
110
- </SYS>
111
- <RAG>
112
- LORE: ...
113
- DESCRIPTION: ...
114
- </RAG>
115
- <PLAYER_STATE>
116
- ...
117
- </PLAYER_STATE>
118
- <CTX>
119
- ...
120
- </CTX>
121
- <PLAYER>...
122
- <STATE>
123
- <NPC>
124
- ```
125
- ---
126
-
127
- ## 💡 **일반적인 LLM 추론과의 차이점**
128
- 이 서버는 단순히 텍스트를 생성하는 것에 그치지 않고,
129
- `<STATE>` 토큰 기반 상태 벡터를 추출하여 커스텀 헤드에서 **감정 변화량(delta)**과
130
- **플래그 확률/임계값**을 동시에 예측합니다.
131
- 이를 통해 대사 생성과 게임 상태 업데이트를 **한 번의 추론으로 처리**할 수 있습니다.
132
-
133
- ---
134
-
135
- ## 🎯 추론 파라미터
136
-
137
- | 파라미터 | 의미 | 영향 |
138
- |----------|------|------|
139
- | `temperature` | 샘플링 온도 (0.0~1.0+) | 낮을수록 결정적(Deterministic), 높을수록 다양성 증가 |
140
- | `do_sample` | 샘플링 여부 | `False`면 Greedy/Beam Search, `True`면 확률 기반 샘플링 |
141
- | `max_new_tokens` | 새로 생성할 토큰 수 제한 | 응답 길이 제한 |
142
- | `top_p` | nucleus sampling 확률 누적 컷오프 | 다양성 제어 (0.9면 상위 90% 확률만 사용) |
143
- | `top_k` | 확률 상위 k개 토큰만 샘플링 | 다양성 제어 (50이면 상위 50개 후보만) |
144
- | `repetition_penalty` | 반복 억제 계수 | 1.0보다 크면 반복 줄임 |
145
- | `stop` / `eos_token_id` | 생성 중단 토큰 | 특정 문자열/토큰에서 멈춤 |
146
- | `presence_penalty` / `frequency_penalty` | 특정 토큰 등장 빈도 제어 | OpenAI 계열에서 주로 사용 |
147
- | `seed` | 난�� 시드 | 재현성 확보 |
148
-
149
- 위 파라미터들은 **학습 시에는 사용되지 않고**,
150
- 모델이 응답을 생성하는 **추론 시점**에만 적용됩니다.
151
-
152
-
153
-
154
- ## 💡 사용 예시
155
-
156
- - **결정적 분류/판정용**
157
- (예: `_llm_trigger_check` YES/NO)
158
- ```python
159
- temperature = 0.0
160
- do_sample = False
161
- max_new_tokens = 2
162
- ```
163
- → 항상 같은 입력에 같은 출력, 짧고 확정적인 답변 [ai_server/의 local fallback model에 특정 조건을 지시할 때 사용]
164
-
165
- - **자연스러운 대화/창작용**
166
- (예: main/fallback 대사 생성)
167
- ```python
168
- temperature = 0.7
169
- top_p = 0.9
170
- do_sample = True
171
- repetition_penalty = 1.05
172
- max_new_tokens = 200
173
- ```
174
- → 다양성과 자연스러움 확보 [main model 추론시에 사용]
175
-
176
- hf-serve에서는 자연스러운 대화/창작용의 파라미터 예를 그대로 사용했습니다.
177
-
178
- ---
179
-
180
- ## 🌐 API & UI 차이
181
-
182
- | 경로 | 입력 형식 | 내부 처리 |
183
- |------|-----------|-----------|
184
- | `/predict_main` | 완성된 prompt 문자열 | 그대로 추론 |
185
- | `/ui` | NPC ID, Location, Utterance | `build_webtest_prompt()`로 prompt 생성 후 추론 |
186
-
187
- ---
188
-
189
- ## 📌 API 사용 예시
190
-
191
- ### 요청
192
- ```json
193
- POST /api/predict_main
194
- {
195
- "session_id": "abc123",
196
- "npc_id": "mother_abandoned_factory",
197
- "prompt": "<SYS>...<NPC>",
198
- "max_tokens": 200
199
- }
200
- ```
201
-
202
- ### 응답
203
- ```json
204
- {
205
- "session_id": "abc123",
206
- "npc_id": "mother_abandoned_factory",
207
- "npc_response": "그건 정말 놀라운 이야기군요.",
208
- "deltas": { "trust": 0.42, "relationship": -0.13 },
209
- "flags": { "give_item": 0.87, "end_npc_main_story": 0.02 },
210
- "thresholds": { "give_item": 0.65, "end_npc_main_story": 0.5 }
211
- }
212
- ```
213
-
214
- ---
215
-
216
- ## 🔄 모델 업데이트 흐름
217
- 1. Colab에서 학습 완료
218
- 2. Hugging Face Hub `latest` 브랜치에 업로드
219
- 3. Colab에서 `/api/ping_reload` 호출
220
- 4. Space가 최신 모델 재다운로드 & 로드
221
-
222
- ---
223
-
224
- ## 🛠 실행 방법
225
-
226
- ### 로컬 실행
227
- ```bash
228
- git clone https://huggingface.co/spaces/m97j/PersonaChatEngine
229
- cd PersonaChatEngine
230
- pip install -r requirements.txt
231
- python app.py
232
- ```
233
-
234
- ### Hugging Face Space에서 실행
235
- - 웹 UI: `https://m97j-PersonaChatEngine.hf.space/ui`
236
- - API: `POST https://m97j-PersonaChatEngine.hf.space/api/predict_main`
237
-
238
- ---
239
-
240
- ## 🛠 실행 환경
241
- - Python 3.10
242
- - FastAPI, Gradio, Transformers, PEFT, Torch
243
- - GPU 지원 시 추론 속도 향상
244
- ---
245
-
246
- ## 💡 비용 최적화 팁
247
- - Space Settings → Hardware에서 Free CPU로 전환 시 과금 없음
248
- - GPU 사용 시 테스트 후 Stop 버튼으로 Space 중지
249
- - 48시간 요청 없으면 자동 sleep
250
-
251
- ---
252
-
253
- ## 🔗 관련 리포지토리
254
- - **전체 프로젝트 개요 & AI 서버 코드**: [GitHub - persona-chat-engine](https://github.com/m97j/persona-chat-engine)
255
- - **모델 어댑터 파일(HF Hub)**: [Hugging Face Model Repo](https://huggingface.co/m97j/npc_LoRA-fps)
256
-
257
- ---