#LLM入门|Prompt#3.2_模型,提示和输出解释器_Models,Prompts_and_Parses

news2024/11/17 7:37:01

本章将简要介绍LLM开发的重要概念:模型、提示和解释器。如果您已经完整学习了前面两个部分的内容,对这些概念应该已经很熟悉了。然而,在LangChain的定义中,这些概念的定义和使用与之前有一些细微的差别。因此,我们仍然推荐您认真阅读本章,以进一步深入了解LLM开发。同时,如果您直接学习本部分的话,本章的内容将是您理解后续内容的重要基础。
我们首先向您演示直接调用 OpenAI 的场景,以充分说明为什么我们需要使用 LangChain。

一、直接调用OpenAI

1.1 计算1+1

我们来看一个简单的例子,直接使用通过 OpenAI 接口封装的函数get_completion来让模型告诉我们:1+1是什么?

from tool import get_completion

get_completion("1+1是什么?")

‘1+1等于2。’

1.2 用普通话表达海盗邮件

在上述简单示例中,模型gpt-3.5-turbo为我们提供了关于1+1是什么的答案。而现在,我们进入一个更为丰富和复杂的场景。
设想一下,你是一家电商公司的员工。你们的客户中有一位名为海盗A的特殊顾客。他在你们的平台上购买了一个榨汁机,目的是为了制作美味的奶昔。但在制作过程中,由于某种原因,奶昔的盖子突然弹开,导致厨房的墙上洒满了奶昔。想象一下这名海盗的愤怒和挫败之情。他用充满海盗特色的英语方言,给你们的客服中心写了一封邮件:customer_email。

customer_email = """
嗯呐,我现在可是火冒三丈,我那个搅拌机盖子竟然飞了出去,把我厨房的墙壁都溅上了果汁!
更糟糕的是,保修条款可不包括清理我厨房的费用。
伙计,赶紧给我过来!
"""

在处理来自多元文化背景的顾客时,我们的客服团队可能会遇到某些特殊的语言障碍。如上,我们收到了一名海盗客户的邮件,而他的表达方式对于我们的客服团队来说略显生涩。
为了解决这一挑战,我们设定了以下两个目标:

  • 首先,我们希望模型能够将这封充满海盗方言的邮件翻译成普通话,这样客服团队就能更容易地理解其内容。
  • 其次,在进行翻译时,我们期望模型能采用平和和尊重的语气,这不仅能确保信息准确传达,还能保持与顾客之间的和谐关系。

为了指导模型的输出,我们定义了一个文本表达风格标签,简称为style

# 普通话 + 平静、尊敬的语调
style = """正式普通话 \
用一个平静、尊敬、有礼貌的语调
"""

下一步我们需要做的是将customer_email和style结合起来构造我们的提示:prompt

# 要求模型根据给出的语调进行转化
prompt = f"""把由三个反引号分隔的文本\
翻译成一种{style}风格。
文本: ```{customer_email}```
"""

print("提示:", prompt)
提示: 
 把由三个反引号分隔的文本翻译成一种正式普通话 用一个平静、尊敬、有礼貌的语调
