作者:互联网 时间: 2026-07-22 18:04:16
适合读者:了解 LLM 基础调用,想深入理解随机性参数 & LangChain 链式编程的开发者。
大模型每次输出,不是直接选出"概率最高的那个词",而是从一堆候选词里 "抽签"。
比如看到"你好",模型给每个可能的下一字分配了概率:
复制代码吗(0.35)> 啊(0.18)> 呀(0.08)> 嘛(0.05)> 吧(0.04)> 呢(0.03)> ...
↑ 大概率生成"吗" ↑ 不可能生成"坏"
temperature 就是控制这个"抽签过程有多随机"的开关。
| 取值 | 效果 | 适合场景 |
|---|---|---|
| 0 ~ 0.3 | 几乎每次都选第一名,很死板 | 写代码、翻译、法律合同、技术文档 |
| 0.5 ~ 0.7 | 适度随机,兼顾准确和变化 | 日常对话、总结 |
| 0.8 ~ 1.5 | 天马行空,跳跃性强 | 写小说、起标题、广告语、头脑风暴 |
Top K:从"概率最高的 K 个词"里抽签,其余直接淘汰。
| K 值 | 效果 |
|---|---|
| 1 | 永远选第一名,完全不随机 |
| 3~10 | 极小范围采样,防止跑偏 |
| 20~50 | 适度范围,常用默认值 |
| 越大 | 随机性越强 |
temperature 只管"敢不敢选第二名",Top K 管"有没有资格参赛"。它们干的是不同的事——先用 Top K 过滤垃圾候选,再用 temperature 控制随机程度。
| 对比维度 | Top K | Top P |
|---|---|---|
| 策略 | 固定取前 K 个候选词 | 动态取,概率累加到 P 为止 |
| 候选数量 | 固定不变 | 自适应变化 |
| 效果 | 分布平坦时可能漏掉好词 | 分布集中时自动收紧,分散时放宽 |
| 实际地位 | 早期主流方案 | 现代默认方案 |
| 策略 | 搭配 | 适合 |
|---|---|---|
| 靠谱创意 | temperature 0.7 | 写文案、起标题、角色对话 |
| 保守准确 | temperature 低 + Top K 无所谓 | 写代码、翻译、法律合同 |
| 参数 | 作用 | 通俗理解 |
|---|---|---|
maxToken | 限制一次输出最多多少个 token | 给 AI 划"字数上限" |
frequency_penalty | 惩罚重复用词 | 值越大越不爱说同样的话 |
presence_penalty | 惩罚聊过的话题 | 值越大越爱换新话题 |

LangChain = Lang(语言模型)+ Chain(工作链) ️
直接用 LLM 有两个痛点:
| 痛点 | 说明 |
|---|---|
| 不够智能 | 单次调用能力有限,无法串联复杂任务 |
| 太像盲盒 | 不知道它怎么得出结果的,难以调试 |
LangChain 的核心是 chain(链条):把 AI 工作流拆成一个个节点串起来,每一步都可追踪、可调试。
| 模块 | 作用 | 什么时候用 |
|---|---|---|
prompts | 提示词模板,动态填变量 | 每次都要搭"填空题" |
output_parsers | 把 LLM 文本转成 JSON/数组 | 需要结构化输出时 |
runnables | 用 .pipe() 串联各步骤 | 搭建工作流时必用 |
callbacks | 监听 LLM 调用全过程 | 需要日志/计费/限流时 |
memory | 记住对话历史 | 多轮对话场景 |
retrievers | 从知识库捞相关内容 | RAG 应用必备 |

