AI文本创作在百度App发文的实践

news2024/10/7 20:26:57

作者 | 内容生态端团队

导读

大语言模型(LLM)指包含数百亿(或更多)参数的语言模型,这些模型通常在大规模数据集上进行训练,以提高其性能和泛化能力。在内容创作工具接入文心一言AI能力后,可以为用户提供更加智能化、个性化的服务,帮助作者降低创作难度和创作成本、提升创作效率,更好地创作自己的作品。本文简述了基于文心一言大模型,落地AI文本创作的基本流程,也是内容创作与AI结合的初步尝试,随着生成式AI创新应用的持续推进,将陆续发布基于图片和视频的更多特色玩法,敬请期待!

全文4732字,预计阅读时间12分钟。

01 背景

随着科技的飞速发展,人工智能领域的大模型技术也日益引人注目。在大模型的广泛应用中,我们看到了其在各种场景下的巨大潜力和价值。大模型技术的发展不仅推动了各个行业的创新和变革,也正在改变着我们对人工智能的理解和预期。

大语言模型(LLM)指包含数百亿(或更多)参数的语言模型。这些模型通常通过在大规模数据集上进行训练,以提高其性能和泛化能力。大型模型的出现受益于计算能力的提升和数据的可获得性增加,使得研究人员能够构建更复杂、更强大的模型来解决各种现实世界的问题。

常见的大模型比如OpenAi的ChatGPT、百度的文心一言,可以更好的理解和生成自然语言。通过对大量文本数据进行训练,它们能够捕捉到语言中的语法、语义和上下文信息。这使得它们在回答问题、提供解释、生成文本和进行对话时更加准确和流畅。并且一经推出,便引起了社会的广泛关注。大语言模型的技术发展对整个AI社区产生了重要影响,也彻底改变我们开发和使用AI算法的方式。

在百度App动态发文接入文心一言AI能力后,可以为用户提供更加智能化、个性化的服务,帮助作者降低创作难度和创作成本、提升创作效率,更好地创作自己的内容。

02 项目介绍

下图展示了在百度App - 发布动态中,AI文本创作的示例。

在这里插入图片描述

内容输入

在这里插入图片描述

AI写诗创作中

在这里插入图片描述

AI写诗创作完成

2.1 整体架构

图片

百度App动态发布器的AI创作是基于百度文心一言的辅助创作功能,可以根据用户的输入续写、改写,以及一些提示词去智能生成文案。

整体业务分为三层:

1、最顶层为业务层,包含端/H5/小程序等实现的手百AI辅助创作、AI笔记等;

2、中间为策略层,提供prompt模版配置能力、输入输出策略控制能力、配置信息管理能力等;

3、底层为文心一言、风控服务等基础服务。

2.2 全流程

图片

业务层调用百家号创作大脑服务,获取账号权限、功能权限、prompt模版配置等信息,根据权限展示功能类型,如:日常动态、AI写诗、旅游出行等;用户输入文案,访问创作大脑文案生成接口,创作大脑校验账号、权限、模版信息,权限校验通过之后访问风控词表,对输入信息进行风控管理;最终创作大脑携带prompt和用户输入问题访问一言服务,获取经过AI润色的文案。

03 关键技术

3.1 Prompt

Prompt(提示词),是给一个大型机器学习模型输入的指令或问题,以引导它生成相应的回答或输出。它通常是一个文本字符串,用于描述所需的信息或任务,并向模型提供上下文和指导,以产生期望的回应。比如在文心一言大模型基础下进行对话、文本生成或其他任务,Prompt起到了引导模型生成输出的作用。良好设计的Prompt可以帮助模型更准确地理解用户的意图,并生成相关和有用的回答,真正有产业/社会价值。一个好的、优质的prompt需要充分发挥我们的理解和想象力,并调动大模型的能力,从而提升我们的工作效率。

3.1.1 Prompt基础定义

Prompt(提示词),简而言之就是驱动大模型进行表达的文本描述。

Prompt 公式 = 任务 + 生成主体 + 细节(可选) + 形式(可选)。

任务:希望模型完成的任务类型,如写诗

主体:生成对象,如写夏日的诗

细节:是否包含表情等细节输出

形式:排版、内容风格

通常优质的Prompt满足以下三点:

表达清晰:通俗易懂,表达简洁清晰,做到不仅可以让模型生成出好的内容,普通人也可以明白其中的含义。

通用型强:在同类任务上,更换主体词后仍有不错效果。

生成稳定:相同提示词情况下,多次生成的内容足够稳定。

优质的Prompt + 大模型 = 优质内容。

3.1.2 Prompt配置

