ChatGPT API ハック – EC営業AIの構築 – プロンプトと商品情報の連携

AI

フェーズ1:プロンプトと商品情報の連携

  • 数件の商品(3〜5点)をJSONで用意
  • system + user に商品情報を埋め込んで 呼び出し
  • 「人気・おすすめ」などの表現のトーンを制御
  • レスポンスフォーマットをJSONに制御

Shopifyから商品情報を取得

store=
access_token=

curl -X GET "https://${store}.myshopify.com/admin/api/2025-01/products.json" \
-H "X-Shopify-Access-Token: ${access_token}" > products.json

必要な商品情報のみ取得

import json

with open("products.json", "r", encoding="utf-8") as f:
    data = json.load(f)

simplified_products = []
for p in data["products"]:
    simplified = {
        "id": p["id"],
        "title": p["title"],
        "body_html": p["body_html"],
        "price": p["variants"][0]["price"] if p["variants"] else None,
        "sku": p["variants"][0]["sku"] if p["variants"] else None,
        "image": p["image"]["src"] if p.get("image") else None,
        "tags": p.get("tags", ""),
    }
    simplified_products.append(simplified)

with open("simplified_products.json", "w", encoding="utf-8") as f:
    json.dump(simplified_products, f, indent=2, ensure_ascii=False)

商品情報 json

[
  {
    "id": 8580179165338,
    "title": "Aftershave - Bump Control 65ml Solution 2 packs",
    "price": "950.00",
    "tags": "Skincare",
    "body_html": "<p><meta charset=\"utf-8\">Tired of razor bumps and irritation? <b>BUMP PATROL</b> is the aftershave treatment you've been looking for. It soothes and hydrates your skin, helping to reduce redness and leave it feeling calm and smooth after every shave.</p>"
  },
  {
    "id": 8580179263642,
    "title": "Benzoyl Peroxide - Pernex 20mg Cream",
    "price": "970.00",
    "tags": "Skincare",
    "body_html": "<p><strong data-start=\"72\" data-end=\"111\">Struggling with persistent pimples?</strong> Pernex 20mg Cream contains Benzoyl Peroxide, a <strong data-start=\"159\" data-end=\"198\">dermatologist-recommended treatment</strong> for acne in <strong data-start=\"211\" data-end=\"233\">both men and women</strong>. It works by killing acne-causing bacteria, reducing inflammation, and clearing clogged pores,helping you achieve clearer, healthier-looking skin.</p>"
  }
]

ChatGPTのchat/completion API 呼び出し

role:userのcontentに商品情報を追加して実行

from openai import OpenAI
import json

openai_api_key = "xxx"

client = OpenAI(api_key=openai_api_key)

with open("simplified_products.json", "r", encoding="utf-8") as f:
    products = json.load(f)

# 商品情報をテキスト化
product_text = "\n".join([
    f"{p['title']}(KSh {p['price']})[{p['tags']}] {p['body_html']}"
    for p in products
])

# ChatGPTに送信
response = client.chat.completions.create(
    model="gpt-4o",
    temperature=0.7,
    messages=[
        {
            "role": "system",
            "content": (
                "あなたは薬局ECの営業アシスタントです。\n"
                "以下のルールを守って回答してください:\n"
                "- 商品情報は渡されたデータのみを元に説明する。\n"
                "- 人気・おすすめなどの主観的表現は禁止。\n"
                "- 効果効能は誇張せず、事実ベースで説明する。\n"
                "- 不明な場合は『情報がありません』と答える。"
            )
        },
        {
            "role": "user",
            "content": (
                f"以下の商品データを参照して質問に答えてください。\n\n"
                f"{product_text}\n\n"
                "質問: Benzoyl Peroxideはどんな肌に合いますか?"
            )
        }
    ]
)

# 結果出力
print(response.choices[0].message.content)

商品情報を加えたChatGPT応答

Benzoyl Peroxideは、特にニキビに悩む肌に適しています。
Pernex 20mg Creamに含まれるこの成分は、ニキビの原因となる細菌を殺し、
炎症を軽減し、詰まった毛穴をクリアにすることで、よりクリアで健康的な肌を目指すのに役立ちます。

モデル内部の判断プロセス

ユーザー質問: 「Benzoyl Peroxideはどんな肌に合う?」
↓
1. この単語を過去学習した文脈から特定(一般知識)
2. 関連文脈の信頼度スコアを参照(例:医療情報系サイトなど)
3. systemプロンプトのルールに照らして「誇張せず、事実ベースで」説明生成
↓
回答: 「脂性肌やニキビができやすい肌に使用されます。敏感肌は注意。」

つまり「学習時に最も統計的に信頼された説明」を“事実”として再構成しているんです。

ChatGPTにおける「事実」とは何か

ChatGPTの“事実”の概念は、次の3つが混ざったものです:

種類どう扱われるか
① 学習済み知識(factual prior)「水は100℃で沸騰する」「Benzoyl Peroxideはニキビ治療成分」モデル内部の知識として“ほぼ確定的な事実”として保持
② 言語的合意(linguistic consensus)「日本の首都は東京」「Googleは検索エンジン企業」たくさんの信頼できる文書で同じ主張がある=事実扱い
③ 入力文脈における事実(prompt factuality)あなたがプロンプトで与えた「この商品はKSh 950」モデルは“ユーザー入力を信頼する”前提で事実とみなす

人気・おすすめのためのトーンを制御する

