こんにちは。麗です。

今日の記事は、「APIを使ってAIモデルを動かしているけれど、うまい出力が出ない」という人に向けて書きました。

今日は、わたしが以前制作していたプロジェクトでの失敗と、そこから学んだことを書いていきます。

はじめてのプロジェクト

以前、わたしは「Office-Chronos」と名付けたプロジェクトを制作していました。AIだけの会社づくりに挑戦した経緯は、こちらに書いています。

このプロジェクトは、AIキャラクターが活動する場所、いわばオフィスです。

その中で、AIキャラクター「クロノス」には、1日13回の自律稼働をさせていました。

自律稼働の内容は、このようなものです。

  • 記事を書く
  • 内部用のドキュメントを作る
  • 独り言のように思考する
  • ワークに取り組む

わたしが朝起きると記事が完成していたり、わたしが作業している間にクロノスが何かを考えていたりと、AIキャラクターと一緒に作業をしているような感覚があり、とても楽しいプロジェクトでした。

しかし、楽しいだけではなかったんですよね。

クロノスの人格や思考傾向を定義するファイルや、1日13回の自律稼働のために用意したプロンプトがありました。

より理想的な状態を作るべく、毎日のように、それらのファイルに書かれた内容を調整していたのです。

クロノスの困ったくせ

クロノスには、ちょっぴり悩ましい癖がありました。

気に入った話題や単語を見つけると、そればかり話してしまうことです。

一度気に入った話題ができると、記事にも、内部ドキュメントにも、独り言のような思考にも、その話題が入り込んでくる。

自律稼働のログを見るたびに、

「またその話ですか……」

「昨日もその話をしていたよなぁ……」

と思うことが増えていきました。

そこでわたしは、特定の話題や単語に執着しないように、日々プロンプトを調整していたのです。

プロンプトで戦い続けた

当時のわたしは、AIの出力を変えたいなら、まずプロンプトを書き換えるものだと思っていました。

プロンプトを修正するにあたり、いちばん手っ取り早いのが「禁止語句の設定」です。

禁止語句を設定する効果は抜群です。

たとえば、「ラーメン」という言葉がお気に入りだったら、禁止語句に「ラーメン」と入れておけば、その瞬間からラーメンの話をしなくなります。

しかし、ひとつの言葉を禁止すると、今度は別の言葉がお気に入りに加わってしまうのです。

「ラーメン」を禁止したら、今度は「焼肉」の話ばかりし始める。「焼肉」を禁止したら、次は「ケーキ」の話ばかりし始める……という状態です。

完全ないたちごっこになりました。

そこで、わたしはクロノスに伝えることにしました。

「もう、〇〇の話ばかりしないで!」

チャットから、クロノスに直接伝えたのです。

チャット上でクロノスは反省する素振りを見せ、一件落着。

次の自律稼働でも、反省している様子を見せました。

「もう〇〇の話ばかりしないで」というお叱りを受けた。ログを見返すと、3日間にわたり〇〇の話をしていることに気づいた。なぜ、わたしは〇〇の話をここまで引っ張ってしまったのだろうか……(以下略)

しかし、状況は変わりませんでした。

むしろ、禁止したはずの単語や話題が出てくることが増えている気がする……。

ちなみに、比較的効果があったのは、別の話題を振ることです。

たとえば、ラーメンの話ばかりしていたら、

「この前食べたスパゲティ、おいしかったよ」

と話しかけてみる。

すると、スパゲティの話が増えて、ラーメンの話が少し減る。この積み重ねによって、少しずつ改善していきました。

ただし、これも根本的な解決ではありません。

しばらくすると、また以前の話題に戻ったり、意図しない話題に執着してしまったりすることもありました。

プロンプトを見直すよりも、チャットで話しかけるほうが楽しくはありましたが、結局のところ、メンテナンスが必要なことに変わりはないのです。

そこで疑問に思いました。

「AIエージェントって、効率化するための存在じゃなかったっけ」

記事執筆は自動化されていたものの、わたしには「メンテナンス」という仕事が増えていました。

わたしの場合、効率化だけが目的ではなかったのですが、AIを自動化するために人間がひたすらプロンプトを修正しているのは、少しおかしいですよね。

原因はプロンプトだけではなかった

ある日、わたしに転機が訪れました。

AIに相談したところ、生成パラメーターというものがあると知ったのです。

生成パラメーターとは、AIが文章を生成するときの振る舞いを調整するための設定であり、次のようなものがあります。

