売った直後の「どこで開く?」を残さない。AIが作るFAQを3項目で止める見本

購入後に届いたPDFを、どこから開けばよいのか。困るのは商品が壊れたときだけではありません。ダウンロード場所、使える端末、質問先のどれかが抜けるだけで、購入者は次の操作を決められなくなります。
AIにFAQの下書きを頼むと、質問と回答の組はすぐ増えます。ただ、文として自然でも、購入直後に必要な案内がそろうとは限りません。最初の3分の入口。そこで架空のデジタル商品を使い、FAQを3つの観点で機械的に止める見本を作りました。
10月27日の記事「AIに渡す商品企画を「悩み1件」へ絞る」では、AIへ渡す商品企画を悩み1件に絞りました。今回は、その商品を受け取った人が最初に迷う場所へ進みます。実在の商品、購入者、販売実績は使っていません。AIのAPI呼び出しもしていない合成見本です。
回答があるのに、購入者は進めなかった
最初のFAQには「内容に質問があるときは、商品の説明ページをご確認ください」と書きました。答えの形にはなっています。しかし、説明ページへ戻っても質問は解決しません。連絡方法が書かれていないからです。
Etsyのデジタル商品ヘルプでも、購入者は購入履歴のダウンロード操作、ファイル形式、必要なソフトを確認するよう案内されています。販売者に連絡する入口も別にあります。購入後の案内は、商品の中身だけでは完結しません。Etsyの案内を読むと、その分かれ目が見えます。
AIの出力を使うときは、自然な文章を採用する前に、必要な情報を項目へ戻します。Structured OutputsはJSON Schemaに従う形を返せますが、必須項目を決めない限り、購入者が困らない内容までは保証しません。OpenAIのStructured Outputsも、必要なキーと列挙値をスキーマで定義する考え方を示しています。
今回の小さな検査
検査対象はFAQの質問と回答を並べたJSONです。次の3項目のどれかに触れていなければ、終了コード1で止めます。
| 項目 | 受け入れる語 | 購入者が決めること |
|---|---|---|
| 受け取り | ダウンロード、リンク | どこでファイルを取るか |
| 利用環境 | PDF、iPhone、Android、PC | どの端末で開けるか |
| 問い合わせ | 連絡、メール、フォーム | 困ったときに誰へ送るか |
ここで見るのは商品の正しさではありません。初回利用に必要な入口だけ。たとえばPDFと書いてあっても、特定のアプリでしか開けない商品なら、実際の要件を別途確認して語を変えます。
用語
| 用語 | この見本での意味 |
|---|---|
| FAQ | 購入前後に起きやすい質問と回答の組です。 |
| JSON | 質問と回答を機械で読みやすく保存する書式です。 |
| 検査 | 必要な案内があるかを決めた規則で確かめる処理です。 |
| 終了コード | コマンドの成功と失敗を示す数値です。0は成功、1は不足を表します。 |
合成FAQを1回止める
空のディレクトリにfaq.jsonとcheck_faq.pyを保存します。最初のfaq.jsonは、問い合わせの回答だけをわざと不足させました。
[
{
"question": "購入後、どこからファイルを受け取れますか?",
"answer": "購入完了画面のリンクからダウンロードできます。"
},
{
"question": "スマートフォンだけで使えますか?",
"answer": "PDFを開いて使えます。"
},
{
"question": "内容に質問があるときはどうすればよいですか?",
"answer": "商品の説明ページをご確認ください。"
}
]
check_faq.pyには次を書きます。辞書のキーが検査項目です。各項目の語が質問と回答をつないだ本文に1つもなければ、不足として集めます。
import json
from pathlib import Path
required = {
"受け取り": ("ダウンロード", "リンク"),
"利用環境": ("PDF", "iPhone", "Android", "PC"),
"問い合わせ": ("連絡", "メール", "フォーム"),
}
faqs = json.loads(Path("faq.json").read_text())
text = "\n".join(faq["question"] + "\n" + faq["answer"] for faq in faqs)
missing = [label for label, words in required.items() if not any(word in text for word in words)]
if missing:
print("不足: " + "、".join(missing))
raise SystemExit(1)
print("確認済み: 受け取り、利用環境、問い合わせ")
この見本を作った環境のPythonを確認します。
python3 --version
Python 3.13.5
続けて検査します。問い合わせ先が無いので、意図どおり止まりました。
python3 check_faq.py
不足: 問い合わせ
このときの終了コードは1でした。説明ページへの誘導も案内の一部に見えます。しかし、質問を送る先が決まらないなら、購入者の次の行動は決まりません。答えの形より、次の操作。
回答を直して、もう一度だけ通す
3つ目の回答を、次の1文へ差し替えます。
"answer": "購入時に届くメールの返信先へご連絡ください。"
もう一度、同じコマンドを実行します。
python3 check_faq.py
確認済み: 受け取り、利用環境、問い合わせ
これで問い合わせの入口は入りました。ただし、この検査は「メール」という語を見ただけです。実際に返信を受ける運用があるか、購入時メールに返信先が載るかまでは確かめません。その確認は、販売ページと配信メールを用意した段階で別に行います。
AIへ渡す前に、出力の枠を先に置く
AIへFAQを依頼するときも、自由文だけで頼まず、質問、回答、対象端末、問い合わせ先のように項目を分けます。返答がJSONでも、今回の検査を通す前提なら、どの情報を後から確認すべきかが残ります。
商品仕様
↓
AIがFAQの下書きを作る
↓
FAQをJSONで保存する
↓
受け取り・利用環境・問い合わせを検査する
↓
不足を直して販売ページと配信メールへ反映する
「購入後に迷わない」を1つの指示文に押し込むより、必要な入口を名前で持つ方が直しやすいです。項目は増やしすぎません。販売する形式がPDFだけなら、3項目から始めれば十分です。
次に試すなら、実際の販売方法に合わせて検査語を変えます。ZIP形式なら解凍方法、Canvaテンプレートなら編集権限、動画なら再生環境を足します。増やす理由は、一般的に見栄えがよいからではありません。購入後に詰まる場所が変わるからです。


