TellWorldAI 世界档案
问档案English

首页›实践›实践

实践

LangChain 接入各家模型

用 init_chat_model 统一初始化各家大模型,讲清参数、重试、三种调用方式、工具调用、结构化输出、限流,以及接入 vLLM 等 OpenAI 兼容服务。

这篇适合谁,读完能做到什么

适合会写一点 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 许可证发布。

来源

  1. 1
    ModelsLangChain docs (MIT)

引用本页: LangChain 接入各家模型. TellWorld, https://www.tellworld.net/zh/practice/practice-langchain-models. 更新于 2026-11-14

相关动态