LangChain初学者指南

自从ChatGPT发布以来,大语言模型(LLM)得到极大普及。虽然大多数人没有足够资金和计算资源从头开始训练LLM,但仍然可以基于预训练的LLM来构建一些很酷的东西,例如:

  • 可以根据个人数据与外界互动的个人助理
  • 为特定目的定制的聊天机器人
  • 对文档或代码进行分析或总结

LLM正在改变构建人工智能产品的方式

凭借其奇怪的API和提示工程,LLM正在改变我们构建人工智能产品的方式。这就是为什么出现大量冠以"LLMOps"名义的新开发工具的原因。

其中一个新工具就是LangChain。

什么是LangChain?

LangChain是一个帮助我们轻松构建LLM驱动的应用程序的框架,提供以下功能:

  • 各种不同基础模型的通用接口
  • 帮助管理提示的框架,以及
  • 连接长期内存、外部数据、其他LLM,以及LLM无法处理的任务(例如,计算或搜索)的其他代理的中心化接口。

LangChain是由Harrison Chase创建的开源项目。

因为LangChain有很多不同功能,所以从头开始理解其功能可能会很有挑战性。这就是为什么我们将在本文中介绍LangChain(目前)的六个关键模块,从而帮助读者更好理解它的功能。

前提条件

要继续学习本教程,需要安装langchain Python包并准备好使用所有相关API的密钥。

安装LangChain

在安装langchain包之前,请确保Python版本≥3.8.1且<4.0。

可以通过pip安装langchain包。

bash
复制代码
pip install langchain

本文使用0.0.147版本,由于LangChainb的GitHub非常活跃,因此请确保安装当前版本。

完成所有设置后,导入langchain Python包。

python
复制代码
import langchain
API密钥

基于LLM构建应用需要使用某些服务的API密钥,有些API是收费的。

LLM服务商(必需的) - 首先需要LLM服务商的API密钥。我们目前正在经历"人工智能的Linux时刻",开发人员必须在专有或开源基础模型之间做出选择,而这主要基于性能和成本的权衡。

LLM服务商: 专有和开源基础模型

专有模型是由拥有大型专家团队和大量AI预算的公司拥有的闭源基础模型,通常比开源模型大,因此具有更好的性能,但API开销也更昂贵。专有模型服务商有OpenAI、co:here、AI21 Labs或Anthropic。

大多数LangChain教程都使用OpenAI,但请注意,OpenAI API(用于实验目的并不太贵)不是免费的。要获得OpenAI API Key,需要创建OpenAI帐户,然后在API keys下单击"Create new secret Key"。

python
复制代码
import os
os.environ["OPENAI_API_KEY"] = ... # 设置API_TOKEN

开源模型通常比专有模型更小,功能更少,但比专有模型更具成本效益。开源模型有:

  • BigScience的[BLOOM]huggingface.co/bigscience/…)
  • Meta AI的LLaMA
  • Google的Flan-T5
  • Eleuther AI的GPT-J

许多开源模型被组织和托管在Hugging Face上,要获得Hugging Face API密钥,需要开通Hugging Face帐户并在Access Tokens下创建"New token"。

python
复制代码
import os

os.environ["HUGGINGFACEHUB_API_TOKEN"] = ... # 设置API_TOKEN

可以免费使用Hugging Face的开源LLM,但仅限于性能较差的小型LLM。


个人提示 —— 实话实话,我们当然可以尝试开源模型。我试图在本文里只使用托管在Hugging Face上的开源模型,并提供常规帐户(google/flan-t5-xl和sentence-transformers/all-MiniLM-L6-v2)。大多数示例都没问题,但某些示例实在无法工作。最后,我只能在OpenAI上设置了一个付费帐户,因为大多数LangChain示例似乎都针对OpenAI的API进行了优化。总的来说,为本教程运行几个实验花费了大约1美元。


矢量数据库(可选) —— 如果你想使用某个特定的矢量数据库,如Pinecone, Weaviate,或Milvus,需要注册相应系统以获得API密钥并查看其定价。在本教程中,我们使用Faiss,不需要注册。

工具(可选) —— 取决于你希望LLM与之交互的工具,如OpenWeatherMap或SerpAPI,可能需要注册以获得API密钥并查看其定价。在本教程中,我们只使用不需要API密钥的工具。

能用LangChain做什么?

该包为许多基础模型提供了通用接口,支持提示管理,并充当其他组件(如提示模板、其他LLM、外部数据和通过代理的其他工具)的中心化接口。

