LangChain 介绍及相关组件使用总结

news2024/11/16 2:53:33

一、langChain

LangChain 是一个由语言模型LLMs驱动的应用程序框架,它允许用户围绕大型语言模型快速构建应用程序和管道。 可以直接与 OpenAIChatGPT 模型以及 Hugging Face 集成。通过 langChain 可快速构建聊天机器人、生成式问答(GQA)、本文摘要等应用场景。

LangChain本身并不开发LLMs,它的核心理念是为各种LLMs提供通用的接口,降低开发者的学习成本,方便开发者快速地开发复杂的LLMs应用。LangChain目前有pythonnodejs 两种版本实现,python 支持的能力较多,下面的功能演示都是基于 Python 进行的。

LangChain 中主要支持的组件如下所述:

  • Models:各种类型的模型和模型集成,比如OpenAIChatGPT
  • Prompts:提示管理、提示优化和提示序列化,通过提示微调模型的语义理解。
  • Memory:用来保存和模型交互时的上下文状态。
  • Indexes:用来结构化文档,以便和模型交互。
  • Chains:一系列对各种组件的调用。
  • Agents:决定模型采取哪些行动,执行并且观察流程,直到完成为止。

例如:使用原生的方式调用 OpenAI 如下:

pip install openai -i https://pypi.tuna.tsinghua.edu.cn/simple
import openai
import os

openai.api_key = os.environ["OPENAI_API_KEY"]
messages = [{"role": "user", "content": "介绍下 ChatGPT "}]
response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=messages,
    temperature=0,
)

print("LLM 返回:", response.choices[0].message["content"])

在这里插入图片描述

现在使用 LangChain 的话就可以使用下面方式:

pip install langchain[all] -i https://pypi.tuna.tsinghua.edu.cn/simple
from langchain.llms import OpenAI
import os

openai_api_key=os.environ["OPENAI_API_KEY"]
llm = OpenAI(model_name="gpt-3.5-turbo", openai_api_key=openai_api_key)
my_text = "介绍下 ChatGPT "
print(llm(my_text))

在这里插入图片描述

下面是基于 LangChain 构建聊天功能:

from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage, AIMessage
import os

openai_api_key=os.environ["OPENAI_API_KEY"]
chat = ChatOpenAI(temperature=1, openai_api_key=openai_api_key)
res =  chat(
    [
        # 系统语言
        SystemMessage(content="你是一个智能导游,根据用户描述的地方,回答该地放的特色"),
        # 人类语言
        HumanMessage(content="江苏南京")
    ]
)
print(res)

在这里插入图片描述

从上面的案例可以感受出 LangChain 的简易性,更详细的介绍可以参考下面官方文档:

https://python.langchain.com/docs/get_started/quickstart

中文文档地址:

https://www.langchain.com.cn/

下面对常用的 LangChain 组件进行使用介绍:

二、Prompts 提示管理

使用文本提示的方式,微调模型的语义理解,给出更加准确的信息。

2.1 PromptTemplate 提示模板

PromptTemplate 可以生成文本模版,通过变量参数的形式拼接成完整的语句。

from langchain.llms import OpenAI
from langchain import PromptTemplate
import os

openai_api_key = os.environ["OPENAI_API_KEY"]

# 使用 openAi 模型
llm = OpenAI(model_name="gpt-3.5-turbo", openai_api_key=openai_api_key)

# 模版格式
template = "我像吃{value}。我应该怎么做出来?"
# 构建模版
prompt = PromptTemplate(
    input_variables=["value"],
    template=template,
)
# 模版生成内容
final_prompt = prompt.format(value='鱼香肉丝')

print("输入内容::", final_prompt)
print("LLM输出:", llm(final_prompt))

在这里插入图片描述

2.2 FewShotPromptTemplate 选择器示例

将提示的示例内容同样拼接到语句中,让模型去理解语义含义进而给出结果。

from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.prompts import FewShotPromptTemplate, PromptTemplate
from langchain.llms import OpenAI
import os

## prompt  选择器示例
openai_api_key = os.environ["OPENAI_API_KEY"]

