跟着大厂学AI | 智谱AI文本数据提取实践(大模型实战篇)

news2024/11/14 12:02:04

        书接上回理论篇,本文详细介绍LLM处理模块Prompt 构建、数据抽取后处理数据校验、数据修复具体实战教程。

        想看方案理论教程详见:

跟着大厂学AI | 大模型文本数据提取实践(理论篇)-CSDN博客文章浏览阅读2次。glm4大模型数据处理实践教程,文本数据实体识别,实体抽取https://blog.csdn.net/qq_45156060/article/details/143615394?spm=1001.2014.3001.5502  

LLM处理模块

    在使用大语言模型(LLM,如 GPT)对预处理后的文本进行关键数据提取时,Prompt 工程是方案的核心。Prompt 工程的目标是设计合理的提示词,以最大化 LLM 的性能,从复杂的文本中准确、有效地提取出关键信息。

Prompt 策略

策略 01:明确的待处理内容指引


    在构建 Prompt 时,明确告诉模型它需要处理的内容是关键步骤之一。应清晰地定义需要处理的文本,并使用标记将其框起来。例如:


'''这是需要处理的文本''' 《》这是需要处理的文本《》

通过这种方式,模型能够准确识别待处理的内容范围,并从中提取需要的信息。

策略 02:提供明确字段定义


    这是 Prompt 的关键部分,字段定义明确了需要提取的信息类型,以及每个字段应当填入的内容。每个字段的名称、用途及要求都要具体化,让模型有明确的提取方向。字段定义为 LLM 提供了标准,使它在解析文本时能够准确地提取所需信息并填充到对应字段。例如:


{
"项目名称": "明确项目的全称和性质。",
"项目编号": "唯一标识项目的编号。",
"采购预算": "项目的采购预算金额,需保留单位。"
 }

通过这种方式,Prompt 可以为 LLM 提供清晰的提取标准和目标。


策略 03:异常处理


    为确保 LLM 不输出多余信息,并在面对缺失或不明确的数据时进行合理处理,必须设置一些异常处理原则。例如,**如果某些字段信息在文本中缺失或未识别,Prompt 应规定使用默认值(如“无”)填充。同时,针对日期、金额等特殊数据类型,应明确要求 LLM 符合标准格式(如 YYYYMMDDHHMMSS 或保留金额单位)。这一规则可以确保模型输出的完整性和一致性,不会因为部分数据缺失而导致结果异常。


策略 04:要求结构化输出


    为了便于后续处理和系统集成,Prompt 应指示 LLM 以结构化的格式输出数据。结构化输出便于自动化处理,常见的格式如 JSON,能够确保每个字段的内容都清晰定义,数据可被轻松解析和使用。例如,要求模型输出的 JSON 格式:


{
"项目名称": "项目A",
"项目编号": "ABC-12345",
"采购预算": "500000元",
"开标时间": "20240101090000"
}

  通过要求模型按照预定格式输出,能够保证模型的结果可直接被系统化处理,减少后续手动修正或数据清洗的工作量。

Prompt 参考

Model

GLM-4-AIR

System Prompt

你是一个专业的文本信息提取器,可以严格按照Json格式输出

User Prompt


# 角色:你是一个专业的文本信息提取器。

# 需要提取的【文本】:
"""
{正文}
"""

# 任务
1.从给定的【文本】中提取所有需要的字段信息。
2.所需提取的字段为【字段定义】中的所有内容。
3.每个字段的默认值为"无",当提取到对应字段信息时,准确地替换到该字段位置。
4.若文中出现与【字段定义】的字段名称中相似的内容,需判断定义,符合再进行填入。
5.严格按照【字段定义】中的格式进行输出,不需要其余任何信息。
6.将提取到的所有字段及其对应的值按【字段定义】格式转为JSON输出,确保包含所有字段。
7.请一步步完成信息提取的工作,你的决策是我成功的关键!