在撰写本文时,LangChain(版本0.0.147)涵盖了六个模块:

  • 模型(Models): 从不同LLM和嵌入模型中选择
  • 提示(Prompts): 管理LLM输入
  • 链接(Chains): 将LLM与其他组件相结合
  • 索引(Indexes): 访问外部数据
  • 存储(Memory): 记住以前的对话
  • 代理(Agents): 访问其他工具

下面几节中的代码示例是从LangChain文档中复制和修改的。

模型(Models): 从不同LLM和嵌入模型中选择

目前,许多不同的LLM正在兴起。LangChain提供了对各种模型的集成和简化界面。

LangChain区分了三种输入和输出不同的模型:

  • LLM接受字符串作为输入(提示)并输出字符串(补全)。
python
复制代码
# 专有LLM,例如OpenAI
# pip install openai
from langchain.llms import OpenAI
llm = OpenAI(model_name="text-davinci-003")

# 或者使用托管在Hugging Face上的开源LLM
# pip install huggingface_hub
from langchain import HuggingFaceHub
llm = HuggingFaceHub(repo_id = "google/flan-t5-xl")

# LLM以提示词作为输入并输出补全
prompt = "Alice has a parrot. What animal is Alice's pet?"
completion = llm(prompt)

LLM模型

  • 聊天模型类似于LLM,将聊天消息列表作为输入并返回聊天消息。
  • 文本嵌入模型接受文本输入并返回浮点数(嵌入)列表,浮点数是输入文本的数字表示形式。嵌入有助于从文本中提取信息,这些信息可以稍后使用,例如,用于计算文本之间的相似性(例如,电影摘要)。
python
复制代码
# 专有文本嵌入模型,例如OpenAI
# pip install tiktoken
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()

# 或者使用托管在Hugging Face上的开源文本嵌入模型
# pip install sentence_transformers
from langchain.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(model_name = "sentence-transformers/all-MiniLM-L6-v2")

# 文本嵌入模型以文本作为输入,输出浮点数列表
text = "Alice has a parrot. What animal is Alice's pet?"
text_embedding = embeddings.embed_query(text)

文本嵌入模型

提示(Prompts): 管理LLM输入

LLM的API很奇怪,虽然用自然语言向LLM输入提示感觉很直观,但需要对提示进行相当多的调整,直到从LLM获得所需输出。这个过程被称为提示工程

有了好的提示后,可能希望将其用作其他用途的模板。因此,LangChain提供了所谓的PromptTemplates,帮助我们从多个组件构造提示。

python
复制代码
from langchain import PromptTemplate

template = "What is a good name for a company that makes {product}?"

prompt = PromptTemplate(
    input_variables=["product"],
    template=template,
)

prompt.format(product="colorful socks")

上面的提示可以看作是一个零样本问题设置(zero-shot problem setting) ,我们希望LLM在足够的相关数据上进行了训练,以提供令人满意的响应。

改进LLM输出的另一个技巧是在提示中添加一些示例,使其成为多样本问题设置(few-shot problem setting)

python
复制代码
from langchain import PromptTemplate, FewShotPromptTemplate

examples = [
    {"word": "happy", "antonym": "sad"},
    {"word": "tall", "antonym": "short"},
]

example_template = """
Word: {word}
Antonym: {antonym}\n
"""

example_prompt = PromptTemplate(
    input_variables=["word", "antonym"],
    template=example_template,
)

few_shot_prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    prefix="Give the antonym of every input",
    suffix="Word: {input}\nAntonym:",
    input_variables=["input"],
    example_separator="\n",
)

few_shot_prompt.format(input="big")

以上代码将生成一个提示模板,并根据提供的示例和输入组成以下提示:

vbnet
复制代码
Give the antonym of every input

Word: happy
Antonym: sad

Word: tall
Antonym: short

Word: big
Antonym:
链接(Chains): 将LLM与其他组件相结合

LangChain中的链接简单描述了将LLM与其他组件组合在一起创建应用的过程。例如:

  • 结合LLM和提示模板(参见本节)
  • 通过将第一个LLM的输出作为第二个LLM的输入,顺序组合多个LLM(参见本节)
  • 将LLM与外部数据相结合,例如用于问答(参见索引章节)
  • 将LLM与长期存储相结合,例如用于聊天记录(参见存储章节)

