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

LLM初识

从零到一:用 Python 和 LLM 构建你的专属本地知识库问答机器人

摘要:

随着大型语言模型(LLM)的兴起,构建智能问答系统变得前所未有的简单。本文将详细介绍如何使用 Python,结合开源的 LLM 和向量数据库技术,一步步搭建一个基于你本地文档的知识库问答机器人。你将学习到从环境准备、文档加载、文本切分、向量化、索引构建到最终实现问答交互的完整流程。本文包含详细的流程图描述、代码片段思路和关键注意事项,帮助你轻松上手。

引言:

在信息爆炸的今天,我们每天都会面对海量的文档和数据。无论是个人学习资料、企业内部规章,还是项目技术文档,如何从中快速、准确地提取所需信息,已成为一个普遍的痛点。传统的关键词搜索方式往往效率低下,难以理解用户的真实意图,尤其是在面对复杂的语义查询时更是捉襟见肘。幸运的是,大型语言模型(LLM)的出现,以其强大的自然语言理解和生成能力,为我们构建更智能、更高效的问答系统提供了全新的途径。本文旨在引导读者,利用 Python 编程语言和当前流行的 LLM 相关技术栈,从零开始构建一个完全基于本地文档的知识库问答机器人。这意味着您的数据无需上传到任何外部云服务,从而最大限度地保障了数据的隐私性和安全性。通过本文,您将掌握构建这样一个实用工具的核心技术和实践方法。

一、核心技术概览

在深入实践之前,我们先来了解一下构建本地知识库问答机器人所涉及的核心技术:

  • 大型语言模型 (LLM): LLM 是基于海量文本数据训练出来的深度学习模型,能够理解和生成人类语言。在我们的问答机器人中,LLM 负责理解用户的问题,并根据从知识库中检索到的相关信息生成连贯、准确的答案。市面上有许多优秀的开源或可通过API访问的LLM,例如 Meta 的 Llama 系列、清华大学的 ChatGLM 系列,以及 OpenAI 的 GPT 系列(尽管GPT通常是API形式,但也有讨论如何在本地环境中更安全地使用其思路)。对于本地部署,选择合适的开源模型至关重要,需要考虑模型大小、性能以及硬件资源。
  • 嵌入 (Embeddings): 计算机不直接理解文本,它们处理的是数字。文本向量化(Embeddings)技术就是将文本(单词、句子或整个文档片段)转换为固定长度的数值向量的过程。这些向量能够捕捉文本的语义信息,语义上相似的文本在向量空间中会更接近。这是实现语义检索的关键,使得我们可以根据问题的语义找到知识库中最相关的内容,而不仅仅是关键词匹配。常用的嵌入模型有 Sentence-Transformers、OpenAI Embeddings 等。
  • 向量数据库 (Vector Database): 当我们拥有大量文本块的向量表示后,就需要一个高效的方式来存储这些向量,并能够快速检索出与给定查询向量最相似的向量。向量数据库专为此类任务设计,它们支持高效的相似性搜索(如余弦相似度、欧氏距离计算)。常见的开源向量数据库有 FAISS (Facebook AI Similarity Search)、ChromaDB、Milvus 和 Weaviate 等。对于小型项目或快速原型验证,FAISS 或 ChromaDB 通常是不错的选择,因为它们相对轻量且易于集成。
  • LangChain (可选但强烈推荐): LangChain 是一个开源框架,旨在简化基于 LLM 的应用程序的开发。它提供了一系列模块化的组件和链(Chains),可以帮助我们轻松地将 LLM、嵌入模型、向量数据库以及其他工具集成起来,构建复杂的应用流程,如文档加载、文本切分、问答链构建等。使用 LangChain 可以大大减少编码工作量,让我们更专注于应用逻辑本身。

二、准备工作

