主题
LangChain 模型初始化参数
来源:LangChain 教程 · 第 02 章《模型的创建与调用》 适用对象:
ChatOpenAI、ChatDeepSeek等 Model Class,以及init_chat_model
1. 初始化参数的作用
模型初始化参数决定两件事:程序如何连接模型服务,以及模型如何生成内容。连接参数通常包括模型名称、供应商、API Key、Base URL、超时时间和重试次数;推理参数主要包括温度、最大输出 Token 数量、采样范围和停止条件。
常用初始化方式如下:
python
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
import os
load_dotenv(override=True)
model = init_chat_model(
model="deepseek-v3.2",
model_provider="openai",
temperature=0.7,
max_tokens=1000,
api_key=os.getenv("CLOSEAI_API_KEY"),
base_url=os.getenv("CLOSEAI_BASE_URL"),
)
response = model.invoke("你好,一句话介绍一下你自己")
print(response.content)建议将 API Key 和 Base URL 放在 .env 文件中,并将 .env 加入 .gitignore,避免密钥进入代码仓库。
2. 常用参数
| 参数 | 类型 | 作用 | 默认值 |
|---|---|---|---|
model | str | 指定模型名称。使用 init_chat_model 时可以写成 provider:model,例如 openai:gpt-4o | 无 |
model_provider | str | 指定模型供应商,例如 openai、deepseek、anthropic、ollama | 无 |
api_key | str | API 鉴权密钥。不传时通常从供应商约定的环境变量读取 | None |
base_url | str | 模型供应商的 API 请求地址,常用于 OpenAI 兼容接口 | None |
temperature | float | 控制输出随机性。值越高,结果越有变化;值越低,结果越稳定 | 0.7 |
max_tokens | int | 限制模型本次生成的最大 Token 数量 | None |
timeout / request_timeout | float | 网络请求超时时间,单位为秒 | None |
max_retries | int | 网络错误、限流等请求失败时的最大重试次数 | 6 |
不同模型类的参数名可能略有差异。例如,某些专用类使用 api_base,而 ChatOpenAI 与 OpenAI 兼容接口通常使用 base_url。实际使用时应以具体集成类的文档和 model_fields 为准。
3. temperature 参数
temperature 控制模型选择低概率 Token 的倾向。温度低时,模型更倾向于选择概率最高的结果;温度高时,模型会保留更多随机性,表达更灵活,但结果稳定性会下降。
| 范围 | 特点 | 常见场景 |
|---|---|---|
0.0–0.3 | 稳定、一致 | 数学计算、数据提取、分类、代码生成、结构化输出 |
0.5–0.7 | 稳定性与创造性平衡 | 普通聊天、问答、解释概念 |
0.8–1.5 | 表达更灵活 | 写作、广告文案、头脑风暴 |
1.5–2.0 | 随机性和创造性较强 | 诗歌、故事和实验性创作 |
3.1 低温度示例
结构化数据提取、分类和代码生成通常优先使用低温度:
python
model = init_chat_model(
model="deepseek-v3.2",
model_provider="openai",
temperature=0,
api_key=os.getenv("CLOSEAI_API_KEY"),
base_url=os.getenv("CLOSEAI_BASE_URL"),
)
response = model.invoke(
"张三,男,30岁,拥有8年编程开发经验,目前担任技术专家。"
"请提取姓名、性别、年龄、编程经验年限和职位,返回 JSON。"
)
print(response.content)3.2 高温度示例
创意文案和头脑风暴可以适当提高温度:
python
model = init_chat_model(
model="deepseek-v3.2",
model_provider="openai",
temperature=1.5,
api_key=os.getenv("CLOSEAI_API_KEY"),
base_url=os.getenv("CLOSEAI_BASE_URL"),
)
response = model.invoke("为一款极致静音的机械键盘写 3 个有诗意的广告语")
print(response.content)temperature=0 只能降低随机性,不能保证模型绝对正确;模型本身的知识、提示词质量和输出格式约束仍然会影响结果。
4. max_tokens 参数
max_tokens 限制模型输出的最大 Token 数量。它控制的是输出长度,不是输入上下文长度。设置得过小,回答可能在句子中途被截断;设置得过大,会增加潜在的计费量和响应时间。
python
model = init_chat_model(
model="gpt-5.4-mini",
model_provider="openai",
max_tokens=15,
api_key=os.getenv("CLOSEAI_API_KEY"),
base_url=os.getenv("CLOSEAI_BASE_URL"),
)
response = model.invoke("请用中文详细介绍什么是 AI")
print(response.content)如果输出被截断,可以检查响应元数据中的结束原因,例如 finish_reason 是否为 length:
python
print(response.response_metadata.get("finish_reason"))Token 是模型分词器拆分出的文本单元,也是许多模型服务计算费用和限制上下文的基础单位。不同模型使用的分词算法不同,同一段文本的 Token 数量可能不同。
5. 连接与可靠性参数
5.1 API Key 与 Base URL
python
model = init_chat_model(
model="deepseek-v3.2",
model_provider="openai",
api_key=os.getenv("CLOSEAI_API_KEY"),
base_url=os.getenv("CLOSEAI_BASE_URL"),
)api_key 用于身份认证,base_url 决定请求发送到哪个服务地址。使用 OpenAI 兼容接口时,通常只需要替换 base_url 和 model 就能切换不同供应商,但具体模型是否支持某项能力仍需单独确认。
5.2 timeout 与 max_retries
timeout 或 request_timeout 用于限制单次请求等待时间;max_retries 用于处理网络抖动、临时限流等可恢复错误。重试次数过高会延长失败请求的总耗时,重试次数过低则可能放大偶发网络问题。
python
model = init_chat_model(
model="deepseek-v3.2",
model_provider="openai",
timeout=30,
max_retries=3,
api_key=os.getenv("CLOSEAI_API_KEY"),
base_url=os.getenv("CLOSEAI_BASE_URL"),
)6. 完整参数的查看方式
Model Class 的参数由自身定义和父类 BaseChatModel 继承而来。不同供应商、不同版本的参数可能不同,遇到参数名或兼容性问题时,可以直接查看类的 model_fields。
6.1 查看模型支持的参数名
python
from langchain_openai import ChatOpenAI
print(ChatOpenAI.model_fields.keys())也可以查看通过 init_chat_model 创建出的具体模型对象:
python
from langchain.chat_models import init_chat_model
temp_model = init_chat_model(
model="deepseek-v4-flash",
model_provider="deepseek",
)
print(temp_model.model_fields.keys())6.2 查看参数类型、默认值和描述
python
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)7. 完整参数的分类
完整参数可以按用途分成四组。日常开发一般只需要配置前两组中的少量参数。
7.1 客户端与连接参数
这组参数决定程序如何连接模型服务:
| 参数 | 作用 |
|---|---|
api_key / openai_api_key | 鉴权密钥 |
api_base / openai_api_base | API 地址 |
request_timeout | 网络请求超时设置 |
max_retries | 请求失败重试次数 |
http_client / http_async_client | 自定义同步或异步 HTTP 客户端 |
openai_proxy | 代理服务器配置 |
default_headers / default_query | 每次请求默认携带的 Header 或 Query 参数 |
7.2 模型推理参数
这组参数影响模型生成结果:
| 参数 | 作用 |
|---|---|
model_name | 指定具体模型 |
temperature | 控制随机性 |
top_p | 控制核采样范围 |
max_tokens | 限制最大输出 Token 数 |
stop | 到达指定字符串时停止生成 |
streaming | 是否开启流式传输 |
n | 生成候选回复的数量 |
reasoning | 是否启用推理模式,是否生效取决于模型 |
reasoning_effort | 控制部分推理模型的推理强度 |
presence_penalty | 惩罚已经出现过的主题,鼓励引入新内容 |
frequency_penalty | 根据词语出现频率进行惩罚,减少重复 |
seed | 在供应商支持时控制结果的可复现性 |
logprobs / top_logprobs | 返回 Token 概率信息 |
logit_bias | 调整特定 Token 的出现概率 |
7.2.1 使用 top_p 控制采样范围
top_p 也叫核采样参数。模型只在累计概率达到 top_p 的候选 Token 中进行选择。temperature 和 top_p 都会影响随机性,通常先调整其中一个,避免同时调节后难以判断效果。
python
model = init_chat_model(
model="deepseek-v3.2",
model_provider="openai",
temperature=0.7,
top_p=0.8,
api_key=os.getenv("CLOSEAI_API_KEY"),
base_url=os.getenv("CLOSEAI_BASE_URL"),
)
response = model.invoke("用三句话介绍机器学习")
print(response.content)7.2.2 使用 stop 提前结束生成
stop 可以传入一个字符串或字符串列表。当模型生成到指定内容时,当前回复会提前结束,适合固定格式的输出。
python
model = init_chat_model(
model="deepseek-v3.2",
model_provider="openai",
temperature=0,
stop=["END"],
api_key=os.getenv("CLOSEAI_API_KEY"),
base_url=os.getenv("CLOSEAI_BASE_URL"),
)
response = model.invoke("列出三个 Python Web 框架,每行一个,最后输出 END")
print(response.content)是否支持 stop 以及停止字符串是否会出现在返回结果中,取决于底层供应商实现。
7.2.3 使用 streaming 获取流式输出
streaming 用于设置模型是否允许流式传输。调用时使用 .stream(),模型会逐块返回内容,适合聊天窗口和长文本生成。
python
model = init_chat_model(
model="deepseek-v3.2",
model_provider="openai",
streaming=True,
api_key=os.getenv("CLOSEAI_API_KEY"),
base_url=os.getenv("CLOSEAI_BASE_URL"),
)
for chunk in model.stream("请分三点介绍 LangChain"):
print(chunk.content, end="", flush=True)如果只需要一次性拿到完整结果,可以继续使用 .invoke();是否真正以流式方式返回,还要看模型服务和网络客户端是否支持。
7.2.4 使用 n 生成多个候选结果
n 表示请求模型生成多少个候选结果。该参数会增加模型调用量和返回数据量,只有底层接口支持时才能使用。
python
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
model="gpt-4o-mini",
n=3,
temperature=0.8,
api_key=os.getenv("OPENAI_API_KEY"),
)
response = model.generate([
[HumanMessage(content="为一个记账应用写一句宣传语")]
])
for generation in response.generations[0]:
print(generation.text)不同 LangChain 版本或模型类对多候选结果的返回结构可能不同。使用前应先打印 type(response) 和 response,确认当前集成类的返回格式。
7.2.5 使用 presence_penalty 和 frequency_penalty
两个惩罚参数都用于减少重复,但作用角度不同:presence_penalty 更关注某个主题是否已经出现过,frequency_penalty 更关注某个 Token 或词语出现的次数。
python
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
model="gpt-4o-mini",
temperature=0.7,
presence_penalty=0.4,
frequency_penalty=0.6,
api_key=os.getenv("OPENAI_API_KEY"),
)
response = model.invoke("写一篇介绍远程办公优点的短文,避免重复使用相同词语")
print(response.content)惩罚值的可用范围和实际效果由模型供应商决定。值设置过高可能使表达变得生硬,建议从较小值开始调整。
7.2.6 使用 seed 尝试复现结果
seed 用于在供应商支持的情况下,让相同输入和相同参数更容易得到相近结果。它不能保证所有服务、所有时间都返回完全相同的内容。
python
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
model="gpt-4o-mini",
temperature=0.2,
seed=42,
api_key=os.getenv("OPENAI_API_KEY"),
)
response = model.invoke("用一句话解释什么是向量数据库")
print(response.content)如果服务端不支持 seed,初始化或请求阶段可能报错。使用兼容接口时,需要确认中转平台是否会透传该参数。
7.2.7 查看 Token 概率信息
logprobs 用于请求返回生成 Token 的概率信息,top_logprobs 用于查看每个位置概率最高的若干候选 Token。这类参数适合分析模型置信度或研究采样过程。
python
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
model="gpt-4o-mini",
logprobs=True,
top_logprobs=3,
api_key=os.getenv("OPENAI_API_KEY"),
)
response = model.invoke("选择一个答案:Python 最常用的包管理工具是 pip 还是 Excel?")
print(response.content)
print(response.response_metadata.get("logprobs"))返回字段名称和嵌套结构由底层 API 决定。如果响应中没有 logprobs,应先确认模型、供应商和当前版本是否支持该能力。
7.3 LangChain 通用参数
这组参数主要管理 LangChain 内部行为:
| 参数 | 作用 |
|---|---|
name | 为模型实例命名,便于追踪和区分 |
verbose | 是否输出详细日志 |
callbacks | 注册回调处理器,可接入监控或 LangSmith |
tags / metadata | 为调用添加标签和元数据 |
cache | 是否缓存模型请求结果 |
rate_limiter | 控制请求频率 |
disable_streaming | 控制是否禁用流式调用 |
include_response_headers | 是否在结果中包含响应 Header |
7.4 高级与扩展参数
model_kwargs 和 extra_body 可以透传底层 OpenAI 兼容接口支持、但 LangChain 尚未单独定义的字段。底层 client、async_client、root_client 等通常由 SDK 内部创建,不建议在普通初始化中手动传入。
python
model = ChatOpenAI(
model="gpt-4o",
model_kwargs={
"some_provider_specific_option": True,
},
)透传参数必须以实际供应商 API 文档为准。参数名写错、供应商不支持或将参数放错位置,都会导致请求失败。
8. 参数选择建议
- 先确定
model、model_provider、api_key和base_url,确认模型能正常调用。 - 结构化任务优先从
temperature=0或较低值开始,再根据结果稳定性调整。 - 创作类任务可以提高
temperature,但要结合任务对一致性的要求。 - 根据回答长度设置
max_tokens,并观察finish_reason,避免无意截断。 - 网络不稳定时配置合理的
timeout和max_retries,避免无限等待。 - 需要使用冷门参数时,先通过
model_fields确认参数是否存在,再查供应商 API 文档确认语义。 - 不同模型对
reasoning、top_p、presence_penalty等参数的支持并不一致,不能只根据参数名推断实际效果。