创新设计记录-6:博客
博客上传知识库
因为我们的系统是采用知识库&大模型回答的模式的RAG技术,在回答问题时候大模型也会搜索用户知识库中的知识,如果知识库中有相关内容的话,会把相关内容引用出来,再进行回答。
因此用户的博客也可以作为知识库很关键的一部分,这样用户在使用大模型的时候也会得到更偏向于自己的大模型回答。
这里用到了添加博客方法的后半部分
if blog.save_to_kb:
filename = save_md(blog.title, blog.content)
file = open(filename, "rb")
files = {'files': (blog.title + '.md', file)}
form_data = {
'knowledge_base_name': KB_ARGS["default_kb"],
'override': DOC_ARGS["override_custom_docs"],
'to_vector_store': DOC_ARGS["to_vector_store"],
'chunk_size': DOC_ARGS["chunk_size"],
'chunk_overlap': DOC_ARGS["overlap_size"],
'zh_title_enhance': DOC_ARGS["zh_title_enhance"],
'docs': DOC_ARGS["docs"],
'not_refresh_vs_cache': DOC_ARGS["not_refresh_vs_cache"]
}
try:
response = requests.post(DOC_ARGS['url'], files=files, data=form_data)
except Exception as e:
return BaseResponse(code=500, msg="上传文件失败", data={"error": f'{e}'})
print(response.json())
return BaseResponse(code=200, msg='添加成功', data={'blog_id': blog_id})
这里判断了用户是否选择将博客添加到知识库中。
添加到知识库中的方法是,先将文件存储到本地定义好的文件夹里,然后将文件上传到服务器上。
def save_md(title: str, content: str):
"""将md文件存本地"""
filename = title + '.md'
path = os.getcwd() + FILE_ARGS["relative_path"]
if not os.path.exists(path):
os.makedirs(path)
with open(path + filename, 'w', encoding='utf-8') as f:
f.write(content)
f.close()
return path + filename
该方法返回文件名。
这里调用服务器提供的DOC_ARGS[‘url’]接口
"url": f'http://{LANGCHAIN_SERVER["address"]}/knowledge_base/upload_docs',
上传成功之后,用户在进行大模型回答时后就会看到自己的博客相关的回答内容
博客评论
在博客界面的下方,有一个评论区组件,该组件显示该博客所有的评论信息
<Comment v-if="this.blog_id" :comment_list="comment_list" @refresh_comment_list="get_comment_" />
<script>
get_comment_() {
get_comment_list(this.blog_id).then(res => {
this.comment_list = res.data.data.comment_list
console.log(this.comment_list);
})
},
</script>
现在看一下评论区组件的信息:
<template>
<el-card shadow="never">
<template #header>
<h3 style="text-align: left">评论区</h3>
</template>
<template v-for="(item, index) in comment_list">
<div class="container">
<el-card shadow="never" class="comment-card">
<template #header>
<div class="card-header">
<el-avatar src="https://cube.elemecdn.com/0/88/03b0d39583f48206768a7534e55bcpng.png" />
<h4 class="author">{{ item.user_name }}</h4>
<div style="text-align: end; width: 100%;" class="header_item">
评论时间:{{ item.create_time }}
</div>
</div>
</template>
<div class="card-body">
{{ item.content }}
</div>
</el-card>
<div>
<el-button type="danger" @click="delete_comment_(item.id)" v-if="item.user_id == user_id">删除</el-button>
</div>
</div>
</template>
<el-empty v-if="this.comment_list.length == 0" description="还没有评论……"></el-empty>
</el-card>
</template>
删除评论方法:
delete_comment_(id) {
console.log(id);
ElMessageBox.confirm(
'确定要删除吗?',
'消息',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
}
).then(() => {
let user_id = localStorage.getItem('user_id')
delete_comment(id, user_id, this.blog_id).then(res => {
if (res.data.code == 200) {
ElMessage({
type: 'success',
message: '删除成功'
})
this.$emit('refresh_comment_list')
} else {
ElMessage({
type: 'error',
message: res.data.msg
})
}
})
})
},