// AIチャットボット設定とロジック class ChatbotEngine { constructor(portfolioData) { this.portfolioData = portfolioData; this.initializePatterns(); } // パターン設定の初期化 initializePatterns() { this.patterns = { greeting: { keywords: ['こんにちは', 'こんばんは', 'はじめまして', 'よろしく', 'hello', 'hi'], response: () => `こんにちは!加木谷直俊のポートフォリオをご覧いただき、ありがとうございます。\n私は${this.portfolioData.personal.experience}のエンジニアとして、主にWebサイトとモバイルアプリの開発に携わっています。\n何かご質問があれば、お気軽にお尋ねください!` }, skills: { keywords: ['スキル', '技術', '言語', 'フレームワーク', 'できること', 'プログラミング', 'react', 'python', 'django', 'flutter', 'typescript'], response: () => `私の主要なスキルをご紹介します:\n\n【フロントエンド】\n${this.portfolioData.skills.frontend.map(s => s.name).join("、")}\n\n【バックエンド】\n${this.portfolioData.skills.backend.map(s => s.name).join("、")}\n\n【データベース】\n${this.portfolioData.skills.database.map(s => s.name).join("、")}\n\n【クラウド・インフラ】\n${this.portfolioData.skills.cloud.map(s => s.name).join("、")}\n\n特にReact、Django、Flutterを中心とした開発技術で、スケーラブルなアプリケーションを構築することが得意です。` }, projects: { keywords: ['プロジェクト', '作品', 'copass', 'システム', '開発', 'アプリ', 'ソフト', 'product', 'project'], response: () => { const copass = this.portfolioData.projects.copass; return `現在携わっている主要プロジェクトは「${copass.name}」です。\n\n【概要】\n${copass.description}\n\n【使用技術】\n${copass.tech.join("、")}\n\n【主な機能】\n${copass.features.map(feature => `• ${feature}`).join("\n")}\n\nこのプロジェクトを通じて、企業間の関係性管理という複雑な業務フローをシステム化し、効率化を実現しています。`; } }, career: { keywords: ['経験', 'キャリア', '仕事', '会社', '職歴', '経歴', '学歴', '大学', '京都大学', 'ワークス', 'tdse', 'deex', 'career', 'work', 'experience'], response: () => `私の経歴をご紹介します:\n\n📚 【学歴】\n2017年 京都大学薬学部卒業\n薬学の基礎から応用まで幅広く学び、科学的思考力と問題解決能力を養成しました。\n\n💼 【職歴】\n• 2017年-2018年: 株式会社ワークスアプリケーションズ\n 大規模ERPシステムの開発に従事。企業向けアプリケーションの設計・開発を担当\n\n• 2018年-2023年: TDSE株式会社\n AIソリューションの開発に携わり、機械学習・データ分析システムの構築を経験\n\n• 2023年-現在: deex株式会社\n CoPASSプロジェクトのリードエンジニアとして、PRM系システムの開発を主導\n\n薬学からIT業界へのキャリアチェンジを経て、現在は${this.portfolioData.personal.experience}のフルスタックエンジニアとして活動しています。` }, contact: { keywords: ['連絡', 'メール', 'github', 'コンタクト', '相談', '依頼', 'contact', 'email', 'git', '問い合わせ'], response: () => `お仕事のご相談やご質問がございましたら、以下の方法でお気軽にご連絡ください:\n\n📧 Email: ${this.portfolioData.personal.email}\n💻 GitHub: ${this.portfolioData.personal.github}\n\nプロジェクトのご相談、技術的な質問、コラボレーションの機会など、何でもお気軽にお声がけください。\n迅速にお返事いたします!` } }; // 拡張パターン(フォールバック用) this.extendedPatterns = { salary: { keywords: ['年収', '給料', 'salary'], response: () => `申し訳ございませんが、年収などの個人的な情報についてはお答えできません。\n技術的なスキルや経験について詳しくお聞かせすることは可能です。` }, personal: { keywords: ['趣味', 'hobby', 'プライベート'], response: () => `プライベートについては控えさせていただいておりますが、技術への関心や学習について言えば、\n新しい技術の習得や効率的な開発手法の研究に日々取り組んでいます。` }, job: { keywords: ['転職', '求人', 'job', '採用'], response: () => `転職に関するご相談でしたら、まずは私のスキルや経験をご確認いただき、\nマッチするポジションがあるかどうか${this.portfolioData.personal.email}までご連絡ください。` }, pricing: { keywords: ['料金', '価格', '費用', 'cost'], response: () => `プロジェクトの規模や要件によって費用は変動いたします。\n具体的なご要望をお聞かせいただければ、詳しいお見積もりをご提案できます。` }, location: { keywords: ['場所', '住所', 'オフィス', 'リモート'], response: () => `東京都を拠点としており、リモートワークも対応可能です。\nプロジェクトの性質に応じて柔軟に対応いたします。` }, compliment: { keywords: ['すごい', '素晴らしい', 'great'], response: () => `ありがとうございます!9年間のエンジニア経験を活かし、\nお客様のプロジェクトに最適なソリューションを提供できるよう努めています。` } }; // デフォルト回答 this.defaultResponses = [ `ご質問ありがとうございます。以下のトピックについて詳しくお答えできます:\n\n• React、Django、Flutterでの開発経験\n• 企業向けシステム開発の実績\n• 京都大学薬学部からIT業界への転身経験\n• プロジェクト管理やチーム開発の経験\n\nどちらにご興味がありますか?`, `申し訳ございませんが、より具体的な質問をいただけると助かります。\n\n例えば:\n• 「Reactでの開発経験について教えて」\n• 「これまでのキャリアについて知りたい」\n• 「CoPASSプロジェクトの詳細は?」\n\nお気軽にお尋ねください!`, `私の経験やスキルについて、もう少し具体的にお聞かせください。\n\n主な専門分野:\n• フロントエンド: React, TypeScript\n• バックエンド: Python, Django\n• モバイル: Flutter, Dart\n• インフラ: GCP, AWS, Docker\n\nどの分野についてお知りになりたいですか?` ]; } // 曖昧検索機能 fuzzyMatch(text, keywords) { const normalizedText = text.toLowerCase().replace(/\s+/g, ''); return keywords.some(keyword => normalizedText.includes(keyword) || keyword.split('').some(char => normalizedText.includes(char)) ); } // メイン回答生成機能 generateResponse(userMessage) { const message = userMessage.toLowerCase(); // 基本パターンをチェック for (const pattern of Object.values(this.patterns)) { if (this.fuzzyMatch(message, pattern.keywords)) { return pattern.response(); } } // 拡張パターンをチェック for (const pattern of Object.values(this.extendedPatterns)) { if (this.fuzzyMatch(message, pattern.keywords)) { return pattern.response(); } } // デフォルト回答 return this.getRandomDefaultResponse(); } // ランダムなデフォルト回答を取得 getRandomDefaultResponse() { return this.defaultResponses[Math.floor(Math.random() * this.defaultResponses.length)]; } // パターンを動的に追加する機能 addPattern(name, keywords, responseFunc) { this.extendedPatterns[name] = { keywords: keywords, response: responseFunc }; } // パターンを削除する機能 removePattern(name) { delete this.extendedPatterns[name]; } } // グローバルに公開 window.ChatbotEngine = ChatbotEngine;