这篇适合谁,读完能做到什么
适合会写一点 Python、想让同一套代码切换不同大模型厂商的开发者。读完你应该能用 init_chat_model 初始化一个聊天模型,会用 invoke、stream 和 batch 三种方式调用它,并知道怎么给它绑定工具、约束输出格式、限制请求速率,以及接入 vLLM 等自部署的 OpenAI 兼容服务。
LangChain 的模型层是什么
LangChain 把各家厂商的聊天模型放在同一套标准接口后面。每个厂商的集成包都实现这套接口,并把模型名直接交给厂商的 API,所以新模型名不需要等 LangChain 升级,换厂商时业务代码的改动也小[1]。
在智能体(agent)里,模型是推理引擎:它决定调用哪个工具、怎么理解工具返回的结果,以及什么时候给出最终回答[1]。模型也可以脱离智能体单独调用,用于文本生成、分类或信息抽取[1]。
怎么初始化模型
最省事的办法是用 init_chat_model[1]。参数以关键字参数的形式传入:
model = init_chat_model(
"claude-sonnet-4-6",
# Kwargs passed to the model:
temperature=0.7,
timeout=30,
max_tokens=1000,
max_retries=6, # Default; increase for unreliable networks
)model 参数可以只写模型名,也可以写成「厂商:模型名」,例如 openai:o1[1]。temperature 决定随机性,数值越高回答越有创造性,越低越确定[1]。max_tokens 限制回复的总 token 数,相当于控制输出长度[1]。timeout 是等待模型回复的最长秒数,超过就取消这次请求[1]。
网络不稳定时怎么调重试
max_retries 默认为 6[1]。遇到网络超时或限流等失败时,模型会用指数退避加随机抖动的方式重试。网络错误、429 限流和 5xx 服务端错误会被自动重试;401(未授权)、404 这类客户端错误则不重试[1]。
如果是长时间运行的智能体任务,网络又不稳定,可以把 max_retries 调到 10 到 15,同时配上检查点(checkpointer),让失败之后进度能保留下来[1]。
三种调用方式
invoke() 接收一条消息或一个消息列表,等模型生成完整回复后返回一个 AIMessage[1]。
stream() 逐块返回输出,每个块都是一个 AIMessageChunk,长回答用它可以边生成边显示[1]。把各个块用 + 累加起来,就得到完整的消息。写法是 full = chunk if full is None else full + chunk[1]。
batch() 一次提交多个请求,在客户端并行执行,适合批量处理互不相关的输入。它和 OpenAI、Anthropic 等厂商提供的批处理接口不是一回事[1]。如果希望每个结果一完成就拿到,可以用 batch_as_completed()。结果可能乱序,每条都带着输入的序号,方便对回原来的顺序[1]。想限制同时发出的请求数,就在 config 里设置 max_concurrency:
model.batch(
list_of_inputs,
config={
'max_concurrency': 5, # Limit to 5 parallel calls
}
)工具调用怎么接
工具调用也叫函数调用(function calling),两个说法通用[1]。先用 @tool 把一个普通的 Python 函数变成工具:
from langchain.tools import tool
@tool
def get_weather(location: str) -> str:
"""Get the weather at a location."""
return f"It's sunny in {location}."bind_tools 把工具绑到模型上,之后模型可以在需要时选择调用其中任何一个[1]。模型给出的是调用请求,真正执行工具的要自己写代码。在智能体之外使用模型时,你要执行被请求的工具,再把结果交回模型,每个 ToolMessage 都带着与原调用匹配的 tool_call_id[1]。最基本的循环如下:
# Bind (potentially multiple) tools to the model
tools = [get_weather]
tools_by_name = {tool.name: tool for tool in tools}
model_with_tools = model.bind_tools(tools)
# Step 1: Model generates tool calls
messages = [{"role": "user", "content": "What's the weather in Boston?"}]
ai_msg = model_with_tools.invoke(messages)
messages.append(ai_msg)
# Step 2: Execute tools and collect results
for tool_call in ai_msg.tool_calls:
# Execute the tool with the generated arguments
tool = tools_by_name[tool_call["name"]]
tool_result = tool.invoke(tool_call)
messages.append(tool_result)
# Step 3: Pass results back to model for final response
final_response = model_with_tools.invoke(messages)
print(final_response.text)大多数支持工具调用的模型默认会并行调用多个工具。OpenAI 和 Anthropic 允许关闭这一点,在 bind_tools 中传入 parallel_tool_calls=False 即可[1]。
结构化输出怎么定义
with_structured_output() 可以把输出约束成某种结构,结构可以是 Pydantic 模型、TypedDict 或 JSON Schema。Pydantic 会自动校验字段,TypedDict 和 JSON Schema 则需要自己校验[1]。下面的例子用 Pydantic 定义一部电影的字段:
from pydantic import BaseModel, Field
class Movie(BaseModel):
"""A movie with details."""
title: str = Field(description="The title of the movie")
year: int = Field(description="The year the movie was released")
director: str = Field(description="The director of the movie")
rating: float = Field(description="The movie's rating out of 10")
model_with_structure = model.with_structured_output(Movie)
response = model_with_structure.invoke("Provide details about the movie Inception")method 参数可以取 'json_schema' 等值。'json_mode' 只保证输出是合法的 JSON,结构要写在提示词里[1]。传入 include_raw=True 后,结果里还会有原始的 AIMessage,其中包含 token 数等元数据[1]。
常见报错:模型拒绝回答
厂商遇到拒绝回答的情况时,通常把它当成一次成功的响应返回。with_structured_output 默认会抛出 ModelRefusalError。如果设置了 include_raw=True,错误会放在 parsing_error 里返回,不再直接抛出[1]。
限流怎么配
很多厂商会限制单位时间内的请求数。InMemoryRateLimiter 可以在本地控制请求节奏,它在同一进程内是线程安全的,可以通过 rate_limiter 参数传给模型[1]。下面的配置表示每 10 秒放行一次请求,突发最多 10 个:
from langchain.rate_limiters import InMemoryRateLimiter
rate_limiter = InMemoryRateLimiter(
requests_per_second=0.1, # 1 request every 10s
check_every_n_seconds=0.1, # Check every 100ms whether allowed to make a request
max_bucket_size=10, # Controls the maximum burst size.
)注意这个限流器只按单位时间内的请求数计算。如果厂商的限制还和请求大小有关,它帮不上忙[1]。
接入 vLLM 等 OpenAI 兼容服务
Together AI、vLLM 等服务提供 OpenAI 兼容的接口。接入时用 model_provider="openai",再加上对应的 base_url 和 api_key[1]:
model = init_chat_model(
model="MODEL_NAME",
model_provider="openai",
base_url="BASE_URL",
api_key="YOUR_API_KEY",
)要留意的是,model_provider="openai" 对应的是 OpenAI 官方 API 规范。经过路由或代理时,厂商特有的字段可能取不到,也可能被丢掉。OpenRouter 和 LiteLLM 各自有专用集成,建议优先使用它们[1]。
下一步
想查每个厂商支持的完整参数,可以去官方文档的模型页面查看[1]。
本文改编自 LangChain 官方文档中的「Models」页面[1],原文以 MIT 许可证发布。
来源
- 1ModelsLangChain docs (MIT)
引用本页: LangChain 接入各家模型. TellWorld, https://www.tellworld.net/zh/practice/practice-langchain-models. 更新于 2026-11-14