Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -2,50 +2,37 @@ import gradio as gr
|
|
| 2 |
from huggingface_hub import InferenceClient
|
| 3 |
import os
|
| 4 |
|
| 5 |
-
# Secretsから取得。取得できない場合のデフォルト値を設定
|
| 6 |
TOKEN = os.getenv("HF_TOKEN")
|
| 7 |
-
|
| 8 |
-
# モデルの指定 (Llama-3-70B)
|
| 9 |
client = InferenceClient("meta-llama/Meta-Llama-3-70B-Instruct", token=TOKEN)
|
| 10 |
|
| 11 |
def generate_press_release(category, title, key_elements, background, company_info):
|
| 12 |
if not TOKEN:
|
| 13 |
-
yield "❌ エラー: HF_TOKEN が設定されていません。
|
| 14 |
return
|
| 15 |
|
| 16 |
-
|
| 17 |
-
"新製品・サービス": "スペック、価格、発売日、独自性を強調してください。",
|
| 18 |
-
"イベント・展示会": "日時、場所、登壇者、参加メリット、申し込み方法を強調してください。",
|
| 19 |
-
"業務提携・契約": "提携の目的、両社の強み、今後の展望を強調してください。",
|
| 20 |
-
"資金調達": "調達金額、投資家名、資金の使途、成長戦略を強調してください。",
|
| 21 |
-
"調査レポート": "調査結果のトピックス、意外なデータ、専門家の見解を強調してください。",
|
| 22 |
-
"その他": "事実関係を整理し、社会的な意義を強調してください。"
|
| 23 |
-
}
|
| 24 |
-
|
| 25 |
-
hint = category_hints.get(category, "")
|
| 26 |
-
|
| 27 |
prompt = f"""
|
| 28 |
-
あなたは
|
| 29 |
-
以下の情報を
|
| 30 |
|
| 31 |
【ニュースの種類】: {category}
|
| 32 |
【タイトル(案)】: {title}
|
| 33 |
【必須要素】: {key_elements}
|
| 34 |
-
【背景・想い】: {background}
|
| 35 |
【発信元情報】: {company_info}
|
| 36 |
|
| 37 |
-
【
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
|
| 43 |
-
出力は日本語のみで
|
| 44 |
"""
|
| 45 |
|
| 46 |
try:
|
| 47 |
response = ""
|
| 48 |
-
# stream=True で逐次生成
|
| 49 |
for message in client.chat_completion(
|
| 50 |
messages=[{"role": "user", "content": prompt}],
|
| 51 |
max_tokens=2500,
|
|
@@ -57,23 +44,27 @@ def generate_press_release(category, title, key_elements, background, company_in
|
|
| 57 |
response += token
|
| 58 |
yield response
|
| 59 |
except Exception as e:
|
| 60 |
-
yield f"⚠️
|
| 61 |
|
| 62 |
-
# UI
|
| 63 |
with gr.Blocks() as demo:
|
| 64 |
-
gr.Markdown("#
|
| 65 |
-
gr.Markdown("
|
| 66 |
|
| 67 |
with gr.Row():
|
| 68 |
with gr.Column():
|
| 69 |
category = gr.Dropdown(
|
| 70 |
-
choices=["新
|
| 71 |
-
label="カテゴリ", value="新
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 72 |
)
|
| 73 |
-
|
| 74 |
-
elements = gr.Textbox(label="内容・必須要素", lines=5, placeholder="いつ、どこで、何を...")
|
| 75 |
-
context = gr.Textbox(label="背景・想い", lines=3, placeholder="開発のきっかけなど")
|
| 76 |
-
company = gr.Textbox(label="会社情報・連絡先", placeholder="社名、メールアドレスなど")
|
| 77 |
submit_btn = gr.Button("プレスリリースを生成", variant="primary")
|
| 78 |
|
| 79 |
with gr.Column():
|
|
@@ -85,10 +76,5 @@ with gr.Blocks() as demo:
|
|
| 85 |
outputs=output
|
| 86 |
)
|
| 87 |
|
| 88 |
-
# サーバーを起動し、プロセスを維持する
|
| 89 |
if __name__ == "__main__":
|
| 90 |
-
demo.launch(
|
| 91 |
-
server_name="0.0.0.0",
|
| 92 |
-
server_port=7860,
|
| 93 |
-
show_error=True
|
| 94 |
-
)
|
|
|
|
| 2 |
from huggingface_hub import InferenceClient
|
| 3 |
import os
|
| 4 |
|
|
|
|
| 5 |
TOKEN = os.getenv("HF_TOKEN")
|
| 6 |
+
# 日本語の理解力が高い Llama-3-70B を継続使用
|
|
|
|
| 7 |
client = InferenceClient("meta-llama/Meta-Llama-3-70B-Instruct", token=TOKEN)
|
| 8 |
|
| 9 |
def generate_press_release(category, title, key_elements, background, company_info):
|
| 10 |
if not TOKEN:
|
| 11 |
+
yield "❌ エラー: HF_TOKEN が設定されていません。"
|
| 12 |
return
|
| 13 |
|
| 14 |
+
# AIへの指示(プロンプト)をさらに厳格化
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 15 |
prompt = f"""
|
| 16 |
+
あなたは日本の大手企業やスタートアップを支援する、超一流の広報コンサルタントです。
|
| 17 |
+
以下の「乱れた入力情報」を読み解き、その意図を汲み取った上で、一切の外国語を排除した【完璧な日本語】のプレスリリースを作成してください。
|
| 18 |
|
| 19 |
【ニュースの種類】: {category}
|
| 20 |
【タイトル(案)】: {title}
|
| 21 |
【必須要素】: {key_elements}
|
| 22 |
+
【背景・想い(※ノイズ混じり)】: {background}
|
| 23 |
【発信元情報】: {company_info}
|
| 24 |
|
| 25 |
+
【ミッション】:
|
| 26 |
+
- 「Background」に含まれる「iterations had mistakes」「ERRORを減らしたい」といった英語や記号の混じった表現を正しく解釈し、『料理初心者が直面する失敗やハードルをAIで取り除き、料理の楽しさを伝えたい』という日本語の文脈に変換してください。
|
| 27 |
+
- 文末はすべて「~です」「~ます」で統一してください。「~である」は禁止です。
|
| 28 |
+
- 構成は「タイトル」「リード文」「背景(開発の想い)」「詳細」「会社概要」としてください。
|
| 29 |
+
- 読み手がワクワクするような、ポジティブで信頼感のあるトーンにしてください。
|
| 30 |
|
| 31 |
+
出力は【日本語】のみで行ってください。
|
| 32 |
"""
|
| 33 |
|
| 34 |
try:
|
| 35 |
response = ""
|
|
|
|
| 36 |
for message in client.chat_completion(
|
| 37 |
messages=[{"role": "user", "content": prompt}],
|
| 38 |
max_tokens=2500,
|
|
|
|
| 44 |
response += token
|
| 45 |
yield response
|
| 46 |
except Exception as e:
|
| 47 |
+
yield f"⚠️ 生成中にエラーが発生しました。時間を置いて再度お試しください: {str(e)}"
|
| 48 |
|
| 49 |
+
# UI
|
| 50 |
with gr.Blocks() as demo:
|
| 51 |
+
gr.Markdown("# 🍳 料理・フードテック専用 プレスリリース生成AI")
|
| 52 |
+
gr.Markdown("入力に英語やメモ書きが混ざっていても、AIがプロ仕様の日本語に整えます。")
|
| 53 |
|
| 54 |
with gr.Row():
|
| 55 |
with gr.Column():
|
| 56 |
category = gr.Dropdown(
|
| 57 |
+
choices=["新サービス発表", "イベント開催", "業務提携", "資金調達", "その他"],
|
| 58 |
+
label="カテゴリ", value="新サービス発表"
|
| 59 |
+
)
|
| 60 |
+
title = gr.Textbox(label="プロジェクト名・タイトル(仮)", placeholder="例:AI料理アシスタント『TastyAI』")
|
| 61 |
+
elements = gr.Textbox(label="具体的な機能や特徴", lines=5, placeholder="例:AIが失敗の予兆を検知してアドバイスする機能など")
|
| 62 |
+
context = gr.Textbox(
|
| 63 |
+
label="開発の背景・想い(メモ書きでOK)",
|
| 64 |
+
lines=5,
|
| 65 |
+
placeholder="例:料理を始めた壁をaiで取り払いたい。iterations had mistakes...のようなメモでも大丈夫です"
|
| 66 |
)
|
| 67 |
+
company = gr.Textbox(label="会社情報", placeholder="社名、代表者名、連絡先など")
|
|
|
|
|
|
|
|
|
|
| 68 |
submit_btn = gr.Button("プレスリリースを生成", variant="primary")
|
| 69 |
|
| 70 |
with gr.Column():
|
|
|
|
| 76 |
outputs=output
|
| 77 |
)
|
| 78 |
|
|
|
|
| 79 |
if __name__ == "__main__":
|
| 80 |
+
demo.launch(server_name="0.0.0.0", server_port=7860)
|
|
|
|
|
|
|
|
|
|
|
|