文心一言赋能问卷生成,打造高效问卷调研工具

当前,各种大语言模型(LLM,Large Language Model)井喷式发展,基于LLM的应用也不断涌现。但是,当开发者基于LLM开发下游应用时,LLM直接生成的结果在格式、内容等方面都存在许多不确定因素,难以与其他业务逻辑代码做数据交互,导致开发者需要多次生成并对输出结果做大量的规则判断处理工作,使得大模型原生应用的开发门槛抬高、难度加大。

为此,本文以问卷页面生成任务为例,手把手教大家控制ERNIE SDK输出JSON格式的生成结果并与前端交互,实现通过ERNIE SDK生成问卷网页的目的。通过本文,你将学习到:

  • 前后端交互的桥梁——JSON
  • 用LLM2Json控制文心大模型4.0的输出格式
  • 基于文心大模型的原生应用开发流程

JSON数据结构

本文任务的核心是生成交互数据,前后端的交互数据常用格式有JSON和XML。由于JSON格式结构简单,容易被各大常用开发语言解析和生成,因此目前绝大多数Web应用使用JSON格式进行交互。

JSON数据根据结构的复杂度可简单可分成两种,单层结构和多层嵌套结构。

单层结构

单层数据结构是类似于 {key1: value1, key2: value2, …} 这样只有一层键值对关系的结构,相对来说比较简单,生成可控度高,不容易出错。比如:

{"address": "北京市朝阳区XXX路XXX号","date": "2023-06-25","email": "zhangsan@example.com","idcode": "110101199003077777","name": "张三","phone": "13800000000","sex": "男"
}

多层嵌套结构

多层嵌套结构是比较复杂的数据结构,如例子所示,在address的第一层级下,嵌套了第二层级的city、area、road和detail字段。在真实业务场景中,数据结构体往往是多层嵌套,字段多,嵌套关系也比较复杂,因此该类数据结构体生成的难度比较大,容易出现一些纰漏导致数据解析不正确而报错。

{"address": {"city": "北京市","area": "朝阳区","road": "XXX路","detail": "XXX号"},"date": "2023-06-25","email": {"common": "zhangsan@example.com","backup": "zhangsan@example1.com"},"idcode": "110101199003077777","name": "张三","phone": "13800000000","sex": "男"
}

本文的问卷网页生成任务,本质上就是生成一个多层嵌套结构的数据,并与前端交互渲染形成可视化网页,下面开始给大家演示和解析代码。

动手开发

安装依赖

本项目需要主要依赖erniebot和llm2json两个包。ERNIE SDK用于调用文心一言的文本生成能力,目前支持ernie-3.5、ernie-turbo、ernie-4.0、ernie-longtext等多个版本等模型直接调用。LLM2Json是一个易于使用的格式化大语言模型输出工具包,它的主要设计思想和部分实现代码参考LangChain。它可以通过自动构建prompts引导大语言模型输出符合JSON语法的返回数据,解决了大语言模型格式化输出、数据交互、前端开发等遇到的数据格式相关问题,使下游的应用程序、GPTs、Agents等开发更加方便快捷。

pip install erniebot --upgrade
pip install llm2json

配置 ERNIE SDK

对ERNIE SDK进行简单的封装,以便后面代码快速调用。请注意将access_token换成你的aistudio账户对应的token,同时保证token余额充足。另外,本项目演示使用ernie-4.0版本,在测试环境中4.0版本的表现最优,开发者可根据自己的成本和推理速度需求更换为ernie-3.5、ernie-turbo等版本。

import ernieboterniebot.api_type = "aistudio"
erniebot.access_token = "xxxxxxxxxxxxxxxxxxx"def ernieChat(content):response = erniebot.ChatCompletion.create(model = "ernie-4.0",messages = [{"role": "user","content": content}])return response.get_result()

定义数据结构