llm = OpenAI(model_name="gpt-3.5-turbo", openai_api_key=openai_api_key)

example_prompt = PromptTemplate(
    input_variables=["input", "output"],
    template="示例输入:{input}, 示例输出:{output}",
)

# 这是可供选择的示例列表
examples = [
    {"input": "飞行员", "output": "飞机"},
    {"input": "驾驶员", "output": "汽车"},
    {"input": "厨师", "output": "厨房"},
    {"input": "空姐", "output": "飞机"},
]

# 根据语义选择与您的输入相似的示例
example_selector = SemanticSimilarityExampleSelector.from_examples(
    examples,
    # 生成用于测量语义相似性的嵌入的嵌入类。
    OpenAIEmbeddings(openai_api_key=openai_api_key),
    # 存储词向量
    FAISS,
    # 生成的示例数
    k=4
)
# 选择器示例 prompt
similar_prompt = FewShotPromptTemplate(
    example_selector=example_selector,
    example_prompt=example_prompt,
    # 加到提示顶部和底部的提示项
    prefix="根据下面示例,写出输出",
    suffix="输入:{value},输出:",
    # 输入变量
    input_variables=["value"],
)

value = "学生"
# 模版生成内容
final_prompt = similar_prompt.format(value=value)

print("输入内容::", final_prompt)
print("LLM输出:", llm(final_prompt))

在这里插入图片描述

2.3 ChatPromptTemplate 聊天提示模版

以聊天消息作为输入生成完整提示模版。

from langchain.schema import HumanMessage
from langchain.prompts import PromptTemplate, ChatPromptTemplate, HumanMessagePromptTemplate
# 我们将使用聊天模型,默认为 gpt-3.5-turbo
from langchain.chat_models import ChatOpenAI
# 解析输出并取回结构化数据
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
import os

openai_api_key = os.environ["OPENAI_API_KEY"]
chat_model = ChatOpenAI(temperature=0, model_name='gpt-3.5-turbo', openai_api_key=openai_api_key)

prompt = ChatPromptTemplate(
    messages=[
        HumanMessagePromptTemplate.from_template("根据用户内容,提取出公司名称和地域名, 用用户内容: {user_prompt}")
    ],
    input_variables=["user_prompt"]
)

user_prompt = "阿里巴巴公司在江苏南京有分公司吗"
fruit_query = prompt.format_prompt(user_prompt=user_prompt)
print('输入内容:', fruit_query.messages[0].content)

fruit_output = chat_model(fruit_query.to_messages())
print('LLM 输出:', fruit_output)

在这里插入图片描述

2.4 StructuredOutputParser 输出解析器

要使 LLM 模型返回我们需要的格式,可以直接告诉 LLM 你想要的结果格式,也可以通过 解析器来制定:

PromptTemplate + StructuredOutputParser

from langchain.output_parsers import StructuredOutputParser, ResponseSchema
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate, PromptTemplate
from langchain.llms import OpenAI
import os

openai_api_key = os.environ["OPENAI_API_KEY"]

llm = OpenAI(model_name="text-davinci-003", openai_api_key=openai_api_key)
# 定义结构
response_schemas = [
    ResponseSchema(name="company", description="提取的公司名"),
    ResponseSchema(name="area", description="提取的地域名")
]
# 解析输出结构
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
format_instructions = output_parser.get_format_instructions()
print('格式化的提示模板', format_instructions)

template = """
根据用户内容,提取出公司名称和地域名
{format_instructions}
% 用户输入:
{value}
"""
prompt = PromptTemplate(
    input_variables=["value"],
    partial_variables={"format_instructions": format_instructions},
    template=template
)
final_prompt = prompt.format(value="阿里巴巴公司在江苏南京有分公司吗")

print("输入内容::", final_prompt)
print("LLM输出:", llm(final_prompt))

在这里插入图片描述

PromptTemplate + ChatPromptTemplate

