模型/O功能之提示词模板
文章目录
- 模型/O功能之提示词模板
- 什么是提示词模板
- 提示词模板的输入和输出
- 使用提示词模板构造提示词
模型/O功能之提示词模板
在LangChain框架中,提示词不是简单的字符串,而是一个更复杂的结构,是一个“提示词工程”。这个结构中包含一个或多个提示词模板(PromptTemplate类的实例),每个提示词模板可以接收一些输人变量,并根据这些变量生成对应的提示词,这样就可以根据具体的需求和情境动态地创建各种各样的提示词。这就是提示词模板的核心思想和工作方式。
例如,可能有一个提示词模板用于生成写邮件时的提示词,这个模板需要接收如收件人、主题、邮件内容等输人变量,然后根据这些变量生成如“写一封给{收件人}的邮件,主题是{主题},内容是{邮件内容}”这样的提示词模板字符串。这种工程化的提示词构造方式,可以产出适用于各种应用程序的内容,而不仅仅是简单的聊天内容。复杂的提示词可以用于生成文章、编写邮件、回答问题、执行任务等各种场景,大大提高了大语言模型的实用性和可用性。
什么是提示词模板
提示词可以被视为向大语言模型提出的请求,它们表明了使用者希望模型给出何种反应。提示词的质量直接影响模型的回答质量,决定了模型能否成功完成更复杂的任务。在LangChain框架中,提示词是由“提示词模板”(PromptTemplate)这个包装器对象生成的。每一个PromptTemplate类的实例都定义了一种特定类型的提示词格式和生成规则。在LangChain中,要想构造提示词,就必须学会使用这个包装器对象。
你可以将提示词模板视为一个幕后工作者,它在幕后默默地工作,用户只看到他们自己输入的简单关键词,却得到了模型给出的出色响应。这是因为开发者将用户的输人嵌人了预先设计好的提示词模板中,这个模板就是一个包装器,用户的输人经过包装器的包装后,最终变成一个高效的提示词被输出。这个包装器还能组合不同的提示词,提供各种格式化、参数检验工具,帮助开发者构造复杂的提示词。
提示词模板是一种可复制、可重用的生成提示词的工具,是用于生成提示词的模板字符串,其中包含占位符,这些占位符可以在运行时被动态替换成实际终端用户输入的值,其中可以插人变量、表达式或函数的结果。提示词模板中可能包含(不是必须包含)以下3个元素。
- 明确的指令:这些指令可以指导大语言模型理解用户的需求,并按照特定的方式进行回应,见下图中的“明确的指令”。
- 少量示例:这些示例可以帮助大语言模型更好地理解任务,并生成更准确的响应,见下图中的“少量示例”。
- 用户输入:用户的输人可以直接引导大语言模型生成特定的答案,见下图中的“用户输人”。

