🎯 课程主题
深入讲解LangChain模型调用的扩展内容:美化输出、profile属性查看模型配置信息、透传参数(model_kwargs/extra_body)的使用场景,以及invoke调用时的config参数配置。
📝 核心知识点
1. 美化模型输出
- 概念说明:两种方式美化模型的响应输出。
- 关键细节:
pretty_print()方法:直接对响应对象调用,友好输出 contentrich库的print函数:导入from rich import print as rprint,格式化输出更清晰的JSON信息(需注意与内置print重名,须起别名)
2. profile 属性
- 概念说明:LangChain v1.1+ 引入的
model.profile属性,用于查看模型的配置信息(如最大输出token、是否支持工具调用、视觉/音频输入等)。 - 关键细节:
- 并非所有平台/模型都支持:DeepSeek 官方模型返回为
None,OpenAI 平台的模型也返回空 - openrouter 平台的模型部分支持:如 GPT 模型和 DeepSeek 模型展示了该平台的 profile 信息
- 即便同一平台,不同模型的支持程度也不同(例如 openrouter 上某些模型也可能返回空)
- 整体支持力度还不够,仅作了解即可
- 并非所有平台/模型都支持:DeepSeek 官方模型返回为
3. 模型初始化参数全景
- 概念说明:模型初始化参数分为四大类。
- 关键细节:
- 客户端与连接参数:
base_url、api_key、timeout、max_retries等,负责连接服务器,与生成无关 - 模型推理参数:
model、temperature、top_p、max_tokens、streaming等,直接决定生成内容的质量和风格 - LangChain 框架通用参数:
name、callbacks等,仅在框架内部生效,日常使用较少 - 查看方式:通过
ModelClass.model_fields查看类的所有参数字段(推荐使用类名调用,实例调用已被标记为 deprecated)
- 客户端与连接参数:
4. model_kwargs(透传参数)
- 概念说明:存放 OpenAI 兼容协议 API 支持,但 LangChain 未直接列出的字段。
- 关键细节:
- 使用场景:例如 OpenAI 模型支持
tools参数,但 LangChain 的ChatOpenAI构造函数中没有显式暴露,则需通过model_kwargs={"tools": [...]}传入 - 示例:在
model_kwargs中传入工具定义,模型在回答相关问题时会在响应中包含tool_calls - 如果问题与工具无关,则
tool_calls为空
- 使用场景:例如 OpenAI 模型支持
5. extra_body(扩展体参数)
- 概念说明:存放模型厂商基于 OpenAI 协议扩展的个性化字段。
- 关键细节:
- 使用场景:例如 DeepSeek 独有
thinking字段(推理/思考模式),OpenAI 协议没有此字段 - 示例:
extra_body={"thinking": {"type": "enabled"}}启用思考模式,响应中出现reasoning_content - 设为
"disabled"则不显示思考过程 - DeepSeek V4 Flash 模型动态判断是否需要思考(不同于 V3=通用、R1=推理的固定模式)
- 使用场景:例如 DeepSeek 独有
6. invoke 调用的 config 参数
- 概念说明:
config参数允许在调用模型时动态配置和控制模型行为,适用于invoke、stream、batch等方法。 - 关键细节:
- run_name / tags / callbacks:与 LangSmith 监控相关,run_name 定义运行名称,tags 便于分类查找
- metadata:存放当前用户ID、会话ID等自定义元数据
- max_concurrency:控制 batch 调用的最大并发数,避免对服务器造成过大压力
- configurable:允许在单次调用中覆盖模型初始化时的参数(如 model、temperature 等)
- 重要前提:必须在
init_chat_model或模型初始化时通过configurable_fields声明哪些字段允许被覆盖,否则configurable中的配置不会生效 - 优先级规则:若传入
configurable,当次调用以其为准;否则以模型初始化时的参数为准
🏗️ 架构与工作流
模型参数配置体系:
┌─────────────────────────────────────────────────┐
│ 模型初始化参数 │
│ ┌──────────────┬──────────────┬──────────────┐ │
│ │ 客户端连接 │ 模型推理参数 │ 框架通用参数 │ │
│ │ base_url │ model │ name │ │
│ │ api_key │ temperature │ callbacks │ │
│ │ timeout │ max_tokens │ ... │ │
│ │ max_retries │ top_p │ │ │
│ └──────────────┴──────────────┴──────────────┘ │
│ │
│ 透传参数(特殊场景): │
│ model_kwargs → OpenAI兼容API未暴露的字段 │
│ extra_body → 厂商个性化扩展字段 │
│ │
│ 调用时覆盖: │
│ config.configurable → 单次调用覆盖初始化参数 │
│ (需在初始化时声明 configurable_fields) │
└─────────────────────────────────────────────────┘
💻 代码实战
from rich import print as rprint
from langchain_deepseek import ChatDeepSeek
from langchain_openai import ChatOpenAI
from langchain.chat_models import init_chat_model
# ===== 1. 美化输出 =====
model = ChatDeepSeek(model="deepseek-chat")
response = model.invoke("你好")
response.pretty_print()
rprint(response)
# ===== 2. profile 属性 =====
model_ds = ChatDeepSeek(model="deepseek-chat")
print(model_ds.profile) # 可能返回 None(不支持)
model_openai = ChatOpenAI(model="gpt-4o-mini")
print(model_openai.profile) # 也可能返回 None
from langchain_openrouter import ChatOpenRouter
model_or = ChatOpenRouter(model="openai/gpt-4o")
rprint(model_or.profile) # OpenRouter 平台部分模型支持
# ===== 3. 查看模型全部参数字段 =====
print(ChatDeepSeek.model_fields) # 推荐:类名调用
# 不推荐:实例调用(已被 deprecated)
# ===== 4. model_kwargs 透传 tools 参数 =====
model = init_chat_model(
model="deepseek-chat",
model_provider="deepseek",
model_kwargs={
"tools": [{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的天气信息",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称"
}
},
"required": ["city"]
}
}
}]
}
)
# 相关问题时 tool_calls 有内容
response = model.invoke("北京今天的天气怎么样?")
print(response.tool_calls)
# 无关问题时 tool_calls 为空
response = model.invoke("1+2等于多少?")
print(response.tool_calls)
# ===== 5. extra_body 传厂商特有字段 =====
model = ChatDeepSeek(model="deepseek-chat")
response = model.invoke(
"你好,一句话回答我",
extra_body={"thinking": {"type": "enabled"}}
)
print(response.additional_kwargs.get("reasoning_content"))
# 禁用思考
response = model.invoke(
"你好,一句话回答我",
extra_body={"thinking": {"type": "disabled"}}
)
# reasoning_content 不再出现
# ===== 6. config 参数使用 =====
model = init_chat_model(
model="deepseek-chat",
model_provider="deepseek",
temperature=0.7,
max_tokens=1024,
configurable_fields=["model", "model_provider", "temperature", "max_tokens"]
)
# 单次调用中覆盖参数
response = model.invoke(
"你好,介绍一下自己",
config={
"run_name": "测试运行",
"tags": ["test", "intro"],
"metadata": {
"user_id": "12345",
"session_id": "abc-001"
},
"max_concurrency": 5,
"configurable": {
"model": "deepseek-chat-v4-pro",
"model_provider": "openai",
"temperature": 0.3,
"max_tokens": 2048
}
}
)
print(response.content)
⚠️ 常见问题与避坑指南
model.profile属性在 v1.1+ 才有,且多数平台/模型不支持,不要依赖此功能- 查看模型字段时优先使用类名调用(如
ChatDeepSeek.model_fields),实例调用已被标记为 deprecated - 使用
model_kwargs时参数格式须符合 OpenAI API 规范,尤其 tools 参数的结构 extra_body中的字段取决于模型厂商,不同厂商字段名和值格式不同(如 DeepSeek 的thinking)config.configurable必须在模型初始化时通过configurable_fields声明才能生效,否则会被忽略model_kwargsvsextra_body的区别:前者存 OpenAI 兼容协议已有的字段,后者存厂商个性化扩展字段
💡 个人总结与延伸
本节课重点在于三个核心概念:model_kwargs 解决 LangChain 未暴露但模型支持的参数问题,extra_body 解决厂商特供非标字段问题,config.configurable 实现单次调用的参数覆盖。日常开发中最常用的仍是基础参数(model、temperature、max_tokens 等),仅在特殊场景下才需要使用透传和覆盖机制。理解这三者的适用场景是编写灵活、可配置的 LangChain 应用的关键。