百度App动态发布器提供多款AI创作功能,每个能力会内置一个描述,方便用户进行提问,并且得到满足期望的文案,我们提供如下几个分类:

全文续写:要求大模型使用简洁的语言,为用户续写

全文改写:要求大模型是一位文章改写助手,修改语病并润色用户的内容

日常动态:要求大模型以用户输入为主题,写一段简短的日常动态

AI写诗:要求大模型为用户输入的主题创作简短的诗歌

好物推荐:要求大模型采用活泼的语言风格,写一篇好物推荐文案

旅游出行:要求大模型写一篇旅游出行的随笔,帮助用户表达见闻

3.2 风险控制

在Prompt中增加防御性指令,防止有人恶意Prompt注入,操纵提示词,诱导模型返回非预期的结果,因此我们在整个生产流程会经历如下防范措施:

  • 输入内容返回内容接入内容风控能力,过风控词表;

  • 一言返回清屏以及命中安全词表的情况下,清除用户输入内容;

  • 记录用户信息,根据输入输出内容风险情况对高风险账号进行封禁;

  • 定期巡查历史记录进行分析。

3.3 SSE协议

为了提高聊天的流畅性和响应速度,文心一言采用了SSE作为服务端推送技术。它允许服务端向客户端发送事件,相对于WebSockets或长、短轮询技术,SSE提供了更简单的方式来实现推送。

响应头需添加以下内容:

Content-Type: text/event-stream; charset=utf-8
Cache-Control: no-cache, no-transform
Connection: keep-alive
X-Accel-Buffering: no

客户端通过HTTP GET请求建立与服务器的连接,并指定接收text/event-stream类型的数据,服务器在收到请求后,不立即返回响应,而是保持连接打开,并根据用户的输入生成回复,服务器在生成回复后,将回复作为一个事件发送给客户端,并保持连接打开,等待下一个输入,客户端在收到事件后,解析事件中的数据,并显示在聊天界面上,客户端和服务器之间可以通过同一个连接持续交换数据,直到客户端关闭连接或者服务器出现异常。

相比较于其他方案,SSE使用更简单,不需要添加任何新组件,只需使用现有的后端语言和框架即可。SSE完全复用现有的HTTP协议,因此可以直接运行于现有的代理服务器和认证技术。SSE在浏览器端提供了原生的EventSource对象,可以方便地监听和处理服务器发送的事件。SSE支持断线重连和消息追踪的功能,可以保证数据的完整性和一致性。

3.4 渐变流式展示组件

客户端会根据server返回的数据,进行流式展示。分成下面几个阶段:初始等待、展示中、展示结束,几个状态转换中,对样式的展示也存在不同的变换。

图片

初始等待:需要展示光标并进行光标闪烁。

展示中:要求逐个展示文案且光标闪烁。

展示结束:需要展示完整文案以及隐藏光标。

3.4.1 自定义TextView

以Android为例,首先初始化等待和展示中两个状态,看起来很像Android的EditText组件,但是EditText组件需要处理光标展示、焦点获取、键盘弹出、屏蔽编辑等组合事件,功能上显得不纯粹,还可能存在适配问题。考虑到这里决定通过继承TextView自定义View来实现。

我们只需要考虑3个点,一是逐字显示,二是文字渐变,三是光标。

逐字显示

  • 我们通过自定义Handler定时器对文字进行不断截取后展示即可。

文字渐变

  • 参考常用的ForegroundColorSpan源码会发现,ForegroundColorSpan是通过继承CharacterStyle并实现UpdateAppearance,最终通过重写对应的updateDrawState方法来实现的文字颜色的变更。同样我们也可以通过设置画笔为渐变色并给出渐变色的起止位置,就可以实现文字颜色的渐变效果。而画笔Paint的渐变则可以通过常用api中的LinearGradient来实现就可以了。
override fun updateDrawState(tp: TextPaint?) {
    tp ?: return
    val leadingWidth = tp.measureText(containingText, 0, gradientStart)
    val gradientWidth = tp.measureText(containingText, gradientStart,
            gradientEnd)
    val lineGradient = LinearGradient(
            leadingWidth,
            0f,
            gradientWidth,
            0f,
            intArrayOf(startColorInt, endColorInt),
            floatArrayOf(0f, 1f),
            Shader.TileMode.CLAMP
    )
    tp.shader = lineGradient
}

光标

  • 光标添加:考虑如何每次把光标显示在文案的最后呢?这里我们参考ReplacementSpan,也是通过自定义的Span的方式。ReplacementSpan中有2个方法分别是getSize() 和 draw()方法。getSize() 该方法的返回值会被作为要替换文字的width,draw()在该方法内绘制我们需要的光标到画布中,我们只需要在draw()中,绘制合适大小的圆角矩形的作为光标。
