生成AI は、もっともらしい名前の 存在しない関数存在しない引数 を返すことがあります。これを「ハルシネーション(幻覚)」と呼びます。本記事では、典型的なパターンの見抜き方と、公式ドキュメントや pip show を使った確認手順を整理します。

目次

  1. ハルシネーションとは
  2. 典型パターン 1: 存在しない関数
  3. 典型パターン 2: 存在しない引数
  4. 典型パターン 3: バージョン違い
  5. 確認手順 1: 公式ドキュメント
  6. 確認手順 2: pip show でバージョンを把握
  7. 確認手順 3: Python の対話モードで存在確認
  8. 確認手順 4: help() と docstring
  9. 怪しいコードを生成AI に「自検証」させる
  10. ありがちなトラップ
  11. 「動いた」ことだけで安心しない

ハルシネーションとは

生成AI は学習時の知識やパターンから「ありそうな出力」を生成します。実在しない API でも、それっぽい関数名 が返ることがあります。

典型的な兆候は次の 3 つです。

  • それっぽい名前だがインポート時 / 呼び出し時に AttributeError
  • 引数名が公式と微妙に違う(window vs window_size など)
  • バージョン違いで API が変わっているのに、古い呼び出し方が混じる

「実際に動かしてみる」ことが、最終的な判定の基準になります。

典型パターン 1: 存在しない関数

実在のライブラリにある「ありそうな関数名」が混じる場合です。

# 例: pandas に rolling_apply は存在しない(かつて存在したが廃止)
import pandas as pd
df["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 または AttributeError

DataFrame.append は pandas 2.0 で削除されました。代わりに pd.concat([df, other_df]) を使います。ライブラリのバージョンを 明示的にプロンプトに書く ことで、こうしたずれを減らせます(#7-2「データ分析のためのプロンプト設計」)。

確認手順 1: 公式ドキュメント

まずは公式ドキュメントを引きます。検索エンジンで「ライブラリ名 関数名」で検索すると、公式リファレンスがほぼ先頭に出ます。

確認するポイントは次の通りです。

  • 関数名が 存在するか
  • 引数名・型・デフォルト値が 一致するか
  • そのライブラリの どのバージョンから 利用可能か(Deprecated 表記も)

確認手順 2: pip show でバージョンを把握

ローカル環境のライブラリのバージョンを把握しておくと、ドキュメントとの突き合わせが楽になります。

Terminal window
pip show pandas
Name: pandas
Version: 2.2.3
Summary: Powerful data structures for data analysis, time series, and statistics
...

複数のライブラリを一度に見たいときは次の通りです。

Terminal window
pip list | grep -E "^(pandas|numpy|scipy|matplotlib)"

バージョン情報があれば、生成AI に「pandas 2.2 系の API で書き直してください」と依頼するときも具体的になります。

確認手順 3: Python の対話モードで存在確認

公式ドキュメントを開く前に、対話モードでさくっと確認できる場合があります。

import pandas as pd
# 関数 / 属性が存在するか
hasattr(pd, "rolling_apply") # False
hasattr(pd.Series, "rolling") # True
# 引数を一覧する
import inspect
print(inspect.signature(pd.read_csv))
# (filepath_or_buffer, *, sep=<no_default>, delimiter=None, header='infer', ...)

inspect.signature実際の引数リスト を取り出せます。引数名が違っているだけのケースは、これで一発で分かります。

確認手順 4: help() と docstring

組み込みの help も役立ちます。

import pandas as pd
help(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) の継続使用
sklearnrandom_state の有無、fit_transformtransform の混同
matplotlib廃止された rc パラメータ、互換のないスタイル名
金融系ライブラリ似た名前のメソッドの混同(yfinance vs yahoo-finance)

これらの領域では、特に 公式ドキュメントとの突き合わせ を癖にしておきます。

「動いた」ことだけで安心しない

実行時にエラーが出なくても、結果が間違っている ハルシネーションもあります。たとえば、似た名前の関数が存在し、別の意味で動いてしまうケースです。

# 例: pandas.Series.cumsum と cumprod の混同
returns.cumsum() # 累積和
returns.cumprod() # 累積積(リターンの累積はこちら)

リターンの累積を取りたい場面で cumsum が混じると、エラーは出ませんが結果が違います。実行結果が想定どおりかを別の手段で確認 するクセが、最終的な防衛線になります。

まとめ

  • ハルシネーションは「存在しない関数 / 引数」「バージョン違い」の 2 系統が中心
  • 公式ドキュメント / pip show / inspect.signature / help() の 4 つで確認できる
  • 生成AI に自検証させる手もあるが、最終判断は公式ドキュメント
  • エラーが出ない誤りもある。結果が想定どおりかを別の手段で確認する