設計説明資料

Agent i Biz — 設計と実装の説明資料

営業スライドで示した4つの価値を、実際にどんな構成・実装で実現しているかをまとめた資料です。 末尾に gpt-image-1(ChatGPT Images 2.0)を使った画像生成スキームと図を掲載しています。

プロダクト
企業向けAIチャット構築基盤
作成日
2026-06-12
対象
提案先・社内開発
SECTION 1

プロダクト概要

Agent i Biz は、1つの共通基盤の上で「企業(テナント)ごとに独立したAI接客チャット」を量産できる マルチテナント基盤です。企業は「業界テンプレートを選ぶ → 自社の資料を入れる → トーンを決める」だけで、その会社専用の接客人格を持つAIをLINE等で公開できます。

テンプレート量産

業界の雛形(枠)に各社の差分(値)を入れるだけで起動。

完全なデータ分離

全クエリを tenant_id でスコープ。他社情報は混ざらない。

運用で精度向上

会話ログを Neon に蓄積し、改善の土台にする。

SECTION 2

全体アーキテクチャ(1リクエストの流れ)

ユーザーの発話が届いてからAIが応答するまでの流れです。テナント分離は「②テナント特定」と 「全クエリの tenant_id スコープ」で担保しています。

1

チャネルから着信

実装済み

LINE Webhook(/api/line/webhook/[tenant])または Webチャット(/chat/[tenant])から受信。

2

テナントを特定

実装済み

URLの [tenant] から tenantId を取得し、getTenantById でその企業の設定・ナレッジだけを読み込む。

3

システムプロンプトを合成

実装済み

buildSystemPrompt がペルソナ × 口調 × ナレッジ × FAQ を1つのプロンプトに注入(=RAG的)。

4

LLM応答 + ツール実行

実装済み

AI Gateway 経由の GPT が応答をストリーミング。商品を持つ企業では recommendProducts / checkStock を自動実行。

5

会話ログを保存

実装済み

ユーザー発話とAI応答を conversations テーブル(tenant_id付き)に記録し、運用改善に使う。

SECTION 3 / スライド①

体験の3階層

テキスト接客・音声対応・アバター接客の3階層を示すスライド

標準のテキスト接客を土台に、音声・アバターを「上に重ねる」段階設計です。現状の実装範囲を正直に示します。

① テキスト接客(標準)

実装済み

チャットで質問に回答。useChat + streamText によるストリーミング応答として実装済み。

② 音声対応(+α)

設計のみ(実装予定)

入力=音声認識、出力=音声合成。設計は確定しているが本リポジトリには未実装。Web Speech API もしくは音声モデルでの追加を想定。

③ アバター接客(最上位)

設計のみ(実装予定)

顔・声・動画のアバター。後述の画像生成(gpt-image-1)で顔素材を作り、動画/音声と組み合わせる構想。未実装。

SECTION 4 / スライド②

1社ぶんの接客人格を構築

業界テンプレート × 自社ナレッジ(RAG)× 企業ごとのトーンで接客人格を構築するスライド

「業界テンプレート × 自社ナレッジ × トーン」を1つのシステムプロンプトに合成して接客人格を作ります。 実体は lib/build-prompt.ts buildSystemPrompt() です。

① 業界テンプレート

EC・医療・通信・飲食の雛形。ナレッジの枠・初期FAQ・既定トーンを定義(lib/templates.ts)。

② 自社ナレッジ(RAG)

登録したFAQ・資料の索引をプロンプトに注入。「根拠データに基づいて答える」をルール化。

③ 企業ごとのトーン

丁寧 / フレンドリー / 簡潔 を toneGuide で文章化し、ブランドの声を統一。

プロンプト合成の構造(実コードより)

buildSystemPrompt(tenant) =
  あなたは「{企業名}」(業種: {industry})の公式AIアシスタントです。
  # ペルソナ      … tenant.persona
  # 口調          … toneGuide[tenant.tone]  // 丁寧/フレンドリー/簡潔
  # 登録ナレッジ  … tenant.knowledge[](索引)
  # FAQと公式回答 … tenant.faqs[](最優先の根拠)
  # 実行アクション … 商品を持つ企業のみ tools を追記
  # 重要ルール    … 根拠のない創作を禁止 / 他社情報に触れない

データ分離:各社の設定・ナレッジ・会話・商品は tenant_id で分離。プロンプトには 対象企業のデータ「のみ」を注入するため、他社情報がAI応答に混ざりません。

SECTION 5 / スライド③

実行型アクション(口先でなく実機)

アパレル・カフェ・賃貸の実機デモ。提案・予約・検索を実行するスライド

AIが「答える」だけでなく「実行する」仕組みです。AI SDK の tool calling で、AIが必要に応じて 関数を呼び、リアルタイムのデータに基づいて回答します。本リポジトリではコスメEC向けに 商品提案・在庫確認を実装済みです。