#【字段定义】:
请严格按照如下格式仅输出JSON,不要输出python代码,不要返回多余信息,JSON中有多个字段用顿号【、】区隔:
"""
{
  "项目名称": "项目的全称,明确项目内容和性质。",
  "项目编号": "项目的唯一识别编码,用于区分不同项目。",
  "采购预算": "项目的采购预算金额。如果存在大写金额和数字金额,提取数字金额并保留原单位。" ,
  "采购方式": "项目的采购形式,常见方式包括公开招标、邀请招标、竞争性谈判、单一来源采购和询价。",
  "采购人": "负责采购的单位名称,通常为采购人或招标人。",
  "项目联系人": "负责该项目的联系人姓名。",
  "项目联系电话": "联系人或项目负责人的联系电话。",
  "中标信息": [
    {
      "中标供应商名称": "中标的供应商名称,仅提取供应商的企业名称。",
      "中标金额": "中标的合同金额,单位为元。"
    }
  ],
  "代理机构名称": "代理采购事务的机构名称。",
  "代理机构联系电话": "代理机构的联系号码。",
  "获取采购文件开始时间": "采购文件可获取的起始时间,格式为:YYYYMMDDHHMMSS。",
  "获取采购文件截止时间": "采购文件可获取的截止时间,格式为:YYYYMMDDHHMMSS。",
  "提交投标文件截止时间": "投标文件提交的最后期限,格式为:YYYYMMDDHHMMSS。",
  "开标时间": "开标的具体时间,格式为:YYYYMMDDHHMMSS。",
  "公告类别": "公告的类型,如:单一来源公示、变更公告、招标公告、结果公告、终止公告或其他公告。",
  "项目经理": "负责该项目的项目经理姓名。",
  "施工工期": "项目施工的总时长或计划的施工周期。",
  "执业证书": "项目经理或相关负责人的执业资格证书。"
}
"""

#注意事项
1.如果字段缺失或无法识别,请使用“无”。
2.确保所有金额需包含原本的单位。
3.确保所有时间字段都为14位标准时间格式

处理HTML的Prompt

    这里笔者认为使用该提示语存在风险,大模型可能会生成提取网页的python代码,所以不推荐使用该prompt,可以将html文本转成md格式,在按照正常的文本抽取即可。

