建模杂谈系列246 数据模型

news2024/9/21 12:42:34

说明

如果说微服务化(API接口、Web页面、Docker镜像)是架构方面的基准,那么数据模型就是逻辑处理方面的基准

内容

以下是一个样例:

import re

def extract_utf8_chars(input_string = None):
    # 定义一个正则表达式,用于匹配所有的UTF-8字符
    utf8_pattern = re.compile(r'[\u0000-\U0010FFFF]')
    
    # 使用findall方法找到所有匹配的字符
    utf8_chars = utf8_pattern.findall(input_string)
    
    return ''.join(utf8_chars)

def toDBC(some_char):
    tem_str_ord = ord(some_char)
    res = None 
    if tem_str_ord >65280 and tem_str_ord < 65375:
        res =tem_str_ord - 65248
    # 12288全角空格,160 &nbsp空格
    if tem_str_ord in [12288,160]:
        res = 32
    res_var_ord = res or tem_str_ord
    return chr(res_var_ord)
def tranform_half_widh(some_str = None):
    res_list = []
    return ''.join([toDBC(x) for x in some_str])

# 强分割
import re
def split_sentences_with_punctuation(text):
    # 定义句子分隔符
    punctuation = r'([。?!?!\n])'
    # 根据句子分隔符进行分割,并保留分隔符
    parts = re.split(punctuation, text)
    # 将分隔符与句子重新组合
    sentences = []
    for i in range(0, len(parts), 2):
        sentence = parts[i].strip()
        if i + 1 < len(parts):
            sentence += parts[i + 1]
        sentences.append(sentence)
    return sentences


import re

def ensure_period(sentence= None):
    """
    如果句子不是以句号、问号、感叹号或者感叹问号结尾,则在结尾添加一个句号。
    
    参数:
    sentence (str): 待检查的句子。
    
    返回:
    str: 添加句号后的句子。
    """
    # 使用正则表达式匹配句子末尾的标点符号
    if not re.search(r'[。?!?!]$', sentence):
        sentence += '。'
    return sentence

# 强分割断句,确保末尾的强分隔符。
from typing import List, Optional
from pydantic import BaseModel,FieldValidationInfo, field_validator

class Item(BaseModel):
    doc_id:str
    content:str

    # 验证器:确保 content 以强分隔符结尾
    @field_validator('content',mode='before')
    def ensure_utf8_and_halfwidth(cls, v):
        v = tranform_half_widh(extract_utf8_chars(v))  # 转换为半角字符
        return v

# 给到一个document,将之分割为句子
class DocumentSplit(BaseModel):
    input_data_listofdict: List[Item] = [{'doc_id':'1', 'content':'这是第一篇文章。'}, {'doc_id':'2', 'content':'这是第二篇文章。'}]

使用propery

from pydantic import BaseModel

class User(BaseModel):
    first_name: str
    last_name: str

    @property
    def full_name(self):
        return f"{self.first_name} {self.last_name}"

    @property
    def full_name2(self):
        return self.full_name.upper()

    def dict(self):
        data = {}
        data['first_name'] = self.first_name
        data['last_name'] = self.last_name
        data['full_name'] = self.full_name
        data['full_name2'] = self.full_name2
        return data


#  property 属性是计算属性,需要时生成,不占空间,同时也不会随默认的dict方法输出


# 创建一个User对象
user = User(first_name='John', last_name='Doe')

# 使用dict()方法输出,包含full_name和full_name2
user_dict = user.dict()
print(user_dict)  # 输出: {'first_name': 'John', 'last_name': 'Doe', 'full_name': 'John Doe', 'full_name2': 'JOHN DOE'}

以上大致展示了pydantic的一个使用。

1 数据模型

以前一直有类似pydantic的想法,构造一个中间对象来进行数据的校验和传递。做了一些实验,但是都不太满意。随着大模型的兴盛,我才注意到这个工具。大模型之所以要用这个,大约是因为数据传递的复杂性很容易出错,尤其是langchain类型的任务。

总体上来说,数据模型在大型的、长期的、复杂的数据处理任务中有非常重要的作用。一个显而易见的问题是,我们没办法在有限的资源下,约束自己,约束他人,约束数据。

例如,由于我们记忆力、精力的天然局限,我们甚至不记得自己1个月前些的代码为什么要这么做。-- 难以约束自己

我们在项目协同中,无法告知其他人,需要输出什么样的数据。 – 难以约束他人

数据问题通常会以一种情理之中、意料之外的情况发生。 – 难以约束数据

