当前位置: 首页 > news >正文

与本地电脑PDF文档对话的PDF问答程序

文章目录

    • PDF问答程序
      • 程序流程
      • 处理PDF文档
      • 创建问答链

    在探索和学习新技术时,了解LangChain框架的理论知识固然重要,但实际的案例分析与实践尝试能为你提供更加直观的认识和更深人的理解。本文主要以解析案例代码为主。通过具体的实践操作,你可以更好地理解LangChain技术的本质,了解各个模块如何协同工作,以及如何在实际应用中发挥其价值。

    值得注意的是,介绍这些案例代码主要是为了教学和解释,它们可能并不适用于真实的生产环境。另外,可能在你的电脑环境中运行案例代码后,比如打印文本切分的块数,得到了与案例不一样的数值结果。比如案例中拆分出446个块,而你拆分出448个块。这种差异可能是以下几点原因造成的:

  1. 文档内容存在微小差异,如额外的空白或换行;
  2. 两个环境中库的版本有所不同;
  3. chunk_overlap等参数导致的边界效应;
  4. Python或其他库的版本存在差异。

    相同地,在执行相同的查询代码时,大语言模型可能会给出略有不同的答案。这种现象的背后原理与大语言模型的工作机制有关。大语言模型(如GPT系列)是基于概率的模型,它预测下一个词的可能性是基于训练数据中的统计信息。当模型为生成文本时,它实际上是在每个步骤中做出基于概率的决策,所以,当你在执行案例中的查询代码时可能会得到与案例稍微不同的答案。

PDF问答程序

    PDF问答程序是可以引人外部数据集对大语言模型进行微调,以生成更准确的回答的程序。假设你是一个航天飞机设计师,你需要了解最新的航空材料技术。你可以将几百页的航空材料技术文档输人到大语言模型中,模型会根据最新的数据集给出准确的答案。你不用看完整套材料,而是根据自己的经验提出问题,获得你想要知道的技术知识。PDF问答程序界面中呈现的是人类与文档问答程序的聊天内容,但实质上,人类仍然是在与大语言模型交流,只不过这个模型现在被赋予了接入外部数据集的能力。

    就像你在与一位熟悉公司内部文档的同事交谈,尽管他可能并未参与过这些文档的编写,但他可以准确地回答你的问题。在大语言模型出现之前,人类不能像聊天一样与文档交流,只能依赖于搜索。例如,你正在为一项重要的报告寻找资料,你必须知道你需要查找的关键词,然后在大量的信息中筛选出你需要的部分。而现在,你可以通过聊天的方式一即使你不知道具体的关键词,也可以让模型根据你的问题告诉你答案。你就好像在问一位专业的图书馆员,哪些书可以帮助你完成这份报告。

    为什么要引入文档的外部数据集呢?这是因为大语言模型的训练数据都是在2021年9月之前产生的,之后产生的知识和信息并未被包含进去。大语言模型就像一个生活在过去的时间旅行者,他只能告诉你他离开的那个时刻之前的所有信息,但对之后的信息一无所知。

    引入外部数据集还有一个重要的目的,那就是修复大语言模型的“机器幻觉”,避免给出错误的回答。试想一下,如果你向一个只知道过去的信息的人询问未来的趋势,他可能会基于过去的信息进行推断,但这样的答案未必正确。所以,要引入最新的数据,让大语言模型能够更准确地回答问题,避免因为信息过时产生的误导。

    另外,现在普遍使用的数据文档形式包括PDF、JSON、Word、Excel等,这些都是获取实时知识和数据的途径。同时,这类程序现在非常受欢迎,比如最著名的Chat PDF和ChatDOC,还有针对各种特定领域的程序,如针对法律文档的程序。就像在阅读各种格式的图书一样,不同的程序能够为你提供不同的知识和信息。以上就是选择PDF问答程序作为本章案例的原因。

程序流程

    PDF问答程序的实现方式是利用LangChain已实现的向量存储、嵌入,以及使用查询和检索相关的链来获取外部数据集及处理文档,在进行相关性检索后进行合并处理,将其置入大语言模型的提示模板中,实现与PDF文件交流的目的。这里选定的文档是Reid Hoffman写的一本关于GPT-4和人工智能的书,下载这份PDF文档并将其转换为可查询和交互的形式。连接这个PDF文档数据使用的是LEDVR工作流管理,最后使用内置的RetrievalQA问答链和load_qa_chain方法构造文档链组件,并且使用不同的文档合并链Stuf和Map re-rank对比答案的质量。

LEDVR工作流

  • L:加载器。首先,选择的文档是Reid Hoffman写的一本关于GPT-4和人工智能的书。为了使用户与这个PDF问答程序能够进行互动回答和查询,首先需要通过加载器从本地获取这份数据。加载器提供了从各种来源获取数据的通道,并为后续步骤做好准备。
  • E:嵌入模型包装器。接下来,需要处理这份PDF文档的内容。通过嵌入模型包装器,将文档中的每一段文字转换为一个高维向量。这一步的目的是实例化一个嵌入模型包装器对象,方便后续将向量传递给向量存储库。
  • D:文档转换器。这个环节主要是切分文本,转换文档对象格式。如果文档过长,则文档转换器可以将其切分成更小的段落。
  • V:向量存储库。将LED的成果都交给向量存储库,在实例化嵌入模型包装器对象时,将切分后的文档转换为向量列表。处理好的向量将被存储在向量存储库中。这是一个专为高维向量设计的存储系统,它允许快速地查找和检索向量,为后续的查询提供了极大的便利。
  • R:检索器。最后,当用户想要查询某个特定的信息时,检索器就会进入工作状态。检索器会将用户的查询问题转换为一个嵌入向量,并在向量存储库中寻找与之最匹配的文档向量。在找到最相关的文档后,检索器会返回文档的内容,满足用户的查询需求。

    创建链采用RetrievalQA内置的问答链结合load_qa_chain方法可以创建文档链部件,然后通过对比Stuff与Map re-rank这两种不同的合并文档链来评估答案的优劣。

