《API 防幻觉实战》一句话让hmharness 帮你构建鸿蒙应用

0 阅读6分钟

《API 防幻觉实战》一句话让hmharness帮你构建鸿蒙应用《API 防幻觉实战》一句话让hmharness帮你构建鸿蒙应用《API 防幻觉实战》一句话让hmharness帮你构建鸿蒙应用幻觉不是被说服的,是被索引拦截的:鸿蒙 API 防幻觉实战幻觉不是被说服的,是被索引拦截的:鸿蒙 API 防幻觉实战用过 AI 写鸿蒙代码的朋友大概率见过这一幕:你问一个 API,它流利地给你 import 语句、参数表、示例代码——看起来完全能跑,一编译,API 根本不存在。

这不是模型笨,是它的处境就这样:模型只有训练记忆,看不见你本机的 SDK 版本。鸿蒙 API 迭代快、各版本差异大,训练语料里混着过时答案,它只能凭印象编。

提示词解决不了这个问题

你在提示词里写「不要编造 API」,模型会答应,然后继续编——只是语气更自信了。因为「知道自己在编」和「知道自己没在编」是两回事,后者需要外部事实。

我们的解法:给模型一副眼镜

hmharness 在构建时就把本机 SDK 的 927 个 d.ts 文件全部解析,索引出 20,241 个符号(0.2 秒建完)。模型每次要用鸿蒙 API,先查索引:

  • 查得到:返回真实签名和参数说明
  • 查不到:返回「此 API 不在你的 SDK 中,不要猜测」

效果很直接:模型从「一本正经地编」变成「诚实地拒绝,并给出正确的替代 API」。

// 模型用过 AI 写鸿蒙代码的朋友大概率见过这一幕:你问一个 API,它流利地给你 import 语句、参数表、示例代码——看起来完全能跑,一编译,API 根本不存在。

这不是模型笨,是它的处境就这样:模型只有训练记忆,看不见你本机的 SDK 版本。鸿蒙 API 迭代快、各版本差异大,训练语料里混着过时答案,它只能凭印象编。

## 提示词解决不了这个问题

你在提示词里写「不要编造 API」,模型会答应,然后继续编——只是语气更自信了。因为「知道自己在编」和「知道自己没在编」是两回事,后者需要外部事实。

## 我们的解法:给模型一副眼镜

hmharness 在构建时就把本机 SDK 的 927 个 d.ts 文件全部解析,索引出 20,241 个符号(0.2 秒建完)。模型每次要用鸿蒙 API,先查索引:查得到返回真实签名,查不到返回「此 API 不在你的 SDK 中,不要猜测」。

效果很直接:模型从「一本正经地编」变成「诚实地拒绝,并给出正确的替代 API」。

## 三个关键设计

一、索引按本机实时构建。SDK 更新了索引跟着重建(缓存于 HMH_HOME/apikg),永远不会给你训练记忆里的旧 API。

二、拒绝时给替代。查不到 systemStartAbilityEx,索引告诉模型「你可能想找 startAbility」——拒绝和引路一起做。

三、这个思路可以复制。任何有类型定义文件的生态(d.ts、.h、proto)都能这么干。防幻觉的本质是给模型提供「可查询的事实」,而不是「善意的叮嘱」。

## 实测效果

20,241 个符号覆盖 SDK 全部公开 API;0.2 秒建索引;模型查 API 零幻觉(索引是唯一事实源);误查自动给出最接近的正确 API。

这套索引已内置在开源工具 hmharness(MIT)里,连同零 IDE 的鸿蒙全流程工具链。

GitHub: https://github.com/swsgbl/hmharness

证据页: https://swsgbl.github.io/hmharness/evidence/幻觉不是被说服的,是被索引拦截的:鸿蒙 API 防幻觉实战幻觉不是被说服的,是被索引拦截的:鸿蒙 API 防幻觉实战请求
harmony_api_lookup("systemStartAbilityEx")

// 索引返回
{
  found: false,
  suggestion: "startAbility",
  so用过 AI 写鸿蒙代码的朋友大概率见过这一幕:你问一个 API,它流利地给你 import 语句、参数表、示例代码——看起来完全能跑,一编译,API 根本不存在。

这不是模型笨,是它的处境就这样:模型只有训练记忆,看不见你本机的 SDK 版本。鸿蒙 API 迭代快、各版本差异大,训练语料里混着过时答案,它只能凭印象编。

## 提示词解决不了这个问题

你在提示词里写「不要编造 API」,模型会答应,然后继续编——只是语气更自信了。因为「知道自己在编」和「知道自己没在编」是两回事,后者需要外部事实。

## 我们的解法:给模型一副眼镜

hmharness 在构建时就把本机 SDK 的 927 个 d.ts 文件全部解析,索引出 20,241 个符号(0.2 秒建完)。模型每次要用鸿蒙 API,先查索引:

- 查得到:返回真实签名和参数说明
- 查不到:返回「此 API 不在你的 SDK 中,不要猜测」

效果很直接:模型从「一本正经地编」变成「诚实地拒绝,并给出正确的替代 API」。

## 三个关键设计

### 一、索引按本机实时构建

SDK 更新了,索引跟着重建(缓存于 HMH_HOME/apikg,SDK mtime 变化才重建)。永远不会给你训练记忆里的旧 API。

### 二、拒绝时给替代

查不到 systemStartAbilityEx,索引会告诉模型「你可能想找 startAbility」——拒绝和引路一起做,不让模型卡死。

### 三、这个思路可以复制

不只鸿蒙:任何有类型定义文件的生态(d.ts、.h、proto)都能这么干。防幻觉的本质是给模型提供「可查询的事实」,而不是「善意的叮嘱」。

## 实测效果

- 20,241 个符号覆盖 SDK 全部公开 API
- 0.2 秒建索引(SDK 变化时自动重建)
- 模型查 API 零幻觉(索引是唯一事实源)

这套索引已内置在开源工具 hmharness(MIT)里,连同零 IDE 的鸿蒙全流程工具链。

GitHub: https://github.com/swsgbl/hmharness
证据页: https://swsgbl.github.io/hmharness/evidence/urce: "@ohos.app.ability",
  message: "此 API 不在你的 SDK 中,不要猜测"
}

三个关键设计

一、索引按本机实时构建

SDK 更新了,索引跟着重建(缓存于 HMH_HOME/apikg,SDK mtime 变化才重建)。永远不会给你训练记忆里的旧 API。

二、拒绝时给替代

查不到 systemStartAbilityEx,索引会告诉模型「你可能想找 startAbility」——拒绝和引路一起做,不让模型卡死。

三、这个思路可以复制

不只鸿蒙:任何有类型定义文件的生态(d.ts、.h、proto)都能这么干。防幻觉的本质是给模型提供「可查询的事实」,而不是「善意的叮嘱」。

实测效果

  • 20,241 个符号覆盖 SDK 全部公开 API
  • 0.2 秒建索引(SDK 变化时自动重建)
  • 模型查 API 零幻觉(索引是唯一事实源)
  • 误查自动给出最接近的正确 API

这套索引已内置在开源工具 hmharness(MIT)里,连同零 IDE 的鸿蒙全流程工具链(建工程/构建/签名/装机/日志)。

GitHub: github.com/swsgbl/hmha… 证据页: swsgbl.github.io/hmharness/e…