Phase2: LLMベースのFAQ応答ボット 設計ドキュメント

 

1. 現在のシステム仕様(フェーズ1)

1.1 処理フロー

  1. ユーザーが問い合わせメッセージを送信
  2. Webhook API がメッセージを受信
  3. PostgreSQL の FAQ データベースを検索
    • キーワード検索で一致する質問・回答を取得
  4. 一致する回答を返信
    • 見つからない場合は「質問を詳しく教えてください」と返答

1.2 現在のデータベース構造

CREATE TABLE faq (
    id SERIAL PRIMARY KEY,
    keyword TEXT NOT NULL,
    response TEXT NOT NULL
);

2. フェーズ2: LLM を活用した応答システム

2.1 機能概要

  • 従来のキーワード検索を廃止し、FAQデータベース全体を活用して GPT-4 などの LLM に回答を生成させる
  • 動的な回答生成により、より柔軟な回答が可能になる
  • LLM のプロンプトを最適化し、ユーザーの問い合わせとFAQ情報を適切に組み合わせて送信

2.2 新しい処理フロー

  1. ユーザーの問い合わせメッセージを受信
  2. Webhook API で処理
  3. PostgreSQL から FAQ データベースの全エントリを取得
  4. 問い合わせメッセージとFAQデータを OpenAI API に送信
  5. LLM が最適な回答を生成
  6. ユーザーに返答

3. 新しいシステムアーキテクチャ

[ユーザー] 
  ⇅  LINE (Messaging API)
  ⇅  Webhook API(Node.js / Express)
  ⇅  FAQデータベース(PostgreSQL)
  ⇅  OpenAI API(LLMを利用)
  ⇅  生成された回答をユーザーに送信

3.1 技術スタック

コンポーネント使用技術
Webhook APINode.js + Express
データベースPostgreSQL
LLM APIOpenAI GPT-4 API
データ取得Sequelize(ORM)
プロンプト最適化カスタムプロンプト設計


4. 詳細設計

4.1 Webhook API のアップデート

エンドポイント

HTTP メソッドエンドポイント説明
POST/webhookユーザーのメッセージを受信し、LLMで回答を生成

処理フロー

  1. LINEの Webhook リクエストを受信
  2. messageHandler.js でメッセージを解析
  3. FAQ データベースから全エントリを取得
  4. OpenAI API にリクエストを送信し、回答を生成
  5. LINE API を通じてユーザーに返信

4.2 FAQ データ取得

クエリ

SELECT keyword, response FROM faq;

Node.js 実装

const getFAQData = async () => {
    const results = await db.query("SELECT keyword, response FROM faq");
    return results.rows;
};

4.3 LLM プロンプト設計

入力フォーマット

ユーザーの質問: {ユーザーの問い合わせ内容}
FAQデータ:
- Q: {FAQ1の質問} / A: {FAQ1の回答}
- Q: {FAQ2の質問} / A: {FAQ2の回答}
- ...
質問に最適な回答を 100 文字以内で生成してください。

Node.js の API コール

const openai = require("openai");

const generateResponse = async (userMessage, faqData) => {
    const prompt = `ユーザーの質問: ${userMessage}\n\nFAQデータ:\n` +
        faqData.map(faq => `- Q: ${faq.keyword} / A: ${faq.response}`).join("\n") +
        "\n質問に最適な回答を 100 文字以内で生成してください。";

    const response = await openai.Completion.create({
        model: "gpt-4",
        prompt: prompt,
        max_tokens: 100
    });

    return response.choices[0].text.trim();
};

5. データベース変更

既存の faq テーブルをそのまま使用するが、新たに「カテゴリ」などを追加する可能性を考慮。

将来的な拡張

ALTER TABLE faq ADD COLUMN category TEXT;

6. テスト計画

テストケース期待する結果
1. 正しい FAQ 応答が返るかユーザーの質問に適した LLM の回答が返る
2. LLM が回答を生成できない場合の処理「詳しく教えてください」と促す
3. DB から FAQ を正しく取得できるかすべての FAQ エントリが OpenAI API に送信される
4. LLM の回答が 100 文字以内になっているか適切な長さで出力される

7. 開発スケジュール

フェーズタスク期間
設計完了LLM FAQ アップデートの設計✅ 完了
環境構築OpenAI API の認証設定1日
データ取得処理FAQ データの取得 (getFAQData)1日
LLM 連携OpenAI API を利用した回答生成2日
API 統合Webhook から LLM へのデータ連携2日
テスト & デバッグLLM の回答精度検証3日
本番リリースユーザー向け公開1日

8. 今後の拡張(フェーズ3以降)

  • ユーザーの問い合わせ履歴を考慮した回答
  • 個別質問の傾向分析と推薦
  • 音声入力対応
  • 多言語対応

9. 次のアクション

  1. 実装開始
    • messageHandler.js の LLM 連携実装
    • getFAQData() の OpenAI API 連携
  2. LLM の回答精度チューニング
    • プロンプトの調整
    • トークン数の最適化
  3. テスト環境でのデプロイ
    • API 応答時間の計測
    • ユーザーテスト

この設計をもとに、フェーズ2の実装を開始 していきましょう!

0 件のコメント:

コメントを投稿