在开始编码之前,请确保您的开发环境已准备就绪:

  • Python 环境: 推荐使用 Python 3.8 或更高版本。您可以使用 virtualenvconda 创建一个独立的虚拟环境,以避免库版本冲突。
  • 必要的库安装: 打开您的终端或命令行工具,使用 pip 安装以下核心库。请注意,某些库(如 torch)的安装可能因您的操作系统和是否使用 GPU 而有所不同,建议参考其官方文档进行安装。
    pip install langchain openai # openai库用于某些嵌入或LLM API,即使本地部署也可能用到其部分组件
    pip install transformers torch # transformers用于加载本地LLM或嵌入模型,torch是其依赖
    pip install sentence-transformers # 流行的嵌入模型库
    pip install faiss-cpu # 或 faiss-gpu (如果你的机器有NVIDIA GPU并配置了CUDA)
    # pip install chromadb # 如果你选择使用ChromaDB
    pip install pypdf python-docx # 用于加载PDF和DOCX文档
    # 根据你实际使用的LLM,可能还需要安装其他特定库,如 accelerate, bitsandbytes 等
    
    Use code with caution.
    Bash
  • 本地 LLM 模型下载 (如果选择本地部署): 如果您计划在本地运行 LLM(而不是使用 API),您需要预先下载模型的权重文件。例如,可以从 Hugging Face Hub (huggingface.co) 上找到许多开源模型。下载模型时要注意其大小和所需的硬件资源。确保您有足够的磁盘空间和内存(对于较大的模型,可能还需要一块性能不错的 GPU)。
  • 准备你的知识库文档: 收集您希望机器人能够回答问题的相关文档。这些文档可以是 .txt, .pdf, .docx 等常见格式。建议将它们放在一个统一的文件夹内,方便后续程序加载。文档内容应清晰、结构化,以便于模型理解和提取信息。对于扫描版的PDF,需要先进行 OCR (Optical Character Recognition) 处理,将其转换为可选中文本。

三、实现流程详解(包含流程图描述)

构建本地知识库问答机器人的核心流程可以概括为以下几个步骤。我们将详细阐述每个步骤的实现思路。

整体流程图描述:

输入问题
无问题或退出
开始
加载本地文档
文档内容提取与切分
文本块向量化 - 生成Embeddings
构建向量索引并存入向量数据库
用户提问
用户问题向量化
在向量数据库中检索相似文本块
整合问题与检索到的上下文信息
调用LLM生成答案
向用户展示答案
结束

Use code with caution.
Mermaid

步骤 1:加载和切分文档

目的: 将原始文档加载到程序中,并将其切分成较小的、语义完整的文本块(chunks)。LLM 通常有输入长度限制,直接将整个长文档喂给模型效果不佳且成本高昂。切分也有助于后续更精确地定位与问题相关的上下文。

实现思路 (使用 LangChain):

  • 使用 DirectoryLoader 可以方便地加载指定目录下所有支持类型的文档。可以配置 glob 参数来指定加载的文件类型(例如 "**/*.pdf" 表示加载所有子目录下的 PDF 文件)。
  • 针对不同文件类型,DirectoryLoader 内部会调用相应的加载器,如 PyPDFLoader 处理 PDF,UnstructuredWordDocumentLoader 处理 DOCX 等。
  • 加载后的文档内容需要进一步切分。RecursiveCharacterTextSplitter 是一个常用的文本分割器,它会尝试按段落、句子等层级进行切分,并可以指定 chunk_size (每个文本块的最大字符数) 和 chunk_overlap (相邻文本块之间的重叠字符数)。设置一定的重叠可以帮助保留文本块之间的上下文联系。

代码片段思路:

from langchain_community.document_loaders import DirectoryLoader, PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter# 加载文档
loader = DirectoryLoader('path/to/your/documents', glob="**/*.pdf", loader_cls=PyPDFLoader)
documents = loader.load()# 初始化文本分割器
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
docs_chunks = text_splitter.split_documents(documents)
# docs_chunks 现在是一个包含多个 Document 对象的列表,每个对象代表一个文本块

Use code with caution.
Python

步骤 2:文本向量化和构建索引

目的: 将切分好的文本块转换为数值向量,并使用向量数据库构建索引,以便快速进行相似性检索。

实现思路 (使用 LangChain 和 FAISS):

  • 选择一个嵌入模型。HuggingFaceEmbeddings 可以加载 Hugging Face Hub 上的各种开源嵌入模型(如 sentence-transformers/all-MiniLM-L6-v2)。
  • 实例化嵌入模型。
  • 使用向量数据库(如 FAISS)的 from_documents 方法,传入切分后的文本块 docs_chunks 和嵌入模型实例,LangChain 会自动完成文本向量化并将向量存入 FAISS 索引中。

代码片段思路:

from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import FAISS# 初始化嵌入模型
model_name = "sentence-transformers/all-MiniLM-L6-v2" # 这是一个轻量级且效果不错的模型
model_kwargs = {'device': 'cpu'} # 如果有GPU可以设置为 'cuda'
encode_kwargs = {'normalize_embeddings': False}
embeddings_model = HuggingFaceEmbeddings(model_name=model_name,model_kwargs=model_kwargs,encode_kwargs=encode_kwargs
)# 使用FAISS从文档块创建向量存储
vector_store = FAISS.from_documents(docs_chunks, embeddings_model)
# 此时,vector_store 就绪,可以进行相似性搜索了
# 你也可以将索引保存到本地,以便后续加载,避免重复构建
# vector_store.save_local("faiss_index_knowledge_base")

