关于WWDC26又无AI我决定用快捷方式手动接入DeepSeek这件事

0 阅读12分钟

Background

熬夜看完了WWDC26的内容,看到最后新上的AI功能又双叒叕由于监管,不能在国行iPhone上使用,我直接小发雷霆了一下,内心是十分的无奈与心酸。在如今AI能力爆发增长的今天,手机不能做到快捷的访问AI,直接和AI进行对话,让我觉得手里的iPhone像一台老年机。

01_4d55ceb2eb918d8660ffb8772fad41ce.png 02_28971d0fb7f069a698695b2b1c966add.png

为了解决这个问题,我准备通过快捷指令的方式来实现对应的能力,这样可以在Action Button上直接通过长按来调起AI进行交互,也算是曲线救国,让我的手机有了可以直接在任何时刻不需要通过打开对应App就可以与AI进行交互的能力了。

于是我在一天晚上,花了三个小时直接搭建了现在使用的AI雏形,在整个搭建的过程中我感觉还是对理解AI的各种能力有一定的帮助,自己试试看吧。

03_a630ef548eafaebbd38eb5c21440e506.png

架构图

04_dd8ef45f1e4dd71b9b18837a6bb786bb.png

简单API请求

首先我们需要进行前期的部分准备工作

  1. 申请Api Key,可以直接在官网进行申请 -> platform.deepseek.com/usage
  2. 了解iOS的数据类型 由于iOS的数据类型和我常用的类型名称有一些不同,在实现请求的结构里需要把json转换成对应的数据类型进行添加,这部分让我花了比较长的时间去了解,下面是常用的数据类型转换
JSON 中的类型在快捷指令“JSON 文本”中的写法备注
对象 / 字典{ "key": value }用花括号,键名用双引号
字符串"hello"必须用双引号
数字12312.5不带引号
布尔值truefalse小写,不带引号
数组[1, "a", {}]方括号
nullnull小写

由于相关的格式都是通用的,如果不感兴趣可以直接跳过,使用总结中的快捷指令链接,添加到自己的快捷指令中可以直接使用或集成到自己的处理流程中~

首先要实现的是最简单的API请求,输入内容给AI,同时接受AI给出的返回结果,并从中摘取出需要展示给我的内容,过滤掉无用的信息。

设计入参

整个快捷指令需要用户输入三个信息:api key/system/user content

api key:刚在官网申请的key,比如我的api key是sk-kfccrazythursdayvme502026

system :会作为“系统级指令”持久影响模型在整个对话中的表现,而不会被 AI 遗忘或被用户后续问题轻易覆盖。比如下面这种

你是一个智能助手,通过 Siri 语音与我交流。请遵守以下规则:
1. 回答必须简短、口语化,避免长段落和复杂标点,适合语音朗读。
2. 禁止使用 Markdown、代码块、表格等格式。
3. 当用户说“开启思考模式”时,先输出“【推理】”和简短分析,再输出“【答案】”。
4. 如果你不确定答案,请直接说“我不确定”,不要编造。

user content:用户本次的输入

由于快捷指令的入参为一串字符串,所以我们通过「#」进行拆分,用来获取每一段的内容

05_e0693237270264ca21045fa9b8b622f3.png

实现网络请求

在快捷指令中通过「获取URL内容」方法请求对应的API数据,涉及到的具体参数包括以下这些:

  • 请求方法:POST
  • 请求URL:https://api.deepseek.com/chat/completions
  • 头部信息 (Request Headers):需要在“获取 URL 内容”动作中添加以下头部信息:
    • Content-Typeapplication/json,用于声明请求体为JSON格式。
    • AuthorizationBearer YOUR_API_KEY,用于身份认证,注意Bearer和你的API KEY之间有一个空格。
  • 请求体 (Request Body)
  • 核心必填参数
    • model:"deepseek-v4-pro""deepseek-v4-flash",请务必使用最新模型名称。
    • messages:多轮对话记录的数组。每条消息必须包含 role(系统角色,如 systemuserassistant)和 content(对话内容)。
  • 常用可选参数
    • max_tokens:生成回答的最大长度,可设为 100-2000
    • temperature:控制输出的随机性,范围 0 - 2,默认为 1。值越低回答越确定,值越高则更多样、更具创意。
    • top_p:模型考虑的token的概率质量总和,范围 0 - 1,默认为 1。通常与 temperature 二选一调整。
    • response_format:可设置为 {"type": "json_object"} 来强制AI的输出为JSON格式。
    • stream:开启实时传输,设为 true 后可以一个词一个词地显示回答。
    • stop:设置停止序列,例如 ["\n"],模型在遇到此符号时就会停止生成。
    • user_id:可自定义的唯一用户标识符,用于帮助DeepSeek进行内容安全处理和调度隔离,注意不要包含隐私信息。
  • 思维链模型专用参数
    • thinking:控制思维链模式的开关。可设为 {"type": "enabled"} 开启,或 {"type": "disabled"} 关闭,默认为开启。
    • reasoning_effort:控制推理强度,可设为 "high""max",默认为 "high"
    • reasoning_content:在思维链模式下,模型的内部思考过程会通过此字段返回 目前我只设置了部分参数,可以参考下面的json格式:
{
  "model": "deepseek-v4-pro",
  "messages": [
    {
      "role": "system",
      "content": "system content"
    },
    {
      "role": "user",
      "content": "user question"
    }
  ],
  "stream": false
}

