《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…