‹ 博客归档

LangChain 1.2 入门(十一):输出美化、profile 与 config

pretty_print 与 rich、profile 能力画像、model_fields 完整参数、model_kwargs/extra_body 透传,以及 config 运行时覆盖。

最后一篇是拓展内容:怎么把输出看得更清楚、怎么查模型能力、怎么拿到完整参数列表,以及调用时的 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)

rich 美化输出的 AIMessage 结构

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 上通常也能用。

DeepSeek API 文档:兼容 OpenAI 接口格式,base_url 为 https://api.deepseek.com

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

OpenAI Chat Completions 文档中的 tools 字段说明

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。

DeepSeek 文档中 thinking 字段的说明

结论:记住常见参数即可,需要精细控制模型输出时,查 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。

本文原文发布于 blog.aimock.cn,站内为只读同步。
阅读原文 · 去博客看评论