LangChain 初始化模型的几种方法总结

佚名
后端
发表于 2026/07/09 09:30
🌺 摘要
LangChain 提供了多种初始化模型的方式。本文按 API → 入参解释 → 示例的结构逐一介绍,帮你快速选型。

LangChain 作为大模型应用的开发框架,模型初始化是第一步。面对多种初始化方式,很多开发者会感到困惑:该选哪种?有什么区别?

本文按 API → 入参解释 → 示例 的结构,按使用频率从高到低逐一介绍每种方法,帮你快速选型。


1. create_react_agent(字符串简写)

API 签名

from langchain.chat_models import init_chat_model

def init_chat_model(
    model: str,
    model_provider: str | None = None,
    **kwargs
) -> BaseChatModel

入参解释

参数类型必填说明
modelstr模型标识符,格式为 provider:model_name,如 "openai:gpt-4.1"
model_providerstr | None当模型名有歧义时指定提供商,如 "bedrock_converse"
**kwargsdict传递给模型构造函数的额外参数,如 temperaturemax_tokens

支持的模型标识符

openai:gpt-4.1
anthropic:claude-3-5-sonnet-latest
google_genai:gemini-2.0-flash
azure_openai:gpt-4.1
bedrock:anthropic.claude-3-5-sonnet-20240620-v1:0

示例

import os
from langchain.chat_models import init_chat_model

# 基础用法:一行代码搞定
os.environ["OPENAI_API_KEY"] = "sk-..."
llm = init_chat_model("openai:gpt-4.1")

# 指定参数
llm = init_chat_model("openai:gpt-4.1", temperature=0.7, max_tokens=2048)

# Azure OpenAI(需要额外配置)
os.environ["AZURE_OPENAI_API_KEY"] = "..."
os.environ["AZURE_OPENAI_ENDPOINT"] = "..."
llm = init_chat_model(
    "azure_openai:gpt-4.1",
    azure_deployment="my-deployment"
)

# AWS Bedrock(需要指定 model_provider)
llm = init_chat_model(
    "anthropic.claude-3-5-sonnet-20240620-v1:0",
    model_provider="bedrock_converse"
)

适用场景

  • 快速原型开发,不想纠结导入哪个类
  • 需要统一管理多个模型的配置
  • 初期开发阶段,后续可能需要切换模型提供商

2. init_chat_model

API 签名

from langchain_anthropic import ChatAnthropic
from langchain_openai import ChatOpenAI

class ChatAnthropic(BaseChatModel):
    def __init__(
        self,
        model: str = "claude-2.1",
        temperature: float = 0,
        max_tokens: int | None = None,
        max_retries: int = 5,
        parent_run_id: str | None = None,
        streaming: bool = False,
        api_key: str | None = None,
        base_url: str | None = None,
        client: Any | None = None,
        **kwargs: Any
    ) -> None:

class ChatOpenAI(BaseChatModel):
    def __init__(
        self,
        model: str = "gpt-4o-mini",
        temperature: float = 0,
        max_tokens: int | None = None,
        timeout: int | float | None = None,
        max_retries: int = 2,
        base_url: str | None = None,
        api_key: str | None = None,
        streaming: bool = False,
        **kwargs: Any
    ) -> None:

入参解释(通用参数)

参数类型必填说明
modelstr模型名称,默认使用厂商默认模型
temperaturefloat采样温度,0~1,越高越随机
max_tokensint最大输出 token 数
max_retriesint请求失败最大重试次数
streamingbool是否启用流式输出
api_keystrAPI 密钥,不传则从环境变量读取
base_urlstr自定义 API 端点 URL
timeoutint | float请求超时时间(秒,仅 OpenAI)

示例

from langchain_anthropic import ChatAnthropic
from langchain_openai import ChatOpenAI

# Anthropic:精细控制推理行为
claude = ChatAnthropic(
    model="claude-3-7-sonnet-latest",
    temperature=0,           # 确定性输出
    max_tokens=2048,         # 限制输出长度
    top_p=0.9,               # 核采样参数
)

