一、背景描述
当前实现登记功能只能进行新增操作,每次都会新增一条丢失登记的数据。但当用户想要补充数据时,这个时候就需要进行更新操作了,更新操作肯定是按照一定的规则查询后再进行更新。
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的话就会自动更新,所以不需要我们修改什么。
三、功能测试
界面如下:
我使用了deepseek帮我生成了一个前端页面,可以查看对话历史,清除对话历史,设置完用户id就可以开始了。
我们先设置一下用户id(会话id),新建一个丢失登记聊天。
输入如下:
查询数据库,显示如下:
清除一下聊天记录,或者会话id设置其他,模拟新会话,然后重新重新咨询。
查看数据库:
修改完成。。。
不过查看日志,发现ai有时候会乱说。。。
刚开始手机号是乱填的。。。看来提示词还得好好优化。