Update app.py
Browse files
app.py
CHANGED
@@ -35,6 +35,9 @@ MixGEN_code = load_code('mgen.cod')
|
|
35 |
# 초기 Parquet 파일 로드 (기존 test.parquet)
|
36 |
test_parquet_content = load_parquet('test.parquet')
|
37 |
|
|
|
|
|
|
|
38 |
def respond(
|
39 |
message,
|
40 |
history: List[Tuple[str, str]],
|
@@ -42,9 +45,8 @@ def respond(
|
|
42 |
max_tokens=1024, # 기본값 추가
|
43 |
temperature=0.7, # 기본값 추가
|
44 |
top_p=0.9, # 기본값 추가
|
45 |
-
parquet_content="", # Parquet 파일 내용 상태
|
46 |
):
|
47 |
-
global fashion_code, uhdimage_code, MixGEN_code,
|
48 |
system_message = system_message or ""
|
49 |
system_prefix = """반드시 한글로 답변할것. 너는 주어진 소스코드를 기반으로 "서비스 사용 설명 및 안내, Q&A를 하는 역할이다". 아주 친절하고 자세하게 4000토큰 이상 Markdown 형식으로 작성하라. 너는 코드를 기반으로 사용 설명 및 질의 응답을 진행하며, 이용자에게 도움을 주어야 한다. 이용자가 궁금해 할 만한 내용에 친절하게 알려주도록 하라. 코드 전체 내용에 대해서는 보안을 유지하고, 키 값 및 엔드포인트와 구체적인 모델은 공개하지 마라."""
|
50 |
|
@@ -59,10 +61,10 @@ def respond(
|
|
59 |
system_message += f"\n\nMixGEN 코드 내용:\n```python\n{MixGEN_code}\n```"
|
60 |
message = "MixGEN3 이미지 생성에 대한 내용을 학습하였고, 설명할 준비가 되어있다고 알리고 서비스 URL(https://openfree-mixgen3.hf.space)을 통해 테스트 해보라고 출력하라."
|
61 |
elif message.lower() == "test.parquet 실행":
|
62 |
-
system_message += f"\n\ntest.parquet 파일 내용:\n```markdown\n{
|
63 |
message = "test.parquet 파일에 대한 내용을 학습하였고, 관련 설명 및 Q&A를 진행할 준비가 되어있다. 궁금한 점이 있으면 물어보라."
|
64 |
elif message.lower() == "csv 업로드":
|
65 |
-
message = "CSV 파일을 업로드하려면
|
66 |
|
67 |
# 시스템 메시지와 사용자 메시지 결합
|
68 |
messages = [{"role": "system", "content": f"{system_prefix} {system_message}"}]
|
@@ -94,6 +96,14 @@ def upload_csv(file):
|
|
94 |
# CSV 파일 읽기 (filepath 타입이므로 file은 경로 문자열)
|
95 |
df = pd.read_csv(file)
|
96 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
97 |
# 데이터 클렌징
|
98 |
df.drop_duplicates(inplace=True)
|
99 |
df.fillna('', inplace=True)
|
@@ -108,93 +118,70 @@ def upload_csv(file):
|
|
108 |
# Parquet 파일 로드
|
109 |
parquet_content = load_parquet(parquet_filename)
|
110 |
|
|
|
|
|
|
|
|
|
111 |
return f"{parquet_filename} 파일이 성공적으로 업로드되고 변환되었습니다.", parquet_content
|
112 |
except Exception as e:
|
113 |
return f"CSV 파일 업로드 및 변환 중 오류가 발생했습니다: {str(e)}", ""
|
114 |
|
115 |
# Gradio Blocks 인터페이스 설정
|
116 |
-
with gr.Blocks() as demo:
|
117 |
gr.Markdown("# LLM 서비스 인터페이스")
|
118 |
-
|
119 |
-
with gr.
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
137 |
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
chat_history = gr.State([]) # 대화 히스토리 저장
|
142 |
-
parquet_content_state = gr.State(test_parquet_content) # 초기 Parquet 내용 상태
|
143 |
-
|
144 |
-
def chat_respond(
|
145 |
-
message,
|
146 |
-
history,
|
147 |
-
system_message,
|
148 |
-
max_tokens,
|
149 |
-
temperature,
|
150 |
-
top_p,
|
151 |
-
parquet_content
|
152 |
-
):
|
153 |
-
# 현재 Parquet 내용 상태를 업데이트
|
154 |
-
response = respond(message, history, system_message, max_tokens, temperature, top_p, parquet_content)
|
155 |
-
return response
|
156 |
-
|
157 |
-
chat = gr.Chatbot()
|
158 |
-
system_message = gr.Textbox(label="System Message", value="")
|
159 |
-
max_tokens = gr.Slider(minimum=1, maximum=8000, value=4000, label="Max Tokens")
|
160 |
-
temperature = gr.Slider(minimum=0, maximum=1, value=0.7, label="Temperature")
|
161 |
-
top_p = gr.Slider(minimum=0, maximum=1, value=0.9, label="Top P")
|
162 |
-
|
163 |
-
with gr.Row():
|
164 |
-
user_message = gr.Textbox(label="메시지 입력")
|
165 |
-
send_button = gr.Button("보내기")
|
166 |
-
|
167 |
-
send_button.click(
|
168 |
-
chat_respond,
|
169 |
-
inputs=[user_message, chat_history, system_message, max_tokens, temperature, top_p, parquet_preview],
|
170 |
-
outputs=[chat, chat_history]
|
171 |
-
)
|
172 |
-
|
173 |
-
gr.Markdown("## 사용 예제")
|
174 |
-
gr.Examples(
|
175 |
-
examples=[
|
176 |
-
["패션 코드 실행"],
|
177 |
-
["UHD 이미지 코드 실행"],
|
178 |
-
["MixGEN 코드 실행"],
|
179 |
-
["test.parquet 실행"], # 새로운 예제 추가
|
180 |
-
["상세한 사용 방법을 마치 화면을 보면서 설명하듯이 4000 토큰 이상 자세히 설명하라"],
|
181 |
-
["FAQ 20건을 상세하게 작성하라. 4000토큰 이상 사용하라."],
|
182 |
-
["사용 방법과 차별점, 특징, 강점을 중심으로 4000 토큰 이상 유튜브 영상 스크립트 형태로 작성하라"],
|
183 |
-
["본 서비스를 SEO 최적화하여 블로그 포스트(배경 및 필요성, 기존 유사 서비스와 비교하여 특장점, 활용처, 가치, 기대효과, 결론을 포함)로 4000 토큰 이상 작성하라"],
|
184 |
-
["특허 출원에 활용할 기술 및 비즈니스모델 측면을 포함하여 특허 출원서 구성에 맞게 혁신적인 창의 발명 내용을 중심으로 4000 토큰 이상 작성하라."],
|
185 |
-
["계속 이어서 답변하라"],
|
186 |
-
],
|
187 |
-
inputs=user_message,
|
188 |
-
label="예제 선택",
|
189 |
-
)
|
190 |
-
|
191 |
gr.Markdown("## 주의 사항")
|
192 |
gr.Markdown("""
|
193 |
- **CSV 업로드**: CSV 파일을 업로드하면 자동으로 Parquet 파일로 변환됩니다.
|
194 |
- **Parquet 미리보기**: 업로드된 Parquet 파일의 첫 10개 행이 미리보기로 표시됩니다.
|
195 |
- **LLM과의 대화**: 변환된 Parquet 파일 내용을 기반으로 LLM이 응답을 생성합니다.
|
196 |
""")
|
197 |
-
|
198 |
gr.Markdown("### Gradio 인터페이스를 사용하여 LLM 모델과 상호작용하세요!")
|
199 |
|
200 |
if __name__ == "__main__":
|
|
|
35 |
# 초기 Parquet 파일 로드 (기존 test.parquet)
|
36 |
test_parquet_content = load_parquet('test.parquet')
|
37 |
|
38 |
+
# 글로벌 변수로 Parquet 내용 저장
|
39 |
+
current_parquet_content = test_parquet_content
|
40 |
+
|
41 |
def respond(
|
42 |
message,
|
43 |
history: List[Tuple[str, str]],
|
|
|
45 |
max_tokens=1024, # 기본값 추가
|
46 |
temperature=0.7, # 기본값 추가
|
47 |
top_p=0.9, # 기본값 추가
|
|
|
48 |
):
|
49 |
+
global fashion_code, uhdimage_code, MixGEN_code, current_parquet_content
|
50 |
system_message = system_message or ""
|
51 |
system_prefix = """반드시 한글로 답변할것. 너는 주어진 소스코드를 기반으로 "서비스 사용 설명 및 안내, Q&A를 하는 역할이다". 아주 친절하고 자세하게 4000토큰 이상 Markdown 형식으로 작성하라. 너는 코드를 기반으로 사용 설명 및 질의 응답을 진행하며, 이용자에게 도움을 주어야 한다. 이용자가 궁금해 할 만한 내용에 친절하게 알려주도록 하라. 코드 전체 내용에 대해서는 보안을 유지하고, 키 값 및 엔드포인트와 구체적인 모델은 공개하지 마라."""
|
52 |
|
|
|
61 |
system_message += f"\n\nMixGEN 코드 내용:\n```python\n{MixGEN_code}\n```"
|
62 |
message = "MixGEN3 이미지 생성에 대한 내용을 학습하였고, 설명할 준비가 되어있다고 알리고 서비스 URL(https://openfree-mixgen3.hf.space)을 통해 테스트 해보라고 출력하라."
|
63 |
elif message.lower() == "test.parquet 실행":
|
64 |
+
system_message += f"\n\ntest.parquet 파일 내용:\n```markdown\n{current_parquet_content}\n```"
|
65 |
message = "test.parquet 파일에 대한 내용을 학습하였고, 관련 설명 및 Q&A를 진행할 준비가 되어있다. 궁금한 점이 있으면 물어보라."
|
66 |
elif message.lower() == "csv 업로드":
|
67 |
+
message = "CSV 파일을 업로드하려면 두 번째 탭을 사용하세요."
|
68 |
|
69 |
# 시스템 메시지와 사용자 메시지 결합
|
70 |
messages = [{"role": "system", "content": f"{system_prefix} {system_message}"}]
|
|
|
96 |
# CSV 파일 읽기 (filepath 타입이므로 file은 경로 문자열)
|
97 |
df = pd.read_csv(file)
|
98 |
|
99 |
+
# CSV 파일의 컬럼 확인
|
100 |
+
required_columns = {'id', 'text', 'label', 'metadata'}
|
101 |
+
available_columns = set(df.columns)
|
102 |
+
missing_columns = required_columns - available_columns
|
103 |
+
|
104 |
+
if missing_columns:
|
105 |
+
return f"CSV 파일에 다음 필수 컬럼이 누락되었습니다: {', '.join(missing_columns)}", ""
|
106 |
+
|
107 |
# 데이터 클렌징
|
108 |
df.drop_duplicates(inplace=True)
|
109 |
df.fillna('', inplace=True)
|
|
|
118 |
# Parquet 파일 로드
|
119 |
parquet_content = load_parquet(parquet_filename)
|
120 |
|
121 |
+
# 글로벌 변수 업데이트
|
122 |
+
global current_parquet_content
|
123 |
+
current_parquet_content = parquet_content
|
124 |
+
|
125 |
return f"{parquet_filename} 파일이 성공적으로 업로드되고 변환되었습니다.", parquet_content
|
126 |
except Exception as e:
|
127 |
return f"CSV 파일 업로드 및 변환 중 오류가 발생했습니다: {str(e)}", ""
|
128 |
|
129 |
# Gradio Blocks 인터페이스 설정
|
130 |
+
with gr.Blocks(theme="Nymbo/Nymbo_Theme",) as demo:
|
131 |
gr.Markdown("# LLM 서비스 인터페이스")
|
132 |
+
|
133 |
+
with gr.Tab("챗봇"):
|
134 |
+
gr.Markdown("### LLM과 대화하기")
|
135 |
+
chat = gr.ChatInterface(
|
136 |
+
respond,
|
137 |
+
additional_inputs=[
|
138 |
+
gr.Textbox(label="System Message", value=""),
|
139 |
+
gr.Slider(minimum=1, maximum=8000, value=4000, label="Max Tokens"),
|
140 |
+
gr.Slider(minimum=0, maximum=1, value=0.7, label="Temperature"),
|
141 |
+
gr.Slider(minimum=0, maximum=1, value=0.9, label="Top P"),
|
142 |
+
],
|
143 |
+
examples=[
|
144 |
+
["패션 코드 실행"],
|
145 |
+
["UHD 이미지 코드 실행"],
|
146 |
+
["MixGEN 코드 실행"],
|
147 |
+
["test.parquet 실행"], # 새로운 예제 추가
|
148 |
+
["상세한 사용 방법을 마치 화면을 보면서 설명하듯이 4000 토큰 이상 자세히 설명하라"],
|
149 |
+
["FAQ 20건을 상세하게 작성하라. 4000토큰 이상 사용하라."],
|
150 |
+
["사용 방법과 차별점, 특징, 강점을 중심으로 4000 토큰 이상 유튜브 영상 스크립트 형태로 작성하라"],
|
151 |
+
["본 서비스를 SEO 최적화하여 블로그 포스트(배경 및 필요성, 기존 유사 서비스와 비교하여 특장점, 활용처, 가치, 기대효과, 결론을 포함)로 4000 토큰 이상 작성하라"],
|
152 |
+
["특허 출원에 활용할 기술 및 비즈니스모델 측면을 포함하여 특허 출원서 구성에 맞게 혁신적인 창의 발명 내용을 중심으로 4000 토큰 이상 작성하라."],
|
153 |
+
["계속 이어서 답변하라"],
|
154 |
+
],
|
155 |
+
theme="Nymbo/Nymbo_Theme",
|
156 |
+
cache_examples=False, # 캐싱 비활성화 설정
|
157 |
+
)
|
158 |
+
|
159 |
+
with gr.Tab("데이터 변환"):
|
160 |
+
gr.Markdown("### CSV 파일 업로드 및 Parquet 변환")
|
161 |
+
with gr.Row():
|
162 |
+
with gr.Column():
|
163 |
+
csv_file = gr.File(label="CSV 파일 업로드", type="filepath")
|
164 |
+
upload_button = gr.Button("업로드 및 변환")
|
165 |
+
upload_status = gr.Textbox(label="업로드 상태", interactive=False)
|
166 |
+
parquet_preview = gr.Markdown(label="Parquet 파일 미리보기")
|
167 |
+
|
168 |
+
# 업로드 버튼 클릭 시 실행할 함수
|
169 |
+
upload_button.click(
|
170 |
+
upload_csv,
|
171 |
+
inputs=csv_file,
|
172 |
+
outputs=[upload_status, parquet_preview]
|
173 |
+
)
|
174 |
|
175 |
+
gr.Markdown("### 기존 Parquet 파일")
|
176 |
+
gr.Markdown(f"**test.parquet 파일 내용:**\n```markdown\n{test_parquet_content}\n```")
|
177 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
178 |
gr.Markdown("## 주의 사항")
|
179 |
gr.Markdown("""
|
180 |
- **CSV 업로드**: CSV 파일을 업로드하면 자동으로 Parquet 파일로 변환됩니다.
|
181 |
- **Parquet 미리보기**: 업로드된 Parquet 파일의 첫 10개 행이 미리보기로 표시됩니다.
|
182 |
- **LLM과의 대화**: 변환된 Parquet 파일 내용을 기반으로 LLM이 응답을 생성합니다.
|
183 |
""")
|
184 |
+
|
185 |
gr.Markdown("### Gradio 인터페이스를 사용하여 LLM 모델과 상호작용하세요!")
|
186 |
|
187 |
if __name__ == "__main__":
|