【LLM大模型】LangChain从到入门到实战

1.概述

最近,在研究LangChain时,发现一些比较有意思的点,今天笔者将给大家分享关于LangChain的一些内容。

2.内容

2.1 什么是LangChain?

LangChain是一项旨在赋能开发人员利用语言模型构建端到端应用程序的强大框架。它的设计理念在于简化和加速利用大型语言模型(LLM)和对话模型构建应用程序的过程。这个框架提供了一套全面的工具、组件和接口,旨在简化基于大型语言模型和对话模型的应用程序开发过程。

LangChain本质上可被视为类似于开源GPT的插件。它不仅提供了丰富的大型语言模型工具,还支持在开源模型的基础上快速增强模型的功能。通过LangChain,开发人员可以更轻松地管理与语言模型的交互,无缝地连接多个组件,并集成额外的资源,如API和数据库等,以加强应用的能力和灵活性。

LangChain的优势在于为开发人员提供了一个便捷的框架,使其能够更高效地构建应用程序,利用最先进的语言模型和对话系统,同时能够灵活地定制和整合其他必要的资源,为应用程序的开发和部署提供了更大的灵活性和便利性。

2.2 LangChain框架组成?

1.Model

任何语言模型应用的核心要素是…… 模型。LangChain为您提供了与任何语言模型进行接口的基本构件。

  • 提示:模板化、动态选择和管理模型输入
  • 语言模型:通过通用接口调用语言模型
  • 输出解析器:从模型输出中提取信息

此外,LangChain还提供了额外的关键功能,如:

  • 模型适配器:通过适配器将不同类型的语言模型无缝整合到应用程序中。
  • 模型优化器:优化和调整模型以提高性能和效率。
  • 自定义组件:允许开发人员根据特定需求创建和整合自定义组件,以扩展和改进模型的功能。

2.Retrieval

许多大型语言模型(LLM)应用需要用户特定的数据,这些数据并不属于模型的训练集。实现这一点的主要方法是通过检索增强生成(RAG)。在这个过程中,会检索外部数据,然后在生成步骤中传递给LLM。

LangChain为RAG应用提供了从简单到复杂的所有构建模块。文档的此部分涵盖与检索步骤相关的所有内容,例如数据的获取。尽管听起来简单,但实际上可能相当复杂。这包括几个关键模块。

文档加载器

从许多不同来源加载文档。LangChain提供超过100种不同的文档加载器,并与其他主要提供者(如AirByte和Unstructured)进行集成。我们提供与各种位置(私人S3存储桶、公共网站)的各种文档类型(HTML、PDF、代码)的加载集成。

文档转换器

检索的关键部分是仅获取文档的相关部分。这涉及几个转换步骤,以最佳准备文档进行检索。其中一个主要步骤是将大型文档分割(或分块)为较小的块。LangChain提供了几种不同的算法来执行此操作,同时针对特定文档类型(代码、Markdown等)进行了优化逻辑。

文本嵌入模型

检索的另一个关键部分是为文档创建嵌入。嵌入捕获文本的语义含义,使您能够快速高效地查找其他类似的文本。LangChain与超过25种不同的嵌入提供者和方法进行集成,涵盖了从开源到专有API的各种选择,使您可以选择最适合您需求的方式。LangChain提供了标准接口,使您能够轻松切换模型。

向量存储

随着嵌入技术的兴起,出现了对数据库的需求,以支持这些嵌入的有效存储和搜索。LangChain与超过50种不同的向量存储进行集成,涵盖了从开源本地存储到云托管专有存储的各种选择,使您可以选择最适合您需求的方式。LangChain提供标准接口,使您能够轻松切换向量存储。

检索器

一旦数据存储在数据库中,您仍需要检索它。LangChain支持许多不同的检索算法,这是我们增加最多价值的领域之一。我们支持易于入门的基本方法,即简单的语义搜索。然而,我们还在此基础上添加了一系列算法以提高性能。这些包括:

  • 父文档检索器:这允许您为每个父文档创建多个嵌入,使您能够查找较小的块,但返回更大的上下文。
  • 自查询检索器:用户的问题通常包含对不仅仅是语义的某些逻辑的引用,而是可以最好表示为元数据过滤器的逻辑。自查询允许您从查询中提取出语义部分以及查询中存在的其他元数据过滤器。
  • 组合检索器:有时您可能希望从多个不同来源或使用多种不同算法检索文档。组合检索器可以轻松实现此操作。

