ForcePilot/web/src/components/RefsComponent.vue

155 lines
3.7 KiB
Vue
Raw Normal View History

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>