一文读懂 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) - 原文 URL:https://juejin.cn/post/7662632306676367394
- 作者:门主 / 空门技术栈
- 发表:2026-07-16
- 消化日期:2026-07-19
核心观点
- Models 是 Agent 的推理引擎,不是“又一个 SDK 封装”:LangChain 用统一接口封装 OpenAI / Anthropic / Google Gemini 等提供商,业务代码尽量不随底层模型切换而改写。现代模型能力表同时覆盖文本生成、工具调用、结构化输出、多模态与推理(如 o1、DeepSeek-R1)。
- 模块化安装 + OpenAI 兼容是默认落地路径:核心
langchain与提供商包(如langchain_openai)按需安装;绝大多数第三方/本地模型只要配好OPENAI_API_KEY+OPENAI_BASE_URL,就可以继续用ChatOpenAI/langchain_openai,不必为每个厂商重写调用层。 - 初始化优先
init_chat_model,固定 OpenAI 生态可直接ChatOpenAI:init_chat_model(model=..., model_provider=...)适合多提供商切换与快速原型;ChatOpenAI与 OpenAI 兼容 API 强耦合但写法直接。对比维度:通用性、切换成本、代码耦合度、适用场景。 - 四种调用语义要按场景选型,而不是只会
invoke:invoke:等完整AIMessage(含content/response_metadata/tool_calls/id)stream:逐步AIMessageChunk,content_blocks可区分reasoning/text/tool_call_chunk;chunk 可用+累加batch:并行处理多输入,全部完成后按输入顺序返回batch_as_completed:谁先完成谁返回(index, AIMessage),可用max_concurrency控并发
- Messages + Tools 是“大脑”与外部世界的契约:
SystemMessage/HumanMessage/AIMessage/ToolMessage构成角色-内容-元数据三件套;也可用 OpenAI 风格字典。工具侧用@tool从函数 docstring 生成描述,bind_tools后模型产出tool_calls;tool_choice支持 auto / required / none / 指定工具名,并可控制并行工具调用。 - 参数层要会调温度与弹性:
temperature0→确定、0.7→平衡、1.0+→创意;max_retries默认 6,对网络错误/429/5xx 指数退避+抖动重试,401/404 不重试;不稳定网络可提到 10–15。另有timeout、max_tokens、api_key。
实操内容保留
代码/配置
依赖安装(uv):
uv add langchain
uv add langchain_openai
# uv add langchain_anthropic
# uv add langchain_google_genai
# uv add langchain_community环境变量:
OPENAI_API_KEYOPENAI_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 个问题:需要实时展示 →
stream();等全部结果 →invoke() - 多个独立问题:要保持顺序 →
batch();谁先完成先用谁 →batch_as_completed();要控并发 →batch_as_completed(config={'max_concurrency': N}) - 多提供商切换 →
init_chat_model;固定 OpenAI 兼容栈 →ChatOpenAI+OPENAI_BASE_URL - 工具场景:写清 docstring →
@tool→bind_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— 按完成顺序返回的批量语义(纯文本标注)
与其他素材的关联
- 与 2026-06-13-langchain-openai-agent-tutorial:互补上下层——旧文从 AgentExecutor / 邮件助手讲完整 Agent 闭环;本文下沉到 Models 层 API(初始化、四种调用、Messages、bind_tools),是“大脑”底座。
- 与 2026-06-13-deep-agents-framework-guide:Deep Agents 在 LangChain 之上做 harness;本文解释底层如何换模型、流式与工具绑定。
- 与 2026-07-05-juejin-claude-code-tool-calling:同是工具调用,不同运行时——Claude Code 侧重宿主 harness(权限/Hook/并发/取消);本文侧重 LangChain 侧 schema 绑定与
tool_choice。 - 与 2026-07-05-juejin-context-engineering-harness:Models 参数(temperature、retries)与 harness 可靠性同属“生产可用”层,但本文更偏 SDK 教程。
原文精彩摘录
在 LangChain 中,模型是整个框架的核心组件,堪称 Agent 的推理引擎。LangChain 通过统一的接口封装了不同提供商(OpenAI、Anthropic、Google Gemini 等)的模型,让开发者可以在不改变业务代码的情况下自由切换底层模型。
重要提示:当前市面上绝大多数模型 API 接口都兼容 OpenAI 的调用规则,所以无论你使用任何模型(本地部署的 Qwen、DeepSeek 等),只要配置正确的
OPENAI_BASE_URL,就可以直接使用langchain_openai来调用。这就是为什么ChatOpenAI不仅仅用于 OpenAI 自己的模型。
函数的文档字符串
"""查询指定位置的天气"""就是工具的描述信息,模型会根据这个描述来判断何时调用该工具。描述越清晰,模型越容易做出正确的工具选择。