APIを使用したチャットボットは、過去の会話を記憶していません。そのため、連続した対話を実現するには、プロンプトに過去のやり取りを含める工夫が必要です。本記事は過去の会話を考慮したキャッチボールを行う方法となります。
過去の会話が以下のようにセッションに保存されているとします。
$histories[] = 'user:質問';
$histories[] = 'assistant:回答';
会話開始
過去会話から質問整形
過去の会話を考慮し、質問を整えます。セッションから会話履歴を取得
$histories = session('histories');
過去の会話履歴から質問を整形するためのプロンプトを作成
$conversation = '';
foreach($histories as $history){
$conversation .= $history."\n";
}
$prompts = [];
$question =
"
OpenAIのAPIを使用してチャットボットのサービスを提供しています。
しかし、APIは過去の会話を覚えていないのでユーザーがした質問に対し過去の会話を考慮してユーザーの質問を整えてやる必要があります。
以下が過去の会話です
".
$conversation.
"
以下はユーザーからの新しい質問です
ユーザー:".$question."
ユーザーからの新しい質問を過去の会話履歴から具体的な質問に整えて出力して下さい。
過去の会話と関係ない質問の場合はユーザーからの新しい質問をそのまま出力して下さい。
出力された内容をそのまま新しい質問として使用するので質問部分のみを出力して下さい。
"
;
return ["role" => "user", "content" => $question];
APIをコールして過去の会話から質問を整形してもらう
$api_key = "OpenAIのAPIキー";
$url = 'https://api.openai.com/v1/chat/completions';
$data = array(
'model' => 'gpt-4o-mini',
'max_tokens' => 1000,
"messages" => $prompts,
);
$headers = array(
'Content-Type: application/json',
'Authorization: Bearer ' . $api_key
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
$result = json_decode($response, true);
return $result['choices'][0]['message']['content'];
整形した質問のベクトルを算出する
ベクトル化参照最も近い質問を算出
整形された質問と最も近い登録済み質問を算出する。Laravel10 RAGのGなしでチャットボットを実装する方法参照
回答を決定
整形された質問、最も近い登録済み質問、その回答からLLMに適切な回答になるように整えてもらう。Laravel10 RAGでチャットボットを実装する方法参照
会話履歴を保存
$histories[] = 'user:質問';
$histories[] = 'assistant:回答';
実際にチャットボットを運用するにはエラー処理や質問に近い回答が見つからない場合などの処理を追加しなければいけませんが、一応上記のコードで過去の会話を考慮した会話が可能となります。