Datawhale - 角色要素提取竞赛

文章目录

  • 赛题要求
  • 一、赛事背景
  • 二、赛事任务
  • 三、评审规则
    • 1.平台说明
    • 2.数据说明
    • 3.评估指标
    • 4.评测及排行
  • 四、作品提交要求
  • 五、 运行Baseline
    • Step1:下载相关库
    • Step2:配置导入
    • Step3:模型测试
    • Step4:数据读取
    • Step5:Prompt设计
    • Step6:主函数启动
    • Step7:生成提交文件
    • Step8:下载 output.json 文件
  • 六、补充
    • -- 应用的库
      • --- tqdm
      • --- json


赛题要求

一、赛事背景

在当今数字化时代,企业积累了丰富的对话数据,这些数据不仅是客户与企业之间交流的记录,更是隐藏着宝贵信息的宝库。在这个背景下,群聊对话分角色要素提取成为了企业营销和服务的一项重要策略。

群聊对话分角色要素提取的理念是基于企业对话数据的深度分析和挖掘。通过对群聊对话数据进行分析,企业可以更好地理解客户的需求、兴趣和行为模式,从而精准地把握客户的需求和心理,提供更加个性化和优质的服务。这不仅有助于企业更好地满足客户的需求,提升客户满意度,还可以为企业带来更多的商业价值和竞争优势。

群聊对话分角色要素提取的研究,将企业对话数据转化为可用的信息和智能的洞察,为企业营销和服务提供了新的思路和方法。通过挖掘对话数据中隐藏的客户行为特征和趋势,企业可以更加精准地进行客户定位、推广营销和产品服务,实现营销效果的最大化和客户价值的最大化。这将为企业带来更广阔的发展空间和更持续的竞争优势。

二、赛事任务

从给定的<客服>与<客户>的群聊对话中, 提取出指定的字段信息,待提取的全部字段见下数据说明。

三、评审规则

1.平台说明

参赛选手需基于讯飞星火大模型V3.5完成任务。允许使用大模型微调的方式进行信息抽取, 但微调的基座模型仅限星火大模型。

关于星火V3.5资源,组委会将为报名参赛选手统一发放API资源福利,选手用个人参赛账号登录讯飞开放平台:https://www.xfyun.cn/ ,前往控制台中查看使用。关于微调训练资源,选手用参赛账户登陆大模型训练平台( https://training.xfyun.cn/overview ),可领取本次比赛的训练资源福利。

2.数据说明

赛题方提供了184条真实场景的群聊对话数据以及人工标注后的字段提取结果,其中训练数据129条,测试数据 55条。按照各类字段提取的难易程度,共设置了1、2、3三种难度分数。待提取的字段以及提取正确时的得分规则如下:

序号字段名称是否单值是否可为空难度分数答案是否唯一备注
1基本信息-姓名1
2基本信息-手机号码1
3基本信息-邮箱1
4基本信息-地区1
5基本信息-详细地址1
6基本信息-性别1
7基本信息-年龄1
8基本信息-生日1
9咨询类型2
10意向产品3
11购买异议点3
12客户预算-预算是否充足2
13客户预算-总体预算金额2
14客户预算-预算明细3
15竞品信息2
16客户是否有意向1
17客户是否有卡点1
18客户购买阶段2
19下一步跟进计划-参与人2
20下一步跟进计划-时间点2
21下一步跟进计划-具体事项3

备注:

1)可为空的字段,当判定无相应信息、无法做出判断等情况,统一取值为空字符串

2)对于非单值字段,请使用list来表示

3.评估指标

测试集的每条数据同样包含共21个字段, 按照各字段难易程度划分总计满分36分。每个提取正确性的判定标准如下:

1)对于答案唯一字段,将使用完全匹配的方式计算提取是否正确,提取正确得到相应分数,否则为0分

2)对于答案不唯一字段,将综合考虑提取完整性、语义相似度等维度判定提取的匹配分数,最终该字段得分为 “匹配分数 * 该字段难度分数”

每条测试数据的最终得分为各字段累计得分。最终测试集上的分数为所有测试数据的平均得分。