override fun getSize(paint: Paint, text: CharSequence?,
                  start: Int, end: Int, fm: Paint.FontMetricsInt?): Int {
    return paint.measureText(" ").toInt()
}

override fun draw(canvas: Canvas, text: CharSequence?, start: Int, end: Int, x: Float,
                  top: Int, y: Int, bottom: Int, paint: Paint) {
    canvas.drawRoundRect(x,
            top.toFloat(), x + width, bottom.toFloat(), rx, ry, cursorPaint)
}
  • 光标闪烁:这里可以使用ValueAnimator动画更新Alpha值,并将Alpha值设置给画笔的透明度。
override fun draw(canvas: Canvas, text: CharSequence?, start: Int, end: Int, x: Float,
                  top: Int, y: Int, bottom: Int, paint: Paint) {
    cursorPaint.alpha = (alpha * 255).toInt().coerceAtMost(255)
    canvas.drawRoundRect(x,
            top.toFloat(), x + width, bottom.toFloat(), rx, ry, cursorPaint)
}

04 总结

本文简述了基于文心一言等大模型,落地AI文本创作的基本流程,也是内容创作与AI结合的初步尝试,随着生成式AI创新应用的持续推进,将陆续发布基于图片和视频的更多特色玩法,敬请期待!

——END——

推荐阅读

DeeTune:基于 eBPF 的百度网络框架设计与应用

百度自研高性能ANN检索引擎,开源了

存储方案作为产品——Midgard探索

百度垂类离线计算系统发展历程

度加剪辑App的MMKV应用优化实践

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

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

相关文章

红帽 RHEL 源码限制成契机,AlmaLinux 获捐更可“做自己”

导读红帽在两个月前发布公告声称,将限制对 Red Hat Enterprise Linux (RHEL) 源代码的访问,早前曾报道,此举导致 AlmaLinux 、Rocky Linux 等 Linux 发行版未来发展严重受阻。 对于这一决策,AlmaLinux OS 基金会主席 Benny Vasque…

使用 RESNET50 基于迁移学习的患者肾结石预测-附免费源码与数据集

肾结石并不是一个新课题,但它是当今主要的健康问题之一,如果不及早发现,也可能危及生命。一小块结石可能会通过尿道,但不会引起症状。如果结石长到超过 5 毫米,就会导致输尿管阻塞,导致下背部或腹部剧烈疼痛。因此,有必要采取一种方法来检测肾脏结石,以避免进一步的健康…

【触觉智能 Purple Pi OH 开发板体验】检测Android系统的完备性

本文转载于Purple Pi OH开发爱好者,作者yinwuqing。 今天具体来分享一下,烧录Android11后的系统运行状况。 板子按照常规的外设需求,连接HDMI(当然我们烧写的系统镜像文件是基于HDMI接口显示的)、键盘、鼠标,展示如下图&#xf…

ArcGIS Pro将SHP文件转CAD并保留图层名称

相信大家应该都使用过ArcGIS将SHP文件转CAD格式,转换过后所有的要素都在一个图层内,那么有没有办法将SHP文件某个字段的值作为CAD的图层名字呢,答案是肯定的,这里就为大家介绍一下ArcGIS Pro转CAD文件并且保留图层名称的方法&…

京东API接入说明(京东商品详情+关键词搜索商品列表)商品详情数据,店铺所有商品

随着电子商务的飞速发展,京东作为国内领先的电商平台,提供了丰富的API接口,帮助开发者轻松集成电商功能,扩展业务范围。本文将介绍京东API接口的作用和价值,探讨适用场景,操作步骤,优势分析及应…

精品基于NET实现的图书馆借阅管理系统

《[含文档PPT源码等]精品基于NET实现的图书馆借阅管理系统》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具: 开发软件:VS 2017 (版本2017以上即可,不能低于2017) …

Uboot中bootargs以及bootcmd设置

Uboot命令 一、Uboot基础命令 查看帮助信息: uboot#help打印环境变量: uboot#printenv其他命令: uboot#help ? - 帮助命令,等同于 help base - 打印或设置地址偏移量 bdinfo - 打印板级信息结构 boot …

日常开发小汇总(6)元素跟随鼠标移动(在视口下移动)

<div class"mark"><h1>title</h1><div><p>title 鼠标移动 盒子整体移动</p><p>test</p><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Modi, porro.</p></div></div>cons…

一文读懂:苹果手机怎么录屏?

