大模型是怎么随机说话的?------ Temperature、Top-k 与 LangChain 实战
大模型每次生成的回复都不太一样,有时候很严谨,有时候天马行空。这种"随机性"到底是怎么控制的?本文从原理到代码,带你理解 Temperature 和 Top-k 这两个关键参数,并用 LangChain 搭一个可用的 AI 写作流水线。
一、大模型生成文字的底层逻辑
大模型本质上是在"预测下一个词"。
比如你输入"你好",模型内部会对所有可能的后续词汇打分,形成一个概率分布(所有候选词的概率加起来等于 1):
erlang
"你好" 后面可能是:
吗 0.60
啊 0.15
呀 0.10
美 0.05
坏 0.01
......
概率最高的"吗"最容易被选中,但模型不会总是选最高分的那个------否则每次回复都一样,就太死板了。我们需要两个参数来控制随机性。
Temperature(温度)
取值范围通常在 0~1 之间,控制概率分布的"陡峭"程度:
| 值 | 效果 | 适用场景 |
|---|---|---|
| 0.2(低) | 大概率选最高分词,输出稳定、保守 | 代码生成、法律文书、合同 |
| 0.8(高) | 低分词也有机会被选中,输出发散、有创造力 | 文艺创作、脑暴、多模态内容 |
简单理解:Temperature 越低,模型越"老实";越高,越"敢想"。
Top-k(候选截断)
Top-k 的做法很直接:按概率从高到低排序,只保留前 k 个候选词,后面的全部丢掉。
- 默认值通常为 8
- k 越小,候选池越纯净,内容不容易跑偏
- k 越大,候选池越丰富,但也可能混入低质量选项
Temperature 和 Top-k 怎么搭配?
这两个参数不能同时都很大,也不能同时都很小------那就失去组合的意义了:
| 组合 | 效果 |
|---|---|
| 低 temperature + 高 top-k | 在较大候选池中保守选择,保证信息完整性------适合严谨任务 |
| 高 temperature + 低 top-k | 在靠谱的候选池中大胆发挥------创意可控,既能发散又不离谱 |
幻觉问题本质上就是随机性失控。理解这两个参数,开发者才能有效地让 AI 应用"靠谱地随机"。
二、为什么需要 LangChain?
直接在代码里拼 prompt 字符串、手动处理返回结果、硬编码模型参数------写一两个 demo 还行,但一旦 AI 工作流变复杂(多轮对话、工具调用、输出格式化),代码就会迅速失控。
LangChain = Lang uage + Chain,核心思路是把 AI 工作流拆成链条上的节点,每个节点各司其职:
- PromptTemplate:提示词模板,复用和管理 prompt
- ChatModel:大模型调用,统一接口
- OutputParser:输出解析器,自动把模型原始输出转成你需要的格式
AI 应用本身带有"黑盒"属性------要么觉得不够智能,要么太智能不知道它怎么做到的。Chain 的思路就是把黑盒拆成可观测、可组合的链条。
三、实战:用 LangChain 搭建创意 & 严谨双模式写作
下面用 LangChain 搭一条写作流水线,同一个主题,分别用"创意模式"和"严谨模式"生成两篇散文,直观感受 Temperature 和 Top-k 的效果差异。
1. 初始化两个不同风格的大模型
javascript
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 模板
javascript
import { PromptTemplate } from '@langchain/core/prompts';
const storyPrompt = PromptTemplate.fromTemplate(`
请写一篇短篇散文,主题:{theme}
风格温柔治愈,篇幅200字左右,不要分段,文字细腻有画面感。
`);
{theme} 是占位符,调用时动态传入。同一个模板可以被不同模型复用------这就是 LangChain 把 prompt 从业务代码中解耦出来的好处。
3. 组装 Chain 流水线
javascript
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. 运行对比
javascript
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 和 Top-k 是大模型随机性的两个核心旋钮,理解它们才能真正掌控 AI 输出质量
- 低 temperature + 高 top-k:代码、合同、法律等严谨场景
- 高 temperature + 低 top-k:创意写作、脑暴等需要发散但不离谱的场景
- LangChain 把 prompt、模型调用、输出解析串成可组合的 Chain,让 AI 应用从"一坨代码"变成"结构化流水线"
两个参数,一条链,AI 就能既聪明又可控。