基于RAG技术的心理健康大模型的开发及应用
简述任务:这里将在日记页面增加日历,显示已经写过的日记的日期。并修改存储日记逻辑,将存储日记和将日记传给大模型分析分开执行分开,加快存储日记内容的速度。因为大模型只能读取没有表情等纯文本信息,因此,在传递给大模型的时候,要将日记内容(富文本格式)转化为纯文本格式。
一、增加日历
1.前端编写
(1)首先进行npm组件
(2)在blog.vue中引入Calendar组件
(3)在前端增加Calendar组件,进行展示
<Calendar
backgroundText
class-name="select-mode"
:remarks="valueDate"
/>
(4)在data中加入被标记的数组
data() {
return {
form: {
user:'',
uid:1,
advice: '',
mood:''
},
valueDate:[],// 日期:类型为空的空数组}
(5)调用api获取该用户所写日记的日期
(6)在mounted()方法中进行调用函数handleOpen()
2.后端编写
(1)Controller:这里返回date和√的Map
(2)这里是BlogServiceImpl中实现的方法
(3)Mapper 返回数据库中该用户所写的日记的时间列表
3.前端展示 在日历上显示用户哪天写了日记
二、更改存储逻辑
目的:为了让模型可以读取前端传过来的富文本的数据,因此,将前端传过来的数据进行修改,并将其保存在blog数据库afterBlog中。
(1)建立数据库新字段
在Blog实体类下增加新字段:
在Blog表中增加新字段:
(2)前端修改
a、在保存文章的时候,先存储日记,之后再将日记传给大模型进行分析,获得心灵鸡汤和心情分析字段。在这里首先对前端传入富文本进行处理,将其解析成纯文本存入afterBlog中,之后又传给大模型进行分析,得到心灵鸡汤和心情。
save() {
// 使用正则表达式去除 content 中的图片
const contentWithoutImages = this.form.content.replace(/!\[.*?\]\(.*?\)/g, '');
const c = contentWithoutImages.replace(/:[^:]*:/g, '')
const contentWithoutImages1 = c.replace(/\{\{\{.*?\}\}\}/g, '');
// 将富文本解析成纯文本
this.form.afterBlog = this.stripHtml(marked(contentWithoutImages1));
request.get("/user/" + this.user.id).then(res => {
if (res.code === '200') {
this.form.uid=res.data.id
this.form.user=res.data.username
}
if(this.form.isPrivate==null){
this.$message.error("请选择可见范围!")
}
else{
request.post("/blog/saveN", this.form).then(res => {
if (res.code === '200') {
this.$message.success("保存成功")
this.dialogFormVisible = false
this.load()
} else {
this.$message.error("保存失败")
}
})
// 传给后端
request.post("/blog/sentence", this.form.afterBlog).then(res =>{
if (res.code === '200') {
// this.$message.success("保存成功")
this.dialogFormVisible = false
this.load()
} else {
// this.$message.error("保存失败")
}
})
}
})
},
b、stripHtml方法
stripHtml(html) {
// 创建一个临时 DOM 元素来解析 HTML 并提取纯文本
const tmp = document.createElement('DIV');
tmp.innerHTML = html;
return tmp.textContent || tmp.innerText || '';
},
(3)后端修改
这里的sentence当模型没有返回符合模板的话的时候,这里就强制将建议设为天天开心,心情未平静进行展示。
// 新增或者更新
@ApiOperation("新增或者编辑博客,编辑时不返回time()")
@PostMapping("/saveN")
public Result save(@RequestBody Blog blog) {
if(blog.getId()==null){//新增的时候初始化time和user 问题,更改的时候也要传时间哇
blog.setTime(DateUtil.now());//不管新增还是编辑都要改变时间?算了编辑不改变时间好了
}
blogService.saveOrUpdate(blog);
return Result.success();
}
// 新增或者更新
@ApiOperation("新增或者编辑博客,编辑时不返回time()")
@PostMapping("/sentence")
public Result saveChat(@RequestBody String sentence) {
System.out.println(sentence);
//这里调用大模型,根据后端传入生成建议
String url = "http://localhost:5000/connectToAPI?content=" + sentence +"&mode=6";
String answer = HttpUtil.get(url);
//这里需要进行分词
String[] result = answer.split("心灵鸡汤:|心情分类:");
//之后查找用户最新修改的一篇日志
Blog newBlog = blogService.getByDay();
if(result.length == 1){
newBlog.setAdvice("天天开心!");
newBlog.setMood("平静");
}else{
newBlog.setAdvice(result[1]);
if(result[2].length() == 5){
result[2] = result[2].split("。")[0];
newBlog.setMood(result[2]);
}else{
newBlog.setMood("平静");
}
}
blogService.saveOrUpdate(newBlog);
return Result.success();
}
这里编辑也是一样的修改,就不加赘述!
(4)测试
成功!!
后端存储修改过后的文字也是没有表情的!可以传给大模型!!