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

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

不知道各位有没有更好的实现想法,欢迎讨论
7183 次点击
所在节点    程序员
101 条回复
MartinDai
332 天前
关键词的长度总是有限的吧,也不可能能太长,假设是 N 吧,后端做一个流式输出的桥接,里面存放 N 个字符的 buffer ,gpt 返回第 N+1 个字符以后,每接受一个字符就检查一遍关键词然后往前端输出一个字符,这样前端得到的结果也就比 gpt 晚 N 个字符
InDom
332 天前
@brader #13 不一样,这个做法是有点像白名单机制,只有这个字/词一定没有在黑名单中出现时才会输出到客户端。

就是把收到的字,都认为在黑名单中,一直等明确这个字与后面接受的字不在黑名单后,才把这个字输出到客户端。

相当于你收到的每一个字,都假设后面还没有收到的字与他所组成的词就是敏感词,等收到了更多的字,发现确实没有的时候,就将这个字输出到客户端,然后继续匹配剩下缓冲区的字有没有与词库有重合。

还是我上面的例子:(括号内为未输出的缓冲区)后面的是本次接收到的字符,没有就说明没有接收()
锄:在词库中没有,安全输出
禾:命中词库:禾日苗,不输出
(禾)日:命中词库:禾日苗,不输出
(禾日)当:未命中词库,输出第一个字。
-- (日):命中词库:日当午,不输出。
(日当):命中词库:日当午,不输出。
(日当)午:全量匹配,替换,输出 ***
muskill
332 天前
悲哀
brader
332 天前
@MartinDai
@InDom 我理解你们的意思了,这个方案是挺好的,客户端感受到的仅仅是开头字慢一会出来,后面应该是连续不断的出来回答的,很棒。

我整理思路就是:
假设我系统预设关键字最长为 4 个字,那么我从 chatgpt 接收到 6 个字的话,我能 100%确定前 3 个字是否违规,不违规直接输出,后面 3 个字可能现在不违规,但是有可能和未来的字组成违规词,所以暂不能输出。。。一直以此类推,后面就是源源不断的输出前面 100%能确定的不违规词。
是这样不?大佬
MoYi123
332 天前
收 10 个字, 全检查一下, 没问题返回前 5 个, 剩下 5 个, 然后再等到有 10 个字的时候再检查, 再根据情况把 10,5 这 2 个数字调整一下不就好了.
christin
332 天前
可以试试分段检查或者分句检查,检测到段落标记或者句号就开始丢进去审核,审核完再返回。
完整的一段或者一句不会出现你 10l 说得无法命中关键字的情况,一般都是一句话说完了就结束了,除非有人发现了你的检测方法让 ChatGPT 在中间加上段落标记或者句号。
Felldeadbird
332 天前
1. 后端设定 N 字 返回敏感检测。

2. 客户端接收到后续内容后,将当前输出区域中看到的所有文字发到敏感库,做全文敏感检测。
brader
332 天前
@MoYi123
@christin 嗯,这个思路可以,和前面 2 个大佬的思路差不多。我现在顺着这个思路思考接下来的问题了,我在思考和测试,在大流量下,关键字多了,这样分段频繁检测,服务器 CPU 能不能承受住
brader
332 天前
@Felldeadbird 嗯,在客户端做的话,和我开始说的差不多就是这个意思,这样服务端没有压力,只要客户端从服务端更新拉取关键字就行了
GTim
332 天前
chain filter 啊... 你把你的过滤器嫁接上游的逐字和往下游也逐字发啊,类似于命令行下载百分比和回退效果。

[0:'这是正常获取到的,直接追加即可']
[-3: ‘客户端收到文字后,删除最后 3 个字,然后追加给予的内容']
rockyliang
332 天前
@brader 回复 2 楼,其实现实中微信聊天,对方一般也是等全部内容输入完了才会发给你的,所以换到 chatgpt ,等全部内容接收完后,做一次检测再发送给用户这个我觉得问题不大。关键点是你要提醒用户你正在打字,比如“程序正在生成回答,已经生成了 xx 个字,请耐心等待”,总之就是不要让用户觉得你的程序卡住了
u20237
332 天前
前端做这个事比较合适。
MoYi123
332 天前
@brader 如果屏蔽词是用 ac 自动机的话, 可以给当前状态加一个深度, 就能精确地判断哪些部分是绝对安全, 哪些部分是不确定的.
u20237
332 天前
dig google.con

echo 127.0.0.1 is google.com

貌似后端
brader
332 天前
@rockyliang 表面上看和微信类似,但是实际上还是有所不同的,用户心理也有所不同,主要是有些长回答要等待时间太久了,几十秒甚至 1 分钟以上。
微信和别人聊天,我知道别人没有义务实时回答我,我会切开去干别的事情。
但是 chatgpt 这种实时问答应用,用户的忍耐度低的多,这时候的用户,是渴望急于获取到答案的,让用户等待 1 分钟以上,太漫长了,就好比你去搜搜索引擎,如果搜索引擎等待 1 分钟再出结果给你,你肯定会抛弃他。
除了体验不好一个原因,另一个原因是用户有选择的余地,比如百度要 1 分钟返回结果,360 搜索却秒回,那你肯定抛弃百度了。
我做的 chatgpt 应用也是同理的,你为了检测等 1 分钟,但是别家做的,却可以实时返回,高下立判
jiaoery
332 天前
我记得 chatgpt 上是可以加 prompt 屏蔽规则的,这样在生产端就给你屏蔽了,不用自己再搞一次;
brader
332 天前
@jiaoery 这是个新鲜玩意,我去试试
Admstor
332 天前
如果你做的不是套皮产品,那么自然应该在语料库,算法上调节,保证党性

如果你特么是套皮产品,我只能说,贱不贱阿
fzls
332 天前
我前几天使用 bing 问了一个问题(中国朝鲜族与韩国人的关系),bing 先是一个个输出答案,最后输出完的时候,他应该是进行了检测,发现可能有政治风险,就立刻把答案替换成当前问题无法解答(具体内容忘了)

我觉得可以参考下这种,不过这样的话万一用户在中途截图,然后举报就麻烦了
InDom
332 天前

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

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

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

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

© 2021 V2EX