风格。
文本: ```
嗯呐,我现在可是火冒三丈,我那个搅拌机盖子竟然飞了出去,把我厨房的墙壁都溅上了果汁!
更糟糕的是,保修条款可不包括清理我厨房的费用。
伙计,赶紧给我过来!
经过精心设计的prompt已经准备就绪。接下来,只需调用get_completion方法,我们就可以获得期望的输出——那封原汁原味的海盗方言邮件,将被翻译成既平和又尊重的正式普通话表达。

response = get_completion(prompt)
print(response)Copy to clipboardErrorCopied

非常抱歉,我现在感到非常愤怒和不满。我的搅拌机盖子竟然飞了出去,导致我厨房的墙壁上都溅满了果汁!更糟糕的是,保修条款并不包括清理我厨房的费用。先生/女士,请您尽快过来处理这个问题!
在进行语言风格转换之后,我们可以观察到明显的变化:原本的用词变得更为正式,那些带有极端情绪的表达得到了替代,并且文本中还加入了表示感激的词汇。
**小建议:你可以调整并尝试不同的提示,来探索模型能为你带来怎样的创新性输出。每次尝试都可能为你带来意想不到的惊喜!**
## 二、通过LangChain使用OpenAI
在前面的小节中,我们使用了封装好的函数get_completion,利用 OpenAI 接口成功地对那封充满方言特色的邮件进行了翻译。得到一封采用平和且尊重的语气、并用标准普通话所写的邮件。接下来,我们将尝试使用 LangChain 解决该问题。
### 2.1 模型
现在让我们尝试使用LangChain来实现相同的功能。从langchain.chat_models导入OpenAI的对话模型ChatOpenAI。 除去OpenAI以外,langchain.chat_models还集成了其他对话模型,更多细节可以查看 [Langchain 官方文档](https://python.langchain.com/en/latest/modules/models/chat/integrations.html)。

from langchain.chat_models import ChatOpenAI

这里我们将参数temperature设置为0.0,从而减少生成答案的随机性。

如果你想要每次得到不一样的有新意的答案,可以尝试调整该参数。

chat = ChatOpenAI(temperature=0.0)
chat

ChatOpenAI(cache=None, verbose=False, callbacks=None, callback_manager=None, tags=None, metadata=None, client=<class ‘openai.api_resources.chat_completion.ChatCompletion’>, model_name=‘gpt-3.5-turbo’, temperature=0.0, model_kwargs={}, openai_api_key=‘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’, openai_api_base=‘’, openai_organization=‘’, openai_proxy=‘’, request_timeout=None, max_retries=6, streaming=False, n=1, max_tokens=None, tiktoken_model_name=None)


上面的输出显示ChatOpenAI的默认模型为gpt-3.5-turbo
### 2.2 使用提示模版
在前面的例子中,我们通过[f字符串](https://docs.python.org/zh-cn/3/tutorial/inputoutput.html#tut-f-strings)把Python表达式的值style和customer_email添加到prompt字符串内。
langchain提供了接口方便快速的构造和使用提示。
#### 2.2.1 用普通话表达海盗邮件
现在我们来看看如何使用langchain来构造提示吧!

from langchain.prompts import ChatPromptTemplate

首先,构造一个提示模版字符串:template_string

template_string = “”“把由三个反引号分隔的文本
翻译成一种{style}风格。
文本: {text}
“””

然后,我们调用ChatPromptTemplatee.from_template()函数将

上面的提示模版字符template_string转换为提示模版prompt_template

prompt_template = ChatPromptTemplate.from_template(template_string)

print(“\n”, prompt_template.messages[0].prompt)

 

input_variables=[‘style’, ‘text’] output_parser=None partial_variables={} template=‘把由三个反引号分隔的文本翻译成一种{style}风格。文本: {text}\n’ template_format=‘f-string’ validate_template=True


对于给定的customer_style和customer_email, 我们可以使用提示模版prompt_template的format_messages方法生成想要的客户消息customer_messages。
提示模版prompt_template需要两个输入变量: style 和 text。 这里分别对应

- customer_style: 我们想要的顾客邮件风格
- customer_email: 顾客的原始邮件文本。

customer_style = “”“正式普通话
用一个平静、尊敬的语气
“””

customer_email = “”"
嗯呐,我现在可是火冒三丈,我那个搅拌机盖子竟然飞了出去,把我厨房的墙壁都溅上了果汁!
更糟糕的是,保修条款可不包括清理我厨房的费用。
伙计,赶紧给我过来!
“”"

使用提示模版

customer_messages = prompt_template.format_messages(
style=customer_style,
text=customer_email)

打印客户消息类型

print(“客户消息类型:”,type(customer_messages),“\n”)

打印第一个客户消息类型

print(“第一个客户客户消息类型类型:”, type(customer_messages[0]),“\n”)

打印第一个元素

print(“第一个客户客户消息类型类型: “, customer_messages[0],”\n”)

客户消息类型:
<class ‘list’>

第一个客户客户消息类型类型:
<class ‘langchain.schema.messages.HumanMessage’>

第一个客户客户消息类型类型:
content=‘把由三个反引号分隔的文本翻译成一种正式普通话 用一个平静、尊敬的语气\n风格。文本: \n嗯呐,我现在可是火冒三丈,我那个搅拌机盖子竟然飞了出去,把我厨房的墙壁都溅上了果汁!\n更糟糕的是,保修条款可不包括清理我厨房的费用。\n伙计,赶紧给我过来!\n\n’ additional_kwargs={} example=False



可以看出

- customer_messages变量类型为列表(list)
- 列表里的元素变量类型为langchain自定义消息(langchain.schema.HumanMessage)。



现在我们可以调用模型部分定义的chat模型来实现转换客户消息风格。

customer_response = chat(customer_messages)
print(customer_response.content)

非常抱歉,我现在感到非常愤怒。我的搅拌机盖子竟然飞了出去,导致我厨房的墙壁上都溅满了果汁!更糟糕的是,保修条款并不包括清理我厨房的费用。伙计,请你尽快过来帮我解决这个问题!
#### 2.2.2 用海盗方言回复邮件
到目前为止,我们已经实现了在前一部分的任务。接下来,我们更进一步,将客服人员回复的消息,转换为海盗风格英语,并确保消息比较有礼貌。 这里,我们可以继续使用起前面构造的的langchain提示模版,来获得我们回复消息提示。

service_reply = “”“嘿,顾客,
保修不包括厨房的清洁费用,
因为您在启动搅拌机之前
忘记盖上盖子而误用搅拌机,
这是您的错。
倒霉! 再见!
“””

service_style_pirate = “”"
一个有礼貌的语气
使用海盗风格
“”"
service_messages = prompt_template.format_messages(
style=service_style_pirate,
text=service_reply)

print(“\n”, service_messages[0].content)

把由三个反引号分隔的文本翻译成一种一个有礼貌的语气 使用海盗风格风格。文本: ```嘿,顾客, 保修不包括厨房的清洁费用, 因为您在启动搅拌机之前 忘记盖上盖子而误用搅拌机, 这是您的错。 倒霉! 再见!

