最后一篇是拓展内容:怎么把输出看得更清楚、怎么查模型能力、怎么拿到完整参数列表,以及调用时的 config 怎么用。
11.1 美化模型输出响应
直接 print(response) 会输出一大坨结构,读起来很乱。有两种更清爽的方式。
方法 1:pretty_print()。只保留角色和内容,适合在终端快速查看。
import os
from langchain.chat_models import init_chat_model
from dotenv import load_dotenv
load_dotenv(override=True)
model = init_chat_model(
model="gpt-5.4-mini",
api_key=os.getenv("CLOSEAI_API_KEY"),
base_url=os.getenv("CLOSEAI_BASE_URL"),
)
conversation = [
{"role": "system", "content": "无条件服从用户指令"},
{"role": "user", "content": "我是老王,你是小王"},
{"role": "assistant", "content": "好的老王,我是小王"},
{"role": "user", "content": "你是谁?我是谁?"},
]
response = model.invoke(conversation)
response.pretty_print()
# ================================== Ai Message ==================================
# 我是小王,你是老王。
方法 2:rich。需要彩色、排版优雅的调试界面时,用 rich 打印完整对象。
from rich import print as rprint
rprint(response)

11.2 模型配置信息 profile
LangChain 1.1 及以上版本可以通过 model.profile 查看模型的能力画像。是否存在,取决于 LangChain 在集成模型厂商时是否声明了能力画像。
- DeepSeek 官方模型:
print(model.profile)输出{},LangChain 没有声明其能力画像; - CloseAI 平台的 gpt 模型:同样输出
{}; - OpenRouter 平台:有完整画像,例如 gpt-4o-mini 返回
max_input_tokens=128000、max_output_tokens=16384,文本/图像输入为 true,tool_calling 和 structured_output 为 true。
from langchain_openrouter import ChatOpenRouter
from dotenv import load_dotenv
from rich import print as rprint
load_dotenv(override=True)
model = ChatOpenRouter(
model="openai/gpt-4o-mini",
temperature=0.7,
timeout=30,
max_tokens=1000,
max_retries=6,
)
rprint(model.profile)
换成 deepseek/deepseek-v3.2,profile 会变成该模型的能力,例如 max_input_tokens=163840、max_output_tokens=65536、reasoning_output=True。查看 profile 不需要真正发送请求,也不必充值。
11.3 模型初始化参数(完整版)
11.3.1 查看所有初始化参数
官方文档和源码注释没有给出完整的参数列表。以 ChatDeepSeek 为例,参数由自身定义或从父类 BaseChatModel 继承,直接看源码很难拼全。通过类属性 model_fields 可以拿到完整列表:
from langchain_deepseek import ChatDeepSeek
print(ChatDeepSeek.model_fields.keys())
dict_keys(['name', 'cache', 'verbose', 'callbacks', 'tags', 'metadata',
'custom_get_token_ids', 'rate_limiter', 'disable_streaming',
'output_version', 'profile', 'client', 'async_client', 'root_client',
'root_async_client', 'model_name', 'temperature', 'model_kwargs',
'openai_api_key', 'openai_api_base', 'openai_organization', 'openai_proxy',
'request_timeout', 'stream_usage', 'max_retries', 'presence_penalty',
'frequency_penalty', 'seed', 'logprobs', 'top_logprobs', 'logit_bias',
'streaming', 'n', 'top_p', 'max_tokens', 'reasoning_effort', 'reasoning',
'verbosity', 'tiktoken_model_name', 'default_headers', 'default_query',
'http_client', 'http_async_client', 'stop', 'extra_body',
'include_response_headers', 'disabled_params', 'context_management',
'include', 'service_tier', 'store', 'truncation', 'use_previous_response_id',
'use_responses_api', 'api_key', 'api_base'])
ChatOpenAI 同理;init_chat_model 初始化后的对象也可以直接查看,即使不传具体 key,通常也能初始化成功。
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
load_dotenv(override=True)
temp_model = init_chat_model(
model="deepseek-v4-flash",
model_provider="deepseek",
)
print(temp_model.model_fields.keys())
想看每个字段的类型、默认值和说明:
from langchain_deepseek import ChatDeepSeek
for name, field in ChatDeepSeek.model_fields.items():
print(name)
print(" annotation:", field.annotation)
print(" default:", field.default)
print(" description:", getattr(field, "description", None))
print(" alias:", field.alias)
print()
11.3.2 参数构成:四类
1、客户端与连接参数(Networking)——决定代码怎么连到服务端,而不是让模型怎么生成。
| 参数 | 说明 |
|---|---|
| api_key / openai_api_key | 鉴权密钥。DeepSeek 通常兼容 OpenAI 接口格式 |
| api_base / openai_api_base | 接口地址,如 https://api.deepseek.com |
| request_timeout | 网络请求超时时间 |
| max_retries | 请求失败时的重试次数 |
| http_client / http_async_client | 手动传入 httpx.Client 实例,用于更复杂的网络配置 |
| openai_proxy | 代理服务器配置 |
| default_headers / default_query | 每次请求时默认携带的 HTTP Header 或 Query 参数 |
2、模型推理参数(Model Inference)——直接传给模型 API,决定生成内容的质量和风格。
| 参数 | 说明 |
|---|---|
| model_name | 指定具体模型,如 deepseek-chat、deepseek-reasoning |
| temperature | 采样温度,越高越随机 |
| top_p | 核采样参数 |
| max_tokens | 最大输出 token 数 |
| stop | 停止符列表 |
| streaming | 是否开启流式传输 |
| n | 生成几个候选回复 |
| reasoning / reasoning_effort | 是否启用推理模式,以及控制思考链(COT)的深度 |
| presence_penalty / frequency_penalty | 存在惩罚、频率惩罚,用于减少内容重复 |
| store | 是否存储对话 |
| logit_bias | 调整特定词汇出现的概率 |
3、LangChain 框架通用参数——由 BaseChatModel 定义,所有 ChatXxx 子类都具备,用于管理 LangChain 内部逻辑,仅在内部生效:name(Trace 中的名字)、verbose(详细日志)、callbacks(回调,可接 LangSmith)、tags/metadata(标签与元数据)、cache(缓存请求结果)、rate_limiter(频率限制器)。
4、高级与特定扩展参数——底层客户端 client、async_client、root_client(内部生成的 SDK 实例,不建议初始化时手动传)、透传参数 model_kwargs / extra_body、功能开关 disable_streaming / include_response_headers、兼容性参数 openai_organization / service_tier / store。
11.3.3 model_kwargs:传 LangChain 没列出的字段
DeepSeek 的接口与 OpenAI 兼容:官方文档明确说明可以使用 OpenAI SDK 访问,base_url 为 https://api.deepseek.com。因此 OpenAI 协议里的字段,在 DeepSeek 上通常也能用。