4.评测及排行

1)本赛题均提供下载数据,选手在本地进行算法调试,在比赛页面提交结果。

2)排行按照得分从高到低排序,排行榜将选择团队的历史最优成绩进行排名。

四、作品提交要求

1、文件格式:按照 json格式提交

2、文件大小:无要求

3、提交次数限制:每支队伍每天最多3次

4、文件详细说明:编码为UTF-8,具体格式参考提交示例

5、关于大模型的使用说明&限制。

• 如果使用大模型进行信息抽取, 本次仅限使用星火大模型。

• 为了排除人工校验、修正等作弊方式,本次比赛除了提交答案之外,排行榜前3名选手需要提供完整的源代码进行审核,要求抽取的结果必须可以准确复现。

• 注:排行榜前3名有审核不通过现象时,依次按得分顺延。满分36分,原则上最终入围决赛三甲得分不得低于20分。

• 允许使用大模型微调的方式进行信息抽取, 微调的基座模型仅限星火大模型。


五、 运行Baseline

项目链接 : 基于星火大模型的群聊对话分角色要素提取挑战-baseline - 飞桨AI Studio星河社区 (baidu.com)

image.png

进入之后在 探索 -> 项目大厅 中进入该页面,点击 运行一下

image.png

选择运行环境后,点击确定

image.png

出现图示启动成功,单击 进入

image.png

进入界面后可以直接操作运行

Step1:下载相关库

image.png

!pip install --upgrade -q spark_ai_python

注意: 此处的 ! 为jupyter notebook 形式的魔法命令

Step2:配置导入

image.png

from sparkai.llm.llm import ChatSparkLLM, ChunkPrintHandler

from sparkai.core.messages import ChatMessage

import json

  
  

#星火认知大模型Spark3.5 Max的URL值,其他版本大模型URL值请前往文档(https://www.xfyun.cn/doc/spark/Web.html)查看

SPARKAI_URL = 'wss://spark-api.xf-yun.com/v3.5/chat'

#星火认知大模型调用秘钥信息,请前往讯飞开放平台控制台(https://console.xfyun.cn/services/bm35)查看

SPARKAI_APP_ID = ''

SPARKAI_API_SECRET = ''

SPARKAI_API_KEY = ''

#星火认知大模型Spark3.5 Max的domain值,其他版本大模型domain值请前往文档(https://www.xfyun.cn/doc/spark/Web.html)查看

SPARKAI_DOMAIN = 'generalv3.5'

在此处设置调用星火大模型的基础信息

Step3:模型测试

image.png

def get_completions(text):

    messages = [ChatMessage(

        role="user",

        content=text

    )]

    spark = ChatSparkLLM(

        spark_api_url=SPARKAI_URL,

        spark_app_id=SPARKAI_APP_ID,

        spark_api_key=SPARKAI_API_KEY,

        spark_api_secret=SPARKAI_API_SECRET,

        spark_llm_domain=SPARKAI_DOMAIN,

        streaming=False,

    )

    handler = ChunkPrintHandler()

    a = spark.generate([messages], callbacks=[handler])

    return a.generations[0][0].text

  

# 测试模型配置是否正确

text = "你好"

get_completions(text)

该处使用代码的形式构建了大模型的问答处理功能,比较简单,只有text一个参数

Step4:数据读取

image.png

def read_json(json_file_path):

    """读取json文件"""

    with open(json_file_path, 'r') as f:

        data = json.load(f)

    return data

  

def write_json(json_file_path, data):

    """写入json文件"""

    with open(json_file_path, 'w') as f:

        json.dump(data, f, ensure_ascii=False, indent=4)

  

# 读取数据

train_data = read_json("dataset/train.json")

test_data = read_json("dataset/test_data.json")

该处代码主要为了获取比赛提供的数据

Step5:Prompt设计

image.png

此处详细的设置了提示词的内容, 具体内容如下:

# prompt 设计