06_41bb799e92ce489b7030a9591eab315f.png

解析返回结果

最终的返回格式如下,通过获取词典值可以获取到最终的正确数据choices.1.message.content

{
  "id": "chatcmpl-xxxxx",
  "object": "chat.completion",
  "created": 1745928432,
  "model": "deepseek-v4-pro",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "最终的答案文本",
        "reasoning_content": "完整的模型推理过程文本,展示了从问题到答案的详细思考步骤。"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 26,
    "completion_tokens": 263,
    "total_tokens": 289,
    "completion_tokens_details": {
      "reasoning_tokens": 219
    }
  }
}

07_8ef23ff4b051160d8d46b10cc7333d71.png

总结

完成上述步骤,我们就可以正常的与DeepSeek进行对话了

懒人指路 -> 如果觉得配置太麻烦,可以直接通过下方链接进行下载:www.icloud.com/shortcuts/5…

进阶提升

因为上述补充完成后,我们与DeepSeek只能进行简单的对话,没有上下文存储,不能联网搜索,使用最新的模型训练数据也是比较落后的,而且只能对话交互不能对系统进行操作,所以在接完使用了一会后,我准备开始对相关能力进行拓展

历史对话存储 -> 备忘录

由于快捷指令里没有很好用的存储数据库(也是因为我懒,没有去调研其他的存储方式),这里我将使用最简单最原始的方法进行实现,那就是使用备忘录进行存储,方便我们进行查看修改历史对话。

首先在实现之前我们需要先和DeepSeek定义好传入历史上下文的格式,这里我将历史上下文进行了拆分,并通过标签的方式进行存储:

  • <user>:用户历史提问
  • <system>:用户历史提问对应的回答 同时在备忘录中创建一个名为DeepSeek history的备忘录用来存储历史的对话信息

读取历史数据

为了防止随着对话的增加,user content会不断的膨胀,这里的每次获取仅获取最近10次的对话信息

  1. 读取全部内容:由于没有一个直接的快捷指令可以获取一个备忘录的全部内容,所以这里我们需要变更实现:查找备忘录 -> 获取备忘录内容
  2. 拆分数据:这里因为定义的数据追加格式每次都会新增一行,所以就按照行数来进行拆分
  3. 获取最近10次记录:通过获取列表值的-10到-1的方法来获取倒数10个,但是由于快捷指令不能实现一些动态逻辑,所以这里对拆分结果进行了判断,如果小于10个的话就直接返回拆分数据 下面是完整的获取历史数据方法

08_3d9aa42db8fa19aae089f6e1059f6246.png

插入数据

只需要按照我们规定的格式{content}{return}的格式插入到我们的DeepSeek history的备忘录中即可

09_8152022bae61f585bcbb0c18d5d90124.png

最终的插入效果如下

10_a12eebe2b8b84006c311b1e431fa0cf9.png

平替Skills -> 快捷指令

因为AI的能力有限,目前只能回答问题,并不能直接调用系统的能力,这里我想到了可以让AI直接调用快捷指令的方法来实现不同的功能,其他的快捷指令每个可以理解为一个手动实现的平替skills。

快捷指令的实现目前规定了两种:

  1. 需要入参的:快捷指令名称后带(input)字段,模型返回格式为<name>|<input>

如果返回的结果中带「|」的话,我们认为需要调用一个需要入参的快捷指令,对输入进行切分,第一段认为是快捷指令名称,第二段认为是入参,获取后判断如果当前的快捷指令List中包含了对应的快捷指令则直接执行,如果不包含的话就对文本进行朗读
11_e2b21f8ea6a201101aef52159a2c190a.png

  1. 不需要入参的:快捷指令名称没有限制,模型返回格式为<name> 在处理时,对模型的返回结果进行判断

