为什么叫大
模型参数多,训练数据多,训练成本高。规模变大后,它能覆盖更多语言、代码和任务模式。
LLM 不是搜索引擎,也不是一个真正理解世界的人。更准确地说,它是一个大型概率模型:读入上下文,把文字切成 token,计算关系,再一个 token 一个 token 地生成结果。
别急着背 Transformer、参数量、注意力机制。先把它当成一个语言生成服务:你给它上下文,它返回一段文本。区别在于,它不是按固定模板拼字符串,而是根据训练得到的参数计算下一个 token。
模型参数多,训练数据多,训练成本高。规模变大后,它能覆盖更多语言、代码和任务模式。
它主要处理文本序列。代码、JSON、SQL、Markdown 也可以看成语言。
它不是业务规则集合,而是一组经过训练的参数。参数决定了输入到输出的映射。
它不断预测下一个 token,追加到输出里,再继续预测,直到遇到停止条件。
程序员写系统时,最怕概念飘在空中。把 LLM 放成函数会清楚很多:输入是指令和上下文,输出是一段文本或结构化结果。不同的是,这个函数不是确定性业务代码。
const result = await llm.generate({
system: "你是企业商品系统的需求分析助手",
user: "根据这段描述生成 PRD 草稿",
context: docsFromKnowledgeBase,
responseFormat: "json"
});
同一个输入在不同参数、不同采样配置下可能有细微差异。线上要记录版本和配置。
上下文缺失时,模型仍然会生成听起来完整的回答。完整不代表正确。
真实产品会有检索、工具调用、权限、日志、评测和人工审核,LLM 只是其中一个组件。
Token 可以理解成模型处理文本的最小片段。一个中文词可能是一个 token,也可能被拆开;英文单词也可能被拆成子词。计费、上下文长度、生成速度,很多都和 token 有关。
请根据商品录入系统的现状,生成一份批量导入需求说明。
// 一个粗略经验:上下文 = 系统提示 + 用户问题 + 检索文档 + 历史消息 + 预留输出
if (contextTokens > maxWindow - outputBudget) {
compressOrRetrieveLess();
}
模型不能直接对“商品”“订单”“库存”这些词做数学运算。Embedding 会把 token 或文本片段变成一组数字。向量距离能表达语义接近程度,这也是知识库检索常用的基础。
对人来说,“商品”和“SKU”有业务联系。对模型来说,这种关系要落到向量空间里。
"商品" → [0.12, -0.38, 0.74, ...]
"SKU" → [0.10, -0.35, 0.71, ...]
"天气" → [-0.66, 0.18, -0.21, ...]
它只是表示方式。相似度高说明内容可能相关,不代表内容真实或适合当前问题。
企业知识库常把向量检索和关键词检索混合使用,避免字段名、编号、枚举值查不准。
文档切得太碎会丢上下文,切得太大又占窗口。RAG 的质量很大一部分来自这里。
现代 LLM 大多基于 Transformer。先不用害怕公式,可以把注意力理解成“每个 token 在生成当前结果时,需要参考哪些 token”。它不是人类注意力,但这个比喻足够用来入门。
“它”到底指什么,需要看上下文。注意力机制就是在大量 token 之间计算关系权重。
同样的词放在不同位置,含义可能不同。模型需要知道 token 顺序。
低层可能处理局部语法,高层可能组合更抽象的任务模式。这里不要理解成固定分工。
训练后的权重保存了大量统计模式。模型不是把原文一条条存起来再检索。
LLM 的训练通常分几个阶段。不同公司做法会有差异,但大方向类似:先学语言和世界知识,再学如何听指令,最后通过评测和偏好数据让回答更可用。
| 阶段 | 模型学到什么 | 程序员可以怎么理解 | 常见误解 |
|---|---|---|---|
| 预训练 | 语言、代码、事实片段、表达模式 | 像把大量文本压缩进参数,但不是普通压缩包。 | 以为模型一定能准确复述训练资料。 |
| 指令微调 | 如何按问题、任务和格式回应 | 让模型从“会续写”变成“会做任务”。 | 以为只要提示词好,就不需要训练阶段。 |
| 偏好优化 | 哪些回答更有帮助、更稳、更符合规范 | 让模型学会避开差答案和坏习惯。 | 以为它能消除所有错误。 |
| 领域适配 | 特定格式、语气、术语或任务套路 | 可以用微调,也可以用 RAG 或 Prompt 模板。 | 把微调当成知识库更新。 |
训练好的模型上线后,每次调用都会走推理流程。程序员要关心的不只是答案质量,还有延迟、成本、并发、缓存、流式输出和失败重试。
控制随机性。低一些更稳定,高一些更发散。写代码、抽取 JSON 通常不需要太高。
从累计概率达到阈值的一组候选里采样。它影响模型输出的多样性。
边生成边返回,用户感知更快。后端要处理取消、超时和不完整 JSON。
Prompt 不是咒语。对程序员来说,它更像接口协议:说明任务、输入、输出格式、边界条件和失败处理。写得好,模型更容易走到你想要的轨道上。
帮我写一个商品导入需求。
问题太短,模型不知道系统现状、用户角色、字段规则、异常处理、输出格式。
你是企业商品系统的需求分析师。
任务:根据资料生成 PRD 草稿。
资料:{knowledge_docs}
输出:JSON,包含 scope、flow、rules、edgeCases、openQuestions。
限制:不能编造不存在的字段,缺信息放入 openQuestions。
任务、资料、格式、限制都给了,后续更容易校验和接入系统。
角色:你在当前系统里扮演什么角色。
任务:本次要完成什么。
上下文:业务资料、接口、字段、历史结论。
边界:哪些不能做,哪些不能猜。
输出:格式、字段、长度、语言。
校验:如果资料不足,应该怎么处理。
企业系统里的很多知识变化很快,比如字段、接口、权限、政策、库存、订单状态。把这些都寄希望于模型“记住”并不现实。需要事实时,让模型去查;需要动作时,让模型调用工具;需要稳定风格或格式时,再考虑微调。
先从知识库检索相关文档,再把片段塞进上下文。适合制度、文档、历史需求、FAQ。
模型生成工具参数,系统去查数据库、调接口、跑计算或执行动作。模型不应该直接改生产数据。
用样本调整模型行为。适合固定格式、专业表达、重复任务,不适合当成实时知识库。
做 Demo 可以只写 prompt。进企业系统后,要把 LLM 放进完整链路里:输入怎么来,知识怎么查,输出怎么验,失败怎么兜底,效果怎么评估。
用户隐私、密钥、合同、内部策略都要按公司数据规范处理。该脱敏就脱敏。
模型超时、格式错、工具失败、检索为空,都要有明确处理,不要让用户卡死。
模型版本、prompt 模板、token 用量、耗时、失败原因、人工修改率,这些能帮你迭代。
下面这些问题很常见。短答用于快速建立判断,展开答案用于继续聊工程细节。
短答:LLM 是用大规模文本和代码训练出来的语言模型,它把输入拆成 token,在上下文里计算关系,然后逐步生成后续 token。
展开:它的能力来自模型结构、训练数据、参数规模和后续指令对齐。它擅长文本理解、生成、总结、改写、代码辅助,但不等于数据库或搜索引擎。需要准确事实时,最好接 RAG、工具调用或业务接口。
因为模型的生成目标是产出在上下文中高概率的 token,而不是逐条查证事实。上下文缺失、检索资料错误、问题本身带误导,都会让它生成看似合理但不真实的内容。
工程上可以用知识库检索、工具调用、引用来源、结构化校验、人工审核和评测集来降低风险,但不能假设模型永远正确。
RAG 是在推理时查资料,把相关内容放进上下文,让模型基于资料回答。它适合变化快的知识,比如企业文档、接口说明、制度和历史需求。
微调是用样本调整模型行为,更适合固定格式、特定语气或重复任务。它不是实时知识同步机制。如果公司字段每天都变,先做 RAG 或工具查询更稳。
Prompt 工程是在运行时给模型组织上下文。对程序员来说,它像接口设计:告诉模型角色、任务、输入、边界、输出格式和失败处理。
好的 Prompt 不是越长越好,而是信息足够、结构清楚、约束明确,并且能配合后续程序校验。
我会先确定任务是否适合 LLM,再设计上下文来源、输出格式和校验方式。如果答案依赖企业知识,就接 RAG;如果要查实时数据或执行动作,就走工具调用;如果输出要入库,就做结构化 schema 校验。
上线前准备评测样例,记录模型版本、prompt 模板、token 用量、耗时和人工修改率。这样问题出现时能定位,不会只靠感觉判断效果。
学完以后,不要只背定义。用下面几个小题练习判断:什么该交给模型,什么该由系统保证。
| 概念 | 一句话 | 工程问题 |
|---|---|---|
| LLM | 根据上下文逐步生成 token 的大型语言模型。 | 任务是否适合生成式模型? |
| Token | 模型处理文本的片段单位。 | 上下文是否超限,输出空间是否足够? |
| Embedding | 把文本映射成向量,方便计算语义相似度。 | 知识库切片和检索策略是否可靠? |
| Transformer | 通过注意力机制计算 token 关系的模型结构。 | 长上下文、延迟和成本是否可接受? |
| RAG | 推理时检索资料,让模型基于资料回答。 | 资料来源、引用和召回质量怎么评估? |
| Tool Calling | 让模型选择工具和参数,由系统执行真实查询或动作。 | 权限、审计、幂等和回滚怎么做? |
| 评测 | 用固定样例和标准判断模型应用是否变好。 | 有没有覆盖高频、边界和失败场景? |