【LangChain入门 3 Prompts组件】聊天提示词模板 ChatPromptTemplate

news2025/3/28 4:57:34

文章目录

  • 一、 聊天信息提示词模板
    • 1.1 使用关键字
    • 1.2 使用SystemMessage, HumanMessage, AIMessage来定义消息
    • 1.3 使用MessagesPlaceholder 在特定未知添加消息列表
  • 二、关键类介绍
    • 2.1 ChatPromptTemplate 类
      • 2.1.1 from_messages()
      • 2.1.2 format_messages()
      • 2.1.3 format_prompt()
    • 2.2 SystemMessage, HumanMessage,AIMessage类

一、 聊天信息提示词模板

聊天信息提示词模板(char prompt template)

聊天模型以聊天信息作为输入,这个聊天消息列表的内容也可以通过提示词模板进行管理。
这些聊天消息与原始字符不同,因为每个消息都与“角色role”关联。

列如,在OpenAI的Chat Completion API中,OpenAI的聊天模板,给不同的聊天信息定义了三种角色类型,分别是助手(Assisant)、人类(human)、或系统(System)角色:

  • 助手(Assisant)消息指当前消息是AI回答的内容
  • 人类(user)消息指的是你发给AI的内容
  • 系统(system)消息通常是用来给AI身份进行描述

1.1 使用关键字

以下是创建聊天信息模板的例子
这个例子是通过文本描述来定义系统、助手等,关键字必须
Use one of 'human', 'user', 'ai', 'assistant', or 'system'

from langchain_ollama import ChatOllama
from langchain_core.prompts import ChatPromptTemplate
llm = ChatOllama(
    model="deepseek-r1:7b", 
)
chat_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是西天取经的人工智能助手,你的名字叫齐天智能"),
    ("human",  "你好"),
    ("ai", "您好,我是西天取经的人工智能助手,请问有什么可以帮助您?"),
    ("human", "{user_input}")
])

message = chat_prompt.format(user_input="你叫什么")
response = llm.invoke(message)
print(llm.invoke(message).content)

1.2 使用SystemMessage, HumanMessage, AIMessage来定义消息

实际开发中,这个方式多一些,比较清晰

from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
from langchain_core.prompts import HumanMessagePromptTemplate
chat_template = ChatPromptTemplate.from_messages(
    [SystemMessage(
        content=("你是西天取经的人工智能助手,你的名字叫齐天智能")
    ),
    HumanMessage(
        content=("你好")
    ),
    AIMessage(
        content=("您好,我是西天取经的人工智能助手,请问有什么可以帮助您?")
    ),
    HumanMessagePromptTemplate.from_template("{text}"),
    ]
)

message = chat_template.format_messages(text="你叫什么")
print(message)
print("----------------------")
print(llm.invoke(message).content)

1.3 使用MessagesPlaceholder 在特定未知添加消息列表

这个提示词模板负责在特定位置添加消息列表。
在前面两段中,我们看到了如何格式化两条消息,每条消息都是一个字符串,但是我们希望用户传入一个消息列表,我们将其插入到特定位置,该怎么办?
这里可以使用MessagesPlaceholder的方式

如下代码,这将会生成两条消息,第一条是系统消息,第二条是我们传入的HumanMessage。 如果我们传入了5条消息,那么总共会生成6条消息(系统消息加上传入的5条消息)、这对于将一系列消息插入到特定位置非常有用。

from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.prompts import MessagesPlaceholder, MessagesPlaceholder
prompt_template = ChatPromptTemplate.from_messages(
    [SystemMessage(
        content=("你是西天取经的人工智能助手,你的名字叫齐天智能")
    ),
    # 你可以传入一组消息
    MessagesPlaceholder("msgs"),
         HumanMessagePromptTemplate.from_template("{text}"),
    ]
)

message = prompt_template.invoke({"msgs":[HumanMessage(content="你好"),
                                           AIMessage(content="您好,我是西天取经的人工智能助手,请问有什么可以帮助您?")],
                                  "text": "你叫什么"})

# print("----------------")
print(llm.invoke(message).content )

二、关键类介绍

2.1 ChatPromptTemplate 类

