{"id":233,"date":"2025-04-13T14:51:15","date_gmt":"2025-04-13T05:51:15","guid":{"rendered":"https:\/\/appfreelife.com\/?p=233"},"modified":"2025-04-13T14:51:43","modified_gmt":"2025-04-13T05:51:43","slug":"google-%e4%b8%bb%e5%82%ac%e3%80%8egen-ai-intensive-course-capstone-2025q1%e3%80%8f%e3%81%ab%e5%8f%82%e5%8a%a0%e3%81%97%e3%81%be%e3%81%97%e3%81%9f%ef%bc%81","status":"publish","type":"post","link":"https:\/\/appfreelife.com\/?p=233","title":{"rendered":"Google \u4e3b\u50ac\u300eGen AI Intensive Course Capstone 2025Q1\u300f\u306b\u53c2\u52a0\u3057\u307e\u3057\u305f\uff01"},"content":{"rendered":"\n<p>2025\u5e743\u670831\u65e5\uff08\u6708\uff09\u304b\u30894\u67084\u65e5\uff08\u91d1\uff09\u307e\u3067\u958b\u50ac\u3055\u308c\u305fGoogle\u4e3b\u50ac\u306e5\u65e5\u9593\u96c6\u4e2d\u578b\u30b3\u30fc\u30b9\u300cGen AI Intensive Course with Google\u300d\u306b\u53c2\u52a0\u3057\u3001\u305d\u306e\u96c6\u5927\u6210\u3068\u306a\u308b\u300eCapstone Project\u300f\u3092\u5236\u4f5c\u3057\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u3053\u306eCapstone\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306f\u3001\u5b9f\u969b\u306b\u5b66\u3093\u3060\u751f\u6210AI\u6280\u8853\u3092\u5fdc\u7528\u3057\u3001\u81ea\u5206\u81ea\u8eab\u3067\u9078\u3093\u3060\u8ab2\u984c\u3084\u30a2\u30a4\u30c7\u30a2\u3092\u5b9f\u73fe\u3057\u307e\u3059\u3002<br>\u7279\u306b\u91cd\u8996\u3055\u308c\u3066\u3044\u308b\u306e\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u751f\u6210AI\u306e\u80fd\u529b\u3092\u6700\u4f4e\u3067\u30823\u3064\u7d44\u307f\u5408\u308f\u305b\u3066\u5b9f\u7528\u7684\u306a\u554f\u984c\u3092\u89e3\u6c7a\u3059\u308b\u3053\u3068\u3067\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list jinr-list\">\n<li>\u69cb\u9020\u5316\u51fa\u529b\uff08JSON\u30e2\u30fc\u30c9\uff09<\/li>\n\n\n\n<li>Few-shot \u30d7\u30ed\u30f3\u30d7\u30c8<\/li>\n\n\n\n<li>\u753b\u50cf\u8a8d\u8b58\u3084\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u7406\u89e3<\/li>\n\n\n\n<li>\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3084\u95a2\u6570\u547c\u3073\u51fa\u3057(Function Calling) \u306a\u3069<\/li>\n<\/ul>\n\n\n\n<p>\u512a\u79c0\u306a\u4f5c\u54c1\u3068\u3057\u3066\u8a55\u4fa1\u3055\u308c\u308b\u3068\u3001Kaggle\u3084Google\u516c\u5f0fSNS\u3067\u7d39\u4ecb\u3055\u308c\u308b\u7279\u5178\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading jinr-heading d--bold\">\u79c1\u306eCapstone\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\uff1a\u300c\u751f\u6210AI\u306b\u3088\u308b\u30ab\u30c3\u30d7\u30eb\u306e\u95a2\u4fc2\u6027\u5206\u6790\u30d7\u30ed\u30b0\u30e9\u30e0\u300d<\/h3>\n\n\n\n<p>\u79c1\u304c\u53d6\u308a\u7d44\u3093\u3060\u306e\u306f\u3001<strong>Google Gemini AI \u3092\u6d3b\u7528\u3057\u3066\u753b\u50cf\u8a8d\u8b58\u3068\u4f1a\u8a71\u5c65\u6b74\u304b\u3089\u30ab\u30c3\u30d7\u30eb\u30fb\u592b\u5a66\u9593\u306e\u95a2\u4fc2\u6027\u3084\u611f\u60c5\u306e\u72b6\u614b\u3092\u8a55\u4fa1\u3059\u308b\u30d7\u30ed\u30b0\u30e9\u30e0<\/strong>\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u5177\u4f53\u7684\u306b\u306f\u3001<\/p>\n\n\n\n<ul class=\"wp-block-list jinr-list\">\n<li>\u30ab\u30c3\u30d7\u30eb\u3084\u592b\u5a66\u306e\u5199\u771f\u3092\u5206\u6790\u3057\u3001\u300c\u8eab\u4f53\u306e\u8ddd\u96e2\u611f\u300d\u300c\u8996\u7dda\u306e\u63a5\u89e6\u300d\u300c\u8868\u60c5\u306e\u611f\u60c5\u8868\u73fe\u300d\u306a\u3069\u3092\u6570\u5024\u5316\u3057\u3066\u8a55\u4fa1\u3002<\/li>\n\n\n\n<li>\u4f1a\u8a71\u5c65\u6b74\u3092\u5206\u6790\u3057\u3066\u300c\u4f1a\u8a71\u306e\u4e3b\u5c0e\u6027\u300d\u300c\u5171\u611f\u3084\u4fa1\u5024\u89b3\u306e\u5171\u6709\u5ea6\u300d\u300c\u95a2\u4fc2\u306e\u6e29\u304b\u3055\u300d\u300c\u30dd\u30b8\u30c6\u30a3\u30d6\u307e\u305f\u306f\u30cd\u30ac\u30c6\u30a3\u30d6\u306a\u611f\u60c5\u6bd4\u7387\u300d\u306a\u3069\u306e\u6307\u6a19\u3092\u62bd\u51fa\u3002<\/li>\n\n\n\n<li>\u3053\u308c\u3089\u3092\u7dcf\u5408\u7684\u306bAI\u304c\u5224\u65ad\u3057\u3001\u95a2\u4fc2\u6027\u3092\u30b9\u30b3\u30a2\u5316\u3057\u3066\u3001\u3088\u308a\u8a73\u7d30\u306a\u5206\u6790\u3084\u6539\u5584\u63d0\u6848\u3092\u30ec\u30dd\u30fc\u30c8\u5f62\u5f0f\u3067\u51fa\u529b\u3057\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u672c\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u7528\u9014\u3092\u60f3\u5b9a\u3057\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list jinr-list\">\n<li>\u30d1\u30fc\u30c8\u30ca\u30fc\u9593\u306e\u30b3\u30df\u30e5\u30cb\u30b1\u30fc\u30b7\u30e7\u30f3\u6539\u5584\u30c4\u30fc\u30eb\u3068\u3057\u3066\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u30d7\u30ed\u306e\u30ab\u30a6\u30f3\u30bb\u30e9\u30fc\u3084\u30bb\u30e9\u30d4\u30b9\u30c8\u306e\u652f\u63f4\u30c4\u30fc\u30eb\u3068\u3057\u3066\u306e\u63d0\u4f9b<\/li>\n\n\n\n<li>\u81ea\u5df1\u8a8d\u8b58\u3084\u81ea\u5df1\u6539\u5584\u3092\u4fc3\u3059\u500b\u4eba\u5411\u3051\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u5316<\/li>\n<\/ul>\n\n\n\n<p>\u5c06\u6765\u7684\u306b\u306f\u3001\u3053\u306e\u30d7\u30ed\u30c8\u30bf\u30a4\u30d7\u3092\u30d9\u30fc\u30b9\u306b\u3057\u3066\u3001\u5b9f\u969b\u306b\u8ab0\u3067\u3082\u4f7f\u3048\u308b\u30a2\u30d7\u30ea\u3068\u3057\u3066\u958b\u767a\u3057\u3066\u3044\u304f\u4e88\u5b9a\u3067\u3059\u3002\u3053\u306e\u30d6\u30ed\u30b0\u3067\u306f\u3001\u958b\u767a\u306e\u9032\u6357\u3084\u5de5\u592b\u3057\u305f\u70b9\u3001AI\u6d3b\u7528\u306e\u30b3\u30c4\u306a\u3069\u3092\u7d99\u7d9a\u7684\u306b\u8a18\u9332\u3057\u3066\u3044\u304d\u307e\u3059\u306e\u3067\u3001\u305c\u3072\u304a\u697d\u3057\u307f\u306b\uff01<\/p>\n\n\n\n<h3 class=\"wp-block-heading jinr-heading d--bold\">Gen AI\u3092\u6d3b\u7528\u3057\u305f\u95a2\u4fc2\u6027\u5206\u6790\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u306e\u69cb\u7bc9<\/h3>\n\n\n\n<p>\u3053\u306eCapstone\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306f\u3001\u6700\u65b0\u306eGenerative AI\u6280\u8853\u3092\u7528\u3044\u3066\u3001\u753b\u50cf\u3068\u4f1a\u8a71\u30c6\u30ad\u30b9\u30c8\u304b\u3089\u4eba\u9593\u95a2\u4fc2\u306e\u611f\u60c5\u7684\u306a\u72b6\u614b\u3092\u5206\u6790\u3059\u308b\u30a4\u30f3\u30bf\u30e9\u30af\u30c6\u30a3\u30d6\u306a\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u3092\u69cb\u7bc9\u3057\u307e\u3057\u305f\u3002\u4ee5\u4e0b\u3001\u5404\u30bb\u30af\u30b7\u30e7\u30f3\u3054\u3068\u306e\u8a73\u7d30\u306a\u8aac\u660e\u3068\u30b3\u30fc\u30c9\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading jinr-heading d--bold\">1. \u74b0\u5883\u69cb\u7bc9\u3068\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/h2>\n\n\n\n<p>\u672c\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306f\u3001Kaggle\u306e\u30d9\u30fc\u30b9\u74b0\u5883\u3068\u306e\u7af6\u5408\u3092\u9632\u3050\u305f\u3081\u4e0d\u8981\u306a\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u524a\u9664\u3057\u3001\u5fc5\u8981\u306a\u6700\u65b0\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3057\u305f\u3002\u4e3b\u306bLangGraph\u3068Google Generative AI\u95a2\u9023\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u4f7f\u7528\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u4e0d\u8981\u306a\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30a2\u30f3\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\n!pip uninstall -qqy kfp jupyterlab libpysal thinc spacy fastai ydata-profiling google-cloud-bigquery google-generativeai\n\n# \u5fc5\u8981\u306a\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\n!pip install -qU 'langgraph==0.3.21' 'langchain-google-genai==2.1.2' 'langgraph-prebuilt==0.1.7'\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading jinr-heading d--bold\">2. API\u30ad\u30fc\u8a2d\u5b9a\u3068\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u30a4\u30f3\u30dd\u30fc\u30c8<\/h2>\n\n\n\n<p>Google API\u30ad\u30fc\uff08Gemini\u30e2\u30c7\u30eb\u7528\uff09\u306f\u5b89\u5168\u306bKaggle\u306e\u30b7\u30fc\u30af\u30ec\u30c3\u30c8\u6a5f\u80fd\u3092\u7528\u3044\u3066\u8a2d\u5b9a\u3057\u307e\u3059\u3002\u307e\u305f\u3001\u5206\u6790\u306b\u5fc5\u8981\u306a\u5404\u7a2e\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import os\nfrom kaggle_secrets import UserSecretsClient\n\nGOOGLE_API_KEY = UserSecretsClient().get_secret(\"Gemini API\")\nos.environ&#91;\"GOOGLE_API_KEY\"] = GOOGLE_API_KEY\n\n%matplotlib inline\nimport json\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom google import genai\nfrom pydantic import BaseModel, Field\nfrom langgraph.graph import StateGraph\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading jinr-heading d--bold\">3. \u30c7\u30fc\u30bf\u30b9\u30ad\u30fc\u30de\u306e\u5b9a\u7fa9<\/h2>\n\n\n\n<p>Pydantic\u3092\u7528\u3044\u3066\u30e2\u30c7\u30eb\u304b\u3089\u306e\u51fa\u529b\u3092\u69cb\u9020\u5316\u3057\u3001\u30c7\u30fc\u30bf\u306e\u54c1\u8cea\u3068\u6574\u5408\u6027\u3092\u62c5\u4fdd\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list jinr-list\">\n<li><strong>\u7dcf\u5408\u611f\u60c5\u8a55\u4fa1<\/strong><\/li>\n\n\n\n<li><strong>\u753b\u50cf\u5206\u6790\u7d50\u679c<\/strong><\/li>\n\n\n\n<li><strong>\u4f1a\u8a71\u5206\u6790\u7d50\u679c<\/strong><\/li>\n\n\n\n<li><strong>\u8907\u5408\u5206\u6790\u30ec\u30dd\u30fc\u30c8<\/strong><\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>class SummaryRating(BaseModel):\n    comprehensive_emotional_index: int = Field(..., ge=1, le=100, description=\"Overall emotional index, between 1-100.\")\n    confidence_score: int = Field(..., ge=1, le=100, description=\"Confidence score, between 1-100.\")\n    rating_reason: str = Field(..., description=\"A one-sentence summary of the rating rationale.\")\n    supplement_suggestion: str = Field(..., description=\"Suggestions for supplementary user input.\")\n\nclass ImageAnalysisResponse(BaseModel):\n    description: str = Field(..., description=\"A textual description of the image's content.\")\n    proximity_score: float = Field(..., ge=0, le=1, description=\"Score indicating closeness between subjects (0 to 1).\")\n    eye_contact_score: float = Field(..., ge=0, le=1, description=\"Score reflecting eye contact (0 to 1).\")\n    facial_expression_score: float = Field(..., ge=0, le=1, description=\"Score of facial expressions (0 to 1).\")\n    body_touch_score: float = Field(..., ge=0, le=1, description=\"Score representing physical contact (0 to 1).\")\n    reason: str = Field(..., description=\"Analysis reasoning based on image observations.\")\n\nclass ConversationAnalysisResponse(BaseModel):\n    positive_ratio: float = Field(..., ge=0, le=1, description=\"Proportion of positive sentiment.\")\n    negative_ratio: float = Field(..., ge=0, le=1, description=\"Proportion of negative sentiment.\")\n    initiative_score: float = Field(..., ge=0, le=1, description=\"Score for conversational initiative (0 to 1).\")\n    value_alignment_score: float = Field(..., ge=0, le=1, description=\"Score for shared values (0 to 1).\")\n    relationship_warmth_score: float = Field(..., ge=0, le=1, description=\"Score for the warmth of the relationship (0 to 1).\")\n    toxicity_probability: float = Field(..., ge=0, le=1, description=\"Probability score for potential toxicity.\")\n    reason: str = Field(..., description=\"Rationale derived from the conversation and image analysis.\")\n\nclass CompositeReport(BaseModel):\n    composite_reason: str = Field(..., description=\"Overall composite rating rationale provided by a mental health and relationship expert perspective.\")\n    detailed_report: str = Field(..., description=\"Comprehensive analysis report with insights and recommendations.\")\n    model_config = ConfigDict(ref_template=None)\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading jinr-heading d--bold\">4. Gemini API\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u521d\u671f\u5316<\/h2>\n\n\n\n<p>Gemini\u306e\u300cgemini-2.0-flash\u300d\u30e2\u30c7\u30eb\u3092\u5229\u7528\u3057\u3066\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u751f\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>client = genai.Client(api_key=GOOGLE_API_KEY)\nllm = client.chats.create(model='gemini-2.0-flash')\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading jinr-heading d--bold\">5. JSON\u30ec\u30b9\u30dd\u30f3\u30b9\u62bd\u51fa\u7528\u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3\u95a2\u6570<\/h2>\n\n\n\n<p>\u30e2\u30c7\u30eb\u304b\u3089\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\u5185\u306b\u542b\u307e\u308c\u308bJSON\u30c7\u30fc\u30bf\u3092\u5b89\u5168\u306b\u53d6\u308a\u51fa\u3057\u3001\u30a8\u30e9\u30fc\u6642\u306e\u5bfe\u5fdc\u3082\u5b9f\u88c5\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def extract_json_from_response(response_text) -&gt; dict:\n    #print(\"response_text:\", response_text)\n    \n    # Convert non-string responses to string\n    if not isinstance(response_text, str):\n        response_text = str(response_text)\n    \n    # Extract JSON content from markdown code fences if present\n    m = re.search(r\"```json\\s*(\\{.*\\})\\s*```\", response_text, re.DOTALL)\n    if m:\n        json_str = m.group(1)\n    else:\n        # Fallback: extract from first '{' to last '}'\n        start = response_text.find('{')\n        end = response_text.rfind('}')\n        if start != -1 and end != -1 and end &gt; start:\n            json_str = response_text&#91;start:end+1]\n        else:\n            print(\"Unable to locate valid JSON content in the response.\")\n            return {\n                \"comprehensive_emotional_index\": 50,\n                \"confidence_score\": 50,\n                \"rating_reason\": \"Unable to retrieve a valid rating.\",\n                \"supplement_suggestion\": \"Please provide more conversational data.\"\n            }\n    try:\n        data = json.loads(json_str)\n        return data\n    except Exception as e:\n        print(\"JSON parsing error:\", e)\n        return {\n            \"comprehensive_emotional_index\": 50,\n            \"confidence_score\": 50,\n            \"rating_reason\": \"Unable to retrieve a valid rating.\",\n            \"supplement_suggestion\": \"Please provide more conversational data.\"\n        }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading jinr-heading d--bold\">6. \u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u30ce\u30fc\u30c9\u95a2\u6570\u306e\u5b9a\u7fa9<\/h2>\n\n\n\n<p>\u5404\u30ce\u30fc\u30c9\u306f\u753b\u50cf\u3068\u4f1a\u8a71\u30c7\u30fc\u30bf\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3001\u8981\u4ef6\u30c1\u30a7\u30c3\u30af\u3001\u753b\u50cf\u5206\u6790\u3001\u4f1a\u8a71\u5206\u6790\u3001\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u3001\u5206\u6790\u306e\u518d\u8abf\u6574\u3001\u6700\u7d42\u30ec\u30dd\u30fc\u30c8\u306e\u4fdd\u5b58\u3092\u884c\u3044\u307e\u3059\u3002\u753b\u50cf\u3084\u4f1a\u8a71\u306e\u611f\u60c5\u30b9\u30b3\u30a2\u3092\u30b0\u30e9\u30d5\u5316\u3057\u3066\u8996\u899a\u7684\u306b\u3082\u308f\u304b\u308a\u3084\u3059\u304f\u63d0\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306f\u3001LangGraph\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3092\u5229\u7528\u3057\u3066\u30b9\u30c6\u30fc\u30c8\u30b0\u30e9\u30d5\u3092\u53ef\u8996\u5316\u3057\u3066\u3044\u307e\u3059\u3002\u5404\u30ce\u30fc\u30c9\u306e\u7e4b\u304c\u308a\u304c\u660e\u78ba\u306b\u8996\u899a\u5316\u3055\u308c\u308b\u3053\u3068\u3067\u3001\u51e6\u7406\u306e\u6d41\u308c\u304c\u76f4\u611f\u7684\u306b\u7406\u89e3\u3067\u304d\u307e\u3059\u3002\u307e\u305f\u3001\u5b9f\u969b\u306e\u5206\u6790\u3082\u3053\u306e\u30b0\u30e9\u30d5\u306e\u6d41\u308c\u306b\u6cbf\u3063\u3066\u81ea\u52d5\u7684\u306b\u5b9f\u884c\u3055\u308c\u3001\u6700\u7d42\u7684\u306a\u30ec\u30dd\u30fc\u30c8\u3092\u51fa\u529b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading jinr-heading d--bold\">\u300c\u30b9\u30c6\u30fc\u30c8\u30b0\u30e9\u30d5\uff08State Graph\uff09\u300d\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u89e3\u8aac<\/h2>\n\n\n\n<p>\u3053\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306f\u3001\u51e6\u7406\u306e\u6d41\u308c\u3092\u300c\u30b9\u30c6\u30fc\u30c8\u30b0\u30e9\u30d5\u300d\u3068\u3044\u3046\u5f62\u5f0f\u3067\u8a2d\u8a08\u3057\u3066\u3044\u307e\u3059\u3002\u30b9\u30c6\u30fc\u30c8\u30b0\u30e9\u30d5\u3068\u306f\u3001\u8907\u6570\u306e\u51e6\u7406\u30b9\u30c6\u30c3\u30d7\u3092\u305d\u308c\u305e\u308c\u300c\u30ce\u30fc\u30c9\uff08Node\uff09\u300d\u3068\u3044\u3046\u5358\u4f4d\u3067\u8868\u3057\u3001\u305d\u308c\u3089\u3092\u3064\u306a\u3044\u3067\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u3092\u69cb\u6210\u3059\u308b\u4ed5\u7d44\u307f\u3067\u3059\u3002\u5404\u30ce\u30fc\u30c9\u306f\u7279\u5b9a\u306e\u5f79\u5272\u3092\u6301\u3063\u3066\u304a\u308a\u3001\u305d\u308c\u305e\u308c\u306e\u30ce\u30fc\u30c9\u3092\u9806\u756a\u306b\u5b9f\u884c\u3059\u308b\u3053\u3068\u3067\u3001\u5168\u4f53\u306e\u51e6\u7406\u304c\u5b8c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4ee5\u4e0b\u306b\u3001\u3053\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u4f7f\u7528\u3057\u3066\u3044\u308b\u5404\u30ce\u30fc\u30c9\u306e\u5f79\u5272\u3084\u51e6\u7406\u306e\u8a73\u7d30\u3092\u8a73\u3057\u304f\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading jinr-heading d--bold\">\u5404\u30ce\u30fc\u30c9\uff08\u51e6\u7406\u30b9\u30c6\u30c3\u30d7\uff09\u306e\u8a73\u7d30\u8aac\u660e<\/h2>\n\n\n\n<h3 class=\"wp-block-heading jinr-heading d--bold\"><strong>Node 1: \u30c7\u30fc\u30bf\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\uff08upload_data\uff09<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading jinr-heading d--bold\">\u3010\u76ee\u7684\u3011<\/h4>\n\n\n\n<p>\u30e6\u30fc\u30b6\u30fc\u306b\u3001\u5206\u6790\u5bfe\u8c61\u3068\u306a\u308b\u753b\u50cf\u30d5\u30a1\u30a4\u30eb\u3068\u4f1a\u8a71\u5c65\u6b74\uff08\u30c6\u30ad\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\uff09\u306e\u5834\u6240\u3092\u6307\u5b9a\u3057\u3066\u3082\u3089\u3044\u3001\u305d\u308c\u3089\u3092\u30b7\u30b9\u30c6\u30e0\u306b\u8aad\u307f\u8fbc\u307f\u307e\u3059\u3002\u3059\u3067\u306b\u30c7\u30fc\u30bf\u304c\u3042\u308b\u5834\u5408\u3001\u3055\u3089\u306b\u30c7\u30fc\u30bf\u3092\u8ffd\u52a0\u3059\u308b\u304b\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading jinr-heading d--bold\">\u3010\u5177\u4f53\u7684\u306a\u51e6\u7406\u3011<\/h4>\n\n\n\n<ul class=\"wp-block-list jinr-list\">\n<li>\u753b\u50cf\u3068\u4f1a\u8a71\u5c65\u6b74\u306e\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9\uff08\u5834\u6240\uff09\u3092\u30e6\u30fc\u30b6\u30fc\u304b\u3089\u5165\u529b\u3002<\/li>\n\n\n\n<li>\u5165\u529b\u304c\u306a\u3044\u5834\u5408\u3001\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u30d1\u30b9\u3092\u4f7f\u7528\u3002<\/li>\n\n\n\n<li>\u6307\u5b9a\u3055\u308c\u305f\u753b\u50cf\u30d5\u30a1\u30a4\u30eb\u304c\u6b63\u5e38\u306b\u958b\u3051\u308b\u304b\u3001\u30c6\u30ad\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u304c\u8aad\u3081\u308b\u304b\u3092\u78ba\u8a8d\u3002<\/li>\n\n\n\n<li>\u8aad\u307f\u8fbc\u3093\u3060\u30c7\u30fc\u30bf\u3092\u6b21\u306e\u51e6\u7406\u306b\u6e21\u3059\u305f\u3081\u306b\u3001<code>state<\/code>\u3068\u3044\u3046\u8f9e\u66f8\u578b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306b\u683c\u7d0d\u3057\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading jinr-heading d--bold\"><strong>Node 2: \u904e\u53bb\u306e\u5206\u6790\u60c5\u5831\u3092\u5229\u7528\uff08use_existing_info\uff09<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading jinr-heading d--bold\">\u3010\u76ee\u7684\u3011<\/h4>\n\n\n\n<p>\u904e\u53bb\u306b\u5b9f\u65bd\u3057\u305f\u5206\u6790\u7d50\u679c\u304c\u4fdd\u5b58\u3055\u308c\u3066\u3044\u308b\u5834\u5408\u3001\u305d\u306e\u60c5\u5831\u3092\u73fe\u5728\u306e\u5206\u6790\u306b\u8ffd\u52a0\u3067\u5229\u7528\u3059\u308b\u304b\u3069\u3046\u304b\u3092\u30e6\u30fc\u30b6\u30fc\u306b\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading jinr-heading d--bold\">\u3010\u5177\u4f53\u7684\u306a\u51e6\u7406\u3011<\/h4>\n\n\n\n<ul class=\"wp-block-list jinr-list\">\n<li>\u73fe\u5728\u306e\u30d5\u30a9\u30eb\u30c0\u306b\u904e\u53bb\u306e\u5206\u6790\u7d50\u679c\uff08JSON\u30d5\u30a1\u30a4\u30eb\uff09\u304c\u3042\u308b\u304b\u691c\u7d22\u3002<\/li>\n\n\n\n<li>\u904e\u53bb\u306e\u7d50\u679c\u304c\u3042\u308c\u3070\u3001\u30e6\u30fc\u30b6\u30fc\u306b\u5229\u7528\u3059\u308b\u304b\u3069\u3046\u304b\u5c0b\u306d\u308b\u3002<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u304c\u4f7f\u7528\u3092\u5e0c\u671b\u3057\u305f\u5834\u5408\u3001\u9078\u629e\u3057\u305f\u30d5\u30a1\u30a4\u30eb\u306e\u5185\u5bb9\u3092\u8aad\u307f\u53d6\u308a\u3001\u4ee5\u964d\u306e\u5206\u6790\u306b\u6d3b\u7528\u3002<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading jinr-heading d--bold\"><strong>Node 3: \u5206\u6790\u8981\u4ef6\u30c1\u30a7\u30c3\u30af\uff08check_requirements\uff09<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading jinr-heading d--bold\">\u3010\u76ee\u7684\u3011<\/h4>\n\n\n\n<p>\u8aad\u307f\u8fbc\u3093\u3060\u753b\u50cf\u3068\u4f1a\u8a71\u30c7\u30fc\u30bf\u3092\u7d71\u5408\u3057\u3001Google\u306e\u751f\u6210AI\uff08Gemini\u30e2\u30c7\u30eb\uff09\u3092\u4f7f\u3063\u3066\u3001\u5206\u6790\u306b\u5fc5\u8981\u306a\u6700\u4f4e\u9650\u306e\u30c7\u30fc\u30bf\u304c\u63c3\u3063\u3066\u3044\u308b\u304b\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading jinr-heading d--bold\">\u3010\u5177\u4f53\u7684\u306a\u51e6\u7406\u3011<\/h4>\n\n\n\n<ul class=\"wp-block-list jinr-list\">\n<li>\u753b\u50cf\u3068\u4f1a\u8a71\u306e\u30c7\u30fc\u30bf\u3092\u3082\u3068\u306b\u3001AI\u306b\u6982\u8981\u7684\u306a\u5206\u6790\u3092\u4f9d\u983c\u3002<\/li>\n\n\n\n<li>AI\u304b\u3089\u3001\u300c\u5168\u4f53\u7684\u306a\u611f\u60c5\u6307\u6570\uff08\u7dcf\u5408\u30b9\u30b3\u30a2\uff09\u300d\u300c\u4fe1\u983c\u5ea6\u300d\u300c\u8a55\u4fa1\u7406\u7531\u300d\u300c\u8ffd\u52a0\u3067\u63a8\u5968\u3059\u308b\u60c5\u5831\u300d\u306a\u3069\u3092\u53d6\u5f97\u3002<\/li>\n\n\n\n<li>\u4fe1\u983c\u5ea6\u304c\u4e00\u5b9a\u4ee5\u4e0b\uff08\u4f8b: 70\u70b9\u672a\u6e80\uff09\u306e\u5834\u5408\u306f\u3001\u30c7\u30fc\u30bf\u8ffd\u52a0\u3092\u8981\u6c42\u3059\u308b\u3088\u3046\u8a2d\u8a08\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading jinr-heading d--bold\"><strong>Node 4: \u753b\u50cf\u5206\u6790\uff08analyze_image\uff09<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading jinr-heading d--bold\">\u3010\u76ee\u7684\u3011<\/h4>\n\n\n\n<p>\u8aad\u307f\u8fbc\u3093\u3060\u5404\u753b\u50cf\u3092Google Gemini AI\u3067\u8a73\u3057\u304f\u5206\u6790\u3057\u3001\u95a2\u4fc2\u6027\u3084\u611f\u60c5\u3092\u6570\u5024\u3067\u8a55\u4fa1\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading jinr-heading d--bold\">\u3010\u5177\u4f53\u7684\u306a\u51e6\u7406\u3011<\/h4>\n\n\n\n<ul class=\"wp-block-list jinr-list\">\n<li>\u5404\u753b\u50cf\u306b\u3064\u3044\u3066\u300c\u8ddd\u96e2\u611f\u300d\u300c\u30a2\u30a4\u30b3\u30f3\u30bf\u30af\u30c8\u300d\u300c\u8868\u60c5\u300d\u300c\u8eab\u4f53\u7684\u63a5\u89e6\u300d\u306e\u6307\u6a19\u3092\u6570\u5024\u5316\u3002<\/li>\n\n\n\n<li>\u5206\u6790\u7d50\u679c\u3092\u5f8c\u306e\u30ec\u30dd\u30fc\u30c8\u4f5c\u6210\u306e\u305f\u3081\u306b\u30ea\u30b9\u30c8\u306b\u4fdd\u7ba1\u3057\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading jinr-heading d--bold\"><strong>Node 5: \u4f1a\u8a71\u5206\u6790\uff08analyze_conversation\uff09<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading jinr-heading d--bold\">\u3010\u76ee\u7684\u3011<\/h4>\n\n\n\n<p>\u5165\u529b\u3055\u308c\u305f\u4f1a\u8a71\u5c65\u6b74\u3092\u5206\u6790\u3057\u3001\u611f\u60c5\u50be\u5411\u3084\u95a2\u4fc2\u6027\u306e\u8cea\u306a\u3069\u3092\u6570\u5024\u5316\u3057\u3066\u8a55\u4fa1\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading jinr-heading d--bold\">\u3010\u5177\u4f53\u7684\u306a\u51e6\u7406\u3011<\/h4>\n\n\n\n<ul class=\"wp-block-list jinr-list\">\n<li>\u4f1a\u8a71\u306e\u4e2d\u306e\u300c\u30dd\u30b8\u30c6\u30a3\u30d6\u306a\u611f\u60c5\u306e\u5272\u5408\u300d\u300c\u30cd\u30ac\u30c6\u30a3\u30d6\u306a\u611f\u60c5\u306e\u5272\u5408\u300d\u300c\u5bfe\u8a71\u306e\u4e3b\u5c0e\u6a29\u300d\u300c\u4fa1\u5024\u89b3\u306e\u4e00\u81f4\u5ea6\u300d\u300c\u95a2\u4fc2\u6027\u306e\u6e29\u304b\u3055\u300d\u300c\u6bd2\u6027\uff08\u4e0d\u5065\u5168\u306a\u3084\u308a\u3068\u308a\uff09\u306e\u53ef\u80fd\u6027\u300d\u306a\u3069\u3092\u7b97\u51fa\u3002<\/li>\n\n\n\n<li>\u7b97\u51fa\u3057\u305f\u30c7\u30fc\u30bf\u306f\u6b21\u306e\u30ec\u30dd\u30fc\u30c8\u4f5c\u6210\u306b\u6d3b\u7528\u3055\u308c\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading jinr-heading d--bold\"><strong>Node 6: \u7dcf\u5408\u30ec\u30dd\u30fc\u30c8\u4f5c\u6210\uff08generate_report\uff09<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading jinr-heading d--bold\">\u3010\u76ee\u7684\u3011<\/h4>\n\n\n\n<p>\u753b\u50cf\u3068\u4f1a\u8a71\u306e\u5206\u6790\u7d50\u679c\u3092\u7d71\u5408\u3057\u3001AI\u304c\u6700\u7d42\u7684\u306a\u95a2\u4fc2\u6027\u306e\u7dcf\u5408\u8a55\u4fa1\u3092\u30ec\u30dd\u30fc\u30c8\u3068\u3057\u3066\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading jinr-heading d--bold\">\u3010\u5177\u4f53\u7684\u306a\u51e6\u7406\u3011<\/h4>\n\n\n\n<ul class=\"wp-block-list jinr-list\">\n<li>\u753b\u50cf\u30fb\u4f1a\u8a71\u305d\u308c\u305e\u308c\u306e\u6307\u6a19\u3092\u5e73\u5747\u5316\u3057\u3066\u7dcf\u5408\u30b9\u30b3\u30a2\u3092\u7b97\u51fa\u3002<\/li>\n\n\n\n<li>\u30b0\u30e9\u30d5\u3092\u4f5c\u6210\u3057\u3066\u753b\u50cf\u3068\u4f1a\u8a71\u306e\u5206\u6790\u7d50\u679c\u3092\u8996\u899a\u7684\u306b\u63d0\u793a\u3002<\/li>\n\n\n\n<li>\u5168\u60c5\u5831\u3092\u3082\u3068\u306b\u3001Google Gemini AI\u306b\u7dcf\u5408\u8a55\u4fa1\u3068\u5177\u4f53\u7684\u306a\u6539\u5584\u63d0\u6848\u3092\u4f9d\u983c\u3002<\/li>\n\n\n\n<li>\u8a73\u7d30\u3067\u308f\u304b\u308a\u3084\u3059\u3044\u30ec\u30dd\u30fc\u30c8\u3068\u3057\u3066\u51fa\u529b\u3057\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading jinr-heading d--bold\"><strong>Node 7: \u30ec\u30dd\u30fc\u30c8\u3078\u306e\u8ffd\u52a0\u60c5\u5831\u306e\u6307\u793a\uff08guidance\uff09<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading jinr-heading d--bold\">\u3010\u76ee\u7684\u3011<\/h4>\n\n\n\n<p>\u4f5c\u6210\u3055\u308c\u305f\u30ec\u30dd\u30fc\u30c8\u3092\u8868\u793a\u3057\u3001\u30e6\u30fc\u30b6\u30fc\u304c\u8ffd\u52a0\u60c5\u5831\u306b\u3088\u308b\u5206\u6790\u306e\u6539\u5584\u3092\u671b\u3080\u304b\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading jinr-heading d--bold\">\u3010\u5177\u4f53\u7684\u306a\u51e6\u7406\u3011<\/h4>\n\n\n\n<ul class=\"wp-block-list jinr-list\">\n<li>\u30e6\u30fc\u30b6\u30fc\u304c\u8ffd\u52a0\u60c5\u5831\u3092\u6c42\u3081\u308b\u5834\u5408\u3001\u6b21\u306e\u5206\u6790\u6539\u5584\u51e6\u7406\uff08Node 8\uff09\u3078\u9032\u3080\u3002<\/li>\n\n\n\n<li>\u5fc5\u8981\u306a\u3051\u308c\u3070\u3001\u6700\u7d42\u4fdd\u5b58\u51e6\u7406\uff08Node 9\uff09\u306b\u9032\u307f\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading jinr-heading d--bold\"><strong>Node 8: \u5206\u6790\u6539\u5584\uff08refine_analysis\uff09<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading jinr-heading d--bold\">\u3010\u76ee\u7684\u3011<\/h4>\n\n\n\n<p>\u30e6\u30fc\u30b6\u30fc\u304c\u65b0\u305f\u306b\u63d0\u4f9b\u3057\u305f\u8ffd\u52a0\u30c7\u30fc\u30bf\uff08\u65b0\u3057\u3044\u753b\u50cf\u3084\u4f1a\u8a71\uff09\u3092\u5143\u306e\u30c7\u30fc\u30bf\u306b\u7d71\u5408\u3057\u3001\u518d\u5ea6\u3088\u308a\u7cbe\u5bc6\u306a\u5206\u6790\u3092\u884c\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading jinr-heading d--bold\">\u3010\u5177\u4f53\u7684\u306a\u51e6\u7406\u3011<\/h4>\n\n\n\n<ul class=\"wp-block-list jinr-list\">\n<li>\u65b0\u305f\u306b\u8ffd\u52a0\u3055\u308c\u305f\u30c7\u30fc\u30bf\u3092\u65e2\u5b58\u30c7\u30fc\u30bf\u306b\u7d71\u5408\u3002<\/li>\n\n\n\n<li>\u8ffd\u52a0\u60c5\u5831\u306e\u91cd\u8981\u5ea6\u3092\u9ad8\u3081\u3066\u518d\u5206\u6790\u3092\u5b9f\u65bd\u3002<\/li>\n\n\n\n<li>\u3088\u308a\u6b63\u78ba\u3067\u8a73\u7d30\u306a\u6700\u7d42\u30ec\u30dd\u30fc\u30c8\u3092\u751f\u6210\u3057\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading jinr-heading d--bold\"><strong>Node 9: \u30ec\u30dd\u30fc\u30c8\u4fdd\u5b58\uff08save_report\uff09<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading jinr-heading d--bold\">\u3010\u76ee\u7684\u3011<\/h4>\n\n\n\n<p>\u6700\u7d42\u7684\u306a\u5206\u6790\u30ec\u30dd\u30fc\u30c8\u3092\u3001\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u4ed8\u304d\u306eJSON\u5f62\u5f0f\u3067\u30ed\u30fc\u30ab\u30eb\u306b\u4fdd\u5b58\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading jinr-heading d--bold\">\u3010\u5177\u4f53\u7684\u306a\u51e6\u7406\u3011<\/h4>\n\n\n\n<ul class=\"wp-block-list jinr-list\">\n<li>\u73fe\u5728\u306e\u65e5\u6642\u3067\u30d5\u30a1\u30a4\u30eb\u540d\u3092\u6c7a\u5b9a\u3002<\/li>\n\n\n\n<li>JSON\u5f62\u5f0f\u3067\u5206\u6790\u30ec\u30dd\u30fc\u30c8\u3092\u4fdd\u5b58\u3057\u3001\u5c06\u6765\u306e\u95b2\u89a7\u3084\u5229\u7528\u306b\u5099\u3048\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<pre class=\"wp-block-code\"><code># Node 1: upload_data\ndef upload_data(state: dict) -&gt; dict:\n    # Default file paths.\n    default_image_path = \"\/kaggle\/input\/sample-pictures\/sadcouple.png\"\n    default_conv_path = \"\/kaggle\/input\/sampletxt\/angrychat.txt\"\n    default_new_conv_path = \"\/kaggle\/input\/sampletxt\/coldchat.txt\"\n    default_new_image_path = \"\/kaggle\/input\/sample-pictures\/coldcouple.png\"\n    \n    # If data already exists, ask whether to append.\n    if state.get(\"image_path\") is not None and state.get(\"conv_path\") is not None:\n        if not isinstance(state&#91;\"image_path\"], list):\n            state&#91;\"image_path\"] = &#91;state&#91;\"image_path\"]]\n        if not isinstance(state&#91;\"conv_path\"], list):\n            state&#91;\"conv_path\"] = &#91;state&#91;\"conv_path\"]]\n            \n        append_choice = input(\"Data already exists. Do you want to append new data? (yes\/no): \").strip().lower()\n        if append_choice == \"yes\":\n            new_conv_path = input(\"Enter the path for additional conversation text (or press Enter for default or copy the datapath from dataset): \").strip()\n            if not new_conv_path:\n                new_conv_path = default_new_conv_path\n            try:\n                with open(new_conv_path, \"r\", encoding=\"utf-8\") as f:\n                    new_data = f.read()\n                print(\"Additional conversation data read successfully.\")\n            except Exception as e:\n                print(\"Error reading additional conversation data:\", e)\n            \n            new_image_path = input(\"Enter the path for additional image (or press Enter for default or copy the datapath from dataset): \").strip()\n            if not new_image_path:\n                new_image_path = default_new_image_path\n            try:\n                with PILImage.open(new_image_path) as img:\n                    img.verify()\n                print(\"Additional image read successfully.\")\n            except Exception as e:\n                print(\"Error reading additional image:\", e)\n    \n            # Append the new data\n            state&#91;\"conv_data\"] += \"\\nAdditional Data:\\n\" + new_data\n            state&#91;\"conv_path\"].append(new_conv_path)\n            state&#91;\"image_path\"].append(new_image_path)\n        else:\n            print(\"Keeping original data without appending.\")\n    else:\n        user_upload_image = input(\"Enter the image file path (or press Enter for default or copy the datapath from dataset): \").strip()\n        if not user_upload_image:\n            user_upload_image = default_image_path\n        \n        user_upload_conv = input(\"Enter the conversation text file path (or press Enter for default or copy the datapath from dataset): \").strip()\n        if not user_upload_conv:\n            user_upload_conv = default_conv_path\n        \n        try:\n            with open(user_upload_conv, \"r\", encoding=\"utf-8\") as f:\n                txtdata = f.read()\n            print(\"Conversation data read successfully.\")\n        except Exception as e:\n            print(\"Error reading conversation data:\", e)\n            txtdata = \"\"\n        \n        try:\n            with PILImage.open(user_upload_image) as img:\n                img.verify()\n            print(\"Image loaded successfully.\")\n        except Exception as e:\n            print(\"Error loading image:\", e)\n        \n        state&#91;\"conv_data\"] = txtdata\n        state&#91;\"image_path\"] = &#91;user_upload_image]\n        state&#91;\"conv_path\"] = &#91;user_upload_conv]\n        \n        if not txtdata.strip():\n            supplement = input(\"Conversation text is empty. Please provide missing data: \").strip()\n            state&#91;\"previous_data\"] = supplement  # Initialize or append as needed.\n    \n    #print(\"Uploaded conversation data:\")\n    #print(state&#91;\"conv_data\"])\n    print(\"Image file paths:\", state&#91;\"image_path\"])\n    print(\"Conversation file paths:\", state&#91;\"conv_path\"])\n    return state\n\n# Node 2: use_existing_info\ndef use_existing_info(state: dict) -&gt; dict:\n    report_files = glob.glob(\"analysis_report_*.json\")\n    if not report_files:\n        print(\"Step2 - No existing reports found; skipping existing info step.\")\n        state&#91;\"previous_data\"] = None\n        return state\n    \n    answer = input(\"Existing report file detected. Use previous info for further analysis? (yes\/no): \").strip().lower()\n    if answer != \"yes\":\n        state&#91;\"previous_data\"] = None\n        print(\"Not using previous info.\")\n    else:\n        print(\"Using existing info. Choose one of the following report files:\")\n        for idx, file in enumerate(report_files):\n            print(f\"{idx+1}. {file}\")\n        try:\n            choice = int(input(\"Enter the report number: \"))\n            if 1 &lt;= choice &lt;= len(report_files):\n                selected_file = report_files&#91;choice - 1]\n                with open(selected_file, \"r\", encoding=\"utf-8\") as f:\n                    previous_data = json.load(f)\n                state&#91;\"previous_data\"] = previous_data\n                print(f\"Selected {selected_file} as previous info.\")\n            else:\n                print(\"Choice out of range; not using previous info.\")\n                state&#91;\"previous_data\"] = None\n        except Exception as e:\n            print(\"Input error; not using previous info.\", e)\n            state&#91;\"previous_data\"] = None\n    return state\n\n# For print text color\nBLUE = \"\\033&#91;94m\"\nRED = \"\\033&#91;91m\"\nGREEN = \"\\033&#91;92m\"\nRESET = \"\\033&#91;0m\"\n\n\n# Node 3: check_requirements\ndef check_requirements(state: dict) -&gt; dict:\n    photo_prompt = \"\"\"\n    Please carefully analyze this image and describe:\n    - The physical proximity between the subjects.\n    - Facial expressions.\n    - Eye contact.\n    - Any physical touch.\n    Provide a brief textual description.\n    \"\"\"\n    image_list = state.get(\"image_path\", &#91;])\n    all_photo_description = \"\"\n    if image_list:\n        for img_path in image_list:\n            with PILImage.open(img_path) as img:\n                photo_response = client.models.generate_content(\n                    model='gemini-2.0-flash',\n                    contents=&#91;img, photo_prompt]\n                )\n            try:\n                photo_desc = photo_response.text.strip()\n            except Exception:\n                photo_desc = \"Image description is not available.\"\n            all_photo_description += f\"&#91;{img_path}]:\\n{photo_desc}\\n\\n\"\n    else:\n        all_photo_description = \"No image data available.\"\n    \n    conv_text = state.get(\"conv_data\", \"\")\n    previous_text = state.get(\"previous_data\", \"\")\n    if isinstance(previous_text, dict):\n        previous_text = json.dumps(previous_text, ensure_ascii=False)\n    \n    all_text = \"Image Descriptions:\\n\" + all_photo_description + \"\\n\\nConversation Text:\\n\" + conv_text\n    if previous_text:\n        all_text += \"\\n\\nSupplemental Data:\\n\" + previous_text\n    \n    overall_prompt = (\n        \"Based on the following description, provide an overall emotional index (1-100), a confidence score (1-100), a one-sentence rationale, and a suggestion for additional input.\\n\"\n        \"Return in pure JSON format as follows:\\n\"\n        '{\\n'\n        '  \"comprehensive_emotional_index\": number,\\n'\n        '  \"confidence_score\": number,\\n'\n        '  \"rating_reason\": \"summary sentence\",\\n'\n        '  \"supplement_suggestion\": \"additional info suggestion\"\\n'\n        '}\\n'\n        \"Description:\\n\" + all_text\n    )\n    \n    output_config = types.GenerateContentConfig(\n        temperature=0.0,\n        response_mime_type=\"application\/json\",\n        response_schema=SummaryRating,\n    )\n    \n    #print(\"Combined description for analysis:\\n\", all_text)\n    overall_response = client.models.generate_content(\n        model=\"gemini-2.0-flash\",\n        contents=&#91;overall_prompt],\n        config=output_config\n    )\n    #print(\"Original response:\", overall_response)\n    \n    overall_data = extract_json_from_response(overall_response.text)\n    print(f\"\\n{BLUE}===== Checking the Quality of the Uploaded Document ====={RESET}\\n\")\n\n    comprehensive_emotional_index = overall_data.get(\"comprehensive_emotional_index\", \"N\/A\")\n    confidence_score = overall_data.get(\"confidence_score\", \"N\/A\")\n    rating_reason = overall_data.get(\"rating_reason\", \"No reason provided.\")\n    supplement_suggestion = overall_data.get(\"supplement_suggestion\", \"No suggestion provided.\")\n    \n    print(f\"{BLUE}\u3010Quick Comprehensive Relationship Analysis\u3011{RESET}\")\n    print(f\"{comprehensive_emotional_index}\\n\")\n    \n    print(f\"{BLUE}\u3010Confidence Score\u3011{RESET}\")\n    print(f\"{GREEN}{confidence_score}{RESET} (70 or above is acceptable)\\n\")\n    \n    print(f\"{BLUE}\u3010Rating Reason\u3011{RESET}\")\n    print(f\"{rating_reason}\\n\")\n    \n    print(f\"{BLUE}\u3010Supplement Suggestion\u3011{RESET}\")\n    print(f\"{supplement_suggestion}\\n\")\n    \n    # Decide whether the requirements are met based on the confidence_score\n    if overall_data.get(\"confidence_score\", 0) &lt; 70:\n        suggestion = overall_data.get(\"supplement_suggestion\", \"Please provide additional data to improve confidence score.\")\n        print(f\"Confidence score ({overall_data.get('confidence_score')}) is below 70; please provide additional data. Suggestion: {suggestion}\")\n        state&#91;\"requirements_met\"] = False\n    else:\n        state&#91;\"requirements_met\"] = True\n\n    # Save the overall rating data into state for further use\n    state&#91;\"overall_rating\"] = overall_data\n    return state\n\n# Node 4: analyze_image\ndef analyze_image(state: dict) -&gt; dict:\n    image_paths = state.get(\"image_path\", &#91;])\n    prompt = (\n        \"Analyze this image with the following requirements:\\n\"\n        \"- Provide a brief description of the image.\\n\"\n        \"- Assign a proximity_score (0 to 1).\\n\"\n        \"- Assign an eye_contact_score (0 to 1).\\n\"\n        \"- Assign a facial_expression_score (0 to 1).\\n\"\n        \"- Assign a body_touch_score (0 to 1).\\n\"\n        \"- Provide a short rationale.\\n\"\n        \"Return the result as JSON conforming to the provided schema.\"\n    )\n    results = &#91;]\n    for img_path in image_paths:\n        try:\n            with PILImage.open(img_path) as img:\n                output_config = types.GenerateContentConfig(\n                    temperature=0.0,\n                    response_mime_type=\"application\/json\",\n                    response_schema=ImageAnalysisResponse,\n                )\n                photo_response = client.models.generate_content(\n                    model='gemini-2.0-flash',\n                    contents=&#91;img, prompt],\n                    config=output_config\n                )\n                image_result = json.loads(photo_response.text)\n                results.append(image_result)\n        except Exception as e:\n            results.append({\n               \"description\": \"No analysis result available.\",\n               \"proximity_score\": 0.5,\n               \"eye_contact_score\": 0.5,\n               \"facial_expression_score\": 0.5,\n               \"body_touch_score\": 0.5,\n               \"reason\": f\"Analysis failed: {str(e)}\"\n            })\n    state&#91;\"image_analysis\"] = results\n    return state\n\n# Node 5: analyze_conversation\ndef analyze_conversation(state: dict) -&gt; dict:\n    conv_text = state.get(\"conv_data\", \"\")\n    previous_text = state.get(\"previous_data\", \"\")\n    if isinstance(previous_text, dict):\n        previous_text = json.dumps(previous_text, ensure_ascii=False)\n    all_text = \"Conversation Text:\\n\" + conv_text\n    if previous_text:\n        all_text += \"\\n\\nSupplemental Data:\\n\" + previous_text\n\n    text_prompt = (\n        \"Analyze the following conversation text. Evaluate:\\n\"\n        \"1. Positive and negative sentiment ratios.\\n\"\n        \"2. Initiative (who speaks first more often), producing an initiative_score (0-1).\\n\"\n        \"3. Value alignment regarding major values, producing value_alignment_score (0-1).\\n\"\n        \"4. Relationship warmth (0-1).\\n\"\n        \"5. Probability of toxic behavior (0-1, lower means less likely).\\n\"\n        \"Return in JSON format as follows:\\n\"\n        '{\\n'\n        '  \"sentiment_summary\": {\"positive_ratio\": 0.7, \"negative_ratio\": 0.1},\\n'\n        '  \"initiative_score\": 0.6,\\n'\n        '  \"value_alignment_score\": 0.8,\\n'\n        '  \"relationship_warmth_score\": 0.85,\\n'\n        '  \"toxicity_probability\": 0.15,\\n'\n        '  \"reason\": \"Analysis rationale.\"\\n'\n        '}\\n'\n        \"Conversation text:\\n\" + all_text\n    )\n    \n    output_config = types.GenerateContentConfig(\n        temperature=0.0,\n        response_mime_type=\"application\/json\",\n        response_schema=ConversationAnalysisResponse,\n    )\n    conversation_response = client.models.generate_content(\n        model=\"gemini-2.0-flash\",\n        contents=&#91;text_prompt],\n        config=output_config\n    )\n    conversation_result = json.loads(conversation_response.text)\n    state&#91;\"conversation_analysis\"] = conversation_result\n    return state\n\n# Node 6: generate_report\ndef generate_report(state: dict) -&gt; dict:\n    # ---------------------------\n    # Retrieve image analysis results (list of dicts)\n    image_analysis_list = state.get(\"image_analysis\", &#91;])\n    if not image_analysis_list:\n        avg_proximity = avg_eye_contact = avg_facial = avg_body_touch = 0.5\n        image_reason = \"No image analysis data available.\"\n    else:\n        proximity_scores = &#91;img.get(\"proximity_score\", 0.5) for img in image_analysis_list]\n        eye_contact_scores = &#91;img.get(\"eye_contact_score\", 0.5) for img in image_analysis_list]\n        facial_scores = &#91;img.get(\"facial_expression_score\", 0.5) for img in image_analysis_list]\n        body_touch_scores = &#91;img.get(\"body_touch_score\", 0.5) for img in image_analysis_list]\n        \n        avg_proximity = sum(proximity_scores) \/ len(proximity_scores)\n        avg_eye_contact = sum(eye_contact_scores) \/ len(eye_contact_scores)\n        avg_facial = sum(facial_scores) \/ len(facial_scores)\n        avg_body_touch = sum(body_touch_scores) \/ len(body_touch_scores)\n        \n        reasons = &#91;img.get(\"reason\", \"\") for img in image_analysis_list if img.get(\"reason\")]\n        image_reason = \"\uff1b\".join(reasons) if reasons else \"No image analysis rationale available.\"\n    \n    image_composite = (avg_proximity + avg_eye_contact + avg_facial + avg_body_touch) \/ 4\n\n    # ---------------------------\n    # Retrieve conversation analysis results (dictionary)\n    conv_data = state.get(\"conversation_analysis\", {})\n    sentiment = conv_data.get(\"sentiment_summary\", {})\n    positive_ratio = sentiment.get(\"positive_ratio\", 0.5)\n    initiative_score = conv_data.get(\"initiative_score\", 0.5)\n    value_alignment_score = conv_data.get(\"value_alignment_score\", 0.5)\n    relationship_warmth_score = conv_data.get(\"relationship_warmth_score\", 0.5)\n    toxicity_probability = conv_data.get(\"toxicity_probability\", 0.5)\n    conv_reason = conv_data.get(\"reason\", \"No conversation analysis rationale available.\")\n    \n    conv_composite = (initiative_score + value_alignment_score + relationship_warmth_score + (1 - toxicity_probability) + positive_ratio) \/ 5\n\n    # ---------------------------\n    # Calculate overall composite score (40% image, 60% conversation)\n    overall_composite = 0.4 * image_composite + 0.6 * conv_composite\n    overall_rating = round(overall_composite * 100)\n    \n    base_composite_reason = f\"From image analysis: {image_reason}; From conversation analysis: {conv_reason}.\"\n\n    # ---------------------------\n    # Prepare metrics for plotting.\n    image_metrics = &#91;\"Proximity\", \"Eye Contact\", \"Facial Expression\", \"Body Touch\"]\n    image_values = &#91;avg_proximity, avg_eye_contact, avg_facial, avg_body_touch]\n    \n    conv_metrics = &#91;\"Initiative\", \"Value Alignment\", \"Relationship Warmth\", \"Positivity\", \"1 - Toxicity\"]\n    conv_values = &#91;initiative_score, value_alignment_score, relationship_warmth_score, positive_ratio, 1 - toxicity_probability]\n    \n    # Unified chart function call.\n    chart_filename = display_chart(image_metrics, image_values, conv_metrics, conv_values, overall_rating)\n    \n    # ---------------------------\n    # Combine conversation text and supplemental data.\n    conv_text = state.get(\"conv_data\", \"\")\n    previous_text = state.get(\"previous_data\", \"\")\n    all_text = \"Conversation Text:\\n\" + conv_text\n    if previous_text:\n        if not isinstance(previous_text, str):\n            previous_text = json.dumps(previous_text, ensure_ascii=False, indent=2)\n        all_text += \"\\n\\nSupplemental Data:\\n\" + previous_text\n\n    # ---------------------------\n    # Build prompt to call LLM for composite report.\n    prompt = (\n        \"You are an expert psychologist and relationship counselor. Please use plain and clear language to analyze the data \"\n        \"provided below and generate:\\n\"\n        \"1. A 'composite_reason': a brief, bullet-point summary of the key observations from the image analysis and conversation analysis.\\n\"\n        \"2. A 'detailed_report': a detailed explanation of the current relationship status, highlighting strengths, issues, and practical recommendations for improvement.\\n\\n\"\n        \"\u3010Image Analysis Rationale\u3011\\n\"\n        f\"{image_reason}\\n\\n\"\n        \"\u3010Conversation Analysis Rationale\u3011\\n\"\n        f\"{conv_reason}\\n\\n\"\n        \"\u3010Image Analysis Data\u3011\\n\"\n        f\"{json.dumps(image_analysis_list, ensure_ascii=False, indent=2)}\\n\\n\"\n        \"\u3010Conversation Data\u3011\\n\"\n        f\"{all_text}\\n\\n\"\n        \"Return the result in the following JSON format without any extra text:\\n\"\n        '{\\n'\n        '  \"composite_reason\": \"Your summary here\",\\n'\n        '  \"detailed_report\": \"Your detailed analysis and recommendations here\"\\n'\n        '}'\n    )\n    \n    output_config = types.GenerateContentConfig(\n        temperature=0.0,\n        response_mime_type=\"application\/json\",\n        response_schema=CompositeReport,\n    )\n    \n    llm_response = client.models.generate_content(\n        model=\"gemini-2.0-flash\",\n        contents=&#91;prompt],\n        config=output_config\n    )\n    \n    try:\n        composite_data = json.loads(llm_response.text)\n    except Exception as e:\n        composite_data = {\n            \"composite_reason\": base_composite_reason,\n            \"detailed_report\": (\n                f\"Preliminary Analysis: Overall rating is {overall_rating} out of 100. \"\n                \"The data suggests communication and emotional connection issues. \"\n                \"It is recommended that both parties work on open communication, rebuild trust, and consider professional counseling if needed.\"\n            )\n        }\n    \n    composite_reason_final = composite_data.get(\"composite_reason\", base_composite_reason)\n    detailed_report_final = composite_data.get(\"detailed_report\", \"\")\n    \n    # ---------------------------\n    # Assemble the final comprehensive report.\n    final_insights = detailed_report_final \n    \n    report = {\n        \"image_analysis\": image_analysis_list,\n        \"conversation_analysis\": conv_data,\n        \"previous_data\": state.get(\"previous_data\"),\n        \"overall_composite_score\": overall_rating,\n        \"composite_reason\": composite_reason_final,\n        \"chart_file\": chart_filename,\n        \"detailed_report\": final_insights\n    }\n    \n    state&#91;\"report\"] = report\n    return state\n\n\n# Node 7: guidance\ndef guidance(state: dict) -&gt; dict:\n    report = state.get(\"report\", {})\n    print(\"\\n===== Composite Analysis Report =====\\n\")\n   \n    # Overall score\n    overall_score = report.get(\"overall_composite_score\", \"N\/A\")\n    print(f\"{BLUE}\u3010Overall Emotional Rating\u3011{RESET}\")\n    print(f\"Your overall relationship rating is {RED}{overall_score}{RESET} out of 100.\\n\")\n    \n    # Key observations\n    composite_reason = report.get(\"composite_reason\", \"No summary available.\")\n    print(f\"{BLUE}\u3010Summary of Key Observations\u3011{RESET}\")\n    print(f\"{composite_reason}\\n\")\n    \n    # Detailed report\n    detailed_report = report.get(\"detailed_report\", \"No detailed report available.\")\n    print(f\"{BLUE}\u3010Detailed Analysis &amp; Recommendations\u3011{RESET}\")\n    print(f\"{detailed_report}\\n\")\n    \n    # Chart file\n    chart_file = report.get(\"chart_file\", \"No chart file.\")\n    print(f\"{BLUE}\u3010Chart File\u3011{RESET}\")\n    print(f\"{chart_file}\\n\")\n    \n    need_more = input(\"Would you like to add new file data (photo or text) for further report refinement? (yes\/no): \").strip().lower()\n    if need_more == \"yes\":\n        state&#91;\"branch\"] = \"refined\"\n    else:\n        state&#91;\"branch\"] = \"final\"\n    return state\n\n\n# Node 8: refine analysis\ndef refine_analysis(state: dict) -&gt; dict:\n    \"\"\"\n    Incorporate new file data (photo and text) provided by the client,\n    update supplemental data, and re-calculate image and conversation analyses based on the new inputs.\n    Then, call the LLM to generate an updated composite report.\n    The final output report follows the same format as Nodes 5-7, with branch set to \"final\".\n    \"\"\"\n    new_data_str = \"\"\n    \n    # Process new photo file (optional)\n    new_photo_path = input(\"Enter new photo file path (or press Enter if not applicable, or copy the file path from your dataset): \").strip()\n    if new_photo_path:\n        new_image_analysis = analyze_image_for_file(new_photo_path)\n        image_analysis_list = state.get(\"image_analysis\", &#91;])\n        image_analysis_list.append(new_image_analysis)\n        state&#91;\"image_analysis\"] = image_analysis_list\n        new_data_str += f\"New photo file provided and analyzed: {new_photo_path}. \"\n    \n    # Process new text file for conversation (optional)\n    new_text_path = input(\"Enter new text file path (or press Enter if not applicable, or copy the file path from your dataset): \").strip()\n    if new_text_path:\n        try:\n            with open(new_text_path, \"r\", encoding=\"utf-8\") as f:\n                new_text = f.read()\n            new_data_str += f\"New text data provided from {new_text_path}:\\n{new_text}\\n\"\n            # Reanalyze conversation using the new text data.\n            new_conv_analysis = analyze_conversation_for_text(new_text)\n            state&#91;\"conversation_analysis\"] = new_conv_analysis\n            # Update the raw conversation text to include new text.\n            conv_text = state.get(\"conv_data\", \"\")\n            state&#91;\"conv_data\"] = conv_text + \"\\n\\n\" + new_text\n        except Exception as e:\n            print(\"Error reading new text file:\", e)\n    \n    # Update supplemental data with new file information.\n    if new_data_str:\n        original_previous_data = state.get(\"previous_data\", \"\")\n        combined_data = (original_previous_data + \"\\n*** Additional Data (High Weight) ***\\n\" + new_data_str) if original_previous_data else new_data_str\n        state&#91;\"previous_data\"] = combined_data\n    \n    # Set branch to \"final\" so the flow ends with the final report.\n    state&#91;\"branch\"] = \"final\"\n    \n    # --- Recalculate key metrics using updated data ---\n    # For image analysis:\n    image_analysis_list = state.get(\"image_analysis\", &#91;])\n    if image_analysis_list:\n        proximity_scores = &#91;img.get(\"proximity_score\", 0.5) for img in image_analysis_list]\n        eye_contact_scores = &#91;img.get(\"eye_contact_score\", 0.5) for img in image_analysis_list]\n        facial_scores = &#91;img.get(\"facial_expression_score\", 0.5) for img in image_analysis_list]\n        body_touch_scores = &#91;img.get(\"body_touch_score\", 0.5) for img in image_analysis_list]\n        avg_proximity = sum(proximity_scores) \/ len(proximity_scores)\n        avg_eye_contact = sum(eye_contact_scores) \/ len(eye_contact_scores)\n        avg_facial = sum(facial_scores) \/ len(facial_scores)\n        avg_body_touch = sum(body_touch_scores) \/ len(body_touch_scores)\n    else:\n        avg_proximity = avg_eye_contact = avg_facial = avg_body_touch = 0.5\n    \n    image_composite = (avg_proximity + avg_eye_contact + avg_facial + avg_body_touch) \/ 4\n    \n    # For conversation analysis:\n    conv_data = state.get(\"conversation_analysis\", {})\n    sentiment = conv_data.get(\"sentiment_summary\", {})\n    positive_ratio = sentiment.get(\"positive_ratio\", 0.5)\n    initiative_score = conv_data.get(\"initiative_score\", 0.5)\n    value_alignment_score = conv_data.get(\"value_alignment_score\", 0.5)\n    relationship_warmth_score = conv_data.get(\"relationship_warmth_score\", 0.5)\n    toxicity_probability = conv_data.get(\"toxicity_probability\", 0.5)\n    conv_composite = (initiative_score + value_alignment_score + relationship_warmth_score + (1 - toxicity_probability) + positive_ratio) \/ 5\n    \n    overall_composite = 0.4 * image_composite + 0.6 * conv_composite\n    overall_rating = round(overall_composite * 100)\n    \n    # Prepare base composite reason (using prior report if available)\n    report = state.get(\"report\", {})\n    base_composite_reason = report.get(\"composite_reason\", \"Original composite observations unavailable.\")\n    \n    # Retrieve conversation raw text and supplemental data.\n    conv_text = state.get(\"conv_data\", \"\")\n    previous_data = state.get(\"previous_data\", \"\")\n    all_text = \"Conversation Text:\\n\" + conv_text\n    if previous_data:\n        if not isinstance(previous_data, str):\n            previous_data = json.dumps(previous_data, ensure_ascii=False, indent=2)\n        all_text += \"\\n\\nSupplemental Data:\\n\" + previous_data\n\n    # --- Build prompt for LLM to generate updated composite report ---\n    new_prompt = (\n        \"You are an expert psychologist and relationship counselor. Based on the updated data provided below, please generate an updated composite report. \"\n        \"The newly provided file data should be given higher weight in the evaluation. Your response must include:\\n\"\n        \"1. 'composite_reason': A concise bullet-point summary of key observations derived from the image and conversation analyses, highlighting any new insights due to the additional data.\\n\"\n        \"2. 'detailed_report': A comprehensive analysis of the current relationship status, including strengths, issues, and specific, actionable recommendations for improvement.\\n\\n\"\n        \"\u3010Original Composite Observations\u3011\\n\"\n        f\"{base_composite_reason}\\n\\n\"\n        \"\u3010Image Analysis Data\u3011\\n\"\n        f\"{json.dumps(image_analysis_list, ensure_ascii=False, indent=2)}\\n\\n\"\n        \"\u3010Conversation Data\u3011\\n\"\n        f\"{all_text}\\n\\n\"\n        \"Return your response in JSON format as follows (with no extra text):\\n\"\n        '{\\n'\n        '  \"composite_reason\": \"Your revised composite reason\",\\n'\n        '  \"detailed_report\": \"Your revised detailed report\"\\n'\n        '}'\n    )\n    \n    output_config = types.GenerateContentConfig(\n        temperature=0.0,\n        response_mime_type=\"application\/json\",\n        response_schema=CompositeReport,\n    )\n    \n    llm_response = client.models.generate_content(\n        model=\"gemini-2.0-flash\",\n        contents=&#91;new_prompt],\n        config=output_config\n    )\n    \n    try:\n        new_composite_data = json.loads(llm_response.text)\n    except Exception as e:\n        new_composite_data = {\n            \"composite_reason\": base_composite_reason,\n            \"detailed_report\": (\n                f\"Preliminary Analysis: The overall rating remains {overall_rating} out of 100. Further professional consultation is advised.\"\n            )\n        }\n    \n    refined_composite_reason = new_composite_data.get(\"composite_reason\", base_composite_reason)\n    refined_detailed_report = new_composite_data.get(\"detailed_report\", \"\")\n    \n    final_insights = refined_detailed_report \n    \n    final_report = {\n        \"image_analysis\": image_analysis_list,\n        \"conversation_analysis\": conv_data,\n        \"previous_data\": state.get(\"previous_data\"),\n        \"overall_composite_score\": overall_rating,\n        \"composite_reason\": refined_composite_reason,\n        \"chart_file\": report.get(\"chart_file\", \"N\/A\"),\n        \"detailed_report\": final_insights\n    }\n    \n    state&#91;\"report\"] = final_report\n    \n    # Recompute metrics for chart display.\n    if image_analysis_list:\n        proximity_scores = &#91;img.get(\"proximity_score\", 0.5) for img in image_analysis_list]\n        eye_contact_scores = &#91;img.get(\"eye_contact_score\", 0.5) for img in image_analysis_list]\n        facial_scores = &#91;img.get(\"facial_expression_score\", 0.5) for img in image_analysis_list]\n        body_touch_scores = &#91;img.get(\"body_touch_score\", 0.5) for img in image_analysis_list]\n        avg_proximity = sum(proximity_scores) \/ len(proximity_scores)\n        avg_eye_contact = sum(eye_contact_scores) \/ len(eye_contact_scores)\n        avg_facial = sum(facial_scores) \/ len(facial_scores)\n        avg_body_touch = sum(body_touch_scores) \/ len(body_touch_scores)\n    else:\n        avg_proximity = avg_eye_contact = avg_facial = avg_body_touch = 0.5\n    \n    image_metrics = &#91;\"Proximity\", \"Eye Contact\", \"Facial Expression\", \"Body Touch\"]\n    image_values = &#91;avg_proximity, avg_eye_contact, avg_facial, avg_body_touch]\n    \n    initiative_score = conv_data.get(\"initiative_score\", 0.5)\n    value_alignment_score = conv_data.get(\"value_alignment_score\", 0.5)\n    relationship_warmth_score = conv_data.get(\"relationship_warmth_score\", 0.5)\n    sentiment = conv_data.get(\"sentiment_summary\", {})\n    positive_ratio = sentiment.get(\"positive_ratio\", 0.5)\n    toxicity_probability = conv_data.get(\"toxicity_probability\", 0.5)\n    conv_metrics = &#91;\"Initiative\", \"Value Alignment\", \"Relationship Warmth\", \"Positivity\", \"1 - Toxicity\"]\n    conv_values = &#91;initiative_score, value_alignment_score, relationship_warmth_score, positive_ratio, 1 - toxicity_probability]\n    \n    chart_filename = display_chart(image_metrics, image_values, conv_metrics, conv_values, overall_rating)\n\n    # After updating state&#91;\"report\"], print it out elegantly:\n    report = state.get(\"report\", {})\n    \n    print(\"\\n===== Refined Composite Analysis Report =====\\n\")\n    \n    # Overall score\n    overall_score = report.get(\"overall_composite_score\", \"N\/A\")\n    print(f\"{BLUE}\u3010Overall Emotional Rating\u3011{RESET}\")\n    print(f\"Your overall relationship rating is {RED}{overall_score}{RESET} out of 100.\\n\")\n    \n    # Key observations\n    composite_reason = report.get(\"composite_reason\", \"No summary available.\")\n    print(f\"{BLUE}\u3010Summary of Key Observations\u3011{RESET}\")\n    print(f\"{composite_reason}\\n\")\n    \n    # Detailed report\n    detailed_report = report.get(\"detailed_report\", \"No detailed report available.\")\n    print(f\"{BLUE}\u3010Detailed Analysis &amp; Recommendations\u3011{RESET}\")\n    print(f\"{detailed_report}\\n\")\n    \n    # Chart file\n    chart_file = report.get(\"chart_file\", \"No chart file.\")\n    print(f\"{BLUE}\u3010Chart File\u3011{RESET}\")\n    print(f\"{chart_file}\\n\")\n    \n    state&#91;\"report\"]&#91;\"chart_file\"] = chart_filename\n    \n    return state\n\n# Node 9: save_report\ndef save_report(state: dict) -&gt; dict:\n    report = state.get(\"report\", {})\n    filename = f\"analysis_report_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.json\"\n    try:\n        with open(filename, \"w\", encoding=\"utf-8\") as f:\n            json.dump(report, f, ensure_ascii=False, indent=2)\n        print(f\"Final Report saved to {filename}\")\n    except Exception as e:\n        print(\"Failed to save report:\", e)\n    return state\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading jinr-heading d--bold\">7. \u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u5236\u5fa1\u7528\u5206\u5c90\u95a2\u6570<\/h2>\n\n\n\n<p>\u4fe1\u983c\u6027\u30b9\u30b3\u30a2\u306b\u5fdc\u3058\u3066\u3001\u8ffd\u52a0\u30c7\u30fc\u30bf\u3092\u8981\u6c42\u3059\u308b\u304b\u3001\u5206\u6790\u3092\u9032\u3081\u308b\u304b\u3092\u5224\u65ad\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Correct branch_requirements function\ndef branch_requirements(state: dict) -&gt; Literal&#91;\"analyze_image\", \"upload_data\"]:\n    return \"analyze_image\" if state.get(\"requirements_met\") else \"upload_data\"\n\n# Branching based on guidance outcome:\ndef branch_guidance(state: dict) -&gt; Literal&#91;\"refine_analysis\", \"save_report\"]:\n    return \"refine_analysis\" if state.get(\"branch\") == \"refined\" else \"save_report\"\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading jinr-heading d--bold\">8. \u72b6\u614b\u30b0\u30e9\u30d5\uff08StateGraph\uff09\u306e\u69cb\u7bc9<\/h2>\n\n\n\n<p>\u5404\u51e6\u7406\u3092\u30ce\u30fc\u30c9\u3068\u3057\u3066\u767b\u9332\u3057\u3001\u6761\u4ef6\u5206\u5c90\u3067\u5236\u5fa1\u3057\u306a\u304c\u3089\u9806\u6b21\u51e6\u7406\u3092\u9032\u3081\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def build_state_graph():\n    graph_builder = StateGraph(dict)\n    graph_builder.add_node(\"upload_data\", upload_data)\n    graph_builder.add_node(\"use_existing_info\", use_existing_info)\n    graph_builder.add_node(\"check_requirements\", check_requirements)\n    graph_builder.add_node(\"analyze_image\", analyze_image)\n    graph_builder.add_node(\"analyze_conversation\", analyze_conversation)\n    graph_builder.add_node(\"generate_report\", generate_report)\n    graph_builder.add_node(\"guidance\", guidance)\n    graph_builder.add_node(\"refine_analysis\", refine_analysis)\n    graph_builder.add_node(\"save_report\", save_report)\n    \n    graph_builder.add_edge(START, \"upload_data\")\n    graph_builder.add_edge(\"upload_data\", \"use_existing_info\")\n    graph_builder.add_edge(\"use_existing_info\", \"check_requirements\")\n    graph_builder.add_conditional_edges(\"check_requirements\", branch_requirements)\n    graph_builder.add_edge(\"analyze_image\", \"analyze_conversation\")\n    graph_builder.add_edge(\"analyze_conversation\", \"generate_report\")\n    graph_builder.add_edge(\"generate_report\", \"guidance\")\n    graph_builder.add_conditional_edges(\"guidance\", branch_guidance)\n    graph_builder.add_edge(\"refine_analysis\", \"save_report\")\n    graph_builder.add_edge(\"save_report\", END)\n    \n    return graph_builder.compile()\n\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading jinr-heading d--bold\">9. \u30b0\u30e9\u30d5\u306e\u8996\u899a\u5316\u3068\u5b9f\u884c<\/h2>\n\n\n\n<p>Mermaid\u3092\u7528\u3044\u3066\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u5168\u4f53\u3092\u56f3\u793a\u3057\u3001\u5206\u6790\u30d7\u30ed\u30bb\u30b9\u306e\u900f\u660e\u6027\u3092\u9ad8\u3081\u307e\u3059\u3002\u307e\u305f\u3001\u30b0\u30e9\u30d5\u3092\u5b9f\u884c\u3057\u3066\u6700\u7d42\u7684\u306a\u5206\u6790\u30ec\u30dd\u30fc\u30c8\u3092\u751f\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3053\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u901a\u3058\u3066\u3001Gen AI\u6280\u8853\u304c\u3069\u306e\u3088\u3046\u306b\u4eba\u9593\u95a2\u4fc2\u306e\u6df1\u5c64\u5206\u6790\u306b\u5f79\u7acb\u3064\u304b\u3092\u5177\u4f53\u7684\u306b\u793a\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from IPython.display import Image, display\n\n# Build the state graph from the previously defined nodes and edges.\ngraph = build_state_graph()<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/creamtrip.com\/wp-content\/uploads\/2025\/04\/analysis_report_chart_20250410_050702-1024x439.png\" alt=\"\" class=\"wp-image-622\"\/><\/figure>\n\n\n\n<p>===== \u30b3\u30f3\u30dd\u30b8\u30c3\u30c8\u5206\u6790\u30ec\u30dd\u30fc\u30c8 =====<\/p>\n\n\n\n<p>\u3010\u5168\u4f53\u611f\u60c5\u8a55\u4fa1\u3011<br>\u3042\u306a\u305f\u305f\u3061\u306e\u5168\u4f53\u7684\u306a\u95a2\u4fc2\u8a55\u4fa1\u306f <strong>100\u70b9\u4e2d38\u70b9<\/strong> \u3067\u3059\u3002<\/p>\n\n\n\n<p>\u3010\u4e3b\u306a\u89b3\u5bdf\u7d50\u679c\u3011<br>\u4e3b\u306a\u89b3\u5bdf\u5185\u5bb9\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list jinr-list\">\n<li><strong>\u611f\u60c5\u7684\u306a\u65ad\u7d76<\/strong>\uff1a\u753b\u50cf\u3067\u306f\u8eab\u4f53\u7684\u306a\u8fd1\u3055\u306f\u898b\u3089\u308c\u308b\u3082\u306e\u306e\u3001\u30a2\u30a4\u30b3\u30f3\u30bf\u30af\u30c8\u304c\u306a\u304f\u3001\u771f\u5263\u306a\u8868\u60c5\u3092\u3057\u3066\u304a\u308a\u3001\u611f\u60c5\u7684\u306a\u8ddd\u96e2\u304c\u793a\u5506\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>\u671f\u5f85\u306e\u4e0d\u6e80<\/strong>\uff1a\u30a8\u30df\u30ea\u30fc\u306f\u3001\u7d04\u675f\u304c\u7834\u3089\u308c\u305f\u3053\u3068\u3084\u81ea\u5206\u304c\u5927\u5207\u306b\u3055\u308c\u3066\u3044\u306a\u3044\u3068\u611f\u3058\u308b\u3053\u3068\u306b\u5931\u671b\u3092\u8868\u660e\u3057\u3066\u3044\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>\u9632\u5fa1\u7684\u614b\u5ea6\u3068\u8cac\u4efb\u8ee2\u5ac1<\/strong>\uff1a\u30a2\u30ec\u30c3\u30af\u30b9\u306f\u9632\u5fa1\u7684\u306b\u306a\u308a\u3001\u30a8\u30df\u30ea\u30fc\u3092\u975e\u96e3\u3057\u3066\u53e3\u8ad6\u3092\u60aa\u5316\u3055\u305b\u3066\u3044\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>\u30b3\u30df\u30e5\u30cb\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5d29\u58ca<\/strong>\uff1a\u4f1a\u8a71\u304b\u3089\u3001\u30a2\u30ec\u30c3\u30af\u30b9\u304c\u30a8\u30df\u30ea\u30fc\u306e\u8a71\u3092\u805e\u304b\u305a\u3001\u30a8\u30df\u30ea\u30fc\u304c\u7406\u89e3\u3055\u308c\u3066\u3044\u306a\u3044\u3068\u611f\u3058\u3066\u3044\u308b\u30d1\u30bf\u30fc\u30f3\u304c\u660e\u3089\u304b\u306b\u306a\u308a\u307e\u3057\u305f\u3002<\/li>\n\n\n\n<li><strong>\u95a2\u4fc2\u306e\u60aa\u5316<\/strong>\uff1a\u75b2\u5f0a\u3057\u3001\u611f\u8b1d\u3055\u308c\u3066\u3044\u306a\u3044\u3068\u611f\u3058\u308b\u305f\u3081\u3001\u4e8c\u4eba\u306f\u8ddd\u96e2\u3092\u7f6e\u304f\u3053\u3068\u3092\u691c\u8a0e\u3057\u3066\u3044\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u3010\u8a73\u7d30\u5206\u6790\u3068\u63a8\u5968\u4e8b\u9805\u3011<br><strong>\u73fe\u5728\u306e\u95a2\u4fc2\u72b6\u6cc1<\/strong>\uff1a<br>\u73fe\u5728\u3001\u4e8c\u4eba\u306e\u95a2\u4fc2\u306f\u975e\u5e38\u306b\u7dca\u5f35\u3057\u3066\u304a\u308a\u3001\u91cd\u5927\u306a\u8ab2\u984c\u306b\u76f4\u9762\u3057\u3066\u3044\u307e\u3059\u3002\u753b\u50cf\u5206\u6790\u3067\u306f\u3001\u8eab\u4f53\u7684\u306a\u8fd1\u3055\u306b\u53cd\u3057\u3066\u611f\u60c5\u7684\u306a\u3064\u306a\u304c\u308a\u304c\u6b20\u5982\u3057\u3066\u3044\u308b\u3053\u3068\u304c\u793a\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u4f1a\u8a71\u5206\u6790\u3067\u306f\u3001\u671f\u5f85\u304c\u6e80\u305f\u3055\u308c\u306a\u3044\u3053\u3068\u3001\u9632\u5fa1\u7684\u614b\u5ea6\u3001\u30b3\u30df\u30e5\u30cb\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u554f\u984c\u304c\u660e\u3089\u304b\u3068\u306a\u308a\u3001\u6068\u307f\u3084\u75b2\u52b4\u611f\u304c\u9ad8\u307e\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>\u5f37\u307f<\/strong>\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list jinr-list\">\n<li><strong>\u95a2\u4fc2\u6539\u5584\u3078\u306e\u610f\u6b32<\/strong>\uff1a\u30a2\u30ec\u30c3\u30af\u30b9\u3082\u30a8\u30df\u30ea\u30fc\u3082\u3001\u95a2\u4fc2\u3092\u6539\u5584\u3057\u305f\u3044\u3068\u3044\u3046\u610f\u6b32\u3092\u8868\u660e\u3057\u3066\u3044\u307e\u3059\u3002\u30a2\u30ec\u30c3\u30af\u30b9\u306f\u52aa\u529b\u3092\u8a93\u3044\u3001\u30a8\u30df\u30ea\u30fc\u3082\u305d\u308c\u3092\u4fe1\u3058\u305f\u3044\u3068\u671b\u3093\u3067\u3044\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>\u4e92\u3044\u306e\u91cd\u8981\u6027\u306e\u8a8d\u8b58<\/strong>\uff1a\u30a2\u30ec\u30c3\u30af\u30b9\u306f\u30a8\u30df\u30ea\u30fc\u304c\u81ea\u5206\u306b\u3068\u3063\u3066\u5927\u5207\u306a\u5b58\u5728\u3067\u3042\u308b\u3068\u8ff0\u3079\u3066\u304a\u308a\u3001\u6839\u5e95\u306b\u306f\u611b\u60c5\u304c\u3042\u308b\u3053\u3068\u304c\u4f3a\u3048\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<p><strong>\u554f\u984c\u70b9<\/strong>\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list jinr-list\">\n<li><strong>\u7d04\u675f\u9055\u53cd\u3068\u671f\u5f85\u306e\u4e0d\u6e80<\/strong>\uff1a\u30a2\u30ec\u30c3\u30af\u30b9\u304c\u7d04\u675f\u3092\u5b88\u308c\u306a\u3044\u3053\u3068\u3067\u3001\u30a8\u30df\u30ea\u30fc\u306f\u5927\u5207\u306b\u3055\u308c\u3066\u3044\u306a\u3044\u3068\u611f\u3058\u3066\u3044\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>\u9632\u5fa1\u7684\u306a\u30b3\u30df\u30e5\u30cb\u30b1\u30fc\u30b7\u30e7\u30f3<\/strong>\uff1a\u30a2\u30ec\u30c3\u30af\u30b9\u306e\u9632\u5fa1\u7684\u614b\u5ea6\u3068\u8cac\u4efb\u8ee2\u5ac1\u304c\u53e3\u8ad6\u3092\u30a8\u30b9\u30ab\u30ec\u30fc\u30c8\u3055\u305b\u3001\u89e3\u6c7a\u3092\u56f0\u96e3\u306b\u3057\u3066\u3044\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>\u50be\u8074\u306e\u6b20\u5982<\/strong>\uff1a\u30a8\u30df\u30ea\u30fc\u306f\u81ea\u5206\u306e\u610f\u898b\u304c\u805e\u304b\u308c\u3066\u3044\u306a\u3044\u3068\u611f\u3058\u3066\u3044\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>\u611f\u60c5\u7684\u306a\u8ddd\u96e2<\/strong>\uff1a\u30a2\u30a4\u30b3\u30f3\u30bf\u30af\u30c8\u306e\u6b20\u5982\u3068\u771f\u5263\u306a\u8868\u60c5\u304b\u3089\u3001\u611f\u60c5\u7684\u306a\u65ad\u7d76\u304c\u63a8\u5bdf\u3055\u308c\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>\u53e3\u8ad6\u306e\u60aa\u5316<\/strong>\uff1a\u4f1a\u8a71\u30d1\u30bf\u30fc\u30f3\u304b\u3089\u3001\u53e3\u8ad6\u304c\u30a8\u30b9\u30ab\u30ec\u30fc\u30c8\u3057\u3001\u554f\u984c\u304c\u89e3\u6c7a\u3055\u308c\u306a\u3044\u50be\u5411\u304c\u898b\u3089\u308c\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<p><strong>\u63a8\u5968\u4e8b\u9805<\/strong>\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list jinr-list\">\n<li><strong>\u30b3\u30df\u30e5\u30cb\u30b1\u30fc\u30b7\u30e7\u30f3\u30b9\u30ad\u30eb\u306e\u5411\u4e0a<\/strong>\uff1a\u4e92\u3044\u306e\u30cb\u30fc\u30ba\u3084\u611f\u60c5\u3092\u975e\u96e3\u305b\u305a\u306b\u8868\u73fe\u3057\u3001\u7a4d\u6975\u7684\u306b\u50be\u8074\u3057\u3001\u5171\u611f\u3092\u6301\u3063\u3066\u5bfe\u5fdc\u3059\u308b\u3053\u3068\u3092\u5fc3\u304c\u3051\u307e\u3057\u3087\u3046\u3002\u30ab\u30c3\u30d7\u30eb\u30bb\u30e9\u30d4\u30fc\u306b\u53c2\u52a0\u3057\u3001\u52b9\u679c\u7684\u306a\u30b3\u30df\u30e5\u30cb\u30b1\u30fc\u30b7\u30e7\u30f3\u6280\u8853\u3092\u5b66\u3076\u306e\u3082\u6709\u52b9\u3067\u3059\u3002<\/li>\n\n\n\n<li><strong>\u4fe1\u983c\u306e\u518d\u69cb\u7bc9<\/strong>\uff1a\u30a2\u30ec\u30c3\u30af\u30b9\u306f\u7d04\u675f\u3092\u78ba\u5b9f\u306b\u5b88\u308a\u3001\u8aa0\u5b9f\u306a\u884c\u52d5\u3092\u7a4d\u307f\u91cd\u306d\u308b\u3053\u3068\u3067\u30a8\u30df\u30ea\u30fc\u306e\u4fe1\u983c\u3092\u53d6\u308a\u623b\u3059\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u5c0f\u3055\u306a\u4e00\u6b69\u306e\u7a4d\u307f\u91cd\u306d\u304c\u5927\u304d\u306a\u52b9\u679c\u3092\u751f\u307f\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>\u8cea\u306e\u9ad8\u3044\u6642\u9593\u3092\u512a\u5148\u3059\u308b<\/strong>\uff1a\u611f\u60c5\u7684\u306a\u3064\u306a\u304c\u308a\u3092\u53d6\u308a\u623b\u3059\u305f\u3081\u306b\u3001\u4e8c\u4eba\u3067\u697d\u3057\u3081\u308b\u6d3b\u52d5\u3092\u8a08\u753b\u3057\u3001\u7279\u5225\u306a\u6642\u9593\u3092\u5171\u6709\u3057\u307e\u3057\u3087\u3046\u3002<\/li>\n\n\n\n<li><strong>\u6839\u672c\u7684\u306a\u554f\u984c\u306b\u53d6\u308a\u7d44\u3080<\/strong>\uff1a\u30b3\u30df\u30e5\u30cb\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u554f\u984c\u3084\u671f\u5f85\u306e\u4e0d\u6e80\u306e\u6839\u672c\u539f\u56e0\u3092\u63a2\u308a\u307e\u3057\u3087\u3046\u3002\u30bb\u30e9\u30d4\u30fc\u306f\u3001\u3053\u308c\u3089\u306e\u8ab2\u984c\u306b\u5b89\u5168\u306a\u74b0\u5883\u3067\u5411\u304d\u5408\u3044\u3001\u5065\u5168\u306a\u5bfe\u51e6\u6cd5\u3092\u5b66\u3076\u5834\u3092\u63d0\u4f9b\u3057\u3066\u304f\u308c\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>\u5171\u611f\u3092\u5b9f\u8df5\u3059\u308b<\/strong>\uff1a\u4e92\u3044\u306e\u7acb\u5834\u3084\u611f\u60c5\u3092\u7406\u89e3\u3057\u3001\u8a8d\u3081\u5408\u3046\u3053\u3068\u3067\u3001\u9632\u5fa1\u7684\u614b\u5ea6\u3092\u6e1b\u3089\u3057\u3001\u652f\u3048\u5408\u3046\u95a2\u4fc2\u3092\u7bc9\u304f\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>\u5c02\u9580\u5bb6\u306e\u652f\u63f4\u3092\u6c42\u3081\u308b<\/strong>\uff1a\u52aa\u529b\u3057\u3066\u3082\u554f\u984c\u304c\u89e3\u6c7a\u3057\u306a\u3044\u5834\u5408\u306f\u3001\u30ab\u30c3\u30d7\u30eb\u30bb\u30e9\u30d4\u30b9\u30c8\u306b\u76f8\u8ac7\u3059\u308b\u3053\u3068\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u5c02\u9580\u5bb6\u306e\u30b5\u30dd\u30fc\u30c8\u3092\u53d7\u3051\u306a\u304c\u3089\u3001\u8ab2\u984c\u306b\u5411\u304d\u5408\u3044\u3001\u95a2\u4fc2\u3092\u6539\u5584\u3057\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading jinr-heading d--bold\">\u8aad\u8005\u306e\u7686\u3055\u3093\u3078\uff1a\u3088\u304f\u3042\u308b\u8cea\u554f\u3068\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u3064\u3044\u3066\u306e\u88dc\u8db3\u8aac\u660e<\/h2>\n\n\n\n<p>\u4eca\u56de\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u3064\u3044\u3066\u3001\u8aad\u8005\u306e\u7686\u3055\u3093\u304c\u611f\u3058\u308b\u304b\u3082\u3057\u308c\u306a\u3044\u7591\u554f\u3092\u3001Q&amp;A\u5f62\u5f0f\u3067\u307e\u3068\u3081\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading jinr-heading d--bold\">Q1\uff1a\u3053\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306f\u5177\u4f53\u7684\u306b\u4f55\u3092\u89e3\u6c7a\u3059\u308b\u305f\u3081\u306b\u4f5c\u3089\u308c\u305f\u306e\u3067\u3059\u304b\uff1f<\/h3>\n\n\n\n<p>\u3053\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306f\u3001\u30ab\u30c3\u30d7\u30eb\u3084\u592b\u5a66\u304c\u62b1\u3048\u308b\u300c\u81ea\u5206\u305f\u3061\u306e\u95a2\u4fc2\u6027\u3084\u30b3\u30df\u30e5\u30cb\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u554f\u984c\u300d\u3092AI\u6280\u8853\u3092\u6d3b\u7528\u3057\u3066\u5206\u6790\u3057\u3001\u6539\u5584\u306e\u304d\u3063\u304b\u3051\u3092\u4e0e\u3048\u308b\u3053\u3068\u3092\u76ee\u7684\u306b\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4f8b\u3048\u3070\u3001<\/p>\n\n\n\n<ul class=\"wp-block-list jinr-list\">\n<li>\u300c\u6700\u8fd1\u30d1\u30fc\u30c8\u30ca\u30fc\u3068\u3046\u307e\u304f\u4f1a\u8a71\u304c\u3067\u304d\u3066\u3044\u306a\u3044\u300d<\/li>\n\n\n\n<li>\u300c\u5199\u771f\u306b\u5199\u308b\u4e8c\u4eba\u306e\u95a2\u4fc2\u6027\u304c\u51b7\u3081\u3066\u3044\u308b\u3088\u3046\u306b\u611f\u3058\u308b\u300d<\/li>\n<\/ul>\n\n\n\n<p>\u3068\u3044\u3063\u305f\u6f20\u7136\u3068\u3057\u305f\u60a9\u307f\u3092\u6301\u3064\u4eba\u306b\u5bfe\u3057\u3066\u3001AI\u304c\u5ba2\u89b3\u7684\u306a\u5206\u6790\u3092\u63d0\u4f9b\u3059\u308b\u3053\u3068\u3067\u3001\u95a2\u4fc2\u6539\u5584\u3078\u306e\u5177\u4f53\u7684\u306a\u7b2c\u4e00\u6b69\u3092\u63d0\u6848\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading jinr-heading d--bold\">Q2\uff1aAI\u6280\u8853\u3092\u3069\u306e\u3088\u3046\u306b\u4f7f\u3063\u3066\u3001\u3053\u306e\u554f\u984c\u3092\u89e3\u6c7a\u3057\u3066\u3044\u308b\u306e\u3067\u3059\u304b\uff1f<\/h3>\n\n\n\n<p>\u79c1\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306f\u3001Google\u304c\u63d0\u4f9b\u3059\u308b\u6700\u5148\u7aef\u306e\u751f\u6210AI\uff08Gemini\uff09\u3092\u4f7f\u3044\u3001\u6b21\u306e2\u3064\u306e\u5206\u6790\u3092\u5b9f\u65bd\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list jinr-list\">\n<li><strong>\u753b\u50cf\u5206\u6790<\/strong>\uff1a<br>\u30ab\u30c3\u30d7\u30eb\u306e\u5199\u771f\u3092AI\u304c\u5206\u6790\u3057\u3001\u300c\u8eab\u4f53\u306e\u8ddd\u96e2\u611f\u300d\u300c\u30a2\u30a4\u30b3\u30f3\u30bf\u30af\u30c8\u300d\u300c\u8868\u60c5\u300d\u300c\u89e6\u308c\u5408\u3044\u65b9\u300d\u306a\u3069\u3092\u6570\u5024\u5316\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>\u4f1a\u8a71\u5c65\u6b74\u5206\u6790<\/strong>\uff1a<br>\u4e8c\u4eba\u306e\u4f1a\u8a71\u5c65\u6b74\u3092\u5206\u6790\u3057\u3001\u300c\u30dd\u30b8\u30c6\u30a3\u30d6\/\u30cd\u30ac\u30c6\u30a3\u30d6\u306a\u611f\u60c5\u6bd4\u7387\u300d\u300c\u30b3\u30df\u30e5\u30cb\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u4e3b\u5c0e\u6a29\u300d\u300c\u304a\u4e92\u3044\u306e\u4fa1\u5024\u89b3\u306e\u4e00\u81f4\u5ea6\u300d\u300c\u95a2\u4fc2\u6027\u306e\u6e29\u304b\u3055\u300d\u306a\u3069\u3092\u6570\u5024\u3067\u8a55\u4fa1\u3057\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5206\u6790\u7d50\u679c\u3092\u7dcf\u5408\u3057\u3066AI\u304c\u95a2\u4fc2\u6027\u3092\u8a55\u4fa1\u3057\u3001\u3055\u3089\u306b\u6539\u5584\u3059\u308b\u305f\u3081\u306e\u5177\u4f53\u7684\u306a\u30a2\u30c9\u30d0\u30a4\u30b9\u3092\u30ec\u30dd\u30fc\u30c8\u5f62\u5f0f\u3067\u63d0\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u5b9f\u969b\u306e\u5206\u6790\u51e6\u7406\u306e\u6d41\u308c\u3092\u793a\u3059\u30b3\u30fc\u30c9\u306e\u4e00\u4f8b\u3082\u8a18\u4e8b\u5185\u306b\u8a18\u8f09\u3057\u307e\u3057\u305f\u3002<br>\uff08\u4f8b\u3048\u3070\u3001\u753b\u50cf\u3092\u8aad\u307f\u8fbc\u3080\u51e6\u7406\u3084\u3001AI\u304c\u5206\u6790\u7d50\u679c\u3092\u8fd4\u3059\u69d8\u5b50\u3092\u30b3\u30fc\u30c9\u3067\u7d39\u4ecb\u3057\u3066\u3044\u307e\u3059\u3002\uff09<\/p>\n\n\n\n<h3 class=\"wp-block-heading jinr-heading d--bold\">Q3\uff1a\u4eca\u56de\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u4f7f\u3063\u305fAI\u6280\u8853\u306b\u306f\u3001\u3069\u3093\u306a\u8ab2\u984c\u3084\u9650\u754c\u304c\u3042\u308a\u307e\u3059\u304b\uff1f<\/h3>\n\n\n\n<p>AI\u6280\u8853\u306b\u306f\u6b21\u306e\u3088\u3046\u306a\u8ab2\u984c\u3084\u9650\u754c\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list jinr-list\">\n<li>AI\u304c\u5206\u6790\u3092\u3059\u308b\u305f\u3081\u306e\u30c7\u30fc\u30bf\uff08\u5199\u771f\u3084\u4f1a\u8a71\uff09\u304c\u4e0d\u5341\u5206\u3060\u3063\u305f\u308a\u8cea\u304c\u4f4e\u3044\u5834\u5408\u3001\u6b63\u78ba\u306a\u8a55\u4fa1\u304c\u96e3\u3057\u304f\u306a\u308a\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u4eba\u9593\u306e\u611f\u60c5\u3084\u95a2\u4fc2\u6027\u306f\u975e\u5e38\u306b\u8907\u96d1\u3067\u5fae\u5999\u306a\u30cb\u30e5\u30a2\u30f3\u30b9\u304c\u591a\u3044\u305f\u3081\u3001AI\u304c\u5b8c\u5168\u306b\u7406\u89e3\u30fb\u8a55\u4fa1\u3059\u308b\u3053\u3068\u306b\u306f\u9650\u754c\u304c\u3042\u308a\u307e\u3059\u3002<\/li>\n\n\n\n<li>AI\u306e\u5206\u6790\u7d50\u679c\u306f\u3042\u304f\u307e\u3067\u53c2\u8003\u3067\u3042\u308a\u3001\u6700\u7d42\u7684\u306b\u306f\u4eba\u9593\u81ea\u8eab\u306e\u5224\u65ad\u3084\u5c02\u9580\u5bb6\u306e\u652f\u63f4\u304c\u5fc5\u8981\u306b\u306a\u308b\u30b1\u30fc\u30b9\u3082\u591a\u304f\u3042\u308a\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading jinr-heading d--bold\">Q4\uff1a\u4eca\u5f8c\u3001\u3053\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u3069\u306e\u3088\u3046\u306b\u6d3b\u7528\u30fb\u767a\u5c55\u3055\u305b\u3066\u3044\u304f\u4e88\u5b9a\u3067\u3059\u304b\uff1f<\/h3>\n\n\n\n<p>\u3053\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u3082\u3068\u306b\u3001\u8ab0\u3067\u3082\u6c17\u8efd\u306b\u5229\u7528\u3067\u304d\u308b\u30b9\u30de\u30db\u30a2\u30d7\u30ea\u3068\u3057\u3066\u958b\u767a\u3057\u3066\u3044\u304f\u4e88\u5b9a\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u5c06\u6765\u7684\u306b\u306f\u3001<\/p>\n\n\n\n<ul class=\"wp-block-list jinr-list\">\n<li>\u500b\u4eba\u304c\u81ea\u5b85\u3067\u7c21\u5358\u306b\u81ea\u5206\u306e\u95a2\u4fc2\u6027\u3092\u5206\u6790\u3057\u3001\u6539\u5584\u3059\u308b\u65b9\u6cd5\u3092\u5b66\u3079\u308b\u3088\u3046\u306b\u3057\u305f\u3044<\/li>\n\n\n\n<li>\u30ab\u30a6\u30f3\u30bb\u30e9\u30fc\u3084\u30bb\u30e9\u30d4\u30b9\u30c8\u306a\u3069\u3001\u5c02\u9580\u5bb6\u304c\u30ab\u30c3\u30d7\u30eb\u306e\u30b5\u30dd\u30fc\u30c8\u3092\u884c\u3046\u969b\u306e\u88dc\u52a9\u30c4\u30fc\u30eb\u3068\u3057\u3066\u6d3b\u7528\u3057\u3066\u3082\u3089\u3044\u305f\u3044<\/li>\n<\/ul>\n\n\n\n<p>\u3068\u8003\u3048\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u6280\u8853\u304c\u3055\u3089\u306b\u9032\u6b69\u3059\u308b\u3053\u3068\u3067\u3001AI\u306b\u3088\u308b\u95a2\u4fc2\u6027\u5206\u6790\u304c\u3082\u3063\u3068\u6b63\u78ba\u304b\u3064\u6df1\u3044\u30ec\u30d9\u30eb\u3067\u53ef\u80fd\u306b\u306a\u308b\u3053\u3068\u3092\u671f\u5f85\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>2025\u5e743\u670831\u65e5\uff08\u6708\uff09\u304b\u30894\u67084\u65e5\uff08\u91d1\uff09\u307e\u3067\u958b\u50ac\u3055\u308c\u305fGoogle\u4e3b\u50ac\u306e5\u65e5\u9593\u96c6\u4e2d\u578b\u30b3\u30fc\u30b9\u300cGen AI Intensive Course with Google\u300d\u306b\u53c2\u52a0\u3057\u3001\u305d\u306e\u96c6\u5927\u6210\u3068\u306a\u308b\u300eCapstone Pro [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":235,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jinr_url_youtube":"","_jinr_pip_youtube":false,"_jinr_time_youtube":"","_jinr_thumb_youtube":"","_jinr_media_youtube":"","_jinr_category_edit":false,"_jinr_category":"","_jinr_title_display":false,"_jinr_snsbutton_display":false,"_jinr_ads_display":false,"_jinr_thumbnail_display":false,"_jinr_profile_display":false,"_jinr_representations_display":false,"_jinr_relatedpost_display":false,"_jinr_sidebar1col_display":false,"_jinr_sidebar2col_display":false,"_jinr_seotitle_display":"","_jinr_description_display":"","_jinr_keyword_display":"","_jinr_hastag_display":"","_jinr_canonical_display":"","_jinr_noindex_display":false,"_jinr_paidpost":false,"_jinr_paidpost_product_id":"","_jinr_headtag_article":"","footnotes":""},"categories":[4],"tags":[],"class_list":["post-233","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-appintro"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Google \u4e3b\u50ac\u300eGen AI Intensive Course Capstone 2025Q1\u300f\u306b\u53c2\u52a0\u3057\u307e\u3057\u305f\uff01 - \u30a2\u30d7\u30ea\u526f\u696d\u30e9\u30dc\uff01<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/appfreelife.com\/?p=233\" \/>\n<meta property=\"og:locale\" content=\"ja_JP\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Google \u4e3b\u50ac\u300eGen AI Intensive Course Capstone 2025Q1\u300f\u306b\u53c2\u52a0\u3057\u307e\u3057\u305f\uff01 - \u30a2\u30d7\u30ea\u526f\u696d\u30e9\u30dc\uff01\" \/>\n<meta property=\"og:description\" content=\"2025\u5e743\u670831\u65e5\uff08\u6708\uff09\u304b\u30894\u67084\u65e5\uff08\u91d1\uff09\u307e\u3067\u958b\u50ac\u3055\u308c\u305fGoogle\u4e3b\u50ac\u306e5\u65e5\u9593\u96c6\u4e2d\u578b\u30b3\u30fc\u30b9\u300cGen AI Intensive Course with Google\u300d\u306b\u53c2\u52a0\u3057\u3001\u305d\u306e\u96c6\u5927\u6210\u3068\u306a\u308b\u300eCapstone Pro [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/appfreelife.com\/?p=233\" \/>\n<meta property=\"og:site_name\" content=\"\u30a2\u30d7\u30ea\u526f\u696d\u30e9\u30dc\uff01\" \/>\n<meta property=\"article:published_time\" content=\"2025-04-13T05:51:15+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-04-13T05:51:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/appfreelife.com\/wp-content\/uploads\/2025\/04\/Gen-AI-Intensive-Course-Capstone-2025Q1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"900\" \/>\n\t<meta property=\"og:image:height\" content=\"600\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"info@appfreelife.com\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u57f7\u7b46\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"info@appfreelife.com\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593\" \/>\n\t<meta name=\"twitter:data2\" content=\"23\u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/appfreelife.com\/?p=233#article\",\"isPartOf\":{\"@id\":\"https:\/\/appfreelife.com\/?p=233\"},\"author\":{\"name\":\"info@appfreelife.com\",\"@id\":\"https:\/\/appfreelife.com\/#\/schema\/person\/642f91ef444c469d236f2a18aeec68d7\"},\"headline\":\"Google \u4e3b\u50ac\u300eGen AI Intensive Course Capstone 2025Q1\u300f\u306b\u53c2\u52a0\u3057\u307e\u3057\u305f\uff01\",\"datePublished\":\"2025-04-13T05:51:15+00:00\",\"dateModified\":\"2025-04-13T05:51:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/appfreelife.com\/?p=233\"},\"wordCount\":130,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/appfreelife.com\/#\/schema\/person\/642f91ef444c469d236f2a18aeec68d7\"},\"image\":{\"@id\":\"https:\/\/appfreelife.com\/?p=233#primaryimage\"},\"thumbnailUrl\":\"https:\/\/appfreelife.com\/wp-content\/uploads\/2025\/04\/Gen-AI-Intensive-Course-Capstone-2025Q1.png\",\"articleSection\":[\"\u30a2\u30d7\u30ea\u7d39\u4ecb\u306b\u3064\u3044\u3066\"],\"inLanguage\":\"ja\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/appfreelife.com\/?p=233#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/appfreelife.com\/?p=233\",\"url\":\"https:\/\/appfreelife.com\/?p=233\",\"name\":\"Google \u4e3b\u50ac\u300eGen AI Intensive Course Capstone 2025Q1\u300f\u306b\u53c2\u52a0\u3057\u307e\u3057\u305f\uff01 - \u30a2\u30d7\u30ea\u526f\u696d\u30e9\u30dc\uff01\",\"isPartOf\":{\"@id\":\"https:\/\/appfreelife.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/appfreelife.com\/?p=233#primaryimage\"},\"image\":{\"@id\":\"https:\/\/appfreelife.com\/?p=233#primaryimage\"},\"thumbnailUrl\":\"https:\/\/appfreelife.com\/wp-content\/uploads\/2025\/04\/Gen-AI-Intensive-Course-Capstone-2025Q1.png\",\"datePublished\":\"2025-04-13T05:51:15+00:00\",\"dateModified\":\"2025-04-13T05:51:43+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/appfreelife.com\/?p=233#breadcrumb\"},\"inLanguage\":\"ja\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/appfreelife.com\/?p=233\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\/\/appfreelife.com\/?p=233#primaryimage\",\"url\":\"https:\/\/appfreelife.com\/wp-content\/uploads\/2025\/04\/Gen-AI-Intensive-Course-Capstone-2025Q1.png\",\"contentUrl\":\"https:\/\/appfreelife.com\/wp-content\/uploads\/2025\/04\/Gen-AI-Intensive-Course-Capstone-2025Q1.png\",\"width\":900,\"height\":600},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/appfreelife.com\/?p=233#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u30db\u30fc\u30e0\",\"item\":\"https:\/\/appfreelife.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Google \u4e3b\u50ac\u300eGen AI Intensive Course Capstone 2025Q1\u300f\u306b\u53c2\u52a0\u3057\u307e\u3057\u305f\uff01\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/appfreelife.com\/#website\",\"url\":\"https:\/\/appfreelife.com\/\",\"name\":\"\u30a2\u30d7\u30ea\u526f\u696d\u30e9\u30dc\uff01\",\"description\":\"AI\u30a2\u30d7\u30ea\u958b\u767a\u3067\u3001\u81ea\u7531\u306a\u50cd\u304d\u65b9\u3092\u3064\u304b\u3082\u3046\u3002\",\"publisher\":{\"@id\":\"https:\/\/appfreelife.com\/#\/schema\/person\/642f91ef444c469d236f2a18aeec68d7\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/appfreelife.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ja\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/appfreelife.com\/#\/schema\/person\/642f91ef444c469d236f2a18aeec68d7\",\"name\":\"info@appfreelife.com\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\/\/appfreelife.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/appfreelife.com\/wp-content\/uploads\/2025\/04\/cropped-App\u526f\u696d\u30e9\u30dcicon2.png\",\"contentUrl\":\"https:\/\/appfreelife.com\/wp-content\/uploads\/2025\/04\/cropped-App\u526f\u696d\u30e9\u30dcicon2.png\",\"width\":512,\"height\":512,\"caption\":\"info@appfreelife.com\"},\"logo\":{\"@id\":\"https:\/\/appfreelife.com\/#\/schema\/person\/image\/\"},\"sameAs\":[\"http:\/\/appfreelife.com\"],\"url\":\"https:\/\/appfreelife.com\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Google \u4e3b\u50ac\u300eGen AI Intensive Course Capstone 2025Q1\u300f\u306b\u53c2\u52a0\u3057\u307e\u3057\u305f\uff01 - \u30a2\u30d7\u30ea\u526f\u696d\u30e9\u30dc\uff01","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/appfreelife.com\/?p=233","og_locale":"ja_JP","og_type":"article","og_title":"Google \u4e3b\u50ac\u300eGen AI Intensive Course Capstone 2025Q1\u300f\u306b\u53c2\u52a0\u3057\u307e\u3057\u305f\uff01 - \u30a2\u30d7\u30ea\u526f\u696d\u30e9\u30dc\uff01","og_description":"2025\u5e743\u670831\u65e5\uff08\u6708\uff09\u304b\u30894\u67084\u65e5\uff08\u91d1\uff09\u307e\u3067\u958b\u50ac\u3055\u308c\u305fGoogle\u4e3b\u50ac\u306e5\u65e5\u9593\u96c6\u4e2d\u578b\u30b3\u30fc\u30b9\u300cGen AI Intensive Course with Google\u300d\u306b\u53c2\u52a0\u3057\u3001\u305d\u306e\u96c6\u5927\u6210\u3068\u306a\u308b\u300eCapstone Pro [&hellip;]","og_url":"https:\/\/appfreelife.com\/?p=233","og_site_name":"\u30a2\u30d7\u30ea\u526f\u696d\u30e9\u30dc\uff01","article_published_time":"2025-04-13T05:51:15+00:00","article_modified_time":"2025-04-13T05:51:43+00:00","og_image":[{"width":900,"height":600,"url":"https:\/\/appfreelife.com\/wp-content\/uploads\/2025\/04\/Gen-AI-Intensive-Course-Capstone-2025Q1.png","type":"image\/png"}],"author":"info@appfreelife.com","twitter_card":"summary_large_image","twitter_misc":{"\u57f7\u7b46\u8005":"info@appfreelife.com","\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593":"23\u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/appfreelife.com\/?p=233#article","isPartOf":{"@id":"https:\/\/appfreelife.com\/?p=233"},"author":{"name":"info@appfreelife.com","@id":"https:\/\/appfreelife.com\/#\/schema\/person\/642f91ef444c469d236f2a18aeec68d7"},"headline":"Google \u4e3b\u50ac\u300eGen AI Intensive Course Capstone 2025Q1\u300f\u306b\u53c2\u52a0\u3057\u307e\u3057\u305f\uff01","datePublished":"2025-04-13T05:51:15+00:00","dateModified":"2025-04-13T05:51:43+00:00","mainEntityOfPage":{"@id":"https:\/\/appfreelife.com\/?p=233"},"wordCount":130,"commentCount":0,"publisher":{"@id":"https:\/\/appfreelife.com\/#\/schema\/person\/642f91ef444c469d236f2a18aeec68d7"},"image":{"@id":"https:\/\/appfreelife.com\/?p=233#primaryimage"},"thumbnailUrl":"https:\/\/appfreelife.com\/wp-content\/uploads\/2025\/04\/Gen-AI-Intensive-Course-Capstone-2025Q1.png","articleSection":["\u30a2\u30d7\u30ea\u7d39\u4ecb\u306b\u3064\u3044\u3066"],"inLanguage":"ja","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/appfreelife.com\/?p=233#respond"]}]},{"@type":"WebPage","@id":"https:\/\/appfreelife.com\/?p=233","url":"https:\/\/appfreelife.com\/?p=233","name":"Google \u4e3b\u50ac\u300eGen AI Intensive Course Capstone 2025Q1\u300f\u306b\u53c2\u52a0\u3057\u307e\u3057\u305f\uff01 - \u30a2\u30d7\u30ea\u526f\u696d\u30e9\u30dc\uff01","isPartOf":{"@id":"https:\/\/appfreelife.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/appfreelife.com\/?p=233#primaryimage"},"image":{"@id":"https:\/\/appfreelife.com\/?p=233#primaryimage"},"thumbnailUrl":"https:\/\/appfreelife.com\/wp-content\/uploads\/2025\/04\/Gen-AI-Intensive-Course-Capstone-2025Q1.png","datePublished":"2025-04-13T05:51:15+00:00","dateModified":"2025-04-13T05:51:43+00:00","breadcrumb":{"@id":"https:\/\/appfreelife.com\/?p=233#breadcrumb"},"inLanguage":"ja","potentialAction":[{"@type":"ReadAction","target":["https:\/\/appfreelife.com\/?p=233"]}]},{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/appfreelife.com\/?p=233#primaryimage","url":"https:\/\/appfreelife.com\/wp-content\/uploads\/2025\/04\/Gen-AI-Intensive-Course-Capstone-2025Q1.png","contentUrl":"https:\/\/appfreelife.com\/wp-content\/uploads\/2025\/04\/Gen-AI-Intensive-Course-Capstone-2025Q1.png","width":900,"height":600},{"@type":"BreadcrumbList","@id":"https:\/\/appfreelife.com\/?p=233#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u30db\u30fc\u30e0","item":"https:\/\/appfreelife.com\/"},{"@type":"ListItem","position":2,"name":"Google \u4e3b\u50ac\u300eGen AI Intensive Course Capstone 2025Q1\u300f\u306b\u53c2\u52a0\u3057\u307e\u3057\u305f\uff01"}]},{"@type":"WebSite","@id":"https:\/\/appfreelife.com\/#website","url":"https:\/\/appfreelife.com\/","name":"\u30a2\u30d7\u30ea\u526f\u696d\u30e9\u30dc\uff01","description":"AI\u30a2\u30d7\u30ea\u958b\u767a\u3067\u3001\u81ea\u7531\u306a\u50cd\u304d\u65b9\u3092\u3064\u304b\u3082\u3046\u3002","publisher":{"@id":"https:\/\/appfreelife.com\/#\/schema\/person\/642f91ef444c469d236f2a18aeec68d7"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/appfreelife.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ja"},{"@type":["Person","Organization"],"@id":"https:\/\/appfreelife.com\/#\/schema\/person\/642f91ef444c469d236f2a18aeec68d7","name":"info@appfreelife.com","image":{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/appfreelife.com\/#\/schema\/person\/image\/","url":"https:\/\/appfreelife.com\/wp-content\/uploads\/2025\/04\/cropped-App\u526f\u696d\u30e9\u30dcicon2.png","contentUrl":"https:\/\/appfreelife.com\/wp-content\/uploads\/2025\/04\/cropped-App\u526f\u696d\u30e9\u30dcicon2.png","width":512,"height":512,"caption":"info@appfreelife.com"},"logo":{"@id":"https:\/\/appfreelife.com\/#\/schema\/person\/image\/"},"sameAs":["http:\/\/appfreelife.com"],"url":"https:\/\/appfreelife.com\/?author=1"}]}},"views":"11","_links":{"self":[{"href":"https:\/\/appfreelife.com\/index.php?rest_route=\/wp\/v2\/posts\/233","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/appfreelife.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/appfreelife.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/appfreelife.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/appfreelife.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=233"}],"version-history":[{"count":1,"href":"https:\/\/appfreelife.com\/index.php?rest_route=\/wp\/v2\/posts\/233\/revisions"}],"predecessor-version":[{"id":234,"href":"https:\/\/appfreelife.com\/index.php?rest_route=\/wp\/v2\/posts\/233\/revisions\/234"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/appfreelife.com\/index.php?rest_route=\/wp\/v2\/media\/235"}],"wp:attachment":[{"href":"https:\/\/appfreelife.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=233"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/appfreelife.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=233"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/appfreelife.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=233"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}