作者 | 内容生态端团队
导读
大语言模型(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 利用优化实际