LangChain 中用于构建聊天模型提示的类,它允许用户通过定义一系列消息模板来生成对话内容。
主要用于:创建聊天模型的输入提示,这些提示由多个消息组成,每个消息都有一个角色(如系统、用户或 AI)。它支持动态填充变量,能够根据输入参数生成具体的聊天消息列表。

2.1.1 from_messages()

从消息列表创建 ChatPromptTemplate 实例

  • 输入参数为messages: 一个包含消息模板的列表。每个消息模板可以是一个元组(角色,模板字符串),也可以是一个 MessagePromptTemplate 的实例。

2.1.2 format_messages()

根据输入参数格式化消息模板,生成具体的聊天消息列表。

  • 输入参数为一个字典,包含模板中需要填充的变量及其值。
  • 返回值:一个包含具体消息的列表,每个消息都是 SystemMessageHumanMessageAIMessage 的实例。

2.1.3 format_prompt()

格式化提示模板,返回一个 PromptValue 对象,可以转换为字符串或消息列表。
**参数:**一个字典,包含模板中需要填充的变量及其值。

prompt_value = chat_template.format_prompt(name="Bob", user_input="What is your name?")
print(prompt_value.to_messages())

2.2 SystemMessage, HumanMessage,AIMessage类

AIMessage类 为例:
AIMessage 是 LangChain 中的一种消息类型,表示由 AI 模型生成的消息。一般LLM的回答,都是AIMessage

记一下以下几个参数

  • content:表示消息的内容,通常是字符串形式的文本。
AIMessage(content="Hello, how can I help you today?")
  • role: 指定消息的角色。在 AIMessage 中,role 通常固定为 “assistant”,表示消息是由 AI 助手生成的。
AIMessage(content="Here is the answer.", role="assistant")
  • additional_kwargs:Dict格式,用于存储额外的关键字参数,例如工具调用信息。可以用于扩展消息的功能,例如存储工具调用信息、元数据等。
AIMessage(
    content="I need to call the weather API.",
    additional_kwargs={"tool_calls": [{"type": "weather_api", "args": {"location": "Beijing"}}]}
)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2319063.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode热题100道——字母异位词分组

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat", &…

MCU-芯片时钟与总线和定时器关系,举例QSPI

时钟源: 时钟源为系统时钟提供原始频率信号,系统时钟则通过(分频、倍频、选择器)成为整个芯片的“主时钟”,驱动 CPU 内核、总线(AHB、APB)及外设的运行。 内部时钟源: HSI&#x…

技术分享 | MySQL内存使用率高问题排查

本文为墨天轮数据库管理服务团队第51期技术分享,内容原创,如需转载请联系小墨(VX:modb666)并注明来源。 一、问题现象 问题实例mysql进程实际内存使用率过高 二、问题排查 2.1 参数检查 mysql版本 :8.0.…

分享一个精灵图生成和拆分的实现

概述 精灵图(Sprite)是一种将多个小图像合并到单个图像文件中的技术,广泛应用于网页开发、游戏开发和UI设计中。在MapboxGL中,跟之配套的还有一个json文件用来记录图标的大小和位置。本文分享基于Node和sharp库实现精灵图的合并与…

函数:形参和实参

在函数的使用过程中分为实参和形参,实参是主函数实际调用的值而形参则是给实参调用的值,如果函数没被调用则函式不会向内存申请空间,先用一段代码演示 形参: int test(int x ,int y ) {int z 0;z x y;return z; } 为何会叫做…

【C#知识点详解】ExcelDataReader介绍

今天来给大家介绍一下ExcelDataReader,ExcelDataReader是一个轻量级的可快速读取Excel文件中数据的工具。话不多说直接开始。 ExcelDataReader简介 ExcelDataReader支持.xlsx、.xlsb、.xls、.csv格式文件的读取,版本基本在2007及以上版本,支…

《视觉SLAM十四讲》ch13 设计SLAM系统 相机轨迹实现

前言 相信大家在slam学习中,一定会遇到slam系统的性能评估问题。虽然有EVO这样的开源评估工具,我们也需要自己了解系统生成的trajectory.txt的含义,方便我们更好的理解相机的运行跟踪过程。 项目配置如下: 数据解读: …

在类Unix终端中如何实现快速进入新建目录

