一种使得大模型输出结构化数据的简易方法

news2024/9/24 3:24:19

最近在用大模型跑一些数据,于是就不可避免的遇到了如何让大模型输出的格式便于处理这个问题。经过一些研究发现了一套比较有用的方法,在这里总结一下。

背景

任务是这样的,我需要用大模型(比如ChatGPT,ChatGLM等等)对文本进行名词提取。输入一段文本,我需要大模型理解这段文本,然后输出这段文本中的所有代表事件的动词。

理论上讲这是一件很简单的事情,大模型也能比较精准的识别出其中的动词。但是问题就在于大模型的输出上。我该如何将大模型的非格式化的输出转化为格式化的结构化数据呢?

研究过程

某些机缘巧合读到了下面的文献[1]。文献中提出一种叫做PICa的方法:

We present PICa, a simple yet effective method to use GPT-3 for knowledge-based VQA, demonstrating the first use of GPT-3 for multimodal tasks.

虽然是用于VQA领域的问题,但是也不妨细看一下。

进一步研究PICa发现,对于一次VQA预测,它使用如下两种策略:

  • In-context example selection(上下文示例选择)
  • Multi-query ensemble(多查询集成)

其中,上下文示例选择就是在问题之外给模型提供n个样例,这样模型的输出就和样例一致。多查询集成本质上就是多问几次,然后根据问的结果通过某种指标进行排序,得到排序最靠前的一个作为答案。

不难发现,上下文示例选择这个方法对于我的任务很有帮助。

方法

经过上述研究,发现可以尝试使用上下文示例选择的方法使得模型输出固定格式的数据,然后使用Python的正则表达式库进行匹配。

鉴于常用的数据存储格式为json,我们让模型输出的格式也是json。这样一方面便于处理,另一方面,模型的语料库里面json的出现频率肯定比自定义的奇奇怪怪的格式会高,模型对json的格式的理解肯定也更好。

最后实现的效果:

import json
import re
from load_model import chatglm

model = chatglm()

background = """
我希望你能够以一名语言学家的身份帮我完成如下的任务。
首先我会给你一段文本,然后你需要尽可能多的提取出这段文本中发生过的动作事件,比如建立,标记,攻击,渗透,销毁等。
最好一段文本至少能够生成4个以上的词语,词语的长度不能大于6个字。
你的输出需要严格按照python列表的格式输出,我接下来会给你几个例子。
你需要结合下列例子理解我的上述要求,并且按照要求完成任务。
"""

example1 = """
样例1:
================
输入:CNC组织最早于2019年被发现,其命名来源于所使用的远控木马的PDB路径信息中包含的cnc_client,且该组织主要针对教育行业进行攻击。
输出:['发现','攻击','包含']
================
"""

example2 = """
样例2:
================
输入:攻击者以木尔坦的罗德兰区基于情报的反恐行动(intelligence-based operation,IBO)报告为诱饵,尝试投递一种变种木马程序MessPrint以控制受害者设备。
输出:['使用诱饵','投递','控制']
================
"""

question = """
问题1:
================
输入:{}
输出:
================
"""

prompt_base=background + example1 + example2

pattern = r"\[.*?\]"  # 匹配以 "[" 开始,以 "]" 结束的子串
cnt = -1
result = []
for i in tqdm.tqdm(res):
    prompt = prompt_base + question.format(i)
    response = model.response(prompt)[0]
    matches = re.findall(pattern, response)
    for match in matches:
        try:
            lst = eval(match)  # 使用eval将字符串转化为列表,安全性请自行考虑
            result+=lst
        except:
            pass

        print(f"========>>>>>>>\nA:{response}")
    if cnt != -1:
        if cnt > 1:
            break
        cnt += 1

最后输出的效果(部分):

在这里插入图片描述

reference
[1] Zhengyuan Yang, Zhe Gan, Jianfeng Wang, Xiaowei Hu, Yumao Lu, Zicheng Liu, and Lijuan Wang. An empirical study of gpt-3 for few-shot knowledge-based vqa. In AAAI, pages 3081–3089, 2022.

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

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

相关文章

Springboot启用HTTP响应压缩

官方文档:https://docs.spring.io/spring-boot/docs/2.3.12.RELEASE/reference/htmlsingle/#how-to-enable-http-response-compression

Java面试题大全(2023牛客网最新版)大厂面试题附答案详解

很多 Java 工程师的技术不错,但是一面试就头疼,10 次面试 9 次都是被刷,过的那次还是去了家不知名的小公司。 问题就在于:面试有技巧,而你不会把自己的能力表达给面试官。 应届生:你该如何准备简历&#…

解决mysql的count()函数条件表达式不生效的问题

示例 表数据 统计错误的sql select count(age 10) as count from student查询结果 原因 count(‘任意内容’)都会统计出所有记录数,因为count只有在遇见null时才不计数,即count(null)0 解决 方法1:count()函数中条件表达式加上or n…

1、计算机网络核心

序号地址1计算机网络核心2数据库相关3Redis4Linux相关5JVM的内容6GC相关的7Java多线程与并发8Java多线程与并发-原理9Java常用类库与技巧10Java框架-Spring 文章目录 1、OSI开放式互联参考模型2、TCP/IP3、TCP报文头4、TCP的三次握手5、TCP的四次挥手6、为什么会有TIME_WAIT状态…

