deepseek.ac日本語で学ぶ、実践する

実装

DeepSeek APIのtemperatureとmax_tokensを理解する

· 約9分

リード

前提

注記: パラメータの対応状況・範囲・既定値はモデルごとに異なる。最新の仕様は公式ドキュメントで要確認。

本文

temperature とは何か

出力トークンの選択における「ランダム性」を調整する値。

重要: temperature は「正しさ」を制御しない。事実誤認を減らす目的で 0 にしても効かない。RAG の精度改善は検索側の問題。

from openai import OpenAI

client = OpenAI(
    api_key=os.environ["DEEPSEEK_API_KEY"],
    base_url="https://api.deepseek.com",
)

def ask(prompt: str, temperature: float = 0.0) -> str:
    res = client.chat.completions.create(
        model="deepseek-chat",
        messages=[{"role": "user", "content": prompt}],
        temperature=temperature,
    )
    return res.choices[0].message.content

max_tokens とは何か

生成する出力トークンの上限。超えた分は打ち切られる。

res = client.chat.completions.create(
    model="deepseek-chat",
    messages=[{"role": "user", "content": "PythonでFizzBuzzを書いて"}],
    max_tokens=256,
    temperature=0.2,
)

choice = res.choices[0]
print(choice.finish_reason)  # "stop" なら正常、"length" なら切れている
print(choice.message.content)

用途別の推奨値

用途 temperature max_tokens の目安
分類・抽出・JSON整形 0.0〜0.3 用途の出力長 + 余裕
コード生成 0.0〜0.3 512〜2048
要約 0.3〜0.5 元文の 1/3 程度
アイデア出し・ブレスト 0.9〜1.3 512〜1024
翻訳 0.0〜0.3 原文と同程度

迷ったら temperature=0.3、max_tokens は想定出力の 1.5〜2 倍から始める。

切り分けの実践

「出力が途中で終わる」ときは、まず finish_reason を見る。

if choice.finish_reason == "length":
    # max_tokens を上げる、または「簡潔に」と指示する
    ...

「毎回違う答えが返る」ときは、まず temperature を下げる。それでも揺れるなら、プロンプトの曖昧さが原因。

つまずきポイント

症状 対処
出力が途中で切れる finish_reason == "length" を確認し max_tokens を上げる
JSON が壊れる temperature を 0 に下げる。JSON モードの利用も検討
temperature=0 でも結果が揺れる 仕様。揺れが許容できない用途は事前に評価セットで検証
入力が長くてエラー max_tokens ではなく入力側のコンテキスト長超過。messages を削る
コストが想定より高い max_tokens は上限であり課金対象は実出力。実際の出力長を計測する

まとめ

チェックリスト