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有时候会乱说。。。

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

相关推荐
冬天vs不冷30 分钟前
EasyExcel导出自动回显中文,读取自动转换码值(基于全局转换器与自定义注解)
java·excel
Hali_Botebie32 分钟前
【蒸馏用损失】NCEloss介绍,大规模分类任务的损失函数
人工智能·分类·数据挖掘
阿里云云原生32 分钟前
RAG 调优指南:Spring AI Alibaba 模块化 RAG 原理与使用
java·人工智能·spring
蚍蜉撼树谈何易36 分钟前
机器学习的定义及分类
人工智能·机器学习·分类
天上掉下来个程小白37 分钟前
Redis-12.在Java中操作Redis-Spring Data Redis使用方式-操作字符串类型的数据
java·redis·spring·springboot·苍穹外卖
城电科技2 小时前
城电科技|零碳美丽示范村建设方案 能源+景观+教育
人工智能·科技·生活·能源
ん贤2 小时前
2023第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(真题&题解)(C++/Java题解)
java·c语言·数据结构·c++·算法·蓝桥杯
佚名涙3 小时前
go中锁的入门到进阶使用
开发语言·后端·golang
在京奋斗者4 小时前
spring boot自动装配原理
java·spring boot·spring
opentrending6 小时前
Github 热点项目 awesome-mcp-servers MCP 服务器合集,3分钟实现AI模型自由操控万物!
服务器·人工智能·github