一文读懂 LangChain 模型:AI 应用的“大脑”是如何工作的

LangChain 把多厂商 LLM 收成统一 Models 接口;本文系统讲初始化、invoke/stream/batch、Messages、@tool 绑定与参数弹性,是从“会调 API”走到“会搭 Agent 大脑”的基础课。

基本信息

  • 来源类型:文章(掘金)
  • 原文位置raw/articles/2026-07-19-juejin-langchain-models-guide.md(Telegram 桩 raw/articles/2026-07-19-190026-tg-d41522.md;baoyu extract:raw/extracts/20260719-200754/juejin.cn/langchainai.md
  • 原文 URLhttps://juejin.cn/post/7662632306676367394
  • 作者:门主 / 空门技术栈
  • 发表:2026-07-16
  • 消化日期:2026-07-19

核心观点

  1. Models 是 Agent 的推理引擎,不是“又一个 SDK 封装”:LangChain 用统一接口封装 OpenAI / Anthropic / Google Gemini 等提供商,业务代码尽量不随底层模型切换而改写。现代模型能力表同时覆盖文本生成、工具调用、结构化输出、多模态与推理(如 o1、DeepSeek-R1)。
  2. 模块化安装 + OpenAI 兼容是默认落地路径:核心 langchain 与提供商包(如 langchain_openai)按需安装;绝大多数第三方/本地模型只要配好 OPENAI_API_KEY + OPENAI_BASE_URL,就可以继续用 ChatOpenAI / langchain_openai,不必为每个厂商重写调用层。
  3. 初始化优先 init_chat_model,固定 OpenAI 生态可直接 ChatOpenAIinit_chat_model(model=..., model_provider=...) 适合多提供商切换与快速原型;ChatOpenAI 与 OpenAI 兼容 API 强耦合但写法直接。对比维度:通用性、切换成本、代码耦合度、适用场景。
  4. 四种调用语义要按场景选型,而不是只会 invoke
    • invoke:等完整 AIMessage(含 content / response_metadata / tool_calls / id
    • stream:逐步 AIMessageChunkcontent_blocks 可区分 reasoning / text / tool_call_chunk;chunk 可用 + 累加
    • batch:并行处理多输入,全部完成后按输入顺序返回
    • batch_as_completed:谁先完成谁返回 (index, AIMessage),可用 max_concurrency 控并发
  5. Messages + Tools 是“大脑”与外部世界的契约SystemMessage / HumanMessage / AIMessage / ToolMessage 构成角色-内容-元数据三件套;也可用 OpenAI 风格字典。工具侧用 @tool 从函数 docstring 生成描述,bind_tools 后模型产出 tool_callstool_choice 支持 auto / required / none / 指定工具名,并可控制并行工具调用。
  6. 参数层要会调温度与弹性temperature 0→确定、0.7→平衡、1.0+→创意;max_retries 默认 6,对网络错误/429/5xx 指数退避+抖动重试,401/404 不重试;不稳定网络可提到 10–15。另有 timeoutmax_tokensapi_key

实操内容保留

代码/配置

依赖安装(uv)

uv add langchain
uv add langchain_openai
# uv add langchain_anthropic
# uv add langchain_google_genai
# uv add langchain_community

环境变量

  • OPENAI_API_KEY
  • OPENAI_BASE_URL(兼容 OpenAI 协议的自定义/本地端点)

通用初始化 init_chat_model

from langchain.chat_models import init_chat_model
 
model = init_chat_model(
    model="Qwen3-0.6B",
    model_provider="openai",
    temperature=0.7,
)
response = model.invoke("你好")
print(response.content)

直接 ChatOpenAI

from langchain_openai import ChatOpenAI
 
openai = ChatOpenAI(model="Qwen3-0.6B", temperature=0.7)
response = openai.invoke("你好")
print(response.content)

流式输出(含 reasoning 块)

for chunk in openai.stream("你好"):
    for block in chunk.content_blocks:
        if block["type"] == "reasoning" and (reasoning := block.get("reasoning")):
            print(f"推理:{reasoning}")
        elif block["type"] == "text":
            print(block["text"], end="", flush=True)

批量 / 按完成顺序

responses = openai.batch([
    "为什么鹦鹉有五颜六色的羽毛?",
    "飞机是如何飞行的?",
    "什么是量子计算?",
])
 
for idx, response in openai.batch_as_completed(
    list_of_inputs,
    config={"max_concurrency": 3},
):
    print(f"输入 {idx} 完成:{response.content[:50]}...")

消息对象 vs 字典

from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
 
messages = [
    SystemMessage("你是一个将英语翻译成法语的有用助手。"),
    HumanMessage("翻译:我喜欢编程。"),
    AIMessage("J'adore la programmation."),
    HumanMessage("翻译:我喜欢构建应用程序。"),
]
response = openai.invoke(messages)
 
# 等价字典格式(OpenAI Chat Completions 风格)
messages = [
    {"role": "system", "content": "你是一位诗人"},
    {"role": "user", "content": "写一首关于春天的俳句"},
    {"role": "assistant", "content": "樱花开了....."},
]

@tool + bind_tools + tool_choice

from langchain.tools import tool
from langchain_openai import ChatOpenAI
 
@tool
def get_weather(location: str) -> str:
    """查询指定位置的天气"""
    return f"{location}的天气是晴朗的,温度是25摄氏度"
 
openai = ChatOpenAI(model="qwen-plus", temperature=0.7, max_tokens=300)
model_with_tools = openai.bind_tools([get_weather], tool_choice="required")
 
messages = [
    {"role": "system", "content": "你是一个天气预报助手,必须使用工具来回答天气问题。"},
    {"role": "user", "content": "查询北京的天气"},
]
response = model_with_tools.invoke(messages)
if response.tool_calls:
    for tool_call in response.tool_calls:
        print(tool_call["name"], tool_call["args"])

操作步骤(选型决策树)

  1. 只有 1 个问题:需要实时展示 → stream();等全部结果 → invoke()
  2. 多个独立问题:要保持顺序 → batch();谁先完成先用谁 → batch_as_completed();要控并发 → batch_as_completed(config={'max_concurrency': N})
  3. 多提供商切换 → init_chat_model;固定 OpenAI 兼容栈 → ChatOpenAI + OPENAI_BASE_URL
  4. 工具场景:写清 docstring → @toolbind_tools → 检查 tool_calls → 执行工具 → 结果回传模型

Prompt 模板

(本文无独立长 Prompt 模板;系统角色示例见 Messages / 天气助手片段。)

关键概念

  • LangChain — 统一 Models 接口与 Agent 组件生态
  • Function Calling — 工具调用协议层;本文用 @tool / bind_tools / tool_choice 落到 LangChain API
  • OpenAI — 兼容协议与 ChatOpenAI 默认提供商生态
  • AI Agent 智能体 — Models 被定位为 Agent 的“大脑/推理引擎”
  • LangGraph — 同生态上层图编排(本文未展开,相关对照)
  • init_chat_model — 多提供商通用初始化(纯文本标注,未单独建实体)
  • ChatOpenAI — OpenAI 兼容聊天模型类(纯文本标注)
  • Messages(System/Human/AI/Tool)— 对话上下文基本单位(纯文本标注)
  • batch_as_completed — 按完成顺序返回的批量语义(纯文本标注)

与其他素材的关联

原文精彩摘录

在 LangChain 中,模型是整个框架的核心组件,堪称 Agent 的推理引擎。LangChain 通过统一的接口封装了不同提供商(OpenAI、Anthropic、Google Gemini 等)的模型,让开发者可以在不改变业务代码的情况下自由切换底层模型。

重要提示:当前市面上绝大多数模型 API 接口都兼容 OpenAI 的调用规则,所以无论你使用任何模型(本地部署的 Qwen、DeepSeek 等),只要配置正确的 OPENAI_BASE_URL,就可以直接使用 langchain_openai 来调用。这就是为什么 ChatOpenAI 不仅仅用于 OpenAI 自己的模型。

函数的文档字符串 """查询指定位置的天气""" 就是工具的描述信息,模型会根据这个描述来判断何时调用该工具。描述越清晰,模型越容易做出正确的工具选择。

相关页面