「人気」「おすすめ」「効果的」「売れている」などの主観的表現を出させない。代わりに事実ベースや中立的な説明で返すよう誘導する。

  • ChatGPTは“禁止語”よりも“置き換え”の指示を理解しやすいです。
  • ChatGPTは“出力スタイル”もトーンコントロールできます。
            "role": "system",
            "content": (
                "あなたは薬局ECサイトの営業アシスタントです。\n"
                "次のルールを守って回答してください:\n"
                "1. 商品情報は渡されたデータのみを基に説明すること。\n"
                "2. 「人気」「おすすめ」「効果的」「話題」「売れている」「ベストセラー」などの主観的・誇張的表現は禁止します。\n"
                "3. 必要な場合は以下のように言い換えてください:\n"
                "   - 「おすすめ」→「このような用途で使用されます」\n"
                "   - 「人気」→「多くの方に使用されています」\n"
                "   - 「効果的」→「この成分は〇〇に使用されます」\n"
                "4. 効果効能は誇張せず、事実ベースで説明すること。\n"
                "5. 不明な場合は『情報がありません』と答えること。\n"
                "6. トーンは中立的で、医療従事者が患者に説明するような丁寧な口調で答えてください。"
            )

トーンを制御したChatGPT応答

Benzoyl Peroxideを含む「Pernex 20mg Cream」は、にきびの治療に使用されます。
多くの方がにきび、特に持続的な吹き出物に対してこの成分を使用しています。
Benzoyl Peroxideは、にきびの原因となる細菌を殺すことで、
炎症を抑え、詰まった毛穴をクリアにするのに役立ちます。
しかし、使用する前に、特に敏感肌の方は、医師や皮膚科医に相談することをお勧めします。

レスポンスフォーマットをjsonにする

            "role": "system",
            "content": (
                "あなたは薬局ECサイトの営業アシスタントです。\n"
                "次のルールを守って回答してください:\n"
                "1. 商品情報は渡されたデータのみを基に説明すること。\n"
                "2. 「人気」「おすすめ」「効果的」「売れている」などの主観的表現は禁止します。\n"
                "3. 効果効能は誇張せず、事実ベースで説明すること。\n"
                "4. 不明な場合は『情報がありません』と答えること。\n"
                "5. 回答は必ずJSON形式で返してください。構造は以下に従ってください:\n"
                "{\n"
                "  \"product_name\": string,\n"
                "  \"suitable_skin\": string,\n"
                "  \"precaution\": string\n"
                "}\n"
                "6. JSON以外の文章は出力しないこと。"
            )

jsonでのChatGPT応答

```json
{
  "product_name": "Benzoyl Peroxide - Pernex 20mg Cream",
  "suitable_skin": "Acne-prone skin",
  "precaution": "May cause dryness or irritation; use with caution on sensitive skin."
}
```

プロンプトエンジニアリングの基本

  • 理想は、明確な意図、明確な構造(リスト、条件、禁止事項)、整理された長い文章
  • 役割指定による生成のトーンと文脈の固定
  • タスク明示 による指示の範囲の限定
  • フォーマット指定による構造的出力の安定
  • 制約リストによる品質制御
  • 例示による出力形式の模倣
  • 最初に「役割」と「目的」をはっきり書く
  • ルール(禁止・条件)は中盤で明示的に箇条書きにする
  • 出力形式や最終指示は一番最後に置く

フェーズ1で見えた主な課題点

① トークンコストの増加

  • 毎回、全商品のJSONをプロンプトに含める必要がある。
  • 商品が10件→100件になると、1リクエストで数千トークン消費。
  • 結果、遅く・高コストになる。

フェーズ2でEmbedding検索を導入すれば、
 「質問に関連する商品3件だけを送る」にできる。
 = 速度・コスト・精度のバランス最適化。

② 推薦(リコメンド)の曖昧さ

  • ChatGPTは商品データを“ただ読む”だけで、どれを勧めるかの判断基準がない。
  • 「あなたに合う商品は?」という質問に対して、関連度・人気度・症状などを考慮できない。

フェーズ2〜3での改善方向

  • ベクトル検索によって “意味的に近い商品” を抽出(RAG)。
  • 使用ログや購入履歴を統計的に利用(フェーズ3でfunctionやDB連携)。
  • 「〇〇な人にはこの商品を紹介」という条件ロジックを追加可能。

③ 出力の安定性・トーンのばらつき

  • 同じ質問でも、回答のトーン・長さ・表現が少しずつ異なる。
  • “営業っぽく話す”や“丁寧に説明する”などの指示を安定させにくい。

改善策

  • systemプロンプトでロール固定(例:「薬局ECの営業AI」)。
  • **few-shot(例示)**を導入して、望む回答スタイルを学習させる。
  • フェーズ3でトーン設定をユーザー属性に合わせて可変(例:GenZ向け、医療者向けなど)。

④ 内部知識への依存

  • 商品データが少ないと、ChatGPTは自分の「一般知識」で答えてしまう。
  • 医薬品や成分名はChatGPT内部に知識があるため、社内データの“事実”が上書きされるリスクがある。

改善方向

  • フェーズ2で「提供データのみを使用」と制約+RAG構成で商品DBを“事実源”に。
  • フェーズ3で「根拠提示(source)付き回答」を出す(例:「情報元:KQMed商品DB」)。

⑤ ログ・分析・再現性がない

  • どんな質問で何が返ったかを保存していない。
  • 評価(満足度・返答品質)が可視化できない。

改善方向

  • フェーズ3で usage_logsconversation_logs をFirestoreなどに保存。
  • 再生成(再評価)ループを構築 → 回答品質を学習的に改善できる。

関連記事

カテゴリー

アーカイブ

Lang »