Use code with caution.
Python

步骤 3:构建问答链 (QA Chain)

目的: 将 LLM、向量存储(作为检索器 Retriever)整合起来,形成一个可以接收问题、检索相关文档、并生成答案的链条。

实现思路 (使用 LangChain):

  • 加载您选择的 LLM。如果是本地模型,可以使用 HuggingFacePipeline 或其他针对本地模型的加载器。如果是 API 形式,可以使用如 ChatOpenAI 等。这里以一个概念性的本地 LLM 加载为例。
  • 从向量存储 vector_store 创建一个检索器 retriever。检索器负责根据问题从向量数据库中找出最相关的文本块。可以设置检索数量 k
  • 使用 LangChain 的 RetrievalQA 链。它封装了“检索-增强-生成”的逻辑。它会先用检索器获取相关文档,然后将这些文档和用户问题一起传递给 LLM 进行处理。
  • 可以配置 chain_type,常见的有:
    • "stuff": 将所有检索到的文本块直接塞入一个提示中(如果文本总量不超过 LLM 的上下文窗口限制,这是最简单直接的方式)。
    • "map_reduce": 对每个检索到的文本块分别应用 LLM(map 步骤),然后将结果汇总处理(reduce 步骤)。适合处理大量文档或超出上下文窗口的情况。
    • "refine": 依次处理检索到的文本块,逐步优化答案。
    • "map_rerank": 对每个块生成答案并打分,选择最高分的答案。

代码片段思路:

from langchain.chains import RetrievalQA
# 假设你已经有了一个加载好的本地LLM实例,名为 llm
# from langchain_community.llms import CTransformers # 一个加载GGUF等格式本地模型的例子
# llm = CTransformers(model="path/to/your/local/llm.gguf", model_type="llama")# 或者,为了演示,我们使用一个占位的假 LLM,实际中应替换为真实模型
from langchain_community.llms.fake import FakeListLLM
# responses = ["I'm sorry, I don't know the answer to that based on the provided context."] * 10
# llm = FakeListLLM(responses=responses) # 确保替换为真实的LLM# 创建检索器
retriever = vector_store.as_retriever(search_kwargs={"k": 3}) # 检索最相关的3个文本块# 创建RetrievalQA链
# qa_chain = RetrievalQA.from_chain_type(
#     llm=llm,
#     chain_type="stuff", # 或 "map_reduce", "refine" 等
#     retriever=retriever,
#     return_source_documents=True # 可选,是否返回源文档块
# )# 注意:实际运行需要一个可用的llm实例。上述FakeListLLM仅为占位。
# 由于直接运行LLM的复杂性(模型下载、配置),这里只提供框架。
# 请确保你有一个配置正确的LLM实例。
print("提醒:请确保您已正确配置并加载了LLM实例,上述代码中llm部分需要替换为实际的LLM加载代码。")

Use code with caution.
Python

重要提示: 上述代码中 llm 的实例化是关键且依赖于具体环境。你需要根据你选择的本地 LLM 类型(如 GGUF, GGML 格式,或 Hugging Face Transformers 支持的模型)和 LangChain 提供的相应加载器(如 CTransformers, HuggingFacePipeline, LlamaCpp 等)来正确加载模型。这通常是整个流程中对硬件资源要求最高、配置也相对复杂的一步。

步骤 4:进行提问和获取答案

目的: 向构建好的 QA 链输入用户的问题,并获取 LLM 生成的答案。

实现思路:

  • 直接调用 QA 链的 invoke (或旧版 __call__run) 方法,传入用户的问题字符串。
  • 链会返回一个包含答案(通常在 'result' 键中)和可能的源文档(如果设置了 return_source_documents=True,通常在 'source_documents' 键中)的字典。

代码片段思路 (续上一步,假设qa_chain已成功创建):

# user_question = "请介绍一下项目的主要风险点有哪些?"
# # 假设qa_chain已经成功初始化
# # response = qa_chain.invoke({"query": user_question})
# # print("答案:", response['result'])
# # if 'source_documents' in response:
# #     print("参考来源:")
# #     for doc in response['source_documents']:
# #         print(f"- {doc.metadata.get('source', 'N/A')}, page: {doc.metadata.get('page', 'N/A')}")print("提醒:问答环节依赖于 qa_chain 的成功构建,其中包括有效的 LLM。")

Use code with caution.
Python

四、优化与进阶

