Spaces:
Runtime error
Runtime error
import gradio as gr | |
import random | |
import os | |
import pandas as pd | |
from huggingface_hub import InferenceClient | |
# 하드코딩된 언어 모델 설정 | |
MODEL_NAME = "Cohere Command R+" | |
MODEL_PATH = "CohereForAI/c4ai-command-r-plus" | |
def create_client(model_name): | |
return InferenceClient(model_name, token=os.getenv("HF_TOKEN")) | |
def call_api(content, system_message, max_tokens, temperature, top_p): | |
client = create_client(MODEL_PATH) # 모델을 하드코딩된 값으로 설정 | |
messages = [{"role": "system", "content": system_message}, {"role": "user", "content": content}] | |
random_seed = random.randint(0, 1000000) | |
response = client.chat_completion(messages=messages, max_tokens=max_tokens, temperature=temperature, top_p=top_p, seed=random_seed) | |
return response.choices[0].message.content | |
# 긍정리뷰와 부정리뷰 분석을 위해 LLM 호출 | |
def analyze_reviews(reviews, prompt, max_tokens, temperature, top_p): | |
reviews_text = "\n".join(reviews) | |
return call_api(reviews_text, prompt, max_tokens, temperature, top_p) | |
# 엑셀 업로드 후 처리 기능 추가 | |
def upload_excel(file): | |
df = pd.read_excel(file.name) | |
# 열 이름 정리 | |
df.columns = df.columns.str.strip() | |
# 열 이름 출력 확인 (디버깅용) | |
print("엑셀 파일의 열 이름:", df.columns.tolist()) | |
# '리뷰내용' 열을 사용 (기존 'D'열을 대체) | |
if '리뷰내용' not in df.columns: | |
return "Error: 엑셀 파일에 '리뷰내용' 열이 존재하지 않습니다.", "" | |
# 1. G1셀에 "글자수" 입력 | |
df.loc[0, 'G'] = "글자수" | |
# 2. G2셀부터 G열에 '리뷰내용' 열의 글자수 입력 | |
df['G'] = df['리뷰내용'].apply(lambda x: len(str(x)) if pd.notnull(x) else 0) | |
# 3. G열 기준으로 내림차순 정렬 | |
df = df.sort_values(by='G', ascending=False) | |
# 4. 긍정 리뷰 10개 선택 (리뷰점수 E열이 5점 또는 4점이고, G열의 글자수가 500 이하인 항목) | |
if '리뷰점수' not in df.columns: | |
return "Error: 엑셀 파일에 '리뷰점수' 열이 존재하지 않습니다.", "" | |
positive_reviews = df[(df['리뷰점수'].isin([5, 4])) & (df['G'] <= 500)].head(10) | |
# 5. 부정 리뷰 10개 선택 (리뷰점수 E열이 1점 또는 2점이고, G열의 글자수가 500 이하인 항목) | |
negative_reviews = df[(df['리뷰점수'].isin([1, 2])) & (df['G'] <= 500)].head(10) | |
# 6. 긍정리뷰와 부정리뷰에서 리뷰날짜, 구매옵션, 리뷰내용을 선택하여 반환 | |
if all(col in df.columns for col in ['리뷰날짜', '구매옵션', '리뷰내용']): | |
positive_reviews_data = positive_reviews[['리뷰날짜', '구매옵션', '리뷰내용']] | |
negative_reviews_data = negative_reviews[['리뷰날짜', '구매옵션', '리뷰내용']] | |
else: | |
return "Error: 필요한 열(리뷰날짜, 구매옵션, 리뷰내용)이 엑셀 파일에 존재하지 않습니다.", "" | |
# 긍정리뷰와 부정리뷰 내용을 텍스트 형식으로 반환 (그리디오에 보여주기 위해) | |
return positive_reviews_data.to_string(), negative_reviews_data.to_string() | |
title = "AI 텍스트 생성기" | |
with gr.Blocks() as demo: | |
gr.Markdown(f"# {title}") | |
# 엑셀 업로드 기능을 가장 위로 위치 | |
excel_input = gr.File(label="엑셀 파일 업로드", file_types=[".xls", ".xlsx"]) | |
excel_output_positive = gr.Textbox(label="긍정리뷰 10개", lines=10) | |
excel_output_negative = gr.Textbox(label="부정리뷰 10개", lines=10) | |
# 긍정리뷰 프롬프트 입력 | |
system_message = gr.Textbox(label="긍정 프롬프트", lines=10) | |
# 부정리뷰 프롬프트 입력 | |
input2 = gr.Textbox(label="부정 프롬프트", lines=10) | |
# 출력창 1의 명칭을 '긍정리뷰분석'으로 설정 | |
output1 = gr.Textbox(label="긍정리뷰분석", lines=10) | |
# 출력창 2의 명칭을 '부정리뷰분석'으로 설정 | |
output2 = gr.Textbox(label="부정리뷰분석", lines=10) | |
with gr.Accordion("고급 설정", open=False): | |
max_tokens = gr.Slider(label="Max Tokens", minimum=0, maximum=4000, value=500, step=100) | |
temperature = gr.Slider(label="Temperature", minimum=0.1, maximum=1.0, value=0.75, step=0.05) | |
top_p = gr.Slider(label="Top P", minimum=0.1, maximum=1.0, value=0.95, step=0.05) | |
# 엑셀 파일 업로드 후 긍정리뷰 10개와 부정리뷰 10개를 출력 | |
excel_input.upload(upload_excel, inputs=[excel_input], outputs=[excel_output_positive, excel_output_negative]) | |
# 긍정리뷰분석 실행 (LLM 호출) | |
def analyze_positive_reviews(positive_reviews, prompt, max_tokens, temperature, top_p): | |
reviews = positive_reviews.splitlines() | |
return analyze_reviews(reviews, prompt, max_tokens, temperature, top_p) | |
# 부정리뷰분석 실행 (LLM 호출) | |
def analyze_negative_reviews(negative_reviews, prompt, max_tokens, temperature, top_p): | |
reviews = negative_reviews.splitlines() | |
return analyze_reviews(reviews, prompt, max_tokens, temperature, top_p) | |
# LLM 분석 버튼 추가 (긍정리뷰분석) | |
analyze_positive_btn = gr.Button("긍정리뷰 분석하기") | |
analyze_positive_btn.click(fn=analyze_positive_reviews, | |
inputs=[excel_output_positive, system_message, max_tokens, temperature, top_p], | |
outputs=[output1]) | |
# LLM 분석 버튼 추가 (부정리뷰분석) | |
analyze_negative_btn = gr.Button("부정리뷰 분석하기") | |
analyze_negative_btn.click(fn=analyze_negative_reviews, | |
inputs=[excel_output_negative, input2, max_tokens, temperature, top_p], | |
outputs=[output2]) | |
demo.launch() | |