生成AI は、もっともらしい名前の 存在しない関数 や 存在しない引数 を返すことがあります。これを「ハルシネーション(幻覚)」と呼びます。本記事では、典型的なパターンの見抜き方と、公式ドキュメントや pip show を使った確認手順を整理します。
目次
- ハルシネーションとは
- 典型パターン 1: 存在しない関数
- 典型パターン 2: 存在しない引数
- 典型パターン 3: バージョン違い
- 確認手順 1: 公式ドキュメント
- 確認手順 2:
pip showでバージョンを把握 - 確認手順 3: Python の対話モードで存在確認
- 確認手順 4:
help()と docstring - 怪しいコードを生成AI に「自検証」させる
- ありがちなトラップ
- 「動いた」ことだけで安心しない
ハルシネーションとは
生成AI は学習時の知識やパターンから「ありそうな出力」を生成します。実在しない API でも、それっぽい関数名 が返ることがあります。
典型的な兆候は次の 3 つです。
- それっぽい名前だがインポート時 / 呼び出し時に
AttributeError - 引数名が公式と微妙に違う(
windowvswindow_sizeなど) - バージョン違いで API が変わっているのに、古い呼び出し方が混じる
「実際に動かしてみる」ことが、最終的な判定の基準になります。
典型パターン 1: 存在しない関数
実在のライブラリにある「ありそうな関数名」が混じる場合です。
# 例: pandas に rolling_apply は存在しない(かつて存在したが廃止)import pandas as pddf["sma5"] = pd.rolling_apply(df["C"], 5, np.mean)実行すると AttributeError: module 'pandas' has no attribute 'rolling_apply' で落ちます。pandas 0.18 で Series.rolling に移行しています。生成AI が古い情報を引きずっていると、こうした書き方が混じります。
# 正しい書き方(pandas 2.2 系)df["sma5"] = df["C"].rolling(5).mean()典型パターン 2: 存在しない引数
関数は正しいが、引数名が違うケースです。
# 例: pandas.read_csv に encoding_type という引数は存在しないdf = pd.read_csv("data.csv", encoding_type="utf-8")実行すると TypeError: read_csv() got an unexpected keyword argument 'encoding_type' が出ます。正しくは encoding="utf-8" です。引数名の 微妙な揺れ はハルシネーションの入りやすい場所です。
典型パターン 3: バージョン違い
API が大きく変わったライブラリでは、古い書き方が混じることがあります。pandas 1.x と 2.x、scikit-learn の旧 API などが代表的です。
# pandas 2.x で挙動が変わった例df.append(other_df) # FutureWarning または AttributeErrorDataFrame.append は pandas 2.0 で削除されました。代わりに pd.concat([df, other_df]) を使います。ライブラリのバージョンを 明示的にプロンプトに書く ことで、こうしたずれを減らせます(#7-2「データ分析のためのプロンプト設計」)。
確認手順 1: 公式ドキュメント
まずは公式ドキュメントを引きます。検索エンジンで「ライブラリ名 関数名」で検索すると、公式リファレンスがほぼ先頭に出ます。
確認するポイントは次の通りです。
- 関数名が 存在するか
- 引数名・型・デフォルト値が 一致するか
- そのライブラリの どのバージョンから 利用可能か(Deprecated 表記も)
確認手順 2: pip show でバージョンを把握
ローカル環境のライブラリのバージョンを把握しておくと、ドキュメントとの突き合わせが楽になります。
pip show pandasName: pandasVersion: 2.2.3Summary: Powerful data structures for data analysis, time series, and statistics...複数のライブラリを一度に見たいときは次の通りです。
pip list | grep -E "^(pandas|numpy|scipy|matplotlib)"バージョン情報があれば、生成AI に「pandas 2.2 系の API で書き直してください」と依頼するときも具体的になります。
確認手順 3: Python の対話モードで存在確認
公式ドキュメントを開く前に、対話モードでさくっと確認できる場合があります。
import pandas as pd
# 関数 / 属性が存在するかhasattr(pd, "rolling_apply") # Falsehasattr(pd.Series, "rolling") # True
# 引数を一覧するimport inspectprint(inspect.signature(pd.read_csv))# (filepath_or_buffer, *, sep=<no_default>, delimiter=None, header='infer', ...)inspect.signature で 実際の引数リスト を取り出せます。引数名が違っているだけのケースは、これで一発で分かります。
確認手順 4: help() と docstring
組み込みの help も役立ちます。
import pandas as pdhelp(pd.read_csv)長くなりますが、引数の意味とデフォルト値が一覧できます。短時間で済ませたいときは pd.read_csv?(IPython / Jupyter)も使えます。
怪しいコードを生成AI に「自検証」させる
修正依頼の前に、生成AI 自身に検証を依頼することもできます。
次のコードに、実在しない関数や引数が含まれていないか検証してください。
観点:- 関数名・メソッド名が公式 API に存在するか- 引数名・引数順が pandas 2.2 系の仕様と一致するか- バージョン違いで非推奨になっていないか
【コード】(対象コード)
実在しない箇所と、正しい書き方の対応をリスト形式で返してください。結果を鵜呑みにせず、最終的には公式ドキュメントで突き合わせます。生成AI 同士の検証は、最終判断の代わりにはなりません。
ありがちなトラップ
特に間違いが多いライブラリ・領域です。
| 領域 | よくあるハルシネーション |
|---|---|
| pandas | 廃止された関数(append / rolling_apply / ix)、引数名の揺れ |
| numpy | 旧名 (np.float, np.bool, np.int) の継続使用 |
| sklearn | random_state の有無、fit_transform と transform の混同 |
| matplotlib | 廃止された rc パラメータ、互換のないスタイル名 |
| 金融系ライブラリ | 似た名前のメソッドの混同(yfinance vs yahoo-finance) |
これらの領域では、特に 公式ドキュメントとの突き合わせ を癖にしておきます。
「動いた」ことだけで安心しない
実行時にエラーが出なくても、結果が間違っている ハルシネーションもあります。たとえば、似た名前の関数が存在し、別の意味で動いてしまうケースです。
# 例: pandas.Series.cumsum と cumprod の混同returns.cumsum() # 累積和returns.cumprod() # 累積積(リターンの累積はこちら)リターンの累積を取りたい場面で cumsum が混じると、エラーは出ませんが結果が違います。実行結果が想定どおりかを別の手段で確認 するクセが、最終的な防衛線になります。
まとめ
- ハルシネーションは「存在しない関数 / 引数」「バージョン違い」の 2 系統が中心
- 公式ドキュメント /
pip show/inspect.signature/help()の 4 つで確認できる - 生成AI に自検証させる手もあるが、最終判断は公式ドキュメント
- エラーが出ない誤りもある。結果が想定どおりかを別の手段で確認する