所以,如果为每一个重要的数据节点都设置了数据模型,我们就可以很大程度上避免这些问题。

从整个数据处理来看,如果从图的角度分析,那么会有点(数据节点)和边(处理过程)。

数据节点是一些非常重要的数据形态持久化。

在一些特殊的里程碑事件上,我们需要确保数据是可观察的。例如,数据的创建阶段,我们需要看到数据,确保这个初始阶段的结果是可靠的。在过程中,可能又分为几个重要阶段,例如模式识别分类。最后,我们准备将数据交付到产品或者客户的数据库里。

在这些里程碑阶段我们都非常清楚业务上的要求和期待是什么,而且需要让其他相关的人也可以看得到(以便分工或者交付)。

数据节点是复杂过程的接力棒。

在大型数据处理过程中我们无法对每一个过程中的数据进行数据存储和展示:

  • 1 我们没有足够的时间把事情做到如此的粒度
  • 2 存储每一个过程带来的数据存储成本太高了
  • 3 很多时候只是程序访问这些数据节点,人并不关注

但是,在开发、运行和调试的过程中,我们需要数据模型。

  • 1 开发时,我们需要向其他人,甚至是未来的自己说明这个步骤的输入和输出是什么
  • 2 运行时,确保我们的输出是可靠的,不符合数据模型的数据根本进不来。如果出错了,大的衔接步骤很快可以发现。
  • 3 调试时,顺着数据模型向下走,容易找到问题点。

2 任务对象

最近做了不少的实践,以下我觉得比较适合作为ending。

在处理大规模、复杂和长期的任务时,必然要进行分布式计算。在调度之前,如果我们能做好planning,那么就会高效很多。

可靠性与效率就像 Precision和Recall一样,是一对对冲子。

在这里插入图片描述

以下是我的对象,以前有做过一些任务系统设计的实验,最终没有数据模型,也就没有固化下来。下面的模型设计是为了确保NoSQL和SQL数据库都可以存储的(In Case我也不知道最终后面用哪种)。所以,也可以看到数据模型是抽象的,独立与数据库类型的设计,是松耦合设计。

from typing import List, Optional,Dict
from pydantic import BaseModel

# 标准任务 这个任务定义是块级别的 - 表 - rabbitmq 分发
class AndyBlockTask(BaseModel):
    # 命名部分
    name  : str 
    tier1 : str
    tier2 : str 
    ord_id : int # 按顺序编号
    
    # UCS部分 
    shard : int = 0
    part : int = 0 
    block : int = 0
    brick : int

    # uri: 资源访问路径:主要是为了各种数据库兼容,最佳是字典。可以把这个作为一个短链,让worker执行时再去拿。
    uri : str

    # 基本设定
    timeout : int = 600
    max_retries : int = 3

    # 任务执行部分
    is_claimed : int = 0
    is_done : int = 0
    is_error : int = 0
    

    # ---- 执行时信息 

    last_claimed_time : Optional[str]  
    done_time : Optional[str] 
    done_duration: Optional[int] 

    # 任务统计
    timeout_cnt : int = 0 
    execute_cnt : int = 0 # 被认领次数,用于限定再次分发
    worker_info : Optional[str] # 执行者信息
    worker_comments : Optional[str] # worker返回的信息,主要是与异常相关的
    worker_get_data_duration: Optional[int] # 获取数据的时间
    worker_process_data_duation: Optional[int] # 处理数据的时间
    
    # 主键
    @property
    def pid(self):
        return '.'.join([self.tier1, self.tier2, self.name, str(self.ord_id)])
    
    # ucs名称-在块状表中也是pk, 在明细数据表中是索引
    @property
    def brick_name(self):
        return '.'.join([str(self.shard),str(self.part),str(self.block), str(self.brick)])

    
    def dict(self):
        data_dict = {}
        # 主键/索引
        data_dict['pid'] = self.pid 
        data_dict['brick_name'] = self.brick_name 

        # 命名
        data_dict['name'] = self.name 
        data_dict['tier1'] = self.tier1 
        data_dict['tier2'] = self.tier2 
        data_dict['ord_id'] = self.ord_id 

        # UCS部分 
        data_dict['shard'] = self.shard 
        data_dict['part'] = self.part 
        data_dict['block'] = self.block 
        data_dict['brick'] = self.brick

        # uri: 任务数据源
        data_dict['uri'] = self.uri

        # 基本设定
        data_dict['timeout'] = self.timeout
        data_dict['max_retries'] = self.max_retries

        # 任务执行部分
        data_dict['is_claimed'] = self.is_claimed
        data_dict['is_done'] = self.is_done
        data_dict['is_error'] = self.is_error

        # 任务执行时信息
        data_dict['last_claimed_time'] = self.last_claimed_time
        data_dict['done_time'] = self.done_time
        data_dict['done_duration'] = self.done_duration

        data_dict['worker_info'] = self.worker_info
        data_dict['worker_comments'] = self.worker_comments
        data_dict['worker_get_data_duration'] = self.worker_get_data_duration
        data_dict['worker_process_data_duation'] = self.worker_process_data_duation

        # 任务执行统计
        data_dict['timeout_cnt'] = self.timeout_cnt
        data_dict['execute_cnt'] = self.execute_cnt # 被认领次数,用于限定再次分发

