Agent 的「最后一公里」,卡在哪了?

最近在折腾 Agent 开发,用 LangChain 搭了个教育陪练 Agent,接了 deepseek 做大脑,能回答初中数学题、讲解物理概念,逻辑推理能力相当不错。本地跑通之后我拿给侄子试了一下——他今年初二。

结果他用了两分钟就关了页面。我问他为啥,他说:“就一个聊天框,跟问 ChatGPT 有啥区别?”

说实话,他说得没错。从技术架构看,我搭的 Agent 有感知、有推理、有工具调用,该有的都有。但从用户体验看,它就是一个带 system prompt 的聊天框。对开发者来说,Agent 和 ChatGPT 之间隔着 Function Calling、Memory、Planning 一整套工程化能力;但对用户来说,这两个东西看起来一模一样。

问题出在哪?Agent 缺一个"身体"。

大模型让 AI 学会了思考,但思考的结果如果只能通过文字吐出来,AI 就永远被困在聊天框里。在门店、教育、展厅、文旅这些真实场景中,用户期望的不是"读一段文字",而是"有个人在我面前讲"——能看见、能听见、能回应、有表情、有动作。

这个判断让我开始关注一个概念:具身交互智能

什么是具身交互智能?

我的理解是:具身交互智能不是给 AI 贴一张人脸贴纸,而是让 AI 从"只能输出文本"升级为"能以 3D 身体、语音、表情、动作进行实时交互"的具身交互智能体。

打个比方:现在的 Agent 像一个电话客服——你问他答,看不见脸,只能听声音。而具身交互智能体像一个真人老师——他站在你面前,你问问题的时候他会点头表示在听,讲解的时候会配合手势,你说"没听懂"他会换个表情重新讲。

这中间差的不是一个"皮肤",而是一整套交互能力:可被看见的身体、可被感知的状态、可自然表达的语音表情动作、可实时响应的交互链路。

在搜方案的时候,我发现了(魔珐星云)。它不是单纯的数字人工具,也不是 Agent 套壳框架,而是具身交互智能开放平台。定位很明确:

  • 大模型:提供 AI 思考、语义理解、内容生成的核心大脑

  • Agent:承接任务拆解、工具调度、对话流程管理

  • 魔珐星云:提供全套具身交互智能底座,赋予 AI3D 具象躯体、多模态情绪表达、原生实时双向交互能力

  • 完整链路打通后,让 AI 跳出聊天框,在网页、大屏、人形机器人、AR/VR 等全终端实现真人化具身互动

一句话总结:大模型解决 AI 的"大脑",魔珐星云补齐 AI 的"身体、表达和交互"。

技术层面,魔珐星云把端到端全链路封装为 SDK 一站式接入:多模态感知层(听见·看见·理解)× 大模型智能体层(理解·决策·调度)× 表达引擎层(3D 大模型·端侧渲染·百元芯片可跑·千路并发)。

看到这套架构我就意识到:这正是 Agent 走出聊天框所需要的那块拼图。于是我决定动手试一下,把 deepseek 接到魔珐星云的具身驱动 SDK 上,做一个有 3D 身体的教育陪练 Agent。

技术架构与工具选型

整体链路:

用户语音/文字 → → 文本 → DeepSeek LLM → 流式文本 → 魔珐星云SDK(参数流驱动) → 3D数字人实时表达
模块 选型 理由
AI Coding 工具 Cursor 对话式编程 + 代码补全,前端项目效率高
大模型 DeepSeek V3 推理能力强,中文数学/物理讲解质量高,OpenAI 兼容接口
ASR 腾讯云实时语音识别 流式识别,延迟低
数字人驱动 魔珐星云具身驱动 SDK(JS 版) 参数流技术,端到端约 500ms
前端框架 原生 HTML + JS 零依赖,方便读者直接复制上手

选 DeepSeek的原因:初中数理讲解需要较强的推理和分步解释能力,DeepSeek V3 在这方面表现稳定,而且 API 价格很低,适合做 Demo 验证。

实操:给 DeepSeek 装上 3D 身体

Step 1:魔珐星云平台创建驱动应用

先去数字人官网注册开发者账号,进入控制台 → 应用管理 → 创建驱动应用。