基础的问答机器人搭建完成后,还有许多可以优化和进阶的方向:

  • 选择合适的 LLM 和 Embedding 模型: 模型的选择对最终效果至关重要。大型模型通常效果更好,但资源消耗也更大。Embedding 模型也需要与 LLM 的特性相匹配。可以尝试不同的组合,并评估其在您的特定数据集上的表现。
  • 优化文本切分策略: chunk_sizechunk_overlap 的设置会显著影响检索效果。需要根据文档的平均段落长度、句子结构等进行调整和实验。例如,对于代码或结构化较强的文本,可能需要不同的切分策略。
  • 提示工程 (Prompt Engineering): 传递给 LLM 的提示词(Prompt)对生成答案的质量有巨大影响。可以优化 RetrievalQA 链中的默认提示模板,加入更具体的指令、角色扮演或输出格式要求,以引导 LLM 生成更符合期望的答案。
  • 添加聊天历史记录: 为了支持多轮对话,机器人需要能够记住之前的交流内容。LangChain 提供了 ConversationBufferMemory 等记忆模块,可以集成到链中,实现上下文感知的对话。
  • Web UI 集成: 使用 Streamlit 或 Flask/Django 等 Web 框架,可以为您的问答机器人创建一个用户友好的图形界面,方便非技术人员使用。Streamlit 非常适合快速搭建数据应用原型。
  • 评估与反馈: 建立一套评估机制,例如使用一些标准问答对来测试机器人的准确率和召回率。也可以收集用户反馈,持续优化模型和流程。
  • 混合检索: 除了语义检索,还可以结合传统的关键词检索(如 BM25),有时混合检索的效果会更好。

五、注意事项

在开发和部署本地知识库问答机器人时,务必注意以下几点:

  • 资源消耗: 在本地运行 LLM(尤其是较大的模型)对 CPU、内存(RAM)以及 GPU(显存)有非常高的要求。务必评估您的硬件是否满足所选模型的需求。嵌入模型的计算也可能消耗一定资源。
  • 模型选择与许可: 不同的开源 LLM 和嵌入模型有不同的性能表现、大小和授权协议(License)。在商业应用中,务必仔细阅读并遵守模型的许可条款。
  • 数据隐私与安全: 虽然数据保留在本地,但仍需注意原始文档的敏感性。确保运行环境的安全,防止未经授权的访问。
  • Embedding 模型的选择与一致性: 用于索引文档的 Embedding 模型必须与用于查询时向量化用户问题的 Embedding 模型是同一个,否则无法进行有效的相似性比较。
  • 文本切分的粒度与上下文: 切分过细可能导致每个文本块缺乏足够的上下文信息,使得 LLM 难以理解;切分过粗则可能引入过多无关噪声,并且可能超出 LLM 的上下文窗口限制。这是一个需要仔细权衡和实验的参数。
  • 索引的持久化与更新: 对于较大的知识库,每次启动都重新生成向量索引会非常耗时。向量数据库(如 FAISS, ChromaDB)通常支持将索引保存到磁盘并在需要时加载。同时,当知识库文档更新时,也需要考虑如何高效地更新向量索引(增量更新或重新构建)。
  • 依赖库版本兼容性: Python 的深度学习和 LLM 相关生态系统发展迅速,库的版本迭代很快。在项目中固定主要依赖库的版本,并注意版本之间的兼容性问题,以避免不必要的麻烦。
  • 错误处理与鲁棒性: 实际应用中,需要添加充分的错误捕获和处理机制,例如处理无法加载的文档、模型加载失败、API 调用超时等情况,以提高系统的鲁棒性。
  • 答案的幻觉与准确性: LLM 有时会产生“幻觉”,即生成看似合理但实际上不正确或与原文不符的答案。不能完全信任 LLM 的输出,特别是对于关键决策。可以通过优化提示、引入事实校验机制或让用户方便地溯源到原始文档片段来缓解此问题。
  • 处理速度: 从接收问题到返回答案的整个流程可能涉及多次模型推理和数据处理,响应速度可能成为瓶颈。需要考虑优化各个环节的性能,特别是 LLM 的推理速度和向量检索速度。

六、总结与展望

通过本文的指引,您应该对如何使用 Python 和 LLM 技术栈构建一个本地知识库问答机器人有了清晰的认识。我们从核心技术概览、环境准备,到详细的实现流程(包括文档加载、切分、向量化、索引构建、问答链集成),再到优化进阶和注意事项,力求为您提供一个全面的实践蓝图。

