AI 应用工程入门(一):大模型到底是什么?
用普通人能听懂的方式解释大模型、token、上下文窗口、幻觉和 RAG 这几个最基础的概念。
学习 AI 应用工程,第一步不是急着训练模型,也不是先记一堆工具名,而是先弄清大模型到底在做什么。只有理解它的工作方式,后面再学 Prompt、RAG、Tool Calling、Agent 和评测,才不会把所有问题都误认为“模型不够聪明”。
题目 1:大模型到底是什么?
标准答案:大模型可以先理解成一个根据上下文预测下一个 token 的系统。它读入一段上下文,计算接下来最可能出现的 token,然后不断生成,直到形成完整回答。
工程要点:大模型不是数据库,也不是传统搜索引擎。它很擅长理解语言、组织表达、总结材料、生成草稿,但它并不天然保证事实正确。把它接进产品时,重点不是让它显得像无所不知,而是给它正确上下文、明确边界和可校验的输出。
题目 2:Token 是什么?
标准答案:token 是模型处理文本的基本单位之一。它不完全等于汉字,也不完全等于英文单词。模型不是按人类阅读习惯处理文字,而是把文本拆成 token 序列来计算。
工程要点:token 会影响三件事:上下文长度、输出长度和调用成本。输入越长、历史对话越多、检索资料越多,消耗的 token 就越多。做 AI 应用时,不能无限把资料塞给模型,而要控制上下文质量。
题目 3:上下文窗口为什么重要?
标准答案:上下文窗口是模型一次能看到的 token 总量。系统提示词、用户问题、历史对话、检索资料和模型输出都会占用这个窗口。
工程要点:上下文窗口不是越大越可以乱塞。无关资料太多,会让模型抓不住重点,也会增加成本。真实产品里常常要对历史对话做摘要,对长文档做切片,对检索结果做筛选,只把最有价值的信息放进去。
一个最小的心智模型可以这样记:
const inputContext = [
systemPrompt,
userMessage,
historySummary,
retrievedDocs,
].filter(Boolean).join("\n\n");
const answer = await model.generate({
input: inputContext,
temperature: 0.2,
});
这段代码不是绑定某个具体 SDK,而是在表达 AI 调用的本质:先整理上下文,再控制生成参数,最后拿到输出。AI 应用工程师真正要管理的,是 inputContext 的质量和边界。
题目 4:为什么模型会幻觉?
标准答案:模型生成的是看起来合理的语言,而不是每次都在查事实。如果上下文里没有答案,问题又要求它必须回答,它可能会补出一个听起来像真的内容。
工程要点:减少幻觉的第一步,是限制信息来源。事实类问题不要问“你知道什么”,而要问“根据这些资料能得出什么”。如果资料没有答案,就应该允许模型说不知道。
题目 5:RAG 为什么会出现?
标准答案:RAG 是检索增强生成。它的思路是先查资料,再把资料交给模型,让模型基于资料回答,而不是凭训练记忆回答。
工程要点:Embedding 负责找资料,LLM 负责组织答案,RAG 负责把两者串起来。理解这一点,就能明白 AI 应用工程的核心不是训练一个万能模型,而是设计一条可靠的信息进入模型的路径。
完整示例:把大模型看成一个上下文处理器
这一课最容易被讲薄的地方,是只说“大模型预测下一个词”,却没有说明工程师到底要控制什么。更完整的理解是:大模型不是单独回答用户问题,而是在读取一整个上下文包。这个上下文包里有系统规则、用户输入、历史摘要、检索资料、工具返回结果和输出要求。模型看到什么,就会沿着什么生成;上下文不干净,回答就会不稳定。
可以先把一次调用抽象成四步:第一,整理上下文;第二,选择模型和参数;第三,让模型生成;第四,对输出做校验。真正的工程能力不在“会问一句话”,而在能控制这四步。
type ModelContext = {
systemPrompt: string;
userMessage: string;
historySummary?: string;
retrievedDocs?: string[];
outputContract?: string;
};
function buildContext(context: ModelContext) {
return [
context.systemPrompt,
context.historySummary ? `历史摘要:${context.historySummary}` : null,
context.retrievedDocs?.length
? `参考资料:\n${context.retrievedDocs.join("\n---\n")}`
: null,
`用户问题:${context.userMessage}`,
context.outputContract ? `输出要求:${context.outputContract}` : null,
]
.filter(Boolean)
.join("\n\n");
}
这段代码对应课程里的几个基础概念:systemPrompt 是系统层约束;userMessage 是用户输入;historySummary 是压缩后的上下文;retrievedDocs 是 RAG 找到的资料;outputContract 是输出格式约束。它们加起来才是模型真正看到的东西。
如果用户问“我们公司年假怎么申请”,错误做法是直接让模型回答。正确做法是先判断这是事实类问题,再从资料库检索制度文档,把制度片段塞进上下文,并要求模型基于资料回答。没有资料时,模型应该返回“不知道”或“资料未提到”,而不是编一个流程。
错误路径:用户问题 -> 模型凭训练记忆回答 -> 可能幻觉
正确路径:用户问题 -> 判断任务类型 -> 检索资料 -> 构造上下文 -> 模型基于资料回答 -> 校验输出
这一课还要记住一个判断:如果任务是写作、改写、总结,模型可以直接发挥;如果任务是事实、业务规则、个人数据、订单状态,就必须给资料或工具。大模型的长处是组织语言和推理,不是自动拥有你的最新数据。
这一篇最该带走的结论是:大模型是强大的语言和推理组件,但不是可靠事实仓库。AI 应用工程的第一步,是学会给它正确上下文,并知道什么时候不能让它凭空回答。