同一个 PromptTemplate,接两条不同的链——只换模型参数,就能得出两种风格。
复制代码// 创意模型 — 高随机性 + 小候选池,靠谱又有创意
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' }
});// 严谨模型 — 低随机性,死磕准确
const preciseModel = new ChatOpenAI({
model: 'deepseek-v4-pro',
temperature: 0.2, // 保守准确
topK: 8, // temp 低时 Top K 大小无所谓
maxToken: 600,
apiKey: process.env.DEEPSEEK_API_KEY,
configuration: { baseURL: 'https://api.deepseek.com' }
});
复制代码const storyPrompt = PromptTemplate.fromTemplate(
'请写一篇短篇散文,主题:{theme},风格温柔治愈,篇幅200字左右'
);
storyPrompt.invoke({ theme: "秋日山野晚风" });
// → 自动替换 {theme}
复制代码// 无 LangChain:LLM 返回 AIMessage 对象,需手动 .content 获取文本
// 有 LangChain:链上自动提取 content,直接返回字符串
const outputParser = new StringOutputParser();
复制代码const creativeChain = storyPrompt.pipe(creativeModel).pipe(outputParser);
const preciseChain = storyPrompt.pipe(preciseModel).pipe(outputParser);const creativeText = await creativeChain.invoke({ theme: "秋日山野晚风" });
const preciseText = await preciseChain.invoke({ theme: "秋日山野晚风" });
| 对比维度 | 创意模式(t=0.8) | 严谨模式(t=0.2) |
|---|---|---|
| 用词 | "情人微凉的指尖"、"山水画" 跳跃灵动,意象出奇 | "清凉的丝绸帕子"、"金色的波浪" 平实温暖,用词常规 |
| 句式 | 长句连绵,节奏起伏如诗 | 复合句居多,起承转合清晰 |
| 视角 | 主观 · 通感 | 客观 · 引导读者 |
| 风格 | 像诗人即兴挥洒 | 像老师写范文 |
复制代码class MonitorHandler extends BaseCallbackHandler {
async handleLLMStart(llm, prompts) {
console.log(" LLM 开始调用, prompt:", prompts[0].substring(0, 80) + "...");
}
async handleLLMEnd(output) {
console.log(" token 用量:", output.llmOutput?.tokenUsage);
}
}await creativeChain.invoke(
{ theme: "秋日山野晚风" },
{ callbacks: [new MonitorHandler()] }
);
同一套代码,切换不同厂商只需改 baseURL,业务逻辑完全不变:
| 厂商 | baseURL |
|---|---|
| DeepSeek | |
| 阿里通义千问 | |
| 智谱 GLM | |
| 本地 Ollama | |
复制代码const memory = new BufferMemory();const creativeChat = new ConversationChain({
llm: creativeModel, // temperature=0.8
memory: memory,
});const preciseChat = new ConversationChain({
llm: preciseModel, // temperature=0.2
memory: memory,
});
| 坑点 | 说明 | 解决方案 |
|---|---|---|
| topK 与 topP 同时设置 | 部分 API(如 OpenAI)不支持同时设置,会报错或忽略其中一个 | 查阅对应厂商文档,一般二选一即可 |
| temperature=0 并非完全确定 | 浮点精度问题 + 底层采样器可能有微小随机,多次运行仍有细微差异 | 设置 seed 参数固定随机种子(部分厂商支持) |
| 参数名大小写不一致 | DeepSeek 用 top_k,OpenAI 用 topK,LangChain 对大小写敏感 | 统一使用 LangChain 官方参数名,让框架帮你转换 |
| maxToken 与 maxTokens | 不同厂商参数名不同,混用会导致配置不生效 | 用 LangChain 的 maxToken,框架会自动映射 |
| 温度太高导致输出乱码 | temperature > 1.5 时概率分布被压太平,可能输出无意义内容 | 控制范围在 0~1.5,超出后质量急剧下降 |
| 概念 | 一句话总结 |
|---|---|
| temperature | 控制"敢不敢选第二名",越高越疯,越低越乖 |
| Top K | 固定取前 K 个候选词参赛 |
| Top P | 动态保留概率累加到 P 的候选词,更智能 |
| LangChain | 把 AI 工作流拆成可串可换可看的流水线 |
| Chain | .pipe() 串联所有零件 |
| Callbacks | 装监控,看每一环节的耗时和 token |
| 场景 | ️ temperature | Top P |
|---|---|---|
| 代码/翻译/合同 | 0.0 - 0.3 | 0.1 - 0.3 |
| 日常对话/总结 | 0.5 - 0.7 | 0.5 - 0.7 |
| 文案/小说/头脑风暴 | 0.8 - 1.2 | 0.8 - 0.95 |