🎀 大模型说"呀"还是"吗"?temperature 和 Top K 在偷偷控制它的"性格"

写在前面:今天老师问了一个很有意思的问题------"大模型是怎么随机说话的?" 你用同样的 Prompt 问 AI 两次,它给的答案可能不完全一样。这不是 bug,是设计。LLM 预测下一个词时,会给每个候选词分配一个概率------"吗"的概率 0.6,"啊"的概率 0.15,"呀"的概率 0.1......最后选哪个?这就靠 temperatureTop K 这两个参数来控制。老师说,这两个参数就是 AI 的"性格旋钮"------你调一调,它就从"严谨的律师"变成"狂放的诗人的"。


一、LLM 怎么"选词"?

1.1 概率分布

老师举了一个例子:

上一句是"你好",LLM 预测下一个词的概率分布可能是:

arduino 复制代码
"吗"   0.60  ← 概率最高
"啊"   0.15
"呀"   0.10
"美"   0.05
"坏"   0.01
......    其他

LLM 本质上是根据前面的词,算每个候选词的概率。概率最高的词就叫"最优解"。

但问题来了------每次都选概率最高的那个吗?

  • 如果是 → 每次输出都一样 → 确定性高,但缺乏创意。
  • 如果不一定 → 有时选概率第二的 → 多样性高,但可能"跑偏"。

temperatureTop K 就是控制"怎么选"的关键参数。


二、Temperature:随机性的"温度计"

2.1 温度的作用

老师说:

"temperature------温度,随机性,0 - 1,文艺创作 | 写代码。"

temperature 控制的是概率分布的"陡峭程度":

  • 低温度(0.1 - 0.3):让高概率更高,低概率更低。模型几乎只选最高概率的词 → 严谨、确定性高。
  • 高温度(0.7 - 1.0):拉平概率分布,低概率的词也有机会被选中 → 创意、多样性高。
temperature 效果 适合场景
0.1 几乎每次都选"吗" 代码生成、法律合同
0.2 大概率选"吗",偶尔选别的 数据分析、客服回复
0.5 平衡,既有质量又有创意 文案辅助、邮件撰写
0.8 可能选"啊""呀",不再单调 故事创作、广告文案
1.0 随意选,完全放飞 头脑风暴、诗歌生成

main.mjs 中两个模型的配置:

javascript 复制代码
// 创意写作模型------温度高
const creativeModel = new ChatOpenAI({
    model: 'deepseek-v4-pro',
    temperature: 0.8,  // 创意发散
    topK: 4,           // 限制不跑偏
    maxTokens: 600,
});

// 严谨写实模型------温度低
const preciseModel = new ChatOpenAI({
    model: 'deepseek-v4-pro',
    temperature: 0.2,  // 保守严谨
    topK: 8,           // 保证信息完整
    maxTokens: 600,
});

同一个 model(deepseek-v4-pro),只改了 temperature 和 Top K,性格就完全不一样了。

2.2 做个试验

如果用两个模型写同一个主题"秋日山野晚风":

严谨模式(temperature=0.2)

"秋天的山野,晚风轻拂,带来阵阵凉意。树叶在风中沙沙作响,远处的天空渐渐暗了下来......"

创意模式(temperature=0.8)

"晚风像一只调皮的手,撩动着山野的裙摆。秋叶在风中打着旋儿,像是在跳一支无人能懂的舞......"

明明是同一个 LLM、同一个 Prompt,输出风格天差地别。这就是 temperature 的魔力。


三、Top K:限制"候选名单"

3.1 Top K 的作用

老师说:

"Top K------随机样本得分排序。"

Top K 限制模型在选词时,只看概率最高的前 K 个词。

  • Top K = 1:每次都选概率最高的那个 → 完全确定。
  • Top K = 4:只看前 4 个候选词,其他的完全不考虑。
  • Top K = 8:有更多选择,但质量依然有保障(默认值)。
java 复制代码
概率分布:
"吗"  0.60
"啊"  0.15
"呀"  0.10
"美"  0.05
"坏"  0.01
......

如果 Top K = 3:只看"吗""啊""呀"这三个。temperature 从这三个里选。
如果 Top K = 8:看前 8 个,"美"也有可能被选到。

3.2 Temperature 和 Top K 的配合

老师说了一句精辟的话:

"temperatureTop K 不可能都太大,都很小也没有必要。"

temperature Top K 效果 比喻
准确,艺术性高 只选好的,但不死板
靠谱的创意 发挥创意但不跑偏
完全放飞,可能乱来 两个疯子在一起
太死板,缺乏变化 机器人说话

老师推荐的最佳配合:

  • 代码/法律/合同temperature=0.2TopK=8(低随机 + 大候选池)
  • 创意写作/多模态temperature=0.8TopK=4(高随机 + 小候选池)

四、LangChain 的 Chain:把模型串成"流水线"

4.1 为什么要 Chain?

老师说:

"LangChain = Language + Chain(LLM 工作流编排)。"