这一步可自定义具身交互智能体形象、场景、音色和表演风格。教育陪练场景我选了一个年轻女性形象,音色选了活泼亲切的风格,比较适合跟初中生交流。平台内置了 5000+ 角色形象,也支持上传照片定制。

在这里插入图片描述

创建完成后在应用详情页点击「App 密钥」,拿到 App IDApp Secret,后面代码里要用。

Step 2:最小可用——让数字人渲染出来

打开 Cursor,新建 HTML 文件。第一步目标很简单:完成具身交互智能体渲染,打通底层具身驱动基础链路。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>具身教育陪练Agent</title>
  <style>
    /* 容器比例需与控制台应用类型一致(横屏 16:9) */
    #avatar-container {
      width: 800px;
      height: 450px;
      position: relative;
      background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
      border-radius: 12px;
      overflow: hidden;
    }
    #sdk {
      width: 100%;
      height: 100%;
    }
  </style>
</head>
<body>
  <div id="avatar-container">
    <div id="sdk"></div>
  </div>

  <!-- 引入魔珐星云具身驱动 SDK -->
  <script src="https://media.xingyun3d.com/xingyun3d/general/litesdk/xmovAvatar@latest.js"></script>

  <script>
    const sdk = new XmovAvatar({
      containerId: '#sdk',
      appId: 'your_appid',           // 替换为你的 App ID
      appSecret: 'your_appsecret',    // 替换为你的 App Secret
      gatewayServer: 'https://nebula-agent.xingyun3d.com/user/v1/ttsa/session',
      hardwareAcceleration: 'prefer-hardware', // 开启硬件加速
      onMessage: (message) => {
        console.log('SDK message:', message);
      },
    });

    // 初始化连接
    sdk.init({
      onDownloadProgress: (progress) => {
        console.log('资源加载:', progress + '%');
      },
    });

    // 页面关闭前主动销毁,避免触发房间并发限制
    window.addEventListener('beforeunload', () => {
      if (sdk) sdk.destroy();
    });
  </script>
</body>
</html>

注意一个坑:SDK 只支持 localhosthttps 访问,直接用 IP 地址打开会报 VideoDecoder is not defined。本地调试用 localhost 就行。

还有一个坑:开发时频繁刷新页面容易触发 10005 错误(房间并发限流)。原因是页面刷新后服务端旧连接还没释放,新连接就被拒了。等 1-2 分钟自动恢复,或者像上面代码里那样在 beforeunload 里主动调 sdk.destroy() 释放连接。

Step 3:接入 deepseek,让陪练 Agent 有推理能力

在 Cursor 里新建 llm.js,用 DeepSeek 的 OpenAI 兼容接口做流式对话。教育陪练的 System Prompt 需要精心设计——不能直接给答案,要引导思考:

// llm.js - DeepSeek 大模型对接模块
const LLM_API = 'https://api.deepseek.com/v1/chat/completions';
const LLM_KEY = 'your_deepseek_api_key'; // 替换为你的 DeepSeek API Key

// 教育陪练 System Prompt
const SYSTEM_PROMPT = `你是一位初中数学陪练老师"小数",擅长引导学生解题。
回答要求:
1. 不要直接给出答案,先问学生"你目前想到哪一步了"
2. 根据学生的回答给提示,引导他自己推导
3. 讲解时用生活中的例子打比方
4. 每次回答控制在3句话以内,保持对话节奏
5. 学生答对时给予鼓励`;

