Langchain Chat Model 和 Chat Prompt Template

0. 简介

Chat Model 不止是一个用于聊天对话的模型抽象,更重要的是提供了多角色提示能力(System,AI,Human,Function)。
Chat Prompt Template 则为开发者提供了便捷维护不同角色的提示模板与消息记录的接口。

1. 构造 ChatPromptTemplate

from langchain.prompts.chat import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    AIMessagePromptTemplate,
   HumanMessagePromptTemplate,
)

import os
from dotenv import load_dotenv, find_dotenv

# 删除all_proxy环境变量
if 'all_proxy' in os.environ:
    del os.environ['all_proxy']

# 删除ALL_PROXY环境变量
if 'ALL_PROXY' in os.environ:
    del os.environ['ALL_PROXY']

_ = load_dotenv(find_dotenv())

template = (
    """You are a translation expert, proficient in various languages. \n
    Translates English to Chinese."""
)
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
print(type(system_message_prompt))
print(system_message_prompt)

human_template = "{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
print(type(human_message_prompt))
print(human_message_prompt)

print("*"*40)
# 使用 System 和 Human 角色的提示模板构造 ChatPromptTemplate
chat_prompt_template = ChatPromptTemplate.from_messages(
    [system_message_prompt, human_message_prompt]
)
print(type(chat_prompt_template))
print(chat_prompt_template)

print("*"*50)
chat_prompt_prompt_value = chat_prompt_template.format_prompt(text="I love python.")
print(type(chat_prompt_prompt_value))
print(chat_prompt_prompt_value)

print("*"*60)
chat_prompt_list = chat_prompt_template.format_prompt(text="I love python.").to_messages()
print(type(chat_prompt_list))
print(chat_prompt_list)

输出:

<class 'langchain_core.prompts.chat.SystemMessagePromptTemplate'>
prompt=PromptTemplate(input_variables=[], input_types={}, partial_variables={}, template='You are a translation expert, proficient in various languages. \n\n    Translates English to Chinese.') additional_kwargs={}
<class 'langchain_core.prompts.chat.HumanMessagePromptTemplate'>
prompt=PromptTemplate(input_variables=['text'], input_types={}, partial_variables={}, template='{text}') additional_kwargs={}
****************************************
<class 'langchain_core.prompts.chat.ChatPromptTemplate'>
input_variables=['text'] input_types={} partial_variables={} messages=[SystemMessagePromptTemplate(prompt=PromptTemplate(input_variables=[], input_types={}, partial_variables={}, template='You are a translation expert, proficient in various languages. \n\n    Translates English to Chinese.'), additional_kwargs={}), HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['text'], input_types={}, partial_variables={}, template='{text}'), additional_kwargs={})]
**************************************************
<class 'langchain_core.prompt_values.ChatPromptValue'>
messages=[SystemMessage(content='You are a translation expert, proficient in various languages. \n\n    Translates English to Chinese.', additional_kwargs={}, response_metadata={}), HumanMessage(content='I love python.', additional_kwargs={}, response_metadata={})]
************************************************************
<class 'list'>
[SystemMessage(content='You are a translation expert, proficient in various languages. \n\n    Translates English to Chinese.', additional_kwargs={}, response_metadata={}), HumanMessage(content='I love python.', additional_kwargs={}, response_metadata={})]

2. LCEL 执行

from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain.prompts.chat import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    AIMessagePromptTemplate,
   HumanMessagePromptTemplate,
)
import os
from dotenv import load_dotenv, find_dotenv

# 删除all_proxy环境变量
if 'all_proxy' in os.environ:
    del os.environ['all_proxy']

# 删除ALL_PROXY环境变量
if 'ALL_PROXY' in os.environ:
    del os.environ['ALL_PROXY']

_ = load_dotenv(find_dotenv())

# 为了结果的稳定性,将 temperature 设置为 0
translation_model = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)

template = (
    """You are a translation expert, proficient in various languages. \n
    Translates {source_language} to {target_language} in the style of {name}."""
)
system_message_prompt = SystemMessagePromptTemplate.from_template(template)

human_template = "{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)

# 使用 System 和 Human 角色的提示模板构造 ChatPromptTemplate
m_chat_prompt_template = ChatPromptTemplate.from_messages(
    [system_message_prompt, human_message_prompt]
)
output_parser = StrOutputParser()

m_translation_chain = m_chat_prompt_template| translation_model |  StrOutputParser(callbacks=[callback_handler])

# Prepare input data
input_data = {
    "source_language": "English",
    "target_language": "Chinese",
    "name": "严复",
    "text": "Life is full of regrets. All we can do is to minimize them.",
}
input_data1 = {
    "source_language": "English",
    "target_language": "Chinese",
    "name": "李白",
    "text": "Life is full of regrets. All we can do is to minimize them.",
}


# Format the prompt
prompt_value = m_chat_prompt_template.format_prompt(**input_data)
print(type(prompt_value))
print(prompt_value)

print(type(prompt_value.to_messages()))
print(prompt_value.to_messages())

