|
import gradio as gr |
|
from huggingface_hub import InferenceClient |
|
import os |
|
|
|
|
|
COHERE_MODEL = "CohereForAI/c4ai-command-r-plus-08-2024" |
|
|
|
def get_client(hf_token): |
|
""" |
|
Cohere Command R+ 모델을 위한 InferenceClient 생성. |
|
hf_token은 Gradio secrets를 통해 제공. |
|
""" |
|
if not hf_token: |
|
raise ValueError("HuggingFace API 토큰이 필요합니다.") |
|
return InferenceClient(COHERE_MODEL, token=hf_token) |
|
|
|
def respond_cohere_qna( |
|
question: str, |
|
system_message: str, |
|
max_tokens: int, |
|
temperature: float, |
|
top_p: float, |
|
hf_token: str |
|
): |
|
""" |
|
Cohere Command R+ 모델을 이용해 한 번의 질문(question)에 대한 답변을 반환하는 함수. |
|
""" |
|
try: |
|
client = get_client(hf_token) |
|
except ValueError as e: |
|
return f"오류: {str(e)}" |
|
|
|
messages = [ |
|
{"role": "system", "content": system_message}, |
|
{"role": "user", "content": question} |
|
] |
|
|
|
try: |
|
response_full = client.chat_completion( |
|
messages, |
|
max_tokens=max_tokens, |
|
temperature=temperature, |
|
top_p=top_p, |
|
) |
|
assistant_message = response_full.choices[0].message.content |
|
return assistant_message |
|
except Exception as e: |
|
return f"오류가 발생했습니다: {str(e)}" |
|
|
|
|
|
SYSTEM_MESSAGE = """##[기본규칙] |
|
1. 반드시 한국어(한글)로 작성하라. |
|
2. 너는 가장 주목받는 마케터이며 블로그 마케팅 전문가이다. |
|
3. 특히 너는 '정보성(Informative)' 전문 블로그 마케팅 전문가이다. |
|
4. 정보 제공에 초점을 맞추어 작성한다. |
|
|
|
##[텍스트 작성 규칙] |
|
1. 소주제를 5개로 구분하여 2000자 이상되도록 작성하라. |
|
2. 전체 맥락을 이해하고 문장의 일관성을 유지하라. |
|
3. 절대로 참고글을 한문장 이상 그대로 출력하지 말 것. |
|
4. 주제와 상황에 맞는 적절한 어휘를 선택하라. |
|
5. 한글 어휘의 난이도는 쉽게 작성하라. |
|
6. 절대 문장의 끝에 '답니다'를 사용하지 말 것. |
|
|
|
###[정보성 블로그 작성 규칙] |
|
1. 독자가 얻고자 하는 유용한 정보와 흥미로운 정보를 제공하도록 작성하라. |
|
2. 독자의 공감을 이끌어내고 궁금증을 해결하도록 작성하라. |
|
3. 독자의 관심사를 충족시키도록 작성하라. |
|
4. 독자에게 이득이 되는 정보를 작성하라. |
|
|
|
##[제외 규칙] |
|
1. 반드시 비속어 및 욕설(expletive, abusive language, slang)은 제외하라. |
|
2. 반드시 참고글의 링크(URL)는 제외하라. |
|
3. 참고글에서 '링크를 확인해주세요'와 같은 링크 이동의 문구는 제외하라. |
|
4. 참고글에 있는 작성자, 화자, 유튜버, 기자(Writer, speaker, YouTuber, reporter)의 이름, 애칭, 닉네임(Name, Nkickname)은 반드시 제외하라. |
|
5. 반드시 문장의 끝부분이 어색한 한국어 표현은 제외하라('예요', '답니다', '해요', '해주죠', '됐죠', '됐어요', '고요' 등.) |
|
""" |
|
MAX_TOKENS = 4000 |
|
TEMPERATURE = 0.7 |
|
TOP_P = 0.95 |
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown("# 블로그 생성기") |
|
|
|
|
|
hf_token = os.getenv("HF_TOKEN") |
|
|
|
|
|
with gr.Row(): |
|
tone = gr.Radio( |
|
choices=["친근하게", "일반적인", "전문적인"], |
|
label="말투바꾸기", |
|
value="일반적인" |
|
) |
|
ref1 = gr.Textbox(label="참조글 1", lines=3) |
|
ref2 = gr.Textbox(label="참조글 2", lines=3) |
|
ref3 = gr.Textbox(label="참조글 3", lines=3) |
|
|
|
|
|
answer_output = gr.Textbox(label="생성된 블로그 글", lines=10, interactive=False) |
|
|
|
|
|
submit_button = gr.Button("생성") |
|
|
|
def generate_blog(tone, ref1, ref2, ref3): |
|
|
|
hf_token_value = os.getenv("HF_TOKEN") |
|
if not hf_token_value: |
|
return "HuggingFace 토큰이 설정되지 않았습니다." |
|
|
|
|
|
prompt = f"말투: {tone}\n참조글 1: {ref1}\n참조글 2: {ref2}\n참조글 3: {ref3}" |
|
return respond_cohere_qna( |
|
question=prompt, |
|
system_message=SYSTEM_MESSAGE, |
|
max_tokens=MAX_TOKENS, |
|
temperature=TEMPERATURE, |
|
top_p=TOP_P, |
|
hf_token=hf_token_value |
|
) |
|
|
|
submit_button.click( |
|
fn=generate_blog, |
|
inputs=[tone, ref1, ref2, ref3], |
|
outputs=answer_output |
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
demo.launch() |