学习笔记 · Obsidian
模型与 Provider 选型总览
结论
- 新应用默认选 Chat Model。它是 message-in/message-out 抽象,承担 tool calling、structured output、streaming 与多模态;具体能力仍取决于所选模型、API 端点和版本。
- Embeddings 只处理文本,核心接口是
embedQuery(string)与embedDocuments(string[])。当前 JavaScript 总览明确不支持多模态 embedding。 - LLM 页面描述的是较老的 string-in/string-out completion 接口。除非维护特定 instruct/completion 模型,否则应迁移到 Chat Model。
- Provider 是第三方能力与独立包的目录概念,不等于“模型厂商”。Provider 路由同时包含模型、检索器、工具、loader、vector store 和 sandbox。
路由与正文去重
本批权威清单共有 77 条路由:providers 17、chat 25、embeddings 21、llms 14。
| 路由 | 最终 Markdown 正文 | 处理方式 |
|---|---|---|
providers | 307 到 providers/overview.md | 两条路由保留,各计一次;正文只归纳一次 |
providers/overview | providers/overview.md | Provider 热门目录 |
chat 与 chat/index | 相同正文 | 两条 source 保留;知识只归纳一次 |
embeddings 与 embeddings/index | 相同正文 | 两条 source 保留;知识只归纳一次 |
llms 与 llms/index | 相同正文 | 两条 source 保留;知识只归纳一次 |
providers/all_providers | 全组件目录 | 用于发现,不复制整站清单 |
因此 source 覆盖仍是 77 个原始 URL,不因重定向或同正文别名减少,也不把同一正文重复写成两份知识。
三种模型抽象
| 抽象 | 输入 / 输出 | 适合场景 | 主要能力边界 |
|---|---|---|---|
| Chat Model | message 序列 → AIMessage | agent、对话、工具、结构化提取、多模态 | wrapper 标记支持不代表每个模型都支持 |
| Embeddings | 文本 → 定长向量 | 语义检索、聚类、RAG 索引 | 查询与文档可能采用不同策略;无多模态 embedding |
| LLM | string → string | 既有 instruct/completion 系统 | 不应作为新 tool-calling 或多模态架构的默认入口 |
Chat wrapper 接受字符串时会把它转换为 human message;LLM wrapper 接受 messages 时会先格式化成字符串。这种“接口兼容”不能抹平底层语义差异:角色、tool call、content blocks 和 usage metadata 在 LLM 路径上可能丢失或降级。
安装与初始化基线
官方集成通常拆成 @langchain/core 加独立 provider 包:
import { ChatOpenAI } from "@langchain/openai";
const model = new ChatOpenAI({
model: process.env.MODEL_ID,
temperature: 0,
maxRetries: 2,
});
生产代码还应显式配置超时、取消信号、并发限制和 provider-specific endpoint。不要把文档示例中的模型名当长期默认值;模型 ID、区域、API version 与部署名应进入受控配置,并在发布时验证。
能力矩阵的正确读法
文档的 chat feature table 记录 wrapper 层的 tool calling、structured output、图片/音频/视频输入、token streaming、usage 与 logprobs。使用时要再过三道门:
- provider wrapper 是否实现;
- 目标模型与端点是否开放;
- 当前 npm 包版本和运行时是否支持。
例如 Bedrock 文档明确提醒并非所有 Bedrock 模型支持工具;OpenRouter 会因上游路由变化而改变实际能力;OpenAI 页面顶层矩阵与后续音频章节存在模型级差异。上线前应以固定模型 ID 做真实 capability smoke,而不是只相信目录上的勾选。
Embedding 不变量
- 同一索引的 provider、模型、维度、归一化与 query/document task type 必须固定;任一项变化都应视为新索引并重建,不能原地混写。
- 相似度函数要与模型输出和 vector store 配置匹配;常见选择为 cosine、Euclidean 或 dot product。
CacheBackedEmbeddings用文本哈希做 key。必须给namespace,建议包含 provider、model、dimension 和预处理版本;query embedding 默认不缓存,需要显式 query store。- 批量大小受 provider 限制;对 429/5xx 做有界退避,对不可重试的输入错误直接失败,并保存失败批次以便恢复。
生产决策顺序
- 先确定数据驻留、合规、区域、网络出口和预算,再选 provider。
- 需要工具、结构化输出或多模态时,从 Chat Model 候选中筛选;不要从 legacy LLM 开始。
- 固定 package version、模型 ID、endpoint/API version、能力 smoke 与回滚模型。
- 凭据只由服务端 secret manager 或云身份注入;浏览器 bundle 不得包含长期 API key 或 service-account JSON。
- 工具执行与代码执行在模型之外做授权、参数校验、超时、资源配额、审计和幂等控制。
- streaming 必须支持 client disconnect/abort,并在最终 chunk 或响应 metadata 汇总 usage;不能因流中断把半成品当成功。
- structured output 仍需应用侧 schema 验证;provider 的 strict 模式不是业务规则验证。
- 记录 provider、model、region、request id、latency、retry、finish reason、usage 与错误类别;日志不记录 prompt、凭据或敏感附件原文。
本组覆盖
本笔记覆盖 9 条 index/overview 路由;其余 68 条组件路由在同目录其余 7 篇笔记中各出现一次。