前言

上一篇讲了多 Agent 协作,但 Agent 再会协作,自己没脑子也白搭。今天来给智能生活助手装上"大脑"——接入 HarmonyOS 7 的 openPangu 2.0 端侧大模型。

openPangu 2.0 是什么

openPangu 2.0 是华为自研的端侧大语言模型,专为鸿蒙设备优化。跟上一代比,这一版在对话理解、文本生成、语义推理上有明显提升,关键是推理速度够快,不用联网就能跑。

A clean Notion-style technical diagram illustratin

端侧模型的好处大家都知道:数据不出设备、响应延迟低、离线也能用。对于智能生活助手这种场景特别合适——用户问"今晚做什么菜",总不能让人等个 3 秒看圈圈转吧。

openPangu 2.0 提供了几个规格:轻量版(约 2B 参数,适合穿戴设备)、标准版(约 7B,手机主力)、增强版(约 14B,平板/PC)。我们手机 App 用标准版就够了。

模型加载:别在主线程干这事

接入的第一步是把模型加载到内存里。通过 aiEngine 模块来完成:

import { aiEngine } from '@kit.AIKit';
import { BusinessError } from '@kit.BasicServicesKit';

// 模型配置
const modelConfig: aiEngine.ModelConfig = {
  modelType: aiEngine.ModelType.LLM,
  modelName: 'openpangu-2.0-standard',
  // 指定推理后端,NPU 优先
  inferenceBackend: aiEngine.InferenceBackend.NPU,
  // 量化精度,Q4 在手机端比较平衡
  quantization: aiEngine.QuantType.INT4
};

let llmSession: aiEngine.LLMSession | null = null;

async function initModel(): Promise<void> {
  try {
    // 注意:这一步是异步的,模型加载到 NPU 需要时间
    llmSession = await aiEngine.createLLMSession(modelConfig);
    console.info('openPangu 2.0 模型加载完成');
  } catch (err) {
    const error = err as BusinessError;
    console.error(`模型加载失败: ${error.code} - ${error.message}`);
    // 降级到云端模型
    await fallbackToCloudModel();
  }
}

A structured Notion-style workflow card showing th

这里有个关键选择:量化精度。INT4 推理速度最快,显存占用最小,但生成质量会有轻微下降。INT8FP16 质量更好但资源消耗更大。我实测下来,INT4 对于日常对话和简单任务编排已经够用了,跟 FP16 的差距普通人感知不到。

另外一个容易踩的坑:模型加载要 2-4 秒,千万别阻塞主线程。放在 AppStorage 的初始化阶段,配合一个加载状态就行。

文本生成:给 Agent 装上嘴

模型加载好之后,调用 generate 就能生成文本了。最简单的用法:

async function askAssistant(question: string): Promise<string> {
  if (!llmSession) {
    return '助手还在加载中,请稍等';
  }
  
  const response = await llmSession.generate({
    prompt: question,
    maxTokens: 512,
    temperature: 0.7,
    // 系统提示词,定义助手人设
    systemPrompt: '你是一个智能生活助手,帮用户管理日程、推荐食谱、查询天气等。回答简洁实用。',
    // 流式输出,逐 token 返回
    stream: true,
    onToken: (token: string) => {
      // 更新 UI,实时显示生成内容
      AppStorage.setOrCreate('streamingText', 
        AppStorage.get<string>('streamingText') + token
      );
    }
  });
  
  return response.text;
}

流式输出(stream: true)强烈建议打开。用户看到文字一个一个蹦出来,体验比等半天突然冒出一大段好太多了。跟 ChatGPT 那个打字效果一样的道理。

temperature 参数控制生成的随机性。生活助手这种场景建议 0.7 左右——太低了回答会太死板,太高了容易"胡说八道"。

对话上下文:让模型记住前面说了什么

A Notion-style comparison table titled 'Streaming

单次问答没什么意思,真正的对话需要上下文管理。openPangu 2.0 支持多轮对话,你需要自己维护消息历史:

// 对话历史
interface ChatMessage {
  role: 'user' | 'assistant' | 'system';
  content: string;
  timestamp: number;
}

class ConversationManager {
  private messages: ChatMessage[] = [];
  private maxHistory: number = 20; // 保留最近 20 轮
  
  private systemPrompt: string = `你是"智能生活助手",一个贴心、高效的个人助理。
你的能力包括:
- 日程管理和提醒
- 天气查询和穿衣建议  
- 食谱推荐和营养分析
- 生活常识问答
回答风格:简洁、口语化、有温度。`;

