LLMs 是强大的 AI 工具,可以像人类一样解释和生成文本。它们功能多样,可以撰写内容、翻译语言、总结和回答问题,而无需为每个任务进行专门的训练。
除了文本生成,许多模型还支持:
工具调用 -
调用外部工具(如数据库查询或 API 调用)并在其响应中使用结果。
结构化输出 -
模型的响应被约束为遵循定义的格式。
多模态 -
处理和返回文本以外的数据,如图像、音频和视频。
推理 -
模型执行多步推理以得出结论。
模型是智能体 的推理引擎。它们驱动智能体的决策过程,决定调用哪些工具、如何解释结果以及何时提供最终答案。
您选择的模型的质量和能力直接影响您智能体的基线可靠性和性能。不同的模型擅长不同的任务——有些更擅长遵循复杂的指令,有些更擅长结构化推理,有些则支持更大的上下文窗口来处理更多信息。
LangChain 的标准模型接口让您能够访问许多不同的提供商集成,这使得在模型之间进行实验和切换变得容易,从而为您的用例找到最佳匹配。
有关特定提供商的集成信息和功能,请参阅提供商的聊天模型页面 。
基本用法
模型可以通过两种方式使用:
与智能体一起使用 - 在创建智能体 时可以动态指定模型。
独立使用 - 可以直接调用模型(在智能体循环之外),用于文本生成、分类或提取等任务,而无需智能体框架。
相同的模型接口在两种上下文中都有效,这为您提供了灵活性,可以从简单开始,并根据需要扩展到更复杂的基于智能体的工作流。
初始化模型
在 LangChain 中开始使用独立模型的最简单方法是使用 initChatModel 从您选择的聊天模型提供商 初始化一个模型(示例如下):
OpenAI
Anthropic
Azure
Google Gemini
Bedrock Converse
👉 阅读 OpenAI 聊天模型集成文档 npm install @langchain/openai
import { initChatModel } from "langchain" ;
process . env . OPENAI_API_KEY = "your-api-key" ;
const model = await initChatModel ( "gpt-5.2" ) ;
👉 阅读 Anthropic 聊天模型集成文档 npm install @langchain/anthropic
import { initChatModel } from "langchain" ;
process . env . ANTHROPIC_API_KEY = "your-api-key" ;
const model = await initChatModel ( "claude-sonnet-4-6" ) ;
👉 阅读 Azure 聊天模型集成文档 npm install @langchain/azure
import { initChatModel } from "langchain" ;
process . env . AZURE_OPENAI_API_KEY = "your-api-key" ;
process . env . AZURE_OPENAI_ENDPOINT = "your-endpoint" ;
process . env . OPENAI_API_VERSION = "your-api-version" ;
const model = await initChatModel ( "azure_openai:gpt-5.2" ) ;
👉 阅读 Google GenAI 聊天模型集成文档 npm install @langchain/google-genai
import { initChatModel } from "langchain" ;
process . env . GOOGLE_API_KEY = "your-api-key" ;
const model = await initChatModel ( "google-genai:gemini-2.5-flash-lite" ) ;
👉 阅读 AWS Bedrock 聊天模型集成文档 npm install @langchain/aws
import { initChatModel } from "langchain" ;
// 按照此处步骤配置您的凭据:
// https://docs.aws.amazon.com/bedrock/latest/userguide/getting-started.html
const model = await initChatModel ( "bedrock:gpt-5.2" ) ;
typescript const response = await model.invoke("为什么鹦鹉会说话?");
有关更多详细信息,包括如何传递模型参数 的信息,请参阅
initChatModel 。
支持的提供商和模型
LangChain 通过专用的集成包支持所有主要的模型提供商。每个提供商包都实现了相同的标准接口,因此您可以在不重写应用程序逻辑的情况下交换提供商。新的模型名称可以立即使用——无需更新 LangChain——因为提供商包会将模型名称直接传递给提供商的 API。
浏览支持的提供商完整列表 ,或参阅提供商和模型 以获取关于提供商、包和模型名称如何在 LangChain 中协同工作的概念性概述。
关键方法
调用 模型将消息作为输入,并在生成完整响应后输出消息。
批处理 以批处理方式向模型发送多个请求,以实现更高效的处理。
除了聊天模型,LangChain
还提供对其他相邻技术的支持,例如嵌入模型和向量存储。有关详细信息,请参阅集成页面 。
聊天模型接受可用于配置其行为的参数。支持的完整参数集因模型和提供商而异,但标准参数包括:
您希望与提供商一起使用的特定模型的名称或标识符。您也可以使用 ’
:’ 格式在单个参数中同时指定模型及其提供商,例如 ‘openai:o1’。
用于向模型提供商进行身份验证所需的密钥。这通常在您注册访问模型时颁发。通常通过设置 环境变量 来访问。
控制模型输出的随机性。较高的数字会使响应更具创造性;较低的数字则使其更具确定性。
在取消请求之前等待模型响应的最长时间(以秒为单位)。
如果请求因网络超时或速率限制等问题失败,系统将重新发送请求的最大尝试次数。重试使用带有抖动的指数退避。网络错误、速率限制(429)和服务器错误(5xx)会自动重试。客户端错误(如
401(未授权)或
404)不会重试。对于在不可靠网络上运行的长时间智能体 任务,建议将此值增加到
10-15。
使用 initChatModel 时,以内联参数的形式传递这些参数:
const model = await initChatModel ( "claude-sonnet-4-6" , {
temperature : 0.7 ,
timeout : 30 ,
maxTokens : 1000 ,
maxRetries : 6 ,
} ) ;
每个聊天模型集成可能都有额外的参数用于控制特定于提供商的功能。 例如,ChatOpenAI 有 use_responses_api 来决定是使用 OpenAI Responses API 还是 Completions API。 要查找给定聊天模型支持的所有参数,请访问聊天模型集成 页面。
必须调用聊天模型才能生成输出。有三种主要的调用方法,每种方法适用于不同的用例。
调用模型最直接的方法是使用 invoke() 并传递单个消息或消息列表。
const response = await model . invoke ( "为什么鹦鹉有彩色的羽毛?" ) ;
console . log (response) ;
可以向聊天模型提供消息列表以表示对话历史。每条消息都有一个角色,模型使用该角色来指示对话中谁发送了消息。
有关角色、类型和内容的更多详细信息,请参阅消息 指南。
const conversation = [
{ role : "system" , content : "您是一个将英语翻译成法语的有用助手。" },
{ role : "user" , content : "翻译:我喜欢编程。" },
{ role : "assistant" , content : "J'adore la programmation." },
{ role : "user" , content : "翻译:我喜欢构建应用程序。" },
] ;
const response = await model . invoke (conversation) ;
console . log (response) ; // AIMessage("J'adore créer des applications.")
import { HumanMessage , AIMessage , SystemMessage } from "langchain" ;
const conversation = [
new SystemMessage ( "您是一个将英语翻译成法语的有用助手。" ) ,
new HumanMessage ( "翻译:我喜欢编程。" ) ,
new AIMessage ( "J'adore la programmation." ) ,
new HumanMessage ( "翻译:我喜欢构建应用程序。" ) ,
] ;
const response = await model . invoke (conversation) ;
console . log (response) ; // AIMessage("J'adore créer des applications.")
如果您的调用返回类型是字符串,请确保您使用的是聊天模型而不是
LLM。传统的文本完成 LLM 会直接返回字符串。LangChain 聊天模型以 “Chat”
为前缀,例如
ChatOpenAI (/oss/integrations/chat/openai)。
流式传输
大多数模型可以在生成输出内容时进行流式传输。通过逐步显示输出,流式传输可以显著改善用户体验,特别是对于较长的响应。
调用 stream() 会返回一个迭代器 ,该迭代器在生成输出块时产生它们。您可以使用循环实时处理每个块:
const stream = await model . stream ( "为什么鹦鹉有彩色的羽毛?" ) ;
for await ( const chunk of stream) {
console . log (chunk . text)
}
与 invoke() (在模型完成生成完整响应后返回单个 AIMessage )不同,stream() 返回多个 AIMessageChunk 对象,每个对象包含输出文本的一部分。重要的是,流中的每个块都设计为通过求和聚合为完整消息:
let full : AIMessageChunk | null = null ;
for await ( const chunk of stream) {
full = full ? full . concat (chunk) : chunk ;
console . log (full . text) ;
}
// 天空
// 天空是
// 天空通常是
// 天空通常是蓝色的
// ...
console . log (full . contentBlocks) ;
// [{"type": "text", "text": "天空通常是蓝色的..."}]
生成的消息可以与使用 invoke() 生成的消息相同对待——例如,它可以聚合到消息历史中并作为对话上下文传回模型。
流式传输仅在程序的所有步骤都知道如何处理块流时才有效。例如,一个不具备流式传输能力的应用程序需要在内存中存储整个输出才能进行处理。
LangChain 聊天模型还可以使用 [streamEvents()][BaseChatModel.streamEvents] 流式传输语义事件。 这简化了基于事件类型和其他元数据的过滤,并会在后台聚合完整消息。示例如下。 const stream = await model . streamEvents ( "Hello" ) ;
for await ( const event of stream) {
if (event . event === "on_chat_model_start" ) {
console . log ( `输入: ${ event . data . input } ` ) ;
}
if (event . event === "on_chat_model_stream" ) {
console . log ( `令牌: ${ event . data . chunk . text } ` ) ;
}
if (event . event === "on_chat_model_end" ) {
console . log ( `完整消息: ${ event . data . output . text } ` ) ;
}
}
输入: Hello
令牌: Hi
令牌: there
令牌: !
令牌: How
令牌: can
令牌: I
...
完整消息: Hi there! How can I help today?
有关事件类型和其他详细信息,请参阅 streamEvents() 参考。
LangChain 通过自动启用流式传输模式来简化从聊天模型的流式传输,即使您没有显式调用流式传输方法。当您使用非流式调用方法但仍希望流式传输整个应用程序(包括来自聊天模型的中间结果)时,这尤其有用。 在 LangGraph 智能体 中,例如,您可以在节点内调用 model.invoke(),但如果在流式传输模式下运行,LangChain 会自动委托给流式传输。 工作原理 当您 invoke() 一个聊天模型时,如果 LangChain 检测到您正在尝试流式传输整个应用程序,它会自动切换到内部流式传输模式。调用的结果对于使用调用的代码来说是相同的;但是,在聊天模型被流式传输时,LangChain 会负责在 LangChain 的回调系统中调用 on_llm_new_token 事件。 回调事件允许 LangGraph stream() 和 streamEvents() 实时显示聊天模型的输出。
批处理
将独立请求的集合批处理到模型可以显著提高性能并降低成本,因为处理可以并行完成:
const responses = await model . batch ([
"为什么鹦鹉有彩色的羽毛?" ,
"飞机如何飞行?" ,
"什么是量子计算?" ,
"为什么鹦鹉有彩色的羽毛?" ,
"飞机如何飞行?" ,
"什么是量子计算?" ,
]) ;
for ( const response of responses) {
console . log (response) ;
}
使用 batch() 处理大量输入时,您可能希望控制最大并行调用数。这可以通过在 RunnableConfig 字典中设置 maxConcurrency 属性来完成。 model . batch (
listOfInputs ,
{
maxConcurrency : 5 , // 限制为 5 个并行调用
}
)
有关支持的属性的完整列表,请参阅 RunnableConfig 参考。
有关批处理的更多详细信息,请参阅参考 。
工具调用
模型可以请求调用执行任务的工具,例如从数据库获取数据、搜索网络或运行代码。工具是以下内容的配对:
一个模式,包括工具的名称、描述和/或参数定义(通常是一个 JSON 模式)
一个函数或协程 来执行。
您可能会听到“函数调用”这个术语。我们将其与“工具调用”互换使用。
以下是用户和模型之间的基本工具调用流程:
要使您定义的工具可供模型使用,必须使用 bindTools 将它们绑定。在后续调用中,模型可以根据需要选择调用任何绑定的工具。
一些模型提供商提供内置工具 ,可以通过模型或调用参数启用(例如 ChatOpenAI , ChatAnthropic )。有关详细信息,请查看相应的提供商参考 。
有关创建工具的详细信息和其他选项,请参阅工具指南 。
import { tool } from "langchain" ;
import * as z from "zod" ;
import { ChatOpenAI } from "@langchain/openai" ;
const getWeather = tool ( ( input ) => `在 ${ input . location } 是晴天。` , {
name : "get_weather" ,
description : "获取某个位置的天气。" ,
schema : z . object ( {
location : z . string () . describe ( "要获取天气的位置" ) ,
} ) ,
} ) ;
const model = new ChatOpenAI ( { model : "gpt-4.1" } ) ;
const modelWithTools = model . bindTools ([getWeather]) ;
const response = await modelWithTools . invoke ( "波士顿的天气怎么样?" ) ;
const toolCalls = response . tool_calls || [] ;
for ( const tool_call of toolCalls) {
// 查看模型进行的工具调用
console . log ( `工具: ${ tool_call . name } ` ) ;
console . log ( `参数: ${ tool_call . args } ` ) ;
}
当绑定用户定义的工具时,模型的响应包含一个执行工具的请求 。当在智能体 之外单独使用模型时,由您来执行请求的工具并将结果返回给模型以供后续推理使用。当使用智能体 时,智能体循环将为您处理工具执行循环。
下面,我们展示了一些使用工具调用的常见方法。
当模型返回工具调用时,您需要执行工具并将结果传回模型。这会创建一个对话循环,模型可以使用工具结果来生成其最终响应。LangChain 包括智能体 抽象来为您处理此编排。 以下是执行此操作的简单示例: // 将(可能多个)工具绑定到模型
const modelWithTools = model . bindTools ([get_weather])
// 步骤 1:模型生成工具调用
const messages = [ { "role" : "user" , "content" : "波士顿的天气怎么样?" } ]
const ai_msg = await modelWithTools . invoke (messages)
messages . push (ai_msg)
// 步骤 2:执行工具并收集结果
for ( const tool_call of ai_msg . tool_calls) {
// 使用生成的参数执行工具
const tool_result = await get_weather . invoke (tool_call)
messages . push (tool_result)
}
// 步骤 3:将结果传回模型以获取最终响应
const final_response = await modelWithTools . invoke (messages)
console . log (final_response . text)
// "波士顿当前天气是 72°F 且晴朗。"
工具返回的每个 ToolMessage 都包含一个与原始工具调用匹配的 tool_call_id,帮助模型将结果与请求关联起来。
当流式传输响应时,工具调用通过 ToolCallChunk 逐步构建。这允许您在工具调用生成时查看它们,而不是等待完整响应。 const stream = await modelWithTools . stream (
"波士顿和东京的天气怎么样?"
)
for await ( const chunk of stream) {
// 工具调用块逐步到达
if (chunk . tool_call_chunks) {
for ( const tool_chunk of chunk . tool_call_chunks) {
console . log ( `工具: ${ tool_chunk . get ( 'name' , '' ) } ` )
console . log ( `参数: ${ tool_chunk . get ( 'args' , '' ) } ` )
}
}
}
// 输出:
// 工具: get_weather
// 参数:
// 工具:
// 参数: {"loc
// 工具:
// 参数: ation": "BOS"}
// 工具: get_time
// 参数:
// 工具:
// 参数: {"timezone": "Tokyo"}
您可以累积块以构建完整的工具调用: let full : AIMessageChunk | null = null
const stream = await modelWithTools . stream ( "波士顿的天气怎么样?" )
for await ( const chunk of stream) {
full = full ? full . concat (chunk) : chunk
console . log (full . contentBlocks)
}
结构化输出
可以请求模型以匹配给定模式的格式提供其响应。这对于确保输出可以轻松解析并在后续处理中使用非常有用。LangChain 支持多种模式类型和强制结构化输出的方法。
zod 模式 是定义输出模式的首选方法。请注意,当提供 zod 模式时,模型输出也将使用 zod 的解析方法根据模式进行验证。import * as z from "zod" ;
const Movie = z . object ( {
title : z . string () . describe ( "电影标题" ) ,
year : z . number () . describe ( "电影发行年份" ) ,
director : z . string () . describe ( "电影导演" ) ,
rating : z . number () . describe ( "电影评分(满分10分)" ) ,
} ) ;
const modelWithStructure = model . withStructuredOutput (Movie) ;
const response = await modelWithStructure . invoke ( "提供电影《盗梦空间》的详细信息" ) ;
console . log (response) ;
// {
// title: "Inception",
// year: 2010,
// director: "Christopher Nolan",
// rating: 8.8,
// }
为了获得最大控制权或互操作性,您可以提供原始 JSON Schema。 const jsonSchema = {
"title" : "Movie" ,
"description" : "一部包含详细信息的电影" ,
"type" : "object" ,
"properties" : {
"title" : {
"type" : "string" ,
"description" : "电影标题" ,
},
"year" : {
"type" : "integer" ,
"description" : "电影发行年份" ,
},
"director" : {
"type" : "string" ,
"description" : "电影导演" ,
},
"rating" : {
"type" : "number" ,
"description" : "电影评分(满分10分)" ,
},
},
"required" : [ "title" , "year" , "director" , "rating" ] ,
}
const modelWithStructure = model . withStructuredOutput (
jsonSchema ,
{ method : "jsonSchema" },
)
const response = await modelWithStructure . invoke ( "提供电影《盗梦空间》的详细信息" )
console . log (response) // {'title': 'Inception', 'year': 2010, ...}
任何实现标准模式 规范的库中的模式也受支持。标准模式对象在运行时通过模式的 ~standard.validate() 方法进行验证。 import * as v from "valibot" ;
import { toStandardJsonSchema } from "@valibot/to-json-schema" ;
const Movie = toStandardJsonSchema (
v . object ( {
title : v . pipe (v . string () , v . description ( "电影标题" )) ,
year : v . pipe (v . number () , v . description ( "电影发行年份" )) ,
director : v . pipe (v . string () , v . description ( "电影导演" )) ,
rating : v . pipe (v . number () , v . description ( "电影评分(满分10分)" )) ,
} )
) ;
const modelWithStructure = model . withStructuredOutput (Movie) ;
const response = await modelWithStructure . invoke ( "提供电影《盗梦空间》的详细信息" ) ;
console . log (response) ;
// {
// title: "Inception",
// year: 2010,
// director: "Christopher Nolan",
// rating: 8.8,
// }
结构化输出的关键考虑因素:
方法参数 :一些提供商支持不同的方法('jsonSchema', 'functionCalling', 'jsonMode')
包含原始数据 :使用 includeRaw: true 以获取解析后的输出和原始的 AIMessage
验证 :Zod 和标准模式对象提供自动验证,而 JSON Schema 需要手动验证
标准模式 :任何实现标准模式 规范的模式库都受支持并在运行时验证
有关支持的方法和配置选项,请参阅您的提供商集成页面 。
返回原始的 AIMessage 对象以及解析后的表示形式可能很有用,以便访问响应元数据,例如令牌计数 。为此,在调用 with_structured_output 时设置 include_raw=True : import * as z from "zod" ;
const Movie = z . object ( {
title : z . string () . describe ( "电影标题" ) ,
year : z . number () . describe ( "电影发行年份" ) ,
director : z . string () . describe ( "电影导演" ) ,
rating : z . number () . describe ( "电影评分(满分10分)" ) ,
title : z . string () . describe ( "电影标题" ) ,
year : z . number () . describe ( "电影发行年份" ) ,
director : z . string () . describe ( "电影导演" ) ,
rating : z . number () . describe ( "电影评分(满分10分)" ) ,
} ) ;
const modelWithStructure = model . withStructuredOutput (Movie , { includeRaw : true } ) ;
const response = await modelWithStructure . invoke ( "提供电影《盗梦空间》的详细信息" ) ;
console . log (response) ;
// {
// raw: AIMessage { ... },
// parsed: { title: "Inception", ... }
// }
模式可以嵌套: import * as z from "zod" ;
const Actor = z . object ( {
name : str
role: z . string () ,
} ) ;
const MovieDetails = z . object ( {
title : z . string () ,
year : z . number () ,
cast : z . array (Actor) ,
genres : z . array (z . string ()) ,
budget : z . number () . nullable () . describe ( "预算(百万美元)" ) ,
} ) ;
const modelWithStructure = model . withStructuredOutput (MovieDetails) ;
高级主题
模型配置文件
LangChain 聊天模型可以通过 profile 属性公开支持的功能和能力的字典:
model . profile ;
// {
// maxInputTokens: 400000,
// imageInputs: true,
// reasoningOutput: true,
// toolCalling: true,
// ...
// }
请参阅 API 参考 中的完整字段集。
许多模型配置文件数据由 models.dev 项目提供,这是一个提供模型能力数据的开源计划。这些数据使用 LangChain 的附加字段进行了增强。这些增强与上游项目的发展保持一致。
模型配置文件数据允许应用程序动态地处理模型能力。例如:
摘要中间件 可以根据模型的上下文窗口大小触发摘要。
createAgent 中的结构化输出 策略可以自动推断(例如,通过检查对原生结构化输出功能的支持)。
模型输入可以根据支持的模态 和最大输入令牌数进行限制。
Deep Agents CLI 过滤交互式模型切换器 以显示其配置文件报告支持 tool_calling 和文本 I/O 的模型,并在选择器详细视图中显示上下文窗口大小和功能标志。
模型配置文件是测试版功能。配置文件的格式可能会更改。
多模态
某些模型可以处理和返回非文本数据,如图像、音频和视频。您可以通过提供内容块 将非文本数据传递给模型。
所有具有底层多模态功能的 LangChain 聊天模型都支持:
跨提供商标准格式的数据(请参阅我们的消息指南 )
OpenAI 聊天补全 格式
特定于该提供商的任何原生格式(例如,Anthropic 模型接受 Anthropic 原生格式)
有关详细信息,请参阅消息指南的多模态部分 。
某些模型
可以在其响应中返回多模态数据。如果被调用这样做,生成的
AIMessage
将包含具有多模态类型的内容块。
const response = await model . invoke ( "创建一张猫的图片" ) ;
console . log (response . contentBlocks) ;
// [
// { type: "text", text: "这是一张猫的图片" },
// { type: "image", data: "...", mimeType: "image/jpeg" },
// ]
有关特定提供商的详细信息,请参阅集成页面 。
许多模型能够执行多步推理以得出结论。这涉及将复杂问题分解为更小、更易管理的步骤。
**如果底层模型支持,**您可以展示此推理过程,以更好地了解模型如何得出最终答案。
const stream = model . stream ( "为什么鹦鹉有彩色的羽毛?" ) ;
for await ( const chunk of stream) {
const reasoningSteps = chunk . contentBlocks . filter ( b => b . type === "reasoning" ) ;
console . log (reasoningSteps . length > 0 ? reasoningSteps : chunk . text) ;
}
根据模型的不同,您有时可以指定其应投入推理的力度。同样,您可以请求模型完全关闭推理。这可能采用分类的推理“层级”(例如 'low' 或 'high')或整数令牌预算的形式。
有关详细信息,请参阅您的相应聊天模型的集成页面 或参考 。
本地模型
LangChain 支持在您自己的硬件上本地运行模型。这在数据隐私至关重要、您想调用自定义模型或希望避免使用基于云的模型时产生的成本等情况下非常有用。
Ollama 是在本地运行聊天和嵌入模型的最简单方法之一。
提示缓存
许多提供商提供提示缓存功能,以减少对相同令牌重复处理的延迟和成本。这些功能可以是隐式 或显式 的:
隐式提示缓存 :如果请求命中缓存,提供商将自动传递成本节省。示例:OpenAI 和 Gemini 。
显式缓存 :提供商允许您手动指示缓存点以获得更大的控制权或保证成本节省。示例:
提示缓存通常仅在超过最小输入令牌阈值时才启用。有关详细信息,请参阅提供商页面 。
缓存使用情况将反映在模型响应的使用元数据 中。
服务器端工具使用
一些提供商支持服务器端工具调用 循环:模型可以与网络搜索、代码解释器和其他工具交互,并在单个对话回合中分析结果。
如果模型在服务器端调用工具,响应消息的内容将包含表示工具调用和结果的内容。访问响应的内容块 将返回服务器端工具调用和结果,格式与提供商无关:
import { initChatModel } from "langchain" ;
const model = await initChatModel ( "gpt-4.1-mini" ) ;
const modelWithTools = model . bindTools ([ { type : "web_search" } ]) ;
const message = await modelWithTools . invoke ( "今天有什么积极的新闻故事?" ) ;
console . log (message . contentBlocks) ;
这代表一个对话回合;没有需要传入的关联 ToolMessage 对象,就像在客户端工具调用 中那样。
有关可用工具和使用详细信息,请参阅您给定提供商的集成页面 。
基础 URL 和代理设置
您可以为实现 OpenAI 聊天补全 API 的提供商配置自定义基础 URL。
model_provider="openai"(或直接使用 ChatOpenAI)以官方 OpenAI API 规范为目标。来自路由器和代理的特定于提供商的字段可能无法提取或保留。对于 OpenRouter 和 LiteLLM,建议使用专用集成:
许多模型提供商提供与 OpenAI 兼容的 API(例如,Together AI , vLLM )。您可以通过指定适当的 base_url 参数将 initChatModel 与这些提供商一起使用: model = initChatModel (
"MODEL_NAME" ,
{
modelProvider : "openai" ,
baseUrl : "BASE_URL" ,
apiKey : "YOUR_API_KEY" ,
}
)
当使用直接聊天模型类实例化时,参数名称可能因提供商而异。请查看相应的参考 以获取详细信息。
对数概率
某些模型可以通过在初始化模型时设置 logprobs 参数来配置为返回令牌级别的对数概率,该概率表示给定令牌的可能性:
const model = new ChatOpenAI ( {
model : "gpt-4.1" ,
logprobs : true ,
} ) ;
const responseMessage = await model . invoke ( "为什么鹦鹉会说话?" ) ;
responseMessage . response_metadata . logprobs . content . slice ( 0 , 5 ) ;
令牌使用情况
许多模型提供商在调用响应中返回令牌使用情况信息。如果可用,此信息将包含在相应模型生成的 AIMessage 对象上。有关更多详细信息,请参阅消息 指南。
调用配置
调用模型时,您可以使用 RunnableConfig 对象通过 config 参数传递附加配置。这提供了对执行行为、回调和元数据跟踪的运行时控制。
常见的配置选项包括:
const response = await model . invoke ( "讲个笑话" , {
runName : "joke_generation" , // 此运行的自定义名称
tags : [ "humor" , "demo" ] , // 用于分类的标签
metadata : { user_id : "123" }, // 自定义元数据
callbacks : [my_callback_handler] , // 回调处理程序
} ) ;
这些配置值在以下情况下特别有用:
使用 LangSmith 跟踪进行调试
实现自定义日志记录或监控
在生产中控制资源使用
跟踪复杂管道中的调用
由所有子调用继承的标签,用于调试工具中的过滤和组织。
用于跟踪附加上下文的自定义键值对,由所有子调用继承。