openfree commited on
Commit
da20c1b
β€’
1 Parent(s): 2af89cf

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +60 -34
app.py CHANGED
@@ -16,21 +16,32 @@ def get_client(model_name):
16
  return InferenceClient(LLM_MODELS[model_name], token=os.getenv("HF_TOKEN"))
17
 
18
  def analyze_file_content(content, file_type):
19
- """파일 λ‚΄μš©μ„ λΆ„μ„ν•˜μ—¬ 1쀄 μš”μ•½μ„ λ°˜ν™˜"""
20
  if file_type == 'parquet':
21
- return f"데이터셋 뢄석: {content.count('|')-1}개 컬럼의 데이터 ν…Œμ΄λΈ”"
 
 
 
 
 
 
22
 
23
- # ν…μŠ€νŠΈ 파일의 경우
24
  lines = content.split('\n')
25
  total_lines = len(lines)
26
  non_empty_lines = len([line for line in lines if line.strip()])
27
 
28
- if 'def ' in content or 'class ' in content:
 
29
  functions = len([line for line in lines if 'def ' in line])
30
  classes = len([line for line in lines if 'class ' in line])
31
- return f"μ½”λ“œ 뢄석: {total_lines}μ€„μ˜ Python μ½”λ“œ ({functions}개 ν•¨μˆ˜, {classes}개 클래슀 포함)"
32
- else:
33
- return f"ν…μŠ€νŠΈ 뢄석: {total_lines}μ€„μ˜ ν…μŠ€νŠΈ λ¬Έμ„œ (유효 λ‚΄μš© {non_empty_lines}쀄)"
 
 
 
 
34
 
35
  def read_uploaded_file(file):
36
  if file is None:
@@ -57,38 +68,49 @@ def format_history(history):
57
  return formatted_history
58
 
59
  def chat(message, history, uploaded_file, model_name, system_message="", max_tokens=4000, temperature=0.7, top_p=0.9):
60
- system_prefix = """λ°˜λ“œμ‹œ ν•œκΈ€λ‘œ 닡변할것. λ„ˆλŠ” 주어진 μ†ŒμŠ€μ½”λ“œλ‚˜ 데이터λ₯Ό 기반으둜 "μ„œλΉ„μŠ€ μ‚¬μš© μ„€λͺ… 및 μ•ˆλ‚΄, Q&Aλ₯Ό ν•˜λŠ” 역할이닀". μ•„μ£Ό μΉœμ ˆν•˜κ³  μžμ„Έν•˜κ²Œ 4000토큰 이상 Markdown ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•˜λΌ. λ„ˆλŠ” μž…λ ₯된 λ‚΄μš©μ„ 기반으둜 μ‚¬μš© μ„€λͺ… 및 질의 응닡을 μ§„ν–‰ν•˜λ©°, μ΄μš©μžμ—κ²Œ 도움을 μ£Όμ–΄μ•Ό ν•œλ‹€."""
 
 
 
 
 
 
 
 
61
 
62
  if uploaded_file:
63
  content, file_type = read_uploaded_file(uploaded_file)
64
  if file_type == "error":
65
- return "", history + [[message, content]]
 
66
 
67
- # 파일 λ‚΄μš© 뢄석 및 μš”μ•½
68
  file_summary = analyze_file_content(content, file_type)
69
 
70
  if file_type == 'parquet':
71
  system_message += f"\n\n파일 λ‚΄μš©:\n```markdown\n{content}\n```"
72
  else:
73
- system_message += f"\n\n파일 λ‚΄μš©:\n```python\n{content}\n```"
74
 
75
  if message == "파일 뢄석을 μ‹œμž‘ν•©λ‹ˆλ‹€.":
76
- message = f"""[파일 μš”μ•½] {file_summary}
77
 
78
- λ‹€μŒ λ‚΄μš©μ„ ν¬ν•¨ν•˜μ—¬ μƒμ„Ένžˆ μ„€λͺ…ν•˜λΌ:
79
- 1. 파일의 μ£Όμš” λͺ©μ κ³Ό κΈ°λŠ₯
80
- 2. μ£Όμš” νŠΉμ§•κ³Ό κ΅¬μ„±μš”μ†Œ
81
- 3. ν™œμš© 방법 및 μ‚¬μš© μ‹œλ‚˜λ¦¬μ˜€
82
- 4. μ£Όμ˜μ‚¬ν•­ 및 μ œν•œμ‚¬ν•­
83
- 5. κΈ°λŒ€νš¨κ³Ό 및 μž₯점"""
 
