diff --git a/src/backend/README.md b/src/backend/README.md index 8abb4ce91..af4779ac9 100644 --- a/src/backend/README.md +++ b/src/backend/README.md @@ -1,4 +1,3 @@ # 毕昇后端代码 * Dockerfile 使用 poetry 进行 Python 依赖管理 - diff --git a/src/backend/bisheng/api/services/linsight/sop_manage.py b/src/backend/bisheng/api/services/linsight/sop_manage.py index 68a3bea7d..ade63a981 100644 --- a/src/backend/bisheng/api/services/linsight/sop_manage.py +++ b/src/backend/bisheng/api/services/linsight/sop_manage.py @@ -243,7 +243,7 @@ class SOPManageService: if error_msg: error_msg = "、".join(error_msg) - error_rows.extend(f"• 第{i}行: {error_msg}") + error_rows.append(f"• 第{i}行: {error_msg}") else: success_rows.append({ "name": str(name), diff --git a/src/backend/bisheng/interface/vector_store/custom.py b/src/backend/bisheng/interface/vector_store/custom.py index 97b7a4608..06e7a9654 100644 --- a/src/backend/bisheng/interface/vector_store/custom.py +++ b/src/backend/bisheng/interface/vector_store/custom.py @@ -1,10 +1,8 @@ -from ast import literal_eval from abc import ABC +from ast import literal_eval from typing import TYPE_CHECKING, Any, Callable, Dict, Iterable, List, Optional, Tuple import jieba -from bisheng_langchain.vectorstores.elastic_keywords_search import DEFAULT_PROMPT -from bisheng_langchain.vectorstores.milvus import DEFAULT_MILVUS_CONNECTION from langchain.chains.llm import LLMChain from langchain.docstore.document import Document from langchain.embeddings.base import Embeddings @@ -15,6 +13,9 @@ from langchain_core.language_models import BaseLLM from langchain_core.prompts import PromptTemplate from loguru import logger +from bisheng_langchain.vectorstores.elastic_keywords_search import DEFAULT_PROMPT +from bisheng_langchain.vectorstores.milvus import DEFAULT_MILVUS_CONNECTION + if TYPE_CHECKING: from elasticsearch import Elasticsearch # noqa: F401 @@ -167,12 +168,12 @@ class MilvusWithPermissionCheck(MilvusLangchain): connections.remove_connection(using) def _init( - self, - embeddings: Optional[list] = None, - metadatas: Optional[list[dict]] = None, - partition_names: Optional[list] = None, - replica_number: int = 1, - timeout: Optional[float] = None, + self, + embeddings: Optional[list] = None, + metadatas: Optional[list[dict]] = None, + partition_names: Optional[list] = None, + replica_number: int = 1, + timeout: Optional[float] = None, ) -> None: self._extract_fields(col_index=0) self._create_search_params() @@ -227,18 +228,18 @@ class MilvusWithPermissionCheck(MilvusLangchain): @classmethod def from_texts( - cls, - texts: List[str], - embedding: Embeddings, - metadatas: Optional[List[dict]] = None, - collection_name: list[str] = None, - connection_args: dict[str, Any] = DEFAULT_MILVUS_CONNECTION, - consistency_level: str = 'Session', - index_params: Optional[dict] = None, - search_params: Optional[dict] = None, - drop_old: bool = False, - no_embedding: bool = False, - **kwargs: Any, + cls, + texts: List[str], + embedding: Embeddings, + metadatas: Optional[List[dict]] = None, + collection_name: list[str] = None, + connection_args: dict[str, Any] = DEFAULT_MILVUS_CONNECTION, + consistency_level: str = 'Session', + index_params: Optional[dict] = None, + search_params: Optional[dict] = None, + drop_old: bool = False, + no_embedding: bool = False, + **kwargs: Any, ): """ no insert data into milvus, only search from milvus @@ -256,13 +257,13 @@ class MilvusWithPermissionCheck(MilvusLangchain): return vector_db def similarity_search( - self, - query: str, - k: int = 4, - param: Optional[dict] = None, - expr: Optional[str] = None, - timeout: Optional[int] = None, - **kwargs: Any, + self, + query: str, + k: int = 4, + param: Optional[dict] = None, + expr: Optional[str] = None, + timeout: Optional[int] = None, + **kwargs: Any, ) -> List[Document]: """Perform a similarity search against the query string. @@ -288,13 +289,13 @@ class MilvusWithPermissionCheck(MilvusLangchain): return [doc for doc, _ in res] def similarity_search_by_vector( - self, - embedding: List[float], - k: int = 4, - param: Optional[dict] = None, - expr: Optional[str] = None, - timeout: Optional[int] = None, - **kwargs: Any, + self, + embedding: List[float], + k: int = 4, + param: Optional[dict] = None, + expr: Optional[str] = None, + timeout: Optional[int] = None, + **kwargs: Any, ) -> List[Document]: """Perform a similarity search against the query string. @@ -320,13 +321,13 @@ class MilvusWithPermissionCheck(MilvusLangchain): return [doc for doc, _ in res] def similarity_search_with_score( - self, - query: str, - k: int = 4, - param: Optional[dict] = None, - expr: Optional[str] = None, - timeout: Optional[int] = None, - **kwargs: Any, + self, + query: str, + k: int = 4, + param: Optional[dict] = None, + expr: Optional[str] = None, + timeout: Optional[int] = None, + **kwargs: Any, ) -> List[Tuple[Document, float]]: """Perform a search on a query string and return results with score. @@ -367,14 +368,14 @@ class MilvusWithPermissionCheck(MilvusLangchain): return res def similarity_search_with_score_by_vector( - self, - embedding: List[float], - k: int = 4, - param: Optional[dict] = None, - query: Optional[str] = None, - expr: Optional[str] = None, - timeout: Optional[int] = None, - **kwargs: Any, + self, + embedding: List[float], + k: int = 4, + param: Optional[dict] = None, + query: Optional[str] = None, + expr: Optional[str] = None, + timeout: Optional[int] = None, + **kwargs: Any, ) -> List[Tuple[Document, float]]: """Perform a search on a query string and return results with score. @@ -452,8 +453,7 @@ class MilvusWithPermissionCheck(MilvusLangchain): @staticmethod def _relevance_score_fn(distance: float) -> float: """Normalize the distance to a score on a scale [0, 1].""" - # Todo: normalize the es score on a scale [0, 1] - return 1 - distance + return 1 - distance / 2 def _select_relevance_score_fn(self) -> Callable[[float], float]: return self._relevance_score_fn @@ -465,13 +465,13 @@ class ElasticsearchWithPermissionCheck(VectorStore, ABC): """ def __init__( - self, - elasticsearch_url: str, - index_name: List[str], - drop_old: Optional[bool] = False, - *, - ssl_verify: Optional[Dict[str, Any]] = None, - llm_chain: Optional[LLMChain] = None, + self, + elasticsearch_url: str, + index_name: List[str], + drop_old: Optional[bool] = False, + *, + ssl_verify: Optional[Dict[str, Any]] = None, + llm_chain: Optional[LLMChain] = None, ): """Initialize with necessary components.""" try: @@ -572,17 +572,17 @@ class ElasticsearchWithPermissionCheck(VectorStore, ABC): @classmethod def from_texts( - cls, - texts: List[str], - embedding: Embeddings, - metadatas: Optional[List[dict]] = None, - ids: Optional[List[str]] = None, - index_name: Optional[List[str]] = None, - refresh_indices: bool = True, - llm: Optional[BaseLLM] = None, - prompt: Optional[PromptTemplate] = DEFAULT_PROMPT, - drop_old: Optional[bool] = False, - **kwargs: Any, + cls, + texts: List[str], + embedding: Embeddings, + metadatas: Optional[List[dict]] = None, + ids: Optional[List[str]] = None, + index_name: Optional[List[str]] = None, + refresh_indices: bool = True, + llm: Optional[BaseLLM] = None, + prompt: Optional[PromptTemplate] = DEFAULT_PROMPT, + drop_old: Optional[bool] = False, + **kwargs: Any, ): """Construct ElasticKeywordsSearch wrapper from raw documents. diff --git a/src/backend/bisheng_langchain/linsight/prompt.py b/src/backend/bisheng_langchain/linsight/prompt.py index d2ba69cc9..d6e3cbddc 100644 --- a/src/backend/bisheng_langchain/linsight/prompt.py +++ b/src/backend/bisheng_langchain/linsight/prompt.py @@ -30,8 +30,8 @@ SopPrompt = """<背景> 使用@来说明使用什么工具,文件以及知识库,必须遵循以下格式: 工具的表示方法:@工具名@ -用户上传文件的表示方法:@文件名的文件储存信息:{'文件储存在语义检索库中的id':'{id}','文件储存地址':'{文件路径}'}@ -知识库的表示方法:@知识库名的储存信息:{'知识库储存在语义检索库中的id':'{id}'}@ +用户上传文件的表示方法:@文件名的文件储存信息:{{'文件储存在语义检索库中的id':'{{id}}','文件储存地址':'{{文件路径}}'}}@ +知识库的表示方法:@知识库名的储存信息:{{'知识库储存在语义检索库中的id':'{{id}}'}}@ 输出文件的表示方法:文件名 diff --git a/src/frontend/client/src/components/Chat/ChatView.tsx b/src/frontend/client/src/components/Chat/ChatView.tsx index ad87f83f6..dcf1fae57 100644 --- a/src/frontend/client/src/components/Chat/ChatView.tsx +++ b/src/frontend/client/src/components/Chat/ChatView.tsx @@ -1,3 +1,4 @@ +import { ArrowRight } from 'lucide-react'; import { memo, useCallback, useEffect, useState } from 'react'; import { useForm } from 'react-hook-form'; import { useNavigate, useParams } from 'react-router-dom'; @@ -10,6 +11,7 @@ import { useAddedResponse, useChatHelpers, useSSE } from '~/hooks'; import { AddedChatContext, ChatContext, ChatFormProvider, useFileMapContext } from '~/Providers'; import store from '~/store'; import { buildTree, cn } from '~/utils'; +import { Button } from '../ui'; import HeaderTitle from './HeaderTitle'; import ChatForm from './Input/ChatForm'; import InvitationCodeForm from './InviteCode'; @@ -84,6 +86,8 @@ function ChatView({ index = 0 }: { index?: number }) { window.open(`${__APP_ENV__.BASE_URL}/linsight/${caseId}`) } + const selfHost = location.host.indexOf('bisheng') !== -1; + return ( @@ -120,14 +124,16 @@ function ChatView({ index = 0 }: { index?: number }) { {/* input */} {/*