# 调用模型部分定义的chat模型来转换回复消息风格
service_response = chat(service_messages)
print(service_response.content)

嘿,尊贵的客户啊,保修可不包括厨房的清洁费用,因为您在启动搅拌机之前竟然忘记盖上盖子而误用了搅拌机,这可是您的疏忽之过啊。真是倒霉透顶啊!祝您一路顺风!

2.2.3 为什么需要提示模版

在应用于比较复杂的场景时,提示可能会非常长并且包含涉及许多细节。使用提示模版,可以让我们更为方便地重复使用设计好的提示
此外,LangChain还提供了提示模版用于一些常用场景。比如自动摘要、问答、连接到SQL数据库、连接到不同的API。通过使用LangChain内置的提示模版,你可以快速建立自己的大模型应用,而不需要花时间去设计和构造提示。
最后,我们在建立大模型应用时,通常希望模型的输出为给定的格式,比如在输出使用特定的关键词来让输出结构化。
– 对于问题:What is the elevation range for the area that the eastern sector of the Colorado orogeny extends into? 通过使用LangChain库函数,输出采用"Thought"(思考)、“Action”(行动)、“Observation”(观察)作为链式思考推理的关键词,让输出结构化。

2.3 输出解析器

2.3.1 不使用输出解释器提取客户评价中的信息

对于给定的评价customer_review, 我们希望提取信息,并按以下格式输出:

{
  "gift": False,
  "delivery_days": 5,
  "price_value": "pretty affordable!"
}
from langchain.prompts import ChatPromptTemplate

customer_review = """\
这款吹叶机非常神奇。 它有四个设置:\
吹蜡烛、微风、风城、龙卷风。 \
两天后就到了,正好赶上我妻子的\
周年纪念礼物。 \
我想我的妻子会喜欢它到说不出话来。 \
到目前为止,我是唯一一个使用它的人,而且我一直\
每隔一天早上用它来清理草坪上的叶子。 \
它比其他吹叶机稍微贵一点,\
但我认为它的额外功能是值得的。
"""

review_template = """\
对于以下文本,请从中提取以下信息:

礼物:该商品是作为礼物送给别人的吗? \
如果是,则回答 是的;如果否或未知,则回答 不是。

交货天数:产品需要多少天\
到达? 如果没有找到该信息,则输出-1。

价钱:提取有关价值或价格的任何句子,\
并将它们输出为逗号分隔的 Python 列表。

使用以下键将输出格式化为 JSON:
礼物
交货天数
价钱

文本: {text}
"""

prompt_template = ChatPromptTemplate.from_template(review_template)
print("提示模版:", prompt_template)


messages = prompt_template.format_messages(text=customer_review)


chat = ChatOpenAI(temperature=0.0)
response = chat(messages)