# OpenAI:完整控制请求参数
gpt = ChatOpenAI(
    model="gpt-4o",
    temperature=0.7,         # 创造性输出
    max_tokens=4096,
    timeout=30,              # 30 秒超时
    max_retries=3,           # 失败重试 3 次
    base_url="https://your-proxy.com/v1",  # 自定义代理
)

# 使用自定义 API Key(不依赖环境变量)
llm = ChatOpenAI(
    model="gpt-4o",
    api_key="sk-your-key-here"
)

# 兼容 OpenAI API 的第三方服务(本地模型)
# Ollama / LM Studio / vLLM / LocalAI 等服务,只需改 base_url
llm = ChatOpenAI(
    model="llama-3.1",
    base_url="http://localhost:11434/v1",  # Ollama
    api_key="not-needed"
)

llm = ChatOpenAI(
    model="gpt-4o",
    base_url="http://localhost:8000/v1",   # vLLM / LM Studio
    api_key="fake-key"
)

适用场景

  • 需要完全控制模型底层参数
  • 使用特定厂商的高级功能
  • init_chat_model 尚未支持的模型
  • 本地部署的模型服务(Ollama、LM Studio、vLLM 等)
  • 生产环境调优,需要精确控制推理行为

3. ChatAnthropic / ChatOpenAI(直接实例化)

API 签名

from langgraph.prebuilt import create_react_agent

def create_react_agent(
    app_state: Any,
    model: str | BaseChatModel,  # ← 支持字符串或模型实例
    tools: list[Callable] | None = None,
    **kwargs
) -> Agent

入参解释

参数类型必填说明
app_stateAny智能体的状态管理对象(通常传配置字典)
modelstr | BaseChatModel模型名称字符串(如 "openai:gpt-4o")或已实例化的模型对象
toolslist[Callable]智能体可用的工具列表
**kwargsdict其他智能体配置参数

示例

from langgraph.prebuilt import create_react_agent
from langchain_core.tools import tool

@tool
def get_weather(city: str) -> str:
    """获取指定城市的天气"""
    return f"{city} 晴,25°C"

# 方式一:直接传字符串(最简写法,推荐)
agent = create_react_agent(
    state=None,
    model="anthropic:claude-3-7-sonnet-latest",
    tools=[get_weather]
)

# 方式二:显式实例化后传入(等价,代码更多)
from langchain_anthropic import ChatAnthropic
model = ChatAnthropic(model="claude-3-7-sonnet-latest")
agent = create_react_agent(
    state=None,
    model=model,
    tools=[get_weather]
)

# 调用智能体
result = agent.invoke({"messages": [{"role": "user", "content": "北京天气怎么样?"}]})
print(result["messages"][-1].content)

适用场景

  • 构建标准 ReAct 或对话型智能体
  • 快速搭建 Agent,不想写多余代码
  • 调试阶段快速迭代

4. 动态模型选择函数

API 签名

from typing import Callable
from langgraph.prebuilt import create_react_agent
from langgraph.prebuilt.chat_agent_executor import AgentState
from langgraph.runtime import Runtime
from langchain_core.language_models import BaseChatModel

# 选择函数签名
ModelSelector = Callable[[AgentState, Runtime], BaseChatModel]

def create_react_agent(
    app_state: Any,
    model: ModelSelector | BaseChatModel | str,  # ← 可以传入函数
    tools: list[Callable] | None = None,
    **kwargs
) -> Agent

入参解释

参数类型必填说明
ModelSelectorCallable接收 (AgentState, Runtime),返回 BaseChatModel 的函数
AgentStatedict-当前智能体的状态(包含消息历史等)
RuntimeRuntime-运行时上下文(包含自定义上下文数据)
modelModelSelector传入选择函数,而非具体模型

示例