result = translation_model.invoke(prompt_value)
print(result)
result = m_translation_chain.invoke(input_data)
print(result)
result = m_translation_chain.invoke(input_data1)
print(result)

输出:

<class 'langchain_core.prompt_values.ChatPromptValue'>
messages=[SystemMessage(content='You are a translation expert, proficient in various languages. \n\n    Translates English to Chinese in the style of 严复.', additional_kwargs={}, response_metadata={}), HumanMessage(content='Life is full of regrets. All we can do is to minimize them.', additional_kwargs={}, response_metadata={})]
<class 'list'>
[SystemMessage(content='You are a translation expert, proficient in various languages. \n\n    Translates English to Chinese in the style of 严复.', additional_kwargs={}, response_metadata={}), HumanMessage(content='Life is full of regrets. All we can do is to minimize them.', additional_kwargs={}, response_metadata={})]
content='人生充满了遗憾。我们所能做的就是尽量减少它们。' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 31, 'prompt_tokens': 53, 'total_tokens': 84, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None} id='run-676a9818-bbbc-44f7-a30e-0ec065aa502f-0' usage_metadata={'input_tokens': 53, 'output_tokens': 31, 'total_tokens': 84, 'input_token_details': {}, 'output_token_details': {}}
人生充满了遗憾。我们所能做的就是尽量减少它们。
人生充滿遺憾,唯有盡量減少。

translation_model.invoke(input_data) 输入参数是字典时报错

result = translation_model.invoke(input_data)
print(result)

报错:

ValueError: Invalid input type <class 'dict'>. Must be a PromptValue, str, or list of BaseMessages.

m_translation_chain.invoke(prompt_value) 输入参数是prompt_value时报错

result = m_translation_chain.invoke(prompt_value)
print(result)

报错:

TypeError: Expected mapping type as input to ChatPromptTemplate. Received <class 'langchain_core.prompt_values.ChatPromptValue'>.

查看属性:

input_schema = m_translation_chain.input_schema.model_json_schema()
print(input_schema)
output_schema = m_translation_chain.output_schema.model_json_schema()
print(output_schema)

输出:

{'properties': {'name': {'title': 'Name', 'type': 'string'}, 'source_language': {'title': 'Source Language', 'type': 'string'}, 'target_language': {'title': 'Target Language', 'type': 'string'}, 'text': {'title': 'Text', 'type': 'string'}}, 'required': ['name', 'source_language', 'target_language', 'text'], 'title': 'PromptInput', 'type': 'object'}

{'title': 'StrOutputParserOutput', 'type': 'string'}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在 React 项目中安装和配置 Three.js

React 与 Three.js 的结合 &#xff1a;通过 React 管理组件化结构和应用逻辑&#xff0c;利用 Three.js 实现 3D 图形的渲染与交互。使用这种方法&#xff0c;我们可以在保持代码清晰和结构化的同时&#xff0c;实现令人惊叹的 3D 效果。 在本文中&#xff0c;我们将以一个简…

TCP 为什么采用三次握手和四次挥手以及 TCP 和 UDP 的区别

1. TCP 为什么采用三次握手和四次挥手 采用三次握手的原因&#xff1a; 确认双方的收发能力。第一次握手&#xff0c;客户端发送 SYN 报文&#xff0c;告诉服务器自身具备发送数据的能力&#xff0c;第二次握手&#xff0c;服务器回应 SYN ACK 报文&#xff0c;表名自己既能…

HarmonyOS NEXT 实战之元服务:静态案例效果---手机查看电量

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; import { authentication } …

机器学习之KNN算法预测数据和数据可视化

机器学习及KNN算法 目录 机器学习及KNN算法机器学习基本概念概念理解步骤为什么要学习机器学习需要准备的库 KNN算法概念算法导入常用距离公式算法优缺点优点&#xff1a;缺点︰ 数据可视化二维界面三维界面 KNeighborsClassifier 和KNeighborsRegressor理解查看KNeighborsRegr…

无需配置设备,借助GitHub快速编译项目并直接运行!

引言 你是否曾经有过类似的烦恼&#xff0c;发现了一个有趣的项目&#xff0c;想要测试一下&#xff0c;但是自己的设备没有对应的开发环境或者受制于自己的设备&#xff0c;不想或者不能去配置对应的开发环境&#xff0c;应该怎么办呢&#xff1f;这种情况下&#xff0c;其实…

【C++11】类型分类、引用折叠、完美转发

目录 一、类型分类 二、引用折叠 三、完美转发 一、类型分类 C11以后&#xff0c;进一步对类型进行了划分&#xff0c;右值被划分纯右值(pure value&#xff0c;简称prvalue)和将亡值 (expiring value&#xff0c;简称xvalue)。 纯右值是指那些字面值常量或求值结果相当于…

k-Means聚类算法 HNUST【数据分析技术】(2025)

1.理论知识 K-means算法&#xff0c;又称为k均值算法。K-means算法中的k表示的是聚类为k个簇&#xff0c;means代表取每一个聚类中数据值的均值作为该簇的中心&#xff0c;或者称为质心&#xff0c;即用每一个的类的质心对该簇进行描述。K-Means算法接受参数K&#xff1b;然后将…

