fudii0921 commited on
Commit
debcd4c
·
verified ·
1 Parent(s): c01bc87

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +107 -192
app.py CHANGED
@@ -4,212 +4,154 @@ import os
4
  import json
5
  from dotenv import load_dotenv
6
 
7
- load_dotenv(verbose=True)
8
-
9
- def update_lang(lang):
10
- if len(lang) == 0:
11
- return gr.update(value="Pythonが得意。スクリプト作成やデータ分析、機械学習まで幅広く活用している。")
12
- else:
13
- return gr.update(value=lang)
14
-
15
- def update_debug(debug):
16
- if len(debug) == 0:
17
- return gr.update(value="よく使うのはpdb(Python Debugger)やVS Codeのデバッガ機能。エラー箇所を細かくチェックするのが好き。")
18
- else:
19
- return gr.update(value=debug)
20
-
21
- def update_recent_problem(recent_problem):
22
- if len(recent_problem) == 0:
23
- return gr.update(value="例えば、APIの連携でエラーが続発する問題があったとき、レスポンスをしっかりロギングしてパターンを分析、結果的にリクエストヘッダーを微調整して解決できた。")
24
- else:
25
- return gr.update(value=recent_problem)
26
-
27
- def update_project_approach(project_approach):
28
- if len(project_approach) == 0:
29
- return gr.update(value="チーム内でブレインストーミングしてアイデアを出し合い、最良の解決策を選択するのが常套手段だと思っている。")
30
- else:
31
- return gr.update(value=project_approach)
32
-
33
- def update_project_scale(project_scale):
34
- if len(project_scale) == 0:
35
- return gr.update(value="1人で取り組むものから、数十人規模の開発チームでクラウドシステム構築などをした経験もある。")
36
- else:
37
- return gr.update(value=project_scale)
38
-
39
- def update_team_role (team_role):
40
- if len(team_role ) == 0:
41
- return gr.update(value="主にテクニカルリーダーとして、設計からレビューまでを担当。時には新人教育も。")
42
- else:
43
- return gr.update(value=team_role)
44
-
45
- def update_learning_methods(learning_methods):
46
- if len(learning_methods) == 0:
47
- return gr.update(value="実際に手を動かして試すのが一番。Tutorialやドキュメントを読みながらプロトタイプを作成。")
48
- else:
49
- return gr.update(value=learning_methods)
50
-
51
- def update_recent_learning(recent_learning):
52
- if len(recent_learning) == 0:
53
- return gr.update(value="最近は生成AIのモデルチューニング方法について学んだよ。これでさらに便利なプロジェクトが作れる。")
54
- else:
55
- return gr.update(value=recent_learning)
56
-
57
 
 
58
 
59
  # スコアを抽出する関数
60
- def post_scores(state,email):
61
- if len(email) == 0:
62
- return "検査結果がありません!"
63
- else:
64
- state['final_email'] = email
65
- state['final_comment'] = """{
66
- "技術的な理解": 9,
67
- "問題解決能力": 8.5,
68
- "実務経験": 8,
69
- "学習意欲": 9,
70
- "ソフトスキル": 8.5,
71
- "合計スコア": 8.6
72
- }"""
73
-
74
- co = cohere.ClientV2(api_key=os.environ.get("COHERE_API_KEY"))
75
- res = co.chat(
76
- model="command-a-03-2025",
77
- messages=[
78
- {
79
- "role": "user",
80
- "content": f"これは{state['final_email']}さんのデータです。{state['final_comment']}を評価してください。生成された結果に基づいて{state['final_email']}さんに送るスカウト提案メールも作ってください。答えは、必ず、評価結果とメールの本文を日本語で返してください。",
81
- }
82
- ],
83
- )
84
- data = res.message.content[0].text
85
- return data
86
 
87
- # スコアを抽出する関数
88
- def extract_scores(state):
89
- if len(state["final_score"]) == 0:
90
  return "検査結果がありません!"
91
  else:
92
  co = cohere.ClientV2(api_key=os.environ.get("COHERE_API_KEY"))
93
  res = co.chat(
94
  model="command-a-03-2025",
95
  messages=[
96
- {
97
- "role": "user",
98
- "content": f"これは{state['final_email']}さんのデータです。{state['final_comment']}を評価してください。生成された結果に基づいて{state['final_email']}さんに送るスカウト提案メールも作ってください。答えは、必ず、評価結果とメーの本文を日本語で返してください。",
99
- }
100
  ],
101
  )
 
