🎬 开场:老板一句话,我差点重写了整个前端

上周一晨会,产品总监轻描淡写地说:

“竞品都上 AI 了,咱们后台也加个智能助手吧——用户问‘怎么查日志’,它能直接告诉步骤,最好还能一键执行。”

我表面点头,内心 OS:

“又要搞个右下角浮动小机器人?点开全是‘您好,请问有什么可以帮您?’的废话?”

但转念一想——与其应付差事,不如认真做一次‘真正好用的 AI 交互’

于是,我花了 7 天时间,基于两个开源项目,成功上线了一个深度集成、上下文感知、可执行操作的 AI 助手。今天就把全过程、所有坑、所有技巧,毫无保留地分享出来!


🔑 核心武器:为什么选 MateChat + DevUI?

市面上 AI 组件库不少,但我最终锁定了这两个来自 华为云 DevCloud 团队 的开源项目:

项目 定位 我的角色
✅ MateChat 智能对话 UI 组件库 “大脑” —— 负责交互逻辑、消息渲染、输入行为
✅ DevUI 企业级前端组件库 “身体” —— 负责按钮、布局、主题、一致性

💡 关键洞察

  • MateChat 不是“聊天框封装”,而是一套 面向 GenAI 场景的前端交互语言
  • DevUI 不是“又一个 Ant Design”,而是经过 华为内部亿级流量验证的企业级基座
  • 更重要的是——MateChat 原生基于 DevUI 构建,二者天然兼容,无缝融合!

这意味着:你不需要在“炫酷 AI 交互”和“专业 UI 体验”之间做选择


🧩 第一天:重新定义“AI 助手”——它不是客服,是协作者

❌ 错误姿势:贴个聊天框就叫 AI?

很多团队的做法:

  • 页面右下角固定一个圆形按钮;
  • 点开弹出对话窗口;
  • 用户问“怎么部署?”,AI 回一段复制粘贴的文档;
  • 用户还得手动去终端敲命令。

这不叫 AI 集成,这叫 “给 FAQ 加了个语音包”

✅ 正确姿势:把 AI 嵌入工作流

我的策略是:在用户最需要帮助的地方,提供 AI 入口

比如,在“K8s 部署失败”页面,当用户看到红色错误时,旁边多了一个按钮:

<template>
  <div class="deploy-failure">
    <h3>部署失败:ImagePullBackOff</h3>
    <d-button 
      type="text" 
      icon="icon-ai" 
      @click="askAIAboutFailure(task)"
    >
      问 AI 为什么失败?
    </d-button>
  </div>
</template>

点击后,右侧滑出一个协作面板(非弹窗),由 McLayout 构建,与主界面平级——不打断当前操作,像同事在旁边轻声提醒

🎯 设计哲学:AI 不是附加功能,而是工作流的自然延伸。


🧠 第二天:让 AI “看得见上下文”——没有上下文的 AI 是瞎子

早期测试时,AI 回答很泛:

“请检查镜像仓库权限或网络配置。”

用户一脸懵:“我哪知道要检查什么?”

问题出在哪?AI 不知道用户当前在看哪个任务、哪个集群、什么错误

于是我做了关键改进:自动携带业务上下文

// 获取当前页面状态
const context = {
  page: 'deploy-detail',
  taskId: route.params.id,
  cluster: 'prod-east',
  namespace: 'default',
  podName: 'api-server-7d5b8c9f4-x2jkl',
  lastError: 'failed to pull image "my-registry/image:v1": unauthorized'
};

// 发送给后端
const response = await fetch('/api/ai/assist', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    query: inputValue,
    context, // 👈 关键!
    tools: ['kubectl', 'logAnalyzer', 'yamlGenerator'] // 声明可用工具
  })
});

结果,AI 回答变成:

“检测到您使用私有镜像仓库且未配置 Secret。建议:

  1. 创建 imagePullSecret:
kubectl create secret docker-registry my-registry-secret \\  
  --docker-server=my-registry.com \\  
  --docker-username=user \\  
  --docker-password=pass  
  1. 在 Deployment 中引用该 Secret。
    👉 [一键生成 YAML] | [复制命令]”

而且,代码块自动语法高亮——这是 MateChat 的默认能力!

效果:用户不再需要“翻译 AI 的话”,直接拿到可执行方案。


🤖 第三天:让它“能动手”——从嘴替到手替

光说不做假把式。用户还是得手动复制命令去终端。

于是我和后端约定了一套 “可执行动作协议”

{
  "thought": "需要创建 imagePullSecret",
  "action": {
    "type": "runCommand",
    "payload": "kubectl create secret ..."
  }
}

前端收到后,不仅显示文字,还在气泡下方渲染操作区:

<McBubble :content="msg.content">
  <template #actions>
    <d-button 
      type="primary" 
      size="sm" 
      icon="op-terminal"
      @click="executeInWebTerminal(msg.action.payload)"
    >
      在终端执行
    </d-button>
    
    <d-button 
      type="text" 
      @click="copyToClipboard(msg.action.payload)"
    >
      复制命令
    </d-button>
  </template>