recommendProducts実装済み

肌質・お悩み・カテゴリ・予算で商品DBを検索し、在庫あり優先で上位3件を提案。

checkStock実装済み

商品名から在庫状況(在庫あり / 残りわずか / 在庫切れ)を確認して回答。

ツール実行のシーケンス

ユーザー発話

「乾燥肌に合う美容液は?5000円以内で」

AIがツール選択

recommendProducts を呼び出し(引数を自動抽出)

DB検索(tenant_id)

対象企業の products から条件一致を抽出

結果で応答生成

商品名・価格・在庫に基づき回答+カード表示

スライドのアパレル(商品提案)・カフェ(予約実行)・賃貸(物件検索)は、この同じツール機構の 引数とDBを差し替えるだけで横展開できます。予約・物件検索ツールは設計済み・実装予定です。

SECTION 6 / スライド④

2社目以降は設定変更だけで増やせる工場設計

1社目の仕組みを設定変更だけで2社目以降に展開する工場設計のスライド

「枠(テンプレート)」と「値(テナント差分)」を分離しているため、2社目以降は値を入れ替えるだけで 起動します。実体は createTenantFromTemplate() で、 業界テンプレートから新テナント(設定・初期ナレッジ・FAQ)を一括生成します。

① スケーラビリティ

同一コードベース・同一DBスキーマを全テナントで共有。新規企業は行データの追加で増える設計。

② チャネル横断展開

同じ接客人格を複数チャネルへ。LINE Webhook は実装済み、Web/アプリ/Instagram は同じAPIに口を足すだけ。

SECTION 7

データモデル(DB設計)

Neon Postgres 上に6つのテーブルを持ち、tenants 以外のすべてに tenant_id を持たせて企業単位で分離しています。 1つのスキーマを全企業で共有しつつ、行レベルで完全に独立させる構成です。

tenants企業マスタ企業名・業種・ペルソナ・口調・アクセントカラー・LINE接続情報・KPI(会話数/解決率)
knowledgeナレッジ登録資料・FAQソースの索引。タイトル・種別・本文・学習ステータス(tenant_id)
faqsFAQ質問と公式回答のペア。応答時の最優先の根拠として使用(tenant_id)
conversations会話ログユーザー発話とAI応答を時系列で蓄積。運用改善の素材(tenant_id)
products商品名前・カテゴリ・肌質・タグ・価格・在庫。実行型アクションの検索対象(tenant_id)

テーブル関係(図)

tenants (id)                ← 企業マスタ(1テナント = 1行)
   │  1
   ├──< knowledge      (tenant_id)   ナレッジ(多)
   ├──< faqs           (tenant_id)   FAQ(多)
   ├──< conversations  (tenant_id)   会話ログ(多)
   └──< products       (tenant_id)   商品(多)

すべての子テーブルは tenant_id で親に紐付き、
クエリは常に WHERE tenant_id = ? でスコープされる。
SECTION 8

セキュリティとデータ分離

スライドの「各企業のデータは完全分離。他社情報は混ざらない」を、具体的に何で担保しているかを示します。

クエリレベルの tenant_id スコープ

実装済み

ナレッジ・FAQ・会話・商品の全クエリを tenant_id で絞り込み。アプリ層で対象企業の行しか取得しない。

プロンプトへの注入は対象企業のみ

実装済み

buildSystemPrompt は対象テナントのデータだけを読み込むため、他社のナレッジがAI応答に混ざらない。

LINEチャネル資格情報のテナント別保持

実装済み

Channel Secret / Access Token を企業ごとに保存し、Webhook はテナント別URLで受信・署名検証。

管理コンソールの認証強化

設計のみ(実装予定)

現状はデモ向け。本番では管理者ログインとロール制御(誰がどのテナントを編集できるか)を追加予定。

SECTION 9

運用と精度改善ループ

スライド①の「作って終わりにしない。会話ログから精度を上げ続ける運用」を支える仕組みです。 蓄積した会話ログを起点に、ナレッジとFAQを継続的に強化します。

1

蓄積

全会話を conversations に記録(tenant_id付き)

2

分析

未解決・離脱した質問、解決率の低い話題を抽出

3

強化

不足FAQ・ナレッジを追加し、トーンを調整

4

反映

次回応答に即反映。解決率KPIで効果を確認

計測指標:tenants テーブルの monthlyConversations(月間会話数)と resolutionRate(解決率)を 管理コンソールに表示。改善前後の数値で運用効果を可視化します。

SECTION 10

画像生成スキーム(gpt-image-1 / ChatGPT Images 2.0)

お預かりした OpenAI API キーを使い、gpt-image-1(ChatGPT Images 2.0)で画像を生成する仕組みです。商品写真の自動生成や、アバター接客の顔素材生成に使います。本スキームは設計提案(未実装)です。