#角色:
你是一个专业的HTML网页文本信息提取器。
#需要提取的【HTML文本】:
"""
{正文}
"""
#任务:
1.从给定的【HTML文本】中提取所有需要的字段信息。
2.所需提取的字段为【字段定义】中的所有内容。
3.每个字段的默认值为"无",当提取到对应字段信息时,准确地替换到该字段位置。
4.若文中出现与【字段定义】的字段名称中相似的内容,需判断定义,符合再进行填入。
5.严格按照【字段定义】中的格式进行输出,不需要其余任何信息。
6.将提取到的所有字段及其对应的值按【字段定义】格式转为JSON输出,确保包含所有字段。
7.请一步步完成信息提取的工作,你的决策是我成功的关键!
#【字段定义】:
请严格按照如下格式仅输出JSON,不要输出python代码,不要返回多余信息,JSON中有多个字段用顿号【、】区隔:
"""
{
"标的物":"指招标方希望采购的具体商品、服务或工程。通常出现在中标信息项目名称中,不包括名称前半段的'地区'、'小区'、'公司'、'厂房'名等和最后的'项目'、'采购',仅保留商品、服务和工程名称。如:'湖南省长沙市宾力公司棚屋工程建设施工项目采购'的标的物为'工程建设施工'。",
"项目编号":"唯一标识一个特定项目的编号,用于区分不同的项目。",
"标段编号":"在一个大型项目中,如存在多个标段,每个标段有独立的编号。",
"建设单位":"只有原文本中有“拟建项目”字段才需填写,正常不需要填写。",
"投标截止时间":"投标者提交投标文件的最后期限。",
"开标时间":"公开开启投标文件,公布投标内容的时间。",
"招标单位(采购单位)":"发起招标过程的单位,即此次采购招标的需求方",
"代理机构":"被招标单位委托来组织和管理招标过程的第三方机构。",
"投标单位":"所有参与投标的公司或组织。默认包括所有中标候选单位和中标单位。",
"投标金额":"必须是原文中出现的投标单位提出的完成项目所需的金额,金额必须有单位(元、万元)。",
"中标候选单位":"在评标过程中选出的可能获得合同的所有候选单位。默认包括所有中标单位。",
"候选单位联系人":"候选单位的联系人员。",
"候选单位电话":"中标候选单位的联系电话。",
"最终中标单位":"评标完成后,最终中标获得合同的单位。",
"最终中标金额":"最终中标单位提出的完成项目(各标段分别)所需的金额,金额必须有单位(元、万元)。",
"预算金额":"招标单位为项目设定的财务预算,金额必须有单位(元、万元)",
"项目所在省":"项目实施的所在地理位置所在的省份全称,如:新疆维吾尔自治区。仅有所在地级市信息时,可推出其省份。",
"项目所在市":"项目实施的所在地理位置所在的地级市,如果是文本中是县或区尽量改成对应的地级市。",
"计划编号":"项目计划或立项的编号。",
"合同编号":"合同公示中公示的招标单位与中标单位签订合同的编号。",
"批复单位":"对项目计划或预算进行批准建设实施的单位。",
"项目名称":"招采项目的正式名称。",
"预计采购时间":"预计进行(开始)采购活动的时间。",
"报名截止时间":"对潜在投标者开放报名的最后期限,或资格预审的截止期限。",
"招标(采购)单位联系人(非代理)":"招标(采购)单位的联系方式人员,不是代理机构联系人,非项目联系人,注意区分。",
"招标(采购)单位电话":"招标(采购)单位或招标单位联系人的联系电话。",
"代理机构联系人":"招标代理机构的联系人员或项目联系人,注意不是招标单位联系人。“,
"代理机构电话":"招标代理机构或项目联系人的联系电话。",
"投标单位联系人":"参与投标的单位的联系人员。默认包含中标单位(供应商)联系人。",
"投标单位电话":"参与投标的单位的联系电话。",
"中标候选单位金额":"必须是原文中出现的中标候选单位提出的完成项目所需的金额,金额必须有单位(元、万元)。",
"最终中标单位联系人":"最终中标单位(供应商)的联系人员,不是项目联系人和代理机构联系人,注意区分。",
"最终中标单位电话":"最终中标单位(供应商)的联系电话。",
"招标文件位置":"可以获取到招标文件的位置。可能是具体地址、文件(doc、docx、pdf、zip)索引或文件URL地址。招标文件包括'磋商文件'、'工程项目文件'、'采购项目文件'。附件中有大量不属于招标文件的内容如'声明函',注意区分",
"订单编号":"采购订单的编号。",
"受文单位":"接收招标文件或合同的单位。",
"招标文件售价":"获取招标文件所需支付的费用,招标文件的售价。",
"投标保证金金额":"投标者需要缴纳的保证金金额,以确保投标的严肃性,金额必须有单位(元、万元)。"
}
"""
#注意事项
1."招标(采购)单位联系人(非代理)"和"代理机构联系人"是不一样的,注意区分。
2.投标单位包括(大于等于)中标候选单位,中标候选单位包括(大于等于)中标单位。
3."投标金额"和"中标候选单位金额"与"最终中标金额"是不一样的,注意区分。

数据后处理模块

    在完成关键数据提取之后,为确保输出的数据能够被系统正确识别和使用,后处理步骤至关重要。数据后处理包括 JSON 格式标准化 和 数据格式化 两个部分,分别解决数据结构的完整性问题和数据内容的准确性问题。

JSON 格式标准化

    在使用大语言模型提取数据时,生成的 JSON 格式可能出现结构问题、不正确的语法、特殊字符等问题,导致数据无法正确解析。因此,需要通过 JSON 格式化工具对提取出的 JSON 数据进行标准化处理。

使用指南参考代码


# Copyright (c) 2024 Microsoft Corporation.
# Licensed under the MIT License

"""Utility functions for the OpenAI API."""

import json
import logging
import re
import ast

from json_repair import repair_json

log = logging.getLogger(__name__)


