Dongjin1203 commited on
Commit
17917bf
·
1 Parent(s): c5be470

자동 트리밍 추가

Browse files
Files changed (1) hide show
  1. src/generator/generator_gguf.py +35 -28
src/generator/generator_gguf.py CHANGED
@@ -143,38 +143,29 @@ class GGUFGenerator:
143
  system_prompt: Optional[str] = None
144
  ) -> str:
145
  """
146
- Llama-3 Chat 템플릿으로 프롬프트 포맷팅
147
 
148
- Args:
149
- question: 사용자 질문
150
- context: 선택적 컨텍스트 (RAG 검색 결과)
151
- system_prompt: 선택적 시스템 프롬프트
152
-
153
- Returns:
154
- 포맷된 프롬프트 문자열
155
  """
156
  # 시스템 프롬프트 설정
157
  if system_prompt is None:
158
  system_prompt = self.system_prompt
159
- logger.warning("⚠️ system_prompt가 None! 기본 프롬프트 사용")
160
- else:
161
- # 동적 프롬프트 미리보기 (처음 150자만)
162
- logger.info(f"✅ 동적 프롬프트 적용:\n{system_prompt[:150]}...")
163
-
164
  # 컨텍스트 포함 여부
165
  if context is not None:
166
  user_message = f"참고 문서:\n{context}\n\n질문: {question}"
167
  else:
168
  user_message = question
169
 
170
- # Llama-3 Chat 템플릿 적용
171
- formatted_prompt = (
172
- f"<|start_header_id|>system<|end_header_id|>\n\n"
173
- f"{system_prompt}<|eot_id|>"
174
- f"<|start_header_id|>user<|end_header_id|>\n\n"
175
- f"{user_message}<|eot_id|>"
176
- f"<|start_header_id|>assistant<|end_header_id|>\n\n"
177
- )
 
178
 
179
  return formatted_prompt
180
 
@@ -225,7 +216,7 @@ class GGUFGenerator:
225
  temperature=temperature,
226
  top_p=top_p,
227
  echo=False, # 프롬프트 반복 안 함
228
- stop=["<|eot_id|>", "<|end_of_text|>"], # 종료 토큰
229
  )
230
 
231
  elapsed = time.time() - start_time
@@ -397,13 +388,29 @@ class GGUFRAGPipeline:
397
  return self._format_context(docs)
398
 
399
  def _format_context(self, retrieved_docs: list) -> str:
400
- """검색된 문서를 컨텍스트로 변환"""
 
 
 
 
401
  if not retrieved_docs:
402
  return "관련 문서를 찾을 수 없습니다."
403
 
404
  context_parts = []
 
 
 
405
  for i, doc in enumerate(retrieved_docs, 1):
406
- context_parts.append(f"[문서 {i}]\n{doc['content']}\n")
 
 
 
 
 
 
 
 
 
407
 
408
  return "\n".join(context_parts)
409
 
@@ -493,8 +500,8 @@ class GGUFRAGPipeline:
493
  used_retrieval = False
494
  self._last_retrieved_docs = []
495
 
496
- # 동적 프롬프트 선택
497
- system_prompt = PromptManager.get_prompt(query_type)
498
  logger.info(f"⏭️ RAG 스킵: {query_type}")
499
 
500
  elif query_type == 'document':
@@ -502,8 +509,8 @@ class GGUFRAGPipeline:
502
  context = self._retrieve_and_format(query)
503
  used_retrieval = True
504
 
505
- # 동적 프롬프트 (context 포함)
506
- system_prompt = PromptManager.get_prompt('document')
507
  logger.info(f"🔍 RAG 수행: {len(self._last_retrieved_docs)}개 문서")
508
 
509
  # 3. 답변 생성 (system_prompt 전달)
 
143
  system_prompt: Optional[str] = None
144
  ) -> str:
145
  """
146
+ GGUF 모델용 간단한 프롬프트 포맷팅
147
 
148
+ Llama-3 특수 토큰 대신 순수 텍스트 기반 템플릿 사용
 
 
 
 
 
 
149
  """
150
  # 시스템 프롬프트 설정
151
  if system_prompt is None:
152
  system_prompt = self.system_prompt
153
+
 
 
 
 
154
  # 컨텍스트 포함 여부
155
  if context is not None:
156
  user_message = f"참고 문서:\n{context}\n\n질문: {question}"
157
  else:
158
  user_message = question
159
 
160
+ # 간단한 한국어 템플릿 (특수 토큰 없음)
161
+ formatted_prompt = f"""### 시스템
162
+ {system_prompt}
163
+
164
+ ### 사용자
165
+ {user_message}
166
+
167
+ ### 답변
168
+ """
169
 
170
  return formatted_prompt
171
 
 
216
  temperature=temperature,
217
  top_p=top_p,
218
  echo=False, # 프롬프트 반복 안 함
219
+ stop=["###", "\n\n###", "### 사용자", "\n사용자:", "</s>"], # 한국어 구분자
220
  )
221
 
222
  elapsed = time.time() - start_time
 
388
  return self._format_context(docs)
389
 
390
  def _format_context(self, retrieved_docs: list) -> str:
391
+ """
392
+ 검색된 문서를 컨텍스트로 변환
393
+
394
+ 컨텍스트가 너무 길면 자동으로 줄임 (토큰 제한 대응)
395
+ """
396
  if not retrieved_docs:
397
  return "관련 문서를 찾을 수 없습니다."
398
 
399
  context_parts = []
400
+ max_context_chars = 8000 # 대략 2000 토큰 정도 (여유 있게)
401
+
402
+ current_length = 0
403
  for i, doc in enumerate(retrieved_docs, 1):
404
+ doc_text = f"[문서 {i}]\n{doc['content']}\n"
405
+ doc_length = len(doc_text)
406
+
407
+ # 컨텍스트 길이 체크
408
+ if current_length + doc_length > max_context_chars:
409
+ logger.warning(f"⚠️ 컨텍스트 길이 제한: {i-1}개 문서만 사용 (최대 {max_context_chars}자)")
410
+ break
411
+
412
+ context_parts.append(doc_text)
413
+ current_length += doc_length
414
 
415
  return "\n".join(context_parts)
416
 
 
500
  used_retrieval = False
501
  self._last_retrieved_docs = []
502
 
503
+ # 동적 프롬프트 선택 (GGUF용)
504
+ system_prompt = PromptManager.get_prompt(query_type, model_type="gguf")
505
  logger.info(f"⏭️ RAG 스킵: {query_type}")
506
 
507
  elif query_type == 'document':
 
509
  context = self._retrieve_and_format(query)
510
  used_retrieval = True
511
 
512
+ # 동적 프롬프트 (GGUF용, context 포함)
513
+ system_prompt = PromptManager.get_prompt('document', model_type="gguf")
514
  logger.info(f"🔍 RAG 수행: {len(self._last_retrieved_docs)}개 문서")
515
 
516
  # 3. 답변 생성 (system_prompt 전달)