01-模型消息与调用
核对日期:2026-05-18
官方资料:Models https://docs.langchain.com/oss/javascript/langchain/models;Messages https://docs.langchain.com/oss/javascript/langchain/messages。
官方概念
LangChain 的 chat model 接口以 messages 作为主要输入,message 保留 role、content 和工具相关元数据。这样做的原因是模型调用不只是字符串补全,而是多角色上下文、工具调用、流式输出和结构化响应的统一协议。
机制
模型接口负责 provider 抽象,但不消除 provider 差异。工具调用格式、结构化输出能力、token 计费、streaming 事件和错误码都可能不同。
TypeScript 写法
本手册离线示例:
npm run examples
对应文件:src/examples/01-chat-model.ts。
真实 LangChain 项目中,通常会从官方 provider 包初始化模型,再把 messages 传入 model 或 agent。密钥必须通过环境变量注入,不写入源码。
Python 差异
Python 示例常见 init_chat_model("provider:model") 或 provider 专属模型类。TypeScript 侧会使用对应 JS/TS provider 包。不要假设 Python 的 import path 可直接翻译到 TypeScript。
工程边界
- 把模型选择做成配置,但关键任务要按 provider 分别回归。
- message history 要控制 token 预算,不能无限拼接。
- system prompt 不应承载权限逻辑,权限必须在工具、检索和业务层执行。
常见反模式
| 反模式 | 后果 |
|---|---|
| 把所有上下文塞进 user message | role 边界丢失,工具和安全策略难维护 |
| 只测一个 provider | 换模型后 structured output 或 tool call 可能退化 |
| 在日志里完整记录敏感 prompt | trace 变成敏感数据仓库 |
练习任务
- 修改
src/examples/01-chat-model.ts的 messages,观察输出长度变化。 - 为 message 增加一个 metadata 字段前,先说明它是否应进入模型上下文。
- 写一个测试断言:assistant response 不能包含密钥形态字符串。