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

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

相关推荐
Mallow Flowers9 分钟前
Python训练营-Day31-文件的拆分和使用
开发语言·人工智能·python·算法·机器学习
kfyty72512 分钟前
轻量级 ioc 框架 loveqq,支持接口上传 jar 格式的 starter 启动器并支持热加载其中的 bean
java·jvm·ioc·jar·热加载
G探险者35 分钟前
为什么 Zookeeper 越扩越慢,而 Nacos 却越扩越快?
分布式·后端
早起鸟儿37 分钟前
docker-Dockerfile 配置
java·linux·运维·docker
云边小网安42 分钟前
java集合篇(六) ---- ListIterator 接口
java·开发语言·青少年编程·java集合
都叫我大帅哥1 小时前
Spring WebFlux:响应式编程的“未来战士”还是“花架子”?
java·spring·flux
都叫我大帅哥1 小时前
Reactor 深度解析:响应式编程的「核反应堆」是如何工作的?
java·spring
不太厉害的程序员1 小时前
NC65配置xml找不到Bean
xml·java·后端·eclipse
不被定义的程序猿1 小时前
Golang 在 Linux 平台上的并发控制
开发语言·后端·golang
AntBlack1 小时前
Python : AI 太牛了 ,撸了两个 Markdown 阅读器 ,谈谈使用感受
前端·人工智能·后端