2024-08-25 20:29:24 +08:00
|
|
|
<!-- RefsComponent.vue -->
|
|
|
|
|
<template>
|
|
|
|
|
<div class="refs" v-if="showRefs">
|
|
|
|
|
<div class="tags">
|
2024-09-06 12:54:17 +08:00
|
|
|
<span class="item"><GlobalOutlined /> {{ message.model_name }}</span>
|
2024-08-25 20:29:24 +08:00
|
|
|
<span class="filetag item"
|
|
|
|
|
v-for="(results, filename) in message.groupedResults"
|
|
|
|
|
:key="filename"
|
2024-09-06 21:30:49 +08:00
|
|
|
@click="toggleDrawer(filename)"
|
2024-08-25 20:29:24 +08:00
|
|
|
>
|
|
|
|
|
<FileTextOutlined /> {{ filename }}
|
|
|
|
|
<a-drawer
|
2024-09-06 21:30:49 +08:00
|
|
|
v-model:open="openDetail[filename]"
|
2024-08-25 20:29:24 +08:00
|
|
|
title="检索详情"
|
|
|
|
|
width="800"
|
|
|
|
|
:contentWrapperStyle="{ maxWidth: '100%'}"
|
|
|
|
|
placement="right"
|
|
|
|
|
class="retrieval-detail"
|
|
|
|
|
rootClassName="root"
|
|
|
|
|
>
|
|
|
|
|
<div class="fileinfo">
|
2024-09-06 21:30:49 +08:00
|
|
|
<p><strong>文件名:</strong> {{ filename }}</p>
|
2024-08-25 20:29:24 +08:00
|
|
|
<p><strong>文件类型:</strong> {{ results[0].file.type }}</p>
|
|
|
|
|
<p><strong>创建时间:</strong> {{ new Date(results[0].file.created_at * 1000).toLocaleString() }}</p>
|
|
|
|
|
</div>
|
|
|
|
|
<div v-for="(res, idx) in results" :key="idx" class="result-item">
|
|
|
|
|
<p class="result-id"><strong>ID:</strong> #{{ res.id }}</p>
|
|
|
|
|
<p class="result-distance">
|
|
|
|
|
<strong>相似度距离:</strong>
|
|
|
|
|
<div class="scorebar">
|
2024-09-03 16:37:59 +08:00
|
|
|
<a-progress :percent="parseFloat((res.distance * 100).toFixed(2))" stroke-color="#1677FF" :size="[200, 10]"/>
|
2024-08-25 20:29:24 +08:00
|
|
|
</div>
|
|
|
|
|
</p>
|
2024-09-03 16:37:59 +08:00
|
|
|
<p class="result-rerank-score" v-if="res.rerank_score">
|
2024-08-25 20:29:24 +08:00
|
|
|
<strong>重排序分数:</strong>
|
|
|
|
|
<div class="scorebar">
|
2024-09-03 16:37:59 +08:00
|
|
|
<a-progress :percent="parseFloat((res.rerank_score * 100).toFixed(2))" stroke-color="#1677FF" :size="[200, 10]"/>
|
2024-08-25 20:29:24 +08:00
|
|
|
</div>
|
|
|
|
|
</p>
|
|
|
|
|
<a-divider />
|
|
|
|
|
<p class="result-text">{{ res.entity.text }}</p>
|
|
|
|
|
</div>
|
|
|
|
|
</a-drawer>
|
|
|
|
|
</span>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script setup>
|
2024-09-06 21:30:49 +08:00
|
|
|
import { ref, computed, reactive } from 'vue'
|
2024-08-25 20:29:24 +08:00
|
|
|
import {
|
|
|
|
|
GlobalOutlined,
|
|
|
|
|
FileTextOutlined,
|
|
|
|
|
} from '@ant-design/icons-vue'
|
|
|
|
|
|
|
|
|
|
const props = defineProps({
|
|
|
|
|
message: Object,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
const message = ref(props.message)
|
|
|
|
|
|
2024-09-06 21:30:49 +08:00
|
|
|
// 使用 reactive 创建一个响应式对象来存储每个文件的抽屉状态
|
|
|
|
|
const openDetail = reactive({})
|
|
|
|
|
|
|
|
|
|
// 初始化 openDetail 对象
|
|
|
|
|
for (const filename in message.value.groupedResults) {
|
|
|
|
|
openDetail[filename] = false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const toggleDrawer = (filename) => {
|
|
|
|
|
openDetail[filename] = !openDetail[filename]
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-25 20:29:24 +08:00
|
|
|
const showRefs = computed(() => message.value.role=='received' && message.value.status=='finished')
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style lang="less" scoped>
|
|
|
|
|
.refs {
|
|
|
|
|
display: flex;
|
|
|
|
|
margin-bottom: 20px;
|
|
|
|
|
color: var(--c-text-light-4);
|
|
|
|
|
font-size: 14px;
|
|
|
|
|
gap: 10px;
|
|
|
|
|
|
|
|
|
|
.item {
|
2024-09-01 18:10:50 +08:00
|
|
|
background: var(--main-10);
|
|
|
|
|
color: var(--main-600);
|
2024-08-25 20:29:24 +08:00
|
|
|
padding: 2px 8px;
|
|
|
|
|
border-radius: 8px;
|
|
|
|
|
font-size: 14px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.tags {
|
|
|
|
|
display: flex;
|
2024-09-06 12:54:17 +08:00
|
|
|
flex-wrap: wrap;
|
2024-08-25 20:29:24 +08:00
|
|
|
gap: 10px;
|
|
|
|
|
|
|
|
|
|
.filetag {
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
gap: 5px;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
|
|
|
|
|
&:hover {
|
2024-09-01 18:10:50 +08:00
|
|
|
background: var(--main-25);
|
2024-08-25 20:29:24 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.retrieval-detail {
|
|
|
|
|
.fileinfo {
|
|
|
|
|
margin-bottom: 20px;
|
|
|
|
|
padding: 1rem;
|
|
|
|
|
background: var(--main-25);
|
|
|
|
|
color: var(--main-800);
|
|
|
|
|
border-radius: 8px;
|
|
|
|
|
border: 1px solid var(--main-100);
|
|
|
|
|
p {
|
|
|
|
|
margin: 10px;
|
|
|
|
|
line-height: 1.5;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.result-item {
|
|
|
|
|
margin-bottom: 20px;
|
|
|
|
|
padding: 24px 16px 10px 16px;
|
|
|
|
|
border: 1px solid #e8e8e8;
|
|
|
|
|
border-radius: 8px;
|
|
|
|
|
background: var(--main-light-6);
|
|
|
|
|
|
|
|
|
|
.result-id,
|
|
|
|
|
.result-distance,
|
|
|
|
|
.result-rerank-score,
|
|
|
|
|
.result-text-label,
|
|
|
|
|
.result-text {
|
|
|
|
|
margin: 5px 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.scorebar {
|
|
|
|
|
margin-left: 10px;
|
|
|
|
|
display: inline-block;
|
|
|
|
|
width: 200px;
|
|
|
|
|
padding-bottom: 2px;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
& > * {
|
|
|
|
|
margin: 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</style>
|