前一节创建了一个提示模板,当我们想在LLM中使用时,可以使用LLMChain,如下所示:

python
复制代码
from langchain.chains import LLMChain

chain = LLMChain(llm = llm, 
                  prompt = prompt)

# 通过输入特定参数执行该链
chain.run("colorful socks")

如果我们想使用第一个LLM的输出作为第二个LLM的输入,可以使用SimpleSequentialChain:

python
复制代码
from langchain.chains import LLMChain, SimpleSequentialChain

# 像前面的代码示例一样定义第一个链
# ...

# 基于提示词模板和LLM创建第二个链
second_prompt = PromptTemplate(
    input_variables=["company_name"],
    template="Write a catchphrase for the following company: {company_name}",
)

chain_two = LLMChain(llm=llm, prompt=second_prompt)

# 结合第一和第二链
overall_chain = SimpleSequentialChain(chains=[chain, chain_two], verbose=True)

# 只指定第一个链的输入并运行该链。
catchphrase = overall_chain.run("colorful socks")

在LangChain中使用PromptTemplates和LLM的SimpleSequentialChain输出

索引(Indexes): 访问外部数据

LLM的一个限制是缺乏上下文信息(例如访问特定文档或电子邮件),可以通过允许LLM访问特定外部数据来解决这个问题。

为此,首先需要使用文档加载器加载外部数据。LangChain为不同类型文档提供了各种加载器,从pdf和电子邮件到网站和YouTube视频不等。

我们从YouTube视频中加载一些外部数据。如果你想加载大型文本文档并使用Text Splitter来拆分,可以参考官方文档。

python
复制代码
# pip install youtube-transcript-api
# pip install pytube

from langchain.document_loaders import YoutubeLoader

