【文档智能 RAG】RAG新基建-RAG性能增强关键技术点及通用文档解析工具-TextIn

前言

在私有领域知识问答和企业知识管理领域,结合检索增强型生成模型(Retrieval-Augmented Generation, RAG)大模型(Large Language Model, LLM)已成为一种趋势。然而,在RAG系统的文档预处理阶段和检索阶段,经常碰到三个主要问题。

  1. 企业内部常常积累了大量包含PDF格式的文档,这些文档的解析精度不足,严重制约了基于专业知识的问答系统的性能。因此,提高这些PDF文件的解析质量,对于构建高效的RAG系统至关重要。
  2. 构建起一个完备的智能文档解析服务后,需要一个有效的评测工具来有评测文档的解析质量,而不是主观的通过肉眼感知。
  3. 用户查询通过text embedding向量模型快速、准确、有效从知识库中检索出相关知识片段,使得LLM回答准确。

本文将先探讨下文档解析的准确性对RAG系统的影响;然后介绍下智能文档解析关键技术,并介绍闭源的通用文档解析服务——TextIn,还介绍了一款开源的文档解析质量评测工具-Markdown Tester,最后介绍下合合信息开发的向量表征模型-acge_text_embedding

RAG一般流程

一、文档解析的准确性对RAG系统的影响

在RAG的预处理阶段,文档解析的准确性是至关重要的。如果文档解析不准确,这将直接影响到后续的检索和生成阶段,导致整个RAG系统的性能下降。以下是文档解析不准确可能带来的具体问题及其影响:

  • 内容识别错误:如果文档中的文本、图像或格式被错误识别,将导致原始信息的丢失或错误。例如:(1)表格数据可能被错误地解析为普通文本,表格的行列关系混乱等:导致表格数值类问题无法进行精准的回答和RAG系统可能无法正确理解数据间的关联性。(2)图像中的文字(OCR)被错误识别:如果文档中的文本或图像被错误识别,系统接收到的数据质量会下降,这将影响系统生成的输出质量。

  • 布局信息丢失:PDF文件的布局信息,如页面布局、段落、标题层级等,在解析过程中可能会丢失,这会影响对文档结构的把握,进而影响分块(chunks)。为了适应模型的输入要求,文档需要被分割成小块。如果分块策略不当,可能会导致语义信息的丢失,影响模型对文档内容的理解。

  • 编码问题:PDF文件可能包含多种字符编码、水印等,一些pdf解析工具不能正确处理这些编码,可能会导致乱码。乱码的文本内容如果解析出来混合在文本中,会给知识库带来大量的噪声,这也会影响RAG系统的性能。

  • 文档复杂性:(1)复杂的文档结构,如多栏布局、阅读顺序恢复、混合文本和图像等,可能会给解析带来额外的挑战,增加解析错误的风险。(2)文档元素的复杂性:文档中包含各种元素类型,如:段落、表格、公式和图表。错误的解析这些元素内容,也会给RAG系统的知识库带来大量噪声。

因此,对于C端文档问答的RAG系统应用产品,迫切的需要对文档进行精准解析。理想情况下,文档解析器应具备以下关键特征:

  • 文档结构识别:能够灵活地将页面划分为不同类型的内容块,如标题、段落、表格、公式和图表。这确保了划分的文本块是完整和独立的语义单元
  • 文档内元素准确解析:在文档结构识别之后,识别出来的内容块准确解析,如:OCR准确无误的将标题、段落解析成文本内容;表格识别解析精确:尤其是数值类文档问答敏感的场景;公式能够准确的解析成Latex格式。
  • 在复杂文档布局中保持鲁棒性:即使是在文档页面布局复杂的情况下也能保证解析效果,如多列页面、无边框表格甚至合并单元格的表格

二、文档解析的技术路线

对于简单的文档解析,langchain 和 llama_index 中集成了各种基于规则引擎的解析工具(如:解析pdf的pdfplumber,pyPDF2等)或者简单的开源的ocr工具(如:paddleocr),能够对多种文件类型进行解析。

解析工具常出现的问题

对于复杂的文档解析,常基于深度学习的方法进行解析,在上篇文章中(《【文档智能 & RAG】RAG增强之路:增强PDF解析并结构化技术路线方案及思路》)也讲解了文档解析的一些关键的开源技术路径及方案。

文档内容解析路径

智能文档(文本内容)技术路线

然而,对于通用文档解析而言还存在着一些挑战:

2.1 版式分析

版式分析