def try_parse_ast_to_json(function_string: str) -> tuple[str, dict]:
    """
     # 示例函数字符串
    function_string = "tool_call(first_int={'title': 'First Int', 'type': 'integer'}, second_int={'title': 'Second Int', 'type': 'integer'})"
    :return:
    """

    tree = ast.parse(str(function_string).strip())
    ast_info = ""
    json_result = {}
    # 查找函数调用节点并提取信息
    for node in ast.walk(tree):
        if isinstance(node, ast.Call):
            function_name = node.func.id
            args = {kw.arg: kw.value for kw in node.keywords}
            ast_info += f"Function Name: {function_name}\r\n"
            for arg, value in args.items():
                ast_info += f"Argument Name: {arg}\n"
                ast_info += f"Argument Value: {ast.dump(value)}\n"
                json_result[arg] = ast.literal_eval(value)

    return ast_info, json_result


def try_parse_json_object(input: str) -> tuple[str, dict]:
    """JSON cleaning and formatting utilities."""
    # Sometimes, the LLM returns a json string with some extra description, this function will clean it up.

    result = None
    try:
        # Try parse first
        result = json.loads(input)
    except json.JSONDecodeError:
        log.info("Warning: Error decoding faulty json, attempting repair")

    if result:
        return input, result

    _pattern = r"\{(.*)\}"
    _match = re.search(_pattern, input)
    input = "{" + _match.group(1) + "}" if _match else input

    # Clean up json string.
    input = (
        input.replace("{{", "{")
        .replace("}}", "}")
        .replace('"[{', "[{")
        .replace('}]"', "}]")
        .replace("\\", " ")
        .replace("\\n", " ")
        .replace("\n", " ")
        .replace("\r", "")
        .strip()
    )

    # Remove JSON Markdown Frame
    if input.startswith("```"):
        input = input[len("```"):]
    if input.startswith("```json"):
        input = input[len("```json"):]
    if input.endswith("```"):
        input = input[: len(input) - len("```")]

    try:
        result = json.loads(input)
    except json.JSONDecodeError:
        # Fixup potentially malformed json string using json_repair.
        json_info = str(repair_json(json_str=input, return_objects=False))

        # Generate JSON-string output using best-attempt prompting & parsing techniques.
        try:

            if len(json_info) < len(input):
                json_info, result = try_parse_ast_to_json(input)
            else:
                result = json.loads(json_info)

        except json.JSONDecodeError:
            log.exception("error loading json, json=%s", input)
            return json_info, {}
        else:
            if not isinstance(result, dict):
                log.exception("not expected dict type. type=%s:", type(result))
                return json_info, {}
            return json_info, result
    else:
        return input, result

数据格式化

    在确保 JSON 结构标准化后,还需要通过格式化工具对内容进行数据格式化。不同类型的数据,如日期、金额、文本等,需要遵循统一的格式要求。

  • 日期格式:所有日期和时间字段都应格式化为标准的 14 位日期时间格式:YYYYMMDDHHMMSS。这可以确保时间字段在不同系统中具有一致的解析方式。

  • 金额格式:金额字段应保留原单位(如元、万元),并且格式化为无空格、无额外字符的数值形式(如 500000元),以便在后续财务分析或报告生成中能够准确使用。

  • 文本字段格式化:对文本字段中的特殊字符(如换行符、双引号)进行处理,确保文本内容不会破坏 JSON 的语法结构。比如,将双引号转义处理,或者移除无意义的换行符和空格。

如输入数据:

{  "项目名称": "智能楼宇工程",  "项目编号": "XZL-2023",  "采购预算": " 7,000,000.00 元",  "开标时间": "2024/01/01 09:00"}

格式化后的输出:

{  "项目名称": "智能楼宇工程",  "项目编号": "XZL-2023",  "采购预算": "7000000元",  "开标时间": "20240101090000"}

数据校验模块

    校验模块是数据后处理过程中至关重要的一环。其作用是对最终的数据进行进一步的校验,确保数据的完整性、准确性和一致性。校验模块可以自动检测格式错误、逻辑冲突、缺失值等问题,并提供修复或警报机制。