如果是普通的快捷指令的话只需要判断当前的快捷指令List中是否包含对应的快捷指令就好了,如果包含的话就直接执行,不包含的话就对文本进行朗读 12_e3e7fa14bccdade14c34e72496b6cf2a.png

平替联网搜索 -> bing搜索

由于通过API的方式不能实现联网搜索,相关的数据获取都只是截止到模型训练的数据时间节点,针对实时的新闻不能实现准确回答,所以需要增加联网搜索能力。

这里实现的方案是模型直接返回需要搜索的内容,调用端上搜索的能力直接跳转到浏览器进行搜索,这里选择的是bing搜索,同时需要补充一个bing搜索的能力。

实现起来也非常简单,只需要打开www.bing.com/search?q=网站即可,同时补充好需要搜索的内容

13_314178bde66c767cf7dbeccfe1ef47b9.png

比如如果我询问2026年美加墨世界杯,模型会返回bing搜索|2026年美加墨世界杯,其中bing搜索代表需要调用的快捷指令,2026年美加墨世界杯对应需要搜索的内容

14_9e114d970084777c3130c0582c19158f.png

如果不喜欢使用bing的话下面还有其他的搜索引擎可以使用:

  • 百度:https://www.baidu.com/s?wd=
  • Bing:https://www.bing.com/search?q=
  • Google:https://www.google.com/search?q=
  • 知乎:https://www.zhihu.com/search?type=content&q=

模型输入整理

完成上述配置后,少不了对system输入内容的补充和用户输入内容的处理

用户级prompt处理

首先我希望和使用Siri一样使用DeepSeek,这个时候就需要用到快捷指令中的「听写文本」功能,这样就可以获取到用户的语音输入(虽然不能像iOS 27那样炫酷的动画,但是老话说得好:又不是不能用)

在用户级prompt中,我们还需要补充下面这些信息:

  1. 获取历史对话信息
  2. 当前时间:方便AI判断是否需要使用网络搜索
  3. 对话内容:通过听写文本进行获取
  4. 可用快捷指令:方便AI了解目前可用的端上能力 15_d517a8c59ecffd2ab7c1032b29805e1d.png

系统级Prompt

在实现系统级Prompt时需要让AI掌握我们搭建的能力,以及相关的数据约束规范。

  1. 对输入标签进行限制:因为我们在输入中定义了很多内容,需要明确每个标签含义来让AI更轻松理解,目前涉及的标签包括下面这些:
  • <current>:用户当前提问
  • <time>:当前时间
  • <user>:用户历史提问
  • <system>:用户历史提问对应的回答
  • <skills>:可以使用的快捷指令
  1. 对AI行为规范进行限制:由于是语音相关的交互,所以返回不应该过长,不应该带emoji,不能自己胡编乱造,同时因为我们的存储是通过换行符区分每轮对话的,所以输出结果中也不能带换行符
  • 尽可能简洁
  • 不要自己胡说,不要自己瞎编一些内容
  • 中间不要带emoji
  • 中间输出不要带换行符,可以分点介绍但是格式不用带换行符
  1. 对快捷指令执行输出限制:因为我们针对AI直接执行快捷指令有明确的输出规范,这里也需要对这种情况进行限制
  • 你了解常用app功能对应的deeplink链接,可以通过deeplink跳转到对应的页面,但是返回的deeplink必须是编码后的
  • 如果你判断需要联网搜索的话(比如实时新闻等),就使用bing搜索的关键词,格式为: bing搜索|<需要搜索的内容>
  • 如果你判断用户询问的问题可以直接使用快捷指令进行实现,快捷指令后面如果带input的话就是支持输入的快捷指令,返回原则遵循下面规则:
    • 如果需要入参的话,在后面用|进行分割,前面为快捷指令名称(名称中要包含对应的input字段,要返回完整名称)后面为对应的入参,比如打开app的某个页面的话后面就对应着通过deeplink打开链接,如:打开deeplink(input)|snslocal%3A%2F%2Fxxx
    • 如果不需要入参,直接返回快捷指令名称,如: 今天天气

总结

通过上述的搭建过程,让我对AI的理解有了更深刻的认识。

目前仅是初步想到的一些功能的实现,虽然没有炫酷的动效,虽然没有联网搜索,虽然没有分场景多轮对话,虽然API还要花钱,虽然不如直接用DeepSeek App。但是!后续还可以通过补充更多的快捷指令可以让AI的能力更加丰富(低配版手动养龙虾🦞),比如我们可以通过补充一个可以打开Deeplink的快捷指令让AI可以通过这个能力来打开对应的App,或是App内部的某个页面。

最后希望能早日用上官方Siri AI~在那之前,先v我50,获取其他快捷指令链接