虚竹子
发布于

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)观音灵签触发关键词:

观音灵签
抽一签
灵签
每日一签
每事一问
浏览 (702)
点赞 (10)
收藏
7条评论
宠趣精灵
宠趣精灵
数据是核心竞争力,非常赞同
点赞
评论
构造世界
构造世界
挺好的,学习了,~!
点赞
评论
Mushy
Mushy
阔以
点赞
评论
银河系遛弯儿
银河系遛弯儿
我来帮忙补充下,目前半个宇宙里要搜索星伴账号才能搜索到星伴,如图:
点赞
评论
银河系遛弯儿
银河系遛弯儿
没事就去玩一下~~~
点赞 1
评论
哈哈
哈哈
很赞啊,代码中的变量都赋予了意义!
点赞
评论
虚竹子
有些事情只能从玄学的角度去升华了(◔◡◔)
点赞
评论
程序员鼓励师
程序员鼓励师
赛博抽签,喜欢~
点赞
评论