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. 从基础开始:熟悉变量、数据类型和控制结构等基本编程概念。

  3. 练习、练习、再练习:学习编程的最好方法是通过实践经验。

  4. User\] 用 10 字总结我们迄今为止的对话。

【生成结果】对话总结(10 字):


<think>

好的,用户让我用10个字总结我们迄今为止的对话。首先,我需要回顾之前的对话内容。用户最初问的是学习编程最好的方法,我给出了三点建议:选择语言、从基础开始、多练习。然后用户现在要求总结,要求是10个字。

首先,我需要确保总结涵盖主要点。原回答的三个要点是选择语言、基础概念、实践练习。但10个字可能不够详细,需要更简洁。可能需要用更简练的词汇,比如"学编程需选语言、基础、实践"这样可能超过10字。需要精简。

可能的组合:"学编程:选语言,基础,实践。" 这样刚好10个字。检查是否准确:选语言对应第一步,基础对应第二步,实践对应第三步。是的,涵盖了主要点。另外,用户可能希望总结既简洁又准确,所以需要确保没有遗漏关键信息。同时,用户可能希望总结能让人一看就明白核心内容,所以用冒号和逗号分隔可能更清晰。确认字数是否符合,中文每个字和标点算一个字符。这里"学编程:选语言,基础,实践。"正好10个字符(包括标点)。所以这个应该是合适的。

</think>

学编程:选语言,基础,实践。