from langchain.schema import HumanMessage
from langchain.prompts import PromptTemplate, ChatPromptTemplate, HumanMessagePromptTemplate
# 我们将使用聊天模型,默认为 gpt-3.5-turbo
from langchain.chat_models import ChatOpenAI
# 解析输出并取回结构化数据
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
import os

openai_api_key = os.environ["OPENAI_API_KEY"]
chat_model = ChatOpenAI(temperature=0, model_name='gpt-3.5-turbo', openai_api_key=openai_api_key)

response_schemas = [
    ResponseSchema(name="company", description="提取的公司名"),
    ResponseSchema(name="area", description="提取的地域名")
]
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
format_instructions = output_parser.get_format_instructions()
print(format_instructions)

prompt = ChatPromptTemplate(
    messages=[
        HumanMessagePromptTemplate.from_template("根据用户内容,提取出公司名称和地域名 {format_instructions}, 用户输入: {value}")
    ],
    input_variables=["value"],
    partial_variables={"format_instructions": format_instructions}
)

fruit_query = prompt.format_prompt(value="阿里巴巴公司在江苏南京有分公司吗")
print (fruit_query.messages[0].content)

fruit_output = chat_model(fruit_query.to_messages())
output = output_parser.parse(fruit_output.content)
print (output)

在这里插入图片描述

三、文件载入 和 Embeddings 文本向量化

例如有如下文本文件:

`LangChain` 是一个开发由语言模型`LLMs`驱动的应用程序的框架,它允许用户围绕大型语言模型快速构建应用程序和管道。 可以直接与 `OpenAI` 的 `GPT` 模型以及 `Hugging Face` 集成。通过 `langChain` 可快速构建聊天机器人、生成式问答(`GQA`)、本文摘要等应用场景。

`LangChain`本身并不开发`LLMs`,它的核心理念是为各种`LLMs`提供通用的接口,降低开发者的学习成本,方便开发者快速地开发复杂的`LLMs`应用。`LangChain`目前有两个`python` 和 `nodejs` 两种版本实现,`python`  支持的能力较多,下面都基于 `Python` 演示其部分功能。

`LangChain` 中主要支持的组件有如下:

- `Models`:各种类型的模型和模型集成,比如`OpenAI` 的 `ChatGPT`。
- `Prompts`:提示管理、提示优化和提示序列化,通过提示微调模型的语义理解。
- `Memory`:用来保存和模型交互时的上下文状态。
- `Indexes`:用来结构化文档,以便和模型交互。
- `Chains`:一系列对各种组件的调用。
- `Agents`:决定模型采取哪些行动,执行并且观察流程,直到完成为止。

3.1 文件加载与分割

自己进行文件的加载,然后对字符串进行分割:

from langchain.text_splitter import RecursiveCharacterTextSplitter

with open('data/test.txt', 'r', encoding="utf-8") as f:
    value = f.read()

# 文本分割器
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=300,
    chunk_overlap=100,
)
# 创建文档
texts = text_splitter.create_documents([value])
print("文档数:", len(texts))

# 拆分后的文档
for doc in texts:
    print(doc)

在这里插入图片描述

使用文本加载器,加载文本:

from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import TextLoader

# 使用文本加载器
loader = TextLoader('data/test.txt', encoding="utf-8")
documents = loader.load()

# 文本分割器
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=300,
    chunk_overlap=100,
)
# 分割文档
texts = text_splitter.split_documents(documents)
print("文档数:", len(texts))

# 拆分后的文档
for doc in texts:
    print(doc)

3.2 Embeddings 文本向量化

文本向量化,可以计算出文本的相似性:

from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import TextLoader
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
import os

openai_api_key=os.environ["OPENAI_API_KEY"]
# 使用文本加载器
loader = TextLoader('data/test.txt', encoding="utf-8")
documents = loader.load()

# 文本分割器
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=300,
    chunk_overlap=100,
)
# 分割文档
texts = text_splitter.split_documents(documents)
print("文档数:", len(texts))
# 拆分后的文档
for doc in texts:
    print(doc)