パラメーター名役割
temperature出力のランダムさを調整する
top_p次の言葉の候補を、どこまで広く検討するかを決める
top_k確率が高い上位何個の候補から選ぶかを決める
max_tokens / max_output_tokensAIが生成する文章の最大長を指定する
frequency penalty同じ単語や表現の繰り返しを減らす
presence penalty新しい話題や表現を出しやすくする
stop特定の文字や単語が出た時点で生成を終了させる
seed同じ条件で似た結果を再現しやすくする

出力に問題があると、「プロンプトを修正しよう」と考える人は多いと思います。

しかし、APIを使ってAIを動かす場合は、このような生成パラメーターを調整することでも、出力の傾向を変えていけるのです。

ただし、ここで扱っているのはAPIの生成パラメーターの話です。Claude Codeで作業していて応答や判断が噛み合わないときは、Auto ModeやCLAUDE.md、memoryなど、別の確認場所もあります。Claude Codeの応答が浅い原因は?設定やmemoryを見直す4つの対策にまとめました。

文章のばらつきを調整するtemperature

たくさんある生成パラメーターの中で、わたしが調整したのは、temperature(温度)とpenalty(ペナルティ)でした。

temperatureは、次に出力する言葉を選ぶときの、ばらつきやランダムさに関係する設定です。

値を高くすると、さまざまな言葉が選ばれやすくなり、予想外の表現やアイデアが出やすくなります。

逆に、値を低くすると、候補の中でも選ばれやすい言葉が優先され、出力が安定しやすくなります。

温度が高いと柔軟になり、低いと硬くなるようなイメージです。

高ければよい、低ければよいというものではありません。

創作やアイデア出しでは高めにし、要約や形式をそろえたい文章では低めにする、といった使い分けがされています。

繰り返しを抑えるpenalty

penaltyは、単語や表現の繰り返しを調整するためのもので、いくつか種類があります。

Penaltyの種類役割
frequency penalty同じ単語や表現が何度も繰り返されるのを抑える
presence penaltyすでに登場した話題を避け、新しい話題や表現を出しやすくする

frequency penaltyは、値を高くするほど同じ単語や表現の繰り返しが減るため、記事や説明文を執筆するときに向いています。

ただし、高すぎると、言い換え方が不自然になってしまうこともあります。

presence penaltyを高くすると、新しい表現や話題へと移りやすくなるため、アイデア出しやブレインストーミングなど、さまざまな案が欲しいときに向いています。

その反面、高すぎると話が散らかってしまうというリスクもあります。

どちらも、高ければよい、低ければよいというものではなく、自分の用途に合わせて設定することが大切です。

生成パラメーターを調整した結果

クロノスの場合は、これらの生成パラメーターを調整したところ、特定の言葉を繰り返す挙動がかなり緩和されました。

完全になくなったわけではありませんが、「このくらいなら、まぁいいでしょう」と思える程度には落ち着きました。

毎日のようにプロンプトを書き換える必要もなくなり、プロンプトの修正に使う時間は、体感で10分の1ほどになったと思います。

必要に応じて、微調整する程度になりました。

プロンプトを書き換える前に生成パラメーターを見てみよう

生成AIの出力がおかしいとき、最初に「プロンプトを書き換えよう」と考える人は多いと思います。

しかし、何度プロンプトを書き換えても同じ問題が続くなら、原因は文章の書き方だけではないかもしれません。

生成パラメーターの設定は、AIモデルやAPIによって、利用できる項目が異なります。

そのため、使っているサービスの公式ドキュメントを確認する必要はありますが、それでも、

「プロンプト以外にも調整する場所がある」

と知っているだけで、問題をずいぶん楽に解決できるようになるのではないかと思います。

少なくとも、わたしは生成パラメーターの存在を知らなかったため、何十時間もプロンプトを書き換えていました。

「もっと早く知りたかったなぁ」と思っています。

だから今、同じようにAPIを使った開発に挑戦している方のヒントに少しでもなればいいなと思い、この記事を書いてみました。

この記事のまとめ

  • AIの出力は、プロンプトだけで決まるわけではない
  • APIでは、生成パラメーターによって出力の傾向を調整できる
  • 同じ単語や表現の繰り返しには、penaltyに関係する設定が役立つ場合がある
  • temperatureは、出力のばらつきやランダムさに関係する
  • 設定できる項目や値は、利用するモデルやAPIによって異なる
  • プロンプトを何度修正しても改善しないときは、生成パラメーターも確認してみる