版面分析指的是对文档进行区域划分,通过bounding box定位其中的关键区域,如:文字、标题、表格、图片等。

版式分析的优势

  1. 通过大量标注的数据,准确的划分出文档关键区域。如:

    • 文本区域:页眉、页脚、标题、段落、页码、脚注、图片标题、表格标题等
    • 表格
    • 公式
    • 图片
  2. 能对复杂的版式进行区块识别

    复杂版式

版式分析的缺点,目前基本都是通过目标检测的形式进行版式分析,因此其挑战也是伴随着特定场景的标注数据,尤其是通用场景的版式分析,难度巨大。

2.2 表格识别与解析

表格解析难点示例
表格识别与解析的难点一般如下:

  • 表格的多样性和复杂性:表格的形式多种多样,包括有线表、无线表和少线表,这使得检测和分割单元格变得复杂 。

  • 表格单元格的合并与拆分:某些表格中的单元格可能跨行或跨列,甚至跨页,需要准确识别这些合并的单元格并将其恢复成标准单元格 。

  • 表格内容的识别和解析:表格中可能包含图像、公式、符号等非文本内容,需要将它们转换成文本或保留格式 。

  • 表格结构的表示和输出:不同的应用场景可能需要不同的表格结构表示方式,如 HTML、JSON、CSV 等,需要将识别结果转换成适合目标应用的格式,并保留数据和样式信息。

2.3 公式识别与解析

公式识别类型

数学公式识别与解析是一个技术挑战性很高的领域,主要难点包括:

  • 公式结构的复杂性:数学公式往往包含复杂的嵌套结构,这些结构的识别需要算法能够准确理解公式的层次关系,例如多层的分数、根号等 。

  • 形近字的识别难度:在手写识别中,相似形状的字符如大写X和小写x,大写Z和数字2,希腊字母γ和字母r等容易混淆,增加了识别的难度 。

  • 非常规符号的识别:比赛中添加的非常规符号组合可能会与公式混淆,增加了识别的复杂度。

2.4 阅读顺序

由于文档布局的复杂性,包括多栏、嵌套表格、不规则的文本框等,这增加了阅读顺序恢复的难度。往期中也介绍了阅读顺序相关内容(《【文档智能】符合人类阅读顺序的文档模型-LayoutReader及非官方权重开源》)

多列布局阅读顺序恢复

小结:以上文档解析的每个环节无论是数据标注、模型训练、实验,都需要投入巨大的成本和精细化的优化,在工业落地场景,在保证解析效果的同时,还需要关注文档的解析速度。尤其是OCR过程,文字密集型文档的解析速度影响特别大。

三、TextIn

针对以上痛点,笔者深度体验了一下合合信息自研文档解析技术-TextIn。该技术深度融合了文字识别(OCR)、计算机图形图像技术以及智能图像处理引擎,使得纸质文档或图片中的文字信息能够迅速、精准地转化为计算机易于处理的文本格式

TextIn文档智能关键技术如下:

3.1 版面分析关键技术 Layout-engine

3.2 文档树提取关键技术 Catalog-engine

3.3 解析体验

测试样例:

TextIn解析输出:

TextIn解析结果

可以看到,TextIn将pdf文件解析成markdown格式,并将标题、段落、行内公式及行间公式准确解析。

值得关注的是,标题,段落的准确解析、并按照阅读顺序进行输出,这是生成文档目录及文档树的基础。

快速上手代码:

import requests
import jsondef get_file_content(filePath):with open(filePath, 'rb') as fp:return fp.read()class TextinOcr(object):def __init__(self, app_id, app_secret):self._app_id = app_idself._app_secret = app_secretself.host = 'https://api.textin.com'def recognize_pdf2md(self, image, options):"""pdf to markdown:param options: request params:param image: file bytes:return: responseoptions = {'pdf_pwd': None,'dpi': 72,'page_start': 0,'page_count': 24,'apply_document_tree': 0,'markdown_details': 0,'table_flavor': 'md','get_image': 'none','parse_mode': 'auto',}"""url = self.host + '/ai/service/v1/pdf_to_markdown'headers = {'x-ti-app-id': self._app_id,'x-ti-secret-code': self._app_secret}return requests.post(url, data=image, headers=headers, params=options)def write_file(markdown_result, filepath = 'test.md'):f = open(filepath, 'w')f.write(markdown_result)f.close()if __name__ == "__main__":textin = TextinOcr('app-id', 'app-secret')image = get_file_content('test.pdf')resp = textin.recognize_pdf2md(image, {'page_start': 0,'page_count': 14,'table_flavor': 'html','parse_mode': 'auto','apply_document_tree': 1,'markdown_details': 1,# 'get_image': 1,})print("request time: ", resp.elapsed.total_seconds())json_data = json.loads(resp.text)write_file(json_data['result']['markdown'], 'test2.md')

3.4 一个解析引擎速度的重要性

目前,基于多模态大模型技术的快速发展,文档解析可以通过多模态大模型进行解决,如:gpt-4o等,但是,基于多模态大模型的解决方案,成本大、非常耗时、容易产生幻觉问题,尤其是表格的解析,数值上的幻觉问题是灾难性的。

笔者在体验TextIn时,感觉解析速度非常快,这对于RAG系统的增益可以从离线和在线两个方面展开讲:

  1. 离线模式
  • 数据预处理: 在离线模式下,解析引擎可以预先处理和索引大量文档,为在线查询做好准备。
  • 定期更新知识库:可以定期更新模型和索引,以适应新的数据和需求变化。
  1. 在线模式
  • c端用户通过网页知识空间上传新的文件时,在线模式允许解析引擎实时响应用户查询,提供即时的文档解析服务。
  • 用户体验: 用户期望快速且准确的响应,因此解析引擎的速度和准确性在在线模式下尤为重要。

4、文档解析评测工具-Markdown Tester

在文档解析中,有了解析工具后,对于开发者,针对文档解析的解析效果,需要一款比较好用的评价工具来客观对解析效果进行评价;对于购买解析服务的c端客户,同样也需要评价文档解析服务的效果,在自建数据集上先评测一下,然后有针对性的进行解析服务选购。因此,下面介绍一下 Markdown Tester

该评测工具用于评价markdown文档相似性,从段落、标题、表格和公式四个维度进行评价,相关评价指标的定义如下表:

段落、标题、表格和公式四个维度定义

对于RAG中文档解析,必须强调为什么使用markdown进行表示:Markdown格式因其简洁性和易于解析的特点,‌被广泛认为是LLM(‌大型语言模型)‌友好的文档格式。‌Markdown通过明确的标记语法,‌帮助模型更好地理解文档结构和内容,‌从而提高信息提取的准确性和效率。‌特别在存在大量公式、‌表格的学术论文场景下,‌Markdown可能是更合适的格式选择。‌这种格式选择的原因主要包括:‌

  • 结构化信息的保留:‌Markdown能够很好地保留结构化信息(非常适合需要保留标题层级、‌公式和表格等结构信息的场景),‌这对于需要精确提取和分析文本内容的场景尤为重要。‌
  • 易于解析:‌Markdown的简洁性和明确的标记语法使得它易于被计算机程序解析和处理,‌这对于自动化文档处理和数据分析任务非常有利。‌
  • 支持场景多:‌Markdown作为一种轻量级标记语言,‌被广泛用于编写文档、‌笔记、‌博客文章、‌技术文档等场景。

4.1 使用方法

  • step1

    git clone https://github.com/intsig/markdown_tester.git
    cd markdown_tester
    ./install.sh 
    
  • step2

    Markdown Tester的仓库中给出了一些22份文档的grounding truth用于评测各种解析工具效果。待测评样本按照下述方式放置:

    dataset/
    ├── pred/
    │   ├── gpt-4o/
    │   ├── vendor_A/
    │   ├── vendor_B/
    │   ├── ...
    ├── gt/
    
  • step3

    python run_test.py --pred_path path_to_pred_md  --gt_path path_to_gt_md
    

4.2 运行效果

对比表格

对比雷达图-可视化

笔者在评测过程中发现,自研模型对于识别准确率较高,但召回率普遍不行。

五、text embedding在RAG环节的作用

由于LLM固有的问题,如:LLM的知识不是实时更新的;LLM无法回答私域知识问题。因为,LLM的专长在于生成和理解复杂的自然语言查询。嵌入模型(比如Embedding)的专长在于将文本映射到高维空间中,以便进行相似性比较;生成可用于高效检索的密集向量。

因此,目前主流的实现方式都是通过RAG的方式对上述问题进行解决。text embedding在RAG中充当重要的角色,主要有以下几个作用:

  1. 捕捉语义信息:文本嵌入将文本转换为数值向量,这些向量能够捕捉到文本的语义信息。
  2. 增强上下文理解:在RAG系统中,文本嵌入帮助模型掌握输入查询的上下文,并在NLP任务的检索阶段提取相关信息。通过这种方式,模型能够更好地理解和处理非结构化文本中的模糊性和可变性。
  3. 提高检索性能:有效的文本嵌入能够显著提升RAG系统的性能。例如,不同的嵌入模型带来的效果也不尽相同,选择合适的嵌入模型可以优化模型的检索性能。此外,结合知识图谱和文本嵌入,可以实现结构化知识和非结构化文本的无缝融合,从而产生信息更丰富、上下文相关的响应。并且,文本嵌入增强了对自然语言中歧义和可变性的适应能力,使RAG模型能够更好地应对模糊和多义的表达。这在处理开放域问答等复杂任务时尤为重要。

下面介绍一个效果比较好的文本向量嵌入的表征模型-acge_text_embedding

5.1 acge_text_embedding

acge_text_embedding是由合合信息研发的向量表征模型,技术架构上,acge_text_embedding采用了俄罗斯套娃表示学习(Matryoshka Representation Learning,MRL)编码不同粒度的信息,并让一个编码能够适应不同计算资源的下游任务。MRL的目的是学习许多个小于等于 l o g d log d logd 的前 M M M 维表征,即总维度的前 1 / 2 k 1/2^k 1/2k维。在训练时,MRL根据指定维度 [ 64 , 128 , . . . , 2048 , 3072 ] [64,128,...,2048,3072] [64,128,...,2048,3072]的向量来计算多个 l o s s loss loss

一种比较高效的做法是将每个投射头 W ( m ) ∈ R L × m W^{(m)}\in\mathbb{R}^{L\times m} W(m)RL×m看成是一个大投射头的 W ∈ R L × d W\in\mathbb{R}^{L\times d} WRL×d的一部分,即 W ( m ) = W 1 : m W^{(m)}=W_{1:m} W(m)=W1:m
,这种做法在大输出空间时尤其重要,称之为Efficient Matryoshka Representation Learning (MRL–E)。

因此,该表示学习框架的核心思想是学习不同粒度的信息,允许一个嵌入向量在保持准确性和丰富性的同时,适应不同计算资源的需求,并可以无缝地适应大多数表示学习框架,并且可以扩展到多种标准计算机视觉和自然语言处理任务。

acge_text_embedding通过应用多模态表示学习(MRL)技术,能够实现一次训练过程,从而获得丰富多样的表征维度。特别值得一提的是,自适应粗粒度到细粒度表示(acge)模型,它采用了一种层次化的方法,从宏观到微观逐步深化表征的深度和精度。这种方法不仅在推理和部署阶段无需额外成本,还提供了一种灵活且高效的表征方式。在具体的实践应用中,为了更好地适应不同任务的需求,acge模型采用了策略学习的训练方法。这种方法通过针对性地调整学习策略,显著提升了模型在检索、聚类和排序等任务上的性能表现。此外,模型还引入了持续学习的训练机制,有效解决了神经网络在学习过程中可能出现的灾难性遗忘问题。这使得模型能够在训练迭代中达到更加优秀的收敛状态,为持续优化和提升模型性能奠定了基础。

5.2 acge_text_embedding使用

  • 在sentence-transformer库中的使用:
from sentence_transformers import SentenceTransformersentences = ["数据1", "数据2"]
model = SentenceTransformer('acge_text_embedding') # 替换成你下载的权重地址
print(model.max_seq_length)
embeddings_1 = model.encode(sentences, normalize_embeddings=True)
embeddings_2 = model.encode(sentences, normalize_embeddings=True)
similarity = embeddings_1 @ embeddings_2.T
print(similarity)
  • 在sentence-transformer库中的使用方法,选取不同的维度
from sklearn.preprocessing import normalize
from sentence_transformers import SentenceTransformersentences = ["数据1", "数据2"]
model = SentenceTransformer('acge_text_embedding') # 替换成你下载的权重地址
embeddings = model.encode(sentences, normalize_embeddings=False)
matryoshka_dim = 1024
embeddings = embeddings[..., :matryoshka_dim]  # Shrink the embedding dimensions
embeddings = normalize(embeddings, norm="l2", axis=1)
print(embeddings.shape)
# => (2, 1024)

5.3 acge_text_embedding优点总结

性能优势

  1. acge模型较小,占用资源少;
  2. 模型输入文本长度为1024,满足绝大部分场景的需求
  3. acge模型支持可变输出维度,能够根据具体场景去合理分配资源。

框架优势

  1. 对比学习技术,通过最小化正对之间的距离和最大化负对之间的距离来呈现文本语义表示。
  2. 数据挖掘,构造多场景、数量庞大的数据集提升模型泛化能力,挑选高质量数据集加快模型收敛。
  3. 多任务混合训练,多loss适配场景,适应各种下游任务
  4. MRL训练,训练可变维度的嵌入,提高了处理速度,降低了存储需求
  5. 持续学习, 改善引入新数据后模型灾难性遗忘问题

总结

本文主要探讨了检索增强型生成模型(RAG)在私有领域知识问答和企业知识管理中的应用,重点分析了文档解析的准确性对RAG系统性能的影响,介绍了智能文档解析的关键技术,并介绍了合合信息自研的文档解析服务TextIn,以及开源的文档解析质量评测工具Markdown Tester。此外,还介绍了合合信息开发的文本向量嵌入模型acge_text_embedding,强调了其在RAG系统中的作用和优势。整体而言,文档解析的准确性、速度和质量对RAG系统的性能至关重要,而TextIn和acge_text_embedding等工具能够显著提升文档解析的效果和效率。

TextIn体验

TextIn文档解析产品目前正火热进行内测阶段,并向用户提供海量免费额度体验。

海量额度: 特别为每位用户准备了每周高达7000页的免费解析额度。此外,针对RAG和Agent用户,参与内测将每周额外提供的2万页(价值1000元)的免费额度。

参考文献

  • Markdown Tester:https://github.com/intsig/markdown_tester
  • TextIn:https://www.textin.com/experience/pdf_to_markdown?from=acg-github
  • acge_text_embedding:https://huggingface.co/aspire/acge_text_embedding

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot是如何简化Spring开发的,以及SpringBoot的特性以及源码分析

目录 1.什么是springboot 2.配置文件的优先级 2.1 配置文件的优先级 2.2 系统配置以及命令行配置 3.Bean对象的管理 3.1 如何获取对应的bean对象 3.2 bean的作用域 3.3 声明第三方bean Component 及衍生注解 与 Bean注解使用场景? 如何查看项目已有的bean对象&…

Nginx学习-相关概念

Nginx学习-相关概念 主要学习几个概念:Nginx,正向代理、反向代理、负载均衡、动静分离。–2020年05月29日 什么是Nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。 特点是占有内存少&…

动态住宅IP和静态住宅IP主要区别是什么?

在互联网连接的世界中,IP地址是我们识别和访问网络资源的关键。住宅IP地址,特别是动态住宅IP和静态住宅IP,是两种不同类型的IP分配方式,它们在使用和功能上存在显著差异。 1. IP地址的稳定性 动态住宅IP:这种IP地址是…

计算机组成原理面试知识点总结1

#ウルトラマンゼット(泽塔) 1 计算机发展历程 1.1 计算机的硬件发展 电子管时代晶体管时代中小规模集成电路时代超大规模集成点电路时代 元件更新变化: 摩尔定律:18 个月晶体管翻一倍半导体存储器不断发展微处理器不断发展 1.2…

html+css 实现简约社交分享按钮

效果 原理解析 1.事件是由a标签的hover触发的 2.动画效果是transition动画效果 上代码&#xff0c;可以直接复制使用 目录 html <!DOCTYPE html> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"…

环境变量配置文件中两种路径添加方式

环境变量配置文件中两种路径添加方式 文章目录 环境变量配置文件中两种路径添加方式代码示例区别和作用 代码示例 export HBASE_HOME/opt/software/hbase-2.3.5 export PATH$PATH:$HBASE_HOME/binexport SPARK_HOME/opt/software/spark-3.1.2 export PATH$SPARK_HOME/bin:$PAT…

抖音客户端一面

C | 字节抖音客户端一面 Http握手过程 1. 客户端问候(Client Hello) 客户端向服务器发送一个“问候”消息&#xff0c;其中包含客户端支持的SSL/TLS版本、加密算法、压缩方法以及一个随机数。 version 版本号,https也有版本号哦TLS 1.0、TLS 1.1、TLS 1.2等等 random 随机数…

使用API有效率地管理Dynadot域名,设置待删除域名抢注请求

简介 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…

爬虫学习2:爬虫爬取网页的信息与图片的方法

爬虫爬取网页的信息与图片的方法 爬取人物信息 import requestshead {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0" } # 这是get请求带参数的模式…

了解Linux中的shell脚本

目录 1、什么是shell 2、编写第一个shell文件 3、shell的权限 4、变量 5、 shell传递参数 6、shell数组 7、shell基本运算符 7.1 算术运算符 7.2 关系运算符 7.3 布尔运算符 7.4 逻辑运算符 7.5 字符串运算符 8、控制语句 8.1 if 8.2 for 8.3 while语句 9、其他 1、…

C#初级——条件判断语句和循环语句

条件判断语句 简单的条件判断语句&#xff0c;if()里面进行条件判断&#xff0c;如果条件判断正确就执行语句块1&#xff0c;如果不符合就执行语句块2。 if (条件判断) { 语句块1 } else { 语句块2 } int age 18;if (age < 18){Console.WriteLine("未…

Anaconda安装-超详细版(2023)

Anaconda安装 - 超详细版&#xff08;2023&#xff09; 前言&#xff1a;彻底卸载pythonAnaconda下载地址安装详细步骤配置环境变量检验安装是否成功更改conda源&#xff08;后续安装第三方库可以加快速度&#xff09;超详细彻底卸载Anaconda教程Tensorflow-gpu 安装 前言&…

ORBSLAM3 ORB_SLAM3 Ubuntu20.04 ROS Noetic 虚拟机镜像 下载

下图是build.sh 和 build_ros.sh编译结果截图&#xff1a; slam数据集测试视频&#xff1a; orbslam3 ubuntu20.04 test 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1nre0Y9vig5QXIGU52qCLbQ?pwd9rbi 提取码&#xff1a;9rbi

【系列教程之】1、点亮一个LED灯

1、点亮一个LED灯 作者将狼才鲸创建日期2024-07-23 CSDN教程目录地址&#xff1a;【目录】8051汇编与C语言系列教程本Gitee仓库原始地址&#xff1a;才鲸嵌入式/8051_c51_单片机从汇编到C_从Boot到应用实践教程 本源码包含C语言和汇编工程&#xff0c;能直接在电脑中通过Keil…

【iOS】内存五大分区

目录 堆&#xff08;Heap&#xff09;是什么五大分区栈区堆区全局/静态区常量区&#xff08;即.rodata&#xff09;代码区&#xff08;.text&#xff09; 函数栈堆和栈的区别和联系图解 OC语言是C语言的超集&#xff0c;所以先了解C语言的内存模型的内存管理会有很大帮助。C语言…

常识判断1

1.法律 &#xff08;1&#xff09;行政法 &#xff08;2&#xff09;刑法 3.新公务员法 &#xff08;4&#xff09;宪法 &#xff08;5&#xff09;民法 &#xff08;6&#xff09;监察法 &#xff08;7&#xff09;婚姻法 &#xff08;8&#xff09;反不正当竞争法

二次元手游《交错战线》游戏拆解

交错战线游戏拆解案 游戏亮点即核心趣味 一、关键词&#xff1a; 回合制游戏、二次元、机甲、横板、剧情、养成、异星探索。 二、游戏亮点&#xff1a; 符合目标群体审美的原画。 三、核心趣味&#xff1a; 抽卡、肝或者氪金解锁新皮肤。 核心玩法及系统规则 核心玩法&…

英特尔终于宣布了解决CPU崩溃和不稳定性问题的方法,声称过高的电压是根本原因;补丁预计将于8月中旬推出【更新】

英特尔终于宣布了解决CPU崩溃和不稳定性问题的方法&#xff0c;声称过高的电压是根本原因&#xff1b;补丁预计将于8月中旬推出【更新】 英特尔官方宣布&#xff0c;已找到困扰其CPU的崩溃问题的根本原因&#xff0c;并将于8月中旬前发布微码更新以解决这一问题&#xff0c;从而…

Godot游戏制作 02玩家1.0版

Unity大神&#xff0c;YouTube百万游戏开发者的启蒙老师&#xff0c;Brackeys&#xff0c;携 Godot 新手教程&#xff0c;正式回归。 转自&#xff1a;https://youtu.be/LOhfqjmasi0?si4RguI6-pXHZ2mk9K 资产&#xff1a;https://brackeysgames.itch.io/brackeys-platformer-b…

SpringBoot3整合Druid报错Cannot load driver class: org.h2.Driver

报错显示springboot自带的H2数据库报错&#xff0c;其实是因为druid并未加载进去。如果你其它配置都没问题的话&#xff0c;请检查druid的依赖是什么版本的&#xff0c;因为springboot3刚开始是不支持druid的。 方案一&#xff1a; 即需要手动在resources目录下创建META-INF/s…