  async chat(userInput: string): Promise<string> {
    // 添加用户消息
    this.messages.push({
      role: 'user',
      content: userInput,
      timestamp: Date.now()
    });
    
    // 构造完整的 prompt(包含历史)
    const fullPrompt = this.buildPrompt();
    
    const response = await llmSession!.generate({
      prompt: fullPrompt,
      maxTokens: 1024,
      temperature: 0.7,
      stream: true,
      onToken: (token: string) => {
        AppStorage.setOrCreate('streamingText',
          AppStorage.get<string>('streamingText') + token
        );
      }
    });
    
    // 保存助手回复到历史
    this.messages.push({
      role: 'assistant',
      content: response.text,
      timestamp: Date.now()
    });
    
    // 超过上限就裁剪旧消息
    this.trimHistory();
    
    return response.text;
  }
  
  private buildPrompt(): string {
    let prompt = `[System]\n${this.systemPrompt}\n`;
    
    for (const msg of this.messages) {
      const prefix = msg.role === 'user' ? '[User]' : '[Assistant]';
      prompt += `\n${prefix}\n${msg.content}`;
    }
    
    prompt += '\n[Assistant]\n';
    return prompt;
  }
  
  private trimHistory(): void {
    if (this.messages.length > this.maxHistory * 2) {
      this.messages = this.messages.slice(-this.maxHistory * 2);
    }
  }
  
  clearHistory(): void {
    this.messages = [];
  }
}

上下文窗口是有上限的,openPangu 2.0 标准版支持 8K tokens。maxHistory 设成 20 轮基本不会超限,但如果你需要更长的上下文,就得做摘要压缩了——把旧消息压缩成一段摘要再拼进 prompt。

Function Calling:让模型调用你的 Agent

光聊天不够,还得让模型能调起其他 Agent 干活。openPangu 2.0 支持 Function Calling,你在系统提示词里声明可用的工具,模型会根据用户意图自动生成调用指令:

const toolsPrompt = `
可用工具(当用户意图匹配时输出 JSON 调用指令):

1. get_weather(city: string, days?: number) - 查询天气
2. add_reminder(title: string, time: string) - 添加提醒
3. search_recipes(ingredients: string[], cuisine?: string) - 搜索食谱

当需要调用工具时,输出格式:
{"tool": "工具名", "args": {...}}
只输出 JSON,不要其他内容。`;

// 解析模型输出的工具调用
function parseToolCall(response: string): ToolCall | null {
  try {
    // 提取 JSON 部分
    const jsonMatch = response.match(/\{[\s\S]*\}/);
    if (!jsonMatch) return null;
    
    const parsed = JSON.parse(jsonMatch[0]);
    if (parsed.tool && parsed.args) {
      return { tool: parsed.tool, args: parsed.args };
    }
  } catch (e) {
    // 不是工具调用,是普通回复
  }
  return null;
}

// 完整的处理链路
async function processUserInput(input: string): Promise<string> {
  const rawResponse = await conversationManager.chat(input);
  const toolCall = parseToolCall(rawResponse);
  
  if (toolCall) {
    // 通过 A2A 协议调用对应的 Agent
    const agentResult = await agentManager.sendTask({
      targetAgentId: getAgentIdForTool(toolCall.tool),
      capabilityId: toolCall.tool,
      input: toolCall.args
    });
    
    // 把工具结果反馈给模型,让它生成最终回复
    const followUp = await conversationManager.chat(
      `工具执行结果:${JSON.stringify(agentResult.output)}\n请根据这个结果回复用户。`
    );
    return followUp;
  }
  
  return rawResponse;
}

这就是 openPangu 2.0 + A2A 的组合拳了:模型负责理解意图和生成回复,A2A 负责把任务分发给各个专业 Agent。两层解耦,各管各的,代码结构清爽很多。

性能调优建议

实话说,端侧模型的推理速度跟硬件强相关。搭载麒麟 9030 的 Mate 80 系列跑 openPangu 2.0 标准版,首 token 延迟大概 200ms,后续生成速度 30-40 tokens/s,体验非常流畅。但如果是老设备,可能就需要降级到轻量版了。

几个优化手段:

  • 预热:在用户还没开始输入时就加载好模型,别等点了按钮再加载
  • 批处理:如果连续发多条消息,攒起来一次推理比分开跑快
  • 后台保活:模型加载一次就保持会话,别每次用完都释放,下次又得重新加载
  • 降级策略:检测到 NPU 繁忙或内存不足时,自动切到云端模型

小结

openPangu 2.0 给你的智能生活助手带来的不只是"能聊天"这么简单。通过 Function Calling + A2A,你可以让模型成为整个 Agent 体系的调度中枢——用户说一句自然语言,模型理解意图,通过 A2A 调用对应的 Agent 执行任务,最后把结果用自然语言反馈给用户。

这整个链路都在端侧完成,延迟低、隐私安全。下一篇我们来讲视觉 AI,让助手不仅能"听"和"说",还能"看"。

Logo

免费领 150 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