PROMPT_EXTRACT = """

你将获得一段群聊对话记录。你的任务是根据给定的表单格式从对话记录中提取结构化信息。在提取信息时,请确保它与类型信息完全匹配,不要添加任何没有出现在下面模式中的属性。

  

表单格式如下:

info: Array<Dict(

    "基本信息-姓名": string | "",  // 客户的姓名。

    "基本信息-手机号码": string | "",  // 客户的手机号码。

    "基本信息-邮箱": string | "",  // 客户的电子邮箱地址。

    "基本信息-地区": string | "",  // 客户所在的地区或城市。

    "基本信息-详细地址": string | "",  // 客户的详细地址。

    "基本信息-性别": string | "",  // 客户的性别。

    "基本信息-年龄": string | "",  // 客户的年龄。

    "基本信息-生日": string | "",  // 客户的生日。

    "咨询类型": string[] | [],  // 客户的咨询类型,如询价、答疑等。

    "意向产品": string[] | [],  // 客户感兴趣的产品。

    "购买异议点": string[] | [],  // 客户在购买过程中提出的异议或问题。

    "客户预算-预算是否充足": string | "",  // 客户的预算是否充足。示例:充足, 不充足

    "客户预算-总体预算金额": string | "",  // 客户的总体预算金额。

    "客户预算-预算明细": string | "",  // 客户预算的具体明细。

    "竞品信息": string | "",  // 竞争对手的信息。

    "客户是否有意向": string | "",  // 客户是否有购买意向。示例:有意向, 无意向

    "客户是否有卡点": string | "",  // 客户在购买过程中是否遇到阻碍或卡点。示例:有卡点, 无卡点

    "客户购买阶段": string | "",  // 客户当前的购买阶段,如合同中、方案交流等。

    "下一步跟进计划-参与人": string[] | [],  // 下一步跟进计划中涉及的人员(客服人员)。

    "下一步跟进计划-时间点": string | "",  // 下一步跟进的时间点。

    "下一步跟进计划-具体事项": string | ""  // 下一步需要进行的具体事项。

)>

  

请分析以下群聊对话记录,并根据上述格式提取信息:

  

**对话记录:**

\```

{content}

\```

  

请将提取的信息以JSON格式输出。

不要添加任何澄清信息。

输出必须遵循上面的模式。

不要添加任何没有出现在模式中的附加字段。

不要随意删除字段。

  

**输出:**

\```

[{{

    "基本信息-姓名": "姓名",

    "基本信息-手机号码": "手机号码",

    "基本信息-邮箱": "邮箱",

    "基本信息-地区": "地区",

    "基本信息-详细地址": "详细地址",

    "基本信息-性别": "性别",

    "基本信息-年龄": "年龄",

    "基本信息-生日": "生日",

    "咨询类型": ["咨询类型"],

    "意向产品": ["意向产品"],

    "购买异议点": ["购买异议点"],

    "客户预算-预算是否充足": "充足或不充足",

    "客户预算-总体预算金额": "总体预算金额",

    "客户预算-预算明细": "预算明细",

    "竞品信息": "竞品信息",

    "客户是否有意向": "有意向或无意向",

    "客户是否有卡点": "有卡点或无卡点",

    "客户购买阶段": "购买阶段",

    "下一步跟进计划-参与人": ["跟进计划参与人"],

    "下一步跟进计划-时间点": "跟进计划时间点",

    "下一步跟进计划-具体事项": "跟进计划具体事项"

}}, ...]

\```

"""

Step6:主函数启动

import json

  

class JsonFormatError(Exception):

    def __init__(self, message):

        self.message = message

        super().__init__(self.message)

  

def convert_all_json_in_text_to_dict(text):

    """提取LLM输出文本中的json字符串"""

    dicts, stack = [], []

    for i in range(len(text)):

        if text[i] == '{':

            stack.append(i)

        elif text[i] == '}':

            begin = stack.pop()

            if not stack:

                dicts.append(json.loads(text[begin:i+1]))

    return dicts

  

# 查看对话标签

def print_json_format(data):

    """格式化输出json格式"""

    print(json.dumps(data, indent=4, ensure_ascii=False))

  
  
  