# 准备嵌入引擎
embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)
# 向量化
# 会对 OpenAI 进行 API 调用
db = FAISS.from_documents(texts, embeddings)
# 初始化检索器
retriever = db.as_retriever()
# 根据语义获取最相近的文档
docs = retriever.get_relevant_documents("介绍下什么是 langchain ?")
print('结果:', docs)

在这里插入图片描述

四、memory 多轮对话

对于聊天应用中,记录聊天的记录给到模型可以回答出更加准确的回答,最前面第一点介绍的案例只有一个简单的问答,如果是多轮对话就可以修改为如下格式:

from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage, AIMessage
import os

openai_api_key=os.environ["OPENAI_API_KEY"]
chat = ChatOpenAI(temperature=0.7, openai_api_key=openai_api_key)
## 多轮对话
res = chat(
    [
        SystemMessage(content="你是一个很好的 AI 机器人,可以帮助用户在一个简短的句子中找出去哪里旅行"),
        HumanMessage(content="我喜欢海滩,我应该去哪里?"),
        AIMessage(content="你应该去广东深圳"),
        HumanMessage(content="当我在那里时我还应该做什么?")
    ]
)
print('多轮对话', res)

在这里插入图片描述

还可以基于 Memory 组件中的 ChatMessageHistory

from langchain.memory import ChatMessageHistory
from langchain.chat_models import ChatOpenAI
import os

openai_api_key=os.environ["OPENAI_API_KEY"]
chat = ChatOpenAI(temperature=0, openai_api_key=openai_api_key)

# 声明历史
history = ChatMessageHistory()
history.add_user_message("你是一个很好的 AI 机器人,可以帮助用户在一个简短的句子中找出去哪里旅行")
history.add_user_message("我喜欢海滩,我应该去哪里?")
# 添加AI语言
history.add_ai_message("你应该去广东深圳")
# 添加人类语言
history.add_user_message("当我在那里时我还应该做什么?")

print('history信息:', history.messages)
# 调用模型
ai_response = chat(history.messages)
print('结果', ai_response)

# 继续添加 AI 语言
history.add_ai_message(ai_response.content)
print('history信息:', history.messages)

# 继续添加人类语言
history.add_user_message("推荐下美食和购物场所")
ai_response = chat(history.messages)
print('结果', ai_response)

在这里插入图片描述

五、chain 顺序链

5.1 简单顺序链

可以使用 LLM 的输出作为另一个 LLM 的输入。有利于任务的分解:

from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain.chains import SimpleSequentialChain
import os

openai_api_key = os.environ["OPENAI_API_KEY"]
llm = OpenAI(temperature=1, openai_api_key=openai_api_key)

# 第一个链模版内容
template1 = "根据用户的输入的描述推荐一个适合的地区,用户输入: {value}"
prompt_template1 = PromptTemplate(input_variables=["value"], template=template1)
# 构建第一个链
chain1 = LLMChain(llm=llm, prompt=prompt_template1)

# 第二个链模版内容
template2 = "根据用户的输入的地区推荐该地区的美食,用户输入: {value}"
prompt_template2 = PromptTemplate(input_variables=["value"], template=template2)
# 构建第二个链
chain2 = LLMChain(llm=llm, prompt=prompt_template2)

# 将链组装起来
overall_chain = SimpleSequentialChain(chains=[chain1, chain2], verbose=True)

# 运行链
review = overall_chain.run("我想在中国看大海")
print('结果:', review)

在这里插入图片描述

5.2 总结链

有时候对于大量的文本内容进行摘要总结,可能无法一次性加载进来,此时可借助总结链进行总结:

from langchain.chains.summarize import load_summarize_chain
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.llms import OpenAI
import os

openai_api_key = os.environ["OPENAI_API_KEY"]

loader = TextLoader('data/test.txt',encoding="utf-8")
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=700, chunk_overlap=50)
texts = text_splitter.split_documents(documents)

llm = OpenAI(temperature=1, openai_api_key=openai_api_key)
chain = load_summarize_chain(llm, chain_type="map_reduce", verbose=True)
review = chain.run(texts)
print('结果:',review)

六、问答

通过本地知识库微调模型,回答出更加准确的信息。

