python-langchain框架(1-7 提示词-模板中的模板)
消息模板对话结构的骨架设计聊天提示模板是整个流程的骨架它定义了信息的组织方式。模板包含两个关键元素对话历史占位符和总结指令。占位符如同一个可伸缩的插槽能够动态容纳任意轮次的历史消息总结指令则明确告知模型当前任务目标。这种前后分明的结构确保模型不会混淆历史内容与当前指令为生成准确摘要奠定基础。消息类型角色区分的语义价值LangChain 要求每条消息必须明确标识发言者角色人类消息与人工智能消息采用不同的类型封装。这种角色区分并非形式主义而是具有重要的语义价值。模型依赖这些标识来理解对话的流向与逻辑例如分辨哪些内容是用户提问、哪些是系统回答。在总结过程中这种角色信息帮助模型保留对话的交互本质而非简单拼接文本片段。参数化设计灵活复用的关键技巧总结指令中的字数要求被设计为可替换变量这是提示工程中的重要技巧。通过参数化同一套模板能够适应不同场景需求十字段落适合快速浏览百字段落适合详细回顾。这种设计避免了为每种需求重复编写模板实现一次定义多次复用显著提升开发效率与系统可维护性。看代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102fromlangchain.promptsimport(ChatPromptTemplate,# 构建多轮对话提示模板HumanMessagePromptTemplate,# 构造用户消息模板MessagesPlaceholder,# 占位历史对话消息)fromlangchain_core.messagesimportAIMessage, HumanMessage# 定义消息类型fromlangchain_openaiimportChatOpenAI# 适配 OpenAI 风格的聊天模型fromlangchain_core.output_parsersimportStrOutputParser# 将模型输出转为纯文本importos# 用于安全读取环境变量# # 步骤 1构建对话总结提示模板# # 用户指令模板要求模型用指定字数总结对话历史SUMMARY_INSTRUCTION用 {word_count} 字总结我们迄今为止的对话。# 创建用户消息模板支持变量替换summary_message_templateHumanMessagePromptTemplate.from_template(SUMMARY_INSTRUCTION)# 组装完整聊天模板# 1. 先插入历史对话通过 MessagesPlaceholder 动态填充# 2. 再追加用户总结指令chat_prompt_templateChatPromptTemplate.from_messages([MessagesPlaceholder(variable_nameconversation),# 历史对话占位符summary_message_template,# 总结指令])# # 步骤 2模拟多轮对话历史用于测试# # 用户提问user_queryHumanMessage(content学习编程最好的方法是什么?)# AI 回答结构化建议ai_responseAIMessage(content\1. 选择编程语言决定您想要学习的编程语言。2. 从基础开始熟悉变量、数据类型和控制结构等基本编程概念。3. 练习、练习、再练习学习编程的最好方法是通过实践经验。\)# 构建对话历史列表conversation_history[user_query, ai_response]# # 步骤 3调试 - 查看最终发送给模型的提示消息可选# # 格式化模板替换变量生成实际消息列表formatted_messageschat_prompt_template.format_prompt(conversationconversation_history,word_count10).to_messages()print(*60)print(【调试】发送给模型的完整消息序列)foridx, msginenumerate(formatted_messages,1):roleUserifisinstance(msg, HumanMessage)elseAIprint(f{idx}. [{role}] {msg.content})print(*60)# # 步骤 4初始化语言模型DeepSeek# llmChatOpenAI(api_keyos.getenv(DEEPSEEK_API_KEY),# 从环境变量读取 API 密钥更安全base_urlos.getenv(DEEP_URL),# 从环境变量读取 DeepSeek 的 API 基础地址modeldeepseek-v3:671b,# 指定使用的模型名称temperature0.7,# 控制生成文本的随机性0~1值越高越有创造性max_tokens1024# 限制模型最大输出长度以 token 为单位)# # 步骤 5构建处理链Prompt → LLM → Parser# # 链式流程输入变量 → 提示模板 → 语言模型 → 字符串解析summary_chainchat_prompt_template | llm | StrOutputParser()# # 步骤 6执行链式调用生成对话总结# # 调用链传入对话历史与字数要求summary_resultsummary_chain.invoke({conversation: conversation_history,word_count:10# 要求 10 字总结})# 输出结果print(\n【生成结果】对话总结10 字)print(-*60)print(summary_result)print(-*60)输出的结果【调试】发送给模型的完整消息序列1. [User] 学习编程最好的方法是什么?2. [AI] 1. 选择编程语言决定您想要学习的编程语言。2. 从基础开始熟悉变量、数据类型和控制结构等基本编程概念。3. 练习、练习、再练习学习编程的最好方法是通过实践经验。3. [User] 用 10 字总结我们迄今为止的对话。【生成结果】对话总结10 字------------------------------------------------------------