【unity】燧光MR设备极简教程(使用篇)

燧光MR设备极简教程(使用篇) 一、硬件的基础使用二、定位信标三、投屏直播1、第三人称视角同步MR2、第一人称视角无线投屏 相关文章:燧光MR设备极简教程(开发篇) 一、硬件的基础使用 官方使用文档:https:…

【LLM】Prompt tuning大模型微调实战

文章目录 一、Propmt tuning1. peft库中的tuning2. prompt tuning怎么搞 二、Prompt tuning代码实战1. tuning训练2. 模型推理比较3. 其他tuning技术 Reference 一、Propmt tuning 1. peft库中的tuning 之前提到过可以借助peft库(Parameter-Efficient Fine-Tuning…

基于MeanShift的图像滤波方法

前言 在视觉领域中,图像滤波是一种常用的技术,用于去除图像中的噪声和平滑图像。其中,MeanShift滤波是一种基于颜色和空间信息的非参数化滤波算法。 MeanShift滤波原理 MeanShift滤波是一种基于密度估计的非参数化滤波技术,它对每…

【Go】Go 语言教程--GO语言数组(十一)

往期回顾: Go 语言教程–介绍(一)Go 语言教程–语言结构(二)Go 语言教程–语言结构(三)Go 语言教程–数据类型(四)Go 语言教程–语言变量(五)Go …

希尔排序及其时间复杂度(图文详解)

😾 博客主页: 爱吃bug的猿 🚀博客专栏: 数据结构,C语言初阶进阶全流程讲解 😽😽😽如果喜欢博主的文章,可以给博主点波赞和关注加速博主更新 文章目录 前言1. 代码思路代码实现法1代码实现法2(不…

【KingbaseES】数据库如何查询数据库,模式及表大小

新建数据kingbase及kingbase模式 CREATE DATABASE kingbase OWNER kingbase; CREATE SCHEMA kingbase AUTHORIZATION "kingbase";在数据库kingbase的kingbase模式下新建两张测试表test_size,test_size1并插入数据 CREATE TABLE "kingbase"."test_sz…

课时9:PKI证书基础知识

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:Secureboot从入门到精通-[目录] 👈👈👈目录 1、CA证书的一般用法2、x509证书3、openssl证书命令行4、X509v3证书格式

第十五章 原理篇:YOLOv8

找工作也太难了吧根本找不到工作我哭死。 参考教程: https://mmyolo.readthedocs.io/en/latest/recommended_topics/algorithm_descriptions/yolov8_description.html https://zhuanlan.zhihu.com/p/599761847【这个写的挺不错】 https://zhuanlan.zhihu.com/p/63…

Linux进程监控及控制【命令ps的使用】

ps命令详解 Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。 要对进程进行监测…

EcoVadis 2023年最新评分细则

【EcoVadis 2023年最新评分细则】 Ecovadis 的四大主题 EcoVadis 企业社会责任评级方法的目标是通过其方针政策、实施执行和绩效反馈来衡量一家公司的企业社会责任管理系统的质量。 EcoVadis企业社会责任(CSR)评估方法基于七项基本原则(如图&…

Blazor前后端框架Known-V1.2.3

V1.2.3 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行。 Gitee: https://gitee.com/known/KnownGithub:https://github.com/known/Known 概述 基于C#和Blazor…

1.SpringBoot编写第一个接口(保姆级)

1.下载SpringBoot框架 下载地址:https://start.spring.io/ 选择对应的springboot 版本,工具,依赖等。 2.用Idea打开项目 下载完后,解压文件后,用Idea打开,进行项目的JDK和Maven的相关配置。 将项目的JDK配置成自己…

数据结构与算法——最小生成树问题(什么是最小生成树、Prim算法、Kruskal算法)

目录 什么是最小生成树 贪心算法 Prim算法 思路 代码(C语言) Kruskal算法 思路 代码 什么是最小生成树 1.是一颗树 无回路个顶点一定有条边 2.是生成树 包含全部顶点条边都在图里 3.边的权重和最小 向生成树中任加一条边都一定构成回路 最…

前端vue入门(纯代码)25_路由vueRouter

如果耐不住寂寞,你就看不到繁华。 【23.Vue Router--路由】 [可以去官网看看Vue Router文档](入门 | Vue Router (vuejs.org)) 用 Vue Vue Router 创建单页应用非常简单:通过 Vue.js,我们已经用组件组成了我们的应用。当加入 Vue Router …

Linux基础服务9——lamt架构

文章目录 一、基本了解二、安装tomcat三、 常用文件3.1 bin目录文件3.2 conf目录文件3.2.1 server.xml文件3.2.2 tomcat-users.xml 文件 四、分离部署lamt架构4.1 安装httpd4.2 安装mysql4.3 部署tomcat4.4 配置apache 一、基本了解 前提背景: Tomcat是Apache 软件基…

Git开发项目完整流程使用(图文超详解)

前世今生 自2002年开始,林纳斯托瓦兹(Linus Torvalds)决定使用BitKeeper作为Linux内核主要的版本控制系统用以维护代码。因为BitKeeper为专有软件,这个决定在社群中长期遭受质疑。在Linux社群中,特别是理查德斯托曼与…