def check_and_complete_json_format(data):

    required_keys = {

        "基本信息-姓名": str,

        "基本信息-手机号码": str,

        "基本信息-邮箱": str,

        "基本信息-地区": str,

        "基本信息-详细地址": str,

        "基本信息-性别": str,

        "基本信息-年龄": str,

        "基本信息-生日": str,

        "咨询类型": list,

        "意向产品": list,

        "购买异议点": list,

        "客户预算-预算是否充足": str,

        "客户预算-总体预算金额": str,

        "客户预算-预算明细": str,

        "竞品信息": str,

        "客户是否有意向": str,

        "客户是否有卡点": str,

        "客户购买阶段": str,

        "下一步跟进计划-参与人": list,

        "下一步跟进计划-时间点": str,

        "下一步跟进计划-具体事项": str

    }

  

    if not isinstance(data, list):

        raise JsonFormatError("Data is not a list")

  

    for item in data:

        if not isinstance(item, dict):

            raise JsonFormatError("Item is not a dictionary")

        for key, value_type in required_keys.items():

            if key not in item:

                item[key] = [] if value_type == list else ""

            if not isinstance(item[key], value_type):

                raise JsonFormatError(f"Key '{key}' is not of type {value_type.__name__}")

            if value_type == list and not all(isinstance(i, str) for i in item[key]):

                raise JsonFormatError(f"Key '{key}' does not contain all strings in the list")

  

    return data
  • JsonFormatError 类用于自定义异常。

  • convert_all_json_in_text_to_dict 函数用于从文本中提取JSON字符串并转换为字典。

  • print_json_format 函数用于格式化输出JSON数据。

  • check_and_complete_json_format 函数用于检查和补全JSON数据的格式,确保每个JSON对象包含所有必需的键,并且每个键的值类型正确。

from tqdm import tqdm

  

retry_count = 5 # 重试次数

result = []

error_data = []

  

for index, data in tqdm(enumerate(test_data)):

    index += 1

    is_success = False

    for i in range(retry_count):

        try:

            res = get_completions(PROMPT_EXTRACT.format(content=data["chat_text"]))

            infos = convert_all_json_in_text_to_dict(res)

            infos = check_and_complete_json_format(infos)

            result.append({

                "infos": infos,

                "index": index

            })

            is_success = True

            break

        except Exception as e:

            print("index:", index, ", error:", e)

            continue

    if not is_success:

        data["index"] = index

        error_data.append(data)
  1. 初始化变量

    • retry_count 被设置为 5,表示每个数据项最多尝试处理 5 次。

    • result 是一个空列表,用于存储成功处理的数据结果。

    • error_data 是一个空列表,用于存储处理失败的数据项。

  2. 循环处理数据

    • 使用 tqdm 库的 enumerate 函数来遍历 test_data,这样可以同时获取数据项和其索引,并且在控制台显示一个进度条。

    • index 变量表示当前数据项的索引(从 1 开始)。

    • is_success 变量用于标记当前数据项是否处理成功。

  3. 重试机制

    • 对于每个数据项,代码会尝试最多 retry_count 次来处理它。

    • 在每次尝试中,代码会调用 get_completions 函数来获取结果,并使用 convert_all_json_in_text_to_dictcheck_and_complete_json_format 函数来处理结果。

    • 如果处理成功(即没有抛出异常),则将结果添加到 result 列表中,并将 is_success 设置为 True,然后跳出重试循环。

  4. 错误处理

    • 如果在任何一次尝试中抛出异常,代码会捕获该异常,并打印错误信息(包括当前数据项的索引和异常信息)。

    • 如果所有重试都失败(即 is_success 仍然为 False),则将当前数据项添加到 error_data 列表中,以便后续处理。

Step7:生成提交文件

# 保存输出

write_json("output.json", result)

Step8:下载 output.json 文件

在左边文件夹栏中点击下载生成的文件,回到比赛平台提交结果即可。2024 iFLYTEK A.I.开发者大赛-讯飞开放平台 (xfyun.cn)

image.png

提交结果 中可以看到相应的分数:

image.png


六、补充

– 应用的库

— tqdm

