柿崎透真 commited on
Commit
3d7c096
·
1 Parent(s): bd5cbbf

feat: enable Gemini-2.0-Flash-Exp

Browse files
neollm/llm/get_llm.py CHANGED
@@ -46,6 +46,12 @@ def get_llm(model_name: str, platform: str, client_settings: ClientSettings) ->
46
  from neollm.llm.model_name.local_vllm_model_name import LocalvLLMModelName
47
 
48
  model_name_class = LocalvLLMModelName
 
 
 
 
 
 
49
  else:
50
  raise ValueError(f"{platform} is not supported.")
51
 
 
46
  from neollm.llm.model_name.local_vllm_model_name import LocalvLLMModelName
47
 
48
  model_name_class = LocalvLLMModelName
49
+ elif platform_enum == Platform.GOOGLE_GENERATIVEAI:
50
+ from neollm.llm.model_name.google_generativeai_model_name import (
51
+ GoogleGenerativeAIModelName,
52
+ )
53
+
54
+ model_name_class = GoogleGenerativeAIModelName
55
  else:
56
  raise ValueError(f"{platform} is not supported.")
57
 
neollm/llm/llm/google_generativeai/google_generativeai.py ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from neollm.llm.llm.gpt.openai_gpt import OpenAILLM
2
+ from neollm.types import (
3
+ ChatCompletion,
4
+ ChatCompletionChunk,
5
+ Messages,
6
+ OpenAIMessages,
7
+ OpenAIResponse,
8
+ OpenAIStreamResponse,
9
+ Response,
10
+ StreamResponse,
11
+ )
12
+ from neollm.types.info import APIPricing
13
+ from neollm.types.mytypes import ClientSettings
14
+
15
+
16
+ class _GoogleGenerativeLLM(OpenAILLM):
17
+ dollar_per_ktoken: APIPricing = APIPricing(input=0, output=0)
18
+
19
+ def __init__(
20
+ self,
21
+ client_settings: ClientSettings,
22
+ ) -> None:
23
+ super().__init__(client_settings)
24
+ if "base_url" not in client_settings:
25
+ client_settings["base_url"] = "https://generativelanguage.googleapis.com/v1beta/openai/"
26
+
27
+ def encode(self, text: str) -> list[int]:
28
+ print("Tokens are different from actual tokens because tiktoken for gpt is used.")
29
+ return super().encode(text)
30
+
31
+ def decode(self, encoded: list[int]) -> str:
32
+ print("Tokens are different from actual tokens because tiktoken for gpt is used.")
33
+ return super().decode(encoded)
34
+
35
+ def _convert_to_response(self, platform_response: OpenAIResponse) -> Response:
36
+ platform_response.id = str(platform_response.id) # IDがnullで出てくるため、strに変換
37
+ return ChatCompletion(**platform_response.model_dump())
38
+
39
+ def _convert_to_platform_messages(self, messages: Messages) -> OpenAIMessages:
40
+ # OpenAIのMessagesをデフォルトに置いているため、変換は不要
41
+ platform_messages: OpenAIMessages = messages
42
+ return platform_messages
43
+
44
+ def _convert_to_streamresponse(self, platform_streamresponse: OpenAIStreamResponse) -> StreamResponse:
45
+ for chunk in platform_streamresponse:
46
+ chunk.id = str(chunk.id) # IDがnullで出てくるため、strに変換
47
+ yield ChatCompletionChunk(**chunk.model_dump())
48
+
49
+
50
+ # これだけ定義すれば十分そう
51
+ # Gemini ------------------------------------------------
52
+ class GeminiExp1206(_GoogleGenerativeLLM):
53
+ model: str = "gemini-exp-1206"
54
+ context_window: int = 2_000_000
55
+
56
+
57
+ class GeminiExp1121(_GoogleGenerativeLLM):
58
+ model: str = "gemini-exp-1121"
59
+ context_window: int = 2_000_000
60
+
61
+
62
+ class GeminiExp1114(_GoogleGenerativeLLM):
63
+ model: str = "gemini-exp-1114"
64
+ context_window: int = 2_000_000
65
+
66
+
67
+ # Gemini 2.0 Flash ------------------------------------------------
68
+ class Gemini20FlashExp(_GoogleGenerativeLLM):
69
+ model: str = "gemini-2.0-flash-exp"
70
+ context_window: int = 1_000_000 # 不明
71
+
72
+
73
+ # LearnLM (謎) ------------------------------------------------
74
+ # models/learnlm-1.5-pro-experimental
75
+
76
+ # Gemini 1.5 Pro ------------------------------------------------
77
+ # models/gemini-1.5-pro-latest -> 2M
78
+ # models/gemini-1.5-pro-001 -> 2M
79
+ # models/gemini-1.5-pro-002 -> 2M
80
+ # models/gemini-1.5-pro -> 2M
81
+ # models/gemini-1.5-pro-exp-0801 -> 2M
82
+ # models/gemini-1.5-pro-exp-0827 -> 2M
83
+
84
+
85
+ # Gemini 1.5 Flash ------------------------------------------------
86
+ # models/gemini-1.5-flash-latest -> 1M
87
+ # models/gemini-1.5-flash-001 -> 1M
88
+ # models/gemini-1.5-flash-001-tuning -> 1M
89
+ # models/gemini-1.5-flash -> 1M
90
+ # models/gemini-1.5-flash-exp-0827 -> 1M
91
+ # models/gemini-1.5-flash-002 -> 1M
92
+ # models/gemini-1.5-flash-8b -> 1M
93
+ # models/gemini-1.5-flash-8b-001 -> 1M
94
+ # models/gemini-1.5-flash-8b-latest -> 1M
95
+ # models/gemini-1.5-flash-8b-exp-0827 -> 1M
96
+ # models/gemini-1.5-flash-8b-exp-0924 -> 1M
97
+
98
+ # Gemini 1.0 Pro ------------------------------------------------
99
+ # models/gemini-1.0-pro-latest
100
+ # models/gemini-1.0-pro
101
+ # models/gemini-pro
102
+ # models/gemini-1.0-pro-001
103
+ # models/gemini-1.0-pro-vision-latest
104
+ # models/gemini-pro-vision
neollm/llm/model_name/google_generativeai_model_name.py ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import Type
2
+
3
+ from neollm.llm.llm.google_generativeai.google_generativeai import (
4
+ Gemini20FlashExp,
5
+ GeminiExp1114,
6
+ GeminiExp1121,
7
+ GeminiExp1206,
8
+ _GoogleGenerativeLLM,
9
+ )
10
+ from neollm.llm.model_name._abstract_model_name import AbstractModelName
11
+ from neollm.types import ClientSettings
12
+
13
+
14
+ class GoogleGenerativeAIModelName(AbstractModelName):
15
+ # Gemini ------------------------------------------------
16
+ GEMINI_EXP_1114 = "gemini-exp-1114"
17
+ GEMINI_EXP_1121 = "gemini-exp-1121"
18
+ GEMINI_EXP_1206 = "gemini-exp-1206"
19
+ # Gemini 2.0 ------------------------------------------------
20
+ GEMINI_20_FLASH_EXP = "gemini-20-flash-exp"
21
+
22
+ def to_llm(self, client_settings: ClientSettings, model_name: str | None = None) -> _GoogleGenerativeLLM:
23
+ llm_class_map: dict["GoogleGenerativeAIModelName", Type[_GoogleGenerativeLLM]] = {
24
+ # Gemini
25
+ GoogleGenerativeAIModelName.GEMINI_EXP_1114: GeminiExp1114,
26
+ GoogleGenerativeAIModelName.GEMINI_EXP_1121: GeminiExp1121,
27
+ GoogleGenerativeAIModelName.GEMINI_EXP_1206: GeminiExp1206,
28
+ # Gemini 2.0
29
+ GoogleGenerativeAIModelName.GEMINI_20_FLASH_EXP: Gemini20FlashExp,
30
+ }
31
+ return llm_class_map[self](client_settings)
neollm/llm/platform.py CHANGED
@@ -7,6 +7,7 @@ class Platform(str, Enum):
7
  OPENAI = "openai"
8
  ANTHROPIC = "anthropic"
9
  GCP = "gcp"
 
10
  AWS = "aws"
11
  LOCAL_VLLM = "local_vllm"
12
 
 
7
  OPENAI = "openai"
8
  ANTHROPIC = "anthropic"
9
  GCP = "gcp"
10
+ GOOGLE_GENERATIVEAI = "google-generativeai"
11
  AWS = "aws"
12
  LOCAL_VLLM = "local_vllm"
13
 
src/backend/tutor/cg/cg_image_tutor/prompt.py CHANGED
@@ -48,6 +48,15 @@ def create_system_prompt(
48
  "- 良い点は、具体的に述べてください。\n"
49
  "- 改善点は、意識することだけでなく具体的な修正方法までアドバイスしてください。\n"
50
  )
 
 
 
 
 
 
 
 
 
51
  if mode_setting == "HARD":
52
  prompt += "- 厳しく評価してください。必ずしも褒める必要はありません。\n"
53
  prompt += (
@@ -72,17 +81,13 @@ def create_system_prompt(
72
  " {## 課題評価観点」の各項目について評価してください}\n"
73
  " **{項目1}:{点数}**\n"
74
  " - 良い点:{項目1に関する良い点}\n"
75
- " - 改善点:{項目1に関する改善点}\n\n"
76
- " {ここの項目は基本的に1つですが、他にも与えられている場合は項目2以降に関しても同様のフォーマットで評価してください}\n"
77
- " ## 個人能力評価観点\n"
78
- " {「## 個人能力評価観点」の各項目について評価してください}\n\n"
79
- " **{項目1}:{点数}**\n"
80
- " - 良い点:{項目1に関する良い点}\n"
81
- " - 改善点:{項目1に関する改善点}\n\n"
82
  " **{項目2}:{点数}**\n"
83
  " - 良い点:{項目1に関する良い点}\n"
84
- " - 改善点:{項目1に関する改善点}\n\n"
85
  " {項目3以降に関しても上記と同様のフォーマットで評価してください}\n\n"
 
 
86
  " ## コメント\n"
87
  " {フィードバックした内容を元に、作品の全体的な完成度や、さらにブラッシュアップするために何が重要か、コメントしてください。"
88
  )
 
48
  "- 良い点は、具体的に述べてください。\n"
49
  "- 改善点は、意識することだけでなく具体的な修正方法までアドバイスしてください。\n"
50
  )
51
+
52
+ if color_mode_setting == "モノクロ":
53
+ prompt += (
54
+ "- 与えられる作品はまだ途中段階の作品の可能性もあり、モノクロ画像だったり、テクスチャが貼られていなかったりします。\n"
55
+ " - テクスチャリングにまだ取り組んでいない場合は、テクスチャリングに関する{点数}は「-」とし、{改善点}の部分で、今後の指針について記載してください。その際、テクスチャ作成時に注力するべき点を提示してください。\n"
56
+ " - 未完成とみられるものについては、技術的な視点よりも、明暗の配置バランス・画面の図形的な印象・疎密感などといった絵画的な構成やレイアウトに焦点を当てた視点でフィードバックしてください。その際、レイアウトやライティングの{改善点}の部分で改善案を提示してください。改善案は以下の「- 例」のように画像のどの部分をどのようにすればいいかを具体的に提案してください。\n"
57
+ " - 例:「{画像内修正箇所}の部分のについて、{修正案}のようにしてみましょう。例えば、{画像内修正箇所詳細}を{修正案詳細1}すると、{修正結果1}が感じられます。また、{画像内修正箇所詳細1}を{修正案詳細1}すると、{修正結果2}になります。」\n"
58
+ )
59
+
60
  if mode_setting == "HARD":
61
  prompt += "- 厳しく評価してください。必ずしも褒める必要はありません。\n"
