大模型是怎么随机说话的?—— Temperature、Top-k 与 LangChain 实战
大模型是怎么随机说话的?—— Temperature、Top-k 与 LangChain 实战
你有没有发现,同一个大模型,同一个问题,每次回答都像是不同的人写的?有时候它一本正经,像个严谨的学术派;有时候又天马行空,像个浪漫的诗人。这种“随机性”并不是玄学,背后其实有两把关键的旋钮在控制——Temperature 和 Top-k。本文就从原理讲到代码,带你彻底搞懂这两个参数,再用 LangChain 搭一条能随时切换风格的 AI 写作流水线,让你亲眼看看它们到底怎么影响输出。

一、大模型生成文字的底层逻辑
说穿了,大模型的工作方式就是“预测下一个词”。
你输入“你好”,模型内部会立刻对词典里所有可能的后续词汇打分,生成一个概率分布——所有候选词的概率加起来正好等于 1。比如:
"你好" 后面可能是: 吗 0.60 啊 0.15 呀 0.10 美 0.05 坏 0.01 ……
概率最高的“吗”最容易被选中,但如果模型每次都只选那个最高分的词,那每次回复就一模一样了,那还叫“人工智能”吗?所以我们需要两个参数来调节这个随机性,让模型既不会太死板,也不会太离谱。
Temperature(温度)
Temperature 的取值范围通常在 0~1 之间,它控制着概率分布的“陡峭”程度。简单粗暴地理解:Temperature 越低,模型越老实行事;越高,它就越敢想敢干。
| 值 | 效果 | 适用场景 |
|---|---|---|
| 0.2(低) | 大概率选最高分词,输出稳定、保守 | 代码生成、法律文书、合同 |
| 0.8(高) | 低分词也有机会被选中,输出发散、有创造力 | 文艺创作、脑暴、多模态内容 |
Top-k(候选截断)
Top-k 的做法更直接:按概率从高到低排序,只保留前 k 个候选词,剩下的全部扔掉,不许它们参与后续的随机选择。
- 默认值通常为 8
- k 越小,候选池越纯净,内容不容易跑偏
- k 越大,候选池越丰富,但也可能混入低质量选项
Temperature 和 Top-k 怎么搭配?
这两个参数不是独立工作的,它们需要配合。如果两个都很大,模型会过度发散,容易胡言乱语;两个都太小,模型又像背课文一样毫无新意。关键是找到那个平衡点:
| 组合 | 效果 |
|---|---|
| 低 temperature + 高 top-k | 在较大候选池中保守选择,保证信息完整性——适合严谨任务 |
| 高 temperature + 低 top-k | 在靠谱的候选池中大胆发挥——创意可控,既能发散又不离谱 |
所谓的“幻觉问题”,本质上就是随机性失控。只有理解了这两个参数,开发者才能真正让 AI 应用做到“靠谱地随机”。
二、为什么需要 LangChain?
如果你还在代码里硬拼 prompt 字符串、手动处理返回结果、硬编码模型参数——写一两个 demo 还行,但一旦 AI 工作流变得复杂(多轮对话、工具调用、输出格式化),代码就会迅速失控,变成一团乱麻。
LangChain 这个名字很有意思:Language + Chain。它的核心思路就是把 AI 工作流拆成链条上的一个个节点,每个节点各司其职:
- :提示词模板,复用和管理 prompt,不再把 prompt 写在代码里
PromptTemplate
- :大模型调用,统一接口,换模型只需改一行配置
ChatModel
- :输出解析器,自动把模型原始输出转成你需要的格式(比如 JSON、字符串等)
OutputParser
AI 应用本身带有“黑盒”属性——要么觉得不够智能,要么太智能不知道它怎么做到的。Chain 的思路就是把黑盒拆成可观测、可组合的链条,每一个环节都清晰可控。
三、实战:用 LangChain 搭建创意 & 严谨双模式写作
下面我们用 LangChain 搭一条写作流水线,拿同一个主题,分别用“创意模式”和“严谨模式”生成两篇散文,让你直观感受 Temperature 和 Top-k 的差异到底有多大。
1. 初始化两个不同风格的大模型
import { ChatOpenAI } from '@langchain/openai';
// 创意模型:高 temperature + 低 top-k = 靠谱池子里大胆发挥
const creativeModel = new ChatOpenAI({
model: 'deepseek-v4-pro',
temperature: 0.8, // 增强发散性
topK: 4, // 仅从概率前4的词汇里采样,防止跑偏
maxToken: 600,
apiKey: process.env.DEEPSEEK_API_KEY,
configuration: { baseURL: 'https://api.deepseek.com' }
});
// 严谨模型:低 temperature + 高 top-k = 大池子里保守选择
const preciseModel = new ChatOpenAI({
model: 'deepseek-v4-pro',
temperature: 0.2, // 保守,输出稳定
topK: 8, // 更大候选池,保证信息完整性
maxToken: 600,
apiKey: process.env.DEEPSEEK_API_KEY,
configuration: { baseURL: 'https://api.deepseek.com' }
});
2. 定义可复用的 Prompt 模板
import { PromptTemplate } from '@langchain/core/prompts';
const storyPrompt = PromptTemplate.fromTemplate(
`请写一篇短篇散文,主题:{theme}
风格温柔治愈,篇幅200字左右,不要分段,文字细腻有画面感。`
);
{theme} 是占位符,调用时动态传入。同一个模板可以被不同模型复用——这就是 LangChain 把 prompt 从业务代码中解耦出来的好处,改模板不用改代码,改代码也不用改模板。
3. 组装 Chain 流水线
import { StringOutputParser } from '@langchain/core/output_parsers';
const outputParser = new StringOutputParser();
const creativeChain = storyPrompt.pipe(creativeModel).pipe(outputParser);
const preciseChain = storyPrompt.pipe(preciseModel).pipe(outputParser);
pipe 串联起整个工作流:PromptTemplate → LLM → OutputParser。像工厂流水线一样,原料(theme)从一头进去,成品(文章)从另一头出来。换模式?换条链就行,结构完全不变。
4. 运行对比
async function runWriteDemo() {
const theme = '秋日山野晚风';
console.log('=== 创意写作模式 (temperature=0.8, topK=4) ===');
const creativeText = await creativeChain.invoke({ theme });
console.log(creativeText);
console.log('\n=== 严谨模式 (temperature=0.2, topK=8) ===');
const preciseText = await preciseChain.invoke({ theme });
console.log(preciseText);
}
runWriteDemo().catch(err => console.error(err));
实际运行一下,你会发现:创意模式下,同样的主题“秋日山野晚风”会产出更有文采、用词更大胆的散文,比如“晚风裹着松针的清香掠过山脊”;而严谨模式下,输出更工整、平实、可预测,比如“秋日的山野,晚风微凉,吹动树叶沙沙作响”。切换模式只需要改两个参数,chain 的结构完全不变,这就是代码复用的魅力。
四、总结
- 和
Temperature
是大模型随机性的两个核心旋钮,理解它们才能真正掌控 AI 输出质量Top-k
- 低 temperature + 高 top-k:代码、合同、法律等严谨场景
- 高 temperature + 低 top-k:创意写作、脑暴等需要发散但不离谱的场景
- LangChain 把 prompt、模型调用、输出解析串成可组合的 Chain,让 AI 应用从“一坨代码”变成“结构化流水线”
两个参数,一条链,AI 就能既聪明又可控。下次再有人问你“大模型为什么每次说话都不一样”,你就可以把这篇文章甩给他了。