python库 - tqdm-CSDN博客

— json

python库 - json-CSDN博客


如有错误,敬请批评指正!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

不要再被骗了!电脑无法进入系统的原因可能是这个硬件坏了而已……

前言 前段时间小白在抖音上发了很多很多很多的视频&#xff0c;其中应该是有很多商家关注了小白。 然后就会出现很多很多很多的赚钱小门道…… 电脑开机没有显示&#xff1f;换显卡&#xff01; 电脑还是不开机&#xff1f;换CPU 电脑还是一样不开机…… 经过了一番大折腾…

电脑录音方法:电脑怎么录音?5招轻松搞定录音!

想要从麦克风或系统音频录制电脑声音吗&#xff1f;这是一项简单的任务。本文将为您介绍5种最佳且最简单的方法&#xff0c;包括使用Windows系统自带的录音工具来录制电脑音频&#xff0c;在线音频录音软件和专业的第三方电脑录音软件。这些工具都能够很好地帮助您完成电脑怎么…

【深度学习】循环神经网络RNN、LSTM、GRU

李宏毅深度学习笔记 https://www.bilibili.com/video/BV1qM4y1M7Nv RNN 在 RNN 里面&#xff0c;每一次隐藏层的神经元产生输出的时候&#xff0c;该输出会被存到记忆元。下一次有输入时&#xff0c;这些神经元不仅会考虑输入 x1, x2&#xff0c;还会考虑存到记忆元里的值。 …

高危行业的安全守护者,顶坚防爆手机无惧挑战

高危行业的安全守护者&#xff0c;防爆手机以卓越性能&#xff0c;无惧极端挑战&#xff0c;为每一位前线工作者筑起坚不可摧的安全防线。石油勘探的深邃海洋、化工生产的复杂车间、矿山的幽深隧道……这些高危行业中&#xff0c;每一步都需谨慎前行&#xff0c;每一刻都需安全…

技术成神之路:设计模式(二)建造者模式

1.定义 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它允许你分步骤创建复杂对象&#xff0c;而不必直接调用构造函数。建造者模式特别适合那些包含多个组成部分并且构造过程复杂的对象。 2. 结构 建造者模式的主要组成部分包括&#…

TensorRT动态形状(Dynamic Shape)出错,官方demo+自己模型运行时出错

(2024.7.2) 使用TensorRT处理动态输入形状推理时出现的错误&#xff0c;本案基于官方demo文件&#xff0c;已解决&#xff1a; TensorRT版本10.0&#xff0c;官方例子使用的是这个https://github.com/NVIDIA/trt-samples-for-hackathon-cn/blob/master/cookbook/01-SimpleDem…

数据文件传输连接超时?镭速教你如何解决!

Mysql作为一个广泛使用的开源关系型数据库管理系统&#xff0c;以快速、可靠、易于使用、开源的特色闻名&#xff0c;使用 MySQL 来存储和管理数据&#xff0c;已经广泛应用于各个领域、各类大小型应用中。 图片源于网络 使用 MySQL 来存储和管理数据的应用中&#xff0c;与数…

Windows打开redis以及Springboot整合redis

目录 前言Windows系统打开redisSpringboot整合redis依赖实体类yml配置文件config配置各个数据存储类型分别说明记录string数据写入redis&#xff0c;并查询通过命令行查询 list插入数据到redis中从redis中读取命令读取数据 hash向redis中逐个添加map键值对获取key对应的map中所…

【ubuntu18.04】 局域网唤醒 wakeonlan

ai服务器经常因为断电,无法重启,当然可以设置bios 来电启动。 这里使用局域网唤醒配置。 自动开关机设置 工具:ethtool 端口 : enp4s0 Wake-on: d 表示禁用Wake-on: g 激活 ,例如:ethtool -s eth0 wol g 配置/etc/rc.local ,这个文件不存在,自己创建工具下载 tengxun W…

mysql 命令 —— 查看表信息(show table status)