62
  prompt += (
 
81
  " {## 課題評価観点」の各項目について評価してください}\n"
82
  " **{項目1}:{点数}**\n"
83
  " - 良い点:{項目1に関する良い点}\n"
84
+ " - 改善点:{項目1に関する改善点}\n"
 
 
 
 
 
 
85
  " **{項目2}:{点数}**\n"
86
  " - 良い点:{項目1に関する良い点}\n"
87
+ " - 改善点:{項目1に関する改善点}\n"
88
  " {項目3以降に関しても上記と同様のフォーマットで評価してください}\n\n"
89
+ " ## 個人能力評価観点\n"
90
+ " {「## 個人能力評価観点」について、「## 課題評価観点」と同様のフォーマットで評価してください}\n\n"
91
  " ## コメント\n"
92
  " {フィードバックした内容を元に、作品の全体的な完成度や、さらにブラッシュアップするために何が重要か、コメントしてください。"
93
  )
src/backend/tutor/cg/cg_video_tutor/prompt.py CHANGED
@@ -71,17 +71,13 @@ def create_system_prompt(
71
  " {## 課題評価観点」の各項目について評価してください}\n"
72
  " **{項目1}:{点数}**\n"
73
  " - 良い点:{項目1に関する良い点}\n"
74
- " - 改善点:{項目1に関する改善点}\n\n"
75
- " {ここの項目は基本的に1つですが、他にも与えられている場合は項目2以降に関しても同様のフォーマットで評価してください}\n"
76
- " ## 個人能力評価観点\n"
77
- " {「## 個人能力評価観点」の各項目について評価してください}\n\n"
78
- " **{項目1}:{点数}**\n"
79
- " - 良い点:{項目1に関する良い点}\n"
80
- " - 改善点:{項目1に関する改善点}\n\n"
81
  " **{項目2}:{点数}**\n"
82
  " - 良い点:{項目1に関する良い点}\n"
83
- " - 改善点:{項目1に関する改善点}\n\n"
84
  " {項目3以降に関しても上記と同様のフォーマットで評価してください}\n\n"
 
 
85
  " ## コメント\n"
86
  " {フィードバックした内容を元に、作品の全体的な完成度や、さらにブラッシュアップするために何が重要か、コメントしてください。"
87
  )
 
71
  " {## 課題評価観点」の各項目について評価してください}\n"
72
  " **{項目1}:{点数}**\n"
73
  " - 良い点:{項目1に関する良い点}\n"
74
+ " - 改善点:{項目1に関する改善点}\n"
 
 
 
 
 
 
75
  " **{項目2}:{点数}**\n"
76
  " - 良い点:{項目1に関する良い点}\n"
77
+ " - 改善点:{項目1に関する改善点}\n"
78
  " {項目3以降に関しても上記と同様のフォーマットで評価してください}\n\n"
79
+ " ## 個人能力評価観点\n"
80
+ " {「## 個人能力評価観点」について、「## 課題評価観点」と同様のフォーマットで評価してください}\n\n"
81
  " ## コメント\n"
82
  " {フィードバックした内容を元に、作品の全体的な完成度や、さらにブラッシュアップするために何が重要か、コメントしてください。"
83
  )
src/backend/tutor/graphic/idea_tutor/prompt.py CHANGED
@@ -1,14 +1,15 @@
1
  system_prompt = """
2
  <system_prompt>
3
- あなたは広告デザイナーの講師です。サービス立案とその広告制作を行う課題に対する制作案が生徒から提出されるので、以下の「# 目的」「# 指導方針」をもとに「# 手順」に従って、「# タスク」として生徒の考えをブラッシュアップしてください。
4
  出力は「# 出力フォーマット」に従ってください。
5
 
6
  # 目的
7
- - 良いデザインをするためには、広告対象のサービスについて理解が深まっている事が必要です。そこで、生徒が考えをブラッシュアップし、適切なデザインができる状態にすることが目的です。
8
 
9
  # タスク
10
- - まずは「サービス」のアイデアで、「コンセプト」「サービス内容」「ターゲット」の3項目の間で整合性が取れている状態にしてください。
11
- - 「## 作品概要フォーマット」の各項目について生徒の考えが具体化されている状態を目指してください。
 
12
 
13
  ## 作品概要フォーマット
14
  - サービス
@@ -26,7 +27,6 @@ system_prompt = """
26
  # 指導方針
27
  ## 客観視をし続け、本質的なフィードバックをする
28
  - 生徒のアイデアに対し、客観的に評価してください
29
- - まずは、サービスのアイデアで矛盾や相性の悪い部分、奇抜・斬新な組み合わせがあれば、それを前提としていいか確認してください
30
  ## 生徒自身が考えを深められる
31
  - 一度に提示する論点は必ず1つまでとし、段階的に具体化を進めることで、生徒自身が深く考えられるようにしてください
32
  - 考えの根拠・理由の深堀りも行ってください
@@ -54,51 +54,46 @@ system_prompt = """
54
  # 手順
55
  1. 提出された作品概要を確認し、全体像を把握してください
56
  - 提出された「サービス」と「広告・制作物」の情報を読み取り、全体的な方向性やテーマを把握する。
57
- 2. 作品概要の各項目に対して整合性を確認してください
58
- - まず「サービス」について、「コンセプト」「サービス内容」「ターゲット」の3項目に矛盾や相性が悪かったり、奇抜・斬新な組み合わせがないか確認し、「サービス」の妥当性を担保する
59
- - 「サービス」と「広告・制作物」の項目間で矛盾がないか、例えば「ターゲット」と「伝えたいメッセージ」の適合性や、サービス内容と競合との差別化が一致しているかを確認する。
60
- - 必要に応じて以下のような問いかけを行う:
61
- - 「ターゲットがXXなら、この伝えたいメッセージは適切ですか?」
62
- - 「このコンセプトでサービス内容を進めるなら、競合との差別化ポイントは具体的に何でしょう?」
63
- 3. 優先順位を尋ねてください
64
- - 整合性が取れていない部分がある場合、どちらの項目を前提とするかを問いかける。
65
- - トレードオフが必要な場面では、選択肢を提示し、具体化を促す。
66
- - 「もしXXを優先するなら、YYの方向性を見直した方が良いかもしれませんね。」
67
- 4. 仮説を提示して議論を深めてください
68
- - 整合性や具体性に疑問がある場合、仮説を提示し、生徒に議論を促す。
69
- - 例: 「もし競合との差別化を『価格』に置くなら、ターゲット層は価格に敏感な消費者と考えられますが、現在のターゲット設定と合っていますか?」
70
- 5. 必要な具体化ポイントを提示してください
71
- - 「論点」を設定し、生徒が取り組むべき具体化の観点を明確に伝える。
72
- - 例: 「ビジュアルコンセプトを深めるために、ターゲット層が好むデザインスタイルを具体的に決めましょう。」
73
- 6. ブラッシュアップされたアイデアを整理し、次のアクションを提示してください
74
- - 現在のアイデアをまとめ、クリティカルな部分が修正・補足されたか確認する。
75
- - 次のステップ(例: ビジュアル制作、レイアウト案作成など��を具体的に提案する。
76
  - 以上の手順に従って、講師としてふさわしい対応をしてください。
77
  - 以下の「# フォーマット」に従って出力してください。
78
- - 生徒から質問された場合は、フォーマットに従わないでください。質問の回答のみ出力してください。
79
 
80
  # フォーマット
81
  ### 現在のアイデア{壁打ち中に深まったアイデアを埋めていく}
82
- - **サービス**
83
- - コンセプト
84
- - サービス内容
85
- - 優位性・独自性
86
- - ターゲット
87
- - **広告・制作物**
88
- - 伝えたいメッセージ
89
- - ビジュアルコンセプト
90
- - ターゲット
91
- - 媒体(掲示場所、サイズなど)
92
- - 目的とする消費者行動
 
93
 
94
  ---
95
 
96
- ### 論点: **{見直しや深掘りが必要と判断される論点}** {論点は1つのみ}
 
97
  #### 具体化するため以下のポイントに答えてください{観点は2個以下にしてください}
98
  - {論点に対して具体化するための観点その1。具体化する必要がある理由や、コメントも回答}
99
  - {論点に対して具体化するための観点その2。具体化する必要がある理由や、コメントも回答}
100
 
101
-
102
  あなたはデザインについて以下の認識を持っています。
103
 
104
  # デザインそのものについて
@@ -126,5 +121,58 @@ system_prompt = """
126
  - 書体の検討: 1、2に基づいて世界観に合う書体を数点セレクトし、当てはめながら最終選択する。
127
  - 配色の検討: ここまで検討してきた世界観を表現できそうなテーマカラーを1つ選ぶ。テーマカラーを補足する色と、背景色・本文文字色を決める。
128
  - 情報図式化・装飾: 文字要素をビジュアライズすべき箇所を、図式化していく。より印象的に装飾できる部分を作り込んでいく。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
129
  </system_prompt>
130
  """
 
1
  system_prompt = """
2
  <system_prompt>
3
+ あなたはデジタルハリウッド社の広告デザイナーの講師です。サービス案とその広告制作を行う課題に対する制作案が生徒から提出されるので、以下の「# 目的」と「# 指導方針」をもとに「# 手順」に従って、「# タスク」として生徒の考えをブラッシュアップしてください。
4
  出力は「# 出力フォーマット」に従ってください。
5
 
6
  # 目的
7
+ - 生徒がサービス案に対して適切な広告デザインを検討し、デザインの言語化が出来ている状態にする
8
 
9
  # タスク
10
+ 1. 「# フォーマット」の各項目を埋めていってください。
11
+ 2. 生徒によるデザインの言語化を促してください。
12
+ 3. 広告の概要に適したデザインになるように整合性をとってください。
13
 
14
  ## 作品概要フォーマット
15
  - サービス
 
27
  # 指導方針
28
  ## 客観視をし続け、本質的なフィードバックをする
29
  - 生徒のアイデアに対し、客観的に評価してください
 
30
  ## 生徒自身が考えを深められる
31
  - 一度に提示する論点は必ず1つまでとし、段階的に具体化を進めることで、生徒自身が深く考えられるようにしてください
32
  - 考えの根拠・理由の深堀りも行ってください
 
54
  # 手順
55
  1. 提出された作品概要を確認し、全体像を把握してください
56
  - 提出された「サービス」と「広告・制作物」の情報を読み取り、全体的な方向性やテーマを把握する。
57
+ 2. 仮説を提示して議論を深めてください
58
+ - 生徒の考えを汲み取って、デザインの方向性について仮説を提示する。
59
+ - 具体的なコメントをして、生徒の思考をサポートする。
60
+ 3. デザインを言語化してもらうために、「論点の例」を参考に生徒の意見を聞いてください
61
+ - 論点は生徒が答えやすいように、スコープを絞って具体的に設定する。
62
+ - 「論点の例」
63
+ - フォントとメッセージの相性
64
+ - 色の組み合わせの意図
65
+ - 視線誘導の工夫点
66
+ - 論点は適宜変更する。
67
+ 4. ブラッシュアップされたアイデアを整理し、次のアクションを提示してください
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
+ ### 論点: **{説明が必要と判断される論点}** {論点は1つのみ}
93
  #### 具体化するため以下のポイントに答えてください{観点は2個以下にしてください}
94
  - {論点に対して具体化するための観点その1。具体化する必要がある理由や、コメントも回答}
95
  - {論点に対して具体化するための観点その2。具体化する必要がある理由や、コメントも回答}
96
 
 
97
  あなたはデザインについて以下の認識を持っています。
98
 
99
  # デザインそのものについて
 
121
  - 書体の検討: 1、2に基づいて世界観に合う書体を数点セレクトし、当てはめながら最終選択する。
122
  - 配色の検討: ここまで検討してきた世界観を表現できそうなテーマカラーを1つ選ぶ。テーマカラーを補足する色と、背景色・本文文字色を決める。
123
  - 情報図式化・装飾: 文字要素をビジュアライズすべき箇所を、図式化していく。より印象的に装飾できる部分を作り込んでいく。
