File size: 5,124 Bytes
54b7ed6
 
1b5ec05
54b7ed6
 
1b5ec05
54b7ed6
 
 
065fc33
54b7ed6
 
065fc33
54b7ed6
 
 
 
 
 
065fc33
54b7ed6
 
065fc33
e72083d
54b7ed6
 
e72083d
c223f4b
143d18d
0f8825d
143d18d
 
 
c223f4b
 
 
0f8825d
e72083d
 
 
c223f4b
 
e72083d
 
 
 
 
c223f4b
 
0f8825d
c223f4b
e72083d
 
c223f4b
e72083d
c223f4b
 
 
 
0f8825d
c223f4b
e72083d
 
 
065fc33
54b7ed6
065fc33
54b7ed6
 
 
 
 
e72083d
 
54b7ed6
 
 
 
 
 
 
 
 
065fc33
54b7ed6
 
 
 
 
 
 
 
065fc33
54b7ed6
 
 
 
 
 
 
 
 
 
 
 
e72083d
 
065fc33
e72083d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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

def generate_text(user_message, system_message, max_tokens, temperature, top_p):
    return call_api(user_message, system_message, 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)
    
    # 사용자 메시지의 명칭을 '긍정리뷰 10개'로 설정
    user_message = gr.Textbox(label="긍정리뷰 10개", lines=5)
    
    # 입력창 1의 명칭을 '부정리뷰 10개'로 설정
    input1 = gr.Textbox(label="부정리뷰 10개", lines=5)
    
    # 시스템 메시지(프롬프트)의 명칭을 '긍정 프롬프트'로 설정
    system_message = gr.Textbox(label="긍정 프롬프트", lines=10)

    # 입력창 2의 명칭을 '부정 프롬프트'로 설정
    input2 = gr.Textbox(label="부정 프롬프트")
    
    # 출력창 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)
    
    # 실행 버튼 추가
    generate_btn = gr.Button("텍스트 생성하기")
    
    generate_btn.click(fn=generate_text, 
                       inputs=[user_message, system_message, max_tokens, temperature, top_p], 
                       outputs=[output1, output2])
    
    # 엑셀 파일 업로드 후 긍정리뷰 10개와 부정리뷰 10개를 출력
    excel_input.upload(upload_excel, inputs=[excel_input], outputs=[excel_output_positive, excel_output_negative])

demo.launch()