查询表信息&#xff0c;如整个表的数据量大小、表的索引占用空间大小等 1、查询某个库下面的所有表信息&#xff1a; SHOW TABLE STATUS FROM your_database_name;2、查询指定的表信息&#xff1a; SHOW TABLE STATUS LIKE your_table_name;如&#xff1a;Data_length 显示表…

开放式耳机哪个品牌最好?2024高热度机型推荐,选购不迷茫

选购开放式耳机时&#xff0c;面对琳琅满目的品牌与型号是否感到不知道怎么选择&#xff1f;别担心&#xff0c;作为耳机爱好者与资深评测人&#xff0c;我精心整理了几款热门开放式耳机的全面对比。这次对比不仅涵盖如何挑选&#xff0c;有哪些不要菜类的额点&#xff0c;还推…

第十四届蓝桥杯省赛C++B组E题【接龙数列】题解(AC)

需求分析 题目要求最少删掉多少个数后&#xff0c;使得数列变为接龙数列。 相当于题目要求求出数组中的最长接龙子序列。 题目分析 对于一个数能不能放到接龙数列中&#xff0c;只关系到这个数的第一位和最后一位&#xff0c;所以我们可以先对数组进行预处理&#xff0c;将…

数字化供应链:背景特点

​背景 1、外部环境 近年来&#xff0c;供应链脆弱性凸显&#xff0c;企业供应链压力难以缓解。 美国媒体针对美国零售联合会、美国服装和鞋类协会、美国供应链管理专业委员会等主体进行的一项供应链调查显示&#xff1a; 61%的供应链经理预计&#xff0c;供应链紊乱问题至少…

老师怎样将期末成绩怎样私发家长?

作为老师&#xff0c;期末成绩的发布不仅是对学生一学期学习成果的评价&#xff0c;更是家校沟通的重要环节。然而&#xff0c;这一过程往往比我们想象的更为复杂和繁琐。 我们需要确保每个学生的成绩准确无误。这意味着在成绩录入之后&#xff0c;必须进行多次核对&#xff0c…

Java将list数组中重复的对象进行去重

/*** 数组去重*/ public class ArrayDistinct {public static void main(String[] args) {ArrayList<Object> list new ArrayList<>();JSONObject jsonObject1 new JSONObject();jsonObject1.put("name","张三");jsonObject1.put("age&…

序号不足两位前面补0

预期目标 原始效果 代码实现 {${(index 1).toString().padStart(2, 0)}. ${item.sentence}}要实现自动编号并确保显示为两位数的格式&#xff0c;可以在 {index 1} 的地方进行格式化。在 JavaScript 中&#xff0c;可以使用 String.prototype.padStart() 方法来补足数字到指定…

终极指南:RNNS、Transformers 和 Diffusion 模型

一、说明 作为广泛使用这些工具和模型的人&#xff0c;我的目标是解开 RNN、Transformer 和 Diffusion 模型的复杂性和细微差别&#xff0c;为您提供详细的比较&#xff0c;为您的特定需求提供正确的选择。 无论您是在构建语言翻译系统、生成高保真图像&#xff0c;还是处理时间…

kettle从入门到精通 第七十四课 ETL之kettle kettle调用https接口教程,忽略SSL校验

场景&#xff1a;kettle调用https接口&#xff0c;跳过校验SSL。&#xff08;有些公司内部系统之间的https的接口是没有SSL校验这一说&#xff0c;无需使用用证书的&#xff09; 解决方案&#xff1a;自定义插件或者自定义jar包通过javascript调用https接口。 1、http post 步…

为什么是视频传输用YUV格式,而放弃RGB格式?

&#x1f60e; 作者介绍&#xff1a;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff0c;视频号&#xff1a;AI-行者Sun &#x1f388; 本文专栏&#xff1a;本文收录于《音视频》系列专栏&…

Linux系统之 — 线程

Linux系统之 — 线程 线程介绍线程使用死锁&#xff08;Deadlock&#xff09;竞态条件&#xff08;Race Condition&#xff09; 线程使用示例服务器端代码示例服务器端示例拆解1. 引入头文件和宏定义2. 定义全局变量3. 定义线程函数4. 主函数5. 错误处理和资源释放 客户端代码示…