部分变量预填充与消息占位符:让对话更智能的两种技巧

发布时间:2026/8/28 19:12:10
部分变量预填充与消息占位符:让对话更智能的两种技巧 1. 引言在使用大语言模型构建对话应用时我们常常需要让模型在生成回复前就掌握一些关键信息或者让用户看到一些动态变化的提示内容。本文将介绍两种非常实用的技巧部分变量预填充Partial Variable Prefill和消息占位符Message Placeholder帮助你在实际开发中更好地控制对话流程。2. 部分变量预填充2.1 什么是部分变量预填充部分变量预填充是指在提示词模板中预先为部分变量填充默认值或初始值而其余变量留待运行时由用户输入或程序动态填充。这种方式可以让模型在生成回复时自动带上预设的上下文信息减少重复输入。2.2 典型应用场景系统角色设定预先填充模型的角色身份、语气风格等固定信息。业务上下文预先填充当前用户所在的项目、部门、权限等级等背景信息。默认参数为某些可选参数提供默认值用户不指定时自动生效。2.3 代码示例fromlangchain_core.promptsimportChatPromptTemplate,MessagesPlaceholder# 定义提示词模板其中 role 和 tone 为预填充变量promptChatPromptTemplate.from_messages([(system,你是一位{role}请用{tone}的语气回答问题。),MessagesPlaceholder(variable_namehistory),(human,{input}),])# 部分变量预填充先固定 role 和 tonepartial_promptprompt.partial(role资深技术顾问,tone专业且友好)# 运行时只需传入剩余变量messagespartial_prompt.format_messages(history[],input请介绍一下 LangChain 的用途。)print(messages)2.4 运行结果[ SystemMessage(content你是一位资深技术顾问请用专业且友好的语气回答问题。), HumanMessage(content请介绍一下 LangChain 的用途。) ]可以看到role和tone在预填充后无需每次重复传入大大简化了调用逻辑。3. 消息占位符3.1 什么是消息占位符消息占位符MessagesPlaceholder是一种特殊的模板占位符它允许在提示词模板中预留一个位置用于在运行时动态插入一组消息而不是单个字符串。这在需要携带多轮对话历史、工具调用记录或检索结果时非常有用。3.2 与普通变量的区别对比项普通变量消息占位符填充内容单个字符串一组消息对象典型用途用户输入、参数值对话历史、工具结果模板写法{variable}{history}配合MessagesPlaceholder灵活性较低高可插入任意数量消息3.3 代码示例fromlangchain_core.promptsimportChatPromptTemplate,MessagesPlaceholderfromlangchain_core.messagesimportHumanMessage,AIMessage# 定义带消息占位符的模板promptChatPromptTemplate.from_messages([(system,你是一个乐于助人的助手。),MessagesPlaceholder(variable_namehistory),(human,{input}),])# 构造多轮对话历史history[HumanMessage(content你好我叫小明。),AIMessage(content你好小明很高兴认识你),]# 填充模板messagesprompt.format_messages(historyhistory,input你还记得我的名字吗)formsginmessages:print(f{msg.type}:{msg.content})3.4 运行结果system: 你是一个乐于助人的助手。 human: 你好我叫小明。 ai: 你好小明很高兴认识你 human: 你还记得我的名字吗模型在生成回复时就能看到完整的对话历史从而正确回答你还记得我的名字吗这个问题。4. 两者结合使用在实际项目中部分变量预填充和消息占位符经常配合使用效果更佳fromlangchain_core.promptsimportChatPromptTemplate,MessagesPlaceholder promptChatPromptTemplate.from_messages([(system,你是{company}的客服{name}请用{style}的方式服务用户。),MessagesPlaceholder(variable_namehistory),(human,{input}),])# 预填充固定信息partial_promptprompt.partial(company某某科技,name小助手,style耐心细致)# 运行时传入动态内容messagespartial_prompt.format_messages(history[HumanMessage(content我想退货。),AIMessage(content好的请问您的订单号是多少),],input订单号是 123456。)formsginmessages:print(f{msg.type}:{msg.content})5. 总结部分变量预填充适合固定不变的上下文信息能减少重复传参提升代码可维护性。消息占位符适合动态变化的多轮消息序列是构建对话记忆、工具调用等高级功能的基础。两者结合使用可以构建出既灵活又稳定的对话提示词体系让大模型应用更加智能。