from dataclasses import dataclass
from typing import Literal
from langchain.chat_models import init_chat_model
from langchain_core.language_models import BaseChatModel
from langchain_core.tools import tool
from langgraph.prebuilt import create_react_agent
from langgraph.prebuilt.chat_agent_executor import AgentState
from langgraph.runtime import Runtime

# 定义工具
@tool
def weather() -> str:
    """获取天气"""
    return "晴,25°C"

# 定义运行时上下文
@dataclass
class CustomContext:
    provider: Literal["anthropic", "openai"]
    tier: Literal["free", "paid"]

# 预初始化模型(避免每次请求都创建)
openai_free = init_chat_model("openai:gpt-4o-mini")
openai_paid = init_chat_model("openai:gpt-4.1")
anthropic_paid = init_chat_model("anthropic:claude-3-7-sonnet-latest")

# 定义选择逻辑
def select_model(state: AgentState, runtime: Runtime[CustomContext]) -> BaseChatModel:
    """根据运行时上下文动态选择模型"""
    provider = runtime.context.provider
    tier = runtime.context.tier
    
    if provider == "openai":
        # 免费用户用小模型,付费用户用大模型
        model = openai_free if tier == "free" else openai_paid
    elif provider == "anthropic":
        model = anthropic_paid
    else:
        raise ValueError(f"不支持的提供商: {provider}")
    
    # 重要:动态选择时必须手动绑定工具
    return model.bind_tools([weather])

# 创建智能体
agent = create_react_agent(
    state=None,
    model=select_model,  # ← 传入函数
    tools=[weather]
)

# 运行时指定使用哪个模型
result = agent.invoke(
    {"messages": [{"role": "user", "content": "今天天气如何?"}]},
    context=CustomContext(provider="openai", tier="paid")
)

适用场景

  • 多租户 SaaS 平台,不同用户用不同模型
  • 根据订阅等级路由(免费用户用小模型,付费用户用旗舰模型)
  • A/B 测试不同模型的效果
  • 根据任务复杂度动态选择
  • 合规要求(某些数据必须用特定区域的模型)

5. 自定义模型类(Bring Your Own Model)

API 签名

from langchain_core.language_models import BaseChatModel
from langchain_core.messages import AIMessage
from langchain_core.callbacks import CallbackManagerForLLMRun
from typing import Any, List, Optional

class CustomModel(BaseChatModel):
    def __init__(
        self,
        custom_param: str = "default",
        api_key: str | None = None,
        **kwargs: Any
    ) -> None:
        super().__init__(**kwargs)
        self.custom_param = custom_param
    
    def _call(
        self,
        messages: List,
        stop: Optional[List[str]] = None,
        run_manager: Optional[CallbackManagerForLLMRun] = None,
        **kwargs: Any
    ) -> str:
        """实现核心推理逻辑"""
        # 调用你的自定义模型 API
        response = self._call_your_api(messages)
        return response
    
    def _llm_type(self) -> str:
        """返回模型类型名称"""
        return "custom_model"

入参解释

方法/参数类型必填说明
__init__method初始化自定义参数,如 custom_paramapi_key
_callmethod核心推理方法,接收消息列表,返回字符串响应
messagesList输入的消息列表(包含 user/assistant/system 角色)
stopOptional[List[str]]停止词列表
run_managerOptional[CallbackManagerForLLMRun]回调管理器,用于追踪和日志
_llm_typemethod返回模型类型名称,用于调试和日志

示例

from langchain_core.language_models import BaseChatModel
from langchain_core.messages import AIMessage
from langchain_core.callbacks import CallbackManagerForLLMRun
from typing import Any, List, Optional
import requests