from langchain import OpenAI
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.document_loaders import TextLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
import os

openai_api_key = os.environ["OPENAI_API_KEY"]
llm = OpenAI(temperature=0, openai_api_key=openai_api_key)

loader = TextLoader('./data/test.txt',encoding="utf-8")
doc = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=400)
docs = text_splitter.split_documents(doc)
# 嵌入引擎
embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)
# 词向量
docsearch = FAISS.from_documents(docs, embeddings)
# 创建检索引擎
qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=docsearch.as_retriever())

res = qa.run("介绍下什么是 langchain ")

print(res)

在这里插入图片描述

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

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

相关文章

Nginx做图片服务器

前言: Nginx是一个高性能的HTTP和反向代理web服务器,以及负载均衡器。根据nginx是高性能的http服务器,因此可以用作图片服务器使用。 本案例是在docker安装nginx来操作的。 Nginx安装 1、首先是docker的安装 详情参考:docker安装 2、拉取ng…

倒计时2天,解锁亚马逊云科技中国峰会 Dev Lounge 玩法

2023 亚马逊云科技中国峰会即将重磅登陆上海 主会场与分论坛云集百余位重磅嘉宾 开发者会客厅也已集齐全球优秀开源社区 倒计时2天,赶快报名参与这场顶级盛会! 开发者大讲堂,圆桌讨论给你精彩 数据对于企业和个人来说都至关重要&#xff0…

【kubernetes系列】Kubernetes中的重要概念

​ 在学习k8s之前,必须先了解 Kubernetes 的几个重要概念,它们是组成 Kubernetes 集群的基石。(参考Kubernetes权威指南) 一、Master Kubernetes 里的Master指的是集群的控制节点, 每个Kubernetes 集群里至少需要有一…

大数据应用——hive实验

任务一:完成Hive内嵌模式部署 1.1 Hive部署 官网下载Hive安装包 (1)官网地址:Apache Hive (2)文档查看地址: https://cwili.apache.org/confluence/display/Hive/GettingStarted (2&…

年轻人存款难吗?探讨现实挑战与如何应对

年轻人存款难吗?探讨现实挑战与如何应对 近日,一项调查显示“大概五分之一的年轻人存款在一万元以内。10万元存款是一个“坎”,存款超过10万就会超过53.7%的人。”这个数据引发了关于“年轻人”和“存款”的广泛关注和讨论。作为社会的未来&…

使用 Maya、ZBrush 和 XGen 创建极其逼真的美女肖像

今天云渲染小编给大家带来的是CG艺术家Hadi Karimi 的朋友 Clara 肖像模型背后的工作流程,展示了头发是如何使用 XGen 完成的,并解释了为什么历史人物很难进行逼真的渲染。 介绍 大家伙,我是 Hadi Karimi,是一名来自伊朗的自由 C…

.net点选验证码实现思路分享

哈哈好久没冒泡了,最进看见点选验证码有点意思,所以想自己写一个。 先上效果图 如果你被这个效果吸引了就请继续看下去。 贴代码前先说点思路: 1.要有一个汉字库,并按字形分类。(我在数据库里是安部首分类的) 2.获…

力扣题库刷题笔记13--罗马数字转整数

1、题目如下: 2、个人Python代码实现: 虽然前面刚刷了整数转罗马数字,而且本题难度为简单,实际上做出来还是花了很多时间,不亚于前面整数转罗马数字。 以上的思路,主要是声明一个列表temp,然后遍…

【MYSQL】—— MySQL 在 Centos 7环境安装

本期,我将给大家介绍的是如何在【Linux】上安装相应的 mysql。 目录 1. 卸载不要的环境 2. 检查系统安装包 3. 获取mysql官⽅yum源 4. 安装mysql yum 源,对⽐前后yum源 5. 看看能不能正常⼯作 6. 安装mysql服务 7. 启动服务 8. 查看启动服务 9.…

从“特种兵旅游”到“citywalk”,渡远户外还能热下去么?