export async function streamChat(userMessage, onChunk) {
  const response = await fetch(LLM_API, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${LLM_KEY}`,
    },
    body: JSON.stringify({
      model: 'deepseek-chat',
      messages: [
        { role: 'system', content: SYSTEM_PROMPT },
        { role: 'user', content: userMessage },
      ],
      stream: true,
    }),
  });

  const reader = response.body.getReader();
  const decoder = new TextDecoder();
  let buffer = '';

  while (true) {
    const { done, value } = await reader.read();
    if (done) break;

    buffer += decoder.decode(value, { stream: true });
    const lines = buffer.split('\n');
    buffer = lines.pop() || '';

    for (const line of lines) {
      if (!line.startsWith('data: ') || line === 'data: [DONE]') continue;
      try {
        const json = JSON.parse(line.slice(6));
        const content = json.choices?.[0]?.delta?.content;
        if (content) onChunk(content);
      } catch (e) { /* 忽略解析异常 */ }
    }
  }
}

deepseek的引导式教学效果确实不错。我测试了一道"一元二次方程"问题,它没有直接报答案,而是先问"你觉得可以从什么条件入手",然后一步步引导。这个交互模式如果配上一个有表情和动作的数字人老师,体验会比纯文字好太多。

在这里插入图片描述

**Step 4:**流式驱动,实现具身智能体实时同步语音、表情、肢体交互

这是实现流畅具身交互的核心环节,星云 SDK 的 speak() 方法支持流式调用,通过 is_startis_end 标记控制:

  • 第一段调用:is_start=true, is_end=false — 开始播报

  • 中间调用:is_start=false, is_end=false — 继续播报

  • 最后一段:is_start=false, is_end=true — 结束播报

把 DeepSeek 流式输出和星云 SDK 流式驱动拼起来:

// speech-manager.js - 语音状态管理 + 流式对话主流程
const avatarManager = {
  _pendingText: null,

  // 打断当前播报,排队新内容
  interruptAndSpeak(text) {
    this._pendingText = text;
    sdk.interactiveidle(); // 先打断当前状态
  },

  // 监听数字人语音状态,上一句结束后再播下一句
  handleVoiceState(res) {
    const state = (typeof res === 'string') ? res : (res.state || res.data);
    if ((state === 'end' || state === 'idle') && this._pendingText) {
      const nextText = this._pendingText;
      this._pendingText = null;
      sdk.speak(nextText, true, true);
    }
  }
};

// 流式对话:doubao输出 → 星云 SDK 驱动
async function chatAndSpeak(userMessage) {
  let accumulated = '';
  let chunkCount = 0;
  const CHUNK_THRESHOLD = 8; // 积攒一定字数再驱动,保证播报流畅

  await streamChat(userMessage, (chunk) => {
    accumulated += chunk;
    chunkCount++;

    if (chunkCount >= CHUNK_THRESHOLD) {
      const isStart = (accumulated === chunk);
      sdk.speak(accumulated, isStart, false);
      accumulated = '';
      chunkCount = 0;
    }
  });

  // 最后一段,is_end=true
  if (accumulated) {
    sdk.speak(accumulated, false, true);
  }
}

实战经验:首次积攒一小段内容后再调用 speak,让数字人说话速度低于大模型后续输出速度。否则数字人说完等模型的下一段,会出现明显卡顿。两次 speak 之间用 `interactiveidle()` 做状态切换,避免指令冲突。

Step 5:SSML 触发语义化动作

教育场景有个特殊需求:学生答对时,数字人应该有鼓励性的动作。星云 SDK 支持 SSML 标记语言,可以同步触发语义化动作:

// 学生答对时的鼓励播报
const praiseSSML = `
<speak>
  <ue4event>
    <type>ka</type>
    <data><action_semantic>ThumbsUp</action_semantic></data>
  </ue4event>
  没错!你完全掌握了这个思路,太棒了!
</speak>`;

sdk.speak(praiseSSML, true, true);

通过 KA 指令,数字人在说话时能同步做出点赞、指引、打招呼等语义化动作。侄子看到数字人给他竖大拇指的时候,明显比看一段"太棒了"的文字兴奋得多。

**Step 6:**主组件结构

创建 src/components/CustomerService.vue

<!-- src/components/CustomerService.vue -->
<script setup>
import { ref, onMounted, onUnmounted } from 'vue'
import XingYunService from '@/services/xingyun.service.js'
import LLMService from '@/services/llm.service.js'

const isConnected = ref(false)
const loadProgress = ref(0)
const currentState = ref('准备中...')
const userInput = ref('')
const chatHistory = ref([])

// 初始化数字人
const initAvatar = async () => {
  try {
    const config = {
      onProgress: (progress) => {
        loadProgress.value = progress
        currentState.value = `加载中 ${progress}%`
      },
      onStateChange: (state) => {
        currentState.value = state
        if (['ready', 'speak', 'idle', 'playing'].includes(state)) {
          isConnected.value = true
        }
      },
      onSubtitle: (content) => {
        addMessage('avatar', content)
      },
      onError: (error) => {
        currentState.value = '连接失败'
      }
    }

    await XingYunService.initSDK(config)
    isConnected.value = true
    addMessage('avatar', '同学好!我是专业数字讲师...')
    
  } catch (error) {
    currentState.value = '初始化失败'
  }
}

// 发送消息
const sendMessage = () => {
  if (!userInput.value.trim()) return
  
  addMessage('user', userInput.value)

  LLMService.sendMessageStream(userInput.value)
  .then((aiReply) => { 
    XingYunService.speak(aiReply, true, true)
  })
  
  userInput.value = ''
}

// 添加消息
const addMessage = (type, content) => {
  const now = new Date()
  const time = `${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}`
  chatHistory.value.push({ type, content, time })
}

onMounted(() => initAvatar())
onUnmounted(() => XingYunService.disconnect())
</script

星云官方也有完整的 Vue 3 Demo,:GitHub 仓库,ASR 和 LLM 封装更完善,可以直接 clone 改。

在这里插入图片描述

跑通之后的几点思考

1. 纯文本 Agent 缺的不是大脑,是落地载体

这个观点是我做完 Demo 之后最深的感受。DeepSeek 的推理能力已经很强了,引导式教学的逻辑完全没问题。但同样一段引导话术,在聊天框里读和让一个 3D 数字人面对面说出来,完全是两种体验。具身 Agent 不是给 Agent 加个装饰,而是补齐了 Agent 从"能回答"到"能交互"的最后一公里。具身 Agent 将成为下一代人机交互主流入口,这不是一句口号,而是我实际体验后的判断。

2. 参数流方案是真正解决规模化部署的

之前了解过其他数字人方案走视频流路线,一路推流一路带宽,教室场景下几十台终端就把网络吃满了。星云的参数流方案下发的数据量极小,通过 AI 端渲和端侧解算在端侧完成渲染,百元级硬件芯片就能跑,千路并发不受限。这意味着学校机房的老旧设备也能跑起来,规模化部署的硬件门槛极低。

3. 端到端约 500ms 响应,对话体验接近真人

从学生开口到数字人开始回答,整体延迟约 1.2 秒(含 ASR + DeepSeek + SDK 驱动)。纯 SDK 驱动环节端到端约 500ms,日常对话基本无感知。教育场景对延迟特别敏感——如果数字人停顿太久,学生会走神。500ms 这个数字意味着具身交互在实际场景中是可用的,不是 demo 级别。

4. 一套 SDK 适配全品类终端

星云的 SDK 同步适配屏幕、人形机器人、AR/VR 眼镜等终端形态。这意味着我做的这个教育陪练 Agent,今天跑在网页上,明天可以部署到教室大屏,后天可以放进教育机器人里。对开发者来说,写一次代码适配多终端,这个投入产出比很划算。

5. AI Coding 工具让开发效率翻倍

这个项目我用 Cursor 写代码,从零到跑通大概半天。Cursor 对 SDK 接入这种有固定模式的代码补全效果很好,基本写个注释它就帮你生成框架。DeepSeek 做大模型推理 + 引导式教学的表现也超出了我的预期。

小结

回到开头那个问题:Agent 的"最后一公里"卡在哪了?

我的答案是:卡在 Agent 没有身体。 纯文本 Agent 缺少具身落地载体,大模型再聪明,如果只能通过聊天框输出文字,它就永远是一个"工具",而不是一个"伙伴"。

魔珐星云依托 AI 端渲和解算 + 自研参数流,为各类 Agent 补齐了 3D 具身拟人交互形态。它解决的不是"AI 能不能回答"的问题,而是"AI 能不能被用户自然地接受"的问题。从我的实践来看,当一个 Agent 拥有了身体、表情和动作,用户跟它交互的心理门槛会大幅降低——我侄子从"两分钟关页面"到"主动问数字人下一题",就是最好的证明。

大模型让 AI 学会了思考。下一步,让 AI 进入终端,以具身的方式与人交互。如果你也在做 Agent 开发,不妨试试给你的 Agent 一个"身体"。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