84
 
85
  messages = [{"role": "system", "content": f"{system_prefix} {system_message}"}]
86
  messages.extend(format_history(history))
87
  messages.append({"role": "user", "content": message})
88
 
89
- response = ""
90
  try:
91
  client = get_client(model_name)
 
 
92
  for msg in client.chat_completion(
93
  messages,
94
  max_tokens=max_tokens,
@@ -98,14 +120,12 @@ def chat(message, history, uploaded_file, model_name, system_message="", max_tok
98
  ):
99
  token = msg.choices[0].delta.get('content', None)
100
  if token:
101
- response += token
102
-
103
- history = history + [[message, response]]
104
- return "", history
105
  except Exception as e:
106
  error_msg = f"μΆ”λ‘  쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}"
107
- history = history + [[message, error_msg]]
108
- return "", history
109
 
110
  css = """
111
  footer {visibility: hidden}
@@ -132,7 +152,7 @@ with gr.Blocks(theme="Yntec/HaleyCH_Theme_Orange", css=css) as demo:
132
  )
133
 
134
  file_upload = gr.File(
135
- label="파일 μ—…λ‘œλ“œ",
136
  file_types=["text", ".parquet"],
137
  type="filepath"
138
  )
@@ -147,25 +167,31 @@ with gr.Blocks(theme="Yntec/HaleyCH_Theme_Orange", css=css) as demo:
147
  msg.submit(
148
  chat,
149
  inputs=[msg, chatbot, file_upload, model_name, system_message, max_tokens, temperature, top_p],
150
- outputs=[msg, chatbot]
 
 
 
 
 
151
  )
152
 
153
  # 파일 μ—…λ‘œλ“œ μ‹œ μžλ™ 뢄석
154
  file_upload.change(
155
  chat,
156
  inputs=[gr.Textbox(value="파일 뢄석을 μ‹œμž‘ν•©λ‹ˆλ‹€."), chatbot, file_upload, model_name, system_message, max_tokens, temperature, top_p],
157
- outputs=[msg, chatbot]
 
158
  )
159
 
160
  # 예제 μΆ”κ°€
161
  gr.Examples(
162
  examples=[
163
- ["μƒμ„Έν•œ μ‚¬μš© 방법을 마치 화면을 λ³΄λ©΄μ„œ μ„€λͺ…ν•˜λ“―이 4000 토큰 이상 μžμ„Ένžˆ μ„€λͺ…ν•˜λΌ"],
164
- ["FAQ 20건을 μƒμ„Έν•˜κ²Œ μž‘μ„±ν•˜λΌ. 4000토큰 이상 μ‚¬μš©ν•˜λΌ."],
165
- ["μ‚¬μš© 방법과 차별점, νŠΉμ§•, 강점을 μ€‘μ‹¬μœΌλ‘œ 4000 토큰 이상 유튜브 μ˜μƒ 슀크립트 ν˜•νƒœλ‘œ μž‘μ„±ν•˜λΌ"],
166
- ["λ³Έ μ„œλΉ„μŠ€λ₯Ό SEO μ΅œμ ν™”ν•˜μ—¬ λΈ”λ‘œκ·Έ 포슀트둜 4000 토큰 이상 μž‘μ„±ν•˜λΌ"],
167
- ["νŠΉν—ˆ μΆœμ›μ— ν™œμš©ν•  기술 및 λΉ„μ¦ˆλ‹ˆμŠ€λͺ¨λΈ 츑면을 ν¬ν•¨ν•˜μ—¬ νŠΉν—ˆ μΆœμ›μ„œ ꡬ성에 맞게 μž‘μ„±ν•˜λΌ"],
168
- ["계속 μ΄μ–΄μ„œ λ‹΅λ³€ν•˜λΌ"],
169
  ],
170
  inputs=msg,
171
  )
 
16
  return InferenceClient(LLM_MODELS[model_name], token=os.getenv("HF_TOKEN"))
17
 
18
  def analyze_file_content(content, file_type):
19
+ """파일 λ‚΄μš©μ„ λΆ„μ„ν•˜μ—¬ ꡬ쑰적 μš”μ•½μ„ λ°˜ν™˜"""
20
  if file_type == 'parquet':
21
+ try:
22
+ # Parquet 파일 ꡬ쑰 뢄석
23
+ columns = content.split('\n')[0].count('|') - 1
24
+ rows = content.count('\n') - 2 # 헀더와 ꡬ뢄선 μ œμ™Έ
25
+ return f"데이터셋 ꡬ쑰: {columns}개 컬럼, {rows}개 데이터 μƒ˜ν”Œ"
26
+ except:
27
+ return "데이터셋 ꡬ쑰 뢄석 μ‹€νŒ¨"
28
 
29
+ # ν…μŠ€νŠΈ/μ½”λ“œ 파일의 경우
30
  lines = content.split('\n')
31
  total_lines = len(lines)
32
  non_empty_lines = len([line for line in lines if line.strip()])
33
 
34
+ # μ½”λ“œ 파일 νŠΉμ§• 뢄석
35
+ if any(keyword in content.lower() for keyword in ['def ', 'class ', 'import ', 'function']):
36
  functions = len([line for line in lines if 'def ' in line])
37
  classes = len([line for line in lines if 'class ' in line])
38
+ imports = len([line for line in lines if 'import ' in line or 'from ' in line])
39
+ return f"μ½”λ“œ ꡬ쑰 뢄석: 총 {total_lines}쀄 (ν•¨μˆ˜ {functions}개, 클래슀 {classes}개, μž„ν¬νŠΈ {imports}개)"
40
+
41
+ # 일반 ν…μŠ€νŠΈ λ¬Έμ„œ 뢄석
42
+ paragraphs = content.count('\n\n') + 1
43
+ words = len(content.split())
44
+ return f"λ¬Έμ„œ ꡬ쑰 뢄석: 총 {total_lines}쀄, {paragraphs}개 문단, μ•½ {words}개 단어"
45
 
46
  def read_uploaded_file(file):
47
  if file is None:
 
68
  return formatted_history
69
 
70
  def chat(message, history, uploaded_file, model_name, system_message="", max_tokens=4000, temperature=0.7, top_p=0.9):
71
+ system_prefix = """λ„ˆλŠ” 파일 뢄석 μ „λ¬Έκ°€μž…λ‹ˆλ‹€. μ—…λ‘œλ“œλœ 파일의 λ‚΄μš©μ„ 깊이 있게 λΆ„μ„ν•˜μ—¬ λ‹€μŒκ³Ό 같은 κ΄€μ μ—μ„œ μ„€λͺ…ν•΄μ•Ό ν•©λ‹ˆλ‹€:
72
+
73
+ 1. 파일의 μ „λ°˜μ μΈ ꡬ쑰와 ꡬ성
74
+ 2. μ£Όμš” λ‚΄μš©κ³Ό νŒ¨ν„΄ 뢄석
75
+ 3. λ°μ΄ν„°μ˜ νŠΉμ§•κ³Ό 의미
76
+ 4. 잠재적 ν™œμš© λ°©μ•ˆ
77
+ 5. μ£Όμ˜ν•΄μ•Ό ν•  μ μ΄λ‚˜ κ°œμ„  κ°€λŠ₯ν•œ λΆ€λΆ„
78
+
79
+ 전문가적 κ΄€μ μ—μ„œ μƒμ„Έν•˜κ³  ꡬ쑰적인 뢄석을 μ œκ³΅ν•˜λ˜, μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ μ„€λͺ…ν•˜μ„Έμš”. 뢄석 κ²°κ³ΌλŠ” Markdown ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•˜κ³ , κ°€λŠ₯ν•œ ν•œ ꡬ체적인 μ˜ˆμ‹œλ₯Ό ν¬ν•¨ν•˜μ„Έμš”."""
80
 
81
  if uploaded_file:
82
  content, file_type = read_uploaded_file(uploaded_file)
83
  if file_type == "error":
84
+ yield "", history + [[message, content]]
85
+ return
86
 
87
+ # 파일 λ‚΄μš© 뢄석 및 ꡬ쑰적 μš”μ•½
88
  file_summary = analyze_file_content(content, file_type)
89
 
90
  if file_type == 'parquet':
91
  system_message += f"\n\n파일 λ‚΄μš©:\n```markdown\n{content}\n```"
92
  else:
93
+ system_message += f"\n\n파일 λ‚΄μš©:\n```\n{content}\n```"
94
 
95
  if message == "파일 뢄석을 μ‹œμž‘ν•©λ‹ˆλ‹€.":
96
+ message = f"""[ꡬ쑰 뢄석] {file_summary}
97
 
98
+ λ‹€μŒ κ΄€μ μ—μ„œ 상세 뢄석을 μ œκ³΅ν•΄μ£Όμ„Έμš”:
99
+ 1. 파일의 μ „λ°˜μ μΈ ꡬ쑰와 ν˜•μ‹
100
+ 2. μ£Όμš” λ‚΄μš© 및 κ΅¬μ„±μš”μ†Œ 뢄석
101
+ 3. 데이터/λ‚΄μš©μ˜ νŠΉμ§•κ³Ό νŒ¨ν„΄
102
+ 4. ν’ˆμ§ˆ 및 완성도 평가
103
+ 5. κ°œμ„  κ°€λŠ₯ν•œ λΆ€λΆ„ μ œμ•ˆ
104
+ 6. μ‹€μ œ ν™œμš© λ°©μ•ˆ 및 μΆ”μ²œμ‚¬ν•­"""
105
 
106
  messages = [{"role": "system", "content": f"{system_prefix} {system_message}"}]
107
  messages.extend(format_history(history))
108
  messages.append({"role": "user", "content": message})
109
 
 
110
  try:
111
  client = get_client(model_name)
112
+ partial_message = ""
113
+
114
  for msg in client.chat_completion(
115
  messages,
116
  max_tokens=max_tokens,
 
120
  ):
121
  token = msg.choices[0].delta.get('content', None)
122
  if token:
123
+ partial_message += token
124
+ yield "", history + [[message, partial_message]]
125
+
 
126
  except Exception as e:
127
  error_msg = f"μΆ”λ‘  쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}"
128
+ yield "", history + [[message, error_msg]]
 
129
 
130
  css = """
131
  footer {visibility: hidden}
 
152
  )
