RAG技术的PDF智能问答系统
关键要点
-
系统基于RAG(检索增强生成)技术,允许用户上传PDF并进行智能问答。
-
使用Ollama的deepseek-r1模型和FAISS向量数据库,支持普通对话和基于PDF的问答模式。
-
提供简洁的Web界面,支持文件拖拽上传和多轮对话。
-
研究表明,系统适合处理PDF内容查询,但性能可能因PDF复杂性而异。
系统概述
这个PDF智能问答系统是一个基于RAG技术的工具,旨在帮助用户通过上传PDF文件进行智能交互。它结合了Ollama的deepseek-r1模型和FAISS向量数据库,确保回答基于文档知识,适合学生、专业人士和研究人员快速获取PDF信息。
主要功能
-
PDF处理:支持上传PDF文件,自动分块,并使用FAISS存储内容。
-
问答模式:提供普通对话模式(无PDF)和文档问答模式(有PDF),支持多轮对话。
-
用户界面:简洁的Web界面,支持拖拽上传,实时显示对话,并提供清空和重新生成功能。
技术细节
系统使用LangChain库处理PDF,Gradio构建界面,需安装ollama并确保deepseek-r1模型可用。环境配置包括创建虚拟环境和安装依赖,如langchain、faiss-cpu等。
详细报告
引言
PDF智能问答系统!该系统利用检索增强生成(RAG)技术,根据您上传的PDF文件内容提供准确且上下文相关的回答。通过结合大型语言模型和高效的信息检索能力,我们旨在为您创造一个无缝、智能的文档交互体验。
无论您是学生、专业人士还是研究人员,这个工具都能帮助您快速查找和理解PDF中的信息,无需手动搜索。系统设计用户友好,界面简洁,支持文件拖拽上传和实时对话,适合各种用户群体。
主要功能
PDF文件处理
-
上传和分块:您可以上传任何PDF文件,系统会自动将其分解为可管理的块。这有助于高效索引和检索信息。
-
向量数据库存储:我们使用FAISS(Facebook AI Similarity Search),一个高性能向量数据库,存储这些块的嵌入表示。这确保了当您提问时,能够快速、准确地检索相关信息。
智能问答功能
-
两种操作模式:
-
普通对话模式:当未上传PDF时,系统作为标准聊天机器人运行,使用基础模型回答一般问题。
-
文档问答模式:上传PDF后,系统切换到此模式,从PDF中检索相关信息以回答问题,确保答案具体且准确。
-
-
上下文维护:系统跟踪对话历史,支持多轮对话。这意味着您可以提出后续问题,系统会理解之前的上下文。
用户界面
-
简洁直观:我们的Web界面设计简单,您可以拖放PDF文件上传,聊天窗口支持实时交互。
-
交互控制:提供清空对话历史和重新生成回答的功能,让您掌控对话,确保流畅的用户体验。
工作原理
系统的核心是检索增强生成(RAG)方法。以下是简化后的工作流程:
PDF上传和处理
-
当您上传PDF时,系统使用LangChain库中的
RecursiveCharacterTextSplitter
将其加载并分割为较小的块。 -
每个块使用Ollama的
deepseek-r1
模型嵌入(转换为计算机可理解的数值表示),并存储在FAISS向量数据库中。
问题回答
-
当您提问时,系统首先检查是否上传了PDF。
-
如果上传了PDF,它会使用FAISS向量存储的检索器找到与问题最相关的块。
-
然后,这些相关块和您的提问一起传递给
deepseek-r1
模型,生成基于两者结合的回答。 -
如果未上传PDF,模型会基于其预训练知识回答问题。
研究表明,这种方法在处理文档查询时效果显著,但PDF内容的复杂性(如图表或格式问题)可能影响性能。证据倾向于认为,对于结构化文本,系统表现最佳,但对于复杂文档,可能需要调整分块参数。
开始使用
要开始使用我们的PDF智能问答系统,请按照以下步骤操作:
-
设置环境:
-
创建并激活虚拟环境,如下所示:
conda create --name rag python=3.12 conda activate rag
-
安装所有必要依赖:
pip install langchain faiss-cpu gradio PyMuPDF pip install -U langchain-community
-
安装并运行ollama,确保
deepseek-r1
模型可用。您可以通过ollama list
列出可用模型,并使用ollama pull deepseek-r1
拉取模型。
-
-
运行应用程序:
-
导航到包含源代码的目录。
-
运行创建并启动Gradio界面的脚本。
-
-
访问Web界面:
-
打开浏览器,访问启动Gradio应用时提供的URL(通常为http://127.0.0.1:8888)。
-
上传您的PDF:
-
将PDF文件拖放到指定区域。
-
提出问题:
-
在文本框中输入问题并发送。
-
根据需要与系统交互,使用提供的控件。
-
通过这些步骤,您可以开始探索并受益于我们的智能问答系统。
技术细节
对于技术感兴趣的用户,以下是简要概述:
-
模型:我们使用Ollama的
deepseek-r1
模型,这是一个能够理解和生成类人文本的大型语言模型。 -
嵌入:使用相同的模型为PDF块生成嵌入,确保语义空间的一致性。
-
向量存储:使用FAISS(Facebook AI Similarity Search)进行大规模相似性搜索,这对于快速检索相关信息至关重要。
-
用户界面:使用Gradio(Gradio)构建,这是一个用户友好的机器学习模型Web界面框架。
环境配置
要运行此系统,您需要安装以下内容:
步骤 | 命令/说明 |
---|---|
1. 创建虚拟环境 | conda create --name rag python=3.12 然后 conda activate rag |
2. 安装依赖 | pip install langchain faiss-cpu gradio PyMuPDF 和 pip install -U langchain-community |
3. 安装Ollama | 从官方仓库安装ollama,确保deepseek-r1 模型可用,使用ollama pull deepseek-r1 拉取 |
4. Gradio | 界面使用Gradio构建,已包含在依赖中 |
设置完成后,您可以运行create_chat_interface
函数并启动Gradio应用。
源代码分析
源代码结构化处理PDF处理、问答和Gradio界面。以下是关键函数的概述:
函数名 | 功能描述 |
---|---|
processpdf | 处理PDF加载,分块,创建嵌入,并设置向量存储和检索器 |
combine_docs | 将多个文档块合并为单个字符串,用于上下文 |
ollama_llm | 使用ollama模型基于问题和提供的上下文生成回答 |
rag_chain | 实现RAG管道,检索相关文档并生成回答 |
chat_interface | 管理聊天交互,根据PDF上传决定使用RAG模式或标准模式 |
create_chat_interface | 设置Gradio界面,包括文件上传、聊天显示和用户输入组件 |
通过理解这些组件,您可以欣赏系统如何整合不同技术,提供高效的问答体验。
结论
我们的PDF智能问答系统是一个强大的工具,结合了自然语言处理和信息检索的最新进展。设计目的是使与PDF文档的交互更高效、更具洞察力。我们希望您发现它实用且易用!
关键引用
-
Facebook AI Similarity Search
-
Gradio
完整代码
import gradio as gr from langchain_community.document_loaders import PyMuPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.vectorstores import FAISS from langchain_community.embeddings import OllamaEmbeddings import ollama import re def process_pdf(pdf_bytes):"""处理PDF文件并创建向量存储Args:pdf_bytes: PDF文件的路径Returns:tuple: 文本分割器、向量存储和检索器"""if pdf_bytes is None:return None, None, None# 加载PDF文件loader = PyMuPDFLoader(pdf_bytes)data = loader.load()# 创建文本分割器,设置块大小为500,重叠为100text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=100)chunks = text_splitter.split_documents(data)# 使用Ollama的deepseek-r1模型创建嵌入embeddings = OllamaEmbeddings(model="deepseek-r1:8b")# 将Chroma替换为FAISS向量存储vectorstore = FAISS.from_documents(documents=chunks, embedding=embeddings)# 从向量存储中创建检索器retriever = vectorstore.as_retriever()# # 返回文本分割器、向量存储和检索器return text_splitter, vectorstore, retriever def combine_docs(docs):"""将多个文档合并为单个字符串Args:docs: 文档列表Returns:str: 合并后的文本内容"""return "\n\n".join(doc.page_content for doc in docs) def ollama_llm(question, context, chat_history):"""使用Ollama模型生成回答Args:question: 用户问题context: 相关上下文chat_history: 聊天历史记录Returns:str: 模型生成的回答"""# 构建更清晰的系统提示和用户提示system_prompt = """你是一个专业的AI助手。请基于提供的上下文回答问题。- 回答要简洁明了,避免重复- 如果上下文中没有相关信息,请直接说明- 保持回答的连贯性和逻辑性"""# 只保留最近的3轮对话历史,避免上下文过长recent_history = chat_history[-3:] if len(chat_history) > 3 else chat_historychat_history_text = "\n".join([f"Human: {h}\nAssistant: {a}" for h, a in recent_history])# 构建更结构化的提示模板user_prompt = f"""基于以下信息回答问题:问题:{question}相关上下文:{context}请用中文回答上述问题。回答要简洁准确,避免重复。"""# 调用Ollama模型生成回答response = ollama.chat(model="deepseek-r1:8b",messages=[{"role": "system", "content": system_prompt},{"role": "user", "content": user_prompt}])response_content = response["message"]["content"]# 移除思考过程和可能的重复内容final_answer = re.sub(r"<think>.*?</think>", "", response_content, flags=re.DOTALL).strip()return final_answer def rag_chain(question, text_splitter, vectorstore, retriever, chat_history):"""实现RAG(检索增强生成)链Args:question: 用户问题text_splitter: 文本分割器vectorstore: 向量存储retriever: 检索器chat_history: 聊天历史Returns:str: 生成的回答"""# 减少检索文档数量,提高相关性retrieved_docs = retriever.invoke(question, {"k": 2})# 优化文档合并方式,去除可能的重复内容formatted_content = "\n".join(set(doc.page_content.strip() for doc in retrieved_docs))return ollama_llm(question, formatted_content, chat_history) def chat_interface(message, history, pdf_bytes=None, text_splitter=None, vectorstore=None, retriever=None):"""聊天接口函数,处理用户输入并返回回答Args:message: 用户消息history: 聊天历史pdf_bytes: PDF文件text_splitter: 文本分割器vectorstore: 向量存储retriever: 检索器Returns:str: 生成的回答"""if pdf_bytes is None:# 无PDF文件的普通对话模式response = ollama_llm(message, "", history)else:# 有PDF文件的RAG对话模式response = rag_chain(message, text_splitter, vectorstore, retriever, history)return response def create_chat_interface():"""创建Gradio聊天界面 Returns:gr.Blocks: Gradio界面对象"""# 创建一个用户界面,并应用了一些自定义的CSS样式。with gr.Blocks() as demo:# 定义状态变量用于存储PDF处理相关的对象pdf_state = gr.State(None) # 存储文本分割器对象,用于将PDF文本分割成小块text_splitter_state = gr.State(None) # 存储向量数据库对象,用于存储文本向量vectorstore_state = gr.State(None) # 存储检索器对象,用于检索相关文本片段retriever_state = gr.State(None) with gr.Column(elem_classes="container"):# 创建界面组件with gr.Column(elem_classes="header"):gr.Markdown("# PDF智能问答助手")gr.Markdown("上传PDF文档,开始智能对话") # 文件上传区域with gr.Column(elem_classes="file-upload"):file_output = gr.File(label="上传PDF文件",file_types=[".pdf"],file_count="single")# 处理PDF上传def on_pdf_upload(file):"""处理PDF文件上传Args:file: 上传的文件对象Returns:tuple: 包含处理后的PDF相关对象"""# 如果文件存在if file is not None:# 处理PDF文件,获取文本分割器、向量存储和检索器text_splitter, vectorstore, retriever = process_pdf(file.name)# 返回文件对象和处理后的组件return file, text_splitter, vectorstore, retriever# 如果文件不存在,返回None值return None, None, None, None# 注册文件上传事件处理file_output.upload(# 当文件上传时调用on_pdf_upload函数处理on_pdf_upload, # inputs参数指定输入组件为file_outputinputs=[file_output],# outputs参数指定输出状态变量outputs=[pdf_state, text_splitter_state, vectorstore_state, retriever_state]) # 聊天区域with gr.Column(elem_classes="chat-container"):chatbot = gr.Chatbot(height=500,bubble_full_width=False,show_label=False,avatar_images=None,elem_classes="chatbot")with gr.Row():msg = gr.Textbox(label="输入问题",placeholder="请输入你的问题...",scale=12,container=False)send_btn = gr.Button("发送", scale=1, variant="primary") with gr.Row(elem_classes="button-row"):clear = gr.Button("清空对话", variant="secondary")regenerate = gr.Button("重新生成", variant="secondary") # 发送消息处理函数def respond(message, chat_history, pdf_bytes, text_splitter, vectorstore, retriever):"""处理用户消息并生成回答Args:message: 用户消息chat_history: 聊天历史pdf_bytes: PDF文件text_splitter: 文本分割器vectorstore: 向量存储retriever: 检索器Returns:tuple: (清空的消息框, 更新后的聊天历史)"""# 如果用户消息为空(去除首尾空格后),直接返回空消息和原聊天历史if not message.strip():return "", chat_history# 调用chat_interface函数处理用户消息,生成回复bot_message = chat_interface(message, chat_history, pdf_bytes, text_splitter, vectorstore, retriever)# 将用户消息和模型回复作为一轮对话添加到聊天历史中chat_history.append((message, bot_message))# 返回空消息(清空输入框)和更新后的聊天历史return "", chat_history # 事件处理# 当用户按回车键提交消息时触发msg.submit(respond,[msg, chatbot, pdf_state, text_splitter_state, vectorstore_state, retriever_state],[msg, chatbot])# 当用户点击发送按钮时触发send_btn.click(respond,[msg, chatbot, pdf_state, text_splitter_state, vectorstore_state, retriever_state],[msg, chatbot])# 当用户点击清空按钮时触发# lambda: (None, None) 返回两个None值来清空消息框和对话历史# queue=False 表示不进入队列直接执行clear.click(lambda: (None, None), None, [msg, chatbot], queue=False)# 重新生成按钮功能def regenerate_response(chat_history, pdf_bytes, text_splitter, vectorstore, retriever):"""重新生成最后一条回答Args:chat_history: 聊天历史pdf_bytes: PDF文件text_splitter: 文本分割器vectorstore: 向量存储retriever: 检索器Returns:list: 更新后的聊天历史"""# 如果聊天历史为空,直接返回if not chat_history:return chat_history# 获取最后一条用户消息last_user_message = chat_history[-1][0]# 移除最后一轮对话chat_history = chat_history[:-1] # 使用chat_interface重新生成回答bot_message = chat_interface(last_user_message, # 最后一条用户消息chat_history, # 更新后的聊天历史pdf_bytes, # PDF文件内容text_splitter, # 文本分割器vectorstore, # 向量存储retriever # 检索器)# 将新生成的对话添加到历史中chat_history.append((last_user_message, bot_message))# 返回更新后的聊天历史return chat_history # 为重新生成按钮绑定点击事件# 当点击时调用regenerate_response函数# 输入参数为chatbot等状态# 输出更新chatbot显示regenerate.click(regenerate_response,[chatbot, pdf_state, text_splitter_state, vectorstore_state, retriever_state],[chatbot]) return demo # 启动接口 if __name__ == "__main__":"""主程序入口:启动Gradio界面"""demo = create_chat_interface()demo.launch(server_name="127.0.0.1", server_port=8888,show_api=False,share=False)
相关文章:
RAG技术的PDF智能问答系统
关键要点 系统基于RAG(检索增强生成)技术,允许用户上传PDF并进行智能问答。 使用Ollama的deepseek-r1模型和FAISS向量数据库,支持普通对话和基于PDF的问答模式。 提供简洁的Web界面,支持文件拖拽上传和多轮对话。 研…...
【Java基础-52】Java中URL类的openConnection()方法:原理与应用场景
在Java编程中,java.net.URL类是一个非常重要的类,用于表示统一资源定位符(URL)。通过URL类,我们可以方便地访问网络资源。其中,openConnection()方法是URL类中一个非常强大的方法,它允许我们与U…...
android为第三方提供部分系统接口
文章目录 Settings - 亮灭屏Settings - 恢复出厂设置Settings - 数字锁屏/解锁Settings - 设置系统时间PackageInstaller - 安装/卸载第三方应用摘要:本文对系统模块进行改造,提供广播等形式的接口对外提供无法直接调用的系统级别接口,实现部分功能的集合。如果是广播形式,…...
C#控制台应用程序学习——3.8
一、语言概述 1、平台相关性 C# 主要运行在.NET 平台上。.NET 提供了一个庞大的类库,C# 程序可以方便地调用这些类库来实现各种功能,如文件操作、数据库访问、网络通信等。 2、语法风格 C# 的语法与 C、C 和 Java 有一定的相似性。例如,它使用…...
钣金加工行业数字化转型MES方案
一、 行业痛点:钣金加工行业普遍面临以下挑战: 订单多样化、小批量、定制化需求增多:传统生产模式难以适应快速变化的市场需求。 生产流程复杂、工序繁多:涉及切割、折弯、焊接、表面处理等多个环节,协同效率低。 生产…...
算法-回溯算法总结
回溯与递归的区别 回溯的本质是穷举,回溯一定代表有递归 递归就一直往深处递归就好了,但是回溯还伴随着递归结束之后的”回溯操作“,例如递归中处理的1,在回溯中要-1。 回溯的算法思路 一般都是返回void,参数不能一下子全部想定…...
ORACLE 执行查询语句慢(不走对应索引)
1. 索引未被创建或未正确创建 确保为查询中涉及的列创建了索引。例如,如果你经常需要按column_name列进行查询,确保已经为该列创建了索引,索引创建语句 CREATE INDEX idx_column_name ON table_name(column_name); 2、索引不可用 原因:索引可能被标记为不…...
零售交易流程相关知识(top-down拆解)
引入 关于POS机交易时的后台数据交互 模块之间数据交换,都可以能被窃取或篡改。由此引入加密、解密机制和签名、验签机制 经典的加密、解密机制: 对称加密:DES\ TDES\ AES\ RC4 非对称加密:RSA\ DSA\ ECC 经典的签名、验签…...
在人工智能软件的帮助下学习编程实例
1 引言 本文记录在人工智能软件的帮助下学习一种全新的编程环境的实例,之所以提人工智能软件而不是单指DeepSeek,一方面DeepSeek太火了,经常服务器繁忙,用本机本地部署的最多运行70b模型,又似乎稍差。另一方面也作为一…...
C语言_数据结构总结5:顺序栈
纯C语言代码,不涉及C 想了解链式栈的实现,欢迎查看这篇文章:C语言_数据结构总结6:链式栈-CSDN博客 这里分享插入一下个人觉得很有用的习惯: 1. 就是遇到代码哪里不理解的,你就问豆包,C知道&a…...
c++ 游戏入门指南
在C++游戏开发中,你需要结合高性能编程、图形学、数学和游戏设计等多方面的知识。以下是C++游戏开发的核心步骤、工具和资源整理,帮助你从入门到进阶: 1. 开发环境搭建 编译器:MSVC(Visual Studio)、GCC、Clang。IDE:Visual Studio(Windows)、JetBrains CLion(跨平台…...
npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。
1、在 vscode 终端执行 get-ExecutionPolicy 返回 Restricted 状态是禁止的 返回 RemoteSigned 状态是可正常执行npm命令 2、更改状态 set-ExecutionPolicy RemoteSigned 如果提示需要管理员权限,可加参数运行 Set-ExecutionPolicy -Scope CurrentUser RemoteSi…...
STM32项目分享:智能家居语音系统(ASRPRO版)
目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 PCB图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: STM32智能家居语音系统(ASRPRO版&am…...
vue2实现组件库的自动按需引入,unplugin-auto-import,unplugin-vue-components
1.使用ant-design-vue或者element-ui时,如何每个组件都去import导入组件,大大降低了开发效率,如果全局一次性注册会增加项目体积,那么如何实现既不局部引入,也不全局注册? 2.在element-plus官网看到有说明…...
前端安全面试题汇总及参考答案
目录 简述 XSS 攻击的原理及三种常见类型(存储型、反射型、DOM 型) 如何在前端防御 XSS 攻击?列举编码、过滤、CSP 策略的具体实现方式 富文本编辑器场景下如何安全处理用户输入的 HTML 内容? 如何通过 HttpOnly 属性增强 Cookie 安全性?它与 XSS 防御的关系是什么? …...
《打造视频同步字幕播放网页:从0到1的技术指南》
《打造视频同步字幕播放网页:从0到1的技术指南》 为什么要制作视频同步字幕播放网页 在数字化信息飞速传播的当下,视频已然成为内容输出与获取的核心载体,其在教育、娱乐、宣传推广等诸多领域发挥着举足轻重的作用 。制作一个视频同步字幕播…...
Redis 篇
一、数据结构 二、持久化方式 Redis 提供了两种主要的持久化方式,分别是 RDB(Redis Database)和 AOF(Append Only File),此外,还可以同时使用这两种方式以增强数据安全性,以下为你…...
STM32常见外设的驱动示例和代码解析
以下是针对STM32常见外设的驱动示例和代码解析,基于HAL库实现,适用于大多数STM32系列(如F1/F4/H7等),可根据具体型号调整引脚和时钟配置。 1. GPIO驱动 应用场景:控制LED、按键检测、继电器开关等。 示例代码: // 初始化LED(推挽输出) void LED_Init(void) {GPIO_In…...
docker-compose Install reranker(fastgpt支持) GPU模式
前言BGE-重新排名器 与 embedding 模型不同,reranker 或 cross-encoder 使用 question 和 document 作为输入,直接输出相似性而不是 embedding。 为了平衡准确性和时间成本,cross-encoder 被广泛用于对其他简单模型检索到的前 k 个文档进行重新排序。 例如,使用 bge 嵌入模…...
【计算机网络入门】应用层
目录 1.网络应用模型 1.1 C/S模型(客户端服务器模型) 1.2 P2P模型(对等模型) 2. DNS系统 2.1 域名 2.2 域名解析流程 3. FTP文件传输协议 4. 电子邮件系统 4.1 SMTP协议 4.2 pop3协议 4.3 IMAP协议 4.4 基于万维网的电…...
/***************************所有笔记汇总目录***************************/
文章分类目录 STM32CubeMX 01、STM32CubeMX——定时器(普通模式和PWM模式) 02、STM32CubeMX——串口(HAL库) 03、STM32CubeMX——(uart_IAP串口)简单示例 04、STM32CubeMX——ADC采集单通道,多通道,内部…...
mysql虚拟列
目录 1. 关于虚拟列 2. 虚拟列分类 3. 虚拟列使用 3.1 创建虚拟列 3.2 为虚拟列添加索引 3.3 验证虚拟列索引是否生效 3.4 删除虚拟列 1. 关于虚拟列 MySQL 5.7 版本引入了虚拟列(也称为生成列)的功能,这是一种在物理表上定义的虚拟列…...
【瞎折腾/ragflow】构建docker镜像并部署使用ragflow
说在前面 操作系统:win11docker desktop版本:4.29.0docker engin版本:v26.0.0ragflow版本:nightly 安装docker 官网 如果是win11,backend建议使用wsl2 安装好后打开docker desktop,不然docker命令用不了 …...
Django模型数据修改:详解两种方式
Django模型数据修改:详解两种方式 在Django框架中,数据模型(Model)定义了应用的数据结构,并提供了与数据库交互的接口。数据的修改是Django开发中的常见操作之一。本文将详细介绍两种在Django中修改数据的方式&#x…...
Gradle 配置 Lombok 项目并发布到私有 Maven 仓库的完整指南
Gradle 配置 Lombok 项目并发布到私有 Maven 仓库的完整指南 在 Java 项目开发中,使用 Lombok 可以极大地减少样板代码(如 getter/setter 方法、构造器等),提高开发效率。然而,当使用 Gradle 构建工具并将项目发布到私…...
docker 常用命令教程
文章目录 docker常用命令教程1. 镜像拉取镜像删除镜像查看镜像列表 2. 容器运行容器启动容器停止容器查看容器设置容器开机自启向容器输入命令 3. 镜像传输提交容器为镜像镜像解压缩登录命令推送远程仓库(需先在主机上登录账号) docker常用命令教程 1. 镜像 拉取镜像 docker…...
机器学习编译
一、机器学习概述 1.1 什么是机器学习编译 将机器学习算法从开发形态通过变换和优化算法使其变成部署形态。即将训练好的机器学习模型应用落地,部署在特定的系统环境之中的过程。 开发形态:开发机器学习模型时使用的形态。Pytorch,TensorFlow等通用框…...
mysql中什么机制保证宕机数据恢复
MySQL 通过多种机制来保证在宕机或意外崩溃时数据的完整性和可恢复性。这些机制主要包括 事务日志、崩溃恢复 和 数据持久化 等。以下是 MySQL 中保证数据恢复的核心机制: 1. 事务日志(Transaction Log) 事务日志是 MySQL 实现数据恢复的核心机制之一,主要包括 Redo Log(…...
使用 display: flex 实现动态布局:每行两个 item,单数时最后一个占满整行
文章目录 使用 display: flex 实现动态布局:每行两个 item,单数时最后一个占满整行 🎯一、需求分析二、实现思路三、代码实现1. HTML 结构2. CSS 样式关键点解析: 四、效果演示HTML 示例:效果: 五、完整代码…...
android 支持自定义布局、线程安全、避免内存泄漏的 Toast 工具类
支持自定义布局:可以灵活地显示自定义样式的 Toast。 线程安全:确保在主线程中显示 Toast,避免崩溃。 避免内存泄漏:使用 ApplicationContext 和取消机制,防止内存泄漏问题。 工具类:作为一个通用的工具…...
密码学系列 - 利用CPU指令加速
CPU擅长的操作: AES 指令, SHA 指令为了充分利用流水线带来的好处,出现了一种叫做RISC的CPU架构。RISC是Reduced Instruction Set Computer(精简指令集)的缩写 SHA加速 Filecoin系列 - 源码分析 - CPU SHA扩展 当前的构造在某些阶段确实涉…...
什么是美颜SDK?从几何变换到深度学习驱动的美颜算法详解
美颜SDK是一种用于处理图像与视频的开发工具,能够提供磨皮、美白、瘦脸、五官优化、动态贴纸等美颜特效。它广泛应用于直播、短视频、社交、在线会议、电商等行业,帮助用户在视频或图片中实现更好的视觉呈现。 一、从几何变换到深度学习:美颜…...
用Deepseek写一个五子棋微信小程序
在当今快节奏的生活中,休闲小游戏成为了许多人放松心情的好选择。五子棋作为一款经典的策略游戏,不仅规则简单,还能锻炼思维。最近,我借助 DeepSeek 的帮助,开发了一款五子棋微信小程序。在这篇文章中,我将…...
FPGA 实验报告:四位全加器与三八译码器仿真实现
目录 安装Quartus软件 四位全加器 全加器、半加器 半加器: 全加器: 四位全加器电路图 创建项目 半加器 全加器 四位全加器 代码实现 半加器 全加器 四位全加器 三八译码器 创建项目 代码展示 modelsim仿真波形图 四位全加器 三八译码…...
Vercel Serverless
1. 引言 现代应用程序是为适应当前技术环境需求而设计的软件,采用现代开发工具和实践,针对云部署和可扩展性优化。它们由多个模块化小组件组成,便于集成和缩放,具有高度的敏捷性和适应性,能快速响应用户或业务需求变化…...
胜软科技冲刺北交所一年多转港股:由盈转亏,毛利率大幅下滑
《港湾商业观察》施子夫 近期,山东胜软科技股份有限公司(以下简称,胜软科技)递表港交所获受理,独家保荐机构为广发证券(香港)。 在赴港上市之前,胜软科技还曾谋求过A股上市&#x…...
JJJ:linux sysfs相关
文章目录 1.sysfs(属性)文件的创建、读、写1.1 创建流程1.2 open流程1.3 read流程 2.补充2.1 sysfs下常见目录介绍2.2 属性相关2.2.1 简介2.2.2 attribute文件的创建 2.3 sysfs目录如何创建的 1.sysfs(属性)文件的创建、读、写 1…...
vue3 遇到babel问题(exports is not defined) 解决方案
由于我在引用ant-design-vue插件,于是产生了下图的问题。 1.问题分析 Babel 是一个 JavaScript 编译器,主要用于:将 ES6 代码转译为 ES5 代码,以兼容旧版浏览器。处理模块化语法(如 import/export)。 2.解…...
《原型链的故事:JavaScript 对象模型的秘密》
原型链(Prototype Chain) 是 JavaScript 中实现继承的核心机制。每个对象都有一个内部属性 [[Prototype]](可以通过 __proto__ 访问),指向其原型对象。每个对象都有一个原型, 原型本身也是一个对象…...
Python怎样安装,Windows/Mac/Linux系统安装教程
Python的安装步骤如下,结合不同操作系统和关键注意事项进行说明: 一、Windows系统安装 下载安装包 访问Python官网,点击“Downloads”选择适合的版本(推荐稳定版,如3.9或3.10,避免最新版可能的不兼容问题&a…...
03.08
1. 数字三角形 题目描述 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。 路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那…...
LeetCode 解题思路 11(Hot 100)
解题思路: 若相等: 直接返回 true。若当前元素大于目标值: 由于列递增,当前列下方所有元素均大于目标值,故排除该列(向左移动)。若当前元素小于目标值: 由于行递增,当前…...
使用websocket,注入依赖service的bean为null
问题:依赖注入失败,service获取不到,提示null 这是参考代码 package com.shier.ws;import cn.hutool.core.date.DateUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.google.gson.Gson; import com.s…...
【数据结构初阶】---堆的实现、堆排序以及文件中的TopK问题
1.树的概念及结构 1.1树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 有一个特殊的结点&…...
【量化策略】均值回归策略
【量化策略】均值回归策略 🚀量化软件开通 🚀量化实战教程 技术背景和应用场景 均值回归策略是一种基于统计学原理的量化交易策略,它假设资产价格会围绕其历史平均水平波动。当价格偏离这个平均水平时,就有可能会回到平均值附…...
设计模式 - 工厂模式 精准梳理精准记忆
1、代码片段 - 带入理解 一、核心模式分类 简单工厂模式(编程习惯,非 GoF 设计模式)工厂方法模式(GoF 创建型模式)抽象工厂模式(GoF 创建型模式) 二、演变过程:咖啡店案例 初始实现…...
WIFI ESP8266以及基础功能介绍
芯片一旦烧写了程序就不可以使用AT指令集,需要重新刷回AT指令库才可以使用 wifi的通信频段是2.4G免费频段。 AT指令 AT(attention)command set.AT指令集或命令集,一般称为AT指令 海斯命令集:Hayes command set 默认…...
面试java做了一道逻辑题,人麻了
题目:给你一个5升水壶,一个6升水壶,去池塘中取水,如何保证最后取出的水是3升? 思考了很久终于想出来了,这里用X5代表5升的桶,X6代表6升的桶: ① 6升桶装满,X50ÿ…...
go语言因为前端跨域导致无法访问到后端解决方案
前端服务8080访问后端8081这端口显示跨域了 ERROR Network Error AxiosError: Network Error at XMLHttpRequest.handleError (webpack-internal:///./node_modules/axios/lib/adapters/xhr.js:116:14) at Axios.request (webpack-internal:///./node_modules/axios/lib/core/A…...
svn删除所有隐藏.svn文件,文件夹脱离svn控制
新建一个文件,取名remove-svn-folders.reg,输入如下内容: Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN] "Delete SVN Folders" [HKEY_LOCAL_MACHINE\SOFTWARE\Class…...