102
  data = res.message.content[0].text
103
  return data
104
-
105
- # 簡易評価の関数
106
- def evaluate_responses(state, email, programming, debugging, problem, problem_solving, project_experience, role, learning, learnt_skills):
107
- state["final_email"] = email
108
 
109
- if (email != "" and programming != "" and debugging != "" and problem != "" and problem_solving != "" and project_experience != "" and role != "" and learning != "" and learnt_skills != ""):
110
- # レコード作成
111
- records = f"""
112
- ✨プログラミング言語について: {programming}
113
- ✨デバッグ方法について: {debugging}
114
- ✨最近解決した技術的な課題: {problem}
115
- ✨プロジェクト問題解決方法について: {problem_solving}
116
- ✨プロジェクト経験について: {project_experience}
117
- ✨チームでの役割について: {role}
118
- ✨新しい技術への学習意欲について: {learning}
119
- ✨最近学んだ技術や知識について: {learnt_skills}
120
- """
121
- co = cohere.ClientV2(api_key=os.environ.get("COHERE_API_KEY"))
122
- res = co.chat(
123
- model="command-a-03-2025",
124
- messages=[
125
- {
126
- "role": "user",
127
- "content": f"""
128
- {records}を「基準」に基づいて各項目の合計スコアを10段階で割り振って評価してください。答えは、必ず、「形式」で合計スコアのみを返してください。
129
- 「基準」=価基準とポイント配分
130
- 技術的な理解 (30%): 例えばプログラミング言語の知識やデバッグ能力を考慮。コード品質や問題解決能力が評価対象。
131
- 問題解決能力 (25%): 技術的課題への対応スキルやアプローチ方法をチェック。現実的かつ効率的な解決策を出せるかどうか。
132
- 実務経験 (20%): 過去のプロジェクト経験の内容や規模。実際の成果や役割が評価される。
133
- 学習意欲 (15%): 新しい技術をどれだけ積極的に学び、適応しているか。最近学んだ知識がアピールポイント!
134
- ソフトスキル (10%): チームワークやコミュニケーション能力。エンジニアの柔軟性や協力姿勢を評価。
135
- 「形式」= {{
136
- "技術的な理解": 9,
137
- "問題解決能力": 8.5,
138
- "実務経験": 8,
139
- "学習意欲": 9.5,
140
- "ソフトスキル": 8.5,
141
- "合計スコア": 8.63,
142
- "スキルレベル": "Expert",
143
- "説明": "技術力や問題解決能力、学習意欲が高くバランスの良いスキルセットを持っている。"
144
- }}
145
- """,
146
- }
147
- ],
148
- )
149
 
150
- cleaned_string = res.message.content[0].text.replace("```json", "").replace("```", "").strip()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
151
 
152
- data = json.loads(cleaned_string)
153
- #data = json.loads(res.message.content[0].text)
154
- comments = "\n".join([f"{key}: {value}" for key, value in data.items()])
155
- scores = [f"{key}: {value}" for key, value in data.items()]
156
-
157
- state["final_comment"] = comments
158
- state["final_score"] = scores
159
-
160
- return records, comments
161
- else:
162
- return "入力が正しくありません。","None"
 
 
 
 
 
 
163
 
164
 
165
- # Gradio Blocksの構築
166
- with gr.Blocks(css="footer {visibility: hidden;} #header {display: flex; justify-content: space-between; align-items: center; font-size: 24px; font-weight: bold;} #logo {width: 50px; height: 50px;}", theme=gr.themes.Glass(), title="エンジニア・スキル評価") as inquery:
167
  state = gr.State({
168
  "final_email": "",
169
  "final_comment": "",
170
  "final_score": [],
171
  })
 
 
 
 
 
 
 
172
 
173
- gr.HTML('<div id="header"><span>🧑‍🏫👩‍🏫 エンジニア・スキル評価</span><img id="logo" src="https://www.ryhintl.com/images/ryhlogo/ryhlogo.png" width="64" height="64" alt="Logo"></div>')
174
- gr.Markdown("エンジニア・スキルを簡易評価するアプリです!")
 
 
 
175
 
176
- with gr.Tab("エジニア・スキル評価質問フォーム"):
 
 
 
177
  # 入力フィールド
178
  with gr.Row():
179
- email = gr.Textbox(label="電子メールを入力してください。", info="your mail address")
180
 
