语言模型抽象层设计
模型层把各厂商 API 收敛为 BaseLanguageModel / BaseChatModel,统一 invoke、stream、token 计数、工具绑定、结构化输出。
1. 继承层次(概念)
| 类型 | 典型 API |
|---|---|
BaseLLM | 字符串进字符串出(legacy) |
BaseChatModel | BaseMessage[] 进 AIMessage 出 |
| 厂商子类 | OpenAI、Anthropic 等 |
新应用以 ChatModel 为主。
2. 输入输出
- 输入:
BaseMessage[]或 PromptValue。 - 输出:
AIMessage(含content字符串或 多模态 content 块)。 - Generation:底层可含多条 candidate、logprobs 等(视厂商)。
3. Token 与计费
getNumTokens/ callback 上报 usage。- 长上下文模型需在应用层做 截断、摘要(非 core 自动完成)。
4. 结构化输出
| 方式 | 说明 |
|---|---|
withStructuredOutput(zodSchema) | 约束 JSON 形态 |
| Tool calling | 模型选工具,参数即结构化 |
| JSON mode | 厂商原生 JSON 开关 |
失败时重试或 fallback parser 由应用策略决定。
5. ChatModel 扩展
bindTools:挂载 Tool 定义,模型返回tool_calls。bind:固定 temperature、model 名等。- 缓存:相同输入可命中
BaseCache(可选)。
6. 提供商包
各 @langchain/* 实现:鉴权、请求体映射、流式 SSE 解析、错误码转换。
换厂商 = 换 Runnable 实例,链结构可不变。
7. 错误处理
区分 可重试(429、5xx)与 不可重试(401、invalid request);在 Runnable 或模型配置层设 retry。
8. 总结
模型层职责:把厂商差异藏在 ChatModel 子类里,对上只暴露 Message 与 Runnable 契约。