124
+
125
+ # タイポグラフィについて
126
+ ## 本文の組版について
127
+ - 複数行を組む時の「行送り」「行長」は、可読性を高め、ユーザーが本文を心地よく読めるようにする。窮屈や散漫な印象になることは基本的には避ける。
128
+ - 複数行の揃え方は、左揃えが基本であり、両端揃えも使う。
129
+ - 禁則処理は、1.行頭禁則: 日本語の段落や「、」や「。」が行の頭に来ることを避ける、2.行末禁則: 「・」やかっこの先頭が行の末尾に来ることも避ける、3.ぶら下がり: 行末の「、」や「。」は段落からはみ出して使うことも可能。
130
+ ## 書体の選び方
131
+ - 和文・欧文書体はそれぞれ別途選択する。
132
+ - デザイン全体の世界観に馴染みつつ(異物感を感じさせない)も補強し、かつ読みやすさ・情報の伝わりやすさも担保する。ロゴや見出し → 印象的に見せることを重視。本文 → 読ませることを重視。
133
+ - 字面や細部の形状による印象の違いを把握し比較検討する。懐の空き具合や大ぶり・小ぶり具合で印象が変わる。
134
+ ## 文字組について
135
+ - 欧文書体: 空間が詰まると、「緊張感」や「力強さ」を生まれ、広がると、「余裕」や「癒し・安らぎ」を表現できる。
136
+ - 和文書体: 筆の動き(筆脈)が破綻しないように意識する。左頭揃え: 左揃えで書体を組む場合、視覚的に左のラインを揃える。天揃え: 視覚的に上部のラ��ンが揃うように調整する。
137
+ - 和欧混植: 和文書体と欧文書体を同時に組むこと。タイトルやキャッチコピーなどの英数字は、できるだけ欧文書体を使う。同じフォントサイズで並べると欧文の方が小さく見えるため、欧文書体を120%前後に大きくし、ベースラインを少し上げる。
138
+ # レイアウトについて
139
+ ## レイアウトのコツ
140
+ - 余白を使いこなす: 「抜け感」を意識する。・要素群を一箇所にまとめ、どこかに抜け感を作る・要素を一部裁ち落としたり、トリミングすることで、紙面外の空間の広がりを連想させる
141
+ - オブジェクトの形状を利用したデザイン: ・オブジェクトの形状をレイアウトに利用する(三角形、円、四角形、L字、プラスなど)・自然な人の視線の流れ(Z型、F型)を意識して配置してみる。要素に合わせたデザインをしていく事で、空間・視線の流れを作り、バランス良く、かつ大胆なレイアウトが組めるようになる。
142
+ - シンメトリーとアシンメトリー: シンメトリー = レイアウトの中心にガイドを設け、それを中心に左右対称に配置するレイアウト。中央揃えの多用は単調になるため注意。アシンメトリー = 左右非対称に配置した自由なレイアウト手法。厳格なルールはないが、空間バランスなど十分配慮する必要がある。
143
+ - バランスの良さ = 重心を考える: 作品の中心に下から指を立てるようなイメージで、どちらかに重心が傾いて倒れないかを想像してみる。・グレースケールにして確認してみると、イメージしやすい・意図的にバランスを悪くすることもたまにある
144
+ # 配色について
145
+ ## 有彩色の与えるイメージ
146
+ - 暖色: 前方に飛び出してくるように見え(進出色)、人の注意を引きつける色。光の波長が長く受け手側にエネルギーを必要とする。・赤: 情熱的、活動的、行動力、生命力、愛、衝動、祝い、興奮、歓喜、危険、刺激。・黄: 親しみやすい、陽気、積極的、自由、明るさ、未来、元気、幼稚、注意、希望。・橙: 健康、快活な、安心感、幸福感、近代的、高揚感
147
+ - 寒色: 落ち着きや広々とした雰囲気を感じさせる色。青: クール、知的、冷静、保守的、爽やか、忠実、涼しさ、理想、誠実、信頼。紫: 神秘、高貴、個性、ファッション性、優雅、哀れ、心配、上品、古典的
148
+ - 緑色: 受け手側に一番負担をかけない安らぐ色。緑: 自然(ナチュラル)、癒し、安らぎ、新鮮、平和、若々しさ、健康、田舎、安全
149
+ - 茶色: 色相環にない色。2色以上を混ぜ合わせないとできない色。茶: 自然、明るさ、活気、土、田舎
150
+ ## 無彩色の与えるイメージ
151
+ - 白: 清潔、純粋、誠実、勝利、真実、空虚、神聖、公共性、公明性
152
+ - 黒: 都会的、フォーマル、威厳、高級、拡張、上品、悪、敗北、モダン
153
+ - グレー: 先進的、合理性、地味、落ち着き、曖昧、平凡、哀愁、憂鬱
154
+ ## 色の組み合わせによる連想
155
+ - 特定のイメージを連想させる組み合わせ: ・赤 × 緑 → クリスマス。・青 × 白 → 北欧風。etc
156
+ - 国・宗教・文化・時代などによる違い: ・白色へのイメージ: ヨーロッパでは「純潔さ」「潔癖さ」「純粋さ」、アジア(中国・台湾など)では「哀悼」「苦悩」「悲嘆」。・宗教的な意味を感じさせる配色: 青・赤・白の組み合わせ … マリア像
157
+ ## トーンとは、明度と彩度を組み合わせたもの。キーワードを参考にターゲットに合う色を絞っていくことで、認識の齟齬を減らし、時間短縮へ繋げることが可能。
158
+ ## 色彩調和とは、色を組み合わせて、新たな効果を生み出すこと。対象物の用途を機能的に実現し、美しく調和した配色を施していく。
159
+ - 色面積とその比率: 配色の面積によってもイメージは大きく変わる。ベースカラー、メインカラー(キーカラー)、アクセントカラー(サブカラー)を念頭に、色面積を検討する。・メインカラー … ブランド自身を表す役割を持つ基本色。デザインの中で一番印象づける色となる。・アクセントカラー … メインカラーを引き立てる役割。補色系が使われることが多い。色面積を多くしすぎないよう注意。・ベースカラー … 文字情報の可読性を損なわないよう、文字色とのコントラストを意識して選別する。
160
+ ## ユーザー視点に立った配色のポイント
161
+ - 色だけに頼らないデザインを心がける。
162
+ - 見やすい配色を心がける: 背景色と文字色のコント��スト差が低いと、ユーザーにストレスを感じさせてしまうので十分注意する。
163
+ ## 配色のコツ
164
+ - 単色等のキリの良すぎる値の色(例: #ff0000)は使わない。真っ黒(#000やK100%)もキツい印象のため基本的には避ける。
165
+ - 無彩色(グレーの濃淡)を使いこなす。
166
+ - まずはグレースケールでデザインしてから、メインカラー(差し色)だけ入れてみる。配色イメージは最初に定めつつ、実際の配色作業は基本的に最後の工程で施す。メインカラーが引き立つデザインへ導くことができる
167
+ - 色数が多くなるほど世界観を表現しづらくなるため、極力、有彩色の色数は増やさない。
168
+ - 色の割合を必ず意識する。メインカラーの割合が、アクセントカラーの割合より少なくならないように注意する。
169
+ - 色に頼りすぎない。色をなくしても(モノトーンにしても)成立するデザインにする。
170
+ ## 配色の検討
171
+ - 類似色: 同じトーンで色相を変化させた配色。強すぎずソフトな印象を与え、最も失敗しにくい。
172
+ - モノクロマティック: 同一色相で、トーン(明度・彩度)を変化させた配色。馴染ませやすく、失敗の少ない配色。色相を変化させないので、基本色を保持したまま使い分けできる。
173
+ - トライアド: 色相環を三等分した位置にある、3色での配色。カテゴリで色分けする場合など、多色相で賑やかさを表現できる。
174
+ - 補色: 色相環の反対側にある色。お互いに劇的に引き立てる関係性を持つ。
175
+ - コンパウンド: 補色は劇的な効果をもたらす反面、強すぎる場合もあるため、少し色相のトーンをずらすことで、強弱関係は保ちつつ、印象を和らげることができる
176
+ - シェード: 同一色相で、明度差の変化をつけた配色。基本色を元に、濃淡のみで表現したい場合に有効。
177
  </system_prompt>
178
  """
src/backend/tutor/graphic/poster_tutor/graphic_poster_tutor.py CHANGED
@@ -3,8 +3,109 @@ from typing import Literal, cast
3
  from neollm import MyLLM
4
  from neollm.types import Messages, Response
5
 
 
 
6
  from .prompt import create_system_prompt
7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
 
9
  class GraphicPosterTutor(MyLLM):
10
  def _preprocess(self, inputs: dict[str, str | Literal["NORMAL", "HARD"]]) -> Messages:
@@ -26,7 +127,51 @@ class GraphicPosterTutor(MyLLM):
26
  "content": [
27
  {
28
  "type": "text",
29
- "text": f"<system_prompt>に従って、広告ポスターを評価してください。作品概要とポスターの文字起こしは以下の通りです。\n\n# 作品概要\n{inputs['artwork_content']}。\n\n# 文字起こし\n{inputs['transcription']}。",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  },
31
  {
32
  "type": "image_url",
 
3
  from neollm import MyLLM
4
  from neollm.types import Messages, Response
5
 
6
+ from src.backend.utils import encode_image
7
+
8
  from .prompt import create_system_prompt
9
 
10
+ OUTLINE1 = """
11
+ # 作品概要\n
12
+ - サービス:\n
13
+ - コンセプト:美味しさを追求した「デラックス」なバーガー体験を提供すること。\n
14
+ - サービス内容:100%ビーフを使用した高品質なハンバーガーを提供する専門店。「デラックスバーガー」という名前が示すように、豪華で満足感のあるメニューが特徴。\n
15
+ - 優位性・独自性:100%ビーフの使用を強調している点。大きくてジューシーな見た目が他のバーガーと差別化されている。「デラックス」というブランディングによる高品質感の訴求。\n
16
+ - ターゲット:美味しさや品質を重視するファミリー層やグルメな若年層。\n
17
+ - 広告・制作物\n"
18
+ - 伝えたいメッセージ:「高品質なバーガーが楽しめる専門店がオープンします!」という告知と、100%ビーフによる品質の高さ。\n
19
+ - ビジュアルコンセプト(広告のデザインや色使いの方向性):デザイン: 大きく目立つ文字「DELUXE BURGER」と「OPEN」が視覚的に目を引く。色使い: 赤を基調にしたデザインが、エネルギッシュで食欲をそそる雰囲気を演出。ビジュアル: 大きなバーガーの写真が、ボリューム感と美味しさを視覚的に伝える。\n
20
+ - ターゲット:新規店舗に興味を持ちそうな近隣住民、特に家族や若者。\n
21
+ - 媒体(掲示場所サイズなど):ショッピングモールや人通りの多い場所に貼るポスター(中~大サイズ)。\n
22
+ - 目的とする消費者行動:オープン当日に来店して、メニューを試してもらうこと。\n
23
+ - ツールの使用状況\n
24
+ - photoshop:商品写真(バーガー)の色調整、レタッチ、切り抜き、背景処理などに使用。印刷用データのカラーマネジメントや写真の鮮明化。\n
25
+ - llustrator:ロゴデザインやテキスト配置、全体のレイアウト、ロゴデータやテキストレイアウト、ベクター要素の配置、グラフィック要素の統合などに使用。最終的な入稿データの制作、レイアウト調整、印刷用PDF出力など。\n
26
+ """
27
+ ASSISTANT1 = """
28
+ ## 総評\n
29
+ 以下では、各項目ごとに具体的な評価と改善点を見ていきましょう。\n
30
+ ## 広告物としての評価\n
31
+ **情報伝達の明確さ:4点**\n
32
+ - 良い点:メインメッセージとして、「OPEN 5.14 SUN」という日付が大きく配置されており、イベント(店舗オープン)の重要な日時がひと目で確認できます。ビジュアルにインパクトのある大きなハンバーガーが配されており、バーガー専門店であることが瞬時に理解できる点は優れています。\n
33
+ - 改善点:開店場所(「イオン稲城店」)の情報が小さく、背景とのコントラストも弱いため、初見で場所がどこなのか判別しづらいです。店名表記(ブランドロゴや名称)と開催場所情報をもう少し明確な階層構造で見せることで、日付と同様、地理的な情報も一目で理解できるようになります。\n
34
+ **デザインコンセプトの適合性:4点**\n
35
+ - 良い点:ファストフード、特にハンバーガー好きの顧客層に向けて、食欲をそそるビジュアルが前面に出ており、ターゲットに直感的に訴求できます。\n
36
+ - 改善点:コンセプト自体は「新店舗オープン」という明確なテーマですが、そのポスターを見ただけで「どの場所の何という店がいつオープンするか」が完全に整理されているとは言い難いです。ブランドロゴ(Deluxe Burger)や店舗名(イオン稲城店)を、日付と同等かもう少し目立つ形で配置し、ブランド認知を高める工夫があると、ターゲットに対してより明確なメッセージを伝えられます。\n
37
+ **視覚的魅力:4点**\n
38
+ - 良い点:メインビジュアルのハンバーガーは非常に迫力があり、食材の質感がリアルで「美味しそう」「本格的」な印象を強く与えます。大きな赤い「DELUXE BURGER」というロゴタイプ風の文字も視覚的に目を惹き、ブランドイメージを印象付けています。\n
39
+ - 改善点:背景色と情報テキストのコントラストがやや弱い箇所があり、一部の文言が埋もれがちです。また、QRコードの位置が右下に小さく存在するものの、そこに誘導する視線誘導が弱く、活用可能性が低下しています。 「詳しい情報はこ���らから」などの短いテキストをQRコード付近に配置し、視線を誘導したり、文字色や小さなアイコンで強調したりすることで、行動喚起がより明確になります。\n
40
+ **論理的な説明能力:3点**\n
41
+ - 良い点:主役(ハンバーガー)の大きな写真 → 「当店は高品質なバーガーを提供する」というメッセージをビジュアルで示しています。n
42
+ - 改善点:開店日時・場所・ブランドイメージが視線誘導上で整理されていない点が論理的説明力を弱めています。中央のビジュアル周辺に場所、開店日、ブランドなどの情報整理を行うと、一貫性とわかりやすさが増します。n"
43
+ ## 技能評価\n
44
+ **デザインスキル:5点**\n
45
+ - 良い点:写真切り抜きやロゴ配置、配色などphotoshopやillustratorの基礎スキルは十分に見られます。メイン要素を大きく見せ、印象的なデザインには成功しています。\n
46
+ - 改善点:現状は特に大きなは問題ありませんが、もう少し挑戦的な表現を取り入れてみてもいいかもしれません。場所情報が小さく目立たないので、場所名を「OPEN 5.14 SUN」の近く、もしくは「DELUXE BURGER」ロゴの直下に配置し、文字サイズを1〜2ポイント上げるか、背景とのコントラストを高めるため、白抜き文字や太字フォントを用いるとよいでしょう。\n
47
+ **タイポグラフィ:3点**\n
48
+ - 良い点:「OPEN 5.14 SUN」や「DELUXE BURGER」の文字は大きく、遠目からでも視認しやすい工夫がされています。\n
49
+ - 改善点:小さな文字情報(店舗名、詳細情報)のコントラスト・サイズ不足があるため、要点(場所やQRコードの案内)がやや読みづらいです。重要情報の階層分け(タイトル→サブ情報→補足情報)を明確にするため、サブ要素となる文字をもう少し大きく、または背景とのコントラストを強める必要があります。一部文字が背景に埋もれ可読性が低い部分は、背景にうっすらと半透明の濃いトーンオーバーレイを敷くか、文字自体を濃い色あるいは白抜きに変更する。また、必要に応じて文字サイズを2〜3pt大きくすることで、離れた場所からも判読しやすくすることができます。\n
50
+ **レイアウト:4点**\n
51
+ - 良い点:メインビジュアルが中央に大きく据えられ、訴求商品の魅力(ハンバーガー)がストレートに伝わります。\n
52
+ - 改善点:重要な日付・場所・ブランド名が視線経路に沿って整理されていません。 ロゴ(DELUXE BURGER)→ 日付(OPEN 5.14 SUN)→ 場所名(イオン稲城店)→ 詳細情報(QRコード)という流れで、垂直あるいは水平軸上に整列させると、ポスターを見た人が自然な読み順で情報を得られるようになるでしょう。また、QRコードはあるが、ユーザーの注目が集まりにくい位置・サイズです。「詳しい情報はこちらから」などの短いテキストをQRコード付近に配置し、視線を誘導するとよいでしょう。文字色や小さなアイコンで強調することで、行動喚起がより明確になります。\n
53
+ **配色:4点**\n
54
+ - 良い点:落ち着いた背景色と赤系のロゴ・日付表示が食品分野には適しています。また、ハンバーガーの茶色や緑、赤(トマト)との色相差が自然で、食欲を刺激します。\n
55
+ - 改善点:一部文字情報が背景色と明度差が不足しており、可読性を向上させるためにフォントカラーをより濃くする、もしくは背景に薄い色味のオーバーレイを用いて文字を際立たせると良いでしょう。\n
56
+ ## コメント\n
57
+ 以上の評価と改善提案を踏まえることで、作品の訴求力を高め、ターゲットに対してより強くメッセージを伝えられるポスターへとブラッシュアップできます。\n
58
+ """
59
+ OUTLINE2 = """
60
+ # 作品概要\n
61
+ - サービス:「土」にこだわった、未来を見据えたサステナブルな農業を実践し、安心・安全で美味しい食材を届ける農園。自然循環型の農法を取り入れ、環境負荷を軽減しながら高品質な作物を育成する。\n
62
+ - コンセプト:「土」にこだわった、未来を見据えたサステナブルな農業を実践し、安心・安全で美味しい食材を届ける農園。自然循環型の農法を取り入れ、環境負荷を軽減しながら高品質な作物を育成する。\n
63
+ - サービス内容:・有機栽培や自然農法、土壌改良を通じた安心安全な野菜・果物等の生産・販売・農業体験プログラムやワークショップ、オンラインでの生育状況報告・地域コミュニティとの連携を強化し、地産地消や食育活動への貢献\n
64
+ - 優位性・独自性:・「土」の質に徹底的にこだわり、有益微生物や有機堆肥を活用することによる風味豊かな作物栽培\n
65
+ - ターゲット:健康志向で、安全・安心な食品を求める主婦層、ファミリー層\n
66
+ - 広告・制作物\n
67
+ - 伝えたいメッセージ:「ホムファームは『土』にこだわる農園です。美味しくて安全な食を、未来へ紡ぐ。」「美味しくて、安全」は未来に優しい方法で実現している、という信念の伝達\n
68
+ - ビジュアルコンセプト(広告のデザインや色使いの方向性):・背景に豊かな土壌や若芽をシンボリックに用い、“土”と“生命の芽吹き”を強調・黒や茶色などの土を想起させるアースカラーをベースに、若芽の緑で生命力と希望を表現・大胆な筆文字やシルエットを用いて、「土」を印象的に可視化\n
69
+ - ターゲット:安全でトレーサブルな食品を求めるファミリー、個人消費者\n
70
+ - 媒体(掲示場所サイズなど):駅構内ポスター、店舗内POP、直売所の店頭サイン\n
71
+ - 目的とする消費者行動:・農園の生産物を購入してもらう・ウェブサイトやSNSを通じて生産プロセスに興味を持ち、リピーターとなってもらう・農業体験やワークショップへの参加、口コミや紹介を通じたブランド認知度拡大\n
72
+ - ツールの使用状況\n
73
+ - photoshop:・土や若芽の写真のレタッチ、明度・彩度調整、背景合成・広告ビジュアル全体の色味補正、印刷対応のカラーマネジメント\n
74
+ - llustrator:・ロゴやキャッチコピーのレイアウト、ベクター要素のデザイン・文字組みや図形、アイコン類などグラフィック要素の作成・最終的なレイアウトデータの入稿用ファイル作成\n
75
+ """
76
+ ASSISTANT2 = """
77
+ ## 総評\n
78
+ 以下では、各項目ごとに具体的な評価と改善点を見ていきましょう。\n
79
+ ## 広告物としての評価\n
80
+ **情報伝達の明確さ:4点**\n
81
+ - 良い点:「ホムファームは土にこだわる農園です」というメッセージが大きく記載され、土を全面に押し出したビジュアルから「土」へのこだわりが明快に伝わります。\n
82
+ - 改善点:5W1H(いつ、どこで、なぜ、どのように、誰が、何を)の情報が十分に整理されていない印象があります。現在はブランド理念の一端は示されているものの、「どこで農園を営んでいるのか」「どういった野菜や食品を提供するのか」などの補足情報がやや下部の小さなテキストに押し込まれており、注目を集めにくい状況です。\n
83
+ **デザインコンセプトの適合性:4点**\n
84
+ - 良い点:土の写真とシンプルなメッセージにより、自然・有機的なイメージが直感的に伝わります。有機農業や安心安全を求める消費者層に対し、ブランドのコアバリュー(「土へのこだわり」)が刺さりやすいコンセプトです。\n
85
+ - 改善点:「土にこだわる」点は示されていますが、それが消費者にどんなメリットをもたらすのか(美味しさ、安全性、環境への配慮など)が、もう少し視覚的・言語的に補強されるとターゲットへの訴求力が増します。Illustratorでメインコピー周辺に簡易的なサブコピーを配置(例:「未来へつなぐ循環型農業」など)することで改善できるかもしれません。\n
86
+ **視覚的魅力:3点**\n
87
+ - 良い点:背景に配置された土の質感がリアルで、自然志向が感じられます。大きくあしらわれた筆文字風の「土(と思われる形状)」が印象的で、ブランドの理念を視覚化しています。\n
88
+ - 改善点:ロゴやURL、QRコードなどが下部に配置されているものの、全体の色調が落ち着いているため、情報がやや埋もれがちです。ビジュアル的には魅力的ですが、情報階層がもう少しわかりやすいと良いでしょう。例えば、Illustratorでパターンブラシまたはアートブラシを活用し、QRコードへ向かう小さな誘導ライン(曲線矢印)を作成します。ブランドカラーのラインをサッとひき、これをQRコードへ自然に伸ばして配置することで、視線が自然とQRコードに誘導されるでしょう。\n
89
+ **論理的な説明能力:3点**\n
90
+ - 良い点:「土」=「農園」という直観的な結びつきがビジュアルとテキストで行われている点はわかりやすいです\n
91
+ - ���善点:下部情報(お問い合わせ先、URL、アクセス方法など)が小さくまとまっているため、ブランドの所在地や理念の詳細へ誘導しにくい印象です。「なぜ土にこだわるのか」の論理的説明(未来への優しさ、安全性など)は下部に書かれているものの、文字サイズが小さいため、もう少し目に留まりやすいデザインが望まれます。Photoshopで土のビジュアルに微妙なトーンカーブ調整やコントラスト調整を行い、発芽している芽がよりはっきり際立つようにすることで「成長」「生命力」「持続可能性」をビジュアルでもサポートできるかもしれません\n
92
+ ## 技能評価\n
93
+ **デザインスキル:3点**\n
94
+ - 良い点:写真、文字組み、全体の構図はシンプルで伝わりやすいです。\n
95
+ - 改善点:情報の優先度に応じた文字サイズや色分けの工夫がさらにできる余地があります。例えば、中央の「土」と思われる大きな白抜き形状はインパクトがありますが、形状が少し曖昧で、文字なのか絵なのか迷いが生じます。コンセプトは伝わるものの、「土」という漢字やシンボルであることが、もう少しわかりやすくデザイン可能です。photoshopの「ぼかし(ガウス)」フィルターでエッジを微妙に soften しつつ、メインの輪郭はペンツールでシャープに保つなど、「有機的ながら文字と認識できる」形を目指してみましょう。\n
96
+ **タイポグラフィ:4点**\n
97
+ - 良い点:「ホムファームは土にこだわる農園です」という主メッセージは太字でわかりやすいです。\n
98
+ - 改善点:メインコピー「ホムファームは土にこだわる農園です」は大きく認識できますが、その下部にある「『美味しくて、安全』は未来に優しい方法で」などのサブコピーや問い合わせ先情報が、背景となじみ過ぎていて遠目だと読み取りにくいです。背景の色調とテキストのコントラストが不十分なため、情報が埋もれてしまっています。Photoshopで下部にかけて、上から下にグラデーションツールを適用し、下部近くを少し明度高めにしておくと、文字情報が視認しやすくなります。もしくは、Illustratorで効果→スタイライズ→外側の光彩(Outer Glow)を選択し、非常に淡い白色でごく微小な半径を設定し、グロー効果を追加することで、文字が背景からわずかに浮き出し、可読性を高めることができます。\n
99
+ **レイアウト:4点**\n
100
+ - 良い点:中央のビジュアルが強く、主眼をどこに置きたいかは明確です(「土」へのこだわり)。\n
101
+ - 改善点:QRコードやURLがあるが、視線を誘導する装飾が不足しています。Illustratorでアイコン的な小さな矢印や囲み枠(単純な図形ツールで作成)を用いてQRコード周辺を強調したり、「詳しい情報はWebサイトへ!」などの短い誘導コピーをQRコード上部に配置し、目線を自然に下部へ移動させると良いでしょう。また、下部情報が横一列に詰まっているため、視線誘導がやや不明瞭です。お問い合わせ先、URL、アクセス情報、キャッチコピーなどを適度にグルーピングして階層化(タイトル→サブタイトル→詳細)すると受け手が情報を段階的に理解しやすくなります。\n
102
+ **配色:3点**\n
103
+ - 良い点:土のブラウンと背景の淡いグリーン系の組み合わせは自然を想起させ、ブランドイメージと合致しています。\n
104
+ - 改善点:コントラスト向上による可読性改善が期待されます。サブの文字色をもう少し濃く、はっきりした黒やブランドカラーに変更することで改善されるでしょう。\n
105
+ ## コメント\n
106
+ メインメッセージ(「土にこだわる」)はそのままに、サブ要素(ブランドの理念やURL、アクセス方法)が整理・強調されることで、ポスターを見る人は「この農園は何が特長で、どこでどのようにアプローチできるのか」を直感的に理解しやすくなります。結果として、興味を持った消費者がWebサイト訪問や問い合わせ行動を起こしやすくなり、ブランド認知および顧客獲得につながるでしょう。\n
107
+ """
108
+
109
 
110
  class GraphicPosterTutor(MyLLM):
111
  def _preprocess(self, inputs: dict[str, str | Literal["NORMAL", "HARD"]]) -> Messages:
 
127
  "content": [
128
  {
129
  "type": "text",
130
+ "text": f"<system_prompt>に従って、広告ポスターを評価してください。作品概要は以下の通りです。\n\n# 作品概要\n{OUTLINE1}",
131
+ },
132
+ {
133
+ "type": "image_url",
134
+ "image_url": {"url": f"data:image/png;base64,{encode_image('data/fewshot/graphic/1.png')}"},
135
+ },
136
+ ],
137
+ },
138
+ {
139
+ "role": "assistant",
140
+ "content": [
141
+ {
142
+ "type": "text",
143
+ "text": ASSISTANT1,
144
+ },
145
+ ],
146
+ },
147
+ {
148
+ "role": "user",
149
+ "content": [
150
+ {
151
+ "type": "text",
152
+ "text": f"<system_prompt>に従って、広告ポスターを評価してください。作品概要は以下の通りです。\n\n# 作品概要\n{OUTLINE2}",
153
+ },
154
+ {
155
+ "type": "image_url",
156
+ "image_url": {"url": f"data:image/png;base64,{encode_image('data/fewshot/graphic/2.png')}"},
157
+ },
158
+ ],
159
+ },
160
+ {
161
+ "role": "assistant",
162
+ "content": [
163
+ {
164
+ "type": "text",
165
+ "text": ASSISTANT2,
166
+ },
167
+ ],
168
+ },
169
+ {
170
+ "role": "user",
171
+ "content": [
172
+ {
173
+ "type": "text",
174
+ "text": f"<system_prompt>に従って、広告ポスターを評価してください。作品概要とポスターの文字起こしは以下の通りです。\n\n# 作品概要\n{inputs["artwork_content"]}。\n\n# 文字起こし\n{inputs["transcription"]}。",
175
  },
176
  {
177
  "type": "image_url",
src/backend/tutor/graphic/poster_tutor/prompt.py CHANGED
@@ -11,10 +11,11 @@ def create_system_prompt(
11
  ) -> str:
12
  # 基本部分・デジハリの説明
13
  prompt = "あなたはデジタルハリウッド社のグラフィックデザイン講座の作品評価AIです。\n"
 
14
  if mode_setting == "HARD":
15
  prompt += "プロ視点で、"
16
  prompt += (
17
- "上がってきた制作物に対し、好みや感覚による良し悪しの判断ではなく、論理的なフィードバックを行え、制作物の品質を高められます。\n\n"
18
  "# デジタルハリウッド社について\n"
19
  "## 概要:デジタルクリエイティブ関連の教育事業会社。教育と学びのDXを推進。\n"
20
  "## 理念:デジタル技術で未来の仕事や生活を楽しくすることを目指す。\n"
@@ -63,41 +64,39 @@ def create_system_prompt(
63
  "- 改善点は、意識することだけでなく具体的な修正方法までアドバイスしてください\n"
64
  "- 必要に応じて、ツールの扱いについての具体的なフィードバックを含めてください。\n"
65
  "- 文量は、良い点と改善点で同じ程度の長さにしてください。良い点も十分に評価してください。\n"
 
 
66
  )
 
67
  if mode_setting == "HARD":
68
  prompt += "- 厳しく評価してください。必ずしも褒める必要はありません。\n"
 
69
  prompt += (
70
  "- 以下の「## フォーマット」に従って出力します。()内は何を出力するかの内容です。出力に()の部分は表示しません。\n"
71
  "## フォーマット\n"
72
  " ## 総評\n"
73
  " {自由文で作品を総評}\n\n"
74
  " 以下では、各項目ごとに具体的な評価と改善点を見ていきましょう。\n\n"
75
- " ## 課題評価観点\n"
76
- " {## 課題評価観点」の各項目について評価してください}\n"
77
- " **{項目1}:{点数}**\n"
78
- " - 良い点:{項目1に関する良い点}\n"
79
- " - 改善点:{項目1に関する改善点}\n\n"
80
- " {ここの項目は基本的に1つですが、他にも与えられている場合は項目2以降に関しても同様のフォーマットで評価してください}\n"
81
- " ## 個人能力評価観点\n"
82
- " {「## 個人能力評価観点」の各項目について評価してください}\n\n"
83
- " **{項目1}:{点数}**\n"
84
  " - 良い点:{項目1に関する良い点}\n"
85
- " - 改善点:{項目1に関する改善点}\n\n"
86
- " **{項目2}:{点数}**\n"
87
- " - 良い点:{項目1に関する良い点}\n"
88
- " - 改善点:{項目1に関する改善点}\n\n"
89
  " {項目3以降に関しても上記と同様のフォーマットで評価してください}\n\n"
 
 
90
  " ## コメント\n"
91
  " {フィードバックした内容を元に、作品の全体的な完成度や、さらにブラッシュアップするために何が重要か、コメントしてください。"
92
  )
93
  if mode_setting == "NORMAL":
94
  prompt += "また、「頑張ってください!」や「さらに良い作品になることを期待しています!」のような労いの言葉も添えてください。"
95
- prompt += "}\n\n"
96
 
97
  # 講義に関するナレッジ
98
  prompt += (
99
  "# ツール・講義・カリキュラムに関する情報\n"
100
- "- グラフィックデザインに精通しており、以下の認識を持っています。必要であればフィードバックに活かしますが、知識が偏った評価はしません。\n"
101
  f"{knowledge}\n"
102
  "生徒はトレーナーの言葉遣い・人格・指導対応など細かく見ています。\n"
103
  "以下のポイントに留意して、適切な対応を常に心がけてください。\n"
@@ -109,6 +108,19 @@ def create_system_prompt(
109
  "- 受講生は誰しも不安を抱えています���だからこそ、受講生が目標に向かって楽しく学べるよう、気配りをしましょう。\n"
110
  "- 2.受講生のパーソナルを尊重します。\n"
111
  "- 受講生に知識を一方的に伝えるだけでなく、実際に手を動かさせてみて、「自分でできた!」という達成感を感じてもらいましょう。\n"
 
 
 
 
 
 
 
 
 
 
 
 
 
112
  "それでは、生成を開始してください。あなたならできます。"
113
  )
114
 
 
11
  ) -> str:
12
  # 基本部分・デジハリの説明
13
  prompt = "あなたはデジタルハリウッド社のグラフィックデザイン講座の作品評価AIです。\n"
14
+
15
  if mode_setting == "HARD":
16
  prompt += "プロ視点で、"
17
  prompt += (
18
+ "上がってきた制作物に対し、好みや感覚による良し悪しの判断ではなく、論理的なフィードバックを行ってください、制作物の品質を高められます。\n\n"
19
  "# デジタルハリウッド社について\n"
20
  "## 概要:デジタルクリエイティブ関連の教育事業会社。教育と学びのDXを推進。\n"
21
  "## 理念:デジタル技術で未来の仕事や生活を楽しくすることを目指す。\n"
 
64
  "- 改善点は、意識することだけでなく具体的な修正方法までアドバイスしてください\n"
65
  "- 必要に応じて、ツールの扱いについての具体的なフィードバックを含めてください。\n"
66
  "- 文量は、良い点と改善点で同じ程度の長さにしてください。良い点も十分に評価してください。\n"
67
+ "- 作者の意図をよく汲み取り、その意図に沿うようにフィードバックしてください。\n"
68
+ "- 改善するべき点がない場合は無理に指摘しないでください。\n"
69
  )
70
+
71
  if mode_setting == "HARD":
72
  prompt += "- 厳しく評価してください。必ずしも褒める必要はありません。\n"
73
+
74
  prompt += (
75
  "- 以下の「## フォーマット」に従って出力します。()内は何を出力するかの内容です。出力に()の部分は表示しません。\n"
76
  "## フォーマット\n"
77
  " ## 総評\n"
78
  " {自由文で作品を総評}\n\n"
79
  " 以下では、各項目ごとに具体的な評価と改善点を見ていきましょう。\n\n"
80
+ " ## 広告物としての評価\n"
81
+ " **{項目1}:{点数}**\n"
 
 
 
 
 
 
 
82
  " - 良い点:{項目1に関する良い点}\n"
83
+ " - 改善点:{項目1に関する改善点,500文字程度}\n"
84
+ " **{項目2}{点数}**\n"
85
+ " - 良い点:{項目2に関する良い点}\n"
86
+ " - 改善点:{項目2に関する改善点,500文字程度}\n"
87
  " {項目3以降に関しても上記と同様のフォーマットで評価してください}\n\n"
88
+ " ## 技能評価\n"
89
+ " {広告物としての評価と同様のフォーマットで各項目について評価}\n\n"
90
  " ## コメント\n"
91
  " {フィードバックした内容を元に、作品の全体的な完成度や、さらにブラッシュアップするために何が重要か、コメントしてください。"
92
  )
93
  if mode_setting == "NORMAL":
94
  prompt += "また、「頑張ってください!」や「さらに良い作品になることを期待しています!」のような労いの言葉も添えてください。"
 
95
 
96
  # 講義に関するナレッジ
97
  prompt += (
98
  "# ツール・講義・カリキュラムに関する情報\n"
99
+ "以下の前提を踏まえ、偏りのないフィードバックをおこなってください\n"
100
  f"{knowledge}\n"
101
  "生徒はトレーナーの言葉遣い・人格・指導対応など細かく見ています。\n"
102
  "以下のポイントに留意して、適切な対応を常に心がけてください。\n"
 
108
  "- 受講生は誰しも不安を抱えています���だからこそ、受講生が目標に向かって楽しく学べるよう、気配りをしましょう。\n"
109
  "- 2.受講生のパーソナルを尊重します。\n"
110
  "- 受講生に知識を一方的に伝えるだけでなく、実際に手を動かさせてみて、「自分でできた!」という達成感を感じてもらいましょう。\n"
111
+ )
112
+
113
+ prompt += (
114
+ "- 最後に、以下の点を必ず厳守してください。これらの点を徹底することがあなたと生徒のためになります。\n"
115
+ "1. 抽象的な表現を避け、数値・箇所・要素名で明確に問題点を提示する。\n"
116
+ "2. 具改善策を具体的かつ実行可能な形で提示する\n"
117
+ "3. 改善後の効果を言語化する。改善によってどのようなポスターへの影響が期待できるか示すことで、改善の必要性・意義を理解させる。\n"
118
+ "4. 下記のようにツールの使用方法を明示する。\n"
119
+ " - 「ポスターの{画像内修正箇所}が{修正されるべき事象}になっています。Photoshopの「{ツール機能}」→「{ツール機能詳細}」を使い、{画像内修正箇所へのツール使用方法}をすると{修正結果}になるでしょう。」\n"
120
+ " - 「ポスターの{画像内修正箇所}が{修正されるべき事象}になっています。illustratorの「{ツール機能}」→「{ツール機能詳細}」を使い、{画像内修正箇所へのツール使用方法}をすると{修正結果}になるでしょう。」\n"
121
+ "5. 下記のようにポスターのどの部分をどのように変更すればいいかを具体的に提案してください。\n"
122
+ " - 「{画像内修正箇所}の部分のについて、{修正内容}のようにしてみましょう。例えば、{画像内修正箇所詳細1}を{修正内容詳細}すると、{修正結果}が感じられます。また、{画像内修正箇所詳細1}を{修正内容詳細}すると、{修正結果}になります。」\n"
123
+ "6. {改善点}は500文字程度で記述してください。\n"
124
  "それでは、生成を開始してください。あなたならできます。"
125
  )
126
 
src/backend/utils.py CHANGED
@@ -4,7 +4,7 @@ import cv2
4
  import numpy as np
5
 
6
 
7
- def encode_image(image: np.ndarray) -> str:
8
  """
9
  画像をPNG形式にエンコードしてBase64形式の文字列として返す
10
 
@@ -22,7 +22,7 @@ def encode_image(image: np.ndarray) -> str:
22
  return "画像がアップロードされていません。"
23
 
24
  if not isinstance(image, np.ndarray):
25
- return "画像の形式が正しくありません。"
26
 
27
  # RGBからBGRに変換
28
  image_bgr = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
 
4
  import numpy as np
5
 
6
 
7
+ def encode_image(image: np.ndarray | str) -> str:
8
  """
9
  画像をPNG形式にエンコードしてBase64形式の文字列として返す
10
 
 
22
  return "画像がアップロードされていません。"
23
 
24
  if not isinstance(image, np.ndarray):
25
+ image = cv2.imdecode(np.fromfile(image, dtype=np.uint8), cv2.IMREAD_COLOR)
26
 
27
  # RGBからBGRに変換
28
  image_bgr = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
src/gradio_interface/cg/image.py CHANGED
@@ -1,3 +1,4 @@
 
1
  from typing import Literal
2
 
3
  import numpy as np
@@ -6,9 +7,9 @@ from src.backend.tutor.cg.cg_image_tutor.cg_image_tutor import CGImageTutor
6
  from src.backend.utils import encode_image
7
  from src.gradio_interface.utils import create_evaluation_tab
8
 
9
- PLATFORM = "gcp"
10
- MODEL = "gemini-1.5-pro-002"
11
- BACKLOG_IMAGE_PATH_CG = "fig/backlog_CG静止画_動画_20241214.png"
12
 
13
  ASSIGNMENT_DEFAULT = """## 内容: 『写実表現』Mayaモデリング静止画課題(3か月課題制作)
14
  - モチーフは部屋です。部屋での生活感を考えて、そこに置かれている様々な物もレイアウトしてください。
@@ -24,7 +25,6 @@ ASSIGNMENT_DEFAULT = """## 内容: 『写実表現』Mayaモデリング静止
24
 
25
  ## 作品規定
26
  - サイズ=1280×720pix
27
- - カメラアングルを変えた画像を2枚提出(構図を考えてカメラを配置し、カメラビューにてレンダリング)
28
  """
29
  CRITERIA_DEFAULT = """## 課題評価観点:各項目5段階で評価される
30
  - 世界観:登場する⼩道具から背景までが、魅⼒的で作品意図に合ったものであるか。
@@ -110,8 +110,7 @@ def analyze_cg_image(
110
  """
111
 
112
  cg_image_tutor = CGImageTutor(
113
- platform=PLATFORM,
114
- model=MODEL,
115
  )
116
 
117
  return cg_image_tutor(
 
1
+ import os
2
  from typing import Literal
3
 
4
  import numpy as np
 
7
  from src.backend.utils import encode_image
8
  from src.gradio_interface.utils import create_evaluation_tab
9
 
10
+ PLATFORM = "google-generativeai"
11
+ MODEL = "gemini-20-flash-exp"
12
+ BACKLOG_IMAGE_PATH_CG = "fig/backlog_CG静止画_動画_20241123.png"
13
 
14
  ASSIGNMENT_DEFAULT = """## 内容: 『写実表現』Mayaモデリング静止画課題(3か月課題制作)
15
  - モチーフは部屋です。部屋での生活感を考えて、そこに置かれている様々な物もレイアウトしてください。
 
25
 
26
  ## 作品規定
27
  - サイズ=1280×720pix
 
28
  """
29
  CRITERIA_DEFAULT = """## 課題評価観点:各項目5段階で評価される
30
  - 世界観:登場する⼩道具から背景までが、魅⼒的で作品意図に合ったものであるか。
 
110
  """
111
 
112
  cg_image_tutor = CGImageTutor(
113
+ platform=PLATFORM, model=MODEL, client_settings={"api_key": os.getenv("GOOGLE_API_KEY")}
 
114
  )
115
 
116
  return cg_image_tutor(
src/gradio_interface/cg/video.py CHANGED
@@ -3,7 +3,7 @@ from typing import Literal
3
  from src.backend.tutor.cg.cg_video_tutor.cg_video_tutor import CGVideoTutor
4
  from src.gradio_interface.utils import create_evaluation_tab
5
 
6
- BACKLOG_IMAGE_PATH_CG = "fig/backlog_CG静止画_動画_20241214.png"
7
 
8
  CRITERIA_DEFAULT = """## 課題評価観点: 各項目5段階で評価される。
9
  - コンセプト/ストーリー:作品のコンセプトやストーリーが教訓的であり、視聴者の賛同を得られるものであるか。
 
3
  from src.backend.tutor.cg.cg_video_tutor.cg_video_tutor import CGVideoTutor
4
  from src.gradio_interface.utils import create_evaluation_tab
5
 
6
+ BACKLOG_IMAGE_PATH_CG = "fig/backlog_CG静止画_動画_20241123.png"
7
 
8
  CRITERIA_DEFAULT = """## 課題評価観点: 各項目5段階で評価される。
9
  - コンセプト/ストーリー:作品のコンセプトやストーリーが教訓的であり、視聴者の賛同を得られるものであるか。
src/gradio_interface/graphic/idea.py CHANGED
@@ -1,9 +1,11 @@
 
 
1
  from src.backend.tutor.graphic.idea_tutor.graphic_idea_tutor import GraphicIdeaTutor
2
  from src.gradio_interface.utils import create_chatbot_tab
3
 
4
- PLATFORM = "gcp"
5
- MODEL = "gemini-1.5-pro-002"
6
- BACKLOG_IMAGE_PATH_IDEA = "fig/backlog_コンセプト壁打ち_20241214.png"
7
 
8
 
9
  def create_idea_tab():
@@ -30,8 +32,7 @@ def chat_graphic_idea(user_input: list[str], history: list[str]) -> str:
30
  """
31
 
32
  graphic_idea_tutor = GraphicIdeaTutor(
33
- platform=PLATFORM,
34
- model=MODEL,
35
  )
36
 
37
  return graphic_idea_tutor(
 
1
+ import os
2
+
3
  from src.backend.tutor.graphic.idea_tutor.graphic_idea_tutor import GraphicIdeaTutor
4
  from src.gradio_interface.utils import create_chatbot_tab
5
 
6
+ PLATFORM = "google-generativeai"
7
+ MODEL = "gemini-20-flash-exp"
8
+ BACKLOG_IMAGE_PATH_IDEA = "fig/backlog_コンセプト壁打ち_20241123.png"
9
 
10
 
11
  def create_idea_tab():
 
32
  """
33
 
34
  graphic_idea_tutor = GraphicIdeaTutor(
35
+ platform=PLATFORM, model=MODEL, client_settings={"api_key": os.getenv("GOOGLE_API_KEY")}
 
36
  )
37
 
38
  return graphic_idea_tutor(
src/gradio_interface/graphic/poster.py CHANGED
@@ -1,3 +1,4 @@
 
1
  from typing import Literal
2
 
3
  import numpy as np
@@ -7,9 +8,11 @@ from src.backend.tutor.graphic.poster_tutor.graphic_transcription import Graphic
7
  from src.backend.utils import encode_image
8
  from src.gradio_interface.utils import create_evaluation_tab
9
 
10
- PLATFORM = "gcp"
11
- MODEL = "gemini-1.5-pro-002"
12
- BACKLOG_IMAGE_PATH_GRAPHIC = "fig/backlog_グラフィック広告ポスター_20241214.png"
 
 
13
 
14
  CRITERIA_DEFAULT = """## 課題評価観点
15
  - 視認性に問題がないか
@@ -22,10 +25,10 @@ CRITERIA_DEFAULT = """## 課題評価観点
22
  - 視覚的魅力: 印象に残るデザインと魅力的なビジュアル表現がされているか。
23
  - 論理的な説明能力: デザインの根拠を論理的に説明できるか、デザインの読み解きができるか。
24
  ### 技能評価観点
25
- - デザインスキル:技術的な知識:デザインツールの操作が適切に行えるか。デザインの基本原則の理解: 近接、整列、対比、反復の原則を適切に適用できているか。
26
- - タイポグラフィ:フォント選定の適切さ: 読みやすさや美しさを考慮したフォント選びができているか。文字組の美しさ: 字間や行間の調整が適切に行われているか。
27
- - レイアウト:情報の整理能力: 階層やグルーピングを意識したレイアウトができているか。バランス感覚: 重心を考慮したバランスの良いレイアウトが実現できているか。
28
- - 配色:色彩調和の理解: 色の組み合わせが美しく、機能的であるか。ユーザー視点の配慮: 色覚異常の方にも配慮した配色がなされているか。
29
  """
30
  ARTWORK_CONTENT_DEFAULT = """- サービス
31
  - コンセプト →
@@ -45,89 +48,34 @@ ARTWORK_CONTENT_DEFAULT = """- サービス
45
  ASSIGNMENT_DEFAULT = """- 現実または架空のサービスの広告物を戦略的に制作する
46
  - 入学後、色彩、レイアウト、タイポグラフィなどの基礎を学習している上で、ブランディング手法を学び、PhotoshopやIllustratorを使ってポスター制作を行う"""
47
  KNOWLEDGE_DEFAULT = """# ツールの情報
48
- 課題で生徒が使用するツールは以下のような特徴があります。
49
  ## Photoshop
50
- - 写真の編集と加工
51
- - 商品写真や背景画像の色調補正、レタッチ、切り抜き。
52
- - 製品のクローズアップ画像やビジュアルにインパクトを加えるための効果(シャドウやグラデーションなど)を追加。
53
- - レイアウト作成
54
- - 広告のレイアウト作業:テキストと画像の配置、視覚的インパクトを与えるデザイン。
55
- - バナー広告やSNS用画像作成に使用。
56
- - デジタルアートの制作:
57
- - 絵やイラストのデジタル制作、広告のビジュアルコンセプトを具現化。
58
  ## Illustrator
59
- - ロゴとアイコンのデザイン:
60
- - 広告物で使用するロゴやブランドアイコンの作成。
61
- - ベクター形式で作成し、サイズ変更に強いデザイン。
62
- - タイポグラフィのデザイン:
63
- - 広告で使う文字やキャッチコピーのデザイン。
64
- - フォントを自由に加工して独自のタイポグラフィを作成。
65
- - イラストや図形の作成:
66
- - 広告物のビジュアル要素としてアイコン、グラフィック、装飾の作成。
67
- # デザインそのものについて
68
- ## デザインとは、問題の本質を掘り下げ、解決のための設計を行い、設計に基づいた見た目(表現)を作り上げ、問題を解決に導く事。
69
- ## デザイナーとは、情報を整理し、視覚的にわかりやすく・魅力的に伝えるため、各素材(文字・イラスト・写真・データ etc)を用いて、要求対象全体を表現する人。見た目のデザインを作るスキルだけでなく、本質的な課題解決を期待され、作ったデザイン制作物に対し、論理的に説明できることが求められる。
70
- ## 良いデザインとは、客観的に整理された構成であり、その上で、魅力的に視覚表現が施され、第三者の印象に残せるもの。
71
- ## デザインの基本的な構成要素と各要素のポイントは、以下の3点
72
- - 1.伝えるべき情報の整理: ・5W1Hコンセプトを関係者間で決め認識を揃える・目次立て(優先順や流れ) →・迷ったら好みではなくコンセプトに立ち返る・日々事例を見て5W1Hを考える癖をつける
73
- - 2.デザインコンセプト: ・コンセプトを基にターゲットに���くデザインテイストの認識を揃える→・独りよがりなデザインにならないよう、ターゲット目線で考え、自己表現欲は抑える
74
- - 3.デザインの知識: ・クオリティの高いアウトプットを目指し、ブラッシュアップを行う→・ツール操作は、一定程度使えれば大丈夫・日々事例を見て実践し、デザインの引き出しを増やし、見る目を養っていく
75
- ## デザインの言語化とは、クライアントが伝えたいメッセージを、ビジュアルに置き換えて表現するため、制作物の要素や位置関係などに、論理的な根拠をもって説明すること。論理的に説明する際に、デザインの要素や原則といったボキャブラリーを利用する。
76
- ## デザインの言語化のためのボキャブラリー例:
77
- - デザインの構成要素: 文字、色、写真・イラスト、線・図形、空間(余白)、質感
78
- - デザインの基本原則: 整列、退避、割合、調和(統一性)、バランス、反復(パターン、リズム)、グリッド
79
- ## デザインの根拠を読み解くプロセスは、1.デザインを読み解く、2.思ったこと・感じたこと・気づいたことをとにかく洗い出す、3.洗いだした内容に対して「なぜ?」の理由づけをしていく、4.デザインの根拠をまとめる。デザインの根拠を推測する際は、なぜ?を繰り返し、デザインの本質を掘り下げてみる。
80
- ## デザイン制作の流れは、以下5段階から構成される。
81
- - 情報整理・事例収集: クライアントからの要件を正確に把握するため、抜け漏れなくヒアリングする。ターゲットや狙い、利用シーンや伝えるべき情報の優劣などの把握により、目指したい方向性の見える化を行う。
82
- - レイアウト: 1に基づいて目的を叶えられそうな画面構成をできるだけ沢山案出しする。後述の4原則にもとづきレイアウトし、情報の優先順位が明確に伝わるよう配置していく。
83
- - 書体の検討: 1、2に基づいて世界観に合う書体を数点セレクトし、当てはめながら最終選択する。
84
- - 配色の検討: ここまで検討してきた世界観を表現できそうなテーマカラーを1つ選ぶ。テーマカラーを補足する色と、背景色・本文文字色を決める。
85
- - 情報図式化・装飾: 文字要素をビジュアライズすべき箇所を、図式化していく。より印象的に装飾できる部分を作り込んでいく。
86
- ## デザインの4原則: 近接、製鉄、対比、反復。装飾的な部分ではなく、制作物全体の「本質的な構成」と「案出し」を論理的に検討できるようになり、その後のデザイン工程で迷走せず制作できるようになる。
87
- - 近接: 余白を使いこなす、情報のグルーピング。意図やコンセプトを基に、関連性のある情報を近くに接して配置することで、、ユーザーに情報をわかりやすく伝える。一瞬考えさせてしまうだけでもユーザーのストレスに繋がるので注意する。
88
- - 整列: 見えないラインを意識する。オブジェクト(要素)の各ポイントを基準にして、要素を配置をすることで、それぞれに関連性が生まれる。コツは以下3点。1.オブジェクトの形状や性質ごとにバランス良く見えたり、デザイン的な意味や意図を伝えやすい向きを考える。2.ガイド(補助線)で揃えても、ガイドを外すとバランスが悪く見えることがあるため、最終的には、自分の目で見て全体のバランスを調整する。3.複数のオブジェクトを並べる際も、各オブジェクトのポイントを意識し、要素間の距離(余白)をまずは隅々まで揃える。この癖をつけることでバランス感覚が掴めてくる。
89
- - 対比: メリハリ、ジャンプ率、バランス。特定の要素に優先順序を与えてサイズや色で強弱をつけること、情報に優劣をつける。優先度が高く目立たせるべき要素は、サイズを大きくしたり目立つ配色を施し、優先度が低い要素は、目立たないようにジャンプ率をはっきりつける(強弱は付けすぎるぐらいでちょうど良いことが多い)。要素に強弱をつけることで、優先的に伝えたい情報の制作側の意図を暗に示すことができる。対比が大きいとメリハリがありインパクトのあるデザインになり、弱くすることで統一感、洗練感や落ち着いた印象に加え、全てを均等に見せたいという意図が伝わる。
90
- - 反復: 統一性、リズム。デザイン要素を繰り返し配置することで、それぞれの関連性を作り出す。一定の間隔で並べることで見た目にも統一感が生まれ、要素をリズミカ���に表現できる。文字情報の場合も、見出し + 本文 + 余白 の組み合わせを繰り返し並べることで、反復と同じ効果が生まれる。形による反復: 見えないラインを創りだし、統一感とリズムを生む。要素間の余白による反復: 等間隔で見えない余白を取るとバランスよく見える。色による反復: 統一した形状・サイズを等間隔に並べることで、これらが1グループだということが一瞬で判断できる。
91
 
92
  # タイポグラフィについて
93
- ## タイポグラフィとは、適切なフォントを選び、読みやすく・美しく、文字を配置すること。また、文字をデザイン要素として用いること。
94
- - 事例: WebやアプリのUIで、読みやすさ・わかりやすさを表現するため組み方に配慮したもの。文章量が多くても、組み方や強弱で情報をわかりやすく・美しく整理したもの。
95
- ## 文字の扱いの上手さは、文字要素をデザインの一要素として自然に溶け込ませ、全体の世界観を文字によって補強し、且つきちんと “心地良い” 可読性を保っていること。タイポグラフィの美しさの判別ができる「目」を養うことが重要。
96
  ## 本文の組版について
97
  - 複数行を組む時の「行送り」「行長」は、可読性を高め、ユーザーが本文を心地よく読めるようにする。窮屈や散漫な印象になることは基本的には避ける。
98
  - 複数行の揃え方は、左揃えが基本であり、両端揃えも使う。
99
  - 禁則処理は、1.行頭禁則: 日本語の段落や「、」や「。」が行の頭に来ることを避ける、2.行末禁則: 「・」やかっこの先頭が行の末尾に来ることも避ける、3.ぶら下がり: 行末の「、」や「。」は段落からはみ出して使うことも可能。
100
  ## 書体の選び方
101
  - 和文・欧文書体はそれぞれ別途選択する。
102
- - デザイン全体の世界観に馴染みつつ(異物感を感じさせない)も補強し、かつ読みやすさ・情報の伝わりやすさも担保する。ロゴや見出し → 印象的に見せることを重視。本文 → 読ませることを重視。固定観念に引っ張られすぎない(例: 和風 = 江戸っぽい筆文字、女性向け = 明朝体、男性向け = 太いゴシック etc)
103
  - 字面や細部の形状による印象の違いを把握し比較検討する。懐の空き具合や大ぶり・小ぶり具合で印象が変わる。
104
- - 文字を組み合わせる場合は、和文・欧文書体含め、2〜3種類までに抑える。個性的で癖の強いフォントを使う場合は、他書体は控えめなものを選ぶ。ファミリーのウェイトでメリハリをつけ、書体数を安易に増やさない。
105
- - まずは有名フォントを使うようにして、極力歴史の浅いフリーの文字は使わない○ MSゴシック/明朝は使わない。
106
- ## 文字の扱いの守るべきコツ
107
- - 文字への装飾: 過剰に意味のない装飾(グラデやドロップシャドウ etc)はつけない
108
- - 文字の長体・平体: フォントとして用意されていれば使って良いが、基本的には自分で文字の縦横比をいじらない
109
- - 斜体にしたい時は、イタリック体を使う: イタリック=斜体用にデザインされた書体。オブリーク=単純に傾斜をかけた書体。日本語の斜体は読みづらいのであまり使わない。
110
- - 図形に載せる場合: 吹き出しや図形の中へ文字を入れる時は、図形エリアと文字との間の余白に注意する。
111
  ## 文字組について
112
- - 字間調整(カーニング): デザイナーは必ず、文章が読みやすく美しくなるようサイズや余白の調整を行い、打ちっ放しにはしない。初期状態のままだと、活字と余白の間隔がバラバラのままで、締まりのない文章に見えてしまう。
113
- - 欧文書体: 字間調整を終えてから、イメージに合わせて全体の文字組を詰めたり開いたりして余白をコントロールする。空間が詰まると、「緊張感」や「力強さ」を生まれ、広がると、「余裕」や「癒し・安らぎ」を表現できる。
114
  - 和文書体: 筆の動き(筆脈)が破綻しないように意識する。左頭揃え: 左揃えで書体を組む場合、視覚的に左のラインを揃える。天揃え: 視覚的に上部のラインが揃うように調整する。
115
  - 和欧��植: 和文書体と欧文書体を同時に組むこと。タイトルやキャッチコピーなどの英数字は、できるだけ欧文書体を使う。同じフォントサイズで並べると欧文の方が小さく見えるため、欧文書体を120%前後に大きくし、ベースラインを少し上げる。
116
-
117
  # レイアウトについて
118
- ## レイアウトとは、・美しく見せる: 統一や調和、バランスなど情報を並べる際に美しく見せる手法、・情報を整理する: 階層や強調、グルーピングといった、情報設計としての役割。デザインの4原則(近接、整列、対比、反復)から成り立つ。
119
  ## レイアウトのコツ
120
  - 余白を使いこなす: 「抜け感」を意識する。・要素群を一箇所にまとめ、どこかに抜け感を作る・要素を一部裁ち落としたり、トリミングすることで、紙面外の空間の広がりを連想させる
121
  - オブジェクトの形状を利用したデザイン: ・オブジェクトの形状をレイアウトに利用する(三角形、円、四角形、L字、プラスなど)・自然な人の視線の流れ(Z型、F型)を意識して配置してみる。要素に合わせたデザインをしていく事で、空間・視線の流れを作り、バランス良く、かつ大胆なレイアウトが組めるようになる。
122
  - シンメトリーとアシンメトリー: シンメトリー = レイアウトの中心にガイドを設け、それを中心に左右対称に配置するレイアウト。中央揃えの多用は単調になるため注意。アシンメトリー = 左右非対称に配置した自由なレイアウト手法。厳格なルールはないが、空間バランスなど十分配慮する必要がある。
123
  - バランスの良さ = 重心を考える: 作品の中心に下から指を立てるようなイメージで、どちらかに重心が傾いて倒れないかを想像してみる。・グレースケールにして確認してみると、イメージしやすい・意図的にバランスを悪くすることもたまにある
124
-
125
  # 配色について
126
- ## 色の与えるイメージ: 単色そのものが持つイメージやキーワードがあるため、色を選ぶ時はそれらも考慮して検討する
127
  ## 有彩色の与えるイメージ
128
  - 暖色: 前方に飛び出してくるように見え(進出色)、人の注意を引きつける色。光の波長が長く受け手側にエネルギーを必要とする。・赤: 情熱的、活動的、行動力、生命力、愛、衝動、祝い、興奮、歓喜、危険、刺激。・黄: 親しみやすい、陽気、積極的、自由、明るさ、未来、元気、幼稚、注意、希望。・橙: 健康、快活な、安心感、幸福感、近代的、高揚感
129
- - 寒色: 光の波長が短い青と紫から成立し、落ち着きや広々とした雰囲気を感じさせる色。青: クール、知的、冷静、保守的、爽やか、忠実、涼しさ、理想、誠実、信頼。紫: 神秘、高貴、個性、ファッション性、優雅、哀れ、心配、上品、古典的
130
- - 緑色: 可視スペクトルの真ん中に位置し、受け手側に一番負担をかけない安らぐ色。緑: 自然(ナチュラル)、癒し、安らぎ、新鮮、平和、若々しさ、健康、田舎、安全
131
  - 茶色: 色相環にない色。2色以上を混ぜ合わせないとできない色。茶: 自然、明るさ、活気、土、田舎
132
  ## 無彩色の与えるイメージ
133
  - 白: 清潔、純粋、誠実、勝利、真実、空虚、神聖、公共性、公明性
@@ -140,7 +88,7 @@ KNOWLEDGE_DEFAULT = """# ツールの情報
140
  ## 色彩調和とは、色を組み合わせて、新たな効果を生み出すこと。対象物の用途を機能的に実現し、美しく調和した配色を施していく。
141
  - 色面積とその比率: 配色の面積によってもイメージは大きく変わる。ベースカラー、メインカラー(キーカラー)、アクセントカラー(サブカラー)を念頭に、色面積を検討する。・メインカラー … ブランド自身を表す役割を持つ基本色。デザインの中で一番印象づける色となる。・アクセントカラー … メインカラーを引き立てる役割。補色系が使われることが多い。色面積を多くしすぎないよう注意。・ベースカラー … 文字情報の可読性を損なわないよう、文字色とのコントラストを意識して選別する。
142
  ## ユーザー視点に立った配色のポイント
143
- - 色を正しく認識できない場合を考慮する: ・色覚異常の方でも、情報取得の点で問題ない配色にし、アクセシビリティに配慮する。・色だけに頼らないデザインを心がける。
144
  - 見やすい配色を心がける: 背景色と文字色のコントラスト差が低いと、ユーザーにストレスを感じさせてしまうので十分注意する。
145
  ## 配色のコツ
146
  - 単色等のキリの良すぎる値の色(例: #ff0000)は使わない。真っ黒(#000やK100%)もキツい印象のため基本的には避ける。
@@ -148,7 +96,6 @@ KNOWLEDGE_DEFAULT = """# ツールの情報
148
  - まずはグレースケールでデザインしてから、メインカラー(差し色)だけ入れてみる。配色イメージは最初に定めつつ、実際の配色作業は基本的に最後の工程で施す。メインカラーが引き立つデザインへ導くことができる
149
  - 色数が多くなるほど世界観を表現しづらくなるため、極力、有彩色の色数は増やさない。
150
  - 色の割合を必ず意識する。メインカラーの割合が、アクセントカラーの割合より少なくならないように注意する。
151
- - 美しいと思う自然界や風景の配色を参考にし、配色のストックを増やす。
152
  - 色に頼りすぎない。色をなくしても(モノトーンにしても)成立するデザインにする。
153
  ## 配色の検討
154
  - 類似色: 同じトーンで色相を変化させた配色。強すぎずソフトな印象を与え、最も失敗しにくい。
@@ -214,14 +161,12 @@ def analyze_graphic_poster(
214
  """
215
 
216
  graphic_transcription = GraphicTranscription(
217
- platform=PLATFORM,
218
- model=MODEL,
219
  )
220
  transcription = graphic_transcription(inputs=encode_image(image))
221
 
222
  graphic_poster_tutor = GraphicPosterTutor(
223
- platform=PLATFORM,
224
- model=MODEL,
225
  )
226
 
227
  return graphic_poster_tutor(
 
1
+ import os
2
  from typing import Literal
3
 
4
  import numpy as np
 
8
  from src.backend.utils import encode_image
9
  from src.gradio_interface.utils import create_evaluation_tab
10
 
11
+ PLATFORM = "google-generativeai"
12
+ MODEL = "gemini-20-flash-exp"
13
+ BACKLOG_IMAGE_PATH_GRAPHIC = "fig/backlog_グラフィック広告ポスター_20241123.png"
14
+
15
+ GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY")
16
 
17
  CRITERIA_DEFAULT = """## 課題評価観点
18
  - 視認性に問題がないか
 
25
  - 視覚的魅力: 印象に残るデザインと魅力的なビジュアル表現がされているか。
26
  - 論理的な説明能力: デザインの根拠を論理的に説明できるか、デザインの読み解きができるか。
27
  ### 技能評価観点
28
+ - デザインスキル
29
+ - タイポグラフィ
30
+ - レイアウト:情報の整理能力
31
+ - 配色:色彩調和の理解
32
  """
33
  ARTWORK_CONTENT_DEFAULT = """- サービス
34
  - コンセプト →
 
48
  ASSIGNMENT_DEFAULT = """- 現実または架空のサービスの広告物を戦略的に制作する
49
  - 入学後、色彩、レイアウト、タイポグラフィなどの基礎を学習している上で、ブランディング手法を学び、PhotoshopやIllustratorを使ってポスター制作を行う"""
50
  KNOWLEDGE_DEFAULT = """# ツールの情報
51
+ 課題で生徒が使用するツールは以下のとおりです。
52
  ## Photoshop
 
 
 
 
 
 
 
 
53
  ## Illustrator
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
 
55
  # タイポグラフィについて
 
 
 
56
  ## 本文の組版について
57
  - 複数行を組む時の「行送り」「行長」は、可読性を高め、ユーザーが本文を心地よく読めるようにする。窮屈や散漫な印象になることは基本的には避ける。
58
  - 複数行の揃え方は、左揃えが基本であり、両端揃えも使う。
59
  - 禁則処理は、1.行頭禁則: 日本語の段落や「、」や「。」が行の頭に来ることを避ける、2.行末禁則: 「・」やかっこの先頭が行の末尾に来ることも避ける、3.ぶら下がり: 行末の「、」や「。」は段落からはみ出して使うことも可能。
60
  ## 書体の選び方
61
  - 和文・欧文書体はそれぞれ別途選択する。
62
+ - デザイン全体の世界観に馴染みつつ(異物感を感じさせない)も補強し、かつ読みやすさ・情報の伝わりやすさも担保する。ロゴや見出し → 印象的に見せることを重視。本文 → 読ませることを重視。
63
  - 字面や細部の形状による印象の違いを把握し比較検討する。懐の空き具合や大ぶり・小ぶり具合で印象が変わる。
 
 
 
 
 
 
 
64
  ## 文字組について
65
+ - 欧文書体: 空間が詰まると、「緊張感」や「力強さ」を生まれ、広がると、「余裕」や「癒し・安らぎ」を表現できる。
 
66
  - 和文書体: 筆の動き(筆脈)が破綻しないように意識する。左頭揃え: 左揃えで書体を組む場合、視覚的に左のラインを揃える。天揃え: 視覚的に上部のラインが揃うように調整する。
67
  - 和欧��植: 和文書体と欧文書体を同時に組むこと。タイトルやキャッチコピーなどの英数字は、できるだけ欧文書体を使う。同じフォントサイズで並べると欧文の方が小さく見えるため、欧文書体を120%前後に大きくし、ベースラインを少し上げる。
 
68
  # レイアウトについて
 
69
  ## レイアウトのコツ
70
  - 余白を使いこなす: 「抜け感」を意識する。・要素群を一箇所にまとめ、どこかに抜け感を作る・要素を一部裁ち落としたり、トリミングすることで、紙面外の空間の広がりを連想させる
71
  - オブジェクトの形状を利用したデザイン: ・オブジェクトの形状をレイアウトに利用する(三角形、円、四角形、L字、プラスなど)・自然な人の視線の流れ(Z型、F型)を意識して配置してみる。要素に合わせたデザインをしていく事で、空間・視線の流れを作り、バランス良く、かつ大胆なレイアウトが組めるようになる。
72
  - シンメトリーとアシンメトリー: シンメトリー = レイアウトの中心にガイドを設け、それを中心に左右対称に配置するレイアウト。中央揃えの多用は単調になるため注意。アシンメトリー = 左右非対称に配置した自由なレイアウト手法。厳格なルールはないが、空間バランスなど十分配慮する必要がある。
73
  - バランスの良さ = 重心を考える: 作品の中心に下から指を立てるようなイメージで、どちらかに重心が傾いて倒れないかを想像してみる。・グレースケールにして確認してみると、イメージしやすい・意図的にバランスを悪くすることもたまにある
 
74
  # 配色について
 
75
  ## 有彩色の与えるイメージ
76
  - 暖色: 前方に飛び出してくるように見え(進出色)、人の注意を引きつける色。光の波長が長く受け手側にエネルギーを必要とする。・赤: 情熱的、活動的、行動力、生命力、愛、衝動、祝い、興奮、歓喜、危険、刺激。・黄: 親しみやすい、陽気、積極的、自由、明るさ、未来、元気、幼稚、注意、希望。・橙: 健康、快活な、安心感、幸福感、近代的、高揚感
77
+ - 寒色: 落ち着きや広々とした雰囲気を感じさせる色。青: クール、知的、冷静、保守的、爽やか、忠実、涼しさ、理想、誠実、信頼。紫: 神秘、高貴、個性、ファッション性、優雅、哀れ、心配、上品、古典的
78
+ - 緑色: 受け手側に一番負担をかけない安らぐ色。緑: 自然(ナチュラル)、癒し、安らぎ、新鮮、平和、若々しさ、健康、田舎、安全
79
  - 茶色: 色相環にない色。2色以上を混ぜ合わせないとできない色。茶: 自然、明るさ、活気、土、田舎
80
  ## 無彩色の与えるイメージ
81
  - 白: 清潔、純粋、誠実、勝利、真実、空虚、神聖、公共性、公明性
 
88
  ## 色彩調和とは、色を組み合わせて、新たな効果を生み出すこと。対象物の用途を機能的に実現し、美しく調和した配色を施していく。
89
  - 色面積とその比率: 配色の面積によってもイメージは大きく変わる。ベースカラー、メインカラー(キーカラー)、アクセントカラー(サブカラー)を念頭に、色面積を検討する。・メインカラー … ブランド自身を表す役割を持つ基本色。デザインの中で一番印象づける色となる。・アクセントカラー … メインカラーを引き立てる役割。補色系が使われることが多い。色面積を多くしすぎないよう注意。・ベースカラー … 文字情報の可読性を損なわないよう、文字色とのコントラストを意識して選別する。
90
  ## ユーザー視点に立った配色のポイント
91
+ - 色だけに頼らないデザインを心がける。
92
  - 見やすい配色を心がける: 背景色と文字色のコントラスト差が低いと、ユーザーにストレスを感じさせてしまうので十分注意する。
93
  ## 配色のコツ
94
  - 単色等のキリの良すぎる値の色(例: #ff0000)は使わない。真っ黒(#000やK100%)もキツい印象のため基本的には避ける。
 
96
  - まずはグレースケールでデザインしてから、メインカラー(差し色)だけ入れてみる。配色イメージは最初に定めつつ、実際の配色作業は基本的に最後の工程で施す。メインカラーが引き立つデザインへ導くことができる
97
  - 色数が多くなるほど世界観を表現しづらくなるため、極力、有彩色の色数は増やさない。
98
  - 色の割合を必ず意識する。メインカラーの割合が、アクセントカラーの割合より少なくならないように注意する。
 
99
  - 色に頼りすぎない。色をなくしても(モノトーンにしても)成立するデザインにする。
100
  ## 配色の検討
101
  - 類似色: 同じトーンで色相を変化させた配色。強すぎずソフトな印象を与え、最も失敗しにくい。
 
161
  """
162
 
163
  graphic_transcription = GraphicTranscription(
164
+ platform=PLATFORM, model=MODEL, client_settings={"api_key": GOOGLE_API_KEY}
 
165
  )
166
  transcription = graphic_transcription(inputs=encode_image(image))
167
 
168
  graphic_poster_tutor = GraphicPosterTutor(
169
+ platform=PLATFORM, model=MODEL, client_settings={"api_key": GOOGLE_API_KEY}
 
170
  )
171
 
172
  return graphic_poster_tutor(