在这里插入图片描述

在使用的时候,可以先将任务进行规划后写入某个数据库中。然后调度程序将这些任务发到消息队列(RabbitMQ)中,然后由对应的worker进行响应。

在一段时间之后,调度程序会根据执行结果决定是否重发。

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

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

相关文章

OpenStack Yoga版安装笔记(十一)nova安装(上)

1、官方文档 OpenStack Installation Guidehttps://docs.openstack.org/install-guide/ 本次安装是在Ubuntu 22.04上进行&#xff0c;基本按照OpenStack Installation Guide顺序执行&#xff0c;主要内容包括&#xff1a; 环境安装 &#xff08;已完成&#xff09;OpenStack…

一文详解大模型蒸馏工具TextBrewer

原文&#xff1a;https://zhuanlan.zhihu.com/p/648674584 本文分享自华为云社区《TextBrewer&#xff1a;融合并改进了NLP和CV中的多种知识蒸馏技术、提供便捷快速的知识蒸馏框架、提升模型的推理速度&#xff0c;减少内存占用》&#xff0c;作者&#xff1a;汀丶。 TextBre…

谷粒商城实战笔记-122~124-全文检索-ElasticSearch-分词

文章目录 一&#xff0c;122-全文检索-ElasticSearch-分词-分词&安装ik分词二&#xff0c;124-全文检索-ElasticSearch-分词-自定义扩展词库1&#xff0c;创建nginx容器1.1 创建nginx文件夹1.2 创建nginx容器获取nginx配置1.3 复制nginx容器配置文件1.4 删除临时的nginx容器…

《Milvus Cloud向量数据库指南》——什么是高可用:深入理解数据库系统中的高可用性架构

什么是高可用:深入理解数据库系统中的高可用性架构 在信息技术日新月异的今天,高可用性(High Availability,简称HA)已成为衡量一个系统,尤其是数据库系统稳定性和可靠性的重要标准。高可用性的核心目标在于确保系统能够持续不断地提供服务,最大限度地减少因维护活动、硬…

从零开始安装Jupyter Notebook和Jupyter Lab图文教程

前言 随着人工智能热浪&#xff08;机器学习、深度学习、卷积神经网络、强化学习、AGC以及大语言模型LLM, 真的是一浪又一浪&#xff09;的兴起&#xff0c;小伙伴们Python学习的热情达到了空前的高度。当我20年前接触Python的时候&#xff0c;做梦也没有想到Python会发展得怎么…

【初阶数据结构题目】10. 链表的回文结构

链表的回文结构 点击链接做题 思路1&#xff1a;创建新的数组&#xff0c;遍历原链表&#xff0c;遍历原链表&#xff0c;将链表节点中的值放入数组中&#xff0c;在数组中判断是否为回文结构。 例如&#xff1a; 排序前&#xff1a;1->2->2->1 设置数组来存储链表&a…

KubeSphere 最佳实战:探索 K8s GPU 资源的管理,在 KubeSphere 上部署 AI 大模型 Ollama

转载&#xff1a;KubeSphere 最佳实战&#xff1a;探索 K8s GPU 资源的管理&#xff0c;在 KubeSphere 上部署 AI 大模型 Ollama 随着人工智能、机器学习、AI 大模型技术的迅猛发展&#xff0c;我们对计算资源的需求也在不断攀升。特别是对于需要处理大规模数据和复杂算法的 AI…

数据恢复软件:电脑丢失文件,及时使用数据恢复软件恢复!

数据恢复软件什么时候会用到&#xff1f; 答&#xff1a;如果真的不小心删除文件&#xff0c;清空回收站&#xff0c;电脑重装系统等情况发生&#xff0c;我们要懂的及时停止使用电子设备&#xff0c;使用可靠的数据恢复软件&#xff0c;帮助我们恢复这些电子设备的数据&#…