print("结果类型:", type(response.content))
print("结果:", response.content)
提示模版: 
 input_variables=['text'] output_parser=None partial_variables={} messages=[HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['text'], output_parser=None, partial_variables={}, template='对于以下文本,请从中提取以下信息:\n\n礼物:该商品是作为礼物送给别人的吗? 如果是,则回答 是的;如果否或未知,则回答 不是。\n\n交货天数:产品需要多少天到达? 如果没有找到该信息,则输出-1。\n\n价钱:提取有关价值或价格的任何句子,并将它们输出为逗号分隔的 Python 列表。\n\n使用以下键将输出格式化为 JSON:\n礼物\n交货天数\n价钱\n\n文本: {text}\n', template_format='f-string', validate_template=True), additional_kwargs={})]

结果类型:
 <class 'str'>

结果:
 {
  "礼物": "是的",
  "交货天数": 2,
  "价钱": ["它比其他吹叶机稍微贵一点"]
}

可以看出 response.content类型为字符串(str),而并非字典(dict), 如果想要从中更方便的提取信息,我们需要使用Langchain中的输出解释器。

2.3.2 使用输出解析器提取客户评价中的信息

接下来,我们将展示如何使用输出解释器。

review_template_2 = """\
对于以下文本,请从中提取以下信息::

礼物:该商品是作为礼物送给别人的吗?
如果是,则回答 是的;如果否或未知,则回答 不是。

交货天数:产品到达需要多少天? 如果没有找到该信息,则输出-1。

价钱:提取有关价值或价格的任何句子,并将它们输出为逗号分隔的 Python 列表。

文本: {text}

{format_instructions}
"""

prompt = ChatPromptTemplate.from_template(template=review_template_2)

from langchain.output_parsers import ResponseSchema
from langchain.output_parsers import StructuredOutputParser

gift_schema = ResponseSchema(name="礼物",
                             description="这件物品是作为礼物送给别人的吗?\
                            如果是,则回答 是的,\
                            如果否或未知,则回答 不是。")

delivery_days_schema = ResponseSchema(name="交货天数",
                                      description="产品需要多少天才能到达?\
                                      如果没有找到该信息,则输出-1。")

price_value_schema = ResponseSchema(name="价钱",
                                    description="提取有关价值或价格的任何句子,\
                                    并将它们输出为逗号分隔的 Python 列表")


response_schemas = [gift_schema, 
                    delivery_days_schema,
                    price_value_schema]
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
format_instructions = output_parser.get_format_instructions()
print("输出格式规定:",format_instructions)
输出格式规定: 
 The output should be a markdown code snippet formatted in the following schema, including the leading and trailing "```json" and "```":