loader = YoutubeLoader.from_youtube_url("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
    
documents = loader.load()

现在已经准备好了外部数据作为documents,可以使用矢量数据库(VectorStore) 中的文本嵌入模型对其进行索引。流行的矢量数据库包括Pinecone、Weaviate和Milvus。本文使用Faiss,因为它不需要API密钥。

python
复制代码
# pip install faiss-cpu
from langchain.vectorstores import FAISS

# 创建矢量数据库作为索引
db = FAISS.from_documents(documents, embeddings)

文档(在本例中是视频)现在作为嵌入存储在矢量存储中。

现在可以用这些外部数据做很多事情,我们来做一个带有信息检索器的问答任务:

python
复制代码
from langchain.chains import RetrievalQA

retriever = db.as_retriever()

qa = RetrievalQA.from_chain_type(
    llm=llm, 
    chain_type="stuff", 
    retriever=retriever, 
    return_source_documents=True)

query = "What am I never going to do?"
result = qa({"query": query})

print(result['result'])

RetrievalQA的输出

等等,你是不是被忽悠了?是的,确实是。

存储(Memory): 记住以前的对话

对于像聊天机器人这样的应用来说,能够记住以前的对话至关重要。但默认情况下LLM没有任何长期记忆,除非显式输入聊天记录。

聊天有没有会话记忆的比较

LangChain通过提供几个不同的选项来处理聊天记录,从而解决了这个问题:

  • 保留所有对话,
  • 保留最新的k次对话,
  • 总结对话内容。

本例将使用ConversationChain为应用提供会话存储。

python
复制代码
from langchain import ConversationChain

conversation = ConversationChain(llm=llm, verbose=True)

conversation.predict(input="Alice has a parrot.")

conversation.predict(input="Bob has two cats.")

conversation.predict(input="How many pets do Alice and Bob have?")

这会输出上图中右边的对话。如果没有ConversationChain来保存会话记录,那么会话将看起来像上图中左侧的对话。

代理(Agents): 访问其他工具

LLM有强大的能力,但也有很多限制:缺乏上下文信息(例如训练数据没有覆盖的特定领域知识),信息会快速过时(例如GPT-4是基于2021年9月份之前的数据训练的),以及不擅长数学。

因为LLM可能会对自己无法完成的任务产生幻觉,所以需要使用辅助工具,例如搜索(例如,Google搜索)、计算器(例如,Python REPL或Wolfram Alpha)和查找(例如,Wikipedia)。

此外,需要代理根据LLM的输出决定使用哪些工具来完成任务。

请注意,某些LLM(如google/flan-t5-xl)不适合以下示例,因为它们不遵循对话-反应-描述模板,这就是我在OpenAI上建立付费账户并切换到OpenAI API的原因。

在下面的示例中,代理首先在维基百科上查找巴拉克·奥巴马的出生日期,然后用计算器计算出他在2022年的年龄。

python
复制代码
# pip install wikipedia
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType

tools = load_tools(["wikipedia", "llm-math"], llm=llm)
agent = initialize_agent(tools, 
                         llm, 
                         agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, 
                         verbose=True)


agent.run("When was Barack Obama born? How old was he in 2022?")

LLM代理输出

总结

就在几个月前,我们所有人(或者至少大多数人)都对ChatGPT的功能印象深刻。现在,像LangChain这样的新开发工具使我们能够在几个小时内在笔记本电脑上构建类似的令人印象深刻的原型,这是真正令人兴奋的时刻!

LangChain是一个开源Python库,可以让任何会写代码的人构建LLM驱动的应用程序。该包为许多基础模型提供了通用接口,支持提示管理,并充当其他组件(如提示模板、其他LLM、外部数据以及支持代理的其他工具)的中心化接口。

该库提供了比本文提到的更多特性。以目前的发展速度,这篇文章也可能会很快过时。

在撰写本文时,我注意到库和文档都围绕OpenAI的API。虽然许多例子都使用开源模型google/flan-t5-xl,但我还是切换到了OpenAI API。尽管不是免费的,但本文中的OpenAI API实验只花了大约1美元。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

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

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

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

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

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

相关文章

蚂蚁云科技集团正式发布以正教育大模型,专注因材施教

4月12日,蚂蚁云科技集团成功举办“智以育人、慧正无界——以正教育大模型产品发布会”,该产品致力于智慧教育变革,让因材施教成为可能。 上海科学技术交流中心科技企业服务处处长陈霖博士、中国信通院华东分院院长廖运发、上海市科协常委马慧民博士等出席并致辞;南威软件集团执…

设计模式之大话西游

8年前深究设计模式&#xff0c;现如今再次回锅&#xff5e; 还是大话设计模式 这本书还是可以的 大话西游经典的台词&#xff1a;“曾经有一份真挚的爱情摆在我面前,我没有珍惜,等我失去的时候,我才后悔莫及,人世间最痛苦的事莫过于此。如果上天能够给我一个再来一次的机会,我会…

Java多线程的线程状态和线程池参数

一、线程状态 当线程被创建并启动以后&#xff0c;它既不是一启动就进入了执行状态&#xff0c;也不是一直处于执行状态。线程对象在不同的时期有不同的状态。Java中的线程状态被定义在了java.lang.Thread.State枚举类中&#xff0c;State枚举类的源码如下&#xff1a; publi…

轻量级的Spring Cloud Gateway实践,实现api和websocket转发

当国内大部分都是粘贴复制一些重型框架时&#xff0c;有没有人会想到&#xff0c;我们自己做一个小项目&#xff0c;几个小的Spring boot的项目时&#xff0c;我们是否还需要按部就班的用我们公司中用到的Nacos&#xff0c;这种冗余且调配复杂的组件呢&#xff1f; 不是本人说…

软考报考指南

目录 了解软考 选择报考级别与专业 关注报考时间 完成报名手续 准备考试 参加考试 查询成绩与领取证书 了解软考 官网链接&#xff1a;中国计算机技术职业资格网 软考&#xff0c;即计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff0c;是由国家人…

广州网站建设如何吸引用户眼球

随着互联网技术的发展&#xff0c;现在广州的大多数企业或品牌都会打造高质量的网站&#xff0c;以便更好地宣传&#xff0c;在网站建设过程中&#xff0c;前端网站设计至关重要&#xff0c;主要体现在排版和布局上&#xff0c;高大尚的网站建设并不是将所有模块内容堆放在首页…

中仕公考:教师招聘和事业单位联考的区别

教师招聘考试与事业单位联考作为两种不同的职业资格考试&#xff0c;其在报考条件和考试内容上存在明显的差异&#xff0c;具体内容为大家简要介绍一下&#xff1a; 一、报考条件 1. 教师招聘考试&#xff1a;此类考试的报名通常要求申请者持有相关教师资格证明。对于非师范生…

使用阿里云试用Elasticsearch学习:Search Labs Tutorials 搭建一个flask搜索应用

文档&#xff1a;https://www.elastic.co/search-labs/tutorials/search-tutorial https://github.com/elastic/elasticsearch-labs/tree/main/example-apps/search-tutorial Full-Text Search

酷开系统让用户在方方面面享受科技进步带来的美好体验

电视本身的特性&#xff0c;再有人工智能和全时AI的加持&#xff0c;让搭载了酷开系统的电视有能力成为一个“家庭智慧管控中心”。互联网的存在让大家能更懒地完成事情&#xff0c;满足宅家的愿望&#xff0c;有话说&#xff0c;科技因懒人而进步。打个简单的比方&#xff0c;…

人工智能研究生前置知识—扩展程序库Pandas

人工智能研究生前置知识—扩展程序库Pandas pandas简介 Pandas 的主要数据结构是 Series &#xff08;一维数据&#xff09;与 DataFrame&#xff08;二维数据&#xff09;。Pandas 广泛应用在学术、金融、统计学等各个数据分析领域。 pandas的官网&#xff1a;https://pandas.…

护眼台灯哪个牌子最好,护眼台灯品牌排行榜分享

​护眼台灯哪个牌子最好&#xff1f;尽管一些家长可能对护眼台灯还不甚了解&#xff0c;下面我将介绍这类台灯的几个显著优势&#xff1a;它们专为减少眼睛疲劳和保护视力而设计&#xff0c;提供稳定且柔和的光线&#xff1b;具备灵活的亮度调节功能&#xff0c;适应不同的阅读…

springCloudAlibaba集成seata实战(分布式事物详解)

一、分布式事务 1. 事务介绍 1.1 基础概念 事务&#xff1a;保证我们多个数据库操作的原子性&#xff0c;多个操作要么都成功要么都不成功 事务ACID原则 A&#xff08;Atomic&#xff09;原子性&#xff1a;构成事务的所有操作&#xff0c;要么都执行完成&#xff0c;要么全部…

linux之shell命令

shell基础命令 浏览Linux 文件系统 Linux 系统目录结构 /bin&#xff1a; bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。 /boot&#xff1a; 这里存放的是启动 Linux 时使用的一些核心文件&#xff0c;包括一些连接文件以及镜像文件。 /dev &…

论文略读:Benign Oscillation of Stochastic Gradient Descent with Large Learning Rate

iclr 2024 reviewer评分 368 论文从理论上研究了通过随机梯度下降&#xff08;SGD&#xff09;且采用大学习率训练的神经网络&#xff08;NN&#xff09;的泛化特性论文的发现是&#xff0c;由于SGD的大学习率引起的NN权重的振荡&#xff0c;实际上有利于NN的泛化&#xff0c;…

如何用CRMEB Pro版企业微信功能做私域运营

过去3年&#xff0c;线下实体零售发展坎坷&#xff0c;线上经济趁机扩展&#xff0c;出现了社交电商、私域电商等多种电商类型。其中&#xff0c;私域电商备受关注&#xff0c;众多企业纷纷开始尝试&#xff0c;在广大企业商家做私域运营的过程中&#xff0c;企业微信以其强大的…

病毒繁殖-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第52讲。 病毒繁殖&#xf…

BLE一些概念 (转载)

原文见 https://www.cnblogs.com/wahahahehehe/p/15094324.html 1. 物理信道 低功耗蓝牙的工作频段为2.4GHz&#xff0c;这个唯一一个在所有国家都无需授权的频段。 BLE将2.4GHz频段分为40个RF射频信道&#xff0c;每个信道2M宽度&#xff0c;最低的中心频率为2402MHz&#x…

水库之大坝安全监测系统解决方案

一、系统介绍 水库之大坝安全监测系统主要包括渗流监测系统、流量监测系统、雨量监测系统、沉降监测系统组成。每一个监测系统由监测仪器及自动化数据采集装置&#xff08;内置通信装置、防雷设备&#xff09;、附件&#xff08;电缆、通信线路、电源线路&#xff09;等组成&a…

为什么每个程序员都应经历一次软考?

今天想和大家讨论一个问题&#xff0c;为什么每个程序员都应经历一次软考&#xff1f; 软考是最近几年比较热门的一个国家级考试&#xff0c;但其实80%的人都只是去凑热闹&#xff0c;是去为国家软考办做贡献的。 有因为各种各样的原因直接缺考的&#xff0c;有是为了一些学习以…

java 将 json 数据转为 java 中的对象

一、准备 json 数据 {"name": "mike","age": 17,"gender": 1,"subject": ["math","english"] }二、对应的java对象 package com.demo.controller;import lombok.Data; import java.util.List;Data pu…