【SQL Server 】故障排除:端口冲突排查、网络问题诊断及日志分析与监控6.1 端口冲突排查

目录 第6章&#xff1a;故障排除 端口冲突排查 示例&#xff1a;使用 PowerShell 排查端口冲突 网络问题诊断 示例&#xff1a;使用 Wireshark 捕获 SQL Server 网络流量 日志分析与监控 示例&#xff1a;使用 SQL Server Profiler 监控网络连接 安全注意事项 第6章&am…

Celery:Python异步任务处理的终极利器

文章目录 **Celery&#xff1a;Python异步任务处理的终极利器**第一部分&#xff1a;背景介绍异步任务处理的挑战为什么选择Celery&#xff1f;引入Celery 第二部分&#xff1a;Celery概述什么是Celery&#xff1f; 第三部分&#xff1a;安装Celery使用pip安装Celery 第四部分&…

腰部 KOL 发展潜力预测与企业定制 AI 智能名片 O2O 商城小程序的协同发展

摘要&#xff1a;随着社交媒体和内容创作平台的蓬勃发展&#xff0c;KOL&#xff08;关键意见领袖&#xff09;在品牌推广和营销领域的作用日益凸显。在头部 KOL 资源竞争激烈的当下&#xff0c;腰部 KOL 成为了新的运营重点。然而&#xff0c;挖掘有潜力的腰部 KOL 并非易事。…

【机器学习】重塑游戏世界:机器学习如何赋能游戏创新与体验升级

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f50d;1. 引言&#xff1a;游戏世界的变革前夜&#x1f4d2;2. 机器学习驱动的游戏创新&#x1f31e;智能化游戏设计与开发&…

项目实战_图书管理系统(简易版)

你能学到什么 一个简单的项目——图书管理系统&#xff08;浏览器&#xff1a;谷歌&#xff09;基础版我们只做两个功能&#xff08;因为其它的功能涉及的会比较多&#xff0c;索性就放在升级版里了&#xff0c;基础版先入个门&#xff09; 登录: ⽤⼾输⼊账号,密码完成登录功…

华水2022年专升本计算机培养方案

华水2022年专升本计算机培养方案 文章目录 华水2022年专升本计算机培养方案计科第一学期第二学期第三学期第四学期 软工第一学期第二学期第三学期第四学期 计科 第一学期 通识必修课 大学外语线性代数离散数学 专业基础课 高级语言程序设计 专业选修课 Java 第二学期 通识…

我知道越来越多的专业摄影师在他们的修饰工作流程中使用 Portraiture,因为它可以让你在保持重要纹理的同时使皮肤非常光滑

Portraiture4.5新版功能亮点&#xff1a; 1. 高级皮肤修饰技术&#xff1a;4.5版本引入了更为先进的皮肤修饰算法&#xff0c;能够更自然地平滑皮肤&#xff0c;同时保留必要的皮肤纹理和细节&#xff0c;实现专业级别的人像修饰效果。 Portraiture4.5新版 2. 智能面部特征识…

计算机的错误计算(五十一)

摘要 探讨 的符号。 例1. 请确定 的符号[1]。 在计算过程中&#xff0c;若保留8位、16位、20位有效数字&#xff0c;则计算过程与结果分别如下: 若在Windows 10&#xff0c;Visual Studio 2010下计算&#xff1a; #include <math.h>double ysin(pow(2,(double)1…

Java11.0标准之重要特性及用法实例(二十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…

(四)springboot2.7.6集成activit5.23.0之更换数据源

前面学习时&#xff0c;使用的内存数据库H2&#xff0c;实际使用时&#xff0c;一般会替换我们指定的数据库&#xff0c;这个时候要怎么配置呢&#xff1f; 1.查看activiti-spring-boot-starter-basic的spring.factories配置。 2.查看DataSourceProcessEngineAutoConfigurati…

诗意、甜美、可爱的水果:berry和cherry

我曾经在单词记忆的课上讲过&#xff0c;sweat(汗)和sweet(甜)的记忆之法&#xff0c;是甜这个单词sweet可以拟作甜丝丝来记忆&#xff0c;它是双写的-ee-结构&#xff0c;这样就能很好地与sweat相区别&#xff0c;同样desert(沙漠)和dessert(甜点)也是如此&#xff0c;和甜有关…

策略模式的一次应用

项目的需求是将一组图像按照相似度分类。 采用了模板匹配计算相似度的实现方式。 #include <opencv2/core.hpp> #include <openev2/core/utility.hpp> #include <opencv2/highqui.hpp> #include <openav2/imgproc.hpp> cv::Mat image matched; double …