跳到主要内容

18-Models-Messages-Streaming官方深读

核对日期:2026-05-18
官方资料:Models https://docs.langchain.com/oss/javascript/langchain/models;Messages https://docs.langchain.com/oss/javascript/langchain/messages;Streaming https://docs.langchain.com/oss/javascript/langchain/streaming;Event streaming https://docs.langchain.com/oss/javascript/langchain/event-streaming

官方概念

官方 Models 文档把模型定位为 Agent 的推理引擎。模型接口既能独立调用,也能放进 Agent loop。它统一了 provider 的调用方式,但 provider 能力仍然不同,包括 tool calling、structured output、multimodal、reasoning、prompt caching、server-side tool use 和 token usage。

Messages 是模型上下文的主要载体,包含 system、user/human、assistant/AI、tool 等角色信息。Streaming 则把一次生成拆成可消费的增量事件,官方现在还推荐关注 event streaming,因为它按投影维度拆出 messages、values、tool calls、subgraphs 等迭代器。

机制

模型层需要同时处理三件事:

主题官方能力工程含义
初始化initChatModel 或 provider class用简单模型标识起步,需要精细参数时用 provider class
调用invokestreambatch单次、流式、批量分别建测试
韧性timeoutmaxRetries、指数退避网络、429、5xx 可重试;401/404 不应重试
高阶model profiles、multimodal、reasoning、local models、prompt caching、base URL/proxy、logprobs、token usage每个 provider 支持不同,必须按目标 provider 验证

TypeScript 官方写法

模型初始化有两种策略:

import { initChatModel } from "langchain";

const model = await initChatModel("provider:model-name", {
temperature: 0.2,
timeout: 30,
maxTokens: 1000,
maxRetries: 6,
});

当需要 provider 专属参数时,用 provider class:

import { ChatOpenAI } from "@langchain/openai";

const model = new ChatOpenAI({
model: process.env.MODEL_NAME,
temperature: 0.1,
timeout: 30_000,
maxRetries: 6,
});

Messages 可以用 object 格式,也可以用 message class。团队中更推荐在业务边界用 plain object,在底层 adapter 里转成官方 message class,避免 UI/API 层绑定到某个 SDK 类型。

Invocation 模式

模式官方含义适用场景验收点
invoke输入一个字符串或 messages,返回完整 AI message分类、抽取、小任务超时、错误、usage 记录
stream返回增量 chunk长回答、聊天 UI、工具执行反馈中途取消、错误事件、最终聚合
batch并行处理多个独立输入离线分类、批量抽取、evalmaxConcurrency、速率限制、失败重试
streamEvents / event streaming按事件或投影消费执行过程需要区分 token、工具、子图、状态更新前端协议、日志结构

Streaming 高阶用法

官方 streaming 文档区分:

stream mode含义适合
updatesAgent 每一步后的状态更新显示“正在调用工具”“工具完成”
messagesLLM token 与 metadata打字机式输出、reasoning token 过滤
custom工具或图节点自定义进度长任务进度,如“已抓取 10/100 条”
多模式数组同时消费多类事件Chat UI + 工具进度 + debug panel

工程上不要把 streaming 只理解成“逐字输出”。Agent streaming 还要暴露工具调用、HITL interrupt、错误和最终状态。

Python 差异

Python 也有 invoke/stream/batch 的 Runnable 思路,但包名、模型 class 和回调事件对象不同。TypeScript 的 zod 和对象消息形态更容易和前端共享;Python 的 Pydantic 和 notebook 示例更多。跨语言项目应统一 message wire shape 和 usage 统计字段。

工程边界

  • initChatModel("model-name") 很方便,但生产要明确 provider、版本、timeout、retry 和 token 限制。
  • streaming 的每个 chunk 都可能进入前端,必须定义错误、取消和 done 协议。
  • batch 不是无限并发,应设置 maxConcurrency 并按 provider rate limit 控制。
  • reasoning / multimodal / prompt caching 是 provider 能力,不是所有模型都有。

常见反模式

反模式后果
只写 model.invoke(prompt)无法迁移到多轮、工具和 streaming
不记录 model id 和参数eval 结果不可复现
streaming 只处理文本 chunk工具事件、错误、HITL 中断丢失
batch 不限并发触发 rate limit 或成本尖峰
不区分 provider retry 规则401/404 这类配置错误被错误重试

练习任务

  1. src/examples/01-chat-model.ts 增加 model config 输出,模拟记录 model、temperature、timeout。
  2. src/examples/07-streaming-runtime-guardrails.ts 增加 updates/messages/custom 三类 chunk 的本地模拟。
  3. 设计一个 batch eval runner,限制并发为 3,并记录每条 case 的 latency。