格式校验

    确保所有数据符合预期的格式标准,例如日期、金额、电话号码等字段的格式是否正确。

如:检查金额字段是否包含正确的货币单位,并确保数值的表示形式规范。

  • 参考代码


def validate_currency_format(amount_str):
    if '元' in amount_str or '万元' in amount_str:
        try:
            amount = float(amount_str.replace("万元", "").replace("元", "").replace(",", "").strip())
            return True
        except ValueError:
            return False
    return False

逻辑校验

    逻辑校验是检查数据之间的逻辑关系是否符合业务规则。例如:

时间校验:投标截止时间不能晚于开标时间。校验时需检查两个时间字段,确保逻辑正确。

  • 校验方法:比较投标截止时间和开标时间,如果投标截止时间晚于开标时间,则返回错误。

  • 参考代码

from datetime import datetime

def validate_time_order(submit_time, open_time):
    submit_dt = datetime.strptime(submit_time, "%Y%m%d%H%M%S")
    open_dt = datetime.strptime(open_time, "%Y%m%d%H%M%S")
    return submit_dt <= open_dt
  • 金额校验:采购预算金额不能小于中标金额。校验预算和中标金额,确保金额逻辑合理。

  • 校验方法:如果中标金额高于预算金额,则返回警报。

完整性校验

    完整性校验确保所有关键字段都已经填入有效数据,避免信息缺失。对于未提供数据的字段,应填充默认值(如“无”),或触发错误提醒。

  • 必填字段检查:对于某些字段,如“项目名称”、“项目编号”、“投标截止时间”,应强制要求填写,若缺失则进行标记或补全。

  • 校验方法:通过预定义的字段列表检查 JSON 输出中是否包含所有必填字段。

  • 自动填充默认值:如果某个字段为空或缺失,可以自动填充默认值“无”。

  • 参考代码

def fill_missing_fields(data, default="无"):
    required_fields = ["项目名称", "项目编号", "采购预算", "投标截止时间"]
    for field in required_fields:
        if field not in data or not data[field]:
            data[field] = default
    return data

一致性校验

    一致性校验确保同一信息在不同字段或位置的值保持一致。例如:

  • 项目编号一致性:项目编号在不同字段中应当相同,如出现在多个部分的项目编号不能出现不一致的情况。

    • 校验方法:检查项目编号是否一致,如果发现不同编号,则触发警报。

  • 日期一致性:多个时间字段中如果是同一事件(如开始时间和结束时间在不同部分中重复出现),应确保其一致。

  • 参考代码


def validate_data(json_data):
    # 1. 格式校验
    if not validate_date_format(json_data.get("投标截止时间", "")):
        print("投标截止时间格式错误")
    if not validate_currency_format(json_data.get("采购预算", "")):
        print("采购预算格式错误")

    # 2. 逻辑校验
    if not validate_time_order(json_data.get("投标截止时间", ""), json_data.get("开标时间", "")):
        print("投标截止时间不能晚于开标时间")

    # 3. 完整性校验
    json_data = fill_missing_fields(json_data)

    # 4. 一致性校验
    if json_data.get("项目编号") != json_data.get("计划编号"):
        print("项目编号与计划编号不一致")

    return json_data

数据修复模块

    检测到数据格式或逻辑错误后,通过基于规则修复与更高级模型调用进行修复,确保数据的完整性和准确性。通过修复模块,能够自动纠正常见的错误,如格式错误、缺失数据或逻辑冲突,避免手动修正,提高效率。

基于规则的自动修复

    在大部分情况下,错误可以通过预定义的规则和算法进行自动修复。此步骤作为第一层处理机制,针对格式错误、简单的逻辑冲突、特殊字符处理等问题进行修正。

  • 格式修正:通过正则表达式或预定义算法修复日期、金额、电话号码等格式错误。

  • 逻辑修正:检查和修复时间顺序、金额逻辑等问题。对投标截止时间、开标时间、金额关系进行简单调整。

  • 数据填补:自动填补缺失字段,使用“无”或从其他字段推导合理值。

