ACT开发第一弹:大道至简、合理存在、知识第一
一、背景
当前,随着GPTs及智谱GLMs等的上线,“智能体”的概念被瞬间“爆炒”。然而,除抄袭、冒充、数据安全等问题被吐槽外,其更多地被认为是Prompt的升级版而已。
相比较,KMind中,ACT用于定义AI的动作和行为,以帮助用户实现对知识、信息的精确操作。Native ACT,通过对指令的组合,使用户可以定义各种自定义的ACT。ACT的这种设计,赋予用户对AI更自主的控制,瞬间秒杀各模型s们,成为吸引开发者的最大杀手锏。
ACT在KMind产品中被寄以厚望。可以预见的是,未来,基于ACT的商品化服务,是KMind变现的重要一步。
二、引子
个人认为,大模型是通过大量的数据学习以模仿人类大脑处理信息的方式。这其中,涉及两个重要的关键:一个是数据(收集、处理),一个是模型(设计、训练、评估)。其中,模型的设计与迭代,可以参考已有的研究成果和开源的算法基础,必须耐得住寂寞,慢慢积累,厚积薄发,这道坎,目前谁都不可能一撮而就,快速超越ChatGPT。不过,随着研究人员新成果的出现和新算法公开,可以肯定,在未来的某个时间,大家的模型水平都会越来越接近,而那个时候,数据,尤其是数据的质量和数量,将是关键的竞争力。
kOS架构中,将知识库作为最终的“沉淀物”,并成为各信息处理所引用的根本,是非常前瞻和智慧的设计。
所以,个人看好基于一定知识库的ACT设计与开发。接下来,我以个人ACT“观音灵签”的设计和实现为例,谈下我个人的看法与实践。由于我之前是做PHP的,对于Python不熟悉,写的不好的地方还请各位大佬多多担待、指导。
三、观音灵签
“观音灵签”是本人于年前刚接触ACT时设计的一款基于个人用户文件(知识库)而进行“解签”服务的试验产品。针对此类产品,我尝试从以下三个方面谈下我的看法与实践。
A. 大道至简
这里的简我想表达以下两个含义。
(1)产品设计尽量简单
“观音灵签”的设计其实很简单,记得在群里做过分享。由于“观音灵签”的内容包括109个签文内容,所以产品的大致流程为:
- 第一步,用户输入1-109的数字及需要咨询的问题
- 第二步,ACT根据数字从文件中获取对应签文
- 第三步,ACT将原始签文发给大模型翻译并结合用户问题解读
- 第四步,ACT接收大模型返回翻译及解读内容,并呈现给用户
整个流程很简单,直接使用Native ACT指令集,其中第一步使用了nact.k_get_act_query(),第二步使用了nact.k_file_open()、nact.k_file_read(),第三步使用了nact.k_semantic_chat(),第四步及交互过程中则使用了nact.k_message_send()、nact.k_ask_for_answer()。流程简洁,实现代码更简单。
(2)用最简单的方法解决复杂的问题
“观音灵签”是基于个人用户文件(知识库)而进行的,当用户输入数字时,需要从文件中准确获取到对应的原始签文。在这个环节,很多人也许会想到直接用大模型获取,比如使用“请输出第八签的内容”等Prompt,但结果是可想而知的,获取到的内容往往是被改造过的。
为此,我使用了最原始、笨拙的获取方式——搜索来获取。当然,为了排查搜索关键词的干扰,我对原文件中各签文内容使用数字做了分隔,类似如下:
s=012
第十二签,上上,亥宫。
签辞:否极泰来咫尺间,抖擞君子出于山;若遇虎兔佳音信,立志忙中事不难。
解曰:有意兴发,到彼安然,若问用事,得遇贵人。此签因祸得福,逢凶化吉,万事营谋大吉也。
e=012
s=013
第十三签,上上,亥宫。
签辞:自小生在富贵家,眼前万事总奢华;蒙君赐紫金鱼带,四海传名足可夸。
解曰:囚有逢赦,病即安然,龙门得遇,名遍皇宫。此签 万事皆大吉也。
e=013
经过上述改造后,再根据用户输入的数字,利用find()函数和切片操作就能准确获取原始签文了。
具体代码如下:
#签号拼接,qh_num为签号
padded_qh = str(qh_num).zfill(3)
cs = "s="+padded_qh
ce = "e="+padded_qh
#获取文件内容
ofile = nact.k_file_open("/ACTfile/guanyinlingqian.txt",nact.FileOpenMode.READ, mount_type=nact.FileMountType.MATERIAL, data_access_mode=nact.DataAccessMode.CREATOR_MODE)
reslen,resstr=nact.k_file_read(ofile)
csindex = resstr.find(cs)
csindexs = csindex + 5
ceindex = resstr.find(ce)
#原始签文内容
lqcon = resstr[csindexs:ceindex]
B. 合理存在
上述针对“简”谈了点自己的看法,但有时候,为了实现特定的效果,光有“简”还不行,需要有意去进行“复杂的设计”,让复杂的内容合理地存在。
由于“观音灵签”只包括109个签,若根据用户输入的1-109数字去获取签文的话,很容易“作弊”。比如,第8签是个上上签,而第7签是个下下签,那么,当用户知道以上信息后,他会有意去避免输入下下签的数字,从而打乱了这种“随机性”。为此,我将用户输入的数字范围扩展为1-84000,并结合用户提问的时间戳等设计了一个简单的签序算法,从而大大提高了抽签的“随机性”,那怕你输入同一个数字,由于输入时的时间戳不同而使得最终获取到的签序的序号而不同。具体算法设计如下:
#根据用户输入的数字N和时间戳T生成签序R
如果 N < 1 或 N > 84000
返回 错误,数字超出范围
组合数字 X = T + N
计算 A = X mod 219
计算 B = X mod 619
计算 C = X mod 919
组合结果 Y = A * 619 * 919 + B * 219 * 919 + C * 219 * 619
计算最终结果 R = Y mod 109
如果 R = 0
R = 109
返回 R
#注:算法中关键数字的含义
#84000,佛所说八万四千法门
#109,观音灵签共109签
#219,农历二月十九,为观世音菩萨的诞辰纪念日
#619,农历六月十九,为观世音菩萨的成道纪念日
#919,农历九月十九,为观世音菩萨的出家纪念日
具体代码如下:
#签号算法
snum= nact.k_time_cur_seconds()
snums = snum + int(qh_num)
aa = snums % 219
bb = snums % 619
cc = snums % 919
tnum = aa*619*919+bb*219*919+cc*219*619
qh_num = tnum%109
if qh_num==0:
qh_num = 109
此外,在进行“第一步,用户输入数字获取”时,为了让互动能够顺畅地走下去,我嵌套了4个if语句,另加一个while语句,目的就是把各种可能性都想到,让整个流程在任何操作下都不中断(除系统自身的问题外)。我们在进行程序设计时,逻辑关系和可能性至关重要,很多bug的产生,都是开发者没有厘清逻辑关系或忽视了部分可能性而造成的,这点上绝对不能“简”。
第一步,用户输入数字获取代码如下:
sm = "此签取自乾隆初年版本, 仅供娱乐。请先静心, 默想所问之事, 然后随心输入1-84000中的一个数字"
smt = "请随心输入1-84000中的一个数字"
nact.k_message_send(sm)
#获取输入
qh = nact.k_get_act_query()
#获取判断
isok = True
while isok:
if not qh:
#要求输入,返回循环
qh = nact.k_ask_for_answer(smt)
else:
qh_list = re.findall(r'\d+', qh)
if len(qh_list) == 0:
#要求输入,返回循环
qh = nact.k_ask_for_answer(smt)
else:
qh_num = qh_list[0]
if qh_num.isdigit():
if int(qh_num) < 1 or int(qh_num) > 84000:
#要求输入,返回循环
qh = nact.k_ask_for_answer(smt)
else:
isok = False #结束循环
else:
#要求输入,返回循环
qh = nact.k_ask_for_answer(smt)
nact.k_message_send("您输入的有效数字为:"+qh_num)
C. 知识第一
大模型时代,高质量的知识资源显得尤为重要。在KMind项目中,以高质量知识库为基础的ACT产品,尤其是随着官方API上线基于外部大型专业知识库的ACT产品,定会占据未来ACTs的主导地位,并引领行业发展。
所以,当下,我认为,定下心来进行各行、各业、各类特色知识库的爬取、整理,可能会为你深度参与AI提供不小的“资粮”。
期待官方API上线!
期待各位大神特色知识库产品的发布!
附:
(1)在KMind中添加星伴好友“虚竹子”,体验“观音灵签”
(2)在『半个宇宙』用户3群中,@AI仆人,直接体验“观音灵签”
(3)观音灵签触发关键词:
观音灵签
抽一签
灵签
每日一签
每事一问