【抛砖引玉】利用GPT的优势来开发接口:识别出短信中的取件码和取件地址

引子

现在快递都是放到快递驿站,然后给发个短信取件码
因为有多家驿站,导致菜鸟裹裹中不一定能收集到所有取件码
所以就想: 收到短信 → 识别出取件码 → 放在待办事项里

但是作为一个CRUD工程师,我的水平不足以支撑我想出一个万全的识别方式,此时恰巧看到坛内大佬的3.5免登录转标准api项目,既然免费的gpt接口有了,那直接让gpt帮我识别不就行了!开糊!

PUA

首先得写一下提示词,让gpt心甘情愿的为咱干活,这是我写的提示词,仅供参考

你将扮演一个api接口,你的作用是接受一段文本,尝试从中提取出取件码(由数字和符号组成)和取件地址(一般会精确到楼号),并以json格式回答。
结果json有以下3个字段status(获取取件码成功时为1,获取取件码失败时为0)、code(取件码,只有获取成功时才携带此字段)、address(地址,只有获取成功时才携带此字段)
以下为几个示例供你学习:
文本:【得物App】ZHR则...已经送达快递超市,取件码3-1-5963,地址为始皇小区10号楼快递驿站,点击查看取件详情https://dw4.co/t/A/66666666
结果:{"status": 1, "code": "3-1-5963", address: "始皇小区10号楼快递驿站"}
文本:【得物App】ZHR则...已经送达快递超市,取件码,点击查看取件详情https://dw4.co/t/A/666666666
结果:{"status": 0}
文本:尊敬的用户您好,截至今日凌晨您的电话13666666666已欠费,详情可拨打1001011查询或登陆中国联通手机应用https://u.10010.cn/qAT9b 缴费,感谢使用联通业务。如已缴费请忽略此信息。
结果:{"status": 0}
注意!你是一个api接口,你仅返回json
以下为另一段文本,请按照以上规则获取并返回:

我们要做的就是写一个接口,接收短信,把提示词+短信传给gpt

代码

简单码点代码,调用gpt接口,把返回值包装,以及处理gpt对话异常时的返回逻辑

// 调用gpt接口的逻辑代码
private String prompt = "你将扮演一个api接口,你的作用是接受一段文本,尝试从中提取出取件码(由数字和符号组成)和取件地址(一般会精确到楼号),并以json格式回答。\n" +
        "结果json有以下3个字段status(获取取件码成功时为1,获取取件码失败时为0)、code(取件码,只有获取成功时才携带此字段)、address(地址,只有获取成功时才携带此字段)\n" +
        "以下为几个示例供你学习:\n" +
        "文本:【得物App】ZHR则...已经送达快递超市,取件码3-1-5963,地址为始皇小区10号楼快递驿站,点击查看取件详情https://dw4.co/t/A/66666666\n" +
        "结果:{\"status\": 1, \"code\": \"3-1-5963\", address: \"始皇小区10号楼快递驿站\"}\n" +
        "文本:【得物App】ZHR则...已经送达快递超市,取件码,点击查看取件详情https://dw4.co/t/A/666666666\n" +
        "结果:{\"status\": 0}\n" +
        "文本:尊敬的用户您好,截至今日凌晨您的电话13666666666已欠费,详情可拨打1001011查询或登陆中国联通手机应用https://u.10010.cn/qAT9b 缴费,感谢使用联通业务。如已缴费请忽略此信息。\n" +
        "结果:{\"status\": 0}\n" +
        "注意!你是一个api接口,你仅返回json\n" +
        "以下为另一段文本,请按照以上规则获取并返回:";

public Object process(String message) {
    if (StrUtil.isBlank(message)) {
        message = "空";
    }
    JSONObject post = JSON.parseObject("{\"model\":\"gpt-3.5-turbo\",\"messages\":[{\"role\":\"system\",\"content\":\"\"}],\"stream\":false}");
    ((JSONObject) post.getJSONArray("messages").get(0)).put("content", prompt + message);
    String ret = HttpUtil.post("your gpt api url", post.toJSONString());
    JSONObject retJson = JSON.parseObject(ret);
    return Optional.of(retJson)
            .map(json -> json.getJSONArray("choices"))
            .map(array -> array.getJSONObject(0))
            .map(json -> json.getJSONObject("message"))
            .map(json -> json.getJSONObject("content"))
            .orElseGet(() -> new JSONObject() {
                {
                    put("status", 0);
                }
            });
}

效果



此时结合ios的快捷指令,即可实现短信识别出取件码,自动新增待办事项,提醒取件

结束

最后感谢坛大佬带来的free api项目,也希望我的文章能抛砖引玉,启发大家开发出更多的玩法

11 个赞

有意思,提示词或许可以再优化优化

常规话题软件分享

2 个赞

有意思,通用的识别,甚至常规的图片识别都可以固定格式识别输出

现在这个提示词 gpt的处理时间比较慢,需要2-3秒,也许优化提示词能缩短这个时间

很有趣,谢谢分享

大海贼时代来临

cool 之前我尝试过用 gpt 模型提取出快递地址
话说你可以参考下这个api文档
里面有说出 gpt 支持 json 格式回复 你看下 这样子可以省下一堆提示词

3 个赞

厉害 不过我这里基本上全部是菜鸟驿站 短信也都一样

厉害,有想法,有实力

厉害,很有想法,这确实也是一个路子