通过灵活使用这些元素创建新的提示词模板,可以更有效地利用大语言模型的能力,提高其在各种应用场景下的表现。提示词模板可批量生成提示词,它可以接收开发者对任务的描述文本,也可以接收用户输入的一系列参数。比如,要给公司的产品取一个好听的名字,用户输人的是产品的品类名,如“袜子”“毛巾”、然而我们并不需要为每一个品类都编写一个提示词,使用提示词模板,根据用户输人的不同品类名生成对应的提示词即可:“请给公司的{品类名},取一个简单且容易传播的产品名字”提示词模板的职责就是根据大语言模型平台的API类型,包装并生成适合的提示词。
为了满足不同类型模型平台底层API的需求,提示词模板提供了format方法和format prompt方法,输出可以是字符串、消息列表,以及ChatPrompt Value形式。比如对于需要输入字符串的LLM模型包装器、提示词模板会使用to string方法将提示词转化为一个字符串。而对于需要输入消息列表的聊天模型包装器,提示词模板则会使用to_messages方法将提示词转化为一个消息列表总的来说、提示词模板就是一种能够产生动态提示词的包装器,开发者将数据输入包装器,经过包装后,输出的是适配各个模型平台的提示词。
提示词模板的输入和输出
如前所述,提示词模板是一个输入数据并输出提示词的句装器。那么开发者可以向他输入什么样的数据呢?具体的输出是什么呢?
内部数据是指那些已经被LangChain框架封装好的数据,以及开发者写的示例和需求描述文本(下图中的“明确的指令”和“少量示例”)。比如,LangChain的许多Agent和Chain实例对象都内置了自己的提示词。这些提示词都被预先定义在源码prompt…py文件中,使用时直接导人即可,例如可以导人预制的API RESPONSE PROMPT,它是引导模型根据API响应回答用户问题的提示词,导入方式如下:
from langchain.chains.api.prompt import API_RESPONSE_PROMPT
API RESPONSE PROMPT在源码中的定义如下:
API RESPONSE PROMPT TEMPLATE =
API URL PROMPT TEMPLATE
+""(api url}
Here is the response from the API:
(api response}
Summarize this response to answer the original question.
Summary:""
)
API RESPONSE PROMPT PromptTemplate
input_variables=["api_docs","question","api url","api response"],
template=API RESPONSE PROMPT TEMPLATE,
)
导入API RESPONSE PROMPT后,格式化外部输人变量,将提示词提交给模型平台的API:
from langchain.chains.api.prompt import API RESPONSE_PROMPT
prompt=API_RESPONSE_PROMPT.format(api_docs=“”,question=“”,
api_url=“”,api_response=“”)
构建复杂的提示词就像盖房子,LangChain的提示词模板做了“盖房子”的基建工程,比如内置的提示词模板不仅可以解决大多数的业务需求,还可以检查数据格式、规划提示词结构、格式化提示词等。这些基建工程通常用于描述模型的任务,或用于指示模型的行为。外部数据则是开发者自由添加的数据,这些数据可以来自各种渠道。最主要的外部数据有用户的输入、用户和模型的历史聊天记录,以及开发者为模型增加的外部知识库数据、程序运行的上下文管理信息。
例如,开发者可以收集并使用历史聊天记录,这些历史聊天记录可以帮助模型理解之前的对话上下文,从而生成更加连贯和有用的回答。开发者也可以使用用户的输人,这些输人被填充到模板占位字符串中,可以帮助模型理解用户的需求,从而生成更加符合用户期望的回答。此外,开发者还可以编写自己的示例文本,或者导人外部的文档片段,这些示例文本和文档片段可以帮助大语言模型理解任务需求,增加大语言模型的“脑容量”和“记忆时长”,从而生成更加高质量的回答。
下图是一个典型的加人外部数据的提示词模板,它服务于RAG任务。RAG主要采用外部的知识库文档,将其插人提示词模板字符串中,让模型学习可能包含答案的上下文内容,模型学习了这些知识库文档后,生成答案的精确度将提升。2023年,AI创新领域常见的落地应用就是通过RAG提升机器人的回答质量。在LangChain框架中,通常用context代表检索到的相关文档内容,比如下图中的节点①{docs[i]},另外节点②是跟模型包装器交互过一次后生成的答案,也作为提示词的“中间答案”,最终形成节点③的提示词。