3.Chains

单独使用LLM适用于简单的应用程序,但更复杂的应用程序需要将LLM链接起来,要么彼此链接,要么与其他组件链接。

LangChain提供了两个高级框架来“链接”组件。传统方法是使用Chain接口。更新的方法是使用LangChain表达语言(LCEL)。在构建新应用程序时,我们建议使用LCEL进行链式组合。但是,我们继续支持许多有用的内置Chain,因此我们在这里对两个框架进行了文档化。正如我们将在下面提到的,Chain本身也可以用于LCEL,因此两者并不是互斥的。

新内容补充:
此外,LangChain还提供了其他关于链式组合的重要内容:

  • 模块兼容性:LangChain旨在确保不同模块之间的兼容性,使得可以无缝地将不同类型的LLMs和其他组件相互链接,以构建更加复杂和高效的应用程序。
  • 动态调整:框架允许动态调整不同模块和LLMs之间的连接方式,从而使得应用程序的功能和性能得到灵活的调整和优化。
  • 可扩展性:LangChain提供了灵活的扩展机制,允许开发人员根据具体需求定制新的链接策略和模块组合,以适应不同场景下的需求。

LCEL最显著的部分是它提供了直观且易读的组合语法。但更重要的是,它还提供了一流的支持。为一个简单且常见的例子,我们可以看到如何将提示(prompt)、模型和输出解析器结合起来:

from langchain.chat_models import ChatAnthropic
from langchain.prompts import ChatPromptTemplate
from langchain.schema import StrOutputParsermodel = ChatAnthropic()
prompt = ChatPromptTemplate.from_messages([("system", "You're a very knowledgeable historian who provides accurate and eloquent answers to historical questions."),("human", "{question}"),
])
runnable = prompt | model | StrOutputParser()

Chain 是“链式”应用程序的传统接口。我们通常很泛化地定义 Chain 为对组件的一系列调用,其中可能包括其他链。基本接口很简单:

class Chain(BaseModel, ABC):"""Base interface that all chains should implement."""memory: BaseMemorycallbacks: Callbacksdef __call__(self,inputs: Any,return_only_outputs: bool = False,callbacks: Callbacks = None,) -> Dict[str, Any]:...

4.Memory

在与模型交互时,用于存储上下文状态。模型本身不具备上下文记忆,因此在与模型交互时,需要传递聊天内容的上下文。

大多数大型语言模型应用具有会话式界面。对话的一个基本组成部分是能够引用先前在对话中提到的信息。至少,会话系统应能直接访问一定范围内的先前消息。更复杂的系统需要具有一个持续更新的世界模型,使其能够保持关于实体及其关系的信息。

我们称存储关于先前互动的信息的能力为“记忆”。LangChain为向系统添加记忆提供了许多实用工具。这些实用工具可以单独使用,也可以无缝地整合到链中。

一个记忆系统需要支持两种基本操作:读取和写入。要记住,每个链定义了一些核心执行逻辑,期望得到某些输入。其中一些输入直接来自用户,但有些输入可能来自记忆。在给定运行中,一个链将两次与其记忆系统交互。

在接收到初始用户输入之后,但在执行核心逻辑之前,链将从其记忆系统中读取并增补用户输入。
在执行核心逻辑后,但在返回答案之前,链将把当前运行的输入和输出写入记忆,以便在将来的运行中引用。

让我们看一看如何在链中使用 ConversationBufferMemory。ConversationBufferMemory 是一种极其简单的内存形式,它只是在缓冲区中保留了一系列聊天消息,并将其传递到提示模板中。

from langchain.memory import ConversationBufferMemorymemory = ConversationBufferMemory()
memory.chat_memory.add_user_message("hi!")
memory.chat_memory.add_ai_message("what's up?")

在链中使用记忆时,有一些关键概念需要理解。请注意,这里我们介绍了适用于大多数记忆类型的一般概念。每种单独的记忆类型可能都有其自己的参数和概念,需要理解。