本地知识库问答机器人的潜力巨大。对于个人而言,它可以成为强大的学习和研究助手;对于企业而言,它可以用于构建内部知识库、智能客服、员工培训系统等,从而提升信息获取效率和知识管理水平。

未来,随着 LLM 技术的不断发展,我们可以期待更强大、更易用的模型和工具出现。例如,多模态能力(理解图像、音频等)的集成、更精细化的检索增强生成(RAG)策略、以及更自动化的模型微调和评估流程,都将为本地知识库问答机器人带来更广阔的应用前景和更智能的用户体验。现在,就开始动手构建属于您自己的知识管家吧!

相关文章:

LLM初识

从零到一:用 Python 和 LLM 构建你的专属本地知识库问答机器人 摘要: 随着大型语言模型(LLM)的兴起,构建智能问答系统变得前所未有的简单。本文将详细介绍如何使用 Python,结合开源的 LLM 和向量数据库技…...

【CTF】Linux Shell RCE绕过(bypass)技术总结

在Linux环境下,远程代码执行(RCE,Remote Code Execution)是一种常见的攻击手段。然而,许多系统会对命令注入进行过滤或限制,例如禁止特定关键字(如system)、斜杠(/&#…...

深入理解 Linux 权限控制机制

引言 在 Linux 系统中,权限控制是保障系统安全的核心机制。通过限制用户对文件和资源的访问,它能有效防止未授权操作,保护数据不被篡改或泄露。合理设置权限不仅有助于实现用户隔离和最小权限原则,还能降低系统被滥用或攻击的风险…...

技术书籍推荐(002)

20. 利用Python进行数据分析 免费 电子书 PDF 下载 书籍简介: 本书聚焦于使用Python进行数据处理和分析。详细介绍了Python中用于数据分析的重要库,如NumPy(提供高效的数值计算功能,包括数组操作、数学函数等)、panda…...

[SAP] SAP ERP用户参数设置

菜单路径 个人默认值的设置(数值,日期,时间) 个人参数值的设置 在给参数设置参数值后,当用户登录到对应功能页面时,这些参数值就会自动带出来 例如,我们分别对上述AAT,VKO以及VTW这3个参数设置了参数值&am…...

Python中,async和with结合使用,有什么好处?

在Python的异步编程中,async和with的结合使用(即async with)为开发者提供了一种优雅且高效的资源管理模式。这种组合不仅简化了异步代码的编写,还显著提升了程序的健壮性和可维护性。以下是其核心优势及典型应用场景的分析&#x…...

【信息系统项目管理师】第3章:信息系统治理 - 29个经典题目及详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第…...

python实战项目69:基于Python爬虫的链家二手房数据采集方法研究

python实战项目69:链家二手房数据采集 一、项目需求1.1 房地产数据价值1.2 传统数据获取局限性1.3 技术可行性二、数据采集流程2.1 需求分析2.2 网页结构分析2.3 请求发送与反爬策略2.4 数据解析2.5 数据存储三、结论与展望四、完整代码一、项目需求 本文针对房地产数据分析需…...

PowerShell 脚本中文乱码处理

问题描述 脚本带中文,执行时命令行窗口会显示出乱码 示例 Write-Host "测试成功!"解决方法 问了DeepSeek,让确认是不是 UTF8 无 BOM 格式 事实证明方向对了 但是确认信息有偏差 改成 UTF8 with BOM 使用任意支持修改编码的文本…...

SpEL(Spring Expression Language)使用详解

SpEL(Spring Expression Language)是 Spring 框架中一种强大的表达式语言,支持在运行时动态查询和操作对象图。它与 Spring 生态深度集成,广泛应用于依赖注入、数据绑定、AOP、安全规则等场景。以下是其核心语法、应用场景及使用示…...

论文阅读与写作:《从探索到突破:解密科研和论文写作的思维密码》

文章目录 一、如何做科研1.科研的步骤2.课题选择3.快速入门一个新领域:读论文,先读综述(1)自己看论文的时候,每篇论文花3-5分钟记录一下自己的idea和一些瞬间的想法(2)高质量文献:顶会顶刊(3)如何检索 4.注重团队协作与学术交流5.…...

免费公共DNS服务器推荐

当自动获取的DNS或本地运营商的DNS出现问题,可能导致软件无法连接服务器。此时,手动修改电脑的DNS设置或许能解决问题。许多用户觉得电脑上网速度慢、游戏卡顿,归咎于DNS问题。确实,我们可以自行设置一个DNS来改善网络体验。不少用…...

CK-S650-PA60S半导体专用读写器|读写头与绿联RS232串口转接头联机测试说明

CK-S650-PA60S半导体专用读写器|读写头是一款国产替代欧姆龙V640系列,支持德州仪器公司(TI)制造的RI-TRP-DR2B、RI-TRP-WR2B-40低频玻璃管标签|射频标签读写,广泛应用半导体硅片盒、晶圆盒、花篮等RFID插件识别与产品追溯领域。 CK-S650-PA60S半导体专用…...

Babel 基础使用指南:从安装到编译的完整流程

Babel 是当今前端开发中不可或缺的工具,它允许开发者使用最新的 JavaScript 特性,同时确保代码能在各种浏览器和环境中运行。本文将带你从零开始学习 Babel 的基础使用,涵盖安装、配置到实际编译的全过程。 1. 安装 Babel 和插件 首先&…...

uniapp-商城-52-后台 商家信息(商家信息数据,云对象使用)

1、概述 已经通过好几个篇幅来说明商家信息,包括logo、商家名称,地址,电话以及商家简介。通过表单组件和标签,以及我们的文件上传标签,都做了说明。(logo上传,用的文件上传组件是上传到公共的数…...

【我的创作纪念日】512

机缘 还记得 2023 年 12 月 15 日,我撰写了第 1 篇技术博客:《oracle 跟踪文件--审计日志》。从此,这平凡的一天,赋予了我不平凡的意义。在那一刻,我已在创作这趟旅程中出发,并立志将工作中的经验总结&…...

共享内存与信号量结合

在Linux系统中,进程间通信(IPC)和原子性是并发编程中的核心问题。以下是对这些概念的详细分步解释: 一、进程间通信(IPC)方法 1. 管道(Pipe) 匿名管道:用于父子进程等有…...

西门子PLC s7-1200工艺对象“轴”的应用(1)

1. 工艺对象 “ 轴 ” 的概念 在西门子 S7-1200 PLC 中,术语 “ 轴 ” 特指用 “ 轴 ” 工艺对象表示的驱动器工艺映像。 “ 轴 ” 工艺对象是用 户程序与驱动器之间的接口,用于接收用户程序中的运动控制命令、执行这些命令并监视其运行情况。 运动控制…...

ubuntu22.04在 Docker容器中安装 ROS2-Humble

22.04 安装 docker 容器并实现rviz功能 1 docker pull命令拉取包含ROS-Humble的镜像: docker pull osrf/ros:humble-desktop-full-jammy docker images验证该镜像是否拉取成功。 使用镜像osrf/ros:humble-desktop-full-jammy创建并运行容器 sudo docker run -it…...

【LwIP源码学习6】UDP部分源码分析

前言 本文对lwip协议栈里UDP部分的源码进行分析。将源码中最关键部分提取出来,梳理UDP部分的设计框架。 应用层例子 首先举一个应用层使用UDP的简单例子,如下: //第一步:申请套接字 sock socket(AF_INET, SOCK_DGRAM, 0); //…...

Python Cookbook-7.10 在 MySQL 数据库中储存 BLOB

任务 想把一个二进制的大对象(BLOB)存入MySQL数据库 解决方案 MySQLdb 模块并不支持完整的占位符,不过可以使用模块的escape_string 函数来解决: import MySQLdb,cPickle #连接到数据库,用你的本机来测试数据库,并获得游标 connection = MySQLdb.connect(db = "tes…...

LWIP的ICMP协议

ICMP协议简介 ICMP协议是一个网络层协议 背景:如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。因此我们需要ICMP协议来完成这样的功能 为什么需要ICMP协议 1,IP 协议本身不提供差错报告和差错控制机制来保证数据报递交的有效…...

Spring Web MVC响应

返回静态页面 第一步 创建html时,要注意创建的路径,要在static下面 第二步 把需要写的内容写到body内 第三步 直接访问路径就可以 返回数据ResponseBody RestController Controller ResponseBody Controller:返回视图 ResponseBody&…...

STM32智能窗帘系统:从零到一的开发实战

简介 智能窗帘控制系统是智能家居领域的经典应用,随着物联网技术的不断发展,其功能从简单的远程控制演变为具备环境感知、多设备联动和跨平台兼容的智能系统。本篇文章将全面解析基于STM32的智能窗帘系统开发方案,从硬件设计到软件实现,再到企业级扩展功能,提供完整的代码…...

第三方评测机构如何凭借专业公正提供高可靠性软件检测服务?

第三方评测机构与软件开发及使用单位保持独立,凭借其专业技能和公正立场,为企业提供多样化的软件检测服务。这些检测结果的可靠性极高,不仅有助于企业减轻负担,节省人力和物力资源,而且赢得了业界的普遍认可。下面&…...

相或为K(位运算)蓝桥杯(JAVA)

这个题是相或为k,考察相或的性质,用俩个数举例子,011001和011101后面的数不管和哪个数相或都不可能变成前面的数,所以利用这个性质我们可以用相与运算来把和k对应位置的1都积累起来,看最后能不能拼起来k如果能拼起来k那…...

X.509证书详解

文章目录 1. X.509证书基础1.1 什么是X.509证书1.2 X.509证书结构1.3 证书编码格式2. Java中的X509Certificate2.1 类层次结构2.2 核心方法3. 获取X509Certificate对象3.1 从文件加载证书3.2 从KeyStore获取证书3.3 从HTTPS连接获取证书4. 创建自签名证书5. 证书验证5.1 基本验…...

深入浅出:Spring Boot 中 RestTemplate 的完整使用指南

在分布式系统开发中,服务间通信是常见需求。作为 Spring 框架的重要组件,RestTemplate 为开发者提供了简洁优雅的 HTTP 客户端解决方案。本文将从零开始讲解 RestTemplate 的核心用法,并附赠真实地图 API 对接案例。 一、环境准备 在 Spring…...

C++23 views::repeat (P2474R2) 写一篇博客

文章目录 std::views::enumerate 简介使用示例性能和灵活性与其他视图的结合使用总结 C23 标准引入了众多令人期待的新特性,其中 std::views::enumerate 便是一个备受瞩目的新增视图。这个新特性通过为迭代器提供索引和元素的组合,极大地简化了对集合中…...

微软向现实低头:悄悄延长Windows 10的Microsoft 365支持

快科技5月11日消息,Windows 10将在今年10月14日正式结束支持,此前微软曾明确表示,Microsoft 365(M365)应用,如Outlook、Teams、OneDrive、Word、Excel等,也将随之停止支持。 不过无法升级至Win…...

数字化转型-4A架构之技术架构

4A架构系列文章 数字化转型-4A架构(业务架构、应用架构、数据架构、技术架构) 数字化转型-4A架构之业务架构 数字化转型-4A架构之应用架构 数字化转型-4A架构之数据架构 数字化转型-4A架构之技术架构 一、 技术架构 Technology Architecture 1. 技…...

生产级 Flink CDC 应用开发与部署:MySQL 到 Kafka 同步示例

生产级 Flink CDC 应用开发与部署:MySQL 到 Kafka 同步示例 为了帮助你更好地理解如何将 Flink 作业部署为独立服务,下面我将提供一个完整的工程代码示例。这个例子基于之前的 MySQL 到 Kafka 的数据同步需求,但这次我们将 Flink 作业作为一个独立的服务进行打包和部署。 …...

【计算机视觉】OpenCV实战项目:Text-Extraction-Table-Image:基于OpenCV与OCR的表格图像文本提取系统深度解析

Text-Extraction-Table-Image:基于OpenCV与OCR的表格图像文本提取系统深度解析 1. 项目概述2. 技术原理与算法设计2.1 图像预处理流水线2.2 表格结构检测算法2.3 OCR优化策略 3. 实战部署指南3.1 环境配置3.2 核心代码解析3.3 执行流程示例 4. 常见问题与解决方案4.…...

TSN网络与DIOS融合:破解煤矿井下电力系统越级跳闸难题

一、引言 1.1 研究背景与意义 在现代煤矿生产中,井下电力系统作为整个煤矿生产的动力核心,其重要性不言而喻。煤矿井下的各类机械设备,如采煤机、刮板输送机、通风机、排水泵等,都依赖稳定的电力供应才能正常运行。电力系统的稳定…...

ALLinSSL:一站式SSL证书管理解决方案

引言 在当今互联网安全日益重要的背景下,SSL证书已成为保护网站安全的必备工具。然而,管理多个SSL证书常常是一项繁琐且容易出错的任务。ALLinSSL应运而生,它提供了一个一站式的SSL证书管理解决方案,大大简化了证书的申请、安装和更新过程。本文将深入介绍ALLinSSL的特性、…...

jsAPI

环境准备 1 安装nvm nvm 即 (node version manager),好处是方便切换 node.js 版本 安装注意事项 要卸载掉现有的 nodejs提示选择 nvm 和 nodejs 目录时,一定要避免目录中出现空格选用【以管理员身份运行】cmd 程序来执行 nvm 命令首次运行前设置好国…...

三、c语言练习四题

在这个系列中,我将以每次五题的形式加强对C语言的理解 1、 矩阵转置 要求 输入: 2 3 1 2 3 4 5 6输出: 1 4 2 5 3 6 //矩阵转置(复习) int main() {int i 0;int j 0;int arr[10][10];/*提前定义好一个大容量数…...

MySql(进阶)

一.数据库约束 约束类型 NOT NULL - 指示某列不能存储 NULL 值。 (not null不能为NILL) UNIQUE - 保证某列的每行必须有唯一的值。 (unique唯一值) DEFAULT - 规定没有给列赋值时的默认值。 (default为空给定默认值) PRIMARY…...

数据结构练习:顺序表题目

今天我们来进行顺序表后面习题的练习 目录 移除数组 思路1:查找后进行删除 思路2:新数组交换: 思路3:双指针法: 删除重复项 合并两个有序数组 移除数组 它的示例如下: 思路1:查找后进行删除…...

Ubuntu 22虚拟机【网络故障】快速解决指南

Ubuntu22虚拟机突然无法连接网络了,以下是故障排除步骤记录。 Ubuntu 22虚拟机网络故障快速解决指南 当在虚拟机中安装的 Ubuntu 22 系统出现 ping: connect: 网络不可达 和 ping: www.baidu.com: 域名解析出现暂时性错误的报错时,通常意味着虚拟机无法…...

SwaggerLogger.java

package further.config;import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.context.annotation.Configuration; import org.springframework.util.StringUtils;/*** swagger启动ap…...

基于SpringBoot的在线教育管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...

企业内训|智能调控系统算法与优化——某汽车厂商

5月9日,东北某市,TsingtaoAI团队为某汽车厂商的智能驾驶业务和研发团队交付“智能调控系统算法与优化”课程。 本课程系统化解析智能调控系统的核心算法原理与前沿优化技术,深度融合经典控制、现代控制及模型预测控制(MPC&#x…...

Web 实时通信技术:WebSocket 与 Server-Sent Events (SSE) 深入解析

一、WebSocket: (一)WebSocket 是什么? WebSocket 是一种网络通信协议,它提供了一种在单个 TCP 连接上进行全双工通信的方式。与传统的 HTTP 请求 - 响应模型不同,WebSocket 允许服务器和客户端在连接建立…...

一个网球新手的学习心得

一个网球新手的学习心得 握拍正手反手发球 网球新手学习的几个重要点就是握拍、正手、反手,还有发球。 握拍 不管是发球还是拉球,首先要注意握拍的方式。 正手的话,一般是右手握住球拍柄,掌心对着球拍柄宽的一面,食…...

12、电子电路设计与PCB布局组件 (概念) - /设计与仿真组件/pcb-layout-tool

76个工业组件库示例汇总 电子电路设计与 PCB 布局组件 (概念演示) 概述 这是一个交互式的 Web 组件,用于演示电子电路原理图设计和 PCB 布局的基本概念。用户可以从元件库中选择元件,在原理图和 PCB 画布上放置、移动,进行原理图连线&…...

[特殊字符] 免税商品优选购物商城系统 | Java + SpringBoot + Vue | 前后端分离实战项目分享

一、项目简介 本项目为一款功能完备的 免税商品优选购物商城系统,采用 Java 后端 Vue 前端的主流前后端分离架构,支持用户、商家、管理员三类角色,满足商品浏览、下单、商家管理、后台运营等多项功能,适用于实际部署或作为毕业设…...

小土堆pytorch--torchvision中的数据集的使用dataloader的使用

torchvision中的数据集的使用&dataloader的使用 一级目录二级目录三级目录 1 torchvision 中的数据集的使用1.1 对与CIFAR - 10数据集的介绍1.2 数据集加载代码1.3 使用transform加载代码 2 DataLoader的使用2.1 DataLoader的作用1. 数据读取2. 数据预处理3. 批量处理4. 并…...

【RabbitMQ】 RabbitMQ高级特性(一)

文章目录 一、消息确认1.1、消息确认机制1.2、手动确认方法1.2.1、AcknowledgeMode.NONE1.2.2、AcknowledgeMode.AUTO1.3.3、AcknowledgeMode.MANUAL 二、持久性2.1、 交换机持久化2.2、队列持久化2.3、消息持久化 三、发送方确认3.1、confirm确认模式3.2、return退回模式3.3、…...

优化理赔数据同步机制:从4小时延迟降至15分钟

优化理赔数据同步机制:从4小时延迟降至15分钟 1. 分析当前同步瓶颈 首先诊断当前同步延迟原因: -- 检查主从复制状态(在主库执行) SHOW MASTER STATUS; SHOW SLAVE HOSTS;-- 在从库执行检查复制延迟 SHOW SLAVE STATUS\G -- 关…...