第 01 课:模型与消息

第 01 课:模型与消息
第 01 课模型与消息配套代码仓库https://gitee.com/wang-zeyong111/lang-chain-lecture本课定位模型与消息是 LangChain 的地基。后面的提示模板、工具调用、Agent、记忆和 LangGraph都会围绕“消息如何进入模型、模型如何返回消息、消息如何被继续保存和传递”展开。如果这一课理解扎实后面看到复杂 Agent 时就不会迷糊。学习目标理解聊天模型和传统 LLM 的区别。掌握系统消息、用户消息、AI 消息、工具消息的职责。能用字符串或消息列表调用模型。能手动维护一段对话历史。理解模型参数对稳定性、成本和延迟的影响。一、聊天模型的输入输出现代 LLM 应用通常使用聊天模型。聊天模型的输入不是单一字符串而是一组消息。每条消息都有角色和内容。常见消息角色system系统指令决定模型扮演什么角色、遵守什么边界。user用户输入。assistant模型输出。tool工具执行结果通常由 Agent 传回模型。LangChain 用消息对象统一表达这些内容使不同模型供应商可以使用相似的调用方式。二、为什么不要总用字符串调用字符串调用简单但适合场景有限一次性问题没有角色设定不需要多轮对话不需要工具结果不需要多模态内容。真实应用更常用消息列表因为你需要明确系统指令、历史对话、工具结果和用户最新问题。示例fromlangchain_core.messagesimportSystemMessage,HumanMessage messages[SystemMessage(content你是一位严谨的 Python 老师。),HumanMessage(content请解释 LangChain 的用途。),]responsemodel.invoke(messages)三、系统消息的设计系统消息不是随便写一句“你是助手”就完事。一个好的系统消息通常包含角色你是谁任务你要做什么风格简洁、详细、中文、分点约束不能编造、必须引用、遇到不确定要说明工具规则什么时候必须调用工具输出格式是否需要 JSON、表格或固定字段。例子你是企业知识库助手。只能依据给定上下文回答。 如果上下文不足请回答“资料不足无法确认”。 答案必须包含引用来源。四、AIMessage 不只是文本模型返回的通常是AIMessage。它的content是文本内容但在工具调用场景里AIMessage 还可能包含工具调用请求例如工具名、参数和调用 ID。这也是为什么 Agent 不是“模型直接回答”而是模型返回一个 AIMessage如果里面有工具调用就执行工具工具结果变成 ToolMessageToolMessage 再交给模型最后模型返回最终 AIMessage。五、手动维护对话历史记忆组件出现之前你可以手动维护消息列表history[SystemMessage(content你是学习助教。)]history.append(HumanMessage(content我喜欢简洁回答。))aimodel.invoke(history)history.append(ai)这能帮助你理解所谓“记忆”并不是模型自己永久记住了用户而是应用把之前的消息重新提供给模型。六、模型参数如何影响效果常见参数temperature越低越稳定越高越发散。max_tokens控制输出长度。timeout控制请求等待时间。model决定能力、价格、速度和上下文窗口。推荐经验任务temperature分类0 或接近 0抽取0 或接近 0工具调用0 或较低RAG 问答0 到 0.3文案创意0.6 到 1七、模型选择原则选模型不能只看“最强”。你要综合考虑能否支持工具调用能否支持结构化输出上下文窗口大小中文能力延迟成本供应商稳定性是否方便接入企业合规体系。学习阶段用便宜、快速的小模型即可。生产阶段可以按任务分层简单分类用小模型复杂推理用强模型。八、代码实战拆解本课 notebook 的get_demo_model()是一个模型工厂如果设置了真实 API Key就初始化真实模型如果没有就返回 Fake 模型。这个设计很实用因为它让课程代码具备两种运行模式学概念时不依赖网络和 Key实战时无缝切到真实模型。你在自己的项目里也可以采用类似模式把模型初始化集中到一个函数中避免到处散落模型配置。九、常见坑把用户输入直接拼进系统消息容易造成 prompt injection 风险。每轮对话都丢掉历史导致模型无法理解“继续”“刚才那个”。历史无限增长导致成本变高、延迟变长、效果变差。任务需要稳定输出却把 temperature 设太高。没有统一模型工厂项目里到处硬编码模型名。十、自测清单我能解释SystemMessage、HumanMessage、AIMessage的区别。我知道字符串调用和消息调用分别适合什么场景。我能手动维护一段对话历史。我知道为什么模型本身不会永久记住用户。我能根据任务选择合理的 temperature。十一、课后练习写一个ask_as(role, question)函数用不同系统角色回答同一个问题。写一段 3 轮对话手动维护history。把系统消息改成“必须先给结论再给理由”观察输出变化。如果有真实模型分别用 temperature 0 和 0.8 调用同一个问题对比差异。