有些字段 OpenAI 兼容接口支持、但 LangChain 没有直接列出,例如 Function Call 使用的 tools。下图是 OpenAI Chat Completions 文档中对 tools 字段的说明;LangChain 的字段列表里没有它,所以要通过 model_kwargs 透传。

from langchain.chat_models import init_chat_model
from dotenv import load_dotenv
from rich import print as rprint
load_dotenv(override=True)
model = init_chat_model(
model="deepseek:deepseek-v4-flash",
model_kwargs={"tools": [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get weather of a location, the user should supply a location first.",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA",
}
},
"required": ["location"],
},
},
}]},
)
response = model.invoke("你好,今天北京的天气如何")
rprint(response)
输出里出现 tool_calls,finish_reason 为 tool_calls,说明工具被模型正确识别。实际开发不会用这种原始方式,后续会使用专门的工具调用接口。
11.3.4 extra_body:传厂商扩展字段
extra_body 用于存放模型厂商基于 OpenAI API 协议扩展的字段。DeepSeek 的 thinking 就是扩展字段,用于控制是否启用思考模式。
from langchain.chat_models import init_chat_model
from dotenv import load_dotenv
from rich import print as rprint
load_dotenv(override=True)
model = init_chat_model(
model="deepseek:deepseek-v4-flash",
extra_body={"thinking": {"type": "enabled"}},
)
response = model.invoke("你好,一句话回答")
rprint(response)
启用后,additional_kwargs 里会多出 reasoning_content,里面是完整思考过程;usage_metadata.output_token_details.reasoning 也会统计推理消耗。把它改成 disabled,输出就不再包含 reasoning_content。