过去风靡一时的“户外露营热”,有些企业赶上了,有些没有。去年坐上“末班车”的渡远户外也想尝些甜头。 套上“户外”概念的渡远户外,或许正在被质疑“血统”并不“纯正”,主营房车游艇配套产品和水上休闲运动产品,说…

【新星计划Linux】——学习工具VMware介绍

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 前言 本章将会讲解Linux学习工具VMware介绍。 一.VMware介绍 1.前期准备 官方网站&#…

【资料分享】全志科技T507-H评估板规格书(4核ARM Cortex-A53,主频1.416GHz)

1 评估板简介 创龙科技TLT507-EVM是一款基于全志科技T507-H处理器设计的4核ARM Cortex-A53国产工业评估板,主频高达1.416GHz,由核心板和评估底板组成。核心板CPU、ROM、RAM、电源、晶振等所有器件均采用国产工业级方案,国产化率100%。同时&a…

实战:win10安装docker并用docker-compose构建运行容器

文章目录 前言Docker DesktopHyper-V安装 Docker Desktop for Windows下载docker desktopDocker安装目录软连接运行Docker Desktop安装文件Docker Desktop验证 docker-compose构建运行管理容器创建文件目录及配置文件构建并启动容器查看启动的容器并验证 写在最后 前言 Docker…

数字IC前端学习笔记:仲裁轮询(四)

相关文章 数字IC前端学习笔记:LSFR(线性反馈移位寄存器) 数字IC前端学习笔记:跨时钟域信号同步 数字IC前端学习笔记:信号同步和边沿检测 数字IC前端学习笔记:锁存器Latch的综合 数字IC前端学习笔记&am…

网络安全|渗透测试入门学习,从零基础入门到精通—动态分析技术工具OllyDbg界面介绍

目录 动态分析技术调试器 什么是OllyDbg OllyDbg能干什么 OllyDbg窗口介绍 1、反汇编面板窗口 2、信息面板窗口 3、数据面板窗口 4、寄存器面板窗口 5、栈面板窗口 动态分析技术调试器 动态分析技术中最重要的工具是调试器,分为用户模式和内核模式两种类型…

【c++11】万能引用和完美转发

c11 万能引用完美转发 这一节是对上一篇右值引用的补充。 链接: 右值引用 万能引用 看如下代码 void Fun(int &x){ cout << "左值引用" << endl; } void Fun(const int &x){ cout << "const 左值引用" << endl; }void …

推荐四款常用在档案室温湿度记录的传感器记录仪

A.数字信号485信号输出的温湿度传感器/变送器 主要参数 液晶显示、485信号输出、9-24/VDC供电、壁挂式安装/吸顶式安装、走线/连接方式485总线、标准modbus RTU通讯协议 B。数字信号RJ45信号输出的温湿度传感器/变送器 ​主要参数 液晶显示、RJ45信号输出、9-24/VDC供电/标…

Zabbix Timeout 设置不当导致的问题

哈喽大家好&#xff0c;我是咸鱼 今天跟大家分享一个关于 zabbix Timeout 值设置不当导致的问题&#xff0c;这个问题不知道大家有没有碰到过 问题 事情经过是这样的&#xff1a; 把某一台 zabbix agent 的模板由原来的 Template OS Windows by Zabbix agent 换成了 Templa…

第一章:项目整体介绍【基于Servlet+JSP的图书管理系统】

一、项目介绍 1.项目说明 本项目是一个完全从0带领大家实现的一个非常基础的WEB项目&#xff0c;非常适合零基础和在校的大学生来动手实现。既能提升技术熟练度了解软件开发的具体过程。同时也能帮助大家搞定毕业设计的需求。之前在B站也分享了一个图书管理系统的视频。但是实…

超简单 display:flex教学

display 弹性盒子解释 Flex是Flexible Box的缩写&#xff0c;意为"弹性布局”&#xff0c;用来为盒状模型提供最大的灵活性。 它的作用&#xff1a; 它能够更加高效方便的控制元素的对齐、排列。 可以自动计算布局内元素的尺寸&#xff0c;无论这个元素的尺寸是固定的还是…