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

news2024/11/15 4:04:02

前言

在私有领域知识问答和企业知识管理领域,结合检索增强型生成模型(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 json

def 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_id
        self._app_secret = app_secret
        self.host = 'https://api.textin.com'

    def recognize_pdf2md(self, image, options):
        """
        pdf to markdown
        :param options: request params
        :param image: file bytes
        :return: response

        options = {
            '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 SentenceTransformer

sentences = ["数据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 SentenceTransformer

sentences = ["数据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.coloradmin.cn/o/1939646.html

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

相关文章

【Elasticsearch7】3-基本操作

目录 RESTful 数据格式 HTTP操作 索引操作 倒排索引 创建索引 查看所有索引 查看单个索引 删除索引 文档操作 创建文档 查看文档 ​编辑 全量修改 ​编辑局部修改 删除文档 条件删除文档 高级查询 条件查询 URL带参查询 请求体带参查询 带请求体方式的查…

STM32的ADC详解

目录 一、ADC简介 二、ADC的时钟 三、ADC特性 四、ADC功能说明 五、规则通道和注入通道 1.规则通道 2.注入通道 3.区别 六、数据寄存器 1.右对齐 2.左对齐 七、转换模式 1.单次转换模式 2.续转换模式 3.扫描模式 4.区别 八、程序实现 1.需求 2.ADC初始化 3.A…

InfiniBand网络-赋能高性能计算的卓越引擎

InfiniBand:赋能高性能计算网络的卓越引擎 InfiniBand作为一种先进的内网计算平台,已成为驱动高性能计算(HPC)、人工智能(AI)以及超大规模云基础设施演进的核心力量,其展现出无可比拟的性能优势…

mongodb数据导出与导入

一、先去检查mongodump mongodump --version 如果报 mongodump version: built-without-version-string 或者其他的较老的版本,直接去下载最新的【传送门】 【以Ubuntu18.04为例】 安装工具 假设你下载的是 .tgz 文件(适用于 Linux 系统)&am…

Java中SPI机制原理解析

使用SPI机制前后的代码变化 加载MySQL对JDBC的Driver接口实现 在未使用SPI机制之前,使用JDBC操作数据库的时候,一般会写如下的代码:// 通过这行代码手动加载MySql对Driver接口的实现类 Class.forName("com.mysql.jdbc.Driver") Dr…

鸿蒙开发error: failed to start ability

鸿蒙开发项目编译过后不能启动 项目在模拟器运行报: error: failed to start ability. Error while Launching ability 解决办法: 1,看了一些文章说是把module.json5配置文件中的"exported"由false改成true,没有解…

Python 实现股票指标计算——BIAS

BIAS (Bias Ratio) - 乖离率 1 公式 BIAS (当日收盘价 - N日平均收盘价) ➗ N日平均收盘价 ✖ 100% N一般取6、12、24 2 数据准备 我们以科创50指数 000688 为例,指数开始日期为2019-12-31,数据格式如下: 3 计算过程 def c…

Java 中的异常

异常:就是出现的问题。 在Java中异常被当成对象进行处理,所有的异常类都继承于Throwable类,如果Java提供的异常类并不能满足需求,用户还可以自己定义一个异常类。 下面是异常体系结构: Throwable又分成了Error和Exce…

《无所不能的JavaScript · 对象简介》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

OpenStack Yoga版安装笔记(七)glance练习补充

1、练习场景说明 在OpenStack Yoga版安装笔记(五)中,glance已经在controller node虚拟机上安装完成,并且已经成功拍摄了快照。 此时,controller node虚机已经安装了keystone、keystone DB、glance、glance DB、OpenSta…

利用【MATLAB】和【Python】进行【图与网络模型】的高级应用与分析】

目录 一、图与网络的基本概念 1. 无向图与有向图 2. 简单图、完全图、赋权图 3. 顶点的度 4. 子图与连通性 5. 图的矩阵表示 MATLAB代码实例 Python代码实例 二、最短路径问题 1. 最短路径问题的定义 2. Dijkstra算法 MATLAB代码实例 Python代码实例 三、最小生…

昇思MindSpore学习总结十七 —— 基于MindSpore通过GPT实现情感分类

1、要求 2、导入了一些必要的库和模块 以便在使用MindSpore和MindNLP进行深度学习任务时能使用各种功能,比如数据集处理、模型训练、评估和回调功能。 import os # 导入操作系统相关功能的模块,如文件和目录操作import mindspore # 导入MindSpore库&a…

入门C语言只需一个星期(星期六)

点击上方"蓝字"关注我们 01、创建结构体 struct MyStructure { // 结构声明 int myNum; // 成员(int 变量) char myLetter; // 成员(char 变量)}; // 用分号结束结构创建一个名为 s1 的结构变量​struct myStru…

# Redis 入门到精通(九)-- 主从复制(1)

Redis 入门到精通(九)-- 主从复制(1) 一、redis 主从复制 – 主从复制简介 1、互联网“三高”架构 高并发高性能高可用 2、你的“Redis”是否高可用? 1)单机 redis 的风险与问题 问题1.机器故障  现…

kafka服务介绍

kafka 安装使用管理 Kafka Apache Kafka 是一个开源的分布式事件流平台,主要用于实时数据传输和流处理。它最初由 LinkedIn 开发,并在 2011 年成为 Apache 基金会的顶级项目。Kafka 设计的目标是处理大规模的数据流,同时提供高吞吐量、低延迟…

C语言 通讯录管理 完整代码

这份代码,是我从网上找的。目前是能运行。我正在读。有些不懂的地方,等下再记录下来。 有些地方的命名,还需要重新写一下。 比如: PersonInfo* info &address_book->all_address[address_book->size]; 应该改为: Perso…

C#实现数据采集系统-实现功能介绍

系统介绍 我们这里主要使用C#( .Net 6)来实现一个数据采集系统,从0到1搭建数据采集系统,从系统分析,功能拆解,到一一实现 数据采集 数据采集是企业信息化和数字化转型过程中的关键环节,它涉及到从生产设备、传感器…

Microsoft Visual C++ 2010 Express 使用

Microsoft Visual C 2010 Express 使用 Microsoft Visual C 2010 Express(简称VC 2010 Express)是一款免费的集成开发环境(IDE),专为C和C语言的开发者设计。 安装 下载|本站链接【VC2010简体中文版】的安装包并解压…

2024年新手卖家该如何做好亚马逊运营?

随着电子商务的蓬勃发展,越来越多的新手卖家选择在亚马逊这一国际电商巨头平台上开展业务。然而,想要在竞争激烈的市场中脱颖而出,新手卖家需要精心规划并执行有效的运营策略。以下是为2024年新手卖家提供的关于如何做好亚马逊运营的一些建议…

C#学习-刘铁猛

文章目录 1.委托委托的具体使用-魔板方法回调方法【好莱坞方法】:通过委托类型的参数,传入主调方法的被调用方法,主调方法可以根据自己的逻辑决定调用这个方法还是不调用这个方法。【演员只用接听电话,如果通过,导演会…