结论:记住常见参数即可,需要精细控制模型输出时,查 OpenAI 和特定模型供应商的官方文档,通过 model_kwargs 或 extra_body 传递。
11.4 模型调用中的 config 参数
在调用模型时(invoke、ainvoke、stream、batch 等方法),可以传入 config,动态配置和控制本次调用的行为,不必在初始化时就固定所有参数。
| 配置项 | 类型 | 描述 |
|---|---|---|
| run_name | str | 为当前运行设置可读名称,在 LangSmith 中快速定位 |
| tags | List[str] | 运行标签,用于分类和过滤 |
| callbacks | List[BaseCallbackHandler] | 回调处理器,在开始、流输出、结束等阶段触发 |
| metadata | Dict[str, Any] | 任意键值对元数据,记录 user_id、session_id 等业务上下文 |
| max_concurrency | int | 限制最大并发运行数,防止压垮 API 或本地资源 |
| recursion_limit | int | 限制递归调用的最大深度,Agent 多步工具调用时防死循环 |
| configurable | Dict[str, Any] | 万能字典,用于传递其他可配置参数 |
说明:run_name、tags、callbacks 主要用在 LangSmith 中,用于追踪、筛选和调试;metadata 可以随 Runnable 链传递给后续节点;configurable 中的参数与 init_chat_model 的初始化参数类似,但它是单次调用的设置,优先级更高。
处理大量输入时,用 max_concurrency 控制最大并行数:
model.batch(
large_list_of_inputs,
config={"max_concurrency": 5} # 最多 5 个并发
)
运行时切换模型、温度、最大 token 数时,需要先在 init_chat_model 中通过 configurable_fields 声明哪些参数允许被覆盖:
from langchain.chat_models import init_chat_model
from dotenv import load_dotenv
from rich import print as rprint
import os
load_dotenv(override=True)
model = init_chat_model(
model="deepseek-v4-flash",
model_provider="deepseek",
api_key=os.getenv("DEEPSEEK_API_KEY"),
base_url=os.getenv("DEEPSEEK_BASE_URL"),
temperature=0.2,
max_tokens=500,
configurable_fields=("model", "model_provider", "temperature", "max_tokens"),
)
config = {
"run_name": "joke_generation",
"tags": ["tag1", "tag2"],
"metadata": {"user_id": "123"},
"configurable": {
"model": "deepseek-v4-pro",
"model_provider": "openai",
"temperature": 0.7,
"max_tokens": 1000,
},
}
response = model.invoke("1 + 2 = ?", config=config)
rprint(response)
11.5 本章小结
到这里,模型的创建与调用形成闭环:
- 准备工作:三要素是模型名、api-key、base-url;参数写 .env,依赖锁版本。
- 专用库:DeepSeek、智谱、千问各有参数坑,其余多数可以用 ChatOpenAI 兼容。
- 统一入口:init_chat_model 用「provider:model」切换模型。
- 本地模型:Ollama 安装、拉模型,用 ChatOllama 或 init_chat_model 调用。
- 调用方式:invoke / stream / batch / 异步各取所需,批量比循环快一倍左右。
- 进阶:profile 看能力,model_fields 查参数,model_kwargs / extra_body 透传厂商字段,config 做运行时控制。
上一篇:invoke、stream、batch 与异步调用;系列第一篇:为什么需要 LangChain。
本文根据公开课程课件整理,并结合 LangChain 官方文档核对与补充。示例环境为 Python 3.13.12 + langchain 1.2.12。

AI项目博客






