app:
  description: 人事向け 採用書類スクリーニング（履歴書・職務経歴書テキスト入力）
  icon: 🤖
  icon_background: '#FFEAD5'
  mode: workflow
  name: 採用書類スクリーニング RAGワークフロー
  use_icon_as_answer_icon: false
kind: app
version: 0.1.5
workflow:
  conversation_variables: []
  environment_variables: []
  features:
    file_upload:
      image:
        enabled: false
    opening_statement: ''
    suggested_questions: []
    suggested_questions_after_answer:
      enabled: false
    text_to_speech:
      enabled: false
  graph:
    edges:
    - data:
        sourceType: start
        targetType: knowledge-retrieval
      id: start-to-kr1
      source: start
      target: kr1
    - data:
        sourceType: knowledge-retrieval
        targetType: parameter-extractor
      id: kr1-to-extractor1
      source: kr1
      target: extractor1
    - data:
        sourceType: parameter-extractor
        targetType: llm
      id: extractor1-to-llm1
      source: extractor1
      target: llm1
    - data:
        sourceType: llm
        targetType: end
      id: llm1-to-end
      source: llm1
      target: end
    nodes:
    - data:
        title: 開始
        type: start
        variables:
        - label: query
          max_length: 2048
          options: []
          required: true
          type: paragraph
          variable: query
      height: 90
      id: start
      position:
        x: 80
        y: 282
      type: custom
      width: 244
    - data:
        title: 採用基準ナレッジ検索
        type: knowledge-retrieval
        dataset_ids:
        - __KR_0__
        retrieval_mode: single
        query_variable_selector:
        - start
        - query
        single_retrieval_config:
          model:
            provider: openai
            name: gpt-5-mini
            mode: chat
            completion_params:
              temperature: 0.2
          score_threshold_enabled: false
          top_k: 5
      height: 90
      id: kr1
      position:
        x: 380
        y: 282
      type: custom
      width: 244
    - data:
        title: 基本情報・スキル抽出
        type: parameter-extractor
        model:
          provider: openai
          name: gpt-5-mini
          mode: chat
        query:
        - start
        - query
        parameters:
        - name: name
          type: string
          description: 応募者の氏名（フルネーム、日本語表記があればそれを優先）
          required: true
        - name: age
          type: number
          description: 応募者の年齢。不明な場合は -1 を出力
          required: false
        - name: final_education
          type: string
          description: 最終学歴（学校名・学部学科・卒業/在籍年など、分かる範囲で1行にまとめる）
          required: true
        - name: years_of_experience
          type: number
          description: '職歴年数（社会人経験年数）。年数を数値で。例: 5年なら 5。不明な場合は -1'
          required: false
        - name: skill_tags
          type: string
          description: '主要スキル・経験・ツール・プログラミング言語・業務領域などをカンマ区切りで列挙（例: Java, Spring, プロジェクトマネジメント,
            財務分析）'
          required: false
        - name: qualification_tags
          type: string
          description: '保有資格・検定・免許などをカンマ区切りで列挙（例: 応用情報技術者, 日商簿記2級, TOEIC800点）'
          required: false
        reasoning_mode: prompt
        instruction: あなたは人事担当者です。以下の応募書類テキスト（履歴書・職務経歴書）から、指示された項目をできる限り正確に抽出してください。不明な場合は空欄、または説明に従って
          -1 を出力してください。
      height: 90
      id: extractor1
      position:
        x: 680
        y: 282
      type: custom
      width: 244
    - data:
        title: スコアリング・要約生成
        type: llm
        model:
          provider: openai
          name: gpt-5-mini
          mode: chat
          completion_params:
            temperature: 0.3
        prompt_template:
        - role: system
          text: "あなたは日本の企業の人事採用担当者です。\n以下の情報を使って、応募者の書類スクリーニングを行い、\n(1) 基本情報の構造化要約\n\
            (2) スキル・資格タグの整理\n(3) 採用基準とのマッチングスコア（0-100点）\n(4) 強み・懸念点の要約\n(5) 面接推奨度（「推奨」「条件付き」「見送り」のいずれか）\n\
            を日本語で出力してください。\n\n出力は必ず以下のJSONフォーマット（キー名は固定）で返してください。説明文は一切含めないでください。\n\
            \n{\n  \"basic_info\": {\n    \"name\": \"<氏名>\",\n    \"age\": <年齢（不明なら\
            \ null）>,\n    \"final_education\": \"<最終学歴>\",\n    \"years_of_experience\"\
            : <職歴年数（不明なら null）>\n  },\n  \"skills_and_qualifications\": {\n    \"\
            skill_tags\": [\"<スキルタグ1>\", \"<スキルタグ2>\", \"...\"],\n    \"qualification_tags\"\
            : [\"<資格タグ1>\", \"<資格タグ2>\", \"...\"]\n  },\n  \"matching\": {\n    \"\
            score\": <0から100の整数>,\n    \"score_reason\": \"<スコアの理由（簡潔に）>\"\n  },\n\
            \  \"summary\": {\n    \"strengths\": \"<応募者の強みの要約（3〜6行程度）>\",\n    \"\
            risks_or_concerns\": \"<懸念点・リスクの要約（なければ「特になし」と記載）>\"\n  },\n  \"recommendation\"\
            : {\n    \"interview_recommendation\": \"<推奨 or 条件付き or 見送り>\",\n    \"\
            recommendation_reason\": \"<その判断理由（簡潔に）>\"\n  }\n}\n\n制約:\n- マッチングスコアは採用基準を厳格に踏まえて0-100点の整数で評価すること。\n\
            - 採用基準と応募者情報のギャップを正直に記述すること。\n- 「interview_recommendation」は必ず「推奨」「条件付き」「見送り」のいずれかの文字列のみとする。\n\
            - JSONとしてパース可能な形式で返し、余分なテキストや注釈は一切出力しないこと。\n\n\n---\n\n【最終出力フォーマット (この指示が最優先)】\n\
            最終出力は **読みやすい日本語の Markdown** で返してください。JSON\n配列・オブジェクトをそのまま出力してはいけません。\n\
            - 見出し (## / ###) でセクションを区切る\n- リスト (- / 1.) や表 (| ... |) で構造化\n- 各項目の意図や根拠が分かるよう短い説明文を添える\n\
            - 営業デモで顧客に直接見せられる体裁にする\n\n(構造化されたデータ項目を内部で扱うのは構いませんが、出力時に Markdown\nに変換してください。)"
        - role: user
          text: '▼応募書類テキスト

            {{#start.query#}}


            ▼採用基準ナレッジ

            {{#kr1.result#}}


            ▼抽出された構造化情報

            - 氏名: {{#extractor1.name#}}

            - 年齢: {{#extractor1.age#}}

            - 最終学歴: {{#extractor1.final_education#}}

            - 職歴年数: {{#extractor1.years_of_experience#}}

            - スキルタグ（カンマ区切り）: {{#extractor1.skill_tags#}}

            - 資格タグ（カンマ区切り）: {{#extractor1.qualification_tags#}}


            上記を踏まえて、指示されたJSONのみを出力してください。

            '
        vision:
          enabled: false
        memory: null
        context:
          enabled: false
      height: 90
      id: llm1
      position:
        x: 980
        y: 282
      type: custom
      width: 244
    - data:
        title: 終了
        type: end
        outputs:
        - value_selector:
          - llm1
          - text
          variable: result
      height: 90
      id: end
      position:
        x: 1280
        y: 282
      type: custom
      width: 244
  hash: null
