Spaces:
Sleeping
Sleeping
File size: 5,680 Bytes
de0d741 b8a1d50 de0d741 | 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 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | import gradio as gr
import cohere
import os
from dotenv import load_dotenv
load_dotenv()
# Cohereのクライアント初期化
co = cohere.Client(api_key=os.getenv("COHERE_API_KEY"))
# デフォルト値の定義
DEFAULT_QUANT = """【プロジェクト実績】
1. 大手製造業の全社調達業務BPR(PMOリード)
成果:調達コストを15%(約5億円)削減。リードタイムを20%短縮。
2. 小売チェーンの在庫管理システム刷新(業務設計担当)
成果:在庫回転率を1.2倍に向上、廃棄ロスを年間3,000万円抑制。"""
DEFAULT_ESSAY = """「構造化能力と粘り強い合意形成力」
私の強みは、複雑な利害関係が絡む現場において、客観的な事実に基づいた論理的な説明を行い、納得感のある合意を形成する力です。"""
# 印刷用のJavaScript
js_print = "function() { window.print(); }"
# 印刷用のCSS設定(ここですべて制御します)
css = """
/* 画面表示用のフッター非表示 */
footer { visibility: hidden; }
@media print {
/* 印刷時に隠すもの:ヘッダー、左カラム(フォーム)、ボタン、フッター、タブ等 */
.no-print, header, footer, .gr-button, .gr-form, .tabs {
display: none !important;
}
/* レポートエリア以外の余計な余白や境界線を消す */
.gr-block, .gr-box {
border: none !important;
box-shadow: none !important;
}
/* レポートエリア(Markdown)を紙面いっぱいに広げる */
#report-area {
width: 100% !important;
margin: 0 !important;
padding: 0 !important;
position: absolute;
top: 0;
left: 0;
}
}
"""
def screen_candidate(name, experience_years, phases, skills, quantitative_data, essay):
# --- 1. 定量評価 ---
score = 0
feedback_points = []
if experience_years >= 5: score += 20
elif experience_years >= 3: score += 15
else: score += 5
phase_score = len(phases) * 7.5
score += min(phase_score, 30)
if len(quantitative_data.strip()) > 20:
score += 20
feedback_points.append("◎実績が具体的に記述されています")
skill_score = len(skills) * 4
score += min(skill_score, 20)
if score >= 80: result = "【合格】即戦力として面接へ"
elif score >= 60: result = "【保留】カジュアル面談推奨"
else: result = "【見送り】要件再確認"
# --- 2. AI定性分析 ---
prompt = f"""
あなたは一流の戦略・業務コンサルティングファームのシニアパートナーです。
定量判定「{result}」を踏まえ、以下の候補者を厳格に評価してください。
【候補者情報】
- 氏名: {name}
- 経験年数: {experience_years}年
- 経験フェーズ: {', '.join(phases) if phases else "未選択"}
- スキル: {', '.join(skills) if skills else "未選択"}
- 実績詳細: {quantitative_data}
- 自己PR: {essay}
以下の3点をプロフェッショナルなトーンで分析してください:
1. 職務適性・強みの分析(コンサルとしての武器)
2. クリティカルな懸念点と面接での深掘り質問案
3. 総合評価とアサイン想定(どの役割で期待できるか)
"""
try:
# モデル名は安定版を指定
response = co.chat(message=prompt, model="command-a-03-2025")
ai_analysis = response.text
except Exception as e:
ai_analysis = f"AI評価エラー: {str(e)}"
# --- 3. レポート作成 ---
report = f"""# スクリーニング結果報告書\n\n## 1. 定量スコア判定\n- **総合スコア:** {score} / 100\n- **判定:** {result}\n\n## 2. システムチェック\n- {chr(10).join(feedback_points)}\n\n## 3. シニアパートナーによるAI分析\n{ai_analysis}"""
return report
# Gradio UI
with gr.Blocks(theme=gr.themes.Soft(), css=css) as demo:
# elem_classes に no-print を指定
gr.Markdown("# 業務コンサルタント採用 AIスクリーニング", elem_classes=["no-print"])
with gr.Row():
# 左カラム: 入力エリア
with gr.Column(elem_classes=["no-print"]):
name = gr.Textbox(label="候補者氏名", placeholder="田中 太郎")
exp = gr.Number(label="経験年数", value=5)
phases = gr.CheckboxGroup(["現状分析(As-Is)", "To-Be策定", "要件定義", "ベンダー選定", "合意形成", "定着化支援"], label="経験フェーズ", value=["現状分析(As-Is)", "To-Be策定", "合意形成"])
skills = gr.CheckboxGroup(["BPR", "ERP導入", "DX推進", "PMP", "英語(ビジネス)", "SQL/データ分析"], label="保有スキル", value=["BPR"])
quant = gr.Textbox(label="実績詳細", lines=8, value=DEFAULT_QUANT)
essay = gr.Textbox(label="自己PR", lines=5, value=DEFAULT_ESSAY)
submit_btn = gr.Button("AIスクリーニング実行", variant="primary")
print_btn = gr.Button("📄 結果のみを印刷 / PDF保存")
# 右カラム: レポート表示エリア(ここだけを印刷する)
with gr.Column(elem_id="report-area"):
output = gr.Markdown(label="判定レポート")
# イベント設定
submit_btn.click(fn=screen_candidate, inputs=[name, exp, phases, skills, quant, essay], outputs=output)
print_btn.click(fn=None, inputs=None, outputs=None, js=js_print)
if __name__ == "__main__":
demo.launch(css="footer {visibility: hidden;}") |