处理PDF文档

    首先安装所需的Python库来为后续的操作打基础。

pip -q install langchain openai tiktoken PyPDF2 faiss-cpu

    这里安装了LangChain、openai、tiktoken、PyPDF2和faiss-cpu这5个库。其中,openai是OpenAI的官方库,能与其API进行交互。tiktoken是用于计算字符串中token数的工具,PyPDF2允许处理PDF文件,而faiss-cpu是一个高效的相似性搜索库。这里为OpenAI设置了API密钥:

import os
os.environ["OPENAI API KEY"]="填人你的密钥"

    首先在本书的代码仓库中下载一个名为impromptu-rh.pdf的文件。这个文件在后续的代码中会被用到,比如进行文本分析。为了从PDF文档中提取内容,需要一个PDF阅读器。这里选择了一个基础的PDF阅读器,但在实际应用中,可能需要根据具体需求选择更复杂或专业的PDF处理库。在处理PDF文档时,可能会遇到格式问题或其他意外情况,因此选择合适的工具和方法是很重要的。不同的项目或数据源可能需要不同的处理方法,这也是为什么有时需要使用更高级的工具或服务,比如AWS、Google Cloud的相关API。为了处理PDF和后续的操作,导人以下库和工具:

from PyPDF2 import PdfReader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import FAISS

    PdfReader是PDF阅读器,它来自PyPDF2库,可用于从PDF文档中读取内容。OpenAIEmbeddings可用于嵌入或转换文本数据。Character TextSplitter可用于处理或切分文本。而FAISS是一个高效的相似性搜索库,后续可用于文本或数据的搜索和匹配。加载之前下载的PDF文档:

doc_reader = PdfReader ('/content/impromptu-rh.pdf')

    通过使用PdfReader,将PDF文档的内容加载到doc reader变量中。这一步的目的是读取PDF文档并为后续的文本提取做准备。为了验证是否成功加载了PDF文档,可以打印doc reader,得到的输出结果是这个对象在内存中的地址:<PyPDF2.reader…PdfReader at Ox’7f119f57f640>,这表明doc reader已经成功创建并包含了PDF文档的内容。紧接着,从PDF文档中提取文本,这部分代码的作用是遍历PDF文档中的每一页,并使用extract text(0方法提取每一页的文本内容,然后将这些文本内容累加到raw text变量中。

raw_text=''
for i,page in enumerate(doc reader.pages):text page.extract_text ()if text:raw_text +=text

    为了验证是否成功地从PDF文档中提取了文本,这里打印了raw_text变量的长度,得到的结果是356710。请注意文本拆分的方法很简单,就是将这个长字符串按照字符数拆分。比如可以设定每1000个字符为一个块,即chunk size=1000。

Splitting up the text into smaller chunks for indexing
text_splitter =CharacterTextSplitter(separator ="\n",chunk size =1000,chunk overlap =200, # striding over the textlength_function= len,)
texts= text_splitter.split_text (raw_text)

    总共切了448个块:

len(texts)448

    在这个代码片段中,chunk overlap参数用于指定文本切分时的重叠量(overlap)。它表示在切分后生成的每个块之间重叠的字符数。具体来说,这个参数表示每个块的前后,两个块之间会有多少个字符是重复的。例如chunkA和chunkB,它们之间有200个字符是重复的。然后,采用滑动窗口的方法来拆分文本。即每个块之间会有部分字符重叠,比如在每1000个字符的块上,让前后两个块有200个字符重叠。可以随机打印一块的内容:

texts [20]

    输出是:

'million registered users.\nIn late January 2023,Microsoft1-which had
invested $1 billion \nin OpenAI in 2019-announced that it would be investing $10
Inbillion more in the company.It soon unveiled a new version of \nits search
engine Bing,with a variation of ChatGPT built into it.\nl I sit on Microsoft's
Board of Directors.10Impromptu:Amplifying Our Humanity Through AI\nBy the start
of February 2023,OpenAI said ChatGPT had \none hundred million monthly active
users,making it the fast-\nest-growing consumer internet app ever.Along with
that \ntorrent of user interest,there were.news stories of the new Bing \nchatbot
functioning in sporadically unusual ways that were \nvery different from how
ChatGPT had generally been engaging \nwith users-including showing "anger,"
hurling insults,beast-\ning on its hacking abilities and capacity for revenge,
and basi-\ncally acting as if it were auditioning for a future episode of Real
\nHousewives:Black Mirror Edition.

    下面介绍如何将提取的文本转换为机器学习可以理解的格式,并且如何使用这些数据进行搜索匹配。为了理解和处理文本,需要将其转换为向量列表。这里选择使用OpenAI的嵌入模型来为文本创建嵌入向量列表。

# Download embeddings from OpenAI
embeddings= OpenAIEmbeddings ()

    为了能够高效地在这些向量中搜索和匹配,这里使用FAISS库。先把文本txts和嵌入模型包装器OpenAIEmbeddings作为参数传递,然后通过FAISS库创建一个向量存储库,以实现高效的文本搜索和匹配功能。

docsearch =FAISS.from texts(texts,embeddings)

    通过上面的代码,将原本的文本内容转换为机器学习可以理解和处理的向量数据。基于文本的向量表示,程序就可以进行高效的搜索和匹配了。相似度检索是其中的一种方法。为了展示如何使用这种方法,下面选择了一个实据。基于文本的向量表示,程序就可以进行高效的搜索和匹配了。相似度检索是其中的一种方法。为了展示如何使用这种方法,下面选择了一个实际中的查询:“GPT-4如何改变了社交媒体?”。

query="GPT-4如何改变了社交媒体?"
docs =docsearch.similarity_search(query)

    将查询传递给similarity_search方法,在向量数据中通过docsearch方法查找与查询最匹配的文档。这种搜索基于向量之间的相似度。得到的搜索结果是一个数组,其中包含了与查询最匹配的文档。

len (docs)

    运行上面的代码,发现结果为4,这意味着有4处文档与查询有关。为了验证搜索的准确性,可以尝试查看第一个匹配的文档。

docs [0]

    在搜索结果中,第一个匹配的文档中多次提到了“社交媒体”(下文中的Social media),这证明了PDF问答程序的查询效果非常好,并且嵌入和相似度搜索的方法都是有效的。

Document (page_content='rected ways that tools like GPT-4 and DALL-E 2
enable.\nThis is a theme I've touched on throughout this travelog,but \nit's
especially relevant in this chapter.From its inception,social \nmedia worked
to recast broadcast media's monolithic and \npassive audiences as interactive,
democratic communities,in \nwhich newly empowered participants could connect
directly \nwith each other.They could project their own voices broadly,\nwith
no editorial "gatekeeping"beyond a given platform's terms \nof service.\nEven
with the rise of recommendation algorithms,social media \nremains a medium where
users have more chance to deter -\nmine their own pathways and experiences than
they do in the \nworld of traditional media.It's a medium where they've come
Into expect a certain level of autonomy,and typically they look for \nnew ways
to expand it.\nSocial media content creators also wear a lot of hats,especially
Anwhen starting out.A new YouTube creator is probably not only',metadata=())

    前面只有一个PDF文档,实现代码也很简单,通过LangChain提供的LEDVR工作流管理,完成得很快。接下来,要处理多文档的提问。在现实中要获取到真实的信息,通常需要跨越多个文档,比如读取金融研报、新闻综合报道等。

创建问答链

    加载一个PDF文档,在将其转换格式及切分字符后,通过创建向量数据来进行搜索匹配并获得了问题的答案。一旦我们有了已经处理好的文档,就可以开始构建一个简单的问答链。下面看一看如何使用LangChain创建问答链。在这个过程中,这里选择了内置的文档处理链中一种被称为suff的链类型。在Suff模式下,将所有相关的文档内容都全部提交给大语言模型处理,在默认情况下,放人的内容应该少于4000个标记。除Stuff链外,文档处理链还有Refine链、MapReduce链、重排链。重排链在后面会用到。

from langchain.chains.question answering import load_ga_chain
from langchain.llms import OpenAI
chain =load_ga_chain (OpenAI(),chain type="stuff")

    下一步,构建查询。首先,使用向量存储中返回的内容作为上下文片段来回答查询。然后,将这个查询传给LLM。LLM会回答这个查询,并给出相应的答案。例如,查询的问题是“这本书是哪些人创作的?”语言模型链将该问题传递给向量存储库进行相似性搜索。向量存储库会返回最相似的4个文档片段doc,通过运行chain.run并传递问题和相似文档片段,然后LLM会给出一个答案。

query="这本书是哪些人创作的?"
docs = docsearch.similarity search(query)
chain.run (input documents=docs,question=query)

    看看LLM回答了什么:

'不知道'

    在默认情况下,系统会返回4个最相关的文档,但可以更改这个数字。例如,可以设置返回6个或更多的搜索结果。

query="这本书是哪些人创作的?"
docs= docsearch.similarity_search(query,k=6)
chain.run(input_documents=docs,question=query)

    然而,需要注意的是,如果设置返回的文档数量过多,比如设置k=20,那么总的标记数可能会超过模型平台的最大上下文长度,导致错误。例如,你使用的模型的最大上下文长度为4096,但如果请求的标记数超过了5000,则系统就会报错。设置返回的文档数量为6,则获取的结果是:

'这本书的作者是Reid Hoffman和Sam Altman。'

    在这种情况下,如果相关文档的内容多一些,则答案会更加准确一些。设置的返回的文档数量越少,意味着大语言模型获取到的相关信息也就越少。之前询问query="这本书是哪些人创作的?"仅仅返回了4条结果,导致它回答了“不知道”。而修改返回的文档数量为6条时,它找出了作者Reid Hoffman。它还提到了Sam Altman,实际上Sam Altman并不是作者。出现这种错误可能是因为使用了低级的模型型号,默认LLM类模型包装器是“text-davinci-003”型号,这个型号的能力远不如GPT-4。

重排链

    Suff链的优势是把所有文档的内容都放在提示词模板中,并不对文档进行细分处理。而重排链则是选择了优化的算法,提高查询的质量。下面提出更复杂的查询。比如说,想要知道“OpenAI的创始人是谁?”并且想要获取前10个最相关的查询结果。在这种情况下,会返回多个答案,而不仅仅是一个。可以看到它不只返回一个答案,而是根据需求返回了每个查询的答案和相应的评分。

from langchain.chains.question_answering import load_qa_chain
chain =load_ga_chain (OpenAI(),chain_type="map_rerank",return_intermediate steps=True)
query="OpenAI的创始人是谁?"
docs =docsearch.similarity search(query,k=10)
results =chain({"input_documents":docs,"question":query},return_only_outputs=True)

    return intermediate steps=True是重要的参数,设置这个参数可以让我们看到map_rerank是如何对检索到的文档进行打分的。下面对返回的每个查询结果进行评分。例如,OpenAI被多次提及,因此它的评分可能会有80分,90分甚至l00分。观察intermediate_steps中的内容,有2个得分为100的答案。

('intermediate steps':[('answer':This document does not answer the question.', 'score':'0'},
('answer':,OpenAI的创始人是Elon Musk,Sam Altman,Greg Brockman和Ilya Sutskever。','score':'100'},
{'answer':This document does not answer the question.''score':'0'),
('answer':'This document does not answer the question.','score':'0'),
('answer':This document does not answer the question.','score':'0'),
('answer':This document does not answer the question','score':'0'),
('answer':'OpenAI的创始人是Elon Musk、Sam Altman、Greg Brockman、Ilya Sutskever、Wojciech Zaremba和Peter Norvig。','score':'100'),
('answer':This document does not answer the question.','score':'0'),
{'answer':This document does not answer the question.','score':'0'),
('answer':This document does not answer the question','score':'0')],'output text':'OpenAI的创始人是Elon Musk,Sam Altman,Greg Brockman和Ilya Sutskever.'}

    在进行评分后,模型输出一个最终的答案:‘score’:‘100’,即得分为100的那个答案:

results['output_text']
'OpenAI的创始人是Elon Musk,Sam Altman,Greg Brockman和Ilya Sutskever。'

    为了搞清楚为什么模型会评分,可以打印提示词模板。

# check the prompt
chain.llm =chain.prompt.template

    从提示词模板内容中可以看出,为了确保大语言模型能够在收到问题后提供准确和有用的答案,LangChain为模型设计了一套详细的提示词模板。该提示词模板描述了如何根据给定的背景信息回答问题,并如何为答案打分。提示词模板开始强调了整体目标:使模型能够根据给定的背景信息提供准确的答案,并为答案打分(第15行代码)。模型需要明白其核心任务:根据给定的背景信息回答问题。如果模型不知道答案,则它应该直接表示不知道,而不是试图编造答案。对于这一点要提醒模型:如果不知道答案,应该直接表示不知道,而不是编造答案(第1行代码)。

    接下来,为模型提供答案和评分的标准格式。对于答案部分,要求模型简洁、明确地回答问题,而对于评分部分,则要求模型为其答案给出一个0-100的分数,用以表示答案的完整性和准确性。这部分明确了答案和评分的格式,并强调了答案的完整性和准确性(第5-6行代码)。通过3个示例,模型可以更好地理解如何根据答案的相关性和准确性为其打分(第7~21行代码)。在示例中强调了答案的完整性和准确性是评分的核心标准。

    最后,为了使模型能够在具体的实践中应用上述提示词模板,这里为模型提供了一个上下文背景和用户输人问题的模板。当模型接到一个问题时,它应使用此模板为问题提供答案和评分(第22~25行代码)。下面是格式化和翻译过后的提示词模板。

1.当你面对以下的背景信息时,如何回答最后的问题是关键。如果不知道答案,则直接说你不知道,不要试图编造答案。
2.除提供答案外,还需要给出一个分数,表示它如何完全回答了用户的问题。请按照以下格式:
3.问题:[qustion]
4.有帮助的答案:[answer]
5.分数:[分数范围为0-100]
6.如何确定分数:更高的分数代表更好的答案,更好的答案能够充分地回应所提出的问题,并提供足够的细节,·如果根据上下文不知道答案,那么分数应该是0,不要过于自信!
7.示例 #1
8.背景:苹果是红色的
9.问题:苹果是什么颜色?
10.有帮助的答案:红色
11.分数:100
12.示例 #2
13.背景:那是夜晚,证人忘了带他的眼镜。他不确定那是一辆跑车还是SUV
14.问题:那辆车是什么类型的?
15.有帮助的答案:跑车或SUV
16.分数:60
17.示例 #3
18.背景:梨要么是红色的,要么是橙色的
19.问题:苹果是什么颜色?
20.有帮助的答案:这个文档没有回答这个问题
21.分数:0
22.开始!
23.背景:{context}
24.问题:{question}
25.有帮助的答案:

RetrievalQA链

    RetrievalQA链是LangChain已经封装好的索引查询问答链。在将其实例化之后,可以直接把问题扔给它,从而简化了很多步骤,并可以获得比较稳定的查询结果。为了创建这样的链,需要一个检索器。可以使用之前设置好的docsearch作为检索器,并且可以设置返回的文档数量为"k":4。

docsearch =FAISS.from texts(texts,embeddings)
from langchain.chains import RetrievalQA
retriever =docsearch.as_retriever(search type="similarity",search kwargs=("k":4))

    将RetrievalQA链的chain_type设置为stuf类型,stuf类型会将搜索到的4个相似文档片段全部提交给LLM。

# create the chain to answer questions
rqa =RetrievalQA.from_chain_type (llm=OpenAI(),chain type="stuff",retriever=retriever,return_source_documents=True)

    设置return_source documents=-True后,当查询“OpenAI是什么”时,不仅会得到一个答案,还会得到源文档source_documents。

query="OpenAI是什么?"
rqa(query)['result']

    查询的结果是:OpenAI是一家技术研究和开发公司,旨在研究人工智能的安全性、可控性和效率。它的主要目标是使智能技术得以广泛使用,以改善人类生活。·如果不需要中间步骤和源文档,只需要最终答案,那么可以直接请求返回结果。设置return_source_documents为False。比如问“GPT-4对创新力有什么影响?”

query="GPT-4对创新力有什么影响?"
rga(query)['result']

    它会直接返回结果,不包括源文档。GPT-4可以加强创作者和创作者的创作能力和生产力,从而提高创新力。它可以帮助他们,例如头脑风暴、编辑、反馈、翻译和营销。此外,GPT-4还可以帮助他们更快地完成任务,从而提高他们的生产效率。它也可以帮助他们更深入地思考,更有创意地思考。

相关文章:

与本地电脑PDF文档对话的PDF问答程序

文章目录 PDF问答程序程序流程处理PDF文档创建问答链 在探索和学习新技术时&#xff0c;了解LangChain框架的理论知识固然重要&#xff0c;但实际的案例分析与实践尝试能为你提供更加直观的认识和更深人的理解。本文主要以解析案例代码为主。通过具体的实践操作&#xff0c;你可…...

什么是uniapi

“UniAPI”有两种不同的含义&#xff0c;具体取决于上下文&#xff1a; 1. uni-app 的 API uni-app 是一个基于 Vue.js 的跨平台应用开发框架&#xff0c;允许开发者编写一套代码并发布到 iOS、Android、Web、以及各种小程序等多个平台。uni-app 的 API 是其核心功能之一&…...

网络运维学习笔记 012网工初级(HCIA-Datacom与CCNA-EI)某机构新增:GRE隧道与EBGP实施

文章目录 GRE隧道&#xff08;通用路由封装&#xff0c;Generic Routing Encapsulation&#xff09;协议号47实验&#xff1a;思科&#xff1a;开始实施&#xff1a; 华为&#xff1a;开始实施&#xff1a; eBGP实施思科&#xff1a;华为&#xff1a; GRE隧道&#xff08;通用路…...

Spring MVC 的核心以及执行流程

Spring MVC的核心 Spring MVC是Spring框架中的一个重要模块&#xff0c;它采用了经典的MVC&#xff08;Model-View-Controller&#xff09;设计模式。 MVC是一种软件架构的思想&#xff0c;它将软件按照模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;…...

vue单据打印 一维码、二维码实现

编码规则与 JavaScript 代码实现 编码规则数组&#xff1a;定义了 Code 128 条形码编码规则数组 BARS&#xff0c;其中每个数字对应一种条形码的线条组合模式。 const BARS [212222,222122,222221,121223,121322,131222,122213,122312,132212,221213,221312,231212,112232,12…...

01数据准备 抓取图片 通过爬虫方式获取bing的关键词搜索图片

为了获取训练所需的图片,我们最常用的手段就是自己去写一个爬虫去获取相关图片。本文将重点围绕如何采用爬虫的方式获取训练所需的图片素材进行讲解,为了大家能够够直观的掌握相关技术,参考本文的相关过程和代码获取自己的数据图片素材,笔者将详细介绍实现过程。 1、确定图…...

智能马达保护器:为工业电机安全运行保驾护航

在工业生产中&#xff0c;电动机作为核心动力设备&#xff0c;其稳定运行直接关系到生产效率与安全性。然而&#xff0c;复杂的工况环境、频繁启停和突发负载变化&#xff0c;常导致电机面临过载、缺相、短路等故障风险。安科瑞智能马达保护器凭借其智能化、高精度、多功能的设…...

Wireshark使用介绍

文章目录 Wireshark介绍Wireshark使用工作模式介绍1. 混杂模式&#xff08;Promiscuous Mode&#xff09;2. 普通模式&#xff08;Normal Mode&#xff09;3. 监视模式&#xff08;Monitor Mode&#xff09; 界面分区捕获过滤器语法基本语法逻辑运算符高级语法使用示例捕获过滤…...

DeepSeek操作Excel,实现图表自动化生成

案例 让DeepSeek操作Excel&#xff0c;实现图表自动化生成。我们只要用自然语言输入我们的需求&#xff08;根据哪块单元格区域做什么图表&#xff09;&#xff0c;就可以直接在Excel中自动生成图表。 操作主界面和图表效果 设置接入方式 这里提供了多种接入方式将DeepSeek接…...

【分布式理论13】分布式存储:数据存储难题与解决之道

文章目录 一、数据存储面临的问题二、RAID磁盘阵列的解决方案1. RAID概述2. RAID使用的技术3. RAID的代表性等级 三、分布式存储的新思路1. 分布式存储背景与特点2. 分布式存储的组成要素 一、数据存储面临的问题 在单机系统时代&#xff0c;当数据量不断增加、硬盘空间不够时…...

C++笔记之标准库中的std::copy 和 std::assign 作用于 std::vector

C++笔记之标准库中的std::copy 和 std::assign 作用于 std::vector code review! 文章目录 C++笔记之标准库中的std::copy 和 std::assign 作用于 std::vector1. `std::copy`1.1.用法1.2.示例2.`std::vector::assign`2.1.用法2.2.示例3.区别总结4.支持assign的容器和不支持ass…...

AWS云从业者认证题库 AWS Cloud Practitioner

题库持续更新&#xff0c;上方二维码查看完整题库&#xff01; 在分担责任模型下&#xff0c;客户对以下哪项负责? A&#xff1a;确保在使用后擦除磁盘驱动器 B&#xff1a;确保在硬件设备上更新固件 C&#xff1a;确保静态数据已加密 D&#xff1a;确保网线为六类或更高类…...

ubuntu20.04重启后不显示共享文件夹

ubuntu20.04重启后不显示共享文件夹 主要参见这两篇博客 Ubuntu重启后不显示共享文件夹_ubuntu 20.04 共享目录无法使用-CSDN博客 ubuntu22.04 配置共享文件夹 找不到/mnt/hgfs_ubuntu安装tools 后mnt文件夹在哪-CSDN博客 重启Ubuntu20.04后&#xff0c;发现共享文件夹进不去…...

C++ 课程设计 汇总(含源码)

C 课程设计 [C课程设计 个人账务管理系统(含源码)](https://arv000.blog.csdn.net/article/details/145601695)[C课程设计 运动会分数统计&#xff08;含源码&#xff09;](https://arv000.blog.csdn.net/article/details/145601819)[C 课程设计打印万年历&#xff08;含源码&a…...

STC 51单片机63——关于STC8H的ADC通道切换问题

使用STC8H时&#xff0c;发现在ADC中断中只能使用一个通道&#xff0c;即使切换了通道&#xff0c;那么数据要不为0&#xff0c;要不就是原先通道的电压。查阅手册&#xff0c;内容并不多&#xff0c;没有发现专门提到的问题。只能去试试&#xff0c;最后发现在ADC中断中&#…...

【前端框架】Vue3 面试题深度解析

本文详细讲解了VUE3相关的面试题&#xff0c;从基础到进阶到高级&#xff0c;分别都有涉及&#xff0c;希望对你有所帮助&#xff01; 基础题目 1. 简述 Vue3 与 Vue2 相比有哪些主要变化&#xff1f; 答案&#xff1a; 响应式系统&#xff1a;Vue2 使用 Object.definePrope…...

数据结构——模拟栈例题B3619

B3619 10 进制转 x 进制 - 洛谷 #include <bits/stdc.h>using namespace std; #define fs first #define sc second #define endl \n #define all(x) x.begin(), x.end() typedef long long ll; typedef pair<int, int> PII;char a[40];void solve(){int n,x;cin&g…...

Web自动化之Selenium 超详细教程(python)

Selenium是一个开源的基于WebDriver实现的自动化测试工具。WebDriver提供了一套完整的API来控制浏览器&#xff0c;模拟用户的各种操作&#xff0c;如点击、输入文本、获取页面元素等。通过Selenium&#xff0c;我们可以编写自动化脚本&#xff0c;实现网页的自动化测试、数据采…...

物联网简介集合

物联网&#xff08;IoT&#xff09;指的是物理设备&#xff08;如电器和车辆&#xff09;之间的互联互通。这些设备嵌入了软件、传感器和连接功能&#xff0c;使其能够相互连接并交换数据。这项技术实现了从庞大的设备网络中收集和共享数据&#xff0c;为打造更高效、自动化的系…...

【设计模式精讲】结构型模式之代理模式(静态代理、JDK动态代理、cglib动态代理)

文章目录 第五章 结构型模式5.1 代理模式5.1.1 代理模式介绍5.1.2 代理模式原理5.1.3 静态代理实现5.1.4 JDK动态代理5.1.4.1 JDK动态代理实现5.1.4.2 类是如何动态生成的5.1.4.3 代理类的调用过程 5.1.5 cglib动态代理5.1.5.1 cglib动态代理实现5.1.5.2 cglib代理流程 5.1.6 代…...

node 使用 Redis 缓存

缓存是什么&#xff1f; 高并发下&#xff0c;一个项目最先出问题的&#xff0c;并不是程序本身&#xff0c;而是数据库最先承受不住。 在数据库上我们可以做很多优化&#xff0c;例如优化 SQL 语句&#xff0c;优化索引&#xff0c;如果数据量大了&#xff0c;还可以分库、分表…...

nginx反向代理负载均衡

反向代理原理&#xff1a; 反向代理服务器架设在服务器端&#xff0c;通过缓冲经常被请求的页面来缓解服务器的工作量&#xff0c;将客户机请求 转发给内部网络上的目标服务器&#xff1b;并将从服务器上得到的结果返回给Internet上请求连接的客户端&#xff0c;此 时代理服务…...

国产编辑器EverEdit - 独门暗器:自动监视剪贴板内容

1 监视剪贴板 1.1 应用场景 如果需要对剪贴板的所有历史进行记录&#xff0c;并进行分析和回顾&#xff0c;则可以使用监视剪贴板功能&#xff0c;不仅在EverEdit中的复制会记录&#xff0c;在其他应用的复制也会记录。 1.2 使用方法 新建一个空文档(重要&#xff1a;防止扰乱…...

AI全栈开发_人工智能AI大模型 Prompt提示词工程详解(全方位介绍及运用)

AI引领的第四次工业革命正席卷而来&#xff0c;如何精准把握这一历史性的机遇&#xff0c;将成为我们这一代人不容忽视且需深入思考与积极行动的重要课题。未来几年AI将会像计算机一样快速普及&#xff0c;面对这一历史性的第一波红利&#xff0c;你是否已准备好把握机遇&#…...

PHP图书借阅小程序源码

&#x1f4da; 图书借阅小程序&#xff1a;一键开启智慧阅读新篇章 &#x1f31f; 这是一款由ThinkPHP与UniApp两大技术巨擘强强联手精心打造的图书借阅微信小程序&#xff0c;它犹如一座随身携带的移动图书馆&#xff0c;让您无论身处何地都能轻松畅游知识的海洋。创新的多书…...

sourcetree gitee 详细使用

SSH 公钥设置 | Gitee 帮助中心 先配置公钥&#xff0c;输入gitee密码完成验证 gitee仓库创建完成 打开sourcetree 如果你本地有项目&#xff08;vite &#xff09;需要 git init 在设置中完成远程仓库的添加 &#xff08;ssh ,https) 直接提交推送&#xff0c;完成后&#xf…...

Hive JOIN过滤条件位置玄学:ON vs WHERE的量子纠缠

Hive JOIN过滤条件位置玄学:ON vs WHERE的量子纠缠 作为数据工程师,Hive JOIN就像吃火锅选蘸料——放错位置味道全变!今天带你破解字节/阿里等大厂高频面试题:ON和WHERE后的过滤条件究竟有什么不同? 一、核心差异对比表 特性ON子句WHERE子句执行时机JOIN操作时JOIN完成后…...

破局与重构:水务企业数字化转型路径探索

随着数字化技术的发展和智慧城市建设进程的推进&#xff0c;水务行业正经历以数据为驱动的深刻变革。本文深入探讨水务行业数字化发展的趋势、水务企业数字化转型的痛点、水务行业标杆企业数字化转型实践以及水务企业数字化转型的方向和路径&#xff0c;为水务企业十五五期间把…...

stm32hal库寻迹+蓝牙智能车(STM32F103C8T6)

简介: 这个小车的芯片是STM32F103C8T6&#xff0c;其他的芯片也可以照猫画虎,基本配置差不多,要注意的就是,管脚复用,管脚的特殊功能,(这点不用担心,hal库每个管脚的功能都会给你罗列,很方便的.)由于我做的比较简单,只是用到了几个简单外设.主要是由带霍尔编码器电机的车模,电机…...

云服务中的“高可用性架构”是怎样的?

在云计算中&#xff0c;“高可用性架构”&#xff08;High Availability Architecture&#xff0c;简称HA架构&#xff09;是指通过设计和配置&#xff0c;使得系统、服务或应用能够在发生硬件故障、软件故障、网络问题等情况下&#xff0c;依然保持正常运行&#xff0c;最大程…...

StableDiffusion+ComfyUI

一、AI、AIGC、AIAgent基本概念 图形生成大模型&#xff1a;StableDiffusion(逼真&#xff0c;开源)、Midjourney(艺术性&#xff0c;商业)、FLUX(复杂场景&#xff0c;开源商业)工作流程构建工具&#xff1a;ComfyUI智能体&#xff1a;COZE、Dify、FastGPTAI视频编辑工具&…...

MATLAB基础学习相关知识

MATLAB安装参考&#xff1a;抖音-记录美好生活 MATLAB基础知识学习参考&#xff1a;【1小时Matlab速成教程-哔哩哔哩】 https://b23.tv/CnvHtO3 第1部分&#xff1a;变量定义和基本运算 生成矩阵&#xff1a; % 生成矩阵% 直接法% ,表示行 ;表示列 a [1,2,3;4,5,6;7,8,9];%…...

设计模式 之 工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)(C++)

文章目录 C 工厂模式引言一、简单工厂模式概念实现步骤示例代码优缺点 二、工厂方法模式概念实现步骤示例代码优缺点 三、抽象工厂模式概念实现步骤示例代码优缺点 C 工厂模式 引言 在 C 编程中&#xff0c;对象的创建是一个常见且基础的操作。然而&#xff0c;当项目规模逐渐…...

windows下docker使用笔记

目录 镜像的配置 镜像的拉取 推荐镜像源列表&#xff08;截至2025年2月测试有效&#xff09; 配置方法 修改容器名字 如何使用卷 创建不同的容器&#xff0c;每个容器中有不同的mysql和java版本&#xff08;不推荐&#xff09; 1. 安装 Docker Desktop&#xff08;Win…...

SQLMesh 系列教程6- 详解 Python 模型

本文将介绍 SQLMesh 的 Python 模型&#xff0c;探讨其定义、优势及在企业业务场景中的应用。SQLMesh 不仅支持 SQL 模型&#xff0c;还允许通过 Python 编写数据模型&#xff0c;提供更高的灵活性和可编程性。我们将通过一个电商平台的实例&#xff0c;展示如何使用 Python 模…...

【时时三省】(C语言基础)用N-S流程图表示算法

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 N-S流程图 既然用基本结构的顺序组合可以表示任何复杂的算法结构&#xff0c;那么&#xff0c;基本结构之间的流程线就是多余的了。1973年&#xff0c;美国学者I.Nassi和B .Shneiderman提出…...

【HarmonyOS Next】鸿蒙监听手机按键

【HarmonyOS Next】鸿蒙监听手机按键 一、前言 应用开发中我们会遇到监听用户实体按键&#xff0c;或者扩展按键的需求。亦或者是在某些场景下&#xff0c;禁止用户按下某些按键的业务需求。 这两种需求&#xff0c;鸿蒙都提供了对应的监听事件进行处理。 onKeyEvent 默认的…...

Unreal5从入门到精通之在编辑器中更新 UserWidgets

前言 在虚幻中创建越来越复杂和灵活的 UserWidget 蓝图时,一个问题是它们在编辑器中的外观与它们在游戏中的最终外观可能有很大不同。 库存面板示例 假设你想创建一个通用的库存显示小部件。我们可以在整个 UI 中使用它,无论我们需要在哪里显示某些内容。 标题,描述所显示…...

Django 5实用指南(五)模板系统

Django5的模板系统是其核心功能之一&#xff0c;允许开发者将动态数据嵌入到HTML模板中&#xff0c;并根据不同的业务需求渲染页面。Django模板系统基于 Django模板语言&#xff08;DTL&#xff09;&#xff0c;它提供了一些强大的功能&#xff0c;如模板标签、过滤器、条件语句…...

游戏引擎学习第114天

打开内容并回顾 目前正在讨论一个非常重要的话题——优化。当代码运行太慢&#xff0c;无法达到所需性能时&#xff0c;我们该怎么办。昨天&#xff0c;我们通过在代码中添加性能计数器&#xff0c;验证了一些性能分析的数据&#xff0c;这些计数器帮助我们了解每个操作需要的…...

Python 赋能 AI:从零实现图像分类

人工智能(AI)热度持续攀升,而 Python 作为 AI 开发的利器,以其简洁易学、生态丰富的特点,成为众多开发者的首选。本文以图像分类为例,带你用 Python 实现一个简单的 AI 模型。 1. 环境准备 首先,我们需要安装一些必要的 Python 库: pip install tensorflow keras nu…...

UE引擎游戏加固方案解析

据VGinsights的报告&#xff0c;近年来UE引擎在过去几年中市场占比显著增长&#xff0c;其中亚洲市场增幅达到了30%&#xff0c;随着UE5的推出和技术的不断进步&#xff0c;UE引擎在独立开发者和移动游戏开发中的应用也在逐步增加。 UE引擎的优势在于强大的画面表现与视觉特效…...

Http升级为Https - 开发/测试服环境

1.应用场景 主要用于开发/测试服环境将http升级为https, 防止前端web(浏览器)出现Mixed Content报错; 2.学习/操作 1.文档阅读 deepseek 问答; 2.整理输出 报错信息: Mixed Content: The page at <URL> was loaded over HTTPS, but requested an insecure XMLHttpRequ…...

SaaS系统租户隔离方案分析:基于域名与请求头的比较

在设计SaaS系统时&#xff0c;租户隔离是非常重要的设计考虑因素。租户隔离的方式决定了系统的可扩展性、安全性和维护性。常见的租户隔离方案包括基于域名和基于**请求头&#xff08;header&#xff09;**的隔离方式。每种方式都有其优缺点&#xff0c;具体选择应根据系统的需…...

调用click.getchar()时Windows PyCharm无法模拟键盘输入

文章目录 问题描述解决方案参考文献 问题描述 调用 click.getchar() 时&#xff0c;Windows PyCharm 无法模拟键盘输入 解决方案 Run → Edit Configurations… → Modify options → Emulate terminal in output console 参考文献 Terminal emulator | PyCharm Documentati…...

科普:“docker”与“docker compose”

一、安装Docker Desktop 安装Docker Desktop&#xff0c;则既安装了Docker&#xff0c;也安装了Docker Compose 从Docker Desktop官方下载页面(https://www.docker.com/products/docker-desktop/)&#xff0c;选择适合Windows系统的版本进行下载安装。 验证&#xff1a; do…...

Windows 快速搭建C++开发环境,安装C++、CMake、QT、Visual Studio、Setup Factory

安装C 简介 Windows 版的 GCC 有三个选择&#xff1a; CygwinMinGWmingw-w64 Cygwin、MinGW 和 mingw-w64 都是在 Windows 操作系统上运行的工具集&#xff0c;用于在 Windows 环境下进行开发和编译。 Cygwin 是一个在 Windows 上运行的开源项目&#xff0c;旨在提供类Uni…...

【分布式理论12】事务协调者高可用:分布式选举算法

文章目录 一、分布式系统中事务协调的问题二、分布式选举算法1. Bully算法2. Raft算法3. ZAB算法 三、小结与比较 一、分布式系统中事务协调的问题 在分布式系统中&#xff0c;常常有多个节点&#xff08;应用&#xff09;共同处理不同的事务和资源。前文 【分布式理论9】分布式…...

GPT2 模型训练

GPT2 预训练模型 基座 专门供给别人使用的。 对中文分词是一个字一个字分&#xff0c;是Bert的分类方法 好处&#xff1a;灵活。 词库可以适应任何文章。 坏处&#xff1a;训练的难度更大。需要增加数据量 中文分词如果按词组分词 好处&#xff1a;需要的数据量小&#…...

蓝桥杯备考:递归初阶

什么是递归&#xff1f; 相信我们已经不陌生了&#xff0c;函数自己调用自己就叫递归 为什么要有递归&#xff1f; 当处理主问题时&#xff0c;遇到子问题&#xff0c;子问题的解决方法和主问题是一样的&#xff0c;这时候我们就要用到递归 解决流程&#xff1a;问题—》相…...