多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

LangChain模型配置进阶:从temperature到工程化参数管理

LangChain模型配置进阶:从temperature到工程化参数管理 1. 从“只会传temperature”到模型配置的深度掌控如果你在开发基于大语言模型的应用尤其是使用 LangChain 这类框架时是不是也经常这样写代码在初始化ChatOpenAI或ChatAnthropic时除了必填的api_key和model就只习惯性地设置一个temperature参数然后当需要调整top_p、max_tokens或者想为不同用户、不同任务预设不同的模型行为时就开始在各种函数调用里手动传参代码变得冗长且难以维护。这其实是一个普遍存在的“舒适区陷阱”。temperature作为控制生成随机性的核心参数知名度最高所以大家用得最顺手。但大语言模型的配置远不止于此它是一套完整的“行为指令集”。只会传temperature就像你买了一台功能强大的单反相机却永远只用自动模式拍照浪费了其绝大部分的创作潜力。今天我们就来彻底挖透 LangChain 中模型配置的三种高级玩法预设配置档Profile、全参数集中管理与运行时动态覆盖。掌握这些你将能实现配置工程化告别散落在代码各处的魔法数字让模型参数像项目配置一样清晰、可管理。场景化适配为“创意写作”、“严谨问答”、“代码生成”等不同任务一键切换最优参数组合。灵活性与可控性在链式调用或代理执行过程中针对特定环节动态微调模型行为实现更精细的控制。这不仅仅是调用语法糖而是构建稳定、可维护、高性能 LLM 应用的基础设施。我们直接进入正题。2. 超越temperature理解 LangChain 的模型配置体系在深入具体技术之前我们需要建立一个清晰的认知在 LangChain 中与模型交互的配置是一个分层、可组合的体系而不仅仅是一个构造函数的参数列表。2.1 模型配置的核心对象BaseLanguageModel与ChatModel无论是ChatOpenAI(OpenAI)、ChatAnthropic(Anthropic) 还是ChatGoogleGenerativeAI(Gemini)它们都继承自BaseChatModel最终都归属于BaseLanguageModel这个基类。这个基类定义了模型调用的通用接口而配置信息是这些调用中不可或缺的一部分。当我们初始化一个模型实例时如llm ChatOpenAI(model“gpt-4”, temperature0.7)传入的参数model,temperature,api_key等成为了这个实例的默认配置或静态配置。在后续的invoke、batch或stream调用中如果没有额外指定就会使用这些默认值。2.2 配置参数的分类与作用除了model和api_key这类身份标识模型的行为配置参数大致可分为几类生成策略参数这是我们最熟悉的。temperature(温度)控制随机性。值越高如 1.0输出越随机、有创意值越低如 0.1输出越确定、保守。top_p(核采样)另一种控制随机性的方式通常与temperature二选一。它从概率质量最高的 token 中采样直到累积概率超过top_p。top_k仅从概率最高的 k 个 token 中采样。frequency_penalty,presence_penalty(OpenAI)用于降低重复词汇的出现频率。输出约束参数max_tokens/max_output_tokens生成内容的最大长度token 数。这是成本和安全的关键控制阀。不设上限可能导致生成冗长内容或意外的高额费用。stop指定一个字符串序列当模型生成其中任何一个时立即停止。模型特定参数某些提供商有独特参数。Anthropic 的max_tokens_to_sample。早期 OpenAI 的best_of参数。一些开源模型支持的repetition_penalty。一个常见的误区是孤立地看待这些参数。例如temperature0并不意味着完全确定性输出如果同时设置了top_p0.9模型仍然会进行采样。最佳实践是理解你使用的模型提供商对这些参数的官方解释和交互影响。2.3 为什么需要更高级的配置管理假设你正在构建一个写作助手应用包含三个功能头脑风暴需要高创造性 (temperature0.9,max_tokens500)。文章润色需要稳定、精准的改写 (temperature0.3,max_tokens2000)。摘要生成需要高度忠实于原文 (temperature0.1,max_tokens300)。如果只用默认配置你可能会写出这样的代码# 反面教材配置散落难以维护 def brainstorm(topic): llm ChatOpenAI(model“gpt-4”, temperature0.9, max_tokens500) return llm.invoke(f“头脑风暴关于{topic}的点子”) def polish(text): llm ChatOpenAI(model“gpt-4”, temperature0.3, max_tokens2000) # 重复初始化 return llm.invoke(f“润色以下文本{text}”) def summarize(text): llm ChatOpenAI(model“gpt-4”, temperature0.1, max_tokens300) # 再次重复初始化 return llm.invoke(f“总结以下文本{text}”)问题显而易见代码重复相同的model、api_key被重复定义。配置硬编码参数值直接写在函数里修改时需要到处找。资源浪费多次初始化模型客户端虽然有些 SDK 可能有内部连接池但这不是好习惯。无法动态调整如果想根据用户等级调整max_tokens或者根据输入长度动态计算max_tokens会非常麻烦。接下来我们就用三种方案来解决这些问题。3. 方案一使用with_config创建配置预设档Profile这是最直观、最符合“配置档”思维的方式。LangChain 的 Runnable 协议BaseLanguageModel也实现了该协议提供了一个强大的with_config方法允许你为一个可运行对象如模型创建一个带有预设配置的新版本。核心思想不修改原始模型实例而是生成一个携带了特定配置的“副本”或“视图”。3.1 基础用法为任务创建预设首先我们创建一个基础的、配置最简化的模型实例。通常这里只放一些通用的、不常变的设置比如model名称和api_key后者更推荐通过环境变量管理。from langchain_openai import ChatOpenAI # 基础模型实例使用环境变量中的 OPENAI_API_KEY base_llm ChatOpenAI(model“gpt-4o-mini”) # 这里不设置 temperature 等行为参数现在为不同的任务创建预设档# 创建“创意”预设档用于头脑风暴、故事生成 creative_llm base_llm.with_config(configurable{“temperature”: 0.9, “max_tokens”: 500}) # 创建“精确”预设档用于摘要、问答 precise_llm base_llm.with_config(configurable{“temperature”: 0.1, “max_tokens”: 300}) # 创建“平衡”预设档通用对话 balanced_llm base_llm.with_config(configurable{“temperature”: 0.7, “max_tokens”: 1000})使用起来非常简单直接# 使用创意预设进行头脑风暴 brainstorm_result creative_llm.invoke(“请为一款智能水杯想五个营销口号”) print(brainstorm_result.content) # 使用精确预设进行摘要 summary_result precise_llm.invoke(“请用一句话总结以下长文章...”) print(summary_result.content)这样做的好处关注点分离基础配置模型类型、API密钥与行为配置温度、token数解耦。可复用性creative_llm、precise_llm可以在整个项目中的任何地方被引用保证同一任务行为一致。易于管理所有预设集中定义一目了然。要调整“创意”的max_tokens只需修改一处。3.2 进阶配置档的嵌套与组合with_config的威力远不止于此。configurable字典可以接受 LangChain 的ConfigurableField和ConfigurableFieldSingleOption等特殊对象实现更动态的配置。假设我们有一个需求应用支持多个模型提供商OpenAI, Anthropic并且每个提供商下都有“创意”和“精确”两种模式。硬编码所有组合会非常臃肿。我们可以利用ConfigurableField来定义可配置的维度from langchain_core.runnables import ConfigurableField from langchain_openai import ChatOpenAI from langchain_anthropic import ChatAnthropic # 1. 定义可配置的“模型规格”维度 # 这里我们创建一个特殊的 ChatOpenAI 实例但其 model 参数是可配置的 openai_llm ChatOpenAI(temperature0.7).configurable_fields( modelConfigurableField( id“openai_model”, name“OpenAI Model”, description“The OpenAI model to use”, ) ) # 同理定义 Anthropic 模型注意Anthropic的参数名可能不同这里是示例 anthropic_llm ChatAnthropic(temperature0.7).configurable_fields( modelConfigurableField( id“anthropic_model”, name“Anthropic Model”, description“The Anthropic model to use”, ) ) # 2. 定义一个顶层的、可切换的“提供商”维度 llm_provider openai_llm.with_fallbacks([anthropic_llm]) # 或者用其他方式选择 # 3. 此时我们可以通过 with_config 动态指定所有维度 # 使用 OpenAI 的 GPT-4 创意模式 gpt4_creative llm_provider.with_config( configurable{ “openai_model”: “gpt-4”, # 配置 OpenAI 模型维度 “temperature”: 0.9, # 覆盖默认的 temperature “max_tokens”: 500 } ) # 使用 Anthropic 的 Claude-3 精确模式 claude_precise llm_provider.with_config( configurable{ “anthropic_model”: “claude-3-opus-20240229”, “temperature”: 0.1, “max_tokens”: 1000 } )这个例子展示了如何将配置“维度化”。在实际大型应用中你可以将“模型提供商”、“模型版本”、“生成策略”创意/精确、“输出长度”等都定义为可配置维度然后通过一个中心化的配置系统来驱动。这对于 A/B 测试、多租户场景不同用户使用不同配置尤其有用。实操心得with_config创建的“配置档”对象其本身仍然是Runnable。这意味着你可以把它放入 LCEL 链中或者继续对它调用.with_config()进行更深层的覆盖。配置的优先级是最近一次with_config的配置 上一次的配置 原始实例的默认配置。4. 方案二集中化管理与注入全参数方案一适合基于“预设”的场景。但有时我们需要更中心化、更显式的管理方式特别是当配置可能来自外部文件如 YAML、JSON或数据库时。这时我们可以采用“工厂模式”或“配置注入”模式。4.1 构建一个模型配置工厂创建一个专门的函数或类负责根据“配置名称”或“场景”生成配置好的模型实例。from typing import Dict, Any from langchain_openai import ChatOpenAI from langchain_anthropic import ChatAnthropic class ModelFactory: # 预定义的配置字典 _PROFILES: Dict[str, Dict[str, Any]] { “creative”: { “provider”: “openai”, “model”: “gpt-4o”, “temperature”: 0.9, “max_tokens”: 500, “top_p”: 0.95, }, “precise”: { “provider”: “openai”, “model”: “gpt-4o”, “temperature”: 0.1, “max_tokens”: 300, “top_p”: 1.0, }, “long_form”: { “provider”: “anthropic”, “model”: “claude-3-sonnet-20240229”, “temperature”: 0.7, “max_tokens”: 4000, # Claude 擅长长文本 “top_p”: 0.9, }, “code”: { “provider”: “openai”, “model”: “gpt-4o”, “temperature”: 0.2, “max_tokens”: 2000, “stop”: [“\n\n\n”], # 代码生成时常见的停止序列 } } classmethod def get_model(cls, profile_name: str, **override_kwargs): “”“根据配置档名称获取模型实例并支持参数覆盖。”“” if profile_name not in cls._PROFILES: raise ValueError(f“Unknown profile: {profile_name}”) config cls._PROFILES[profile_name].copy() # 复制配置避免修改原字典 config.update(override_kwargs) # 允许调用时临时覆盖 provider config.pop(“provider”) model_name config.pop(“model”) if provider “openai”: # 注意这里需要处理 api_key通常从环境变量或密钥管理服务获取 # 假设已设置 OPENAI_API_KEY 环境变量 return ChatOpenAI(modelmodel_name, **config) elif provider “anthropic”: # 假设已设置 ANTHROPIC_API_KEY 环境变量 return ChatAnthropic(modelmodel_name, **config) else: raise ValueError(f“Unsupported provider: {provider}”) # 使用工厂 factory ModelFactory() creative_writer factory.get_model(“creative”) code_helper factory.get_model(“code”, temperature0.1) # 临时覆盖 temperature这种模式的优点终极的集中化管理所有配置在一个地方_PROFILES修改、扩展、审核都非常方便。支持复杂逻辑工厂方法里可以添加更复杂的逻辑比如根据负载选择模型、从远程配置中心拉取配置等。易于测试可以轻松 Mock 这个工厂或在测试时注入不同的配置。类型安全如果使用 Pydantic 来定义_PROFILES的结构可以获得更好的类型提示和验证。4.2 从外部文件加载配置为了让配置与代码完全分离我们可以将_PROFILES移到 YAML 或 JSON 文件中。config/model_profiles.yaml:profiles: creative: provider: openai model: gpt-4o temperature: 0.9 max_tokens: 500 top_p: 0.95 precise: provider: openai model: gpt-4o temperature: 0.1 max_tokens: 300 top_p: 1.0 long_form: provider: anthropic model: claude-3-sonnet-20240229 temperature: 0.7 max_tokens: 4000然后在工厂中加载import yaml from pathlib import Path class ModelFactory: def __init__(self, config_path: Path): with open(config_path, ‘r’) as f: config_data yaml.safe_load(f) self._profiles config_data[‘profiles’] def get_model(self, profile_name: str, **override_kwargs): # ... 逻辑与之前类似使用 self._profiles ...这样产品经理或运维人员可以在不接触代码的情况下调整模型参数进行线上实验。踩坑提醒从文件加载配置时务必注意类型转换。YAML/JSON 中的数字0.1会被正确解析为浮点数但如果你不小心写成了字符串“0.1”模型初始化时可能会报类型错误。建议在工厂方法中加入配置验证和类型转换逻辑。5. 方案三运行时动态覆盖与链式调用集成前两种方案解决了“预设”和“集中管理”的问题。但在一个复杂的 LangChain 应用如 Agent、复杂 LCEL 链中我们经常需要在运行时根据当前上下文动态地调整某个步骤的模型配置。这就是“运行时动态覆盖”的用武之地。LangChain 的Runnable接口在调用时invoke、batch、stream支持通过config参数传递配置这些配置可以覆盖模型实例的默认设置。5.1 在invoke时直接覆盖这是最直接的方式。from langchain_openai import ChatOpenAI # 创建一个默认配置的模型 default_llm ChatOpenAI(model“gpt-4o”, temperature0.7, max_tokens1000) # 大多数情况下使用默认配置 standard_response default_llm.invoke(“写一首短诗。”) # 但在某个特定请求中我需要更精确、更简短的回答 precise_response default_llm.invoke( “用一句话解释量子计算。”, config{“configurable”: {“temperature”: 0.1, “max_tokens”: 100}} # 运行时覆盖 )这里的config参数是一个字典其中configurable字段下的内容会被用来覆盖模型的可配置参数。注意config参数的结构是 LangChain Runnable 协议的一部分它不仅可以传递模型参数还可以传递回调、标签等元数据。5.2 在 LCEL 链中动态配置这才是动态覆盖威力最大的地方。LCEL 链允许你将多个 Runnable 组件组合在一起。你可以通过RunnableConfig将配置传递给链的特定环节。假设我们有一个简单的“翻译-总结”链先将英文翻译成中文再总结中文内容。我们希望翻译步骤使用“精确”模式而总结步骤使用“创意”模式。from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import RunnablePassthrough from langchain_openai import ChatOpenAI # 1. 定义提示词模板 translate_prompt ChatPromptTemplate.from_template(“将以下英文翻译成专业、准确的中文{text}”) summarize_prompt ChatPromptTemplate.from_template(“用一句生动的话总结以下中文内容{text}”) # 2. 创建基础模型 base_llm ChatOpenAI(model“gpt-4o”) # 3. 构建链 chain ( {“text”: RunnablePassthrough()} | translate_prompt | base_llm.with_config(configurable{“temperature”: 0.1, “max_tokens”: 500}) # 翻译环节精确 | (lambda x: x.content) # 提取翻译结果 | {“text”: RunnablePassthrough()} | summarize_prompt | base_llm.with_config(configurable{“temperature”: 0.8, “max_tokens”: 100}) # 总结环节创意 ) # 运行链 result chain.invoke(“The rapid advancement of artificial intelligence presents both unprecedented opportunities and significant ethical challenges for global society.”) print(result.content) # 输出可能是“AI浪潮席卷全球在打开机遇宝库的同时也敲响了伦理警钟。”在这个链中我们通过.with_config()将不同的配置“绑定”到了链的不同环节。当链执行时每个环节的模型调用都会使用其绑定的配置。5.3 更复杂的场景基于上下文的动态配置有时我们需要的配置不是静态的而是需要根据输入内容动态计算。例如根据输入文本的长度来决定max_tokens。我们可以通过自定义函数和RunnableLambda来实现from langchain_core.runnables import RunnableLambda def dynamic_config_router(input_text: str): “”“根据输入长度动态决定配置。”“” input_length len(input_text) if input_length 100: # 短输入允许较长输出 return {“configurable”: {“max_tokens”: 500, “temperature”: 0.7}} elif input_length 500: return {“configurable”: {“max_tokens”: 800, “temperature”: 0.5}} else: # 长输入限制输出并降低随机性以保证稳定性 return {“configurable”: {“max_tokens”: 300, “temperature”: 0.2}} # 创建一个动态配置的链 dynamic_chain ( RunnablePassthrough.assign(dynamic_configlambda x: dynamic_config_router(x[“text”])) | ChatPromptTemplate.from_template(“处理以下内容{text}”) | base_llm # 使用基础模型 ) # 调用时需要将动态计算出的 config 传递进去 # 这需要一些技巧通常可以通过 RunnableLambda 将 config 合并到输入中 # 或者使用更高级的 .with_config() 与 Runnable.get_graph().config 结合。 # 下面是一个简化示例展示思路 from langchain_core.runnables import ConfigurableFieldSpec # 定义一个可接收动态配置的模型 configurable_llm base_llm.configurable_fields( temperatureConfigurableFieldSpec( id“temperature”, annotationfloat, default0.7, ), max_tokensConfigurableFieldSpec( id“max_tokens”, annotationint, default1000, ), ) # 在链中前一个步骤需要输出一个包含 config 键的字典 def prepare_input(data): text data[“text”] config dynamic_config_router(text) return {“text”: text, “config”: config} complex_chain ( RunnableLambda(prepare_input) | ChatPromptTemplate.from_template(“处理{text}”) | configurable_llm # 这个模型会从输入上下文中寻找 config ) # 注意上述代码是概念演示实际实现可能需要根据 LangChain 版本调整 # 核心思想是将“配置计算”作为一个步骤融入链中。重要提示运行时动态覆盖是强大但需要谨慎使用的功能。它破坏了模型的“无状态”性使得调试和日志记录变得更复杂。务必确保你的覆盖逻辑清晰并为每次调用记录下所使用的完整配置这对于复现问题和分析成本至关重要。6. 实战避坑模型配置中的常见陷阱与最佳实践掌握了三种配置方法但在实际项目中你还会遇到一些具体的坑。这里分享几个我踩过之后总结出的经验。6.1 陷阱一配置冲突与优先级混淆当你同时使用多种配置方式时例如模型默认参数 with_config预设 invoke运行时覆盖很容易混淆优先级。LangChain 的配置优先级规则从高到低invoke/batch/stream调用时传入的config参数最高优先级。通过.with_config()绑定到 Runnable 对象上的配置。模型构造函数中传入的默认参数最低优先级。llm ChatOpenAI(temperature0.5, max_tokens2000) # 默认层 preset_llm llm.with_config(configurable{“temperature”: 0.8}) # 预设层 # 调用时 result1 preset_llm.invoke(“hello”) # 使用 temperature0.8, max_tokens2000 result2 preset_llm.invoke(“hello”, config{“configurable”: {“temperature”: 0.2}}) # 使用 temperature0.2, max_tokens2000最佳实践在项目早期就明确约定配置的层次策略。例如“所有模型实例均通过ModelFactory创建并只使用工厂的预设。禁止在业务代码中直接使用with_config或运行时config参数除非是用于全局 A/B 测试开关。” 这样可以极大降低复杂度。6.2 陷阱二max_tokens的“无底洞”与成本失控不设置max_tokens或设置得过大是新手最容易犯的、也是代价最高的错误之一。模型可能会生成极其冗长的内容消耗大量 token导致账单暴增。解决方案永远显式设置max_tokens即使你期望生成长内容也应该设置一个合理的上限例如 2000、4000。动态计算max_tokens一个实用的启发式方法是根据输入长度来计算。例如max_tokens min(4000, len(input_text) * 2)既保证有足够的输出空间又防止失控。使用stop序列对于对话、代码生成等场景设置合理的stop序列如[“\n\n”, “###”, “Human:”]可以作为max_tokens的安全网在内容结构自然结束时提前终止。6.3 陷阱三temperature与top_p的“双重采样”很多开发者会同时设置temperature和top_p以为能加倍控制随机性。实际上对于 OpenAI 的 API官方建议通常只更改其中一个而不是同时更改。因为两者都影响采样概率分布同时使用可能导致不可预测的、过于极端的行为要么过于随机要么过于确定。最佳实践二选一优先使用temperature进行通用控制。只有在需要更精细的概率截断时例如只想从前 90% 概率的 token 中采样才使用top_p并将temperature设为 1 或保持默认。参考官方文档不同模型提供商对参数的解释可能不同。使用前务必查阅对应模型的最新 API 文档。6.4 陷阱四配置的序列化与持久化问题如果你需要将配置好的链Chain或代理Agent保存到磁盘例如使用chain.save(“my_chain.json”)那么通过.with_config()绑定的配置通常可以随链一起保存。但是通过运行时invoke(config...)传递的配置是瞬时的不会被保存。如果需要持久化动态配置考虑将配置逻辑本身作为链的一部分如前文的dynamic_config_router示例或者将配置作为链的初始化参数。6.5 性能考量实例化开销与连接池反复创建新的模型实例ChatOpenAI(...)是有开销的因为它可能涉及建立网络连接、加载配置等。在高速处理大量请求的服务中这会影响性能。最佳实践复用模型实例使用我们介绍的配置档with_config或工厂模式ModelFactory核心是复用同一个基础客户端实例只改变其配置“视图”避免重复初始化。理解 SDK 内部机制一些 LangChain 集成如ChatOpenAI底层使用的客户端如openai.OpenAI可能内置了连接池和请求复用。即便如此在应用层面保持实例复用也是良好的设计习惯。7. 融会贯通构建一个配置驱动的智能写作助手让我们综合运用以上所有知识设计一个简易但功能完整的配置驱动型应用智能写作助手。它支持多种写作风格并能根据用户选择的风格和输入长度自动优化配置。需求支持“学术”、“营销”、“创意”三种风格预设。根据输入文本长度自动调整max_tokens输出不超过输入的2倍且最大4000。允许用户在调用时临时覆盖风格参数。实现# config.yaml profiles: academic: base_temperature: 0.2 base_top_p: 1.0 description: “用于论文、报告等严谨文体。” marketing: base_temperature: 0.7 base_top_p: 0.9 description: “用于广告文案、宣传语等吸引眼球的文体。” creative: base_temperature: 0.9 base_top_p: 0.95 description: “用于小说、诗歌、故事等创意写作。”# model_factory.py import yaml from langchain_openai import ChatOpenAI from typing import Literal class WritingAssistantFactory: def __init__(self, config_path: str): with open(config_path, ‘r’) as f: self.config yaml.safe_load(f) self._base_llm ChatOpenAI(model“gpt-4o”) # 基础实例 def _calculate_dynamic_config(self, input_text: str, style: str): “”“动态计算配置。”“” style_config self.config[‘profiles’][style] input_len len(input_text) # 动态 max_tokens 逻辑 max_output_tokens min(input_len * 2, 4000) # 确保至少有一定输出空间 max_output_tokens max(max_output_tokens, 200) return { “temperature”: style_config[‘base_temperature’], “top_p”: style_config[‘base_top_p’], “max_tokens”: max_output_tokens, } def get_assistant(self, style: Literal[“academic”, “marketing”, “creative”]): “”“获取一个配置好的写作助手LCEL链。”“” from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import RunnableLambda, RunnablePassthrough # 定义提示词模板 prompt_template ChatPromptTemplate.from_messages([ (“system”, “你是一位专业的写作助手。请根据以下要求处理用户输入。”), (“human”, “写作风格{style}\n\n请处理以下文本{input_text}”), ]) # 构建动态配置计算环节 def bind_style_and_input(data: dict): “”“将风格和输入文本绑定并计算动态配置。”“” input_text data[“input_text”] style data[“style”] dynamic_config self._calculate_dynamic_config(input_text, style) # 返回包含原始输入和配置的字典 return { “input_text”: input_text, “style”: style, “config”: dynamic_config } # 创建链 chain ( RunnablePassthrough.assign(stylelambda x: x.get(“style”, “academic”)) | RunnableLambda(bind_style_and_input) | prompt_template | self._base_llm # 基础模型配置将由上一步的 config 动态提供 | (lambda x: x.content) ) return chain # 使用助手 factory WritingAssistantFactory(“config.yaml”) assistant factory.get_assistant(“marketing”) result assistant.invoke({ “input_text”: “我们的新产品是一款智能咖啡机支持手机App控制能研磨多种咖啡豆。”, “style”: “marketing” }) print(f“营销文案{result}”) # 用户临时想要更保守的营销文案 result_conservative assistant.invoke({ “input_text”: “我们的新产品是一款智能咖啡机支持手机App控制能研磨多种咖啡豆。”, “style”: “marketing” }, config{“configurable”: {“temperature”: 0.4}}) # 运行时覆盖降低随机性 print(f“保守版营销文案{result_conservative}”)这个例子展示了如何将预设配置档YAML、集中化管理Factory、动态计算逻辑和运行时覆盖有机结合构建出一个灵活、健壮且易于维护的 LLM 应用配置体系。模型配置不是简单的参数传递而是 LLM 应用工程化的基石。从只会传temperature到系统性地使用配置档、工厂模式和动态覆盖你获得的是对模型行为的精细控制力、代码的可维护性以及应对复杂场景的从容。开始重构你项目中的模型配置吧把它从散落的魔法数字变成清晰、强大且富有弹性的驱动引擎。
返回列表