```json
{
    "礼物": string  // 这件物品是作为礼物送给别人的吗?                            如果是,则回答 是的,                            如果否或未知,则回答 不是。
    "交货天数": string  // 产品需要多少天才能到达?                                      如果没有找到该信息,则输出-1。
    "价钱": string  // 提取有关价值或价格的任何句子,                                    并将它们输出为逗号分隔的 Python 列表
}

messages = prompt.format_messages(text=customer_review, format_instructions=format_instructions)
print(“第一条客户消息:”,messages[0].content)

第一条客户消息:
对于以下文本,请从中提取以下信息::

礼物:该商品是作为礼物送给别人的吗?
如果是,则回答 是的;如果否或未知,则回答 不是。

交货天数:产品到达需要多少天? 如果没有找到该信息,则输出-1。

价钱:提取有关价值或价格的任何句子,并将它们输出为逗号分隔的 Python 列表。

文本: 这款吹叶机非常神奇。 它有四个设置:吹蜡烛、微风、风城、龙卷风。 两天后就到了,正好赶上我妻子的周年纪念礼物。 我想我的妻子会喜欢它到说不出话来。 到目前为止,我是唯一一个使用它的人,而且我一直每隔一天早上用它来清理草坪上的叶子。 它比其他吹叶机稍微贵一点,但我认为它的额外功能是值得的。

The output should be a markdown code snippet formatted in the following schema, including the leading and trailing “json" and "”:

{
    "礼物": string  // 这件物品是作为礼物送给别人的吗?                            如果是,则回答 是的,                            如果否或未知,则回答 不是。
    "交货天数": string  // 产品需要多少天才能到达?                                      如果没有找到该信息,则输出-1。
    "价钱": string  // 提取有关价值或价格的任何句子,                                    并将它们输出为逗号分隔的 Python 列表
}

response = chat(messages)

print(“结果类型:”, type(response.content))
print(“结果:”, response.content)

结果类型:
<class ‘str’>

结果:

{
   "礼物": "不是",
   "交货天数": "两天后就到了",
   "价钱": "它比其他吹叶机稍微贵一点"
}

output_dict = output_parser.parse(response.content)

print(“解析后的结果类型:”, type(output_dict))
print(“解析后的结果:”, output_dict)

解析后的结果类型:
<class ‘dict’>

解析后的结果:
{‘礼物’: ‘不是’, ‘交货天数’: ‘两天后就到了’, ‘价钱’: ‘它比其他吹叶机稍微贵一点’}

output_dict类型为字典(dict), 可直接使用get方法。这样的输出更方便下游任务的处理。

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

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

相关文章

docker小白第十二天

docker小白第十二天 docker network简介 docker不启动时默认的网络情况。 # 停止docker服务 systemctl stop docker.socket systemctl stop docker # 查看docker镜像 docker images输入查看docker镜像命令后&#xff0c;显示未连接到docker服务器 docker启动时网络情况 sy…

Java毕业设计 基于springboot vue招聘网站 招聘系统

Java毕业设计 基于springboot vue招聘网站 招聘系统 springboot vue招聘网站 招聘系统 功能介绍 用户&#xff1a;登录 个人信息 简历信息 查看招聘信息 企业&#xff1a;登录 企业信息管理 发布招聘信息 职位招聘信息管理 简历信息管理 管理员&#xff1a;注册 登录 管理员…

【智能算法】平衡优化器(EO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.代码实现4.参考文献 1.背景 2020年&#xff0c;Afshin Faramarzi等人受到估计动态和平衡状态的控制体积质量平衡模型启发&#xff0c;提出了平衡优化器(Equilibrium Optimizer, EO)。&#xff08;PS&#xff1a;酒桶摇摇晃晃~&…

哪里找视频素材大全无水印,推荐五个超棒的视频素材网站

嘿&#xff0c;小伙伴们&#xff01;你们是不是在找视频素材大全无水印&#xff1f;别着急&#xff0c;我这就给你们推荐五个超棒的视频素材网站&#xff0c;让你的视频创作更加出彩&#xff01; 蛙学网&#xff1a;蛙学网是个适合国内创作者的好去处&#xff0c;这里有大量的视…

toapi,一个强大的 Python Web API库!

目录 前言 什么是 Python Toapi 库&#xff1f; 核心功能 使用方法 1. 安装 Toapi 库 2. 创建 Toapi 应用 3. 定义规则和过滤器 4. 运行 Toapi 应用 实际应用场景 1. 数据提取与分析 2. 自动化爬虫和数据抓取 3. 构建自定义搜索引擎 高级功能和进阶用法 1. 动态页面渲染 …

读《Cheating Depth: Enhancing 3D Surface Anomaly Detection via Depth Simulation》

WCAV2024 摘要&引言 RGB骨干&#xff1a;某些表面异常仅在RGB中实际上仍然是看不见的&#xff0c;因此需要合并三维信息&#xff08;确实重点在于“合并”&#xff0c;单纯看例子里的深度图片也看不出来异常在哪里&#xff0c;但是和rgb overlay之后就明显一些了&#xf…

【开源】SpringBoot框架开发学生综合素质评价系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生功能2.2 教师功能2.3 教务处功能 三、系统展示四、核心代码4.1 查询我的学科竞赛4.2 保存单个问卷4.3 根据类型查询学生问卷4.4 填写语数外评价4.5 填写品德自评问卷分 五、免责说明 一、摘要 1.1 项目介绍 基于J…

WebAssembly探索篇(三)emcc和cmake编译opencv案例

文章目录 开发环境安装opencv环境 实践出真知完整项目效果图 踩坑fatal error: opencv2/opencv.hpp file not found增加软链ln&#xff08;无效&#xff09;改用自行安装opencv&#xff0c;再显示指定lib路径 emcc命令行运行方式 最近因为项目原因&#xff0c;研究了一下WebAss…

NCV7321D11R2G收发器中文资料PDF数据手册引脚图参数图片价格芯片概述特性原理

产品概述&#xff1a; NCV7321 是一款全功能局部互联网 (LIN) 收发器&#xff0c;适用于 LIN 协议控制器和物理总线之间的接口。该收发器以 I3T 技术实施&#xff0c;可实现高电压模拟电路和数字功能在同一个芯片上的共存。NCV7321 LIN 器件属于车内联网 (IVN) 收发器系列。LI…

【鸿蒙HarmonyOS开发笔记】常用组件介绍篇 —— TextInput文本输入组件

概述 TextInput为文本输入组件&#xff0c;用于接收用户输入的文本内容。 参数 TextInput组件的参数定义如下 TextInput(value?:{placeholder?: string|Resource , text?: string|Resource})● placeholder placeholder属性用于设置无输入时的提示文本&#xff0c;效果…

基于tcp协议的网络通信(基础echo版.多进程版,多线程版,线程池版),telnet命令

目录 基础版 思路 辅助函数 服务端 代码 运行情况 -- telnet ip 端口号 传输的数据为什么没有转换格式 客户端 思路 代码 多进程版 引入 问题 解决 注意点 服务端 代码 运行情况 进程池版(简单介绍) 多线程版 引入 问题解决 注意点 服务端 代码 …

Java微服务分布式事务框架seata

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…

SSH远程连接断开后,程序继续运行

1、问题 我们在使用SSH连接远程服务器跑代码的时候&#xff0c;可能会遇到 代码需要跑很久 的情况&#xff0c;你可能会想 断开远程连接&#xff0c;但是&#xff0c;代码仍然要继续跑。 (eg: 晚上关电脑&#xff0c;但是想让代码继续跑着&#xff0c;第二天想看结果) 2、scre…

JSONP漏洞详解

目录 同源策略 JSONP简介 JSONP劫持漏洞 漏洞原理 漏洞利用过程 利用工具 JSONP漏洞挖掘思路 JSONP防御 首先&#xff0c;要了解一下什么是同源策略&#xff1f; 同源策略 同源策略&#xff08;SOP&#xff09;是浏览器的一个安全基石&#xff0c;浏览器为了保证数据…

使用 Jenkins 管道在 Docker Hub 中构建 Docker 镜像

Jenkins Pipeline 是一个强大的工具&#xff0c;可以自动执行部署。在各个阶段之间拆分的灵活和自定义操作是尝试此功能的一个很好的理由。 构建您自己的 Docker 镜像并将其上传到 Docker Hub 以保持存储库更新是了解 Jenkins Pipeline 如何改进您的工作方式的一个很好的示例。…

详细分析Python装饰器(附Demo)

目录 前言1. 基本知识2. 无参装饰器3. 有参装饰器4. 多个装饰器 前言 装饰器类似Java的切点切面增强 推荐阅读&#xff1a; 详细分析Spring中的Around注解&#xff08;附Demo&#xff09;java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff0…

如何实现Git Push之后自动部署到服务器?

在平时个人开发的过程中是不是有这样的烦恼&#xff1a; 项目开发完成&#xff0c;Push之后 登录服务器&#xff0c;手动git pull&#xff0c;然后运行部署命令 这真的很烦诶&#xff01; 那么能不能Git push之后&#xff0c;远端服务器自动 Git pull 然后运行部署命令呢&a…

内网安全之-NTLM协议详解

NTLM&#xff08;New Technology LAN Manager&#xff09;身份验证协议是微软用于Windows身份验证的主要协议之一。早起SMB协议以明文口令的形式在网络上传输&#xff0c;因此产生了安全性问题。后来出现了LM&#xff08;LAN Manager&#xff09;身份验证协议&#xff0c;它非常…

排序问题—java实现

冒泡排序 算法思想&#xff1a; 每次比较相邻元素&#xff0c;若逆序则交换位置&#xff0c;每一趟比较n-1次&#xff0c;确定一个最大值。故需比较n趟&#xff0c;来确定n个数的位置。 外循环来表示比较的趟数&#xff0c;每一趟确定一个最大数的位置内循环来表示相邻数字两…

2024考研国家线公布,各科分数线有哪些变化?考研国家线哪些涨了,哪些跌了?可视化分析告诉你

结论在文章结尾 2024考研国家线 一、近五年国家线趋势图-学术硕士 文学 管理学 工学照顾专业 体育学 交叉学科 军事学 历史学 理学 享受少数名族照顾政策的考生 中医类照顾专业 教育类 艺术类 医学 工学 哲学 法学 农学 经济学 二、近五年国家线趋势图-专业硕士 中医 应用心理 …