在下图中,节点①和节点②注人提示词模板的数据即外部数据。更加复杂的RAG场景中还会加人历史聊天记录,聊天记录也是一种外部数据。总的来说,无论是内部数据还是外部数据,都是供提示词模板包装器生成更好提示词的,从而可以开发出更加强大的大语言模型应用。构造提示词的过程就是一项“提示词工程”。
提示词模板的输出,在LangChain中,提示词模板输出的是适用于各种模型平台API类型的提示词。例如,LLM类型API接收的输入是一个字符串,而Chat类型API接收的是一个消息列表。如果你使用GPT-4模型,那么你就需要准备一个消息列表提示词,而ChatPromptTemplate包装器输出的就是符合GPT-4模型要求的提示词。同模型包装器的分类一样,提示词模板包装器也分为PromptTemplate包装器和ChatPromptTemplate包装器两类。
PromptTemplate包装器可以输出一个字符串类型的提示词。这个字符串可能包含一些特定的任务描述、用户问题,或者其他的上下文信息,它们都被整合在一起,构成了一个完整的、用于引导模型生成预期输出的提示词。字符串类型提示词如下:You are a helpful assistant that translates English to FrenchChatPromptTemplate包装器可以生成一个消息列表格式的提示词。模型平台的Chat类型API通常需要一个消息列表作为输入,在这种情况下,这种包装器将构造出一个包含多个消息对象的提示词。每个消息对象都代表一条消息,它可能是一个用户问题、一个AI回答,或者一条系统指令。这些消息被组织在一起,形成了一个清晰的对话流程,用于引导模型完成复杂的对话任务。消息列表格式的提示词如下:
SystemMessage(
content=(
'You are a helpful assistant that translates English
'to French.'
),
additional kwargs={}
HumanMessage
content='I love programming.',
additional kwargs={}
无论使用哪种类型的API,只要选择对应的提示词模板包装器,就可以轻松生成符合API要求的提示词,这极大地简化了构造提示词的过程,使得开发者可以将更多的精力放在优化业务逻辑上,而无须手动处理复杂的数据转换和格式化工作。
使用提示词模板构造提示词
LangChain提供了一套内置的提示词模板,这些模板可以用来生成各种任务提示词。在一些基础和通用的场景中,使用内置模板可能就足够了,但在一些特定和复杂的场景中,可能需要创建自定义模板。这里介绍最常见的使用LangChain内置模板来构造提示词的方法。
PromptTemplate包装器,PromptTemplate是LangChain提示词组件中最核心的一个类,构造提示词的步骤本质上是实例化这个类的过程。这个类被实例化为对象,在LangChain的各个链组件中被调用。在实例化PromptTemplate类时,两个关键参数是template和input_variables。只需要准备好这两个参数就可以实例化一个基础的PromptTemplate类,生成结果就是一个PromptTemplate对象,即一个PromptTemplat包装器。
from langchain import PromptTemplate
template = """
You are an expert data scientist with an expertise in building deep learningmodels.
Explain the concept of (concept}in a couple of lines"""
#实例化PromptTemplate:
prompt = PromptTemplate(template=template,input variables=["concept"])
#实例化模板的第二种方式:
prompt PromptTemplate.from template(template)
#将用户的输人通过format方法嵌入提示词模板,并且做格式化处理
final_prompt prompt.format (concept="NLP")
打印final prompt提示词,结果如下:
'\nYou are an expert data scientist with an expertise in building deep learning
models.\nExplain the concept of NLP in a couple of lines\n'
创建提示词模板主要涉及两个要求:需要有一个input variables属性,这个属性指定了提示词模板期望的输人变量。这些输入变量生成提示词需要的数据,比如在以上示例中,输人变量就是{concept}。如果不想显式指定输入变量,还可以使用from template方法,见上述代码中的第二种方式。这个方法接收与预期的input variables对应的关键字参数,并返回格式化的提示词。在上面的示例中,from template方法实例化模板,format方法接收concept="NLP"作为输人,并返回格式化后的提示词。
PromptTemplate包装器可以被链组件调用,也可以调用其他方法(结合外部用户输人和内部定义的关键参数),最终的结果是实现内部数据和外部数据的整合,形成一个完整的提示词。
ChatPromptTemplate包装器,ChatPromptTemplate包装器与PromptTemplate包装器不同,ChatPromptTemplate包装器构造的提示词是消息列表,支持输出Message对象。LangChain提供了内置的聊天提示词模板(ChatPromptTemplate)和角色消息提示词模板。角色消,息提示词模板包括AIMessagePromptTemplate、SystemMessagePromptTemplate和HumanMessagePromptTemplate这3种。
无论看起来多么复杂,构造提示词的步骤都是通用的,将内置的模板类实例化为包装器对象,用包装器来格式化外部的用户输入,调用类方法输出提示词。下面我们将上一个示例改造为使用ChatPromptTemplate包装器构造提示词的示例。先导人内置的聊天提示词模板和角色消息提示词模板:
from langchain.prompts import(
ChatPromptTemplate,
PromptTemplate,
SystemMessagePromptTemplate,
AIMessagePromptTemplate,
HumanMessagePromptTemplate,)
改造思路是生成人类消息和系统消息类型的提示词对象,将SystemMessage PromptTemplate类和HumanMessagePromptTemplate类实例化为包装器,再实例化 ChatPromptTemplate类,将前面两个对象作为参数传递给ChatPromptTemplate类实例化后的包装器,调用其from messages方法生成消息列表提示词包装器实例。
先使用from_template方法实例化SystemMessagePromptTemplate类和Human MessagePromptTemplate类,传人定义的template模板字符串,得到人类消息模板对象和系统消息模板对象:
from langchain import PromptTemplate
template ="""
You are an expert data scientist
with an expertise in building deep learning models."""
system_message_prompt =SystemMessagePromptTemplate.from_template(template)
human_template="Explain the concept of (concept}in a couple of lines"
human_message_prompt =HumanMessagePromptTemplate.from template (human template)
将上述两个模板对象作为参数传人from messages方法,转化为ChatPromptTemplate包装器:
chat prompt=ChatPromptTemplate.from messages
[system_message_prompt,
human_message prompt])
打印结果,如下:
ChatPromptTemplate(input variables=['concept'],output parser=None,partial_variables=(),messages=[SystemMessagePromptTemplateprompt=PromptTemplateinput variables=[],output_parser=None,partial variables=(},template=('\nYou are an expert data scientist with an expertise'in building deep learning models.\n'
),template format='f-string',validate template=True)additional kwargs={}
)
HumanMessagePromptTemplate(prompt=PromptTemplateinput_variables=['concept'],output_parser=None,partial variables=(},template=('Explain the concept of (concept}in a couple of lines'
),template format='f-string',validate_template=True
),additional kwargs=(}
])
最后使用包装器的format方法将用户输人传人包装器,组合为完整的提示词:
chat_prompt.format_prompt (concept="NLP")
调用format prompt方法,获得的是ChatPromptValue对象:
ChatPromptvalue(messages=[SystemMessage(content='\nYou are an expert datascientist with an expertise in building deep learning models.\n',additional kwargs=()),HumanMessage(content='Explain the concept of NLPin a couple of lines',additional_kwargs=(),example=False)])
ChatPrompt Value对象中有to string方法和to messages方法。调用to_messages方法:chat_prompt.format_prompt (concept="NLP").to_messages ()
结果如下:
[SystemMessage(content='\nYou are an expert data scientist with an expertise
in building deep learning models.\n',additional_kwargs=()),
HumanMessage (content='Explain the concept of NLP in a couple of lines',
additional kwargs=(},example=False)]
调用to string方法,结果如下:
'System:\nYou are an expert data scientist with an expertise in building
deep learning models.\n\nHuman:Explain the concept of NLP in a couple of lines'
值得一提的是,PromptTemplate包装器和ChatPromptTemplate包装器在实现方式上存在差异,包括它们所使用的内置模板及实例化方法都有所不同。PromptTemplate包装器的内置模板是PromptTemplate类,而ChatPromptTemplate包装器的内置模板是ChatPromptTemplate类。PromptTemplate的实例化方法相对简单,只需要传递input variables和template参数后直接进行函数式调用或使用from template的类方法进行调用即可,比如:
PROMPT PromptTemplate.from_template (template=template)
相比之下,ChatPromptTemplate的实例化方法就复杂多了。它接收的参数是已经实例化的多个对象列表(如system_message_prompt和human_message_prompt)。如果把ChatPromptTemplate实例化的对象视为“大包”,那么传人的包装器就是“小包”,形成了一种“大包装小包”的情况。此外,这个“大包”的实例化类方法也与PromptTemplate不同,它使用的是from messages方法,这个方法只接收消息列表形式的参数,比如下面代码中的变量messages:.
messages=[
SystemMessagePromptTemplate.from_template(system_template),
HumanMessagePromptTemplate.from template ("(question)"),
CHAT PROMPT ChatPromptTemplate.from_messages(messages)]
尽管存在差异,但PromptTemplate包装器和ChatPromptTemplate包装器的实例化仍有一定的通用规律,这些规律方便记忆和使用。以format为前缀的类方法主要用于在实例化模板对象后将外部用户输人格式化并传入对象内。如果是实例化LLM模型包装器的内置模板对象,需要使用format方法,而实例化聊天模型包装器的内置模板对象则使用format prompt方法。
类似地,以from为前缀的类方法主要用于实例化内置模板对象。PromptTemplate类只能使用from template方法,而ChatPromptTemplate类则使用from_messages方法。此外,为了实现这两种类型的相互转换,聊天模型包装器使用format prompt方法实例化模板对象,生成的对象符合PromptValue数据模式。所有返回该数据模式的对象都包含以to为前缀的方法名,包括to_string方法和to_messages方法,分别用于导出字符串和包含角色的消息列表。
相关文章:
模型/O功能之提示词模板
文章目录 模型/O功能之提示词模板什么是提示词模板提示词模板的输入和输出 使用提示词模板构造提示词 模型/O功能之提示词模板 在LangChain框架中,提示词不是简单的字符串,而是一个更复杂的结构,是一个“提示词工程”。这个结构中包含一个或多…...
[Proteus仿真]基于51单片机的智能温控系统
[Proteus仿真]基于51单片机的智能温控系统 基于51单片机的智能温控系统:DS18B20精准测温LCD1602双屏显示三键设置上下限声光报警,支持温度校准、抗干扰设计、阈值记忆。 一.仿真原理图 二.模块介绍 温度采集模块(DS18B20࿰…...
掌握 HTML5 多媒体标签:如何在所有浏览器中顺利嵌入视频与音频
系列文章目录 01-从零开始学 HTML:构建网页的基本框架与技巧 02-HTML常见文本标签解析:从基础到进阶的全面指南 03-HTML从入门到精通:链接与图像标签全解析 04-HTML 列表标签全解析:无序与有序列表的深度应用 05-HTML表格标签全面…...
ChatGPT与GPT的区别与联系
ChatGPT 和 GPT 都是基于 Transformer 架构的语言模型,但它们有不同的侧重点和应用。下面我们来探讨一下它们的区别与联系。 1. GPT(Generative Pre-trained Transformer) GPT 是一类由 OpenAI 开发的语言模型,基于 Transformer…...
浅谈线段树
文章同步发布于洛谷,建议前往洛谷查看。 前言 蒟蒻终于学会线段树(指【模板】线段树 1 1 1)啦! 线段树思想 我们先来考虑 P3372(基础线段树模板题)给的操作: 区间修改(增加&am…...
深度解读 Docker Swarm
一、引言 随着业务规模的不断扩大和应用复杂度的增加,容器集群管理的需求应运而生。如何有效地管理和调度大量的容器,确保应用的高可用性、弹性伸缩和资源的合理分配,成为了亟待解决的问题。Docker Swarm 作为 Docker 官方推出的容器集群管理工具,正是在这样的背景下崭露头…...
在线知识库的构建策略提升组织信息管理效率与决策能力
内容概要 在线知识库作为现代企业信息管理的重要组成部分,具有显著的定义与重要性。它不仅为组织提供了一个集中存储与管理知识的平台,还能够有效提升信息检索的效率,促进知识的创新和利用。通过这样的知识库,企业可以更好地应对…...
网件r7000刷回原厂固件合集测评
《网件R7000路由器刷回原厂固件详解》 网件R7000是一款备受赞誉的高性能无线路由器,其强大的性能和可定制性吸引了许多高级用户。然而,有时候用户可能会尝试第三方固件以提升功能或优化网络性能,但这也可能导致一些问题,如系统不…...
为什么命令“echo -e “\033[9;0]“ > /dev/tty0“能控制开发板上的LCD不熄屏?
为什么命令"echo -e “\033[9;0]” > /dev/tty0"能控制开发板上的LCD不熄屏? 在回答这个问题前请先阅读我之前写的与tty和终端有关的博文 https://blog.csdn.net/wenhao_ir/article/details/145431655 然后再来看这条命令的解释就要容易些了。 这条…...
vscode软件操作界面UI布局@各个功能区域划分及其名称称呼
文章目录 abstract检查用户界面的主要区域官方文档关于UI的介绍 abstract 检查 Visual Studio Code 用户界面 - Training | Microsoft Learn 本质上,Visual Studio Code 是一个代码编辑器,其用户界面和布局与许多其他代码编辑器相似。 界面左侧是用于访…...
【Java基础-42.3】Java 基本数据类型与字符串之间的转换:深入理解数据类型的转换方法
在 Java 开发中,基本数据类型与字符串之间的转换是非常常见的操作。无论是从用户输入中读取数据,还是将数据输出到日志或界面,都需要进行数据类型与字符串之间的转换。本文将深入探讨 Java 中基本数据类型与字符串之间的转换方法,…...
【ActiveMq RocketMq RabbitMq Kafka对比】
以下是 ActiveMQ、RocketMQ、RabbitMQ 和 Kafka 的对比表格,从复杂性、功能、性能和适用场景等方面进行整理: 特性ActiveMQRocketMQRabbitMQKafka开发语言JavaJavaErlangScala/Java协议支持AMQP、STOMP、MQTT、OpenWire 等自定义协议AMQP、STOMP、MQTT …...
csapp笔记3.6节——控制(1)
本节解决了x86-64如何实现条件语句、循环语句和分支语句的问题 条件码 除了整数寄存器外,cpu还维护着一组单个位的条件码寄存器,用来描述最近的算数和逻辑运算的某些属性。可检测这些寄存器来执行条件分支指令。 CF(Carry Flag)…...
网站快速收录:如何优化网站音频内容?
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/60.html 为了优化网站音频内容以实现快速收录,以下是一些关键的策略和步骤: 一、高质量音频内容创作 原创性: 确保音频内容是原创的,避免使…...
音视频入门基础:RTP专题(8)——使用Wireshark分析RTP
一、引言 通过Wireshark可以抓取RTP数据包,该软件可以从Wireshark Go Deep 下载。 二、通过Wireshark抓取RTP数据包 首先通过FFmpeg将一个媒体文件转推RTP,生成RTP流: ffmpeg -re -stream_loop -1 -i input.mp4 -vcodec copy -an -f rtp …...
4-图像梯度计算
文章目录 4.图像梯度计算(1)Sobel算子(2)梯度计算方法(3)Scharr与Laplacian算子4.图像梯度计算 (1)Sobel算子 图像梯度-Sobel算子 Sobel算子是一种经典的图像边缘检测算子,广泛应用于图像处理和计算机视觉领域。以下是关于Sobel算子的详细介绍: 基本原理 Sobel算子…...
深入解析 Redis AOF 机制:持久化原理、重写优化与 COW 影响
深入解析 Redis AOF 机制:持久化原理、重写优化与 COW 影响 1. 引言2. AOF 机制详解2.1 AOF 解决了什么问题?2.2 AOF 写入机制2.2.1 AOF 的基本原理2.2.2 AOF 运行流程2.2.3 AOF 文件刷盘策略 3. AOF 重写机制3.1 AOF 文件为什么会变大?3.2 解…...
机器学习day8
自定义数据集 ,使用朴素贝叶斯对其进行分类 代码 import numpy as np import matplotlib.pyplot as pltclass1_points np.array([[2.1, 2.2], [2.4, 2.5], [2.2, 2.0], [2.0, 2.1], [2.3, 2.3], [2.6, 2.4], [2.5, 2.1]]) class2_points np.array([[4.0, 3.5], …...
【前端】ES6模块化
文章目录 1. 模块化概述1.1 什么是模块化?1.2 为什么需要模块化? 2. 有哪些模块化规范3. CommonJs3.1 导出数据3.2 导入数据3.3 扩展理解3.4 在浏览器端运行 4.ES6模块化 参考视频地址 1. 模块化概述 1.1 什么是模块化? 将程序文件依据一定规则拆分成多个文件,这种编码方式…...
【leetcode练习·二叉树拓展】快速排序详解及应用
本文参考labuladong算法笔记[拓展:快速排序详解及应用 | labuladong 的算法笔记] 1、算法思路 首先我们看一下快速排序的代码框架: def sort(nums: List[int], lo: int, hi: int):if lo > hi:return# 对 nums[lo..hi] 进行切分# 使得 nums[lo..p-1]…...
Gurobi基础语法之 addConstr, addConstrs, addQConstr, addMQConstr
在新版本的 Gurobi 中,向 addConstr 这个方法中传入一个 TempConstr 对象,在模型中就会根据这个对象生成一个约束。更重要的是:TempConstr 对象可以传给所有addConstr系列方法,所以下面先介绍 TempConstr 对象 TempConstr TempC…...
游戏引擎 Unity - Unity 设置为简体中文、Unity 创建项目
Unity Unity 首次发布于 2005 年,属于 Unity Technologies Unity 使用的开发技术有:C# Unity 的适用平台:PC、主机、移动设备、VR / AR、Web 等 Unity 的适用领域:开发中等画质中小型项目 Unity 适合初学者或需要快速上手的开…...
Kamailio、MySQL、Redis、Gin后端、Vue.js前端等基于容器化部署
基于容器化的部署方案,通常会将每个核心服务(如Kamailio、MySQL、Redis、Gin后端、Vue.js前端等)独立运行在不同的容器中,通过Docker或Kubernetes统一管理。以下是具体实现方式和关键原因: 1. 容器化部署的核心思路 每…...
从1号点到n号点最多经过k条边的最短距离
目录 解析方法思路代码解释代码逐行注释1. 头文件和常量定义:2.边的结构体:3.全局变量:4.Bellman-Ford算法实现:5.主函数: 注意事项代码含义为什么需要 backup[a]?举例说明关键点 总结 解析 要实现从1号点…...
模拟实战-用CompletableFuture优化远程RPC调用
实战场景 这是广州某500-900人互联网厂的面试原题 手写并发优化解决思路 我们要调用对方的RPC接口,我们的RPC接口每调用一次对方都会阻塞50ms 但是我们的业务要批量调用RPC,例如我们要批量调用1k次,我们不可能在for循环里面写1k次远程调用…...
【pinia状态管理配置】
pinia状态管理配置 安装main.ts引入自定义user仓库使用自定义仓库 安装 pnpm add piniamain.ts引入 // createPinia() 函数调用创建了一个新的 Pinia 实例。 // 这个实例是状态管理的核心,它将管理应用中所有的 store。 import { createPinia } from pinia app.us…...
SpringBoot 引⼊MybatisGenerator
SpringBoot 引⼊MybatisGenerator 1. 引入插件2. 添加generator.xml并修改3. 生成文件 1. 引入插件 <plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.5</vers…...
在线销售数据集分析:基于Python的RFM数据分析方法实操训练
一、前言 个人练习,文章用于记录自己的学习练习过程,分享出来和大家一起学习。 数据集:在线销售数据集 分析方法:RFM分析方法 二、过程 1.1 库的导入与一些必要的初始设置 import pandas as pd import datetime import matplo…...
LeetCode - #197 Swift 实现找出温度更高的日期
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
分析哲学:从 语言解剖到 思想澄清的哲学探险
分析哲学:从 语言解剖 到 思想澄清 的哲学探险 第一节:分析哲学的基本概念与公式解释 【通俗讲解,打比方来讲解!】 分析哲学,就像一位 “语言侦探”,专注于 “解剖语言”,揭示我们日常使用的语…...
C++【iostream】数据库的部分函数功能介绍
在 C 编程世界中,iostream 库扮演着举足轻重的角色,它是 C 标准库的核心组成部分,为程序提供了强大的输入输出功能。无论是简单的控制台交互,还是复杂的文件操作,iostream 库都能提供便捷高效的解决方案。本文将深入剖…...
金山打字游戏2010绿色版,Win7-11可用DxWnd完美运行
金山打字游戏2010绿色版,Win7-11可用DxWnd完美运行 链接:https://pan.xunlei.com/s/VOIAYCzmkbDfdASGJa_uLjquA1?pwd67vw# 进入游戏后,如果输入不了英文字母(很可能是中文输入状态),就按一下“Shift”键…...
洛谷[USACO08DEC] Patting Heads S
题目传送门 题目难度:普及/提高一 题面翻译 今天是贝茜的生日,为了庆祝自己的生日,贝茜邀你来玩一个游戏。 贝茜让 N N N ( 1 ≤ N ≤ 1 0 5 1\leq N\leq 10^5 1≤N≤105) 头奶牛坐成一个圈。除了 1 1 1 号与 N N N 号奶牛外࿰…...
讲清逻辑回归算法,剖析其作为广义线性模型的原因
1、逻辑回归算法介绍 逻辑回归(Logistic Regression)是一种广义线性回归分析模型。虽然名字里带有“回归”两字,但其实是分类模型,常用于二分类。既然逻辑回归模型是分类模型,为什么名字里会含有“回归”二字呢?这是因为其算法原…...
基于STM32的智能安防监控系统
1. 引言 随着物联网技术的普及,智能安防系统在家庭与工业场景中的应用日益广泛。本文设计了一款基于STM32的智能安防监控系统,集成人体感应、环境异常检测、图像识别与云端联动功能,支持实时报警、远程监控与数据回溯。该系统采用边缘计算与…...
八. Spring Boot2 整合连接 Redis(超详细剖析)
八. Spring Boot2 整合连接 Redis(超详细剖析) 文章目录 八. Spring Boot2 整合连接 Redis(超详细剖析)2. 注意事项和细节3. 最后: 在 springboot 中 , 整合 redis 可以通过 RedisTemplate 完成对 redis 的操作, 包括设置数据/获取数据 比如添加和读取数据 具体整…...
220.存在重复元素③
目录 一、题目二、思路三、解法四、收获 一、题目 给你一个整数数组 nums 和两个整数 indexDiff 和 valueDiff 。 找出满足下述条件的下标对 (i, j): i ! j, abs(i - j) < indexDiff abs(nums[i] - nums[j]) < valueDiff 如果存在,返回 true &a…...
【Linux】从硬件到软件了解进程
个人主页~ 从硬件到软件了解进程 一、冯诺依曼体系结构二、操作系统三、操作系统进程管理1、概念2、PCB和task_struct3、查看进程4、通过系统调用fork创建进程(1)简述(2)系统调用生成子进程的过程〇提出问题①fork函数②父子进程关…...
volatile变量需要减少读取次数吗
问题说明 本人在前期读Netty源码时看到这样一段源码和注释: private boolean invokeHandler() {// Store in local variable to reduce volatile reads.int handlerState this.handlerState;return handlerState ADD_COMPLETE || (!ordered && handlerS…...
红黑树的封装
一、封装思路 在 STL 中 map set 的底层就是封装了一棵红黑树。 其中连接红黑树和容器的是迭代器,map set 暴露出的接口都不是自己写的,而是红黑树写的,外部接口封装红黑树接口。 所以写出红黑树为 map set 写的接口,再在上层的…...
Java 泛型<? extends Object>
在 Java 泛型中,<? extends Object> 和 <?> 都表示未知类型,但它们在某些情况下有细微的差异。泛型的引入是为了消除运行时错误并增强类型安全性,使代码更具可读性和可维护性。 在 JDK 5 中引入了泛型,以消除编译时…...
TensorFlow简单的线性回归任务
如何使用 TensorFlow 和 Keras 创建、训练并进行预测 1. 数据准备与预处理 2. 构建模型 3. 编译模型 4. 训练模型 5. 评估模型 6. 模型应用与预测 7. 保存与加载模型 8.完整代码 1. 数据准备与预处理 我们将使用一个简单的线性回归问题,其中输入特征 x 和标…...
解码大数据的四个V:体积、速度、种类与真实性
解码大数据的四个V:体积、速度、种类与真实性 在大数据领域,有一个大家耳熟能详的概念——“四个V”:Volume(体积)、Velocity(速度)、Variety(种类)、Veracityÿ…...
【单层神经网络】基于MXNet的线性回归实现(底层实现)
写在前面 基于亚马逊的MXNet库本专栏是对李沐博士的《动手学深度学习》的笔记,仅用于分享个人学习思考以下是本专栏所需的环境(放进一个environment.yml,然后用conda虚拟环境统一配置即可)刚开始先从普通的寻优算法开始ÿ…...
深入解析 posix_spawn():高效的进程创建方式(中英双语)
深入解析 posix_spawn():高效的进程创建方式 1. 引言 在 Unix/Linux 系统中,传统的进程创建方式主要依赖 fork() 和 exec() 组合。但 fork() 在某些情况下可能存在性能瓶颈,特别是当父进程占用大量内存时,fork() 仍然需要复制整…...
2024-我的学习成长之路
因为热爱,无畏山海...
【Java异步编程】基于任务类型创建不同的线程池
文章目录 一. 按照任务类型对线程池进行分类1. IO密集型任务的线程数2. CPU密集型任务的线程数3. 混合型任务的线程数 二. 线程数越多越好吗三. Redis 单线程的高效性 使用线程池的好处主要有以下三点: 降低资源消耗:线程是稀缺资源,如果无限…...
前缀和多种基础
前缀和加法 #include<iostream> #include<algorithm> using namespace std; typedef long long ll; int n; const int N 1e310; int arr[N]; int pre[N]; int org[N]; int main(void) {cin >> n;for(int i 1 ; i < n ; i){cin >> arr[i];pre[i] …...
关于贪心学习的文笔记录
贪心,顾名思义就是越贪越好,越多越有易,他给我的感觉是,通常是求最大或最小问题,相比于动态规划贪心让人更加琢磨不透,不易看出方法,为此在这记录我所见过的题型和思维方法,以便回头…...
蓝桥杯思维训练营(三)
文章目录 题目详解680.验证回文串 II30.魔塔游戏徒步旅行中的补给问题观光景点组合得分问题 题目详解 680.验证回文串 II 680.验证回文串 II 思路分析:这个题目的关键就是,按照正常来判断对应位置是否相等,如果不相等,那么就判…...