AIが書いたコードを読む
AIにコードを書かせると、たいてい動くものが出てきます。困るのは動かないときではなく、 動いてしまうのに間違っているときのほうです。ここは、出てきたコードを 「用途が合っているか・欠陥はないか・無駄がないか」で読むための索引です。 書けるようになる記事ではなく、読んで気づけるようになる記事を置いています。
関数・構文から引く
-
api_baseモデル名の打ち間違いが「接続エラー」で返ってきます ── LiteLLM と Ollama を読む -
client.chat.completions.createストリーミング応答を読む ── AIが書いた「動くけど止まらない」チャット実装 -
close()ストリーミング応答を読む ── AIが書いた「動くけど止まらない」チャット実装 -
finish_reasontemperature を下げても答えは合いません ── LLM のつまみを読む -
json_objectJSON で返ってきたから正しい、ではありません ── 構造化出力と Pydantic を読む -
litellm.completionモデル名の打ち間違いが「接続エラー」で返ってきます ── LiteLLM と Ollama を読む -
max_tokenstemperature を下げても答えは合いません ── LLM のつまみを読む -
model_json_schema()JSON で返ってきたから正しい、ではありません ── 構造化出力と Pydantic を読む -
model_validate()JSON で返ってきたから正しい、ではありません ── 構造化出力と Pydantic を読む -
num_retriesモデル名の打ち間違いが「接続エラー」で返ってきます ── LiteLLM と Ollama を読む -
ollama_chat/モデル名の打ち間違いが「接続エラー」で返ってきます ── LiteLLM と Ollama を読む -
ollama/モデル名の打ち間違いが「接続エラー」で返ってきます ── LiteLLM と Ollama を読む -
response_formatJSON で返ってきたから正しい、ではありません ── 構造化出力と Pydantic を読む -
role=toolwhile True の中でAIが喋り続けます ── ツール実行ループを読む -
stream_optionsストリーミング応答を読む ── AIが書いた「動くけど止まらない」チャット実装 -
stream=Trueストリーミング応答を読む ── AIが書いた「動くけど止まらない」チャット実装 -
temperaturetemperature を下げても答えは合いません ── LLM のつまみを読む -
timeoutストリーミング応答を読む ── AIが書いた「動くけど止まらない」チャット実装 -
tool_callswhile True の中でAIが喋り続けます ── ツール実行ループを読む -
tool_choicewhile True の中でAIが喋り続けます ── ツール実行ループを読む -
toolswhile True の中でAIが喋り続けます ── ツール実行ループを読む -
top_ptemperature を下げても答えは合いません ── LLM のつまみを読む -
ValidationErrorJSON で返ってきたから正しい、ではありません ── 構造化出力と Pydantic を読む
LLM SDK
- ストリーミング応答を読む ── AIが書いた「動くけど止まらない」チャット実装 生成AIにチャット呼び出しを書かせると、たいていストリーミングのタイムアウトと後始末が抜けた形で出てきます。手元では動くのに本番で固まる実装を、どこを見れば公開前に気づけるかで読みます。timeout=5 秒の設定が 60.1 秒走ってしまう様子を実測で並べました。
監査ポイント timeout はチャンクの間隔にしか効かず、ストリーム全体の長さを止めない(実測: 5秒設定で60.1秒完走) / 途中で切れたストリームを素朴に最初からやり直すと、実用ぶんの1.5倍近くを払う / 読み捨てたストリームを close していないと、サーバ側は喋り続ける
- temperature を下げても答えは合いません ── LLM のつまみを読む 生成AIが書いたコードには、なんとなく temperature=0.7 が入っています。このつまみが実際に何を変えて何を変えないのかを、同じ問いを20回ずつ通した実測で並べました。答えが間違っているときに温度を下げても、同じ間違いが20回そろって出てくるだけです。
監査ポイント temperature=0 を「正しい」の意味で使っている(実測: 誤答が20回中20回そろって出る) / temperature と top_p を同時にいじり、片方が片方を打ち消している / max_tokens で切られても例外は出ない。壊れた JSON が正常応答として返る / 思考する設定では max_tokens が本文の前に消え、空文字が成功として返る
- JSON で返ってきたから正しい、ではありません ── 構造化出力と Pydantic を読む AIが書く抽出コードには response_format={"type":"json_object"} と Model(**result) が並んでいます。30回ずつ通したところ、JSON としては30回とも読めて、スキーマとしては30回とも不合格でした。何が保証されて何が保証されないのかを、実測で切り分けます。
監査ポイント JSON モードは「JSON であること」しか保証しない。こちらのスキーマは守られない / Pydantic のスキーマをそのまま渡すと、pattern 制約でリクエストごと 400 になる / 型が合っているだけの値(桁が狂った数値・和暦のままの日付)は検証を素通りする / スキーマを渡さずリトライで粘る(実測: 再送は0/10、エラーを返しても1/10。スキーマを渡せば30/30)
- while True の中でAIが喋り続けます ── ツール実行ループを読む 生成AIに function calling を書かせると、ほぼ確実に while True で始まるループが出てきます。同じコード・同じツールで、モデルを変えただけで4回で終わったり12回でも終わらなかったりしました。止まる保証がどこにも無いことを、実測の反復回数とトークンで見ます。
監査ポイント while True に反復上限が無い(実測: モデルを変えただけで上限12回に到達し未完了・11,011トークンを消費) / ツールのエラー応答が「再試行して」だけだと、モデルは再試行し続ける / tool_choice="required" が提供側に無視されても、エラーにならない / ツール関数の例外を捕まえていないと、モデルに伝わる前にループごと落ちる
- モデル名の打ち間違いが「接続エラー」で返ってきます ── LiteLLM と Ollama を読む LiteLLM は呼び方を1本に揃えてくれますが、揃わないものが3つ残ります。モデル名・例外クラス・APIキーです。タグの打ち間違いとサーバ停止がまったく同じ例外で返ってくる様子を、実測のエラー文で並べました。
監査ポイント モデル名は provider / model / tag の3階層でズレる。どこがズレても同じエラーになる / モデル名の打ち間違いとサーバ停止が、どちらも APIConnectionError で返る / APIキー未設定が InternalServerError(500系)で返る。リトライ対象に見えてしまう / ローカル接続ではデタラメな APIキーでも成功する。キーの配線は検証されない