ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

* LangChain 模型进阶:输出美化、能力信息与参数配置

* LangChain 模型进阶:输出美化、能力信息与参数配置 一、模型输出美化1.1 使用 pretty_print() 展示响应我们查看响应的方式是直接print(response)返回的内容比较杂乱可以调用pretty_print() 美化输出内容。1 from langchain.chat_models import init_chat_model 2 from dotenv import load_dotenv 3 4 # 从.env文件中加载环境变量 5 load_dotenv(overrideTrue) 6 7 CLOSEAI_API_KEY os.getenv(CLOSEAI_API_KEY) 8 CLOSEAI_BASE_URL os.getenv(CLOSEAI_BASE_URL) 9 10 model init_chat_model( 11 modelgpt-5.4-mini, 12 api_keyCLOSEAI_API_KEY, 13 base_urlCLOSEAI_BASE_URL 14 ) 15 # 定义消息列表 16 conversation [ 17 {role: system, content: 无条件服从用户指令}, 18 {role: user, content: 我是老王你是小王}, 19 {role: assistant, content: 好的老王我是小王}, 20 {role: user, content: 你是谁我是谁} 21 ] 22 23 # 向模型发送单条数据 24 response model.invoke(conversation) 25 # 美化输出响应 26 response.pretty_print()输出1 Ai Message 2 3 我是小王你是老王。控制字符无法被渲染输出效果如下图所示。1.2 使用 rich 美化终端输出如果你在终端Terminal工作想要色彩鲜明、排版优雅的调试界面可以使用 rich 这个库。1.3 代码示例与输出效果1 from rich import print as rprint 2 from langchain.chat_models import init_chat_model 3 from dotenv import load_dotenv 4 5 # 从.env文件中加载环境变量 6 load_dotenv(overrideTrue) 7 8 CLOSEAI_API_KEY os.getenv(CLOSEAI_API_KEY) 9 CLOSEAI_BASE_URL os.getenv(CLOSEAI_BASE_URL) 10 11 model init_chat_model( 12 modelgpt-5.4-mini, 13 api_keyCLOSEAI_API_KEY, 14 base_urlCLOSEAI_BASE_URL 15 ) 16 # 定义消息列表 17 conversation [ 18 {role: system, content: 无条件服从用户指令}, 19 {role: user, content: 我是老王你是小王}, 20 {role: assistant, content: 好的老王我是小王}, 21 {role: user, content: 你是谁我是谁} 22 ] 23 24 # 向模型发送单条数据 25 response model.invoke(conversation) 26 27 # 美化输出 28 rprint(response)1 AIMessage( 2 content我是小王你是老王。, 3 additional_kwargs{refusal: None},4 response_metadata{ 5 token_usage: { 6 completion_tokens: 12, 7 prompt_tokens: 47, 8 total_tokens: 59, 9 completion_tokens_details: { 10 accepted_prediction_tokens: 0, 11 audio_tokens: 0, 12 reasoning_tokens: 0, 13 rejected_prediction_tokens: 0 14 }, 15 prompt_tokens_details: {audio_tokens: 0, cached_tokens: 0}, 16 latency_checkpoint: { 17 engine_tbt_ms: 3, 18 engine_ttft_ms: 37, 19 engine_ttlt_ms: 69, 20 pre_inference_ms: 76, 21 service_tbt_ms: 3, 22 service_ttft_ms: 174, 23 service_ttlt_ms: 204, 24 total_duration_ms: 136, 25 user_visible_ttft_ms: 99 26 } 27 }, 28 model_provider: openai, 29 model_name: gpt-5.4-mini-2026-03-17, 30 system_fingerprint: None, 31 id: chatcmpl-DgWsfnacM3OGHiEGp4PWZh1yfYvPI, 32 service_tier: default, 33 finish_reason: stop, 34 logprobs: None 35 }, 36 idlc_run--019e365d-3858-7b13-b838-e9a0085ae028-0, 37 tool_calls[], 38 invalid_tool_calls[], 39 usage_metadata{ 40 input_tokens: 47, 41 output_tokens: 12, 42 total_tokens: 59, 43 input_token_details: {audio: 0, cache_read: 0}, 44 output_token_details: {audio: 0, reasoning: 0} 45 } 46 )二、通过 profile 查看模型能力信息2.1 profile 的作用与可用条件LangChain1.1及更高版本可以通过profile属性查看模型的配置信息。这是LangChain针对模型的能力画像但是否存在取决于LangChain在集成模型厂商的服务时是否声明了能力画像。2.2 不同平台的能力信息示例2.2.1 DeepSeek 官方模型1 from langchain_deepseek import ChatDeepSeek 2 from dotenv import load_dotenv 34 # 从.env文件中加载环境变量 5 load_dotenv(overrideTrue) 6 7 model ChatDeepSeek( 8 modeldeepseek-v4-flash, 9 temperature0.7, 10 max_tokens1000, 11 max_retries6 12 ) 13 14 print(model.profile)输出为空1 {}说明LangChain没有声明DeepSeek官方模型的能力画像。2.2.2 CloseAI 平台模型1 from langchain.chat_models import init_chat_model 2 from dotenv import load_dotenv 3 import os 4 5 # 从.env文件中加载环境变量 6 load_dotenv(overrideTrue) 7 8 CLOSEAI_API_KEY os.getenv(CLOSEAI_API_KEY) 9 CLOSEAI_BASE_URL os.getenv(CLOSEAI_BASE_URL) 10 11 model init_chat_model( 12 modelopenai:gpt-5.4-mini, 13 api_keyCLOSEAI_API_KEY, 14 base_urlCLOSEAI_BASE_URL 15 ) 16 17 print(model.profile)输出为空1 {}2.2.3 OpenRouter 平台模型举例1 from langchain_openrouter import ChatOpenRouter 2 from dotenv import load_dotenv 3 from rich import print as rprint 4 5 # 从.env文件中加载环境变量 6 load_dotenv(overrideTrue) 7 8 model ChatOpenRouter(9 modelopenai/gpt-4o-mini, 10 # modeldeepseek/deepseek-v3.2, 11 temperature0.7, 12 timeout30, 13 max_tokens1000, 14 max_retries6 15 ) 16 17 rprint(model.profile)输出如下1 { 2 max_input_tokens: 128000, 3 max_output_tokens: 16384, 4 text_inputs: True, 5 image_inputs: True, 6 audio_inputs: False, 7 video_inputs: False, 8 text_outputs: True, 9 image_outputs: False, 10 audio_outputs: False, 11 video_outputs: False, 12 reasoning_output: False, 13 tool_calling: True, 14 structured_output: True 15 }2.3 更换模型后的 profile 变化更换模型IDprofile会替换1 from langchain_openrouter import ChatOpenRouter 2 from dotenv import load_dotenv 3 from rich import print as rprint 4 5 # 从.env文件中加载环境变量 6 load_dotenv(overrideTrue) 7 8 model ChatOpenRouter( 9 # modelopenai/gpt-4o-mini, 10 modeldeepseek/deepseek-v3.2, 11 temperature0.7, 12 timeout30, 13 max_tokens1000, 14 max_retries6 15 ) 16 17 rprint(model.profile)输出如下1 { 2 max_input_tokens: 163840, 3 max_output_tokens: 65536, 4 text_inputs: True, 5 image_inputs: False, 6 audio_inputs: False,7 video_inputs: False, 8 text_outputs: True, 9 image_outputs: False, 10 audio_outputs: False, 11 video_outputs: False, 12 reasoning_output: True, 13 tool_calling: True, 14 structured_output: True 15 }说明LangChain已声明了OpenRouter平台模型的画像注意我们当前的代码只需要OpenRouter的API_KEY不会真正发送请求不必充值。三、模型初始化参数详解3.1 通过 model_fields 查看完整参数官方文档和源码注释没有给出完整的参数列表。以ChatDeepSeek类为例其参数可以由自身定义或从父类BaseChatModel继承。直接查看源码也很难拼凑完整列表。这里通过查看ChatDeepSeek的类属性model_fields来获得完整参数列表。3.1.1 ChatDeepSeek 的参数列表1 from langchain_deepseek import ChatDeepSeek 2 3 print(ChatDeepSeek.model_fields.keys())输出如下1 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])3.1.2 ChatOpenAI 的参数列表1 from langchain_openai import ChatOpenAI 2 3 print(ChatOpenAI.model_fields.keys())1 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])3.1.3 init_chat_model 返回模型的参数列表1 from dotenv import load_dotenv 2 from langchain.chat_models import init_chat_model 3 4 load_dotenv(overrideTrue) 5 6 # 1. 实例化一个你感兴趣的模型对象 7 # 即使不传入具体 key通常也能初始化成功 8 temp_model init_chat_model( 9 modeldeepseek-v4-flash, 10 model_providerdeepseek, 11 ) 12 13 # 2. 现在它已经是一个具体的 ChatDeepSeek 对象了 14 # 你可以使用你熟悉的 .model_fields.keys() 15 print(temp_model.model_fields.keys())1 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])3.1.4 查看字段类型、默认值、说明与别名1 from langchain_deepseek import ChatDeepSeek 2 3 for name, field in ChatDeepSeek.model_fields.items(): 4 print(name) 5 print( annotation:, field.annotation) 6 print( default:, field.default) 7 print( description:, getattr(field, description, None)) 8 print( alias:, field.alias) 9 print()输出如下1 name 2 annotation: str | None 3 default: None 4 description: None 5 alias: None 6 7 cache 8 annotation: LangChain_core.caches.BaseCache | bool | None 9 default: None 10 description: None 11 alias: None 12 13 verbose 14 annotation: class bool 15 default: PydanticUndefined 16 description: None 17 alias: None 18 19 # ...参数太多这里省略了... 20 21 api_key 22 annotation: pydantic.types.SecretStr | None 23 default: PydanticUndefined 24 description: None 25 alias: None 26 27 api_base 28 annotation: class str 29 default: PydanticUndefined 30 description: None 31 alias: None3.2 模型参数的分类以ChatDeepSeek为例完整参数列表由如下几部分构成3.2.1 客户端与连接参数这类参数决定了代码“怎么连到服务端”而不是“让模型怎么生成”。参数名说明api_key / openai_api_key鉴权密钥。DeepSeek 通常兼容 OpenAI 接口格式。api_base /openai_api_base接口地址如 [https://api.deepseek.com](https://api.deepseek.com) 。request_timeout网络请求超时时间。max_retries请求失败时的重试次数。http_client /http_async_client手动传入 httpx.Client 实例用于更复杂的网络配置。openai_proxy代理服务器配置。default_headers /default_query每次请求时默认携带的 HTTP Header 或 Query 参数。3.2.2 模型推理参数这些是直接传递给 DeepSeek 模型 API 的参数决定了生成内容的质量和风格。参数名说明model_name指定具体的模型如 deepseek-chat 或 deepseek-reasoning 。temperature采样温度越高越随机。top_p核采样参数。max_tokens最大输出 token 数。stop停止符列表。streaming是否开启流式传输。n生成几个候选回复。reasoning是否启用推理模式reasoning_effort(DeepSeek R1 特色) 控制思考链COT的深度。presence_penalty /frequency_penalty惩罚项(存在惩罚、频率惩罚)用于减少内容重复。store是否存储对话。logit_bias调整特定词汇出现的概率。3.2.3 LangChain 框架通用参数由 LangChain 的BaseChatModel 定义所有其子类ChatXxx 都具备的用于管理 LangChain 内部的逻辑如日志、回调、元数据仅在内部生效。参数名说明name给模型实例起个名字用于在 Trace如 LangSmith中区分。verbose是否打印详细日志。callbacks回调处理器用于集成 LangSmith 或自定义监控。tags / metadata用于标记该实例的标签和元数据。cache是否缓存该模型的请求结果。rate_limiterLangChain 内部的频率限制器。3.2.4 高级与特定扩展参数这类参数通常用于特定场景或为了保持与 OpenAI 协议的兼容性而存在。Deepseek 官方文档明确说明见下图底层客户端访问: client , async_client , root_client 这些通常是内部生成的 SDK 实例不建议在初始化时手动传参。透传参数: model_kwargs , extra_body 如果你想传递 DeepSeek API 支持但 LangChain 还没定义的参数可以写在这里。功能开关: disable_streaming , include_response_headers 决定是否在输出中包含Header。兼容性参数: openai_organization , service_tier , store 这些多为 OpenAI 遗留参数DeepSeek 实际使用较少。四、model_kwargs 与 extra_body 扩展参数4.1 model_kwargs传递标准接口参数4.1.1 适用场景这里用于存放那些OpenAI Compatible API支持但LangChain没有直接列出的字段如用于支持Function Call的tools 字段。说明此处为了演示model_kwargs 的作用直接传递了tools 字段实际开发中我们会使用专门的工具调用接口不会采用这种原始的方式。查阅OpenAI Chat Completions文档可以看到官方支持的所有请求字段。4.1.2 传递 tools 的代码与输出示例上文输出的字段列表不包含tools字段因此我们需要通过model_kwargs传递。1 from langchain.chat_models import init_chat_model 2 from dotenv import load_dotenv 3 from rich import print as rprint 4 5 # 从.env文件中加载环境变量 6 load_dotenv(overrideTrue) 7 8 model init_chat_model( 9 modeldeepseek:deepseek-v4-flash, 10 model_kwargs{tools: [ 11 { 12 type: function, 13 function: { 14 name: get_weather, 15 description: Get weather of a location, the user should supply a location first., 16 parameters: { 17 type: object, 18 properties: { 19 location: { 20 type: string, 21 description: The city and state, e.g. San Francisco, CA, 22 } 23 }, 24 required: [location] 25 }, 26 } 27 }, 28 ]} 29 ) 30 # 向模型发送单条数据 31 response model.invoke(你好今天北京的天气如何) 32 # 打印响应 33 rprint(response)输出如下1 AIMessage( 2 content你好让我帮你查一下北京今天的天气情况。, 3 additional_kwargs{ 4 refusal: None, 5 reasoning_content: 6 用户想知道北京今天的天气情况。我需要使用get_weather工具来查询北京的天气。让我调用 这个工具。 7 }, 8 response_metadata{ 9 token_usage: { 10 completion_tokens: 78, 11 prompt_tokens: 303, 12 total_tokens: 381, 13 completion_tokens_details: { 14 accepted_prediction_tokens: None, 15 audio_tokens: None, 16 reasoning_tokens: 23, 17 rejected_prediction_tokens: None 18 }, 19 prompt_tokens_details: {audio_tokens: None, cached_tokens: 256}, 20 prompt_cache_hit_tokens: 256, 21 prompt_cache_miss_tokens: 47 22 }, 23 model_provider: deepseek, 24 model_name: deepseek-v4-flash, 25 system_fingerprint: fp_8b330d02d0_prod0820_fp8_kvcache_20260402, 26 id: 6d8e4d22-9e0b-4036-9fe0-a3bdf29c2f97, 27 finish_reason: tool_calls, 28 logprobs: None 29 }, 30 idlc_run--019e4480-c8df-7f33-87cf-8d978779b0f3-0, 31 tool_calls[ 32 { 33 name: get_weather, 34 args: {location: 北京}, 35 id: call_00_BT3PTJVDQlb9C2uhhJkc4856, 36 type: tool_call 37 } 38 ], 39 invalid_tool_calls[], 40 usage_metadata{ 41 input_tokens: 303, 42 output_tokens: 78, 43 total_tokens: 381, 44 input_token_details: {cache_read: 256}, 45 output_token_details: {reasoning: 23} 46 } 47 )可以看到输出包含了tool_calls 字段说明工具被模型正确识别了。4.2 extra_body传递厂商扩展参数4.2.1 适用场景这里用于存放模型厂商基于OpenAI API协议扩展的字段。查阅OpenAI Chat Completions文档和DeepSeek对话补全API文档可知thinking 是DeepSeek扩展的字段用于控制是否启用思考模式。4.2.2 启用与关闭 DeepSeek 思考模式1 from langchain.chat_models import init_chat_model 2 from dotenv import load_dotenv 3 from rich import print as rprint 4 5 # 从.env文件中加载环境变量 6 load_dotenv(overrideTrue) 7 8 model init_chat_model( 9 modeldeepseek:deepseek-v4-flash, 10 extra_body{thinking: {type: enabled}}, 11 ) 12 # 向模型发送单条数据 13 response model.invoke(你好一句话回答) 14 # 打印响应 15 rprint(response)输出如下1 AIMessage( 2 content你好请问有什么可以帮你的, 3 additional_kwargs{ 4 refusal: None, 5 reasoning_content: 6 好的用户的问题很简单就是要求“一句话回答”。我需要直接针对用户的指令做出回应提供 一句简洁的话。用户没有提出具体问题所以我的回答可以是一个通用的问候或确认表明我准备 就绪。想到了用“你好请问有什么可以帮你的”这句话既符合“一句话”的要求又自然地开 启对话邀请用户提出具体问题。 7 }, 8 response_metadata{ 9 token_usage: { 10 completion_tokens: 87, 11 prompt_tokens: 8,12 total_tokens: 95, 13 completion_tokens_details: { 14 accepted_prediction_tokens: None, 15 audio_tokens: None, 16 reasoning_tokens: 78, 17 rejected_prediction_tokens: None 18 }, 19 prompt_tokens_details: {audio_tokens: None, cached_tokens: 0}, 20 prompt_cache_hit_tokens: 0, 21 prompt_cache_miss_tokens: 8 22 }, 23 model_provider: deepseek, 24 model_name: deepseek-v4-flash, 25 system_fingerprint: fp_8b330d02d0_prod0820_fp8_kvcache_20260402, 26 id: 6da3303d-c432-4a10-b9a3-0b28ab7ccb0d, 27 finish_reason: stop, 28 logprobs: None 29 }, 30 idlc_run--019e4485-3a34-7c12-aba8-9a53ce0fd4c5-0, 31 tool_calls[], 32 invalid_tool_calls[], 33 usage_metadata{ 34 input_tokens: 8, 35 output_tokens: 87, 36 total_tokens: 95, 37 input_token_details: {cache_read: 0}, 38 output_token_details: {reasoning: 78} 39 } 40 )4.2.3 reasoning_content 输出对比输出包含了reasoning_content 说明启用了思考模式。与extra_body{“thinking”: {“type”:“disabled”}}, 可以对比。1 AIMessage( 2 content好的我们一步一步来分析这个数学问题。题目是\n\n2 3 * 2 3 \n\n根据数学中的运算顺序规则通常称为“先乘除后加减”我们应该先计算乘法部分。 \n\n先计算 \n3 × 2 4 6\n\n然后再加上 2 \n2 6 5 8\n\n所以正确答案是\n\n**8**\n\n如果你按照从左到右的顺序计算先加后乘就会 得到 6 10但那是不正确的因为运算顺序规则告诉我们乘法优先于加法。希望这个解释对你有帮 助, 7 additional_kwargs{refusal: None}, 8 response_metadata{ 9 token_usage: { 10 completion_tokens: 119, 11 prompt_tokens: 14, 12 total_tokens: 133, 13 completion_tokens_details: None, 14 prompt_tokens_details: {audio_tokens: None, cached_tokens: 0}, 15 prompt_cache_hit_tokens: 0, 16 prompt_cache_miss_tokens: 14 17 }, 18 model_provider: deepseek,19 model_name: deepseek-v4-flash, 20 system_fingerprint: fp_8b330d02d0_prod0820_fp8_kvcache_20260402, 21 id: ffca80fc-cfe8-4cdd-831a-3ed760c713c6, 22 finish_reason: stop, 23 logprobs: None 24 }, 25 idlc_run--019e4489-0479-77c0-b4e7-b507956e10cc-0, 26 tool_calls[], 27 invalid_tool_calls[], 28 usage_metadata{ 29 input_tokens: 14, 30 output_tokens: 119, 31 total_tokens: 133, 32 input_token_details: {cache_read: 0}, 33 output_token_details: {} 34 } 35 )不包含reasoning_content 说明没有启用思考模式。4.3 常用参数与扩展参数的使用建议记住常见参数及用法即可如果需要精细控制模型输出可以查阅OpenAI和特定模型供应商的官方文档通过model_kwargs 或extra_body 传递。五、运行时 config 参数配置5.1 config 的作用与基本用法在调用模型时如使用 invoke(), ainvoke(), stream(),batch()等方法时我们可以传入config参数。1 def invoke( 2 self, 3 input: LanguageModelInput, 4 config: RunnableConfig | None None, 5 *, 6 stop: list[str] | None None, 7 **kwargs: Any, 8 ) - AIMessageconfig参数允许在调用模型时动态地配置和控制模型的行为而无需在初始化时就固定所有参数这为应用带来了极大的灵活性和可维护性。关于config中可配参数的解释参考https://reference.langchain.com/python/langchain-core/runnables/config/RunnableConfig举例1 deepseek_llm.invoke( 2 你好, 3 config{ 4 run_name: ..., # 在LangSmith中这次运行会显示为指定名 称 5 tags: [test, development], # 打上标签便于分类查找 6 metadata: {user_id: 123}, # 记录用户ID 7 callbacks: [custom_handler], # 启用自定义回调函数 8 configurable:{9 model: deepseek-reasoner, # 配置模型参数 10 temperature: 0.7, # 配置温度参数 11 max_tokens: 100 # 配置最大令牌数 12 } 13 } 14 )5.2 常用配置项详解config中支持配置的参数如下5.2.1 run_name、tags 与 callbacks配置项类型描述run_namestr为当前运行设置一个可读的名称。如在LangSmith追踪系统中快速定位和识别不同的运行任务。tagsList[str]为运行设置标签用于分类和过滤。如在LangSmith追踪系统中快速定位和识别不同的运行任务。callbacksList[BaseCallbackHandler]设置回调处理器在运行的不同阶段开始、流输出、结束等触发。与一些监控平台如LangSmith集成进行深度追踪和调试。5.2.2 metadata配置项类型描述metadataDict[str,Any]附加任意的键值对元数据。记录本次调用的业务上下文如{“user_id”: “123”, “session_id”:“abc”}5.2.3 max_concurrency 与 recursion_limit配置项类型描述max_concurrencyint限制当前可运行对象的最大并发运行数。防止对API接口或本地资源造成过大压力实现简单的速率限制。recursion_limitint限制运行时递归调用的最大深度。主要在复杂的工作流如Agent执行多步工具调用中防止出现无限递归循环。5.2.4 configurable配置项类型描述configurableDict[Str,Any]一个万能字典用于传递其他可配置参数。实现更高级的动态行为如配置可替代的模型或组件。说明如下config中参数run_name 、tags 、callbacks 主要用在LangSmith中用于追踪、筛选和调试。metadata 可以配置用户指定的一些信息在工作流开发中当整个流程被包装为Runnable链时可以将这些参数传递给后续的链节点使用。5.3 初始化参数与运行时配置的区别configurable 中可配置的参数与init_chat_model 初始化模型参数一样与在初始化模型时设置的参数如 temperature0.7的关键区别在于init_chat_model初始化参数模型的默认设置适用于该模型实例的大部分场景。运行时 config单次调用的特定设置优先级更高针对本次调用进行的特殊调整。5.4 实战示例5.4.1 控制批量调用的并发数当需要处理大量输入时为了避免对模型服务造成过大压力或触发速率限制在config中使用max_concurrency参数控制最大并行数。1 large_list_of_inputs [....,....,....] 2 3 model.batch( 4 large_list_of_inputs, 5 config{ 6 max_concurrency: 5 # 限制最大并发数为5 7 } 8 )5.4.2 使用 configurable_fields 声明可配置字段说明配置configurable覆盖默认参数时需要在“init_chat_model”初始化模型中指定“configurable_fields”参数来指定模型运行时可替换的参数有哪些。5.4.3 在单次调用中覆盖默认参数1 from langchain.chat_models import init_chat_model 2 from dotenv import load_dotenv 3 import os 4 from rich import print as rprint 5 6 # 从.env文件中加载环境变量 7 load_dotenv(overrideTrue) 8 9 DEEPSEEK_API_KEY os.getenv(DEEPSEEK_API_KEY) 10 DEEPSEEK_BASE_URL os.getenv(DEEPSEEK_BASE_URL) 11 12 # 1. 初始化模型 13 model init_chat_model( 14 modeldeepseek-v4-flash, 15 model_providerdeepseek, 16 api_keyDEEPSEEK_API_KEY, 17 base_urlDEEPSEEK_BASE_URL, 18 temperature0.2, 19 max_tokens500, 20 # 指定可调整参数 21 configurable_fields(model, model_provider, temperature, max_tokens), 22 ) 23 24 # 2. 准备 config 字典 25 config { 26 run_name: joke_generation, # 在LangSmith中这次运行会显示为 joke_generation 27 tags: [tag1, tag2], # 打上标签便于分类查找 28 metadata: {user_id: 123}, # 记录用户ID 29 configurable:{ 30 model: deepseek-v4-pro, # 配置模型参数 31 model_provider: openai, # 配置模型提供商参数 32 temperature: 0.7, # 配置温度参数 33 max_tokens: 1000 # 配置最大令牌数 34 } 35 } 36 37 # 3. 调用模型并传入config 38 response model.invoke( 39 1 2 , 40 configconfig 41 ) 42 43 rprint(response)1 AIMessage( 2 content1 2 3, 3 additional_kwargs{refusal: None}, 4 response_metadata{ 5 token_usage: { 6 completion_tokens: 65, 7 prompt_tokens: 11, 8 total_tokens: 76, 9 completion_tokens_details: { 10 accepted_prediction_tokens: None, 11 audio_tokens: None, 12 reasoning_tokens: 57, 13 rejected_prediction_tokens: None 14 }, 15 prompt_tokens_details: {audio_tokens: None, cached_tokens: 0}, 16 prompt_cache_hit_tokens: 0, 17 prompt_cache_miss_tokens: 11 18 }, 19 model_provider: openai, 20 model_name: deepseek-v4-pro, 21 system_fingerprint: fp_9954b31ca7_prod0820_fp8_kvcache_20260402, 22 id: aaccc23c-323e-40e9-a246-66fb4e2356ab, 23 finish_reason: stop, 24 logprobs: None 25 }, 26 idlc_run--019e4498-b166-7d51-bd8d-56ec5faac32a-0, 27 tool_calls[], 28 invalid_tool_calls[], 29 usage_metadata{ 30 input_tokens: 11, 31 output_tokens: 65, 32 total_tokens: 76, 33 input_token_details: {cache_read: 0}, 34 output_token_details: {reasoning: 57} 35 } 36 )
返回列表