AI开发-python-langchain框架(1-7 提示词-模板中的模板)
本案例通过精心设计的提示模板,将历史对话内容与用户指令有机组合,引导模型生成精准的对话摘要。这种设计模拟了真实对话场景:模型既能回顾之前的交流内容,又能理解当前提出的总结要求,从而输出符合预期的结果。
消息模板:对话结构的骨架设计
聊天提示模板是整个流程的骨架,它定义了信息的组织方式。模板包含两个关键元素:对话历史占位符和总结指令。占位符如同一个可伸缩的插槽,能够动态容纳任意轮次的历史消息;总结指令则明确告知模型当前任务目标。这种前后分明的结构确保模型不会混淆历史内容与当前指令,为生成准确摘要奠定基础。
消息类型:角色区分的语义价值
LangChain 要求每条消息必须明确标识发言者角色,人类消息与人工智能消息采用不同的类型封装。这种角色区分并非形式主义,而是具有重要的语义价值。模型依赖这些标识来理解对话的流向与逻辑,例如分辨哪些内容是用户提问、哪些是系统回答。在总结过程中,这种角色信息帮助模型保留对话的交互本质,而非简单拼接文本片段。
参数化设计:灵活复用的关键技巧
总结指令中的字数要求被设计为可替换变量,这是提示工程中的重要技巧。通过参数化,同一套模板能够适应不同场景需求:十字段落适合快速浏览,百字段落适合详细回顾。这种设计避免了为每种需求重复编写模板,实现"一次定义,多次复用",显著提升开发效率与系统可维护性。
看代码:
from langchain.prompts import (
ChatPromptTemplate, # 构建多轮对话提示模板
HumanMessagePromptTemplate, # 构造用户消息模板
MessagesPlaceholder, # 占位历史对话消息
)
from langchain_core.messages import AIMessage, HumanMessage # 定义消息类型
from langchain_openai import ChatOpenAI # 适配 OpenAI 风格的聊天模型
from langchain_core.output_parsers import StrOutputParser # 将模型输出转为纯文本
import os # 用于安全读取环境变量
# =============================================================================
# 步骤 1:构建对话总结提示模板
# =============================================================================
# 用户指令模板:要求模型用指定字数总结对话历史
SUMMARY_INSTRUCTION = "用 {word_count} 字总结我们迄今为止的对话。"
# 创建用户消息模板(支持变量替换)
summary_message_template = HumanMessagePromptTemplate.from_template(SUMMARY_INSTRUCTION)
# 组装完整聊天模板:
# 1. 先插入历史对话(通过 MessagesPlaceholder 动态填充)
# 2. 再追加用户总结指令
chat_prompt_template = ChatPromptTemplate.from_messages(
[
MessagesPlaceholder(variable_name="conversation"), # 历史对话占位符
summary_message_template, # 总结指令
]
)
# =============================================================================
# 步骤 2:模拟多轮对话历史(用于测试)
# =============================================================================
# 用户提问
user_query = HumanMessage(content="学习编程最好的方法是什么?")
# AI 回答(结构化建议)
ai_response = AIMessage(
content="""\
1. 选择编程语言:决定您想要学习的编程语言。
2. 从基础开始:熟悉变量、数据类型和控制结构等基本编程概念。
3. 练习、练习、再练习:学习编程的最好方法是通过实践经验。\
"""
)
# 构建对话历史列表
conversation_history = [user_query, ai_response]
# =============================================================================
# 步骤 3:调试 - 查看最终发送给模型的提示消息(可选)
# =============================================================================
# 格式化模板,替换变量,生成实际消息列表
formatted_messages = chat_prompt_template.format_prompt(
conversation=conversation_history,
word_count="10"
).to_messages()
print("=" * 60)
print("【调试】发送给模型的完整消息序列:")
for idx, msg in enumerate(formatted_messages, 1):
role = "User" if isinstance(msg, HumanMessage) else "AI"
print(f"{idx}. [{role}] {msg.content}")
print("=" * 60)
# =============================================================================
# 步骤 4:初始化语言模型(DeepSeek)
# =============================================================================
llm = ChatOpenAI(
api_key=os.getenv("DEEPSEEK_API_KEY"), # 从环境变量读取 API 密钥(更安全)
base_url=os.getenv("DEEP_URL"), # 从环境变量读取 DeepSeek 的 API 基础地址
model="deepseek-v3:671b", # 指定使用的模型名称
temperature=0.7, # 控制生成文本的随机性(0~1,值越高越有创造性)
max_tokens=1024 # 限制模型最大输出长度(以 token 为单位)
)
# =============================================================================
# 步骤 5:构建处理链(Prompt → LLM → Parser)
# =============================================================================
# 链式流程:输入变量 → 提示模板 → 语言模型 → 字符串解析
summary_chain = chat_prompt_template | llm | StrOutputParser()
# =============================================================================
# 步骤 6:执行链式调用,生成对话总结
# =============================================================================
# 调用链,传入对话历史与字数要求
summary_result = summary_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 字):
------------------------------------------------------------
<think>
好的,用户让我用10个字总结我们迄今为止的对话。首先,我需要回顾之前的对话内容。用户最初问的是学习编程最好的方法,我给出了三点建议:选择语言、从基础开始、多练习。然后用户现在要求总结,要求是10个字。
首先,我需要确保总结涵盖主要点。原回答的三个要点是选择语言、基础概念、实践练习。但10个字可能不够详细,需要更简洁。可能需要用更简练的词汇,比如“学编程需选语言、基础、实践”这样可能超过10字。需要精简。
可能的组合:“学编程:选语言,基础,实践。” 这样刚好10个字。检查是否准确:选语言对应第一步,基础对应第二步,实践对应第三步。是的,涵盖了主要点。另外,用户可能希望总结既简洁又准确,所以需要确保没有遗漏关键信息。同时,用户可能希望总结能让人一看就明白核心内容,所以用冒号和逗号分隔可能更清晰。确认字数是否符合,中文每个字和标点算一个字符。这里“学编程:选语言,基础,实践。”正好10个字符(包括标点)。所以这个应该是合适的。
</think>
学编程:选语言,基础,实践。
------------------------------------------------------------
浙公网安备 33010602011771号