网站首页 > 技术文章 正文
昨天晚上直播,我们用 RAG(Retrieval-Augmented Generation,检索增强生成)实现了数据库 AI 助手,今天我们准备换一个技术使用 function call 来实现快递 AI 助手。
执行效果
快递 AI 助手的业务逻辑很清晰,就是我通过 LLM 大语言模型的对话来查询我的快递详情,例如,我问 AI 我有几个“运送中”的快递,他把这些快递查询并展示出来,效果如下图所示:
什么是 function call?
定义: Function Call(也称为 Tool Call)它允许大模型与一组 API 或工具进行交互,从而增强其功能。
也就是说 Function Call 和 RAG、MCP 等类似都是用于增强 AI 能力边界的。
function call 执行流程
执行流程如下:
其中,Tool 既为 Function Call。
当然如果你上图看的不是很懂的话,也可以参考阿里云提供的 function call 的工作流程:
快递 AI 助手实现
具体实现步骤:
- 添加大模型依赖
- 配置大模型参数
- 创建 function call
- 调用 function call 实现快递查询
接下来,我们一步步来看,我们以阿里云的百炼(通义千问)大模型对接为例。
1.添加大模型依赖
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
2.配置大模型参数
spring:
ai:
openai:
base-url: https://dashscope.aliyuncs.com/compatible-mode/
api-key: ${ALIYUN-AK}
chat:
options:
model: deepseek-v3
3.创建 function call
这里就不连接数据库查询快递信息了,生成级别需要连接数据库,这里演示效果,构建测试数据即可,如下代码所示:
import org.springframework.ai.tool.annotation.Tool;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class ExpressService {
@Tool(description = "用于查询我的快递")
public List<Express> getExpress(String state) {
// 生成测试数据
List<Express> data = getData();
// 根据状态过滤(如果state为null或空则返回全部)
return state == null || state.isEmpty()
? data
: data.stream()
.filter(e -> e.state().equalsIgnoreCase(state))
.collect(Collectors.toList());
}
/**
* 生成测试快递数据
*/
private List<Express> getData() {
List<Express> data = new ArrayList<>();
LocalDateTime now = LocalDateTime.now();
data.add(new Express(1001L, "北京", "西安", now.minusDays(12), "已签收"));
data.add(new Express(1002L, "广州", "西安", now.minusDays(12), "已签收"));
data.add(new Express(1003L, "杭州", "西安", now.minusDays(3), "运送中"));
data.add(new Express(1004L, "深圳", "西安", now.minusDays(3), "运送中"));
data.add(new Express(1005L, "南京", "西安", now.minusDays(1), "待发货"));
return data;
}
/**
* 快递类
*
* @param id
* @param from
* @param to
* @param createtime
* @param state
*/
record Express(long id, String from, String to,
LocalDateTime createtime, String state) {
}
}
4.调用 function call
调用大模型可以使用 ChatModel 和 ChatClient,这里使用 ChatClient 调用:
@RequestMapping("/tool")
public Flux<String> tool(@RequestParam("msg") String msg) {
return chatClient.prompt(msg)
.tools(new ExpressService(),
new DateTimeTools())
.stream().content();
}
最终执行效果如下:
小结
大模型应用开发是以后程序开发的主流方向,他也会巅峰以往的开发形式,早早掌握大模型的开发知识,对于后期涨薪或找工作都有巨大的帮助。程序员群体注定是一个活到老学到老的群体,因为学习的本质在于扩展自己的能力边界,让自己变得更值钱,所以各位动起来,让我们一起拥抱这场 AI 盛宴吧。
- 上一篇: STM32学习笔记-CubeMX使用
- 下一篇: 编程深水区之并发⑥:C#的线程池
猜你喜欢
- 2025-05-23 万字长文说说C#和Cangjie们的模式匹配
- 2025-05-23 编程深水区之并发⑥:C#的线程池
- 2024-07-25 function调用task(function调用另一个function中变量)
- 2024-07-25 代码审计从入门到放弃(一) & function
- 2024-07-25 初识Vue的Render函数——Render Function
- 2024-07-25 一分钟了解Vue中的Render函数——Render Function
- 2024-07-25 Excel WorksheetFunction.Transpose 转置函数用法及缺陷
- 2024-07-25 Drools 的高级语法之function使用
- 2024-07-25 介绍 JavaScript 原型,原型链?有何特点?
- 2024-07-25 聊聊flink的TableFunction(flink table api join)
- 1514℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 569℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 511℃MySQL service启动脚本浅析(r12笔记第59天)
- 486℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 485℃启用MySQL查询缓存(mysql8.0查询缓存)
- 468℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 447℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 445℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (83)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)