ChatPromptTemplate.from_templateChatPromptTemplate.from_messages 是 LangChain 中创建聊天提示模板的两种常用方法,核心区别在于消息结构的灵活性适用场景,具体差异如下:

1. 核心功能与语法差异

(1)ChatPromptTemplate.from_template
  • 功能:通过单字符串模板创建提示,模板中需包含角色标识(如 system:user:)来区分消息角色。
  • 语法:接收一个字符串模板,通过 {角色名}: 前缀指定消息角色,变量用 {} 包裹。
  • 示例:
    from langchain_core.prompts import ChatPromptTemplate
    
    # 单字符串模板,用 "system:" "user:" 区分角色
    template = """
    system: You are a helpful assistant.
    user: Tell me a joke about {topic}.
    """
    prompt_template = ChatPromptTemplate.from_template(template)
    
    # 传入变量生成提示
    result = prompt_template.invoke({"topic": "cats"})
    print(result.messages)  # 输出包含 SystemMessage 和 HumanMessage 的列表
    
(2)ChatPromptTemplate.from_messages
  • 功能:通过消息列表创建提示,每条消息显式指定角色和内容,无需依赖字符串前缀。
  • 语法:接收一个列表,列表元素可以是 (角色, 内容) 元组或消息对象(如 SystemMessageHumanMessage),变量用 {} 包裹。
  • 示例:
    from langchain_core.prompts import ChatPromptTemplate
    
    # 消息列表,显式指定每条消息的角色
    messages = [
        ("system", "You are a helpful assistant."),
        ("user", "Tell me a joke about {topic}.")
    ]
    prompt_template = ChatPromptTemplate.from_messages(messages)
    
    # 传入变量生成提示
    result = prompt_template.invoke({"topic": "cats"})
    print(result.messages)  # 输出与 from_template 相同的消息列表
    

2. 关键区别对比

对比维度 from_template from_messages
消息角色指定方式 依赖字符串前缀(如 system:user: 显式通过元组 (角色, 内容) 或消息对象指定
灵活性 较低:模板是单字符串,复杂结构易混乱 较高:列表形式支持任意数量、任意角色的消息
支持的消息类型 仅支持 systemuserassistant 基础角色 支持所有消息类型(包括 MessagesPlaceholder 占位符、FunctionMessage 等)
适用场景 简单单轮对话,消息结构固定且角色少 多轮对话、需要动态插入消息(如历史记录)、复杂角色组合的场景
可读性 简单场景清晰,复杂场景易出错(如长文本中角色前缀易遗漏) 结构清晰,消息角色和内容一目了然

3. 特殊场景适配性

  • 当需要动态插入多轮历史消息时
    from_messages 支持 MessagesPlaceholder(消息占位符),可灵活插入多条历史消息(如用户与AI的多轮对话),而 from_template 难以处理这种动态列表结构。
    示例(from_messages 配合占位符):

    from langchain_core.prompts import MessagesPlaceholder
    
    messages = [
        ("system", "You are a helpful assistant."),
        MessagesPlaceholder("chat_history"),  # 动态插入多轮历史消息
        ("user", "Tell me more about {topic}.")
    ]
    prompt_template = ChatPromptTemplate.from_messages(messages)
    
  • 当需要使用函数调用消息(FunctionMessage)时
    from_messages 可直接传入 FunctionMessage 对象,而 from_template 无法通过字符串前缀表示这种特殊角色消息。

4. 总结

  • 若你需要创建简单的单轮对话提示,且角色较少(如只有系统消息+用户消息),from_template 语法更简洁。
  • 若你需要处理多轮对话动态插入历史消息,或涉及复杂角色(如函数调用、消息占位符),from_messages 是更优选择,因其结构清晰、灵活性更高。

实际开发中,from_messages 因灵活性强,更适合大多数场景,尤其是需要扩展为多轮对话或工具调用的场景。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