深入解析模型调用与 Prompt 构建的四种“姿势” 📅 2026/6/29 20:00:57 随着大语言模型LLM的爆发式发展LangChain 作为一个强大的编排框架极大地降低了我们与各类大模型交互的门槛。无论你是在构建简单的问答机器人还是复杂的多智能体系统“模型调用”和“提示词构建”都是最基础也是最核心的基石。今天我们就结合一张非常经典的 LangChain 知识点脑图深入拆解模型调用的底层逻辑、四种 Message 角色以及四种尽管原笔记标题写的是三种实际写了四种实用的 Prompt 传递方式。一、 模型调用的“四大金刚”方法LangChain 对底层 LLM 接口进行了高度抽象无论你使用的是 OpenAI、Anthropic 还是百度的文心一言都通过一套统一的接口进行交互。根据不同的业务场景LangChain 提供了四种核心的调用方法1.invoke()—— 最基础的同步调用这是最常用的单次请求方法。当你向模型发送一个 Prompt并希望完整地等待回复后再进行下一步操作时使用invoke。它的特点是阻塞式的过程简单直观非常适合在脚本或非实时交互场景中使用。2.ainvoke()—— 异步调用的“魔法”如果你的应用构建在异步框架如 FastAPI、Sanic 等上或者你需要同时处理多个不相关的请求ainvoke就是你的救星。它支持await语法能够在等待模型响应时不阻塞主线程大幅提升高并发场景下的系统吞吐量。3.stream()—— 丝滑的流式响应大模型存在一定的推理时延如果使用invoke等几秒甚至十几秒才吐出全部答案用户会感到非常卡顿。stream()允许模型将生成的 Token 像水流一样逐字或逐段返回。这对于开发类似 ChatGPT 的“打字机效果”交互界面至关重要能极大地提升用户的体验感。4.batch()—— 批量请求的“推土机”当你有一组固定不变的 Prompt例如对数千封电子邮件同时进行摘要时batch()方法可以将它们打包成一个批次一次性发送给 API。这不仅比循环调用invoke快得多还能在底层自动进行并发处理最大化利用模型的并发配额大幅节省总处理时间。二、 消息Messages的概念大模型的“人格”划分单纯扔给模型一句“今天天气怎么样”往往不够专业。为了引导大模型发挥出更好的效果我们需要将 Prompt 细分为不同的“角色”。LangChain 将对话历史高度封装成了以下几种Message类型SystemMessage系统提示词这是给大模型设定的“人格设定”和“行为准则”。例如“你是一位资深 Python 开发者说话要简洁、专业”、“你只回答和编程有关的问题”。SystemMessage 是控制模型输出的核心“闸门”。HumanMessage用户提示词代表了用户的真实提问或指令。这是对话流程中最常规的输入。AIMessageAI 返回的结果这条不是我们填写的而是模型上一轮输出的结果。在需要长上下文记忆的对话中必须把之前对话的AIMessage一并传回去这样模型才知道上下文。ToolMessage工具提示词这是大模型 Agent 时代的产物。当大模型决定调用外部工具如联网搜索、计算器时我们需要把工具执行后的返回结果包装成ToolMessage传给模型以便它根据结果生成最终答案。三、 四种 Prompt 传递方式你选哪一种很多人刚接触 LangChain 时会对如何传参感到困惑。图片中列出了四种方式笔记标题写“三种方式”实际上是四种这正好体现了 LangChain 的灵活性与兼容性。我们来逐一解析方式 1纯文本调用最基础llm.invoke(你好请介绍一下自己。)适用场景简单的单轮对话、不需要系统设定的无关痛痒的测试。缺点是没法设定 SystemMessage也无法构建复杂的多轮对话上下文。方式 2使用消息类型对象最推荐类型安全from langchain_core.messages import SystemMessage, HumanMessage llm.invoke([ SystemMessage(content你是一个幽默的喜剧演员。), HumanMessage(content讲个笑话吧。) ])优势这是 LangChain官方推荐的最佳实践。由于使用了类对象你的 IDE如 VSCode可以提供代码补全和类型检查一旦属性名写错例如把content拼错代码会在运行时之前就报错非常适合在大型商业项目中使用。方式 3使用元组列表轻量级llm.invoke([ (system, 你是一个翻译助手只把中文译成英文。), (human, 我爱编程。) ])优势写法极其简洁不需要引入额外的SystemMessage类。它利用元组的第一个元素指定角色第二个元素指定内容。适合在需要快速搭建原型、对代码行数要求精简的场合使用。方式 4使用字典列表原生兼容llm.invoke([ {role: system, content: 你是一位资深战略顾问。}, {role: human, content: 帮我分析一下电动汽车行业的趋势。} ])优势这种格式与 OpenAI 官方 API 的原始参数结构完全一致。如果你的代码之前是基于 OpenAI SDK 写的想要迁移到 LangChain这种写法可以直接复用数据结构迁移成本最低。四、 综合实战用一段代码跑起来让我们把所有概念融合在一起写一个真正的 Python 脚本假设你配置好了 OpenAI 环境from langchain_openai import ChatOpenAI from langchain_core.messages import SystemMessage, HumanMessage # 1. 初始化模型设定温度0.7适当增加创造性 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0.7) # 2. 构建 Prompt使用最推荐的类对象方式 messages [ SystemMessage(content你是一个精通武侠小说的文学大师。你的回答必须充满诗意和江湖气息。), HumanMessage(content什么是孤独) ] # 3. 调用模型测试流式输出 print(--- 大师的高见 ---\n) for chunk in llm.stream(messages): print(chunk.content, end, flushTrue) print(\n)代码解析SystemMessage给了模型“武侠文学大师”的人设。HumanMessage提出了一个哲学问题。采用stream()方法返回你会看到大模型像真人说话一样逐字逐句地输出带有古风色彩的答案而不是一下子全部蹦出来。五、 结语灵活背后的统一从图片中的简单几行代码提纲我们可以延伸出 LangChain 在设计上的巨大魅力它既提供了统一的调用入口invoke等又提供了高度灵活的 Prompt 组装修饰四种消息角色和四种传参格式。掌握了模型调用的基本姿态你就拥有了驾驭大语言模型的基础能力。建议你在实际项目中优先使用类对象来构建多轮对话并根据系统对实时性的要求在stream和invoke之间做出权衡。技术是表象灵活运用才是精髓。LangChain 的世界还有很多有趣的组件如 Chain、Agent、Memory等待你去探索打好今天这层地基未来的构建将事半功倍