PR本記事にはプロモーション(アフィリエイトリンク)が含まれる場合があります。
CONTENTS目次
「業種特化のAIを作るなら、全部AIに自動生成させたほうがラクで速いのでは?」——最初はそう思っていました。でも実際に手を動かしてみると、品質を安定させるには逆でした。結論から言うと、骨格になる業種マスタは手で書き切り、そこに無い業種だけAIに自動生成させる「二段構え」のほうが、生成結果のブレが少なくて済みました。この記事では、プログラミング未経験の会社員の私が、業種が2つしか選べなかったAIブログ商材を24業種+カスタムまで汎用化したときに、どう作ったか・どこでつまずいたかを正直に記録します。
この記事でわかること
- 業種特化AIは「手書きマスタ+足りない分だけAI生成」の二段構えだと品質が安定しやすい
- カスタム業種のプロファイル自動生成には、スキーマ検証と1回だけ再生成の仕組みを入れた
- URL読み取り機能にはSSRFとプロンプトインジェクションの2つの対策が要る
きっかけ:業種が2つしかないと営業先に合わなかった
もともと使っていたAIブログ商材は、業種が「不用品回収」と「便利屋」の2つに固定されていました。これはこれで便利なのですが、実際に営業してみると、提案先はこの2業種以外のほうが圧倒的に多かったんです。「うちは飲食なんだけど」「整体なんだけど」と言われるたびに、合わないと感じていました。
そこで、どんな業種でも使えるように汎用化しようと決めました。ここで言う「業種特化 AI」とは、業種ごとに適したテーマや語彙で記事を生成してくれるAIのことです。ざっくり全業種に対応させるのは簡単ですが、そうすると今度は「どの業種でも同じような当たり障りのない記事」になってしまう。特化と汎用を両立させるのが、この作業のいちばんの悩みどころでした。
最初に考えたのは「業種名を入れたら、あとは全部AIに作らせればいいのでは」という発想でした。ラクそうに見えますが、結論を先に言うと、この丸投げ方式は品質が安定しませんでした。その理由と、代わりに取った方法を順に書いていきます。
まず手で書き切った「業種マスタ」6カテゴリ×24業種
最終的に採った方針は、よく使う業種は自分の手でしっかり定義しておく、というものでした。これが業種マスタです。業種マスタとは、各業種ごとに「どんな記事をどれくらい書くか」の設計図のようなものだと思ってください。
私は6カテゴリ×24業種まで、手で書き切りました。各業種について、以下の下地を用意しています。
- ノウハウ記事:8本以上
- 地域情報:5本以上
- 自社紹介:5本以上
- Q&A:8本以上
- 季節ネタ:12ヶ月分
これはなかなか骨の折れる作業でした。でも、ここを人の手で固めておいたおかげで、記事の配合比率や方向性がブレなくなりました。
もう1つ大事にしたのが、医療・健康系への配慮です。24業種のうち医療・健康系の5業種には安全注記を付け、効果を断定する表現や医療広告的な表現を抑えるよう、生成プロンプトに注入するようにしました。プロンプトに注入するというのは、AIへの指示文の中に「こういう表現は避けて」というルールをあらかじめ組み込んでおくことです。健康に関わる分野は言い回しひとつでトラブルになり得るので、ここは人の判断で先回りしておくべきだと感じました。
💡 ポイント: 骨格(記事タイプの配合や禁止表現)は人が決め、中身の文章をAIに書かせる。この役割分担が品質の安定につながりました。
足りない業種は「カスタム」でプロファイル自動生成
とはいえ、24業種で世の中のすべてをカバーできるわけがありません。そこで、マスタに無い業種のために「カスタム」を用意しました。業種名と説明を入れると、AIがその業種のプロファイル(業種の設計図そのもの)を自動生成する仕組みです。
ここがこの記事の肝で、「全部AI」ではなく「足りない分だけAI」にしたポイントです。ただ、AIに自動生成させるときに怖いのは、形式が崩れたり項目が抜けたりすることです。そこで、生成後に必ずチェックを通すようにしました。
- AIが業種プロファイルを生成する
- スキーマ検証にかける(決めた形式どおりか機械でチェック)
- 通らなければ1回だけ再生成する
- それでもダメならエラーにして止める
スキーマ検証とは「必要な項目が、決めた形で揃っているか」を機械的に確認する仕組みのことです。無限に作り直させるとコストも時間もかかるので、再生成は1回だけと割り切りました。
実際にカスタムが機能するかは「キッチンカー・移動販売」で試してみて、検証を通過することを確認できました。さらに、24業種すべてについても機械的にチェックしています。
- 記事タイプの配合比率が全業種で一致しているか
- テーマの重複がないか
- 他業種の語彙が混入していないか(例:整体の記事に不用品回収の言葉が混ざっていないか)
⚠️ 注意: AIに自動生成させた結果は「たぶん合っているだろう」で信用しないこと。機械で検証して、通らなければ止める仕組みをセットにして初めて安心して使えます。
URLを読ませて自動入力|SSRFとプロンプトインジェクション対策
もう一歩進めて、企業のホームページのURLを入れると、AIがその内容を読み取って、社名・所在地・エリア・サービス・強み・実績・業種推定までを自動で埋めてくれる機能も付けました。入力の手間がかなり減るので便利なのですが、外部のサイトを読みに行く機能は、そのままだとリスクがあります。
そこで対策を2つ入れました。
- SSRF対策:SSRFは、ざっくり言うと「外部URLのふりをして、内部のサーバーにアクセスされてしまう」攻撃です。対策として、名前解決(URLをIPアドレスに変換すること)をした後のIPを検査し、リダイレクト(別URLへの転送)のたびに再検証し、内部向けのIPは拒否するようにしました。
- プロンプトインジェクション対策:プロンプトインジェクションは、読み込んだページの中に「AIへの悪意ある指示」が仕込まれていて、AIが乗っ取られてしまうことです。対策として、取得したページは「信頼できないデータ」として扱い、ページに書かれていない項目は推測せず空で返させるようにしました。
この「書いていないことは空で返す」という設計は地味ですが大事でした。AIは親切心で勝手に埋めようとするので、そこを抑えておかないと、事実でない情報がしれっと混ざります。外部サイトを読ませる機能を作るなら、便利さと同じ量だけ防御も用意する、というのが実感です。このあたりの安全対策の考え方は、私の運営者紹介(/about)で書いている「手探りで一緒に試す」姿勢とも通じます。
本番で1回失敗した:タイムアウトとモデル分離で解決
正直に書くと、本番で1回失敗しました。URLを読み取って情報を抽出する処理が、制限時間(タイムアウト)を超えてしまったんです。処理が終わる前に打ち切られてしまい、うまく動きませんでした。
原因は、1つのモデルで「ページを読んで抽出する」重い処理をやらせていたことでした。そこで次の2つで解決しました。
- 抽出専用のモデルを、軽量なものに分けた
- タイムアウト(処理の制限時間)を延ばした
AIの作業には「じっくり考えさせたい処理」と「速くさばきたい処理」があり、全部を1つの賢いモデルに任せると遅くなりがちだと学びました。抽出のように「決まった項目を取り出すだけ」の作業は、軽いモデルで十分速いことが多いです。失敗して初めて、処理ごとにモデルを使い分ける発想にたどり着けました。
やってみて得た結論:手書きマスタ+足りない分だけAI
一連の作業を通して得た結論はシンプルです。AIに業種特化させるときは、全部AIに作らせるより「手で書いたマスタ+足りない分だけAI生成」のほうが品質が安定する、ということでした。
- 手書きマスタ:よく使う業種を人が定義し、配合比率や禁止表現を固定する → ブレない
- AI自動生成:マスタに無い業種だけカスタムで補い、スキーマ検証で品質を担保する → カバー範囲が広がる
この二段構えにしたことで、特化の強さ(業種ごとの的確さ)と汎用の広さ(どの業種でも対応)を、なんとか両立できました。最初に憧れた「全部AI任せ」は、結果的に選びませんでしたが、それも試してみたからこそ見えた答えです。
まとめ
業種が2つしか選べなかったAIブログ商材を、24業種+カスタムまで汎用化した実録でした。やってみて分かったのは、全部AIに丸投げするより「手で書いた業種マスタ+足りない分だけAI生成」という二段構えのほうが品質が安定するということです。よく使う業種は人が配合比率や禁止表現まで固定し、マスタに無い業種だけカスタムでプロファイル自動生成し、スキーマ検証と1回だけの再生成で品質を守る。URL読み取りにはSSRFとプロンプトインジェクションの対策を入れ、本番ではタイムアウト超過という失敗を、抽出専用の軽量モデル分離とタイムアウト延長で乗り越えました。これが唯一の正解とは言いませんが、業種特化AIを作るときの一つの参考になればうれしいです。
FAQ
よくある質問
Qなぜ全部AIに自動生成させなかったのですか?
全部AI任せにすると、記事タイプの配合や禁止表現がブレやすく、品質が安定しませんでした。そこで、よく使う業種は人の手で業種マスタとして定義し、マスタに無い業種だけAIでプロファイル自動生成する二段構えにしました。
Qカスタム業種のプロファイル自動生成で品質はどう担保しましたか?
生成後にスキーマ検証(決めた形式どおりかの機械チェック)をかけ、通らなければ1回だけ再生成し、それでもダメならエラーにして止めるようにしました。実際に「キッチンカー・移動販売」で生成して通過を確認しています。
QURLを読ませる機能にはどんな対策が必要ですか?
2つ入れました。1つはSSRF対策で、名前解決後のIPを検査しリダイレクトのたびに再検証し内部IPを拒否します。もう1つはプロンプトインジェクション対策で、取得ページは信頼できないデータとして扱い、記載のない項目は推測せず空で返させます。