LLMpromt1111 / app.py
aliceblue11's picture
Update app.py
a68216d verified
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()