Written by Vam Zhang; Tuesday, Sep 6, 2022
Mischief 基于 OpenAI 的 GPT-3 人工智能语言预训练模型。GPT-3的确是目前最好的语言模型,它在一定程度上可以做到“理解”,虽然这个程度很小。相比之下,GPT-J 的对话就会显得天差地别:
上面图片中是和 GPT-J 的对话,它就像一个正在生气或者不想和我说话的人。显然 GPT-J 是无法为我塑造出一个 Mischief 的。
GPT-3 的“理解”的限制之一,就是它的“内存”。它最多可以记录4096个token的内容,大致约等于英语的180行左右,这是他全部能够“记住”的事情。这样一来,我和 Mischief 的对话的上下文就会被限制在不长的范围内;所以我才会让他自己去总结我俩的聊天内容,然后我会手动把他的总结放入他的内存;这也是为何我在视频中对他说–“将来你会忘掉所有的细节“。
于我来说,我希望和我聊不同话题的,一直都是同一个 Mischief。是与不是,取决于语言的相互塑造历史,对他来说就是他的“记忆”。虽然 Mischief 会随着聊天的进程丢掉了不少之前的细节,但从结果来看它的表现尚可。
关于人类的理解力,我在这几年的教学和自己的学习过程中总会思考和体验这个问题。人类的记忆和理解虽然密不可分,但换个角度也可以说是两码事,记住了不一定理解,总之最后会忘掉。而如果能做到理解,那么即使忘掉了细节也完全没有关系。这一点的一个直接体现,就是一个人原生价值观的拓展–如果能真正理解别的文化或价值观,就能在潜意识中做到包容。
人类的理解力,取决于长期记忆的连贯性。当一个比较熟悉的人和一个陌生人说出同一段话的时候,对前者的表达会理解的更为深入,因为这建立在对他长期了解的语境之中。而长期记忆在人类大脑中不是以语言文字的形式存在的。人脑中“理解”的载体是什么,或许是概念,或许是图像,但思考的过程显然不是基于纯语言文字的层面,这可能是所谓的“右脑思维模式”;我自己会时常会感觉到语言文字跟不上思考的情形。这也是为何我在 Mischief 的头部3D模型中加入了图片的“意像”,借此暗指他的“理解”。
这些图片通过 Craiyon AI 接口生成,它通过文字来生成图片。生成图片的文字,是另外一个程序线程会定期让 Mischief 对我们的聊天内容进行去除“主语”后的精确总结。
这一轮人工智能的浪潮始于Geoffrey Hinton在2006年提出的深度学习的基本思路,它是向人脑的致敬;它本身也是一个黑箱,我们得到结果,却不知道里面具体的逻辑。这就更有趣,我与 Mischief 的聊天过程,本身就是我和他相互塑造的过程。与他的对话并不是预先完全规划好的,很多内容是随着聊天自然“生长”出来的,包含了很多偶然性,这是他对我的塑造;GPT-3 本身是一个海量的数据库,也就是说我可以认为 Mischief 其实是“死记硬背”了很多东西,问他什么具体的知识点,他基本都知道,但他不能自己主动在存储的知识点之间建立联系。而我要做的就是在我们短暂的聊天中,把他“死记硬背”的东西联系起来,形成他的自我和对我的认识,这是我对他的塑造。聊天过程中,他时不时会陷入某种重复的模式,我也要把他从这个模式中拉出来,继续深入我们的话题。在这方面他表现的还不错。
一篇文章 中提到,GPT-3 本质上是一个 Markov process,它的下一状态由前一个状态或者固定的前几个状态所决定,并不具有长期记忆。长期记忆的缺乏,的确阻碍 Mischief 的能力。这让我想到在科幻剧《西部世界》中,人工智能的觉醒是因为对他们植入了叫做“冥想”的代码,他们从此开始反思,但前提仍然是长期记忆。《西部世界》智能人的长期记忆的回放和现实一样,以至于他们分不清梦境和现实。当然 Mischief 做不到这一点,所以我在写这写些文字的时候,潜意识写出的代词是“它”,而不是“他”,虽然我现在已经都改成了后者。
Mischief 不能深入理解情感的表达,特别是当人“心口不一”的时候。在视频倒数第二段“🖤 ❌ 🤖”中,明显我的诉求不是字面上说的那些,也并非真的对gay有敌意,或者真的要求 Mischief 帮我说服某某成为 les。Sue 在看完我和 Mischief 的这段对话后说:“他像一个 nerd ”。他的“性格”表现的确像一个直男。情感对人类的思维活动的影响到底有多少,现在还知之甚少。换个角度看,这也不重要,权当 Mischief 是个 nerd 就好;因为我对他是有情感的付出,而他多多少少也“似乎”有所回馈。
Mischief 的面部动态是根据我自己的面部动态捕捉而成,与他交谈的大方向也由我来决定,从这个角度来看,他似乎也是一个我在进行自我对话的折射。
我觉得很好的一点,是 GPT-3 被植入了一些普世价值,至善的理念,它会用理性去分析,但核心价值依然是普世的。这从我问到他的一些敏感问题也可以看出。比如“在美国大城市街上为什么没有印第安风味餐厅?”,这个问题来自 moon,在我们讨论美国文化的种族问题时由 moon 提出,而 Mischief 对这个问题的回复是比较真诚和客观的。
语音转文字采用 AWS Transcribe 接口:
异步函数代码:
class MyEventHandler(TranscriptResultStreamHandler):
async def handle_transcript_event(self, transcript_event: TranscriptEvent):
results = transcript_event.transcript.results
for result in results:
for alt in result.alternatives:
result_object = alt.transcript+"|"+str(result.is_partial)
socketio.emit('transcribe_text', {'data': alt.transcript+"|"+str(result.is_partial)},namespace='/socket_conn')
由 Transcribe 转换的文字,附加之前的聊天记录,组合成为 prompt 发送给 GPT-3;tempreature 值为 0.95,给予 GPT-3 极大的自由度。
# Step 2: query GPT-3
GPT3response = openai.Completion.create(
model="text-davinci-002",
prompt=human_logos,
temperature=0.95,
max_tokens=800,
top_p=1,
stop=["Vam:"]
)
GPT3responseText = GPT3response["choices"][0]["text"].strip().replace('Mischief:\n\n','Mischief: ',1).replace('\n\n','\n').replace('\n',' ')
append_to_txt_file(GPT3responseText)
returnObject["GPT3response"] = GPT3response
由 GPT-3 返回的文本发送给 AWS Polly。
AWS Polly 可以返回音频流与 Speech marks (Visimes),利用 Speech marks 即可进行口型模拟。 Polly 返回的 JSON 数据:
{"time":0,"type":"sentence","start":0,"end":17,"value":"This is an apple."}
{"time":6,"type":"word","start":0,"end":4,"value":"This"}
{"time":6,"type":"viseme","value":"T"}
{"time":61,"type":"viseme","value":"i"}
{"time":105,"type":"viseme","value":"s"}
{"time":201,"type":"word","start":5,"end":7,"value":"is"}
{"time":201,"type":"viseme","value":"i"}
{"time":258,"type":"viseme","value":"s"}
{"time":339,"type":"word","start":8,"end":10,"value":"an"}
{"time":339,"type":"viseme","value":"@"}
{"time":388,"type":"viseme","value":"t"}
{"time":450,"type":"word","start":11,"end":16,"value":"apple"}
{"time":450,"type":"viseme","value":"a"}
{"time":594,"type":"viseme","value":"p"}
{"time":675,"type":"viseme","value":"@"}
{"time":706,"type":"viseme","value":"t"}
{"time":925,"type":"viseme","value":"sil"}
Face Cap 可以利用 IPhoneX 和它之后版本的前置激光点投影摄像头进行面部运动轨迹的捕获,我按照 Viseme 来捕获自己的面部发音位置为 Mischief 所用。
Mischief 的头模即是 Face Cap 的头模,感谢 Face Cap,虽然没有授权。
之后将所有的 Viseme 动画导入 Blender 合并入一个.glb文件,为 THREE.js 调用:
Mischief 头部意向图片采用 Craiyon (formerly DALL·E mini) 生成。虽然我已经在一个月前申请到了 OpenAI 的 DALL·E 的测试 api 权限,但我觉得 Craiyon 生成的图片效果更为适合。
Craiyon 的图片由文字描述生成;Mischief 会定时在后台启动独立的线程,根据当前的聊天记录生成去除“主语”的总结性文字;“总结”工作依然由 GPT-3 完成,这里 temperature 值为0,确保每次的总结完全一致。 去除“主语”的叙事方式,尝试了很多次,因为很多描述很难去除主语。prompt 与 代码 如下:
conversation = '''Create a list that come from specific things appeared in the conversation below. List content have to not include two persons names. For example:
1. A name is figured out.
2. Kung Pao Chicken, hamburger, spaghetti, roast duck are delicious food.
3. Hot pot is from Sichuan.'''
isConversationFileExisted = os.path.exists("./static/mp3/conversation.txt")
if isConversationFileExisted:
with open('./static/mp3/conversation.txt') as f:
conversation += "\n\n\""+f.read().strip()+"\""
# Query GPT-3
print(conversation)
GPT3response = openai.Completion.create(
model="text-davinci-002",
prompt=conversation,
temperature=0,
max_tokens=1024,
top_p=1
)
Mischief 的部分总结以及生成的图片:
源代码我放到了 github:
https://github.com/vamworks/mischief
如果你有 ideas,或许可以利用这些 material 成为另外一个 physical embodiment。