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()