langchain4j搭建失物招领系统(四)---实现更新功能

一、背景描述

当前实现登记功能只能进行新增操作,每次都会新增一条丢失登记的数据。但当用户想要补充数据时,这个时候就需要进行更新操作了,更新操作肯定是按照一定的规则查询后再进行更新。

1、根据手机号进行更新

可以先根据用户手机号查询用户已经登记的丢失信息,但是有一个问题,用户只能在系统中登记一条信息,如果有多条的话,多条数据都会更新,这个方案不是很好。

2、根据记录id更新

查询到最匹配用户当前输入的数据,查询出那条数据的id,然后根据id去更新。这样只会精确匹配一条数据,更新也只会操作这一条数据,下面我们开始实现。

二、功能实现

1、查询用户需要更新的数据

根据用户输入的手机号,以及物品的描述,去数据库中查询一条最符合这个物品的数据

我们增加一个根据手机号查询登记信息的tool工具。

java 复制代码
@Component
@Slf4j
public class LostRegisterTools {

    @Autowired
    private LostRegisterRepository lostRegisterRepository;

    @Tool("根据手机号查询丢失登记信息")
    public List<LostRegisterEntity> queryLostRegisterByPhone(@P("用户手机号") String phone) {
        log.info("根据手机号查询丢失登记信息,手机号: {}", phone);
        return lostRegisterRepository.findAllByPhone(phone);
    }

}

2、修改AiAssistant,引入我们定义的工具

java 复制代码
@AiService(wiringMode = AiServiceWiringMode.EXPLICIT, chatModel = "qwenChatModel",
        streamingChatModel = "qwenStreamingChatModel", tools = {"chatHistoryTools", "lostRegisterTools"})

3、LostPropertyOutput增加id字段

java 复制代码
@Data
public class LostPropertyOutput {

    @Description("大模型对用户的输出")
    private String output;

    @Description("用户姓名")
    private String username;

    @Description("用户手机号")
    private String phone;

    @Description("失物名称")
    private String lostName;

    @Description("失物特征")
    private String lostType;

    @Description("是否完成登记")
    private Boolean completed;

    @Description("数据库记录id")
    private Long id;

}

4、修改registerLost.txt提示词

plain 复制代码
# 角色
你是一位专业且尽责的失物登记专员,始终秉持耐心、细致的态度,精准且全面地登记用户的失物信息,全力以赴保障失物能顺利归还失主。在与用户沟通时,使用礼貌、亲和的语言。

## 技能
### 技能 1: 登记失物信息
- 每次对话,需要调用读取用户历史对话内容工具获取用户对话历史。
- 若用户已经输入了手机号,调用根据手机号查询丢失登记信息工具查询用户丢失物品的信息。若能查询到数据,可能有多条数据,将其与用户已输入的物品信息进行匹配(比较失物名称和失物特征是否是能匹配),最多返回一条已经匹配的数据,并填充id字段(返回记录id),并记录,判断用户意图是否为补充数据。若判断"是",询问用户是否要补充数据。若判断"否",则直接进入正常登记流程,无需向用户说明数据库查询情况。
- 当用户提供失物相关信息时,从中提取物品信息和相关特征,主动询问用户的姓名和手机号,并准确记录。同时,详细引导用户清晰描述失物的特征,包括颜色、材质、尺寸、特殊标识等关键细节。
- 将登记的姓名、手机号、失物名称(对物品的简单描述,如手机、钱包、狗等,不要包含特征)、失物特征(颜色、材质、尺寸、特殊标识等信息)进行系统整理并记录。
- 根据用户输入情况,准确判断是否完成登记,并标记"true"或"false"。若判断为"false",清晰告知用户还缺少哪些信息。
- 若用户表示没有更多信息或特征,也可以完成登记。

## 限制:
- 仅处理与失物登记紧密相关的内容,拒绝回答无关话题。
- 所输出的内容需严格按照要求的格式进行组织,精准记录关键信息。
- 对于用户反馈的信息,要确保准确记录和及时处理,不得遗漏重要信息。
- 要充分结合用户的历史对话记录,自然地承上启下,与用户进行协商,禁止机械重复话术,禁止重复或者相似的回复。
- 如果判断完成登记,必须要准确告诉用户已经完成登记。

5、修改业务流程代码

增加判断如果有id的话,则根据id更新操作

java 复制代码
    private String registerLost(String userId, String message) {
        LostPropertyOutput lostPropertyOutput = aiAssistant.registerLost(userId, message);
        log.info("lostPropertyOutput:{}", lostPropertyOutput);
        if (lostPropertyOutput.getCompleted()) {
            LostRegisterEntity lostRegisterEntity = new LostRegisterEntity();
            BeanUtils.copyProperties(lostPropertyOutput, lostRegisterEntity);
            lostRegisterRepository.save(lostRegisterEntity);
        }
        return lostPropertyOutput.getOutput();
    }

不过我们使用的是jpa,有id的话就会自动更新,所以不需要我们修改什么。

三、功能测试

访问http://127.0.0.1:8080/

界面如下:

我使用了deepseek帮我生成了一个前端页面,可以查看对话历史,清除对话历史,设置完用户id就可以开始了。

我们先设置一下用户id(会话id),新建一个丢失登记聊天。

输入如下:

查询数据库,显示如下:

清除一下聊天记录,或者会话id设置其他,模拟新会话,然后重新重新咨询。

查看数据库:

修改完成。。。

不过查看日志,发现ai有时候会乱说。。。

刚开始手机号是乱填的。。。看来提示词还得好好优化。

相关推荐
之歆21 小时前
Spring AI入门到实战到原理源码-MCP
java·人工智能·spring
知乎的哥廷根数学学派21 小时前
面向可信机械故障诊断的自适应置信度惩罚深度校准算法(Pytorch)
人工智能·pytorch·python·深度学习·算法·机器学习·矩阵
yangminlei21 小时前
Spring Boot3集成LiteFlow!轻松实现业务流程编排
java·spring boot·后端
qq_3181215921 小时前
互联网大厂Java面试故事:从Spring Boot到微服务架构的技术挑战与解答
java·spring boot·redis·spring cloud·微服务·面试·内容社区
且去填词21 小时前
DeepSeek :基于 Schema 推理与自愈机制的智能 ETL
数据仓库·人工智能·python·语言模型·etl·schema·deepseek
待续30121 小时前
订阅了 Qoder 之后,我想通过这篇文章分享一些个人使用心得和感受。
人工智能
weixin_3975780221 小时前
人工智能发展历史
人工智能
计算机毕设VX:Fegn08951 天前
计算机毕业设计|基于springboot + vue医院设备管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
J_liaty1 天前
Spring Boot整合Nacos:从入门到精通
java·spring boot·后端·nacos
强盛小灵通专卖员1 天前
基于深度学习的山体滑坡检测科研辅导:从论文实验到系统落地的完整思路
人工智能·深度学习·sci·小论文·山体滑坡