</McBubble>

🔥 用户点击 → 命令自动发送到 Web Terminal(我们已集成)→ 结果实时回显。
AI 从“嘴替”变成了“手替”,甚至能触发后续流程(如自动重试部署)。


🎨 第四天:让它“长得像我们家的人”——UI 一致性是底线

虽然交互由 MateChat 驱动,但视觉必须和现有系统一致。

幸好我们用的是 DevUI,而 MateChat 原生基于 DevUI 构建

  • 所有按钮、图标、间距自动匹配 d-buttond-card 风格;
  • 暗色模式下,气泡背景、文字颜色自动适配
  • 修改品牌色?只需一行 CSS:
    :root { --devui-brand: #5e7ce0; } /* 华为主色 */
    MateChat 的输入框边框、气泡强调色自动同步——因为它们共享同一套 CSS 变量!

零成本实现 UI 统一,设计师看了直呼:“终于不用再调样式了!”


⚙️ 第五天:性能 & 体验优化细节

1. 流式响应(Stream)——别让用户干等

大模型生成慢?用 SSE(Server-Sent Events) 实现流式输出:

const stream = new EventSource(`/api/ai/stream?query=${encodeURIComponent(query)}`);
stream.onmessage = (event) => {
  const chunk = JSON.parse(event.data);
  if (chunk.content) {
    messages.value[messages.value.length - 1].content += chunk.content;
  }
};

MateChat 的 McBubble 自动支持动态内容更新,打字机效果丝滑呈现

2. 快捷提示(Quick Prompts)——降低使用门槛

新手不知道怎么问?提供场景化建议:

const quickPrompts = [
  { label: '分析部署失败原因', value: 'analyze-failure' },
  { label: '生成回滚 YAML', value: 'generate-rollback' },
  { label: '查看最近 10 条日志', value: 'show-recent-logs' }
];

放在输入框上方,用户一眼就知道“能问什么”。

3. 输入增强:支持 @提及、附件上传

MateChat 的 McInput 原生支持:

  • @智能体 切换角色(如 @运维专家、@安全顾问);
  • 拖拽上传日志文件,AI 自动解析内容。

📊 第六天:上线 & 数据反馈

  • 开发周期:前端 5 人日 + 后端 3 人日;
  • 上线 3 天
    • 客服工单减少 35%
    • AI 助手日均调用量 1200+
    • 用户 NPS(净推荐值)提升 22 分
  • 用户原话

    “感觉后台有个懂技术的同事在帮我。”
    “以前查日志要翻半小时,现在问一句就搞定。”


🚀 第七天:完整上手指南(附代码)

1. 创建项目

npm create vite@latest ai-assistant -- --template vue-ts
cd ai-assistant

2. 安装依赖

npm install @matechat/core vue-devui @devui-design/icons

3. 全局注册

// main.ts
import { createApp } from 'vue';
import App from './App.vue';

import MateChat from '@matechat/core';
import DevUI from 'vue-devui';
import 'vue-devui/style.css';
import '@devui-design/icons/icomoon/devui-icon.css';

const app = createApp(App);
app.use(MateChat);   // 注册 McBubble, McInput 等
app.use(DevUI);      // 注册 d-button, d-card 等
app.mount('#app');

4. 使用核心组件

<template>
  <d-card class="ai-panel">
    <div class="chat-content">
      <McBubble
        v-for="(msg, idx) in messages"
        :key="idx"
        :content="msg.content"
        :align="msg.role === 'user' ? 'right' : 'left'"
        :avatarConfig="getAvatar(msg.role)"
        :loading="msg.loading"
      />
    </div>
    
    <div class="chat-footer">
      <McInput
        v-model="inputValue"
        :maxLength="2000"
        placeholder="请输入问题(支持 @智能体、上传文件)"
        @submit="handleSubmit"
      />
      
      <d-button 
        type="primary" 
        :disabled="!inputValue.trim()" 
        @click="handleSubmit"
        style="margin-left: 8px"
      >
        发送
      </d-button>
    </div>
  </d-card>
</template>

⏱️ 10 分钟,跑通第一个 AI 对话界面


🔗 官方资源(强烈推荐收藏)

💡 提示:Vue 版最成熟,React/Angular 正在积极迭代中。


💬 写在最后:技术的意义,是让人更轻松

我们常常追求“更强大的模型”,却忽略了更好的交互才是用户体验的核心

MateChat + DevUI 的组合,让我意识到:

  • 前端不只是胶水,更是体验的设计师
  • AI 的价值不在“回答”,而在“融入工作流”
  • 最好的智能,是让用户感觉不到“智能”,只觉得“顺手”

也许未来的某一天,每个企业系统都会有一个“数字同事”——
而今天,我们用开源工具,迈出了第一步。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