181
  with gr.Row():
182
  lang = gr.Textbox(label="普段使用しているプログラミング言語は何ですか?、尚、経験年数を教えてください。",
183
- info="Pythonが得意。スクリプト作成やデータ分析、機械学習まで幅広く活用している。", value="")
184
- lang.submit(fn=update_lang,inputs=[lang],outputs=[lang])
185
  with gr.Row():
186
  debug_tools = gr.Textbox(label="コードのデバッグ方法やツールについて教えてください。",
187
- info="よく使うのはpdb(Python Debugger)やVS Codeのデバッガ機能。エラー箇所を細かくチェックするのが好き。")
188
- debug_tools.submit(fn=update_debug,inputs=[debug_tools],outputs=[debug_tools])
189
  with gr.Row():
190
  recent_problem = gr.Textbox(label="最近解決した技術的な課題を教えてください。どのようにアプローチしましたか?",
191
- info="例えば、APIの連携でエラーが続発する問題があったとき、レスポンスをしっかりロギングしてパターンを分析、結果的にリクエストヘッダーを微調整して解決できた。")
192
- recent_problem.submit(fn=update_recent_problem,inputs=[recent_problem],outputs=[recent_problem])
193
  with gr.Row():
194
  project_approach = gr.Textbox(label="複雑なプロジェクトで課題が発生した場合、どう対処しますか?",
195
- info="チーム内でブレインストーミングしてアイデアを出し合い、最良の解決策を選択するのが常套手段だと思っている。")
196
- project_approach.submit(fn=update_project_approach,inputs=[project_approach],outputs=[project_approach])
197
  with gr.Row():
198
  project_scale = gr.Textbox(label="過去に関わったプロジェクトの規模や内容を教えてください。",
199
- info="1人で取り組むものから、数十人規模の開発チームでクラウドシステム構築などをした経験もある。")
200
- project_scale.submit(fn=update_project_scale,inputs=[project_scale],outputs=[project_scale])
201
  with gr.Row():
202
  team_role = gr.Textbox(label="チームでどのような役割を果たしましたか?",
203
- info="主にテクニカルリーダーとして、設計からレビューまでを担当。時には新人教育も。")
204
- team_role.submit(fn=update_team_role,inputs=[team_role],outputs=[team_role])
205
  with gr.Row():
206
  learning_methods = gr.Textbox(label="新しい技術を学ぶ際にどのような方法を取っていますか?",
207
- info="実際に手を動かして試すのが一番。Tutorialやドキュメントを読みながらプロトタイプを作成。")
208
- learning_methods.submit(fn=update_learning_methods,inputs=[learning_methods],outputs=[learning_methods])
209
  with gr.Row():
210
  recent_learning = gr.Textbox(label="最近学んだ技術や知識は何ですか?",
211
- info="最近は生成AIのモデルチューニング方法について学んだよ。これでさらに便利なプロジェクトが作れる。")
212
- recent_learning.submit(fn=update_recent_learning,inputs=[recent_learning],outputs=[recent_learning])
213
 
214
  # ボタンと出力フィールド
215
  with gr.Row():