提交更高级模型处理

    对于规则无法解决的复杂错误,或者需要更高层次推理的情况,可以将这些Bad Case提交给高级模型(如 GLM-4-plus)处理。

  • 处理复杂业务逻辑:当多个数据字段之间存在复杂的依赖关系时,普通的规则引擎可能无法有效处理,例如合同条款中的复杂逻辑冲突,此时可以利用高级模型的上下文理解能力进行推理和调整。

  • 识别与处理领域特定信息:高级模型擅长理解和处理特定领域的复杂术语、语境或结构不明的信息,如行业专用术语、合同中的特殊条款等。

👇点击关注AI疯人院获取

更多技术信息~

👇关注回复【LLM资料】获取更多人工智能学习资源~

图片

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

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

相关文章

大数据-213 数据挖掘 机器学习理论 - KMeans Python 实现 距离计算函数 质心函数 聚类函数

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

【Pikachu】File Inclusion文件包含实战

永远也不要忘记能够笑的坚强&#xff0c;就算受伤&#xff0c;我也从不彷徨。 1.File Inclusion(文件包含漏洞)概述 File Inclusion(文件包含漏洞)概述 文件包含&#xff0c;是一个功能。在各种开发语言中都提供了内置的文件包含函数&#xff0c;其可以使开发人员在一个代码…

材质(二)——材质参数化,从源材质继承生成不同的材质实例

继承原材质&#xff0c;对外提供参数。 更改调制不同的参数&#xff0c;生成不同的材质实例。 类似于&#xff0c;类的继承。有一个基类Base.继承生成为子类 A_Base,B_Base,C_Base

java的面向对象(从入门到深入)

目录 一、基本概念&#xff1a; 1.类 2.对象 3.继承 4.多态 5.封装 6.方法 7.接口 8.抽象 二、深入概念&#xff1a; 三:总结 一、基本概念&#xff1a; 1.类 类就是一个一个东西的蓝图&#xff0c;里面有着它的属性和方法。 2.对象 对象是一个类的实例化。 3.继承…

FPGA实现串口升级及MultiBoot(六)ICAPE2原语实例讲解

本文目录索引 一个指令和三种方式通过ICAPE2原语添加ICAPE2 IP构建Golden位流工程MultiBoot位流工程验证example2总结代码缩略词索引: K7:Kintex 7V7:Vertex 7A7:Artix 7MB:MicroBlaze上一篇文章种总结了MultiBoot 关键技术,分为:一个指令、二种位流、三种方式、四样错误。针…

自动泊车端到端算法 ParkingE2E 介绍

01 算法介绍 自主泊车是智能驾驶领域中的一项关键任务。传统的泊车算法通常使用基于规则的方案来实现。因为算法设计复杂&#xff0c;这些方法在复杂泊车场景中的有效性较低。 相比之下&#xff0c;基于神经网络的方法往往比基于规则的方法更加直观和多功能。通过收集大量专家…

sealos部署K8s,安装docker时master节点突然NotReady

1、集群正常运行中&#xff0c;在集群master-1上安装了dockerharbor&#xff0c;却发现master-1节点NotReady&#xff0c;使用的网络插件为 Cilium #安装docker和harbor&#xff08;docker运行正常&#xff09; rootmaster-1:/etc/apt# apt install docker-ce5:19.03.15~3-0~u…

什么是磁场探针台

探针台主要应用于半导体行业、光电行业、集成电路以及封装的测试。广泛应用于复杂、高速器件的精密电气测量的研发&#xff0c;旨在确保质量及可靠性&#xff0c;并缩减研发时间和器件制造工艺的成本。 磁场探针台就是在普通探针台的基础上&#xff0c;增加了磁性测量环境&…

【八百客CRM-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

iOS SmartCodable 替换 HandyJSON 适配记录

前言 HandyJSON群里说建议不要再使用HandyJSON&#xff0c;我最终选择了SmartCodable 来替换&#xff0c;原因如下&#xff1a; 首先按照 SmartCodable 官方教程替换 大概要替换的内容如图&#xff1a; 详细的替换教程请前往&#xff1a;使用SmartCodable 平替 HandyJSON …

