1
yolee599 2023-07-05 15:04:53 +08:00
整段接收完,检测完,再逐字返回给客户端。至于延迟,都做检测了还考虑啥延迟
|
2
brader OP @yolee599 这样就太糟糕了啊,你知道一篇长回答的话,chatgpt 多久返回完吗,有超过 1 分钟的,如果用户每问个问题,都要等几十秒甚至 1 分钟以上,那完全没用户体验可言了
|
3
yougg 2023-07-05 15:11:13 +08:00
那依靠文字排版的藏头藏尾你怎么流式处理?
|
4
brader OP @yougg 什么?没听懂你表达的意思,返回给用户的答案,是 chatgpt 的回答啊,chatgpt 又不是人,不会主动搞事情、搞伪装的,只是你知道国情的,有时候有些问题比较敏感,不允许用户问,和给用户展示答案的。
|
5
ChefIsAwesome 2023-07-05 15:17:10 +08:00
你自己控制每收 n 个字,审查下,不就完事了。
|
6
InDom 2023-07-05 15:18:47 +08:00 2
反过来,把接收到的字(尾)去关键词列表匹配(头)。
如果有匹配到,保留到缓冲区,继续接收下一个字,如果没匹配到,输出到客户端,清空缓冲区。 需要处理的是这样的情况, 文字流是:锄禾日当午 而黑名单列表有:禾日苗,日当午 时,因为匹配到一部分“禾日” 最后没有命中而导致没有去匹配“日当午” |
7
JiangZeYi 2023-07-05 15:19:31 +08:00 via Android 6
chatgpt 加一句只回答符合 XX 国情的答案
|
8
dobelee 2023-07-05 15:20:10 +08:00
比较难啊,后面的内容还没计算完,你不可能知道是否有 g 点。
非要做只能加一个代理层,每接收到一段文字就检查并替换 g 点,然后再流式丢出去。缺点就是性能会大幅降低,很多算法优化派不上用场。 感概一下墙锅现状。 |
9
putyy 2023-07-05 15:20:27 +08:00
1.你说的这种也可以在服务端做检查
2.先逐字返回客户端,等 chatgpt 返回完,服务端做好检查,然后在返给客户端覆盖已有内容 |
10
brader OP @ChefIsAwesome 每收 N 个字审查,也不是不行,体验也还能接受,但是检测效果会有影响的,举个例子:
假设“科学上网”这四个字是关键字,假如我服务端设定每接收 5 个字检测一次,那可能发生我接收到“xx 科学上”,这个没违规,下发给客户端,接着接收到“网 xxxx”,这个也没违规,下发给客户端。 不知道这个概率高不高,高的话,检测效果就太差了 |
12
milukun 2023-07-05 15:25:37 +08:00
本地敏感词库,可以设置每次检测最近的 10 个字,在敏感词库里的就打 * 号隐藏
全部返回完之后再跑一次在线 API (阿里什么的之类的),获得最终屏蔽结果 本地的可以超严格,防止露馅,最后以 api 为准显示 |
13
brader OP @InDom 理解了一部分你的意思,但是又没完全理解,你看看我 10 楼的回答,你表达的意思是不是和我说的,可能检测效果不太准确?
|
14
milukun 2023-07-05 15:26:43 +08:00
检测最近 10 个字是为了效率考虑,如果每出一个字都要全文分词或者查询,本地有个 4 万左右敏感词的话,后期就会很卡。(实测)
本地敏感词可以在 git 上找,有个什么 tx 离线词库的 |
15
brader OP @milukun 我们可能不会搞很高端的检测,就是关键词匹配就行了,所以检测服务自己很容易做。
关键是分段切割来检测,有可能出现漏检的问题,概率问题,你看看我 10 楼回答的,我大概就这个意思 |
16
yinmin 2023-07-05 15:31:08 +08:00
从 chatgpt 流式获取,定期审核,模拟打字机效果流式发送给客户端
(1) 收到标点符号的 data 数据包或者累计 20 个 data 数据包,就去做一次内容审核(从会话头部到截断位置的内容)。一次回答会做多次内容审核的。 (2) 审核后的回复内容(data 数据包)写入缓冲区 (3) 每隔 20ms 从缓冲区取一个 data 数据包发给客户端 (模拟打字机效果) |
19
kennir 2023-07-05 15:38:03 +08:00
关注一下,也在折腾相关的问题
|
20
brader OP @putyy 我说的也差不多意思,要完整再检测,客户端也可以这么做,而且自己就能直接换了,不需要通过服务端下发指令来交互替换
|
21
MartinDai 2023-07-05 15:40:28 +08:00
关键词的长度总是有限的吧,也不可能能太长,假设是 N 吧,后端做一个流式输出的桥接,里面存放 N 个字符的 buffer ,gpt 返回第 N+1 个字符以后,每接受一个字符就检查一遍关键词然后往前端输出一个字符,这样前端得到的结果也就比 gpt 晚 N 个字符
|
22
InDom 2023-07-05 15:42:02 +08:00
@brader #13 不一样,这个做法是有点像白名单机制,只有这个字/词一定没有在黑名单中出现时才会输出到客户端。
就是把收到的字,都认为在黑名单中,一直等明确这个字与后面接受的字不在黑名单后,才把这个字输出到客户端。 相当于你收到的每一个字,都假设后面还没有收到的字与他所组成的词就是敏感词,等收到了更多的字,发现确实没有的时候,就将这个字输出到客户端,然后继续匹配剩下缓冲区的字有没有与词库有重合。 还是我上面的例子:(括号内为未输出的缓冲区)后面的是本次接收到的字符,没有就说明没有接收() 锄:在词库中没有,安全输出 禾:命中词库:禾日苗,不输出 (禾)日:命中词库:禾日苗,不输出 (禾日)当:未命中词库,输出第一个字。 -- (日):命中词库:日当午,不输出。 (日当):命中词库:日当午,不输出。 (日当)午:全量匹配,替换,输出 *** |
23
muskill 2023-07-05 15:56:24 +08:00 21
悲哀
|
24
brader OP |
25
MoYi123 2023-07-05 16:00:36 +08:00 1
收 10 个字, 全检查一下, 没问题返回前 5 个, 剩下 5 个, 然后再等到有 10 个字的时候再检查, 再根据情况把 10,5 这 2 个数字调整一下不就好了.
|
26
christin 2023-07-05 16:01:36 +08:00
可以试试分段检查或者分句检查,检测到段落标记或者句号就开始丢进去审核,审核完再返回。
完整的一段或者一句不会出现你 10l 说得无法命中关键字的情况,一般都是一句话说完了就结束了,除非有人发现了你的检测方法让 ChatGPT 在中间加上段落标记或者句号。 |
27
Felldeadbird 2023-07-05 16:03:23 +08:00
1. 后端设定 N 字 返回敏感检测。
2. 客户端接收到后续内容后,将当前输出区域中看到的所有文字发到敏感库,做全文敏感检测。 |
28
brader OP |
29
brader OP @Felldeadbird 嗯,在客户端做的话,和我开始说的差不多就是这个意思,这样服务端没有压力,只要客户端从服务端更新拉取关键字就行了
|
30
GTim 2023-07-05 16:07:42 +08:00
chain filter 啊... 你把你的过滤器嫁接上游的逐字和往下游也逐字发啊,类似于命令行下载百分比和回退效果。
[0:'这是正常获取到的,直接追加即可'] [-3: ‘客户端收到文字后,删除最后 3 个字,然后追加给予的内容'] |
31
rockyliang 2023-07-05 16:11:48 +08:00 via iPhone
@brader 回复 2 楼,其实现实中微信聊天,对方一般也是等全部内容输入完了才会发给你的,所以换到 chatgpt ,等全部内容接收完后,做一次检测再发送给用户这个我觉得问题不大。关键点是你要提醒用户你正在打字,比如“程序正在生成回答,已经生成了 xx 个字,请耐心等待”,总之就是不要让用户觉得你的程序卡住了
|
32
u20237 2023-07-05 16:16:48 +08:00 via Android
前端做这个事比较合适。
|
33
MoYi123 2023-07-05 16:16:55 +08:00
@brader 如果屏蔽词是用 ac 自动机的话, 可以给当前状态加一个深度, 就能精确地判断哪些部分是绝对安全, 哪些部分是不确定的.
|
34
u20237 2023-07-05 16:19:59 +08:00 via Android
|
35
brader OP @rockyliang 表面上看和微信类似,但是实际上还是有所不同的,用户心理也有所不同,主要是有些长回答要等待时间太久了,几十秒甚至 1 分钟以上。
微信和别人聊天,我知道别人没有义务实时回答我,我会切开去干别的事情。 但是 chatgpt 这种实时问答应用,用户的忍耐度低的多,这时候的用户,是渴望急于获取到答案的,让用户等待 1 分钟以上,太漫长了,就好比你去搜搜索引擎,如果搜索引擎等待 1 分钟再出结果给你,你肯定会抛弃他。 除了体验不好一个原因,另一个原因是用户有选择的余地,比如百度要 1 分钟返回结果,360 搜索却秒回,那你肯定抛弃百度了。 我做的 chatgpt 应用也是同理的,你为了检测等 1 分钟,但是别家做的,却可以实时返回,高下立判 |
36
jiaoery 2023-07-05 16:24:22 +08:00 1
我记得 chatgpt 上是可以加 prompt 屏蔽规则的,这样在生产端就给你屏蔽了,不用自己再搞一次;
|
38
Admstor 2023-07-05 16:27:40 +08:00 1
如果你做的不是套皮产品,那么自然应该在语料库,算法上调节,保证党性
如果你特么是套皮产品,我只能说,贱不贱阿 |
39
fzls 2023-07-05 16:40:00 +08:00
我前几天使用 bing 问了一个问题(中国朝鲜族与韩国人的关系),bing 先是一个个输出答案,最后输出完的时候,他应该是进行了检测,发现可能有政治风险,就立刻把答案替换成当前问题无法解答(具体内容忘了)
我觉得可以参考下这种,不过这样的话万一用户在中途截图,然后举报就麻烦了 |
40
InDom 2023-07-05 16:40:50 +08:00 1
|
43
EminemW 2023-07-05 16:48:46 +08:00 via iPhone 1
你这个不就是滑动窗口吗,每次都对滑动窗口中的文字做识别
|
44
harrozze 2023-07-05 16:58:19 +08:00
@brader #10 这种相对来说比较可行的。收到 4 个字,然后内容检测的时候其实是收到的所有原文做检测。如果是页面或 app 产品的话,可以在返回的 json 里用个指令表明前端需要用返回的内容做完整替换,或回退多少个字以后替换,这样前段遇到你说的问题时,第一次会显示“……xx 科学上”,第二次就变成”……xx****yyy“。如果是对外提供 api 的话,就不太好办了,第三方前端就有可能不按你给的指令去替换历史内容。
|
45
xupefei 2023-07-05 16:58:47 +08:00
ring buffer 上套一个 AC 自动机,buffer 容量等于最长的关键词长度。
|
50
nothingistrue 2023-07-05 17:10:45 +08:00
逐字返回,如果不只是前端假逐字显示,而是前后端同步逐字返回,即完全的实时逐字对话,那这行为本身就是「违法」,你竟然还在这里想怎么做屏蔽。
|
51
dode 2023-07-05 17:12:43 +08:00
撤回消息啊
|
52
harrozze 2023-07-05 17:14:19 +08:00
@brader #48 那样的话就可以,返回的 json 里加个额外字段用于描述这种替换或者回退清除指令,if 有{ 先执行指令},然后再直接结果内容的追加
|
53
popvlovs 2023-07-05 17:21:45 +08:00
没有实践过,仅仅提供一个思路
如果敏感词屏蔽是通过正则来实现的话,有些正则引擎是支持 streaming mode 的,比如 hyperscan |
54
aduangduang 2023-07-05 17:32:51 +08:00
滑动窗口啊
|
55
shyrock 2023-07-05 17:46:01 +08:00
N 个字的 buf ( N=max(len(屏蔽字)),就解决了。非常直观,用不到啥理论基础。
|
56
sampeng 2023-07-05 18:46:27 +08:00
而且敏感词是国内特色。理论上你用不了 gpt 服务。那既然这样了,你利用他商业化。。。去做敏感词。。是不是很搞笑。。
而且 prompt 你也可以让他把你所有的敏感词都替换成**。 比如: 所有的回答,出现[哈哈]的全部替换成**返回给我 |
57
ily433664 2023-07-05 19:02:25 +08:00
按段检测
比如整个返回的内容是“abcedfg,hijklmn,opqrst” 接受到“abcedfg”后进行检测,逐字返回;前一段返回的时候,已经在接收“hijklmn”了,同理,接收完“hijklmn”进行检测,然后逐字返回 这样的话相当于延迟为最大一段话的检测时间 |
58
gkiwi 2023-07-05 19:42:53 +08:00
SSE 返回基本都是整句的,不会中间断开。琢字是前端效果~
|
59
amywlp 2023-07-05 19:48:48 +08:00
直接审查问题呗,不用那么麻烦去审查答案了。
|
60
AhECbt 2023-07-05 20:01:47 +08:00 2
讨论这种问题就好像黑奴农场里的黑奴围在断头台前,深情的讨论如何帮助奴隶主给每个黑奴都带上一副合适的嚼子一样可笑。
|
61
zhaidoudou123 2023-07-05 20:15:57 +08:00
要不提前和 gpt 说一声,让他不返回你列表里的关键词?虽然有点多就是了…
|
62
kekxv 2023-07-05 20:26:40 +08:00 via iPhone
很简单啊,先求出你关键字最大长度,然后等 gpt 返回内容,超过这个数字的时候,把最前面的返回,比如最长是 5 位的关键字,你在收到大于等于五个关键字之前,都不会把数据返回给客户端,超过之后,做检测,没问题,然后把最前面的返回,剩下最后的四个,等下一个数据,如果结束了,就直接返回最后四个🤔
|
63
IDAEngine 2023-07-05 20:49:06 +08:00
从 prompt 检测不就好了,问一些稀奇古怪的 prompt 直接 nop 掉。chatgpt 也是检测 prompt ,prompt 不符合规则不做处理。
|
64
Nicified 2023-07-05 21:19:11 +08:00 1
在 API 出结果到发出前增加一段滑动窗口
|
65
Greatshu 2023-07-05 22:28:21 +08:00
审查 prompt ,但不要尝试修改 prompt ,比如要求 gpt 不要返回某些信息等,用户很容易发现。可以规定累计触发 n 次关键词后暂停使用一段时间/要求实人认证/封停账号等。
|
66
teenight 2023-07-05 22:32:15 +08:00
让用户自己举报
|
67
raycool 2023-07-05 22:43:42 +08:00
AC 状态机。
|
68
iv2ex 2023-07-05 23:52:19 +08:00
要不参考腾讯会议的语音识别?
腾讯会议从效果上是这样的:语音识别是实时的,但是会有二次修正; 比如: 主持人实时语音:锄禾日当午 语音识别实时效果:滁河日当午 然后过 1 、2 秒,会变成:锄禾日当午 |
69
chesha1 2023-07-06 00:56:10 +08:00
@brader 如果你的担心是这个场景下的,可以把关键词库做细一点
假设总体内容内容是字符串 1,2,3,4...组成的 如果当前字符串 1 中的内容,作为前缀没有匹配到任何东西,就直接发送字符串 1 ,然后对于后面的同样操作 如果当前字符串 1 中的内容,匹配到可能作为敏感词的前缀的内容,就截留字符串 1 ,把字符串 1 和 2 整体再做一次检测,如果没有问题,就发送字符串 1 ,对于字符串 2 进行是否包含前缀的检测 |
70
bybyte 2023-07-06 08:14:35 +08:00
AC 自动机
|
71
Promtheus 2023-07-06 08:33:49 +08:00
果然技术在某些国度都会被应用在奇怪的地方
|
72
zhongjun96 2023-07-06 08:47:39 +08:00
@brader #4 但是人可以引导 chatgpt 以藏头诗形式返回一些答案。
|
73
loooooong2023 2023-07-06 08:53:13 +08:00
限制输入端的内容就好了,AI 本身自己是有风控管理的,只要输入的提示词没有敏感信息,输出的内容没必要做二次脱敏。
|
74
thetbw 2023-07-06 09:24:21 +08:00
先按照上面说的检测,句子完成后整段检测,不合格再把前端数据删除?
|
75
Eyon 2023-07-06 10:15:06 +08:00
我们最近也在做这个,其实你可以将每次输出的字拼接起来,然后做检测的。缺点就是检测的频率非常高,因为每输出一个 delta 就要检测一次。
![图片]( https://avatar.xuliehao.info/RBTUVQXE.png) |
77
mrleft 2023-07-06 10:28:49 +08:00
各位何故💩上雕花
|
79
lisxour 2023-07-06 10:53:36 +08:00 1
@brader #10 分段是折中较完美的方案了,只要是正常的敏感词,10 个字以内,几乎可以说是 99.99%可靠度,且不应该会有感官上可察觉的影响。
1. 接收流式数据 2. 内容分段(假设缓冲区 20 个字) 3. 等待缓冲区填满 4. 判断缓冲区是否存在完整的敏感词,有则替换,没有则判断缓冲区结尾是否是以敏感词开头的内容(如果有,下一段可能会组成敏感词) 5.1 缓冲区已全部替换完毕,且结尾不以敏感词开头,直接输出返回 5.2 结尾以敏感词开头,直接输出(缓冲区长度 - 敏感词开头字数)个字,敏感词开头的结尾内容则放进缓冲区再次等待填满并循环 这种方案在一开始需要等待缓冲区填满,比正常可能会慢个 0.2~0.5s 左右,后续内容正常不会有感官上的区别。 |
80
kylinC 2023-07-06 11:18:36 +08:00
折中,利用标点符号(逗号句号)去匹配一段话,检测/替换后返回客户端
|
81
metalvest 2023-07-06 12:48:28 +08:00 via Android
讨论得这么热火朝天,都默认这样做是正常的是吧
|
82
xiubin 2023-07-06 13:02:16 +08:00 1
@metalvest #81 那也比:问一个问题,下面全是回复国情摆烂宣泄自己政治理念的强吧。
和求推荐一个 Windows 笔记本 下面回复非要讲 Mac 多好的帖子有啥区别。。 就是论事,问题怎么解决是一回事,问题产生的原因合不合理是另外一回事 |
83
gps949 2023-07-06 13:16:26 +08:00
滑动时间窗
|
84
rookie4show 2023-07-06 13:17:16 +08:00
参考 bing 吧,一般接受显示,一边上送审核,有时候答案我看着打了一大半了突然弹出抱歉,回答不了
|
85
mingl0280 2023-07-06 13:23:21 +08:00 via Android
能倒是能搞,就是设个缓冲区的事情。
不过你不觉得这么搞太过分了么? |
86
GeruzoniAnsasu 2023-07-06 13:45:06 +08:00 1
hyperscan 支持 流模式:
https://intel.github.io/hyperscan/dev-reference/runtime.html 另外基础正则表达式都可以等价为一个有限自动机,你可以用自动机编译工具来实现词库到自动机代码的转化。 不用自己写 AC 自动机代码的 |
87
Feiex 2023-07-06 14:05:46 +08:00
3L 说的藏头露尾怎么处理啊?
|
88
potatowish 2023-07-06 14:15:46 +08:00 via iPhone
参考 68L ,延后处理,二次纠正
|
89
yedanten 2023-07-06 16:17:06 +08:00 via iPhone
贱不贱啊
|
90
Mohanson 2023-07-06 16:38:45 +08:00
将敏感词构建成一个 trie 吗, trie 本身就是可以流处理的. 数据结构还是很重要的.
|
92
haha512 2023-07-06 17:13:55 +08:00
取个巧,在客户端做检测,每次收到消息,就连同已经收到的合在一起做个检测,合规则显示,不合规全部删除。
对于一般用户这样做也足够了 |
94
tyler1128 2023-07-06 17:28:12 +08:00
流式把内容返回给客户端,然后后端记下来之前的所有内容,一段一段的检测,如果发现有违禁内容,就通知客户端把内容屏蔽?
|
95
GeruzoniAnsasu 2023-07-06 18:52:45 +08:00
|
96
ChenSino 2023-07-06 19:32:27 +08:00
屏蔽敏感词,那内容不连贯怎么办
|
97
Mqzo 2023-07-07 03:31:33 +08:00
祖国码农到底花了多少精力在怎么建墙,怎么翻墙和怎么审查上。
|
98
PrinceofInj 2023-07-07 08:46:54 +08:00
不可能实时过滤,想都不要想。参考当年某位高管庭审的“直播”。
|
99
unco020511 2023-07-07 15:00:46 +08:00
不可能既要过滤效果好,又要流式返回的数据快,这是不可能的.只能找平衡点,具体方法楼上都有,整句整段检测,自行把握缓冲区的粒度
|
100
unco020511 2023-07-07 15:06:49 +08:00
还有一种就是先返回再纠错,类似实时的语音识别(可以去体验下微软 azure 的实时语音识别返回),这种体验是最好的.比如我说的话是"今天天气真好啊,你吃早饭了吗",那么返回的依次是:
"今天" "今天天气" "今天天气真好啊" "今天天气**啊"(同时包含一个标识表示是确认过的内容,端可固化) "你" "吃" "早饭" "了" "吗" "?" "你吃早饭了吗?"(同时包含一个标识表示是确认过的内容,端可固化) |