“刚买的苹果14&#xff0c;最近需要用来录屏&#xff0c;找了很久都没找到&#xff0c;朋友说苹果手机没有录屏功能&#xff0c;可是我半信半疑&#xff0c;花了这么多钱买的&#xff0c;怎么可能没有录屏功能呢&#xff0c;有人知道苹果手机怎么录屏吗&#xff1f;” 苹果手…

Swift如何使用Vision来识别获取图片中的文字(OCR),通过SwiftUI视图和终端命令行,以及一系列注意事项

在过去的一年里&#xff0c;我发现苹果系统中的“文字搜图片”功能非常好用&#xff0c;这个功能不光 iPhone/iPad&#xff0c;Mac 也有&#xff0c;找一些图片真的很好用。但是遇到了一个问题&#xff1a;这个功能需要一段时间才能找到新的图片&#xff0c;而且没法手动刷新&a…

通信原理板块——信道的数学模型

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 1、调制信道和编码信道 调制信道适…

学习笔记|回顾(1-12节课)|应用模块化的编程|分时复用|STC32G单片机视频开发教程(冲哥)|阶段小结:应用模块化的编程(下)

文章目录 搜索功能寻址变量bdataTips:missing declaration specifiers错误的解决分时复用的简单应用 二、按键处理思路分析原有程序实现的功能&#xff1a;需求分析&#xff1a;定义功能码&#xff0c;功能定义为&#xff1a; key的取值示例 三、按键处理四、定时器利用time0实…

【数据库】Navicate运行数据区sql文件 1046 no database selected

文章目录 前言一、现象二、解决 前言 要通过Navicat导入数据库文件&#xff0c;但是不成功报错1046 no database selected 一、现象 选中已经建立的连接&#xff0c;右键运行sql文件&#xff0c;报错 二、解决 1、先在建立的localhost中右键建立和要导入数据库同名的数据…

ipad手写笔什么牌子好?apple pencil二代平替笔推荐

近年来&#xff0c;电容笔越来越受到大家的青睐&#xff0c;已然成为人们提高生产效率的数码产品之一。然而&#xff0c;市面上的电容笔大多质量都参差不齐&#xff0c;很多人也不知道哪个品牌的电容笔比较好。针对这个问题&#xff0c;我来给大家分享几款电容笔&#xff0c;都…

斐波那契堆——怎么发明一种非常聪明的数据结构——学习笔记

我是目录 0. 前言1. Fibonacci Heap介绍1.1 简单回顾堆和优先队列1.2 二项树1.3 二项堆 2. 那怎么推导出Fibonacci Heap&#xff1f;2.1 实现GetMin2.2 实现Insert2.3 实现ExtractMin2.4 实现DecreaseKey2.5 关键部分 3. 那么&#xff0c;和斐波那契数列有什么关系&#xff1f;…

【nvm版本】控制node版本

使用nvm切换node版本 nvm安装开始安装选择安装路径选择node安装位置点击完成即可测试是否安装成功查询可下载的node版本如果没有node版本&#xff0c;就安装一下镜像地址 nvm安装 nvm安装路径 开始安装 选择安装路径 选择node安装位置 点击完成即可 测试是否安装成功 cmd中…

UI库DHTMLX Suite v8.2发布全新表单组件,让Web表单实现高度可定制!

DHTMLX Suite v8.2日前已正式发布&#xff0c;此版本的核心是DHTMLX Form&#xff0c;这个小部件接收了4个备受期待的新控件&#xff0c;如Fieldset、Avatar、Toggle和ToggleGroup。官方技术团队还为Grid和TreeGrid小部件中的页眉/页脚工具提示提供了一系列新的配置选项等。 在…

Scrum敏捷开发流程及关键环节

​Scrum是一种敏捷开发流程&#xff0c;它旨在使软件开发更加高效和灵活。Scrum将软件开发过程分为多个短期、可重复的阶段&#xff0c;称为“Sprint”。每个Sprint通常为两周&#xff0c;旨在完成一部分开发任务。 在Scrum中&#xff0c;有一个明确的角色分工&#xff1a; 产…

一个好玩的浏览器插件

背景 最近抽空开发了一个有意思的浏览器插件。背景是我们在开发过程中有时需要做一些测试验证&#xff0c;需要修改请求头字段和响应头字段的内容&#xff0c;有时需要在页面做测试&#xff0c;反复请求同一个接口&#xff0c;并修改一些字段。 如果此时使用nginx做代理转发再…

HashMap、HashTable、CurrentHashMap对比

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;Java、集合、Map、CurrentHashMap☀️每日 一言&#xff1a;坚持自己的风格&#xff0c;面对未知的一切&#xff01; 一、HashMap、HashTable、CurrentHashMap对比 1.1 CurrentHashMap和HashMap…