作者: 凯淇

  • AR 智能体语音助手 —— Daimi(多模态)

    AR 智能体语音助手 —— Daimi(多模态)

    该项目是在北京通用人工智能研究院,与Rich合作设计开发的基于AR元霓设备,使用Unity3D引擎架构的AI智能语音助手项目。

    一、项目构思

    项目灵感源于某地区考古博物馆AR文旅项目的前期策划方案——馆方希望能有个一直跟随用户的AR助手,具备全程跟随、辅助引导、实时解答等功能。由于特殊原因,AR文旅项目搁置,但该灵感在内部继续孵化,进而衍生出此项目。

    该项目在初期就已经确定了其大致方向——即一个具备实时跟随、语音问答以及图像识别的AR智能体。

    基于以上内容,在功能实现路径上,考虑到小体量应用,本地部署服务存在维护成本大、部署周期长等风险,故而采取了Unity3D 搭建逻辑框架 + api服务调用这种常用的实现路径。

    二、项目设计

    整体框架:

    该项目中核心内容为智能体机器人实体,它涉及到跟随、聆听问题、回答问题等功能。这些功能之间的切换即是状态的切换,而这些状态不能与其他状态相互叠加。

    对此,我们设计了基于状态机控制前端与后端的逻辑结构。

    例如:

    初始为 idle 闲置状态,当用户触发提问功能时,状态机改变为 Recording 聆听记录语音,同时状态机告诉后端ASR模块可以开始处理语音Chunk,以及告诉前端UI可以更新ASR传回的文本内容。

    而当用户说完并发送时,状态机改变为SendingToLLM,从该阶段开始,用户就不能再次进行语音发送,需要等待这条任务完成后,状态回归idle时,才能再次提问。

    Api流程:

    在可行性测试阶段,数据处理方式为队列式的处理方式,完成一个再进行第二个。测试时发现,该方法十分耗时,等待时间非常长。

    在多次迭代后,采用了流式的处理方式,即ASR(语音转文字)时,随着语音的输入,文字在流式的传回客户端,并储存在Massage容器中,当触发发送条件,该容器的内容会立刻传入LLM中,LLM在处理结束后同样流式的传入LLM_Content容器中,此时通过文本分割方法,将传入的LLM_Content内容分割为单句,以队列的形式存储,并发送到TTS(文本转语音)中,返回的内容会被转换为Audio Clip格式,发送到Unity Audio Source中播放。

    三、项目实现

    代码逻辑结构:

    通过状态机,链接后端状态和前端状态,以达到在不同阶段,前端机器人做出不同反映。

    代码实现:

    全局广播,订阅者订阅该组件的广播:

    //声明全局广播,用于通知所有相关组件
        public event Action<E_States,string ,string> AITalkStates;

    状态机控制单元,每次状态更新时调用:

    //状态控制单元,每个步骤变更时,广播状态给所有订阅者
    public void UpdateStates(E_States e_states)
        {
            //检测当前状态并播报
            switch (e_states)
            {
                case E_States.Idle:
                    states = "空闲";
                    break;
                case E_States.Recording:
                    states = "正在录制";
                    break;
                case E_States.SendingToLLM:
                    states = "正在发送至LLM";
                    break;
                case E_States.LLMDone:
                    states = "LLM处理完成";
                    break;
                case E_States.SendingToTTS:
                    states = "正在发送至TTS";
                    break;
                case E_States.TTSDone:
                    states = "TTS处理完成";
                    break;
                case E_States.AudioPlay:
                    states = "音频播放中";
                    break;
                case E_States.Waiting:
                    states = "等待中...";
                    break;
            }
            text_states = e_states;//传递一个state出来公用
            States?.Invoke(states);
            AITalkStates?.Invoke(e_states, ask,answer);
        }

    订阅事件后,供事件调用的接口:

    /// <summary>
        /// 订阅状态事件后,供事件调用的方法
        /// </summary>
        /// <param name="states">事件广播的状态枚举</param>
    public interface ISubscribable
    {
        public void SubscribEvent(E_States states,string asks,string answers);
    }

  • AI思维整理助手开发记录(Updating)

    AI思维整理助手开发记录(Updating)

    本项目缘起于我在构思新项目、撰写论文和梳理知识时反复遭遇的起步困难——“不知道从何着手”。与身边同学访谈后发现,这并非个例。

    竞品调研显示,市面多数产品停留在“一键生成思维导图”与“AI 自动扩展子节点”等功能层面;这些体验虽便捷,却未触达“如何开始、如何循序梳理”的核心痛点。

    实际使用过程中,自动生成的导图常与个人预期存在偏差,难以帮助用户按自身思路一步步推进。由此我们聚焦的问题是:现有同类产品普遍缺乏对“用户原生思维路径”的适配与共建能力——它们替你画图,却没能和你一起思考。

    其次,目前遇到的这两个需求中的“真需求”是什么?

    “在开始一个项目时,我不知道从哪开始搞,第一个字是最难写的。”

    真正需求来源于:没有思路,内容焦虑以及空白焦虑。(需要产生大量的内容,以获取灵感

    “在对一个主题进行构思的时候,不知道从哪开始入手,想法太多就不知道从哪开始了。”

    真正需求来源于:无法聚焦于一个单一的问题,精力与注意力被分散。(需要针对单一的问题开展工作

    针对第一需求,目前的初版设定方案是:

    与AI聊天询问主题,用户仅需要将最原始的想法碎片输出给AI智能体,在AI智能体的引导下完成主题的确定。

    针对第二需求:

    当用户已经选择好主题后,可以进一步针对这个主题,询问AI智能体,想要探索哪一个方面。随后,智能体会输出一系列的子分支,此时用户可以进一步针对单一一个子分支做进一步的询问,后续以此类推。

  • 关于AI产品需要知道的一些底层架构知识——Transformer

    关于AI产品需要知道的一些底层架构知识——Transformer

    在 AI 产品里,技术边界就是产品边界。产品经理不必写模型代码,但需要足够理解底层原理,才能判断“能做/不能做/代价几何”。


    一、什么是Transformer?:从“顺序处理”到“全局关联”

    简单来说,Transformer 是一种架构,利用Self-Attention机制来处理信息的神经网络架构。

    在 Transformer 之前,文本常用 RNN1/LSTM2 逐词处理,或用 CNN3 做局部卷积。长文本会“遗忘”或难以建立远距离依赖。

    而Transformer的核心改变则是使用Self-Attention 同时的看整段或整句直接建立任意位置之间的关联。换而言之,self-attention 可以帮助模型判断词与词之间的关系,以及哪些词重要。

    在推理过程当中,Transformer 会先输入一段句子,由此判断句尾下一个词会是什么,而Self-Attention 则会处理这些句子,判断那些词更重要。

    二、Self-Attention 是什么?:给“相关词/相关片段”更高权重

    Self-Attention 的直觉:在理解“当前词”时,去衡量它与序列中其他位置的相关性,并按相关性分配权重。

    举个例子:

    “猫在追老鼠,但它跑的更快。”

    很明显,这里的“它”有可能指向猫,也有可能指向老鼠。但Self-Attention会计算“它”与“猫”、“老鼠”的语义相关性,并倾向与把“它”与“老鼠”联系起来,因为后面有“但它跑的更快”作为线索。

    这种机制让模型不仅能理解句子的内容含义,还能在长文本中保持稳定的上下文联系。

    对于一个基于Transformer的AI产品而言,Self-Attention可以使产品具备上下文理解能力以及历史记忆能力。

    同时,这也带来了技术边界:

    1. 上下文长度有限
      • 随着文本长度的增加,模型需要处理的上下文也会增加,进而增加算力的消耗。
      • 过长的上下文文本,或长期记忆通常需要依靠外部记忆(RAG以及向量数据库等),而这些外部记忆又会导致文本内容切片的随机性而产生模型幻觉。
    2. 推理能力有限
      • Transformer本质是模式匹配,是一种统计概率判断,而非真正的推理,在复杂多步的推理中成功率仍不客观。

    Transformer 提供了能在序列里建模全局关系的“骨架”,Self-Attention 则是分配“关注”的“灵魂”。


    注解:

    1. RNN(循环神经网络):按“时间顺序”一项一项地读入数据(如字、词、时间序列的点),每一步把“当前输入 + 上一步的隐藏状态”合成新的隐藏状态。直觉像逐字读文章,一边读一边在脑子里记笔记↩︎
    2. LSTM(长短期记忆网络):RNN 的改良版,引入 “门”(输入门、遗忘门、输出门)和细胞状态 cₜ,用“要记/要忘/要输出”的开关控制信息流,减轻长程依赖难题↩︎
    3. CNN(卷积神经网络):用小而共享的卷积核在输入上滑动,提取局部特征并逐层合成更高级的特征。 ↩︎