作者 | 内容生态端团队

导读 

大语言模型(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-8Cache-Control: no-cache, no-transformConnection: keep-aliveX-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利用优化实际