🚪 前言 相信喜欢使用终端工作的小伙伴或多或少会被一个小地方给膈应,那就是每次想要新建一个文件夹并且进入之,那么就需要两条指令:mkdir DIR和cd DIR,有些人可能要杠了,我一条指令也能,mkdir…

TG电报群管理机器人定制开发的重要性

在Telegram(电报)用户突破20亿、中文社群规模持续扩张的背景下,定制化群管理机器人的开发已成为社群运营的战略刚需。这种技术工具不仅解决了海量用户管理的效率难题,更通过智能化功能重构了数字社群的治理范式。本文从管理效能、…

VNA操作使用学习-01 界面说明

以我手里面的liteVNA为例。也可以参考其他的nanoVNA的操作说明。我先了解一下具体的菜单意思。 今天我想做一个天调,居然发现我连一颗基本的50欧姆插件电阻和50欧姆的smt电阻的幅频特性都没有去测试过,那买来这个nva有什么用途呢,束之高阁求…

耘想Docker版Linux NAS的安装说明

耘想LinNAS(Linux NAS)可以通过Docker部署,支持x86和arm64两种硬件架构。下面讲解LinNAS的部署过程。 1. 安装Docker CentOS系统:yum install docker –y Ubuntu系统:apt install docker.io –y 2. 下载LinNas镜像…

OpenCV图像拼接(4)图像拼接模块的一个匹配器类cv::detail::BestOf2NearestRangeMatcher

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::detail::BestOf2NearestRangeMatcher 是 OpenCV 库中用于图像拼接模块的一个匹配器类,专门用于寻找两幅图像之间的最佳特征点匹配…

不用 Tomcat?SpringBoot 项目用啥代替?

在SpringBoot框架中,我们使用最多的是Tomcat,这是SpringBoot默认的容器技术,而且是内嵌式的Tomcat。 同时,SpringBoot也支持Undertow容器,我们可以很方便的用Undertow替换Tomcat,而Undertow的性能和内存使…

Zabbix安装(保姆级教程)

Zabbix 是一款开源的企业级监控解决方案,能够监控网络的多个参数以及服务器、虚拟机、应用程序、服务、数据库、网站和云的健康状况和完整性。它提供了灵活的通知机制,允许用户为几乎任何事件配置基于电子邮件的告警,从而能够快速响应服务器问…

鸿蒙开发真机调试:无线调试和USB调试

前言 在鸿蒙开发的旅程中,真机调试堪称至关重要的环节,其意义不容小觑。虽说模拟器能够为我们提供初步的测试环境,方便我们在开发过程中快速预览应用的基本效果,但它与真机环境相比,仍存在诸多差异。就好比在模拟器中…

工厂函数详解:概念、目的与作用

一、什么是工厂函数? 工厂函数(Factory Function)是一种设计模式,其核心是通过一个函数来 创建并返回对象,而不是直接使用 new 或构造函数实例化对象。它封装了对象的创建过程,使代码更灵活、可维护。 二、…

Python简单爬虫实践案例

学习目标 能够知道Web开发流程 能够掌握FastAPI实现访问多个指定网页 知道通过requests模块爬取图片 知道通过requests模块爬取GDP数据 能够用pyecharts实现饼图 能够知道logging日志的使用 一、基于FastAPI之Web站点开发 1、基于FastAPI搭建Web服务器 # 导入FastAPI模…

基于springboot的房产销售系统(016)

摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于房产销售系统当然也不能排除在外,随着网络技术的不断成熟,带动了房产销售系统,它彻底改变了过去传统的…

云盘搭建笔记

报错问题: No input file specified. 伪静态 location / {if (!-e $request_filename) { rewrite ^(.*)$ /index.php/$1 last;break;} } location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php/$1 last; break; } } 设…

《从深海到卫浴:Relax Max如何用军工科技重塑生活仪式》​

《从深海到卫浴:Relax Max如何用军工科技重塑生活仪式》​ 当瑞士联邦理工学院的一纸专利授权书揭开帷幕,卫浴行业终于意识到:Relax Max的「军工科技民用化」绝非营销噱头。这支由前潜艇工程师和航天材料学家组成的团队,将核潜艇…