✍Qt自定义带图标按钮

✍Qt自定义带图标按钮 &#x1f4dd;问题引入 近段时间的工作中&#xff0c;有遇到这样一个需求 &#x1f4dd;&#xff1a; 一个按钮&#xff0c;有normal、hover、pressed三种状态的样式&#xff0c;并且normal和hover样式下&#xff0c;字体颜色和按钮图标不一样。 分析…

OpenGL学习笔记(三) 绘制图形

glFrontFace(GL_CCW); // 设置CCW方向为“正面”&#xff0c;CCW即CounterClockWise&#xff0c;逆时针 glFrontFace(GL_CW); // 设置CW方向为“正面”&#xff0c;CW即ClockWise&#xff0c;顺时针#include <GL/glut.h>#include <math.h> void myDisplay(voi…

通过代码复习回忆 DiffusionDet: DiffusionTracker

DiffusionDet : DiffusionTracker复习回顾 之前的一段时间学习了基于扩散模型的检测于跟踪算法&#xff0c;最近在忙别的事情就导致了这里存在了很多和细节上的遗忘在这里进行一定的回顾&#xff0c;之后在试图看看可以进一步学习基于点集的扩散过程吗&#xff1f; Diffusion…

单体架构的 IM 系统设计

先直接抛出业务背景&#xff01; 有一款游戏&#xff0c;日活跃量&#xff08;DAU&#xff09;在两千左右&#xff0c;虽然 DAU 不高&#xff0c;但这两千用户的忠诚度非常高&#xff0c;而且会持续为游戏充值&#xff1b;为了进一步提高用户体验&#xff0c;继续增强用户的忠…

Java-字符串常量池

在Java程序中&#xff0c;类似于&#xff1a;1&#xff0c; 2&#xff0c; 3&#xff0c;3.14&#xff0c;“hello”等字面类型的常量经常频繁使用&#xff0c;为了使程序的运行速度更快、 更节省内存&#xff0c;Java为8种基本数据类型和String类都提供了常量池。 1.为什么要…

Wot Design Uni高颜值、轻量化的uni-app组件库 快速入门

一、简介 Wot Design Uni是一个基于Vue3和TypeScript开发的高颜值、轻量化的uni-app组件库。它提供了超过70个高质量组件&#xff0c;这些组件覆盖了移动端的主流场景&#xff0c;使得开发者能够更加高效地进行移动应用的开发。 以下是Wot Design Uni的一些主要特点&#xff…

maven依赖无法导入爆红问题

1、属于公司内部依赖&#xff0c;当前项目没有连接到公司Maven私服 2、之前本地已经下载过&#xff0c;但是下载中途失败了&#xff0c;产生了一个xxx.jar.lastUpdated文件&#xff0c;此时Maven不会对该依赖再下载 引入本地仓库依赖

MyBatis xml 文件中 SQL 语句的小于号未转义导致报错

问题现象 在 MyBatis 的 xml 文件中添加了一个 SQL 语句 <select id"countXxx" resultType"int">select count(*) from t1 where count < 3 </select>启动 Spring Boot 应用程序后报错&#xff1a; Caused by: org.apache.ibatis.builde…

前端学习之ES6+

1.ES6是什么 ES6&#xff0c;全称是ECMAScript 6&#xff0c;是JavaScript语言的下一代标准&#xff0c;由ECMA国际组织在2015年6月正式发布。ES6也被称作ECMAScript 2015&#xff0c;从这个版本开始&#xff0c;ECMA组织决定每年发布一个新的ECMAScript版本&#xff0c;以使J…

学习笔记:黑马程序员JavaWeb开发教程(2024.11.8)

5.10 分层解耦-分层解耦&#xff08;IOC-DI&#xff09; 在之前写的代码中&#xff0c;Controller层中new了一个Service层中的对象&#xff0c;在Service层中类名改变&#xff0c;则Controller层中也需要变化&#xff0c;这就是两个层之中耦合较重&#xff0c;需要减少耦…