逐字返回的内容如何做关键词屏蔽

309 天前
 brader
用过 chatgpt 产品的都知道,返回内容都是那种打字机效果,逐字返回显示的。
那么问题来了,这种如何做关键词屏蔽呢?
好像服务端做比较困难,因为关键词有多个字的,如果服务端等整句话检测完再返回内容给前端的话,体验就太糟糕了。
我目前能想到的兼顾原有用户体验的方式是放在客户端来检测屏蔽关键字,客户端每次接收到服务端的返回的字,就拼接之前接收到的内容,检测关键字,检测到了,就把展示的内容屏蔽替换。这样就还是有打字机的实时效果。

不知道各位有没有更好的实现想法,欢迎讨论
7095 次点击
所在节点    程序员
101 条回复
yolee599
309 天前
整段接收完,检测完,再逐字返回给客户端。至于延迟,都做检测了还考虑啥延迟
brader
309 天前
@yolee599 这样就太糟糕了啊,你知道一篇长回答的话,chatgpt 多久返回完吗,有超过 1 分钟的,如果用户每问个问题,都要等几十秒甚至 1 分钟以上,那完全没用户体验可言了
yougg
309 天前
那依靠文字排版的藏头藏尾你怎么流式处理?
brader
309 天前
@yougg 什么?没听懂你表达的意思,返回给用户的答案,是 chatgpt 的回答啊,chatgpt 又不是人,不会主动搞事情、搞伪装的,只是你知道国情的,有时候有些问题比较敏感,不允许用户问,和给用户展示答案的。
ChefIsAwesome
309 天前
你自己控制每收 n 个字,审查下,不就完事了。
InDom
309 天前
反过来,把接收到的字(尾)去关键词列表匹配(头)。

如果有匹配到,保留到缓冲区,继续接收下一个字,如果没匹配到,输出到客户端,清空缓冲区。

需要处理的是这样的情况,
文字流是:锄禾日当午
而黑名单列表有:禾日苗,日当午
时,因为匹配到一部分“禾日” 最后没有命中而导致没有去匹配“日当午”
JiangZeYi
309 天前
chatgpt 加一句只回答符合 XX 国情的答案
dobelee
309 天前
比较难啊,后面的内容还没计算完,你不可能知道是否有 g 点。
非要做只能加一个代理层,每接收到一段文字就检查并替换 g 点,然后再流式丢出去。缺点就是性能会大幅降低,很多算法优化派不上用场。
感概一下墙锅现状。
putyy
309 天前
1.你说的这种也可以在服务端做检查
2.先逐字返回客户端,等 chatgpt 返回完,服务端做好检查,然后在返给客户端覆盖已有内容
brader
309 天前
@ChefIsAwesome 每收 N 个字审查,也不是不行,体验也还能接受,但是检测效果会有影响的,举个例子:
假设“科学上网”这四个字是关键字,假如我服务端设定每接收 5 个字检测一次,那可能发生我接收到“xx 科学上”,这个没违规,下发给客户端,接着接收到“网 xxxx”,这个也没违规,下发给客户端。

不知道这个概率高不高,高的话,检测效果就太差了
brader
309 天前
@putyy 那你说的这种方式,在页面表现上和我说的方案的页面表现是一样的,所以我就还不如在客户端做检测,效率还高
milukun
309 天前
本地敏感词库,可以设置每次检测最近的 10 个字,在敏感词库里的就打 * 号隐藏
全部返回完之后再跑一次在线 API (阿里什么的之类的),获得最终屏蔽结果
本地的可以超严格,防止露馅,最后以 api 为准显示
brader
309 天前
@InDom 理解了一部分你的意思,但是又没完全理解,你看看我 10 楼的回答,你表达的意思是不是和我说的,可能检测效果不太准确?
milukun
309 天前
检测最近 10 个字是为了效率考虑,如果每出一个字都要全文分词或者查询,本地有个 4 万左右敏感词的话,后期就会很卡。(实测)
本地敏感词可以在 git 上找,有个什么 tx 离线词库的
brader
309 天前
@milukun 我们可能不会搞很高端的检测,就是关键词匹配就行了,所以检测服务自己很容易做。
关键是分段切割来检测,有可能出现漏检的问题,概率问题,你看看我 10 楼回答的,我大概就这个意思
yinmin
309 天前
从 chatgpt 流式获取,定期审核,模拟打字机效果流式发送给客户端

(1) 收到标点符号的 data 数据包或者累计 20 个 data 数据包,就去做一次内容审核(从会话头部到截断位置的内容)。一次回答会做多次内容审核的。
(2) 审核后的回复内容(data 数据包)写入缓冲区
(3) 每隔 20ms 从缓冲区取一个 data 数据包发给客户端 (模拟打字机效果)
brader
309 天前
@yinmin 分段检测比较尴尬的是会漏检,参考我 10 楼的回答
putyy
309 天前
@brader 有点不一样,相当于在没有得到全部结果之前是没有做任何检测的,接受完毕再检测,再替换客户端看到的信息
kennir
309 天前
关注一下,也在折腾相关的问题
brader
309 天前
@putyy 我说的也差不多意思,要完整再检测,客户端也可以这么做,而且自己就能直接换了,不需要通过服务端下发指令来交互替换

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/954296

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX