学习笔记 · Obsidian

模型与 Provider 选型总览

LangChainTypeScript

结论

  • 新应用默认选 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 正文处理方式
providers307 到 providers/overview.md两条路由保留,各计一次;正文只归纳一次
providers/overviewproviders/overview.mdProvider 热门目录
chat 与 chat/index相同正文两条 source 保留;知识只归纳一次
embeddings 与 embeddings/index相同正文两条 source 保留;知识只归纳一次
llms 与 llms/index相同正文两条 source 保留;知识只归纳一次
providers/all_providers全组件目录用于发现,不复制整站清单

因此 source 覆盖仍是 77 个原始 URL,不因重定向或同正文别名减少,也不把同一正文重复写成两份知识。

三种模型抽象

抽象输入 / 输出适合场景主要能力边界
Chat Modelmessage 序列 → AIMessageagent、对话、工具、结构化提取、多模态wrapper 标记支持不代表每个模型都支持
Embeddings文本 → 定长向量语义检索、聚类、RAG 索引查询与文档可能采用不同策略;无多模态 embedding
LLMstring → 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。使用时要再过三道门:

  1. provider wrapper 是否实现;
  2. 目标模型与端点是否开放;
  3. 当前 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 做有界退避,对不可重试的输入错误直接失败,并保存失败批次以便恢复。

生产决策顺序

  1. 先确定数据驻留、合规、区域、网络出口和预算,再选 provider。
  2. 需要工具、结构化输出或多模态时,从 Chat Model 候选中筛选;不要从 legacy LLM 开始。
  3. 固定 package version、模型 ID、endpoint/API version、能力 smoke 与回滚模型。
  4. 凭据只由服务端 secret manager 或云身份注入;浏览器 bundle 不得包含长期 API key 或 service-account JSON。
  5. 工具执行与代码执行在模型之外做授权、参数校验、超时、资源配额、审计和幂等控制。
  6. streaming 必须支持 client disconnect/abort,并在最终 chunk 或响应 metadata 汇总 usage;不能因流中断把半成品当成功。
  7. structured output 仍需应用侧 schema 验证;provider 的 strict 模式不是业务规则验证。
  8. 记录 provider、model、region、request id、latency、retry、finish reason、usage 与错误类别;日志不记录 prompt、凭据或敏感附件原文。

本组覆盖

本笔记覆盖 9 条 index/overview 路由;其余 68 条组件路由在同目录其余 7 篇笔记中各出现一次。