商品画像の自動生成

写真が無い商品でも、名前・カテゴリ・説明から商品ビジュアルを生成。

アバター顔素材

ブランドに合う接客アバターの顔画像を生成(スライド①の最上位)。

画像編集・差し替え

既存画像をベースに背景や色を変更(gpt-image-1 の編集機能)。

生成フロー(図)

1

入力データ

商品属性(名前・カテゴリ・説明・タグ)+ ブランドトーン

2

プロンプト生成

属性をテンプレに流し込み画像プロンプトを構築

3

gpt-image-1 呼出

OpenAI Images API で生成(size / quality 指定)

4

Blob に保存

返却された画像を Vercel Blob に格納しURL化

5

DBに紐付け

products.imageUrl に保存しチャット/カタログで表示

↑ 縦に1→5の順で処理

実装サンプル(API ルート例)

// app/api/generate-image/route.ts
import OpenAI from "openai"
import { put } from "@vercel/blob"

const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY }) // ← お預かりしたキー

// 商品属性 → 画像プロンプトを組み立てる
function buildImagePrompt(p: { name: string; category: string; description: string }) {
  return [
    `A clean, professional product photo of "${p.name}".`,
    `Category: ${p.category}. ${p.description}`,
    "Soft studio lighting, white background, e-commerce style, high detail.",
  ].join(" ")
}

export async function POST(req: Request) {
  const { tenantId, product } = await req.json()

  // 1-3) gpt-image-1(ChatGPT Images 2.0)で生成
  const result = await openai.images.generate({
    model: "gpt-image-1",
    prompt: buildImagePrompt(product),
    size: "1024x1024",
    quality: "high",
    n: 1,
  })

  // gpt-image-1 は base64 で返る
  const b64 = result.data[0].b64_json!
  const bytes = Buffer.from(b64, "base64")

  // 4) Vercel Blob に保存(tenant 配下に分離)
  const blob = await put(`${tenantId}/products/${product.id}.png`, bytes, {
    access: "public",
    contentType: "image/png",
  })

  // 5) DB の products.imageUrl に保存(呼び出し側で実行)
  return Response.json({ imageUrl: blob.url })
}

実装には OPENAI_API_KEY の登録、openai パッケージ、 画像保存用の Blob 連携、products.imageUrl カラム追加が必要です。 ご希望なら実際に動く形まで実装します。

SECTION 11

導入の流れ(企業が使い始めるまで)

新しい企業が接客AIを公開するまでの手順です。スライド④の「設定変更だけで増やせる」を実際の操作レベルで示します。

1

業界テンプレートを選ぶ

実装済み

EC・医療・通信・飲食から選択。初期ナレッジ枠・FAQ・既定トーンが自動投入される。

2

企業情報とトーンを設定

実装済み

企業名・ペルソナ・口調(丁寧/フレンドリー/簡潔)・アクセントカラー・あいさつ文を入力。

3

自社ナレッジ・FAQを登録

実装済み

社内資料やよくある質問を追加。AIが根拠付きで答えられるようになる。

4

(商品がある場合)商品を登録

実装済み

商品名・カテゴリ・価格・在庫を登録すると、提案・在庫確認アクションが有効化。

5

プレビューで動作確認

実装済み

Webチャット(/chat/[tenant])で実際の応答とツール実行を確認。

6

チャネルに接続して公開

実装済み

LINEのChannel情報を登録し、テナント別Webhookを接続して公開。

SECTION 12

実装ロードマップ(現状と今後)

誇張を避けるため、現時点で動いているものと、設計のみで未実装のものを並べて示します。

実装済み

  • テキスト接客(ストリーミング応答)
  • テンプレート×ナレッジ×トーンの人格合成
  • 実行型アクション(商品提案・在庫確認)
  • テナント分離(全クエリ tenant_id スコープ)
  • LINE Messaging API(テナント別Webhook)
  • 管理コンソール(テナント/ナレッジ/商品の管理)
  • 会話ログ蓄積(運用改善の素材)

設計のみ(実装予定)

  • 音声対応(音声入力・音声合成)
  • アバター接客(顔・声・動画)
  • gpt-image-1 による画像生成パイプライン
  • 予約実行・物件検索アクション
  • Web/アプリ/Instagram へのチャネル拡張
  • 管理者ログインとロール制御
SECTION 13

技術スタック

フロントエンドNext.js 16 App Router / React / Tailwind CSS / shadcn/ui
AI / チャットAI SDK(streamText・tool calling)/ AI Gateway 経由の GPT
画像生成OpenAI gpt-image-1(ChatGPT Images 2.0)※設計提案
データベースNeon Postgres / Drizzle ORM(全テーブル tenant_id スコープ)
チャネル連携LINE Messaging API(テナント別 Webhook)
ストレージVercel Blob(画像・アバター素材の保存先)