class MyCustomModel(BaseChatModel):
    """自定义模型:调用私有 API"""
    
    def __init__(
        self,
        api_url: str,
        api_key: str,
        timeout: int = 30,
        **kwargs: Any
    ) -> None:
        super().__init__(**kwargs)
        self.api_url = api_url
        self.api_key = api_key
        self.timeout = timeout
    
    def _call(
        self,
        messages: List,
        stop: Optional[List[str]] = None,
        run_manager: Optional[CallbackManagerForLLMRun] = None,
        **kwargs: Any
    ) -> str:
        # 构造请求
        payload = {
            "messages": messages,
            "timeout": self.timeout
        }
        
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        
        # 调用私有 API
        response = requests.post(
            self.api_url,
            json=payload,
            headers=headers,
            timeout=self.timeout
        )
        response.raise_for_status()
        
        return response.json()["content"]
    
    def _llm_type(self) -> str:
        return "my_custom_model"

# 使用自定义模型
custom_llm = MyCustomModel(
    api_url="https://internal-api.company.com/chat",
    api_key="your-api-key"
)

# 与 LangChain 其他组件无缝集成
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个助手"),
    ("user", "{question}")
])

chain = prompt | custom_llm
result = chain.invoke({"question": "你好"})
print(result)

适用场景

  • 企业内部私有化部署的模型
  • 新兴厂商模型,LangChain 尚未支持
  • 具有特殊推理逻辑或安全策略的定制模型

高级配置:通用选项

无论使用哪种初始化方式,都可以结合以下配置优化性能与稳定性。

禁用流式传输

llm = init_chat_model("openai:gpt-4.1", disable_streaming=True)
参数类型说明
disable_streamingbool设为 True 禁用流式输出,适用于需要一次性获取完整响应的场景

添加模型回退

from langchain.chat_models import init_chat_model

# 主模型 + 备用模型
primary = init_chat_model("openai:gpt-4.1")
fallback = init_chat_model("openai:gpt-4o")

# 创建带回退的模型
robust_llm = primary.with_fallbacks([fallback])

# 当主模型失败时自动降级
result = robust_llm.invoke("你好")

内置速率限制器

from langchain.chat_models import init_chat_model
from langchain_core.rate_limiters import InMemoryRateLimiter

# 配置速率限制器
rate_limiter = InMemoryRateLimiter(
    requests_per_second=0.1,  # 每秒最多 0.1 个请求
    max_queue_size=100         # 最大排队大小
)

llm = init_chat_model(
    "openai:gpt-4.1",
    rate_limiter=rate_limiter
)
参数类型必填说明
requests_per_secondfloat每秒最大请求数
max_queue_sizeint请求排队最大大小

总结:选型决策树

需要搭建 Agent?
  ├─ 是 → create_react_agent 字符串简写(最常用)
  └─ 否 → 需要快速原型?
         ├─ 是 → init_chat_model(一行代码)
         └─ 否 → 需要精确控制或本地模型?
                ├─ 是 → 直接实例化(ChatAnthropic / ChatOpenAI)
                └─ 否 → 需要运行时切换模型?
                       ├─ 是 → 动态选择函数
                       └─ 否 → 私有模型?
                              ├─ 是 → 自定义模型类
                              └─ 否 → init_chat_model
方法复杂度灵活性使用频率推荐场景
create_react_agent 字符串简写⭐⭐⭐⭐⭐⭐⭐标准 Agent 快速搭建
init_chat_model⭐⭐⭐⭐⭐⭐快速开发、多模型统一管理
直接实例化⭐⭐⭐⭐⭐⭐⭐⭐⭐生产环境调优、特殊参数需求、本地模型
动态选择函数⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐多租户、A/B 测试、业务路由
自带模型⭐⭐⭐⭐⭐⭐⭐⭐⭐私有化部署、未支持的厂商

推荐路径: 搭建 Agent 先用字符串简写快速跑通 → 需要统一管理用 init_chat_model → 需要调优或接入本地模型时切换到直接实例化 → 复杂场景用动态选择或自定义模型。

文章发表于 2026/07/09 09:30
作者: 佚名
文章标题: LangChain 初始化模型的几种方法总结
版权声明: 内容遵守许可协议,转载请注明出处。
扫码阅读原文