From aeabe769d6431064b98f36ded0019ff614a6ae90 Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Thu, 24 Oct 2024 20:08:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=83=A8=E5=88=86=E8=A7=86?= =?UTF-8?q?=E8=A7=89=E8=A1=A8=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/models/embedding.py | 13 +++++----- src/routers/chat_router.py | 9 +++---- web/src/components/ChatComponent.vue | 19 +++++++++++++- web/src/views/DataBaseInfoView.vue | 38 +++++++++++++++++----------- web/src/views/SettingView.vue | 19 ++++++++------ web/src/views/ToolsView.vue | 6 ++--- 6 files changed, 65 insertions(+), 39 deletions(-) diff --git a/src/models/embedding.py b/src/models/embedding.py index 55f55d32..0cd9c5fb 100644 --- a/src/models/embedding.py +++ b/src/models/embedding.py @@ -58,8 +58,9 @@ class ZhipuEmbedding: def predict(self, message): data = [] + batch_size = 40 - if len(message) > 10: + if len(message) > batch_size: global GLOBAL_EMBED_STATE task_id = hashstr(message) logger.info(f"Creating new state for process {task_id}") @@ -69,12 +70,12 @@ class ZhipuEmbedding: 'progress': 0 } - for i in range(0, len(message), 10): - if len(message) > 10: - logger.info(f"Encoding {i} to {i+10} with {len(message)} messages") + for i in range(0, len(message), batch_size): + if len(message) > batch_size: + logger.info(f"Encoding {i} to {i+batch_size} with {len(message)} messages") GLOBAL_EMBED_STATE[task_id]['progress'] = i - group_msg = message[i:i+10] + group_msg = message[i:i+batch_size] response = self.client.embeddings.create( model=self.model_info.default_path, input=group_msg, @@ -82,7 +83,7 @@ class ZhipuEmbedding: data.extend([a.embedding for a in response.data]) - if len(message) > 10: + if len(message) > batch_size: GLOBAL_EMBED_STATE[task_id]['progress'] = len(message) GLOBAL_EMBED_STATE[task_id]['status'] = 'completed' diff --git a/src/routers/chat_router.py b/src/routers/chat_router.py index 3fa4fc5f..0f5659ef 100644 --- a/src/routers/chat_router.py +++ b/src/routers/chat_router.py @@ -1,10 +1,8 @@ -import time -import uuid -from fastapi import APIRouter, HTTPException, Request, Body -from fastapi.responses import StreamingResponse, Response -from concurrent.futures import ThreadPoolExecutor import json import asyncio +from fastapi import APIRouter, Body +from fastapi.responses import StreamingResponse, Response +from concurrent.futures import ThreadPoolExecutor from src.core import HistoryManager from src.core.startup import startup from src.utils.logging_config import setup_logger @@ -63,7 +61,6 @@ def chat_post( else: content += delta.content - logger.debug(f"Response: {content}") chunk = make_chunk(content, "loading", history=history_manager.update_ai(content)) yield chunk diff --git a/web/src/components/ChatComponent.vue b/web/src/components/ChatComponent.vue index 3e0f0c11..f7444b06 100644 --- a/web/src/components/ChatComponent.vue +++ b/web/src/components/ChatComponent.vue @@ -667,6 +667,7 @@ watch( top: 20%; width: 100%; z-index: 9; + animation: slideInUp 0.5s ease-out; h1 { margin-bottom: 20px; @@ -913,7 +914,7 @@ watch( @keyframes pulse { 0%, 80%, 100% { - transform: scale(0.6); + transform: scale(0.8); opacity: 0.3; } 40% { @@ -929,6 +930,9 @@ watch( @-webkit-keyframes swing-in-top-fwd{0%{-webkit-transform:rotateX(-100deg);transform:rotateX(-100deg);-webkit-transform-origin:top;transform-origin:top;opacity:0}100%{-webkit-transform:rotateX(0deg);transform:rotateX(0deg);-webkit-transform-origin:top;transform-origin:top;opacity:1}}@keyframes swing-in-top-fwd{0%{-webkit-transform:rotateX(-100deg);transform:rotateX(-100deg);-webkit-transform-origin:top;transform-origin:top;opacity:0}100%{-webkit-transform:rotateX(0deg);transform:rotateX(0deg);-webkit-transform-origin:top;transform-origin:top;opacity:1}} @-webkit-keyframes slide-out-left{0%{-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform:translateX(-1000px);transform:translateX(-1000px);opacity:0}}@keyframes slide-out-left{0%{-webkit-transform:translateX(0);transform:translateX(0);opacity:1}100%{-webkit-transform:translateX(-1000px);transform:translateX(-1000px);opacity:0}} +@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } +@keyframes slideInUp { from { transform: translateY(20px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } + @media (max-width: 520px) { .chat { height: calc(100vh - 60px); @@ -971,6 +975,8 @@ watch( } } } + + + diff --git a/web/src/views/DataBaseInfoView.vue b/web/src/views/DataBaseInfoView.vue index 4e9d7daa..d07e539f 100644 --- a/web/src/views/DataBaseInfoView.vue +++ b/web/src/views/DataBaseInfoView.vue @@ -104,20 +104,20 @@
-

参数配置

+

检索数量:

-
-

TopK:

- -

过滤低质量:

+
+

筛选 TopK:

+ +
@@ -160,6 +160,7 @@
+ 示例查询:
{{ example }} @@ -602,14 +603,17 @@ onMounted(() => { .query-params { display: flex; flex-direction: column; - border-radius: 8px; box-sizing: border-box; font-size: 15px; gap: 12px; - background-color: var(--main-light-6); - padding: 16px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); - border: 1px solid var(--main-light-3); + // background-color: var(--main-light-6); + // padding: 16px; + // box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); + // border: 1px solid var(--main-light-3); + // border-radius: 8px; + padding-top: 12px; + padding-right: 16px; + border-right: 1px solid var(--main-light-3); .params-title { margin-top: 0; @@ -644,7 +648,7 @@ onMounted(() => { p { margin: 0; - font-size: 15px; + font-size: 16px; color: var(--gray-900); } @@ -706,18 +710,18 @@ onMounted(() => { display: flex; flex-wrap: wrap; gap: 8px; - margin-bottom: 20px; + margin: 10px 0; .ant-btn { font-size: 14px; padding: 4px 12px; height: auto; - background-color: var(--main-light-4); + background-color: var(--gray-200); border: none; - color: var(--main-600); + color: var(--gray-800); &:hover { - background-color: var(--main-light-3); + background-color: var(--gray-300); } } } @@ -903,6 +907,7 @@ onMounted(() => { .params-item.col .ant-segmented { width: 100%; + font-size: smaller; div.ant-segmented-group { display: flex; justify-content: space-around; @@ -910,6 +915,9 @@ onMounted(() => { label.ant-segmented-item { flex: 1; text-align: center; + div.ant-segmented-item-label > div > p { + font-size: small; + } } } } diff --git a/web/src/views/SettingView.vue b/web/src/views/SettingView.vue index 63c4346a..3b5975d9 100644 --- a/web/src/views/SettingView.vue +++ b/web/src/views/SettingView.vue @@ -145,9 +145,9 @@
-

{{ modelNames[item].name }}

- 详情
+

{{ modelNames[item].name }}

+
{ h3 { margin: 0; font-size: 1rem; + font-weight: bold; } a { text-decoration: none; - color: var(--gray-700); - font-size: 14px; + color: var(--gray-500); + font-size: 12px; transition: all 0.1s; &:hover { @@ -465,16 +467,16 @@ const sendRestart = () => { } } - .success, .missing-keys { + .details, .missing-keys { margin-left: auto; } .success { - width: 1rem; - height: 1rem; + width: 0.75rem; + height: 0.75rem; background-color: rgb(91, 186, 91); border-radius: 50%; - box-shadow: 0 0 10px 1px rgba( 0,128, 0, 0.2); + box-shadow: 0 0 10px 1px rgba( 0,128, 0, 0.1); border: 2px solid white; } @@ -482,6 +484,7 @@ const sendRestart = () => { color: var(--gray-600); & > span { margin-left: 10px; + user-select: all; } } } diff --git a/web/src/views/ToolsView.vue b/web/src/views/ToolsView.vue index adc15233..01961ddf 100644 --- a/web/src/views/ToolsView.vue +++ b/web/src/views/ToolsView.vue @@ -2,16 +2,16 @@
-
+

{{ tool.title }}