今回はkintone内のテンプレートアプリ案件管理(サンプルデータ有)において、内容を踏まえたセールストークを生成するようにしました。
目次
はじめに
過去にはGPTsでセールストークを作る、という取り組みをしたことがありました。
その際にもさすがのChatGPTです。質の高いセールストークを出してきました。
その時の課題の1つがお客様の課題をいかに入力するかでした。
その時に具体的にどのような対処したかはさておき、データベースとの接続またはデータの一部読み取りは、とても大事になってきます。
そこでkintoneとの連携の活用です。kintoneのサンプルアプリには案件管理のアプリが存在します。活用例の1つとして案件データからの活用が可能ということです。
以前、議事録のデータからその分析を行う組み合わせを行いました。それと同様にkintoneのアプリ上に存在する営業関連のデータを基に生成AIにセールストークを考えてもらうようにしました。
やりたいこと
データベースとして活躍するkintone上の案件情報 ⇒ セールストーク生成
またGeminiでも対応できるようなソースコードを含ませようと思いますので、お手元の環境次第で試してみてください。
※公式ドキュメントなども参照してください
※コードの導入についても公式のドキュメントに分かりやすくまとまっています
実際のコード
(() => {
'use strict';
// ChatGPT APIのエンドポイントURL
const apiUrl = 'https://api.openai.com/v1/chat/completions';
// ChatGPT APIキーの指定(適切なAPIキーを入力してください)
const apiKey = '******';
// ChatGPT APIにリクエストを送信する関数
const sendChatGPTRequest = async (caseInfo, activityHistory) => {
const prompt = `
以下の案件情報と活動履歴をもとに、提案する製品の「費用対効果」を特に重視した、定量的な説得力のあるセールストークを作成してください。以下の各項目を網羅的に記述し、具体的な数値や顧客にとってのメリットが明確に伝わるようにしてください。長めの説明で、より詳細な情報を含むようにしてください。
。各項目の内容は、項目名の後に ': ' を付けて記述してください:
1. 費用対効果:
- 製品の導入により期待できる効果やコスト削減の具体的なポイントを挙げ、どのようにコストパフォーマンスが優れているかを説明してください。
- 案件情報に基づき、ユーザー数や単価から総費用を算出し、予想されるリターンや削減効果を示してください。
- 顧客にとっての投資価値がわかりやすくなるよう、同様の事例や他社の成功事例も加えてください。
2. 算出根拠:
- 費用対効果の計算において使用した根拠や計算方法について説明してください。例えば、製品の利用によりどのような業務効率が向上し、どれだけのコスト削減が見込まれるかを具体的に記述してください。
- ユーザー数や単価をもとに、全体のコストをどのように評価したかも含めて説明してください。
3. それらを踏まえたセールストーク:
- 上記の費用対効果や算出根拠をふまえ、顧客のニーズに応じたセールストークを作成してください。活動履歴から、顧客がどのようなポイントを重視しているかを推測し、そのニーズに応えるような提案を心がけてください。
- 活動履歴に基づき、過去のやりとりや顧客の反応から興味を引く要素を盛り込み、個別の提案や丁寧なフォローを強調してください。
- 顧客が実際に使用する場面や効果が具体的にイメージできるようなストーリーを加えて、製品の必要性を伝えてください。
費用対効果:
算出根拠:
それらを踏まえたセールストーク:
案件情報:
${caseInfo}
活動履歴:
${activityHistory}
`;
const response = await fetch(apiUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${apiKey}`
},
body: JSON.stringify({
model: 'gpt-4o-mini', // 適切なモデルを指定してください
messages: [
{ role: 'system', content: 'You are a helpful assistant that analyzes case information and activity history to generate cost-effectiveness, calculation basis, and sales talk.' },
{ role: 'user', content: prompt }
]
})
});
const parsedResponse = await response.json();
if (!response.ok) {
const error = parsedResponse.error;
throw new Error(`${error.code}: ${error.message}`);
}
return parsedResponse.choices[0].message.content;
};
// 応答を項目ごとに分類する関数
const categorizeResponse = (response) => {
const categories = ['費用対効果', '算出根拠', 'それらを踏まえたセールストーク'];
const result = {};
categories.forEach(category => {
const regex = new RegExp(`${category}:\\s*(.+?)(?=\\n\\n|$)`, 's');
const match = response.match(regex);
result[category] = match ? match[1].trim() : '';
});
return result;
};
// 案件情報と活動履歴を取得して分析する関数
const analyzeAndClassify = async (record) => {
// 案件情報の取得
const productName = record['製品名'] ? record['製品名'].value : '';
const unitPrice = record['単価'] ? record['単価'].value : '';
const userCount = record['ユーザー数'] ? record['ユーザー数'].value : '';
const caseInfo = `
製品名: ${productName}
単価: ${unitPrice}
ユーザー数: ${userCount}
`;
// 活動履歴の取得 (テーブルデータの集計)
const activityHistoryTable = record['活動履歴'].value;
const activityHistory = activityHistoryTable.map(activity => {
const date = activity.value['活動日'] ? activity.value['活動日'].value : '';
const content = activity.value['活動内容'] ? activity.value['活動内容'].value : '';
const memo = activity.value['メモ'] ? activity.value['メモ'].value : '';
return `活動日: ${date}, 活動内容: ${content}, メモ: ${memo}`;
}).join('\n');
if (!caseInfo || !activityHistory) {
throw new Error('案件情報または活動履歴が入力されていません。');
}
const response = await sendChatGPTRequest(caseInfo, activityHistory);
return categorizeResponse(response);
};
kintone.events.on('app.record.detail.show', (event) => {
const record = event.record;
const menuButton = document.createElement('button');
menuButton.id = 'analyze_button';
menuButton.innerText = '費用対効果の算出';
menuButton.onclick = async function() {
try {
menuButton.disabled = true;
menuButton.innerText = '処理中...';
const appId = kintone.app.getId();
const recordId = kintone.app.record.getId();
// レコードを取得
const body = {
app: appId,
id: recordId
};
const res = await kintone.api(kintone.api.url('/k/v1/record.json', true), 'GET', body);
const currentRecord = res.record;
const result = await analyzeAndClassify(currentRecord);
// 更新のパラメータを宣言
const putBody = {
app: appId,
id: recordId,
record: {
'費用対効果': { value: result['費用対効果'] },
'算出根拠': { value: result['算出根拠'] },
'それらを踏まえたセールストーク': { value: result['それらを踏まえたセールストーク'] }
}
};
// レコードを更新
await kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT', putBody);
alert('費用対効果の算出が完了しました。');
// 画面の更新
location.reload();
} catch (error) {
console.error('エラー:', error);
alert(`エラーが発生しました: ${error.message}`);
} finally {
menuButton.disabled = false;
menuButton.innerText = '費用対効果の算出';
}
};
const headerMenuSpace = kintone.app.record.getHeaderMenuSpaceElement();
headerMenuSpace.appendChild(menuButton);
return event;
});
})();
このコードの改変について
基本機能をこのままにする前提ですが、2点改変ポイントがあります。
・システムプロンプト
{ role: 'system', content: 'You are a helpful assistant that analyzes case information and activity history to generate cost-effectiveness, calculation basis, and sales talk.' }
Youからはじまるこの文章は、受け取ったデータをどのように見て欲しいか取り扱ってほしいかを記述する場所です。生成AIとでも構いません。ここを詰めておくと回答の焦点がぐっと定まります。
・項目の整理
const prompt = `
以下の案件情報と活動履歴をもとに、提案する製品の「費用対効果」を特に重視した、定量的な説得力のあるセールストークを作成してください。以下の各項目を網羅的に記述し、具体的な数値や顧客にとってのメリットが明確に伝わるようにしてください。長めの説明で、より詳細な情報を含むようにしてください。
。各項目の内容は、項目名の後に ': ' を付けて記述してください:
今回はkintoneのアプリ上にある項目を複数読み取る必要がありました。そこでそれぞれの項目をどのようにLLMに分析させて、そこからセールストーク生成に繋げるかを指示する必要があります。
これはおそらくGPTs等でも使うようなやり方です。
そのためアプリごとの項目に沿って参照先も変わりかつその扱い方も変わるでしょう。
どんな利用方法が考えられるのか
セールストークがそのままの形で使えるわけではなく、取って出しのような性質を持っているため、直接的な使用には向かないかもしれません。しかし、次の商談に向けての参考資料として活用することが主な使い方となるでしょう。
具体的には、商談の準備段階で、過去の案件データや活動履歴をもとに生成されたセールストークを分析し、顧客のニーズや関心に合わせてカスタマイズすることで、より効果的なプレゼンテーションを行うことが可能です。
また、内部向けの利用方法としても有用です。例えば、ある程度案件状況が固まった後に、報告をまとめる必要がある場合があります。
その際、kintone上の項目を参照しながら、ある程度のフォーマットに基づいて文章を生成することで、振り返りにも使える報告資料を作成することができます。これにより、チーム内での情報共有がスムーズになり、次のステップへの準備が効率的に進められるでしょう。
どんな流れで作成したのか
全体を通して生成AIと相談しながら進行していました。生成AIの活用により、プロセスの各段階でフィードバックを得ながら、より実状に沿ったセールストークを生成することができました。
①基本構造は
以前、議事録kintoneアプリ用に作成したコードがあるため、そのコードを参照しました。
このコードは、アプリ内情報の読み取りから始まり、APIリクエストを経て、最終的にアプリ内に反映するという流れを持っています。この基本的な流れは今回のプロジェクトでも同様であり、アプリの目的に応じて細部を修正するだけで済みました。
②複数項目の読み取り
営業活動の記録をまとめる必要があり、参照するコードでは議事録の時とは異なり、複数項目の読み取りを設定する必要がありました。複数の項目を読み取るだけであれば、生成AIとの相談や既存ドキュメントの参照でも可能ですが、LLMへの指示として、参照した複数の項目をどのように取り扱うかをプロンプトに組み込む必要が出てきます。
これにより、生成されるセールストークがより具体的で、顧客のニーズに合ったものとなります。
③複数項目の書き出し
②と同様に、出力を複数の内容に取りまとめる必要があり、それをプロンプトと一緒にコードに実装しました。
これにより、生成されたセールストークが、顧客の関心を引く要素を盛り込み、個別の提案や丁寧なフォローを強調する形で提供されるようになりました。
最終的に、顧客が実際に使用する場面や効果を具体的にイメージできるようなストーリーを加えることで、製品の必要性を効果的に伝えることが可能となりました。
最終的に下記のような出力結果が出来ました。
※入力されているデータはkintoneアプリ内に最初から投入されているダミーデータです。
kintoneではワンクリックでAIとのやり取りが出来るようになります。
4DLでは(千葉市に限りません!)こういった活用のお手伝いも行っています。
お気軽にご相談いただければと思います。
また定期的にワークショップも開催しています。
https://4dlt.com/makuhari_prompt_study
こちらもご参加いただけたら嬉しいです!