之前我们每次都用 model.invoke(messages) 单独调用 LLM。但一个 AI 应用往往需要多个步骤:

复制代码
PromptTemplate(模板化) → Model(调用 LLM) → OutputParser(格式化输出)

Chain(链)就是把多个步骤串起来,像工厂里的流水线一样。

4.2 PromptTemplate:让 Prompt 可复用

javascript 复制代码
import { PromptTemplate } from '@langchain/core/prompts';

const storyPrompt = PromptTemplate.fromTemplate(`
    请写一篇短篇散文,主题是{theme}
    风格温柔治愈,篇幅200字左右,不要分段,文字细腻有画面感。
`);

{theme} 是一个占位符,可以在调用时动态替换。

  • 以前:每次都要硬编码写完整的 Prompt。
  • 现在:模板化,复用性高,维护方便。

4.3 StringOutputParser:自动格式化输出

javascript 复制代码
import { StringOutputParser } from '@langchain/core/output_parsers';

const outputParser = new StringOutputParser();

StringOutputParser 把 LLM 返回的复杂对象自动解析成纯文本。 以前要写 response.choices[0].message.content,现在 parser 自动帮你做了。

4.4 用 .pipe() 组装 Chain

javascript 复制代码
const creativeChain = storyPrompt
    .pipe(creativeModel)
    .pipe(outputParser);

const preciseChain = storyPrompt
    .pipe(preciseModel)
    .pipe(outputParser);

async function runWriteDemo() {
    const theme = '秋日山野晚风';

    console.log('创意写作模式');
    const creativeText = await creativeChain.invoke({ theme });
    console.log(creativeText);

    console.log('严谨写实模式');
    const preciseText = await preciseChain.invoke({ theme });
    console.log(preciseText);
}

.pipe() 把三个步骤串在一起:

复制代码
PromptTemplate(填好 theme)
  → ChatOpenAI(调用 LLM)
  → StringOutputParser(提取纯文本)

调用 creativeChain.invoke({ theme: '秋日山野晚风' }),一次执行整条流水线。


五、总结:控制 LLM 输出的四个参数

参数 作用 推荐值 比喻
temperature 控制随机性(0-1) 0.2(严谨)/ 0.8(创意) 温度计
Top K 限制候选项数量 4(创意)/ 8(严谨) 候选名单
maxTokens 最大输出 Token 数 600 字数限制
model 选择 LLM 型号 deepseek-v4-pro 大脑
LangChain 概念 作用
PromptTemplate 模板化 Prompt,占位符动态替换
StringOutputParser 自动提取 LLM 返回的纯文本
.pipe() 串联多个步骤,形成 AI 工作流

temperatureTop K 是控制 LLM 输出"性格"的关键参数。理解它们,你就能让同一个模型在不同场景下展现出不同的能力。


写在最后

今天最大的收获,是理解了 temperature 和 Top K 的配合关系。以前我只知道"temperature 高 = 创意,低 = 严谨",现在知道了还要搭配 Top K。而且 LangChain 的 Chain 机制------PromptTemplate.pipe(model).pipe(parser)------让 AI 工作流的组织变得清晰又优雅。

下次面试官问你:"怎么控制 LLM 输出的随机性?"

你可以淡定地说:

"LLM 的随机性主要通过两个参数控制:temperatureTop Ktemperature(0-1)控制概率分布的陡峭程度,值越低越倾向于选最高概率的词,输出更严谨;值越高概率分布越平坦,低概率词也有机会被选中,输出更多样。Top K 限制模型只从前 K 个概率最高的词中采样,值小可以防止输出跑偏。两者需要配合使用:temperature 低 + Top K 大 → 准确且稳定;temperature 高 + Top K 小 → 有创意但不离谱。在 LangChain 中,可以通过 ChatOpenAItemperaturetopK 参数配置,再用 .pipe() 组装成完整的 AI 工作流。"

然后看着面试官满意的表情,心里默念:这波,又稳了。


本文所有代码示例均来自课堂学习资料,真实可运行。

相关推荐
渣波1 小时前
别再死磕MySQL了!用Milvus+LangChain给AI加个“海马体”,手把手带你写个RAG日记本
前端
乌夷1 小时前
vue知识点
前端·javascript·vue.js
何时梦醒1 小时前
🚀 从零上手 Milvus 向量数据库:打造一个 AI 智能日记本
前端·人工智能
blns_yxl1 小时前
拖拽排序列表(HTML+JS)
前端·javascript·html
Data1 小时前
把 React 前端做成「插件市场」:前后端联动的行业包可插拔架构
前端
光影少年1 小时前
RN Bridge 原理
前端·react native·react.js
Larcher1 小时前
别再搞混了!一文讲透 AI Workflow 和 Agent 的本质区别
javascript·人工智能·后端
daols881 小时前
vue vxe-context-menu 通用右键菜单组件使用
前端·javascript·vue.js·vxeui
程序员黑豆1 小时前
鸿蒙应用开发实战:轻松实现列表上拉加载更多
前端·华为·harmonyos