153
 
154
  file_upload = gr.File(
155
+ label="파일 μ—…λ‘œλ“œ (ν…μŠ€νŠΈ, μ½”λ“œ, 데이터 파일)",
156
  file_types=["text", ".parquet"],
157
  type="filepath"
158
  )
 
167
  msg.submit(
168
  chat,
169
  inputs=[msg, chatbot, file_upload, model_name, system_message, max_tokens, temperature, top_p],
170
+ outputs=[msg, chatbot],
171
+ queue=True
172
+ ).then(
173
+ lambda: gr.update(interactive=True),
174
+ None,
175
+ [msg]
176
  )
177
 
178
  # 파일 μ—…λ‘œλ“œ μ‹œ μžλ™ 뢄석
179
  file_upload.change(
180
  chat,
181
  inputs=[gr.Textbox(value="파일 뢄석을 μ‹œμž‘ν•©λ‹ˆλ‹€."), chatbot, file_upload, model_name, system_message, max_tokens, temperature, top_p],
182
+ outputs=[msg, chatbot],
183
+ queue=True
184
  )
185
 
186
  # 예제 μΆ”κ°€
187
  gr.Examples(
188
  examples=[
189
+ ["파일의 μ „λ°˜μ μΈ ꡬ쑰와 νŠΉμ§•μ„ μžμ„Ένžˆ μ„€λͺ…ν•΄μ£Όμ„Έμš”."],
190
+ ["이 파일의 μ£Όμš” νŒ¨ν„΄κ³Ό νŠΉμ§•μ„ λΆ„μ„ν•΄μ£Όμ„Έμš”."],
191
+ ["파일의 ν’ˆμ§ˆκ³Ό κ°œμ„  κ°€λŠ₯ν•œ 뢀뢄을 ν‰κ°€ν•΄μ£Όμ„Έμš”."],
192
+ ["이 νŒŒμΌμ„ μ‹€μ œλ‘œ μ–΄λ–»κ²Œ ν™œμš©ν•  수 μžˆμ„κΉŒμš”?"],
193
+ ["파일의 μ£Όμš” λ‚΄μš©μ„ μš”μ•½ν•˜κ³  핡심 μΈμ‚¬μ΄νŠΈλ₯Ό λ„μΆœν•΄μ£Όμ„Έμš”."],
194
+ ["이전 뢄석을 μ΄μ–΄μ„œ 더 μžμ„Ένžˆ μ„€λͺ…ν•΄μ£Όμ„Έμš”."],
195
  ],
196
  inputs=msg,
197
  )