一份问卷的生成结构至少有两层。第一层是title(问卷标题)、description(问卷描述)和最核心的data(问题列表)结构体。第二层是对data嵌套数据的定义。在data下面有若干个问题和选项,并且问题类型有单选题、多选题、填空题,因此,这里需要针对问题定义一个新的对象Question,第一个键是types,用于确定问题类型,它是整数型的数据(1为单选,2为多选,3为填空);第二个是question,定义问题;第三个是choices问题对应的选项内容,数据类型是列表list。

from typing
import List
from llm2json.prompts.schema
import BaseModel, Fieldclass Question(BaseModel):types: int = Field(description = "问题类型,1为单选,2为多选,3为填空")question: str = Field(description = "问题内容")choices: List[str] = Field(description = "选项内容")class WenJuan(BaseModel):title: str = Field(description = "问卷标题")description: str = Field(description = "问卷描述")data: List[Question] = Field(description = "问题列表")

定义正例

因为多层嵌套的数据结构体比较复杂,因此建议开发者最好给模型输入一个正确示例,让模型生成的输出结果更加完美和稳定。

correct_example = ''
' {"title": "问卷标题","description": "问卷描述","data": [{"types": 1,"question": "问题(单选)""choices": ["选项1", "选项2", "选项3"]},{"types": 2,"question": "问题(多选)""choices": ["选项1", "选项2", "选项3"]},{"types": 3,"question": "问题(填空)"},]
}
''
'

定义Prompt任务模板

Prompt任务模版主要是告诉大语言模型需要生成的内容,以及定义用户输入变量。在本案例中,我们的目的是生成问卷,用户输入的变量是问卷的主题(topic)和问题的数量(num),并将3、4中定义好的数据结构和正例传入。

from llm2json.prompts import Templatest = Templates(prompt="""
请你根据主题<{topic}>,设计一份问卷。
问卷描述需要简单说明该问卷调研的目的。
问卷题型需包含单选、多选和填空题,对应types分别为1、2、3。
如果题目类型为填空题,该题不需要返回choices字段。
出题题型顺序请随机生成。
题目总数为{num}道题。
""", 
field=WenJuan,
correct_example=correct_example)

测试生成

以文心一言用户反馈作为问卷的主题,生成一份包含10道题的问卷。

from llm2json.output import JSONParser
from pprint import pprint# 将用户输入替换模型变量
template = t.invoke(topic="文心一言用户反馈", num="10")
# 将Prompt模版提交给ErnieBot
ernieResult = ernieChat(template)# 解析生成结果
parser = JSONParser()
result = parser.to_dict(ernieResult)
pprint(result)

运行后,会得到如下图所示的数据:

前端绑定渲染

获得生成后的JSON格式数据,就可以与前端代码结合,解析数据结构体、绑定字段并渲染。前端的核心代码主要是对问卷类型的判断,然后根据问卷类型,也就是types的值匹配不同的表单组件。(此处只展示前端核心代码部分,完整前端代码请通过文章最后的项目链接获取)

<div class="choices">
<!--单选题-->
<div v-if="item.types==1">
<a-radio-group v-model:value="item.choices.keys">
<a-radio v-for="choice in item.choices" :value="choice">
{{ choice }}
</a-radio>
</a-radio-group>
</div><!--多选题-->
<div v-else-if="item.types==2">
<a-checkbox-group 
:options="item.choices" />
</div><!--填空题-->
<div v-else-if="item.types==3">
<a-input style="max-width:300px"/>
</div>
</div>

前端渲染结果:

快速体验

本项目以问卷网页生成任务为案例,为大家介绍了控制大语言模型格式化输出JSON多层嵌套结构数据并与前端字段绑定做数据交互的流程。通过利用JSON数据结构进行前后端的链接交互,开发者可以将大语言模型的能力轻松集成到现有OA、ERP和CRM等系统,快速赋能企业已有业务,实现办公智能化升级;或从零开始高效开发大模型原生应用,不再担心数据结构解析出错等灾难性问题,为用户提供更好的服务体验。

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

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

相关文章

【数据结构和算法初阶(C语言)】二叉树的顺序结构--堆的实现/堆排序/topk问题详解---二叉树学习日记②

