本系列文章记录“智能提醒助理”wx公众号 建设历程。
一、需求出发点
想在现有的 “智能提醒助理” 功能中增加 智能提醒,想法是 通过用户设置的定时提醒指令,再提醒的同时,根据指令生成内容,展示给用户。
产品设计入下图所示:
二、实现路径分析
该方案最关键的在于一个大模型的支持,目前市场上比较火热的大模型有:
豆包、月之暗面-kimi、智谱AI等。
可以选择 同一模型 不同版本进行体验,也可以 对比多家模型进行体验。
三、最终方案
主要考虑指标:
1、扩展性:可以平滑升级模型版本,享受最新模型能力。
2、费用:费用平稳,不要波动。
3、接入难度:开发难度。
4、响应速度:避免超时。
5、参数设置:可设置场景、输出字数等。
收费方式为 按照token数量收费,当前每个模型 有50万的免费额度。超过后收费。
综合考虑 选择了 豆包 Doubao-lite-32k
四、调用方式
通过token方式,使用http调用即可。
先上代码:
public class ModelUtil {
public static String chat(String question) throws Exception {
// 申请地址:https://console.volcengine.com/ark/region:ark+cn-beijing/endpoint/create?customModelId=
String apiKey = "";
String modelUrl = "https://ark.cn-beijing.volces.com/api/v3/chat/completions";
String json = "{\"model\": \"ep-20240808195340-g8rct\",\"max_tokens\": 2000,\"messages\": [{\"role\": \"system\",\"content\": \"%s\"},{\"role\": \"user\",\"content\": \"%s\"}]}";
log.info("请求大模型question:{}",question);
String param = String.format(json, "你是AI助理小Z,是一个优秀的助理,知性,优雅,言简意赅。", "请简要的回答:"+question);
HashMap<String,String> header = new HashMap<>();
header.put("Content-Type", "application/json");
header.put("Connection", "keep-alive");
header.put("Authorization", "Bearer "+apiKey);
String res = CreditHttpUtil.post(modelUrl,header,param);
// 返回结果示例
// String res = "{\"choices\":[{\"finish_reason\":\"stop\",\"index\":0,\"logprobs\":null,\"message\":{\"content\":\"我有很多功能,比如:\\n- **回答问题**:我可以回答各种问题,包括历史、科学、技术、文化、娱乐等方面的问题。\\n- **提供信息**:我可以提供各种信息,如新闻、天气预报、地图、航班信息等。\\n- **语言翻译**:我可以翻译多种语言,包括英语、法语、德语、西班牙语、中文等。\\n- **文本生成**:我可以生成文本,如文章、故事、诗歌等。\\n- **对话交流**:我可以与你进行对话,理解你的意图,提供相关的回答和建议。\\n\\n你可以通过输入文本与我进行交互,我会尽力理解你的需求并提供帮助。请问你需要我帮你做什么?\",\"role\":\"assistant\"}}],\"created\":1723127718,\"id\":\"0217231277163423d5a16fe195c821d80bfb0ac15cb4b72f19de4\",\"model\":\"doubao-lite-32k-240428\",\"object\":\"chat.completion\",\"usage\":{\"completion_tokens\":159,\"prompt_tokens\":22,\"total_tokens\":181}}";
if(StringUtils.isNotEmpty(res)){
// 提取返回结果
res = res.replaceAll(".*\\{\"content\":\"(.*)\",\"role\":\"assistant\".*$", "$1");
// 替换换行
res = res.replaceAll("\\\\n", "\r\n");
}
log.info("字节大模型调用 返回结果===>{}", res);
return res;
}
}
单元测试:
@Test
public void testChat() throws Exception {
long start = System.currentTimeMillis();
String content = ModelUtil.chat("你有哪些功能?");
log.debug("字节大模型调用 返回结果,耗时:{},===>{}", System.currentTimeMillis() - start,content);
Thread.sleep(6000);
long start1 = System.currentTimeMillis();
String content1 = ModelUtil.chat("你今年多大?");
log.debug("字节大模型调用 返回结果,耗时:{},===>{}", System.currentTimeMillis() - start1,content1);
Thread.sleep(6000);
long start2 = System.currentTimeMillis();
String content2 = ModelUtil.chat("可以创建一个提醒吗?");
log.debug("字节大模型调用 返回结果,耗时:{},===>{}", System.currentTimeMillis() - start2,content2);
Thread.sleep(8000);
long start3 = System.currentTimeMillis();
String content3 = ModelUtil.chat("推进基本书?");
log.debug("字节大模型调用 返回结果,耗时:{},===>{}", System.currentTimeMillis() - start3,content3);
}