@@ -219,36 +161,9 @@ with gr.Blocks(css="footer {visibility: hidden;} #header {display: flex; justify
219
  score = gr.Textbox(label="スコア")
220
 
221
 
222
- submit_btn.click(fn=evaluate_responses,
223
- inputs=[state, email, lang, debug_tools, recent_problem, project_approach,
224
- project_scale, team_role, learning_methods, recent_learning],
225
- outputs=[result, score])
226
-
227
- with gr.Tab("リアルタイム・アセスメント"):
228
- gr.Markdown("# エンジニア・スキルの簡易評価")
229
- gr.Markdown("質問フォームから各項目のスコアを抽出して評価します!")
230
-
231
- with gr.Row():
232
- display_button = gr.Button("簡易評価")
233
-
234
- with gr.Row():
235
- output = gr.Textbox(label="簡易評価", show_copy_button=True)
236
-
237
- # ボタンに関数を接続
238
- display_button.click(fn=extract_scores, inputs=[state], outputs=output)
239
-
240
- with gr.Tab("ポスト・アセスメント"):
241
- gr.Markdown("# エンジニア・スキルの簡易評価")
242
- gr.Markdown("質問フォームから各項目���スコアを抽出して評価します!")
243
-
244
- with gr.Row():
245
- input = gr.Textbox(label="電子メール")
246
- output = gr.Textbox(label="簡易評価", show_copy_button=True)
247
-
248
- with gr.Row():
249
- analyze_button = gr.Button("簡易評価")
250
-
251
- # ボタンに関数を接続
252
- analyze_button.click(fn=post_scores, inputs=[state,input], outputs=output)
253
 
254
  inquery.launch()
 
4
  import json
5
  from dotenv import load_dotenv
6
 
7
+ final_score = []
8
+ final_comment = ""
9
+ final_email = ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
 
11
+ load_dotenv(verbose=True)
12
 
13
  # スコアを抽出する関数
14
+ #def extract_scores(email: str,comment: str):
15
+ def extract_scores():
16
+ global final_score
17
+ global final_comment
18
+ global final_email
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
 
20
+ if (len(final_score) == 0):
 
 
21
  return "検査結果がありません!"
22
  else:
23
  co = cohere.ClientV2(api_key=os.environ.get("COHERE_API_KEY"))
24
  res = co.chat(
25
  model="command-a-03-2025",
26
  messages=[
27
+ {
28
+ "role": "user",
29
+ "content": "これは"+state['final_email']+"さんのデータです。"+state['final_comment']+"を評価してください。生成された結果に基づいて"+final_email+"さんに送るスカウト提案メールも作ってください。答えは、必ず、評価結果とメー��の本文を日本語で返してください。",
30
+ }
31
  ],
32
  )
33
+
34
  data = res.message.content[0].text
35
  return data
36
+ #thiscomment = f"{final_email:}{comment}"
37
+ #return thiscomment
 
 
38
 
39
+ def evaluate_responses(email, programming, debugging, problem, problem_solving, project_experience, role, learning, learnt_skills):
40
+ state["final_email"] = email
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
 
42
+ # 簡易評価のためのメッセージ
43
+ records = f"""
44
+ ✨プログラミング言語について: {programming}
45
+ ✨デバッグ方法について: {debugging}
46
+ ✨最近解決した技術的な課題: {problem}
47
+ ✨プロジェクト問題解決方法について: {problem_solving}
48
+ ✨プロジェクト経験について: {project_experience}
49
+ ✨チームでの役割について: {role}
50
+ ✨新しい技術への学習意欲について: {learning}
51
+ ✨最近学んだ技術や知識について: {learnt_skills}
52
+ """
53
+ #co = cohere.ClientV2(api_key=os.environ.get("COHERE_API_KEY"))
54
+ co = cohere.ClientV2(api_key="RSX1N2Ei09hmdJQGcicCxQvkGsvwWT7gQbuYwPhI")
55
+ res = co.chat(
56
+ model="command-a-03-2025",
57
+ messages=[
58
+ {
59
+ "role": "user",
60
+ "content": """
61
+ {records}を「基準」に基づいて各項目の合計スコアを10段階で割り振って評価してください。答えは、必ず、「形式」で合計スコアのみを返してください。
62
+ 「基準」=価基準とポイント配分
63
+ 技術的な理解 (30%): 例えばプログラミング言語の知識やデバッグ能力を考慮。コード品質や問題解決能力が評価対象。
64
+ 問題解決能力 (25%): 技術的課題への対応スキルやアプローチ方法をチェック。現実的かつ効率的な解決策を出せるかどうか。
65
+ 実務経験 (20%): 過去のプロジェクト経験の内容や規模。実際の成果や役割が評価される。
66
+ 学習意欲 (15%): 新しい技術をどれだけ積極的に学び、適応しているか。最近学んだ知識がアピールポイント!
67
+ ソフトスキル (10%): チームワークやコミュニケーション能力。エンジニアの柔軟性や協力姿勢を評価。
68
+ 「形式」= {
69
+ "技術的な理解": 9,
70
+ "問題解決能力": 8.5,
71
+ "実務経験": 8,
72
+ "学習意欲": 9.5,
73
+ "ソフトスキル": 8.5,
74
+ "合計スコア": 8.63,
75
+ "スキルレベル": "Expert",
76
+ "説明": "技術力や問題解決能力、学習意欲が高くバランスの良いスキルセットを持っている。"
77
+ }
78
+ """,
79
+
80
+ }
81
+ ],
82
+ )
83
 
84
+ data = json.loads(res.message.content[0].text)
85
+
86
+ # Iterate over key-value pairs correctly
87
+ scores = []
88
+ comments = ""
89
+ for key, value in data .items():
90
+ comments += f"\n{key}: {value}\n"
91
+ scores.append(f"{key}: {value}")
92
+ #scores.append(value)
93
+
94
+ state["final_comment"] = comments
95
+ state["final_score"] = scores
96
+
97
+ final = res.message.content[0].text
98
+
99
+ #return comments,records
100
+ return records,scores
101
 
102
 
103
+ with gr.Blocks(css="footer {visibility: hidden;} #custom_button {width: 400px; margin: 0 auto; background-color: #E0E7FF;}", theme=gr.themes.Glass(), title="エンジニア・スキル評価") as inquery:
 
104
  state = gr.State({
105
  "final_email": "",
106
  "final_comment": "",
107
  "final_score": [],
108
  })
109
+
110
+ gr.Markdown("# エンジニアスキル評価質問フォーム")
111
+ gr.Markdown("エンジニアスキルを簡易評価するフォームです!")
112
+
113
+ with gr.Tab("アセスメント"):
114
+ gr.Markdown("# エンジニア・スキルの簡易評価")
115
+ gr.Markdown("質問フォームから各項目のスコアを抽出して評価します!")
116
 
117
+ with gr.Row():
118
+ display_button = gr.Button("簡易評価")
119
+
120
+ with gr.Row():
121
+ output = gr.Textbox(label="簡易評価", show_copy_button=True)
122
 
123
+ # ボタに関数を接続
124
+ display_button.click(fn=extract_scores, inputs=None, outputs=output)
125
+
126
+ with gr.Tab("エンジニアスキル評価質問フォーム"):
127
  # 入力フィールド
128
  with gr.Row():
129
+ email = gr.Textbox(label="電子メールを入力してください。", value="richardhuh0629@gmail.com")
130
 
131
  with gr.Row():
132
  lang = gr.Textbox(label="普段使用しているプログラミング言語は何ですか?、尚、経験年数を教えてください。",
133
+ value="Pythonが得意。スクリプト作成やデータ分析、機械学習まで幅広く活用している。")
 
134
  with gr.Row():
135
  debug_tools = gr.Textbox(label="コードのデバッグ方法やツールについて教えてください。",
136
+ value="よく使うのはpdb(Python Debugger)やVS Codeのデバッガ機能。エラー箇所を細かくチェックするのが好き。")
 
137
  with gr.Row():
138
  recent_problem = gr.Textbox(label="最近解決した技術的な課題を教えてください。どのようにアプローチしましたか?",
139
+ value="例えば、APIの連携でエラーが続発する問題があったとき、レスポンスをしっかりロギングしてパターンを分析、結果的にリクエストヘッダーを微調整して解決できた。")
 
140
  with gr.Row():
141
  project_approach = gr.Textbox(label="複雑なプロジェクトで課題が発生した場合、どう対処しますか?",
142
+ value="チーム内でブレインストーミングしてアイデアを出し合い、最良の解決策を選択するのが常套手段だと思っている。")
 
143
  with gr.Row():
144
  project_scale = gr.Textbox(label="過去に関わったプロジェクトの規模や内容を教えてください。",
145
+ value="人で取り組むものから、数十人規模の開発チームでクラウドシステム構築などをした経験もある。")
 
146
  with gr.Row():
147
  team_role = gr.Textbox(label="チームでどのような役割を果たしましたか?",
148
+ value="主にテクニカルリーダーとして、設計からレビューまでを担当。時には新人教育も。")
 
149
  with gr.Row():
150
  learning_methods = gr.Textbox(label="新しい技術を学ぶ際にどのような方法を取っていますか?",
151
+ value="実際に手を動かして試すのが一番。Tutorialやドキュメントを読みながらプロトタイプを作成。")
 
152
  with gr.Row():
153
  recent_learning = gr.Textbox(label="最近学んだ技術や知識は何ですか?",
154
+ value="最近は生成AIのモデルチューニング方法について学んだよ。これでさらに便利なプロジェクトが作れる。")
 
155
 
156
  # ボタンと出力フィールド
157
  with gr.Row():
 
161
  score = gr.Textbox(label="スコア")
162
 
163
 
164
+ submit_btn.click(evaluate_responses,
165
+ [email, lang, debug_tools, recent_problem, project_approach,
166
+ project_scale, team_role, learning_methods, recent_learning],
167
+ [result, score])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
168
 
169
  inquery.launch()