最近在准备一个 AI 医疗岗的笔试,里面大量考 RAG 情景题和 LLM 调用细节。临场被问到「防止模型瞎编要把哪个参数设成 0」时,我意识到自己对这些参数只有模糊印象,于是把 OpenAI 这套(通义/智谱/DeepSeek 基本都兼容)的调用参数系统梳理了一遍,画成一张思维导图。这里把梳理结果写成文章,既给自己留档,也方便同样在啃 LLM 应用层的朋友。
为什么要先搞清楚参数
很多人写第一个 chat.completions.create() 时只填了 model 和 messages,剩下的全靠默认。但当场景变成「医疗问答要准确、代码生成要稳定、创意文案要发散」时,默认值就不灵了。
参数本质上都在回答一个问题:你希望模型多"自由"、多"长"、多"守规矩"。把所有参数按职责归成六类,记忆负担一下子就降下来了。
全景思维导图

① 采样 / 随机性(最常被问)
这一类控制「输出有多随机」,是面试最高频。
- temperature:核心中的核心。
0表示贪心解码,每次选概率最高的 token,输出确定、可复现;1或更高则更随机、更有"创造力",但也更容易跑偏。事实类、医疗、代码场景一律设 0 或很低(0.1)。 - top_p(核采样):与 temperature 类似,但换个角度——只从「累积概率达到 p 的最小词集」里采样。实际工程中常二选一用,temperature 更常用。
- top_k:只保留概率最高的 k 个候选词,简单粗暴地砍掉长尾。
- seed:固定随机种子,配合 temperature 低值可实现可复现输出,便于调试和评测。
from openai import OpenAI client = OpenAI() resp = client.chat.completions.create( model="gpt-4o-mini", messages=[{"role": "user", "content": "列出三种排序算法"}], temperature=0, # 事实类问答,要确定性 top_p=1.0, seed=42, ) print(resp.choices[0].message.content)
② 长度 / 终止
- max_tokens:模型最多能生成的 token 数。注意它只限制输出、不包括输入;设太小会被截断。
- stop:遇到指定字符串序列就停止生成,常用于控制格式边界或防止模型写出多余内容。
③ 重复 / 话题
- frequency_penalty:对已经出现过的词降权,防止一句话翻来覆去说。
- presence_penalty:对已经出现过的概念/话题降权,鼓励引入新内容。
两者容易混:一个是「词级别防啰嗦」,一个是「话题级别防原地打转」。写长文、做头脑风暴时可以适当调高 presence_penalty。
④ 格式 / 结构
- response_format:最实用之一。
{"type": "json_object"}强制模型返回合法 JSON,做 Agent / 工具调用解析时几乎必开。 - logit_bias:直接对特定 token 的 logit 加减分,精细控制输出(比如压低某个不想出现的词)。
- logprobs:返回每个生成 token 的概率分布,用于评估「模型有多确定」,常见于可解释性分析。
resp = client.chat.completions.create( model="gpt-4o-mini", messages=[{"role": "user", "content": "返回城市及其人口,JSON 格式"}], response_format={"type": "json_object"}, temperature=0, )
⑤ 工具调用(Function Calling)
这是 RAG 之外的另一条「让模型取数据」的主线。
- tools:声明一组函数(名字、参数 schema、用途说明)。模型运行时自行判断要不要调、传什么参数。
- tool_choice:控制调用行为——
"auto"(模型自己决定)、"none"(禁用)、或强制指定某个函数。
tools = [{ "type": "function", "function": { "name": "get_drug_interaction", "description": "查询两种药物的相互作用", "parameters": { "type": "object", "properties": { "drug_a": {"type": "string"}, "drug_b": {"type": "string"}, }, "required": ["drug_a", "drug_b"], }, }, }] resp = client.chat.completions.create( model="gpt-4o-mini", messages=[{"role": "user", "content": "阿司匹林和布洛芬能一起吃吗?"}], tools=tools, tool_choice="auto", )
本质就是给后端接口加一份「能力说明书」,让 LLM 来调度——你之前写的那些业务 API,天然就是 Function Calling 的 tool。
⑥ 请求级
- stream:流式输出,边生成边返回,体验更顺滑,UI 上几乎必备。
- n:一次请求返回几条候选,做多样性采样时有用。
- user:用户标识,用于安全风控与审计溯源。
- model:模型名,决定能力边界。
一个必须说清的真相:temperature=0 不等于不瞎编
这是面试官最爱追问的点。被问「防幻觉设哪个参数为 0」时,答 temperature 没错,但只答这一句会显得浅。
temperature=0 只是去掉了「随机性」,让输出确定、不发散。幻觉的真正来源是模型知识有缺口却没被约束——temperature=0 只是让它「稳定地」输出它认为最像的答案,如果它本来就不知道,照样编得很笃定。
真正防瞎编靠的是:
- Grounding(基于检索上下文):用 RAG 把相关片段塞进 prompt,让模型有据可依——这是根本。
- 引用约束:prompt 里强制「只依据给定片段、标注 [1][2]、无依据就说不知道」。
- 评测 + 人工复核:持续跑 Faithfulness(忠实度)指标。
所以在医疗 RAG 系统里,标准配置是 temperature=0 + 强制引用检索片段 两者叠加,单靠 temperature 挡不住医疗幻觉。
总结表
| 类别 | 代表参数 | 一句话职责 |
|---|---|---|
| 采样/随机性 | temperature, top_p, top_k, seed | 控制输出有多自由 |
| 长度/终止 | max_tokens, stop | 控制生成多长、何时停 |
| 重复/话题 | frequency_penalty, presence_penalty | 防啰嗦、防原地打转 |
| 格式/结构 | response_format, logit_bias, logprobs | 控格式、控特定词、取概率 |
| 工具调用 | tools, tool_choice | 让模型调度外部接口 |
| 请求级 | stream, n, user, model | 传输与请求行为 |
参数名各家基本兼容 OpenAI 这套,但有的只支持 temperature / top_p / max_tokens 三个核心项,top_k 和 penalty 是增强项。答题时先说三个核心,再补增强项,显得既务实又专业。
把这张图存进脑子,再去看 RAG、Agent、Function Calling 的代码,会发现它们底层都在玩同一件事:把相关数据用最合适的机制取出来,拼进 prompt,再交给 LLM 生成。