兑谓 发表于 2025-6-5 09:27:16

超实用!用FunctionCall实现快递AI助手

昨天晚上直播,我们用 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>
    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-v33.创建 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 盛宴吧。
本文已收录到我的技术小站 www.javacn.site,其中包含的内容有:Spring AI、大模型应用开发各种技术、MCP、Function Call、RAG、向量数据库、Prompt、多模态、向量数据库、嵌入模型等内容。
    http://icdn.apigo.cn/gitchat/rabbitmq.png?imageView2/0/w/500/h/400http://icdn.apigo.cn/myinfo/wchat-pay.png
关注公众号(加好友):http://icdn.apigo.cn/gongzhonghao2.png?imageView2/0/w/120/h/120
            
作者:      王磊的博客      
出处:      http://vipstone.cnblogs.com/      
   

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

柩通奉 发表于 2025-11-25 10:49:27

前排留名,哈哈哈

习和璧 发表于 2025-12-7 15:06:23

感谢分享,下载保存了,貌似很强大

咪四 发表于 2025-12-19 12:14:48

不错,里面软件多更新就更好了

左丘平莹 发表于 2026-1-8 10:11:35

分享、互助 让互联网精神温暖你我

缍米 发表于 2026-1-15 06:11:44

新版吗?好像是停更了吧。

挚魉 发表于 2026-1-17 13:31:24

分享、互助 让互联网精神温暖你我

铝缉惹 发表于 2026-1-18 01:03:10

感谢,下载保存了

况雪柳 发表于 2026-1-24 11:12:58

热心回复!

供挂 发表于 2026-1-25 10:10:32

过来提前占个楼

能氐吨 发表于 2026-1-29 11:16:19

分享、互助 让互联网精神温暖你我

撷监芝 发表于 2026-2-4 04:57:00

这个好,看起来很实用

系味 发表于 2026-2-4 09:37:02

分享、互助 让互联网精神温暖你我

鞍注塔 发表于 2026-2-8 08:22:07

谢谢楼主提供!

貊淀 发表于 2026-2-9 14:53:28

前排留名,哈哈哈

打阗渖 发表于 2026-2-10 02:53:11

很好很强大我过来先占个楼 待编辑

郁兰娜 发表于 2026-2-10 05:57:23

这个有用。

梁丘眉 发表于 2026-2-10 19:24:42

谢谢分享,辛苦了

韩素欣 发表于 2026-2-10 22:50:44

东西不错很实用谢谢分享

醋辛 发表于 2026-3-9 07:11:02

新版吗?好像是停更了吧。
页: [1] 2
查看完整版本: 超实用!用FunctionCall实现快递AI助手