Skip to content

一天时间:用 AI 做个英语词根查询工具

可能博客的读者还不知道我其实是个开发者。最近做了一个英语词根查询工具 JarFire,也是第一次尝试 AI 套壳类的应用开发。如果你也对这方面感兴趣,并且从未做过相关工作,这篇文章可能就适合你;如果你已经有相关知识,那么这篇文章而言对你就太简单了。

拆字法:用英语词根词缀学单词

第一次听说这种学习方式还是看了《旋元佑英文字彙》。 举个例子,单词 unabridged 含义是“未删节的”,它可以拆分成: un / abridge / ed 三部分

  • 前缀 un-:不,非
  • abridge 删节,缩短
  • 后缀 -ed,表示过去分词形式

拆词后,对原词理解更深刻,而且还附赠了一个单词 abridge。 因此每次想要对新单词加深印象时,会用 ChatGPT 拆词,GPT-4o 之后它的效果很理想。 然而每次打开 ChatGPT,输入相同的提示词,总没有那么方便。于是突发奇想:我能不能用 API 尽快做一个英语单词词根词缀的查询工具?

最后花了一天时间完成原型,不得不感叹 AI 之强大。 以前创业也做过英语教育相关的产品,在没有 AI 的时代,这类工具需要大量人力、心力在数据整理、纠错、版权上。

本文分享下遇到的难点和解决方式。如果你在这方面有更好的实践方式,请分享给我补充。

PS,文章中的示例是:
词根词缀学单词 https://jarfire.org/zh-CN

挑战一:让 AI 输出 JSON 格式

总所周知,默认情况下 AI 会输出一堆废话。如何才能让程序也可以解析其中的内容?

  1. 首先可以在提示词中要求 AI 必须输出程序可使用的JSON格式。
  2. 其次,可以为 AI 提供输出样例模板。 它可以是 TypeScript、JSON、 YAML,关键处的位置也可以用伪代码,AI 也能理解。告诉它每个字段的含义。
  3. 最后,可以要求不输出 markdown 格式。部分模型无法生效的话,也可以正则替换。

这样得到的文本结果可 JSON.parse。

设置 response_format 是更好的方式

DeepSeek 2024/07/25 更新[1],支持设置 response_format 参数为 json_object。 这是个 OpenAI 的 API 特性,其他模型亦有部分支持。开启后可更稳定输出 JSON 结果。

挑战二:异常检测

有了 JSON 格式数据后,还有另一个问题:异常数据怎么办?例如拆词工具可能会遇到的两个情况:

  1. 单词不存在
    部分用户可能会随便填写内容,这个时候需要把这部分异常数据检测出来,并有合理提示。
  2. 单词单复数问题
    单复数词又分几种情况
    • 常见词汇,复数应改成单数形式
    • 部分词汇,复数也应是个合理的独立词汇,例如 analytics
    • 部分单数形式的词汇看上去像复数,例如 news
  3. 单词不可拆解
    例如 giraffe / apple。这个时候要特别小心 AI 的幻觉问题,避免它一本正经胡说八道。

预处理
单复数和单词不存在可以尽量通过非 AI 的形式格式化单词,提升查询速度,降低 API 调用次数。 或者可以用词典提前筛选出不可拆解单词并入库。

条件分支
还要为输出格式列举 case,并要求按情况返回不同格式数据。

挑战三:费用

上线一天后,看 Azure 的费用清单,才测试了几十个单词,开销就达到了 $0.5,要是覆盖常见词汇和不同语种解释,估计费用能上万。 因此做了一些优化。

精简 token

要保证在尽量少的 token 下实现效果,有一些技巧可以使用。 对于初学者,最简单的方式:

  • 合并重复项:重复的文本可以替换,如果不方便删减,还可以用占位符代替。
  • 不必要的标点可以删除。

可能还有一些更高级的做法,我还没有掌握。

风险控制

如果有人想要刷爆你的账单,他只要反复构造请求就可以了。因此还需要做一些风控。常见的控制方式:

  • 云服务商的预算控制,设定消耗阈值以及警告
  • 反爬虫措施、 QPS 流控
  • 用户侧付费,设定免费额度。同时当心有人创建一堆免费试用帐号来为你刷量

更换模型

还可以测试不同模型的效果。目前看 GPT-4o、Claude 和国内一些模型效果均不错。 这是常见几个模型的价格参考:

名称价格表
Azure OpenAIhttps://azure.microsoft.com/en-us/pricing/details/cognitive-services/openai-service/#pricing
Claude APIhttps://www.anthropic.com/pricing#anthropic-api
Deepseekhttps://platform.deepseek.com/api-docs/zh-cn/pricing/
文心一言(需登录)https://console.bce.baidu.com/qianfan/chargemanage/list

一百万 token 基本都在几十元到上百元人民币左右。最便宜是 Deepseek,效果也不差,百万 token 才 1~2 元,因此我又更换到了 deepseek。

兼容性提示

同样的 prompt 在不同的模型里效果也不一样,直接替换可能会出现问题。新一代的模型通常效果更理想,不过价格也更贵。

挑战四:如何快速开发

这个挑战并不是 AI 套壳类应用所特有的。需要充分打磨自己的技术栈,采用成熟、生态完整的方案。我这次使用的是:

名称类型网址
NextJSTS 框架https://nextjs.org
TailwindCSS 框架https://tailwindcss.com
shadcn/uiUI 组件https://ui.shadcn.com
FloatUIUI 组件https://floatui.com
next-intl多语言组件https://next-intl-docs.vercel.app
drizzle数据库 ORMhttps://orm.drizzle.team
neonPostgreSQL 数据库托管https://neon.tech
vercel应用托管https://vercel.com

如果访问量足够小的话,前期不产生费用;如果有一定访问量,也可以切到自建。 上面提到的也有一些替代方案,例如 netlify、cloudflare worker、fly.io 代替 vercel。 如果打算面向国内的用户,这方面就会有一些更难的挑战:

  1. 国内极少有免费托管应用/数据库
  2. 合规、备案,例如 AI 算法备案;同时也要留意生成的内容是否符合相关法规。
  3. 国内习惯用 App;如果是 PC 页面,往往浏览器比较旧,在兼容性上需要更多时间

FAQ 常见问题

超时问题

由于使用的 API 是一次性完整返回全部内容,因此从查询到解析完成通常会卡数十秒的时间。需要考虑:

  1. UI 交互需要让用户有足够预期
  2. 部分结果可以缓存,例如文章里的场景,单词都可以缓存或提前查询好,并入库。

如果是 nextjs 部署到应用平台,需要设置好 maxDuration.


  1. JSON Output https://platform.deepseek.com/api-docs/zh-cn/json_mode ↩︎

评论

  1. 1. 只有科学上网才能看到评论
  2. 2. 默认不显示,但是都会回复。精选后显示
  3. 3. 你也可以通过邮件跟我联系