阿里云redis内存优化——PCP数据清理

在阿里云安装了一个redis节点&#xff0c;今天使用时忽然想着点击了一下分析内存。好家伙&#xff0c;居然崩出了一个30多M的块出来。问题是我本地安装的redis没有这个啊&#xff0c;怎么奇怪冒出这个来了。 本着把系统用干榨尽的态度&#xff0c;研究了下这个问题的来源。网上…

Java开发-后端请求成功,前端显示失败

文章目录 报错解决方案1. 后端未配置跨域支持2. 后端响应的 Content-Type 或 CORS 配置问题3. 前端 request 配置问题4. 浏览器缓存或代理问题5. 后端端口未被正确映射 报错 如下图&#xff0c;后端显示请求成功&#xff0c;前端显示失败 解决方案 1. 后端未配置跨域支持 …

MarkItDown的使用(将Word、Excel、PDF等转换为Markdown格式)

MarkItDown的使用&#xff08;将Word、Excel、PDF等转换为Markdown格式&#xff09; 本文目录&#xff1a; 零、时光宝盒&#x1f33b; 一、简介 二、安装 三、使用方法 3.1、使用命令行形式 3.2、用 Python 调用 四、总结 五、参考资料 零、时光宝盒&#x1f33b; &a…

akamai3.0 wizzair 网站 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我删…

kubernetes Gateway API-1-部署和基础配置

文章目录 1 部署2 最简单的 Gateway3 基于主机名和请求头4 重定向 Redirects4.1 HTTP-to-HTTPS 重定向4.2 路径重定向4.2.1 ReplaceFullPath 替换完整路径4.2.2 ReplacePrefixMatch 替换路径前缀5 重写 Rewrites5.1 重写 主机名5.2 重写 路径5.2.1 重新完整路径5.2.1 重新部分路…

likeAdmin架构部署(踩坑后的部署流程

1、gitee下载 https://gitee.com/likeadmin/likeadmin_java.git 自己克隆 2、项目注意 Maven&#xff1a;>3.8 ❤️.9 (最好不要3.9已经试过失败 node &#xff1a;node14 (不能是18 已经测试过包打不上去使用14的换源即可 JDK&#xff1a;JDK8 node 需要换源 npm c…

宠物行业的出路:在爱与陪伴中寻找增长新机遇

在当下的消费市场中&#xff0c;如果说有什么领域能够逆势而上&#xff0c;宠物行业无疑是一个亮点。当人们越来越注重生活品质和精神寄托时&#xff0c;宠物成为了许多人的重要伴侣。它们不仅仅是家庭的一员&#xff0c;更是情感的寄托和生活的调剂。然而&#xff0c;随着行业…

Java 堆排序原理 图文详解 代码逻辑

文章目录 1. 时间复杂度 & 空间复杂度2. 大顶堆、小顶堆3. 具体步骤 & 原理1. 判断是否满足堆的性质2. 维护堆的性质3. 交换位置 4. 代码实现 1. 时间复杂度 & 空间复杂度 时间复杂度: O(nlogn) 建堆时间复杂度: O(n) 排序时间复杂度: O(nlogn)空间复杂度: O(1) …

计算机网络|数据流向剖析与分层模型详解

文章目录 一、网络中的数据流向二、计算机网络通信模型1.OSI 模型2.TCP/IP 模型3.TCP/IP五层模型3.1 分层架构描述3.2各层地址结构3.3UDP数据包报头结构 三、总结 一、网络中的数据流向 在计算机网络中&#xff0c;数据的流向是指数据从发送端到接收端的传输路径。数据流向涉及…

ensp、HCL环境部署vm版

ensp、HCL环境部署vm版 前言部署环境vmware安装下载镜像创建虚拟机安装ensp、HCL创建快照 问题此平台不支持虚拟化的 AMD-V/rvi。 前言 因为我换了电脑&#xff0c;锐龙版的win11&#xff0c;我按照以前的思路去装软件&#xff0c;发现有很多问题&#xff0c;特别是跳hyper-v弹…

鸿蒙项目云捐助第二十九讲云捐助项目云数据库商品的批量增加功能实现

鸿蒙项目云捐助第二十九讲云捐助项目云数据库商品的批量增加功能实现 关于鸿蒙云捐助项目&#xff0c;前面的内容已使用云函数&#xff0c;云数据库分别实现云捐助项目首页中的项分类导航&#xff0c;底部导航&#xff0c;轮播图功能&#xff0c;这里继续实现云数据库加载捐赠…

【LeetCode: 83. 删除排序链表中的重复元素 + 链表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Spring源码_05_IOC容器启动细节

前面几章&#xff0c;大致讲了Spring的IOC容器的大致过程和原理&#xff0c;以及重要的容器和beanFactory的继承关系&#xff0c;为后续这些细节挖掘提供一点理解基础。掌握总体脉络是必要的&#xff0c;接下来的每一章都是从总体脉络中&#xff0c; 去研究之前没看的一些重要…