通常情况下,链接收或返回多个输入/输出键。在这些情况下,我们如何知道要保存到聊天消息历史记录的键是哪些?这通常可以通过记忆类型的 input_key 和 output_key 参数来控制。这些参数默认为 None - 如果只有一个输入/输出键,那么会自动使用该键。但是,如果有多个输入/输出键,则必须明确指定要使用哪一个的名称。最后,让我们来看看如何在链中使用这个功能。我们将使用一个 LLMChain,并展示如何同时使用 LLM 和 ChatModel。

使用一个LLM:

from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemoryllm = OpenAI(temperature=0)
# Notice that "chat_history" is present in the prompt template
template = """You are a nice chatbot having a conversation with a human.Previous conversation:
{chat_history}New human question: {question}
Response:"""
prompt = PromptTemplate.from_template(template)
# Notice that we need to align the `memory_key`
memory = ConversationBufferMemory(memory_key="chat_history")
conversation = LLMChain(llm=llm,prompt=prompt,verbose=True,memory=memory
)

使用一个ChatModel:

from langchain.chat_models import ChatOpenAI
from langchain.prompts import (ChatPromptTemplate,MessagesPlaceholder,SystemMessagePromptTemplate,HumanMessagePromptTemplate,
)
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemoryllm = ChatOpenAI()
prompt = ChatPromptTemplate(messages=[SystemMessagePromptTemplate.from_template("You are a nice chatbot having a conversation with a human."),# The `variable_name` here is what must align with memoryMessagesPlaceholder(variable_name="chat_history"),HumanMessagePromptTemplate.from_template("{question}")]
)
# Notice that we `return_messages=True` to fit into the MessagesPlaceholder
# Notice that `"chat_history"` aligns with the MessagesPlaceholder name.
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
conversation = LLMChain(llm=llm,prompt=prompt,verbose=True,memory=memory
)

5.Agents

Agents的核心理念是利用LLM选择要采取的一系列行动。在链式结构中,行动序列是硬编码的(在代码中)。而在Agents中,语言模型被用作推理引擎,决定要采取哪些行动以及顺序。

一些重要的术语(和模式)需要了解:

  • AgentAction:这是一个数据类,代表Agents应该执行的操作。它具有一个tool属性(应该调用的工具的名称)和一个tool_input属性(该工具的输入)。
  • AgentFinish:这是一个数据类,表示Agent已经完成并应该返回给用户。它有一个return_values参数,这是要返回的字典。通常它只有一个键 - output - 是一个字符串,因此通常只返回这个键。
  • intermediate_steps:这些表示传递的先前Agent操作和对应的输出。这些很重要,以便在将来的迭代中传递,以便Agent知道它已经完成了哪些工作。它的类型被定义为List[Tuple[AgentAction, Any]]。请注意,observation目前以Any类型留下以保持最大的灵活性。在实践中,这通常是一个字符串。

6.Callbacks

LangChain提供了回调系统,允许您连接到LLM应用程序的各个阶段。这对于日志记录、监控、流处理和其他任务非常有用。

您可以通过使用API中始终可用的callbacks参数来订阅这些事件。该参数是处理程序对象的列表,这些处理程序对象应该详细实现下面描述的一个或多个方法。

CallbackHandlers 是实现 CallbackHandler 接口的对象,该接口为可以订阅的每个事件都有一个方法。当事件触发时,CallbackManager 将在每个处理程序上调用适当的方法。

class BaseCallbackHandler:"""Base callback handler that can be used to handle callbacks from langchain."""def on_llm_start(self, serialized: Dict[str, Any], prompts: List[str], **kwargs: Any) -> Any:"""Run when LLM starts running."""def on_chat_model_start(self, serialized: Dict[str, Any], messages: List[List[BaseMessage]], **kwargs: Any) -> Any:"""Run when Chat Model starts running."""def on_llm_new_token(self, token: str, **kwargs: Any) -> Any:"""Run on new LLM token. Only available when streaming is enabled."""def on_llm_end(self, response: LLMResult, **kwargs: Any) -> Any:"""Run when LLM ends running."""def on_llm_error(self, error: Union[Exception, KeyboardInterrupt], **kwargs: Any) -> Any:"""Run when LLM errors."""def on_chain_start(self, serialized: Dict[str, Any], inputs: Dict[str, Any], **kwargs: Any) -> Any:"""Run when chain starts running."""def on_chain_end(self, outputs: Dict[str, Any], **kwargs: Any) -> Any:"""Run when chain ends running."""def on_chain_error(self, error: Union[Exception, KeyboardInterrupt], **kwargs: Any) -> Any:"""Run when chain errors."""def on_tool_start(self, serialized: Dict[str, Any], input_str: str, **kwargs: Any) -> Any:"""Run when tool starts running."""def on_tool_end(self, output: str, **kwargs: Any) -> Any:"""Run when tool ends running."""def on_tool_error(self, error: Union[Exception, KeyboardInterrupt], **kwargs: Any) -> Any:"""Run when tool errors."""def on_text(self, text: str, **kwargs: Any) -> Any:"""Run on arbitrary text."""def on_agent_action(self, action: AgentAction, **kwargs: Any) -> Any:"""Run on agent action."""def on_agent_finish(self, finish: AgentFinish, **kwargs: Any) -> Any:"""Run on agent end."""

LangChain提供了一些内置处理程序,供开发者快速开始使用。这些处理程序位于 langchain/callbacks 模块中。最基本的处理程序是 StdOutCallbackHandler,它简单地将所有事件记录到标准输出(stdout)。

注意:当对象的 verbose 标志设置为 true 时,即使未显式传入,StdOutCallbackHandler 也会被调用。

from langchain.callbacks import StdOutCallbackHandler
from langchain.chains import LLMChain
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplatehandler = StdOutCallbackHandler()
llm = OpenAI()
prompt = PromptTemplate.from_template("1 + {number} = ")# Constructor callback: First, let's explicitly set the StdOutCallbackHandler when initializing our chain
chain = LLMChain(llm=llm, prompt=prompt, callbacks=[handler])
chain.run(number=2)# Use verbose flag: Then, let's use the `verbose` flag to achieve the same result
chain = LLMChain(llm=llm, prompt=prompt, verbose=True)
chain.run(number=2)# Request callbacks: Finally, let's use the request `callbacks` to achieve the same result
chain = LLMChain(llm=llm, prompt=prompt)
chain.run(number=2, callbacks=[handler])

结果如下:

    > Entering new LLMChain chain...Prompt after formatting:1 + 2 => Finished chain.> Entering new LLMChain chain...Prompt after formatting:1 + 2 => Finished chain.> Entering new LLMChain chain...Prompt after formatting:1 + 2 => Finished chain.'\n\n3'

3.快速使用

3.1 环境设置

使用LangChain通常需要与一个或多个模型提供商、数据存储、API等进行集成。在本示例中,我们将使用OpenAI的模型API。

首先,我们需要安装他们的Python包:

pip install langchain
pip install openai

在初始化OpenAI LLM类时直接通过名为 openai_api_key 的参数传递密钥:

from langchain.llms import OpenAIllm = OpenAI(openai_api_key="...")

3.2 LLM

在LangChain中有两种类型的语言模型,分别被称为:

  • LLMs:这是一个以字符串作为输入并返回字符串的语言模型。
  • ChatModels:这是一个以消息列表作为输入并返回消息的语言模型。

LLMs的输入/输出简单易懂 - 字符串。但ChatModels呢?那里的输入是一个ChatMessages列表,输出是一个单独的ChatMessage。ChatMessage有两个必需的组成部分:

  • content:这是消息的内容。
  • role:这是产生ChatMessage的实体的角色。

LangChain提供了几个对象来轻松区分不同的角色:

  • HumanMessage:来自人类/用户的ChatMessage。
  • AIMessage:来自AI/助手的ChatMessage。
  • SystemMessage:来自系统的ChatMessage。
  • FunctionMessage:来自函数调用的ChatMessage。

如果这些角色都不合适,还有一个ChatMessage类,可以手动指定角色。

LangChain提供了标准接口,但了解这种差异有助于构建特定语言模型的提示。LangChain提供的标准接口有两种方法:

  • predict:接受一个字符串,返回一个字符串。
  • predict_messages:接受一个消息列表,返回一个消息。
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAIllm = OpenAI()
chat_model = ChatOpenAI()llm.predict("hi!")
>>> "Hi"chat_model.predict("hi!")
>>> "Hi"

OpenAI 和 ChatOpenAI 对象基本上只是配置对象。开发者可以使用诸如 temperature 等参数来初始化它们,并在各处传递它们。

接下来,让我们使用 predict 方法来处理一个字符串输入。

text = "What would be a good company name for a company that makes colorful socks?"llm.predict(text)
# >> Feetful of Funchat_model.predict(text)
# >> Socks O'Color

最后,让我们使用 predict_messages 方法来处理一个消息列表。

from langchain.schema import HumanMessagetext = "What would be a good company name for a company that makes colorful socks?"
messages = [HumanMessage(content=text)]llm.predict_messages(messages)
# >> Feetful of Funchat_model.predict_messages(messages)
# >> Socks O'Color

3.3 Prompt 模版

PromptTemplates也可以用于生成消息列表。在这种情况下,提示不仅包含有关内容的信息,还包含每条消息的信息(其角色、在列表中的位置等)。在这里,最常见的情况是ChatPromptTemplate是ChatMessageTemplate列表。每个ChatMessageTemplate包含了如何格式化ChatMessage的指令 - 其角色以及内容。

from langchain.prompts.chat import ChatPromptTemplatetemplate = "You are a helpful assistant that translates {input_language} to {output_language}."
human_template = "{text}"chat_prompt = ChatPromptTemplate.from_messages([("system", template),("human", human_template),
])chat_prompt.format_messages(input_language="English", output_language="French", text="I love programming.")

3.3 Output parsers

OutputParsers 将LLM的原始输出转换为可在下游使用的格式。其中主要的OutputParsers类型包括:

  • 将LLM的文本转换为结构化信息(例如 JSON)
  • 将 ChatMessage 转换为纯字符串
  • 将调用返回的除消息外的额外信息(例如 OpenAI 函数调用)转换为字符串。
from langchain.schema import BaseOutputParserclass CommaSeparatedListOutputParser(BaseOutputParser):"""Parse the output of an LLM call to a comma-separated list."""def parse(self, text: str):"""Parse the output of an LLM call."""return text.strip().split(", ")CommaSeparatedListOutputParser().parse("hi, bye")
# >> ['hi', 'bye']

3.4 PromptTemplate + LLM + OutputParser

我们现在可以将所有这些组合成一个链条。该链条将接收输入变量,将其传递到提示模板以创建提示,将提示传递给语言模型,然后通过(可选的)输出解析器传递输出。这是打包模块化逻辑的便捷方式。

from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import ChatPromptTemplate
from langchain.schema import BaseOutputParserclass CommaSeparatedListOutputParser(BaseOutputParser):"""Parse the output of an LLM call to a comma-separated list."""def parse(self, text: str):"""Parse the output of an LLM call."""return text.strip().split(", ")template = """You are a helpful assistant who generates comma separated lists.
A user will pass in a category, and you should generate 5 objects in that category in a comma separated list.
ONLY return a comma separated list, and nothing more."""
human_template = "{text}"chat_prompt = ChatPromptTemplate.from_messages([("system", template),("human", human_template),
])
chain = chat_prompt | ChatOpenAI() | CommaSeparatedListOutputParser()
chain.invoke({"text": "colors"})
# >> ['red', 'blue', 'green', 'yellow', 'orange']

请注意,我们使用 | 符号将这些组件连接在一起。这种 | 符号称为 LangChain 表达语言。

如何系统的去学习AI大模型LLM ?

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的 AI大模型资料 包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来

😝有需要的小伙伴,可以V扫描下方二维码免费领取🆓

在这里插入图片描述

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

在这里插入图片描述

四、AI大模型商业化落地方案

img

阶段1:AI大模型时代的基础理解

  • 目标:了解AI大模型的基本概念、发展历程和核心原理。
  • 内容
    • L1.1 人工智能简述与大模型起源
    • L1.2 大模型与通用人工智能
    • L1.3 GPT模型的发展历程
    • L1.4 模型工程
      - L1.4.1 知识大模型
      - L1.4.2 生产大模型
      - L1.4.3 模型工程方法论
      - L1.4.4 模型工程实践
    • L1.5 GPT应用案例

阶段2:AI大模型API应用开发工程

  • 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。
  • 内容
    • L2.1 API接口
      - L2.1.1 OpenAI API接口
      - L2.1.2 Python接口接入
      - L2.1.3 BOT工具类框架
      - L2.1.4 代码示例
    • L2.2 Prompt框架
      - L2.2.1 什么是Prompt
      - L2.2.2 Prompt框架应用现状
      - L2.2.3 基于GPTAS的Prompt框架
      - L2.2.4 Prompt框架与Thought
      - L2.2.5 Prompt框架与提示词
    • L2.3 流水线工程
      - L2.3.1 流水线工程的概念
      - L2.3.2 流水线工程的优点
      - L2.3.3 流水线工程的应用
    • L2.4 总结与展望

阶段3:AI大模型应用架构实践

  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。
  • 内容
    • L3.1 Agent模型框架
      - L3.1.1 Agent模型框架的设计理念
      - L3.1.2 Agent模型框架的核心组件
      - L3.1.3 Agent模型框架的实现细节
    • L3.2 MetaGPT
      - L3.2.1 MetaGPT的基本概念
      - L3.2.2 MetaGPT的工作原理
      - L3.2.3 MetaGPT的应用场景
    • L3.3 ChatGLM
      - L3.3.1 ChatGLM的特点
      - L3.3.2 ChatGLM的开发环境
      - L3.3.3 ChatGLM的使用示例
    • L3.4 LLAMA
      - L3.4.1 LLAMA的特点
      - L3.4.2 LLAMA的开发环境
      - L3.4.3 LLAMA的使用示例
    • L3.5 其他大模型介绍

阶段4:AI大模型私有化部署

  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。
  • 内容
    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景

学习计划:

  • 阶段1:1-2个月,建立AI大模型的基础知识体系。
  • 阶段2:2-3个月,专注于API应用开发能力的提升。
  • 阶段3:3-4个月,深入实践AI大模型的应用架构和私有化部署。
  • 阶段4:4-5个月,专注于高级模型的应用和部署。
这份完整版的大模型 LLM 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓

在这里插入图片描述

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

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

相关文章

电子元器件基础知识总结

1.0 电阻 电阻的定义:导体对电流的阻碍作用称之为电阻【每一种导体都有内阻的存在】 闭合的电路中电子的移动输出有多快?电子在导体中的移动速度是很慢的 【铜线中电流的移动速度】 电子受到原子核的束缚,移动的速度很慢,在电压足…

WPS图片无法居中、居中按钮无法点击(是灰色的)

在PPT中复制对象到WPS word中后,导致图片一直靠左,而无法居中 直接选中图片是错误的: 这时你会发现居中按钮无法点击(是灰色的) 正确的是选中图片的前面的部分,然后点击居中,或者Ctrl E

【网络安全】第4讲 身份认证技术(笔记)

一、身份认证技术概述 1、身份认证 是网络安全的第一道防线。是最基本的安全服务,其他的安全服务都依赖于它。在物联网应用系统中,身份认证也是整个物联网应用层信息安全体系的基础。 2、基本身份认证技术 (1)双方认证 是一种双…

收银系统源码-营销活动-幸运抽奖

1. 功能描述 营运抽奖:智慧新零售收银系统,线上商城营销插件,商户/门店在小程序商城上设置抽奖活动,中奖人员可内定; 2.适用场景 新店开业、门店周年庆、节假日等特定时间促销;会员拉新,需会…

亚信安全:《2024云安全技术发展白皮书》

标签 云计算 安全威胁 云安全技术 网络攻击 数据保护 一句话总结 《云安全技术发展白皮书》全面分析了云计算安全威胁的演进,探讨了云安全技术的发展历程、当前应用和未来趋势,强调了构建全面云安全防护体系的重要性。 摘要 云安全威胁演进&#xff…

Android14之获取包名/类名/服务名(二百二十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

Python酷库之旅-第三方库Pandas(003)

目录 一、用法精讲 4、pandas.read_csv函数 4-1、语法 4-2、参数 4-3、功能 4-4、返回值 4-5、说明 4-6、用法 4-6-1、创建csv文件 4-6-2、代码示例 4-6-3、结果输出 二、推荐阅读 1、Python筑基之旅 2、Python函数之旅 3、Python算法之旅 4、Python魔法之旅 …

react 项目中预防xss攻击的插件 dompurify

一、安装 $ yarn add dompurify $ yarn add --dev types/dompurify 二、使用 import DOMPurify from dompurify;// 1、处理: DOMPurify.sanitize(htmlContent)// 2、之后放进 dangerouslySetInnerHTML dangerouslySetInnerHTML{{ __html: cleanHTML }} 如&#…

nftables(1)基本原理

简介 nftables 是 Linux 内核中用于数据包分类的现代框架,用来替代旧的 iptables(包括 ip6tables, arptables, ebtables 等,统称为 xtables)架构。nftables 提供了更强大、更灵活以及更易于管理的规则集配置方式,使得…

没有网络安全就没有信息的未来!

👇👇👇 如果你也想学习:黑客&网络安全的零基础攻防教程 今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。 在这里领取: 这个是我花了几天几夜自整理的最新最全…

CFS三层内网渗透——外网打点(一)

目录 外网打点 先爆破一下看看有没有啥可进攻路径 尝试那个可疑的路径发现是thinkphp这个框架,同时也知道了版本,那就nday打吧 写入php ​编辑写入php成功,简简单单nday拿下​编辑 蚁剑rce尝试链接 打点成功 外网打点 先爆破一下看看有…

Windows 上帝模式是什么?开启之后有什么用处?

Windows 上帝模式是什么 什么是上帝模式?Windows 上帝模式(God Mode)是一个隐藏的文件夹,通过启用它,用户可以在一个界面中访问操作系统的所有管理工具和设置选项。这个功能最早出现在 Windows Vista 中,并…

七月开刷|50天吃透660+880‼️

现在只刷一本题集根本不够 去做做24年的考研真题卷就什么都明白了,24年的卷子就是典型的知识点多,杂,计算量大。 而现在市面上的任何一本题集,都无法做到包含所有的知识点,毕竟版面有限! 所以&#xff0…

HY Lisp 读取宏(reader macro)学习

在学习HY lisp语言的时候HY编程快速入门实践课第三章 HY宏入门-CSDN博客,学习到了读取宏(reader macro),尝试将其概念弄明白。 首先,读取宏是Lisp语言中都有的一种概念,所以可以通过任意一种Lisp语言的文档…

完全理解C语言函数

文章目录 1.函数是什么2.C语言中的函数分类2.1 库函数2.1.1 如何使用库函数 2.2自定义函数 3.函数的参数3.1 实际参数(实参)3.2 形式参数(形参) 4.函数调用4.1传值调用4.2 传址调用4.3 练习 5.函数的嵌套调用和链式访问5.1 嵌套调…

【总线】AXI4第八课时:介绍AXI的 “原子访问“ :独占访问(Exclusive Access)和锁定访问(Locked Access)

大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣,那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者,AXI4以其高性能和高度可扩展性,成为了现代电子系统中不可或缺的通信桥梁…

spring mvc学习

第四章 Spring MVC 第一节 Spring MVC 简介 1. Spring MVC SpringMVC是一个Java 开源框架, 是Spring Framework生态中的一个独立模块,它基于 Spring 实现了Web MVC(数据、业务与展现)设计模式的请求驱动类型的轻量级Web框架&am…

T100-XG查询报表的开发

制作XG报表 1、注册程序 azzi900 首先现将程序注册一下,在内部构建基础代码档。 2、注册作业 azzi910 也是直接新增一个,作业跟程序绑定一下。 3、T100签出规格程序 这个时候应该是没签出的,首先将规格迁出。 4、T100画面产生器 规格迁出之后,这个时候还需要生成一个画…

小型气象站在现代农业中的应用与前景

随着科技的飞速发展,智慧农业已成为现代农业发展的重要趋势。在这一背景下,小型气象站作为智慧农业的重要组成部分,正逐渐展现出其独特的价值和广阔的应用前景。本文将从小型气象站的定义、功能、应用案例以及未来展望等方面,探讨…

数据库数据修改和删除操作详解

目录 🎃摘要 1. 数据库数据修改概述 2. 数据更新操作 2.1MySQL数据更新示例 3. 数据删除概述 4.使用DELETE进行数据删除 4.1 DELETE的基本语法 4.2 DELETE的使用场景 4.3 DELETE示例 5. 使用TRUNCATE进行数据删除 5.1 TRUNCATE的基本语法 5.2 TRUNCATE的…