从 Temperature 与 Top-K 的原理到基于 LangChain 的工程落地
一、引言:大模型是如何"随机"说话的?
大语言模型(LLM)的本质任务是预测下一个词 (Next Token Prediction)。在生成文本时,模型并不会直接输出一个确定的词,而是输出一个概率分布------所有可能的下一个词及其对应的概率。
举个例子,当模型看到"你好"之后,它预测的下一个词可能是:
| 候选词 | 概率 |
|---|---|
| 吗 | 0.60 |
| 啊 | 0.15 |
| 呀 | 0.10 |
| 美 | 0.05 |
| 坏 | 0.01 |
| ... | ... |
如果不加任何控制,模型默认会从"吗"(概率最高 0.6)中选择。但这样每次回答都一样,显得机械呆板。如何让模型既有"灵性"又不至于"胡说"? 这就是 Temperature 和 Top-K 两个核心参数的用武之地。
二、Temperature(温度参数):控制随机性的"旋钮"
2.1 什么是 Temperature?
Temperature 是一个 0 到 1 之间的浮点数,用于调节概率分布的"平滑度",进而控制模型输出的随机程度。
- Temperature 越低(如 0.2) :概率分布更"尖锐"------高概率词被进一步放大,低概率词被进一步压缩。模型倾向于选择最安全、最可能的词,输出严谨、确定、可预测。
- Temperature 越高(如 0.8) :概率分布更"平坦"------高低概率之间的差距被缩小,低概率词有了更多"出镜"的机会。输出变得多样、有创意、但不太可靠。
2.2 适用场景
| Temperature | 特点 | 适用场景 |
|---|---|---|
| 0.1 ~ 0.3 | 严谨保守、输出稳定 | 代码生成、法律文书、公司合同、数学推理 |
| 0.5 ~ 0.7 | 均衡中和 | 通用对话、信息摘要、翻译 |
| 0.8 ~ 1.0 | 创意发散、多样性强 | 文学创作、多模态内容生成、AI 漫剧、头脑风暴 |
2.3 注意事项
把 Temperature 拉得太高,随机性增加的同时,生成的可靠性会显著下降------这就是所谓的幻觉问题(Hallucination)。模型可能开始"一本正经地胡说八道"。对于开发者来说,理解并合理控制这个参数,是构建靠谱 AI 应用的关键一步。
三、Top-K:给随机性加一道"护栏"
3.1 什么是 Top-K?
Top-K 采样的思路很朴素:在生成每个词时,先将所有候选词按概率从高到低排序,只保留前 K 个,然后在这 K 个词中进行采样。那些排在后面的"冷门词"直接被排除在外,不给它们"浑水摸鱼"的机会。
默认的 K 值通常为 8 ,在实际 AI 应用中可以按效果观测进行调整,比如设为 3 ~ 5 (更保守)或 8 ~ 10(更开放)。
3.2 Top-K 的意义
- 防止跑偏:即使 Temperature 设得较高,Top-K 也能确保模型只是在"靠谱的候选"中发挥创意,而不是从整个词表中随机乱抓。
- 可控的多样性:Top-K 决定候选池的大小,Temperature 决定池内采样有多"随机"------两者协同工作。
四、Temperature 与 Top-K 的黄金配比
这是整篇文章最核心的实践方法论。Temperature 和 Top-K 是一对需要搭配使用 的参数,它们不可能都太大,也没必要都太小。
4.1 四大配比策略
scss
Top-K 小 Top-K 大
(K=3~5, 窄候选池) (K=8~10, 宽候选池)
┌──────────┬─────────────────────┬──────────────────────┐
│ T 大 │ 🔥 创意燃烧模式 │ ⚠️ 失控随机模式 │
│(0.7~1.0) │ 靠谱的创意性 │ 不推荐!太发散 │
│ │ 适合:创意写作 │ │
├──────────┼─────────────────────┼──────────────────────┤
│ T 小 │ ⚠️ 过于保守模式 │ ✅ 精确全面模式 │
│(0.1~0.3) │ 不推荐!太死板 │ 准确 + 信息完整 │
│ │ │ 适合:代码、法律 │
└──────────┴─────────────────────┴──────────────────────┘
4.2 两种黄金组合
组合一:Temperature 小 + Top-K 大 → 精确且全面
- Temperature = 0.2,Top-K = 8
- 效果:模型在较大的靠谱候选池中,以较低的随机性选择。结果既准确,又不至于因为候选太少而丢失信息。
- 适用:代码生成、法律合同、技术文档。
组合二:Temperature 大 + Top-K 小 → 有节制的创意
- Temperature = 0.8,Top-K = 4
- 效果:模型只在高概率的前几个候选中进行高随机性采样。创意发挥被限定在"靠谱范围"内------创意燃烧但不失控。
- 适用:文学创作、创意文案、多模态内容生成。
五、LangChain:把 AI 工作"链"起来
5.1 为什么需要 LangChain?
LLM 应用开发面临一个核心矛盾:要么觉得它不够智能,要么觉得它太智能了但不知道它怎么干出来的------这是一种"黑盒式"的体验。
LangChain(lang + chain)的理念是:把 AI 工作流拆解成一条链,把链条上的每个节点都串联起来、管理起来。这样做的好处:
- 开发更快:模板化、模块化,不用每次都从头写胶水代码。
- 可维护:Prompt、模型、解析器各自独立,修改一处不影响其他。
- 可观测:AI 工作流不再是黑盒,每一步都清晰可控。
5.2 核心模块
LangChain 的核心由 @langchain/core 提供:
| 模块 | 作用 |
|---|---|
| Messages | 对话消息列表的管理 |
| Prompts(PromptTemplate) | 提示词模板------把 Prompt 从硬编码中解耦出来,便于复用、维护和管理 |
| Output Parsers(StringOutputParser) | 输出解析器------自动将大模型的复杂输出解析成我们需要的格式(如纯文本) |
| Tools | 工具集成,让 LLM 能调用外部能力 |
5.3 AI 工作流(Chain)
一条典型的 Chain 流:
PromptTemplate → LLM → StringOutputParser → 最终输出
链式调用 (.pipe())使得整个流程像工厂流水线一样清晰:原料(用户输入)从一端进入,经过提示词模板、大模型推理、输出解析,最终产出成品。
在实际业务中,可以根据不同场景设计多条 Chain------比如一条"创意链"和一条"严谨链",根据业务需求路由到不同的流水线。
六、实战:构建双模式 AI 写作流水线
下面基于 t-demo/main.mjs 的代码,展示如何用 LangChain 搭建一个创意模式 + 严谨模式的双流水线 AI 写作应用。
6.1 环境准备
env
# .env
DEEPSEEK_API_KEY=sk-your-api-key-here
6.2 定义两种模型的参数组合
javascript
import { ChatOpenAI } from '@langchain/openai';
import { StringOutputParser } from '@langchain/core/output_parsers';
import { PromptTemplate } from '@langchain/core/prompts';
// 创意模型:高温度 + 小 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/v1',
}
});
// 严谨模型:低温度 + 大 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/v1',
}
});
6.3 定义 Prompt 模板
javascript
const storyPrompt = PromptTemplate.fromTemplate(`
请写一篇短文,主题:{theme}
风格温柔治愈,篇幅200字左右,不要分段,文字细腻有画面感。
`);
使用 PromptTemplate 的好处是:当 AI 业务面向不同用户时,只需更换 {theme} 变量即可复用同一套 Prompt 逻辑,而不需要改代码。
6.4 构建两条 Chain
javascript
const outputParser = new StringOutputParser();
// 创意生产线
const creativeChain = storyPrompt
.pipe(creativeModel)
.pipe(outputParser);
// 严谨生产线
const preciseChain = storyPrompt
.pipe(preciseModel)
.pipe(outputParser);
通过 .pipe() 串联,数据在链条上自动流转。两条 Chain 使用相同的 Prompt 模板和输出解析器,唯一的区别是中间的大模型配置不同------这就是参数化驱动不同业务效果的工程实践。
6.5 运行对比
javascript
async function runWriteDemo() {
const theme = "秋日山野晚风";
console.log('=== 创意写作模式 ===');
const creativeText = await creativeChain.invoke({ theme });
console.log(creativeText);
console.log('\n=== 严谨写实模式 ===');
const preciseText = await preciseChain.invoke({ theme });
console.log(preciseText);
}
runWriteDemo().catch(err => console.error(err));
运行后你会直观地看到:同样的主题,创意模式 产出的文字更有文学性和画面感,而严谨模式更平实准确。这正是 Temperature + Top-K 组合拳的魔力所在。
七、总结
| 维度 | 核心要点 |
|---|---|
| LLM 生成原理 | 基于概率分布逐个预测下一个词 |
| Temperature | 调节概率分布的"平坦度",值越高越随机。低适用于严谨场景,高适用于创意场景 |
| Top-K | 限定候选词范围,防止低概率词干扰。K 越小越保守,K 越大候选越丰富 |
| 黄金配比 | T 小 + K 大(精确全面),T 大 + K 小(靠谱创意)。两者不可同时极端 |
| LangChain | 将 Prompt → LLM → Parser 串联成可维护、可复用的 AI 工作流 |
| 工程实践 | 同一套 Prompt + 不同参数配置 = 适配不同业务场景的多条 Chain |
核心理念:Temperature 和 Top-K 是开发者手中控制 AI 随机性的两个旋钮。理解它们、搭配好它们,你就能在"严谨可靠"和"创意灵动"之间自如切换,构建出既聪明又可控的 AI 应用。