目录 ​编辑 1.二叉树的顺序结构及实现 1.1 二叉树的顺序结构 2 堆的概念及结构 3 堆的实现 3.1堆的代码定义 3.2堆插入数据 3.3打印堆数据 3.4堆的数据的删除 3.5获取根部数据 3.6判断堆是否为空 3.7 堆的销毁 4.建堆以及堆排序 4.1 升序建大堆&#xff0c;降序建小堆 4.2堆…

【C语言步行梯】一级指针、二级指针、指针数组等 | 指针详谈

&#x1f3af;每日努力一点点&#xff0c;技术进步看得见 &#x1f3e0;专栏介绍&#xff1a;【C语言步行梯】专栏用于介绍C语言相关内容&#xff0c;每篇文章将通过图片代码片段网络相关题目的方式编写&#xff0c;欢迎订阅~~ 文章目录 什么是指针&#xff1f;指针的大小指针类…

SpringMVC | SpringMVC中的“JSON数据交互“ 和“RESTful支持“

目录: 1.JSON 数据交互1.1 JSON概述1.2 JSON的“数据结构”对象结构数组结构 1.3 JSON的“数据转换” (JSON交互) 作者简介 &#xff1a;一只大皮卡丘&#xff0c;计算机专业学生&#xff0c;正在努力学习、努力敲代码中! 让我们一起继续努力学习&#xff01; 该文章参考学习教…

HUAWEI Pocket 2外屏实时查看App动态,小小窗口大便捷

当我们点外卖、等候飞机时&#xff0c;不少人习惯频繁点亮手机查看外卖配送进度、值机时间。 这时候&#xff0c;手机亮屏、解锁、打开对应App查看状态对于我们来说就显得非常繁琐。而华为Pocket 2结合HarmonyOS 4系统的实况窗功能&#xff0c;与常显外屏的搭配使用&#xff0…

微服务技术栈SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式(五):分布式搜索 ES-下

文章目录 一、数据聚合1.1 聚合种类1.2 DSL实现聚合1.3 RestAPI实现聚合1.4 演示&#xff1a;多条件聚合 二、自动补全2.1 拼音分词器2.2 自定义分词器2.3 DSL自动补全查询2.5 实现酒店搜索框自动补全2.5.1 修改酒店索引库数据结构2.5.2 RestAPI实现自动补全查询2.5.3 实战 三、…

CSS案例-2.简单版侧边栏练习

效果 知识点 标签显示模式 块级元素 block-level 常见元素:<h1>~<h6>、<p>、<div>、<ul>、<ol>、<li>等。 特点: 独占一行长度、宽度、边距都可以控制宽度默认是容器(父级宽度)的100%是一个容器及盒子,里面可以放行内或者…

Docker部署TeamCity来完成内部CI、CD流程

使用TeamCity来完成内部CI、CD流程 本篇教程主要讲解基于容器服务搭建TeamCity服务&#xff0c;并且完成内部项目的CI流程配置。至于完整的DevOps&#xff0c;我们后续独立探讨。 一个简单的CI、CD流程 以下分享一个简单的CI、CD流程&#xff08;仅供参考&#xff09;&#…

SCI一区 | Matlab实现RIME-TCN-BiGRU-Attention霜冰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现RIME-TCN-BiGRU-Attention霜冰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现RIME-TCN-BiGRU-Attention霜冰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程…

DEYOv2: Rank Feature with Greedy Matchingfor End-to-End Object Detection

摘要 与前代类似&#xff0c; DEYOv2 采用渐进式推理方法 来加速模型训练并提高性能。该研究深入探讨了一对一匹配在优化器中的局限性&#xff0c;并提出了有效解决该问题的解决方案&#xff0c;如Rank 特征和贪婪匹配 。这种方法使DEYOv2的第三阶段能够最大限度地从第一和第二…

Pytorch环境下基于Transformer模型的滚动轴承故障诊断

注意力机制是深度学习中的重要技术之一&#xff0c;正日益受到重视关注。注意力机制作为一种信息贡献筛选的方法被提出&#xff0c;它可以帮助神经网络更多地关注与任务相关的特征&#xff0c;从而减少对任务贡献较小信息的影响。因此&#xff0c;利用注意机制可以提高神经网络…

ArcGIS巧思制作3D景观地图

John Nelson 又制作了一个制图教程视频,我原以为只是一个简单的局部场景DEM夸张实现的3D地图。 不过细看以后…… 还就是比较简单的3D场景地图,操作不难,但是 John Nelson 就是天才。 为什么? 他使用 ArcGIS Pro,在普通的3D地图中,不仅仅是图层混合制作地形效果,还巧妙的…

51-32 CVPR’24 | 3DSFLabelling,通过伪自动标注增强 3D 场景流估计

24 年 2 月&#xff0c;鉴智机器人、剑桥大学和上海交通大学联合发布CVPR24工作&#xff0c;3DSFLabelling: Boosting 3D Scene Flow Estimation by Pseudo Auto-labelling。 提出 3D 场景自动标注新框架&#xff0c;将 3D 点云打包成具有不同运动属性的 Boxes&#xff0c;通过…

【光伏监控系统的相关产品有哪些】Acrel-1000DP分布式光伏监控系统

光伏发电系统是指无需通过热过程直接将光能转变为电能的发电系统。通常由光伏方阵、蓄电池组&#xff08;蓄电池控制器&#xff09;、逆变器、交流配电柜和太阳跟踪控制系统等设备组成。其特点是可靠性高、使用寿命长、不污染环境、能独立发电又能并网运行。 分布式光伏监控系…

高防服务器秒解是什么意思

高防服务器秒解是指高防服务器在遭受大规模的DDoS攻击时&#xff0c;能够迅速解决问题或应对攻击。DDoS攻击是指攻击者通过向目标服务器发送大量的请求&#xff0c;使服务器资源耗尽或无法正常响应其他合法用户的请求&#xff0c;从而导致服务不可用。高防服务器通过具备高性能…

upload-labs-pass01

1.安装好环境进入关卡&#xff08;记得打开小皮&#xff09; 2.可以看到第一关是要求上传图片&#xff0c;但是同时限制了图片类型&#xff0c;那么如果我们将木马写入图片&#xff0c;但是类型又不在白名单&#xff0c;就要想办法绕过 3.可以看到这里的要求是有check&#xff…

数据结构:栈「详解」

目录 一&#xff0c;栈的定义 二&#xff0c;栈的基本操作 1&#xff0c;顺序栈 1.1顺序栈的基本概念 1.2顺序栈的基本操作 2&#xff0c;链栈 2.1链栈的基本概念 2.2链栈的种类 2.3链栈的基本操作 三&#xff0c;栈的应用 1&#xff0c;函数递归调用 2&#xff0c;…

基于支持向量机(svm)的人脸识别

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 数据集加载与可视化 from sklearn.datasets import fetch_lfw_people faces fetch_lfw_people(min_faces_per_person60) # Check out sample…

REDHAWK——连接(续)

文章目录 前言一、突发 IO1、数据传输①、输入②、输出 2、突发信号相关信息 (SRI)3、多输出端口4、使用复数数据①、在 C 中转换复数数据 5、时间戳6、端口统计①、C 二、消息传递1、消息生产者①、创建一个消息生产者②、发送消息 2、消息消费者①、创建消息消费者②、注册接…

优化选址问题 | 基于节约算法求解考虑碳排放及带时间窗的物流选址问题附matlab代码

目录 问题代码问题 节约算法(Savings Algorithm)通常用于解决车辆路径问题(Vehicle Routing Problem, VRP),特别是当需要考虑如何有效地组织车辆的路线以最小化总行驶距离时。然而,当问题扩展到包括碳排放和带时间窗的物流选址问题时,算法需要相应的调整。 在这个扩展…

VSCode创建用户代码片段-案例demo

示例 - 在线生成代码片段 Vue3代码片段 {"vue3": {scope